Files
Dec2017-Script-Dump/UnityEngine/InternalStaticBatchingUtility.cs
T
2026-06-04 11:42:34 +02:00

260 lines
9.1 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
namespace UnityEngine
{
// Token: 0x020004F1 RID: 1265
internal class InternalStaticBatchingUtility
{
// Token: 0x06003C38 RID: 15416 RVA: 0x0006A164 File Offset: 0x00068364
public static void CombineRoot(GameObject staticBatchRoot)
{
InternalStaticBatchingUtility.Combine(staticBatchRoot, false, false);
}
// Token: 0x06003C39 RID: 15417 RVA: 0x0006A170 File Offset: 0x00068370
public static void Combine(GameObject staticBatchRoot, bool combineOnlyStatic, bool isEditorPostprocessScene)
{
GameObject[] array = (GameObject[])Object.FindObjectsOfType(typeof(GameObject));
List<GameObject> list = new List<GameObject>();
foreach (GameObject gameObject in array)
{
if (!(staticBatchRoot != null) || gameObject.transform.IsChildOf(staticBatchRoot.transform))
{
if (!combineOnlyStatic || gameObject.isStaticBatchable)
{
list.Add(gameObject);
}
}
}
array = list.ToArray();
InternalStaticBatchingUtility.CombineGameObjects(array, staticBatchRoot, isEditorPostprocessScene);
}
// Token: 0x06003C3A RID: 15418 RVA: 0x0006A210 File Offset: 0x00068410
public static void CombineGameObjects(GameObject[] gos, GameObject staticBatchRoot, bool isEditorPostprocessScene)
{
Matrix4x4 matrix4x = Matrix4x4.identity;
Transform transform = null;
if (staticBatchRoot)
{
matrix4x = staticBatchRoot.transform.worldToLocalMatrix;
transform = staticBatchRoot.transform;
}
int num = 0;
int num2 = 0;
List<MeshSubsetCombineUtility.MeshContainer> list = new List<MeshSubsetCombineUtility.MeshContainer>();
Array.Sort(gos, new InternalStaticBatchingUtility.SortGO());
foreach (GameObject gameObject in gos)
{
MeshFilter meshFilter = gameObject.GetComponent(typeof(MeshFilter)) as MeshFilter;
if (!(meshFilter == null))
{
Mesh sharedMesh = meshFilter.sharedMesh;
if (!(sharedMesh == null) && (isEditorPostprocessScene || sharedMesh.canAccess))
{
Renderer component = meshFilter.GetComponent<Renderer>();
if (!(component == null) && component.enabled)
{
if (component.staticBatchIndex == 0)
{
Material[] array = component.sharedMaterials;
if (!array.Any((Material m) => m != null && m.shader != null && m.shader.disableBatching != DisableBatchingType.False))
{
int vertexCount = sharedMesh.vertexCount;
if (vertexCount != 0)
{
MeshRenderer meshRenderer = component as MeshRenderer;
if (meshRenderer != null && meshRenderer.additionalVertexStreams != null)
{
if (vertexCount != meshRenderer.additionalVertexStreams.vertexCount)
{
goto IL_387;
}
}
if (num2 + vertexCount > 64000)
{
InternalStaticBatchingUtility.MakeBatch(list, transform, num++);
list.Clear();
num2 = 0;
}
MeshSubsetCombineUtility.MeshInstance meshInstance = default(MeshSubsetCombineUtility.MeshInstance);
meshInstance.meshInstanceID = sharedMesh.GetInstanceID();
meshInstance.rendererInstanceID = component.GetInstanceID();
if (meshRenderer != null && meshRenderer.additionalVertexStreams != null)
{
meshInstance.additionalVertexStreamsMeshInstanceID = meshRenderer.additionalVertexStreams.GetInstanceID();
}
meshInstance.transform = matrix4x * meshFilter.transform.localToWorldMatrix;
meshInstance.lightmapScaleOffset = component.lightmapScaleOffset;
meshInstance.realtimeLightmapScaleOffset = component.realtimeLightmapScaleOffset;
MeshSubsetCombineUtility.MeshContainer meshContainer = new MeshSubsetCombineUtility.MeshContainer
{
gameObject = gameObject,
instance = meshInstance,
subMeshInstances = new List<MeshSubsetCombineUtility.SubMeshInstance>()
};
list.Add(meshContainer);
if (array.Length > sharedMesh.subMeshCount)
{
Debug.LogWarning(string.Concat(new object[] { "Mesh '", sharedMesh.name, "' has more materials (", array.Length, ") than subsets (", sharedMesh.subMeshCount, ")" }), component);
Material[] array2 = new Material[sharedMesh.subMeshCount];
for (int j = 0; j < sharedMesh.subMeshCount; j++)
{
array2[j] = component.sharedMaterials[j];
}
component.sharedMaterials = array2;
array = array2;
}
for (int k = 0; k < Math.Min(array.Length, sharedMesh.subMeshCount); k++)
{
MeshSubsetCombineUtility.SubMeshInstance subMeshInstance = default(MeshSubsetCombineUtility.SubMeshInstance);
subMeshInstance.meshInstanceID = meshFilter.sharedMesh.GetInstanceID();
subMeshInstance.vertexOffset = num2;
subMeshInstance.subMeshIndex = k;
subMeshInstance.gameObjectInstanceID = gameObject.GetInstanceID();
subMeshInstance.transform = meshInstance.transform;
meshContainer.subMeshInstances.Add(subMeshInstance);
}
num2 += sharedMesh.vertexCount;
}
}
}
}
}
}
IL_387:;
}
InternalStaticBatchingUtility.MakeBatch(list, transform, num);
}
// Token: 0x06003C3B RID: 15419 RVA: 0x0006A5C0 File Offset: 0x000687C0
private static void MakeBatch(List<MeshSubsetCombineUtility.MeshContainer> meshes, Transform staticBatchRootTransform, int batchIndex)
{
if (meshes.Count >= 2)
{
List<MeshSubsetCombineUtility.MeshInstance> list = new List<MeshSubsetCombineUtility.MeshInstance>();
List<MeshSubsetCombineUtility.SubMeshInstance> list2 = new List<MeshSubsetCombineUtility.SubMeshInstance>();
foreach (MeshSubsetCombineUtility.MeshContainer meshContainer in meshes)
{
list.Add(meshContainer.instance);
list2.AddRange(meshContainer.subMeshInstances);
}
string text = "Combined Mesh";
text = text + " (root: " + ((!(staticBatchRootTransform != null)) ? "scene" : staticBatchRootTransform.name) + ")";
if (batchIndex > 0)
{
text = text + " " + (batchIndex + 1);
}
Mesh mesh = StaticBatchingHelper.InternalCombineVertices(list.ToArray(), text);
StaticBatchingHelper.InternalCombineIndices(list2.ToArray(), mesh);
int num = 0;
foreach (MeshSubsetCombineUtility.MeshContainer meshContainer2 in meshes)
{
MeshFilter meshFilter = (MeshFilter)meshContainer2.gameObject.GetComponent(typeof(MeshFilter));
meshFilter.sharedMesh = mesh;
int num2 = meshContainer2.subMeshInstances.Count<MeshSubsetCombineUtility.SubMeshInstance>();
Renderer component = meshContainer2.gameObject.GetComponent<Renderer>();
component.SetStaticBatchInfo(num, num2);
component.staticBatchRootTransform = staticBatchRootTransform;
component.enabled = false;
component.enabled = true;
MeshRenderer meshRenderer = component as MeshRenderer;
if (meshRenderer != null)
{
meshRenderer.additionalVertexStreams = null;
}
num += num2;
}
}
}
// Token: 0x04001252 RID: 4690
private const int MaxVerticesInBatch = 64000;
// Token: 0x04001253 RID: 4691
private const string CombinedMeshPrefix = "Combined Mesh";
// Token: 0x020004F2 RID: 1266
internal class SortGO : IComparer
{
// Token: 0x06003C3E RID: 15422 RVA: 0x0006A7DC File Offset: 0x000689DC
int IComparer.Compare(object a, object b)
{
int num;
if (a == b)
{
num = 0;
}
else
{
Renderer renderer = InternalStaticBatchingUtility.SortGO.GetRenderer(a as GameObject);
Renderer renderer2 = InternalStaticBatchingUtility.SortGO.GetRenderer(b as GameObject);
int num2 = InternalStaticBatchingUtility.SortGO.GetMaterialId(renderer).CompareTo(InternalStaticBatchingUtility.SortGO.GetMaterialId(renderer2));
if (num2 == 0)
{
num2 = InternalStaticBatchingUtility.SortGO.GetLightmapIndex(renderer).CompareTo(InternalStaticBatchingUtility.SortGO.GetLightmapIndex(renderer2));
}
num = num2;
}
return num;
}
// Token: 0x06003C3F RID: 15423 RVA: 0x0006A84C File Offset: 0x00068A4C
private static int GetMaterialId(Renderer renderer)
{
int num;
if (renderer == null || renderer.sharedMaterial == null)
{
num = 0;
}
else
{
num = renderer.sharedMaterial.GetInstanceID();
}
return num;
}
// Token: 0x06003C40 RID: 15424 RVA: 0x0006A890 File Offset: 0x00068A90
private static int GetLightmapIndex(Renderer renderer)
{
int num;
if (renderer == null)
{
num = -1;
}
else
{
num = renderer.lightmapIndex;
}
return num;
}
// Token: 0x06003C41 RID: 15425 RVA: 0x0006A8C0 File Offset: 0x00068AC0
private static Renderer GetRenderer(GameObject go)
{
Renderer renderer;
if (go == null)
{
renderer = null;
}
else
{
MeshFilter meshFilter = go.GetComponent(typeof(MeshFilter)) as MeshFilter;
if (meshFilter == null)
{
renderer = null;
}
else
{
renderer = meshFilter.GetComponent<Renderer>();
}
}
return renderer;
}
}
}
}