using UnityEngine; public class MeshCombineUtility { public struct MeshInstance { public Mesh mesh; public int subMeshIndex; public Matrix4x4 transform; } public static Mesh Combine(MeshInstance[] combines, bool generateStrips) { int num = 0; int num2 = 0; int num3 = 0; for (int i = 0; i < combines.Length; i++) { MeshInstance meshInstance = combines[i]; if (!meshInstance.mesh) { continue; } num += meshInstance.mesh.vertexCount; if (!generateStrips) { continue; } int num4 = meshInstance.mesh.GetTriangles(meshInstance.subMeshIndex).Length; if (num4 != 0) { if (num3 != 0) { num3 = (((num3 & 1) != 1) ? (num3 + 2) : (num3 + 3)); } num3 += num4; } else { generateStrips = false; } } if (!generateStrips) { for (int j = 0; j < combines.Length; j++) { MeshInstance meshInstance2 = combines[j]; if ((bool)meshInstance2.mesh) { num2 += meshInstance2.mesh.GetTriangles(meshInstance2.subMeshIndex).Length; } } } Vector3[] array = new Vector3[num]; Vector3[] array2 = new Vector3[num]; Vector4[] array3 = new Vector4[num]; Vector2[] array4 = new Vector2[num]; Vector2[] array5 = new Vector2[num]; Color[] array6 = new Color[num]; int[] array7 = new int[num2]; int[] array8 = new int[num3]; int offset = 0; for (int k = 0; k < combines.Length; k++) { MeshInstance meshInstance3 = combines[k]; if ((bool)meshInstance3.mesh) { Copy(meshInstance3.mesh.vertexCount, meshInstance3.mesh.vertices, array, ref offset, meshInstance3.transform); } } offset = 0; for (int l = 0; l < combines.Length; l++) { MeshInstance meshInstance4 = combines[l]; if ((bool)meshInstance4.mesh) { Matrix4x4 transform = meshInstance4.transform; transform = transform.inverse.transpose; CopyNormal(meshInstance4.mesh.vertexCount, meshInstance4.mesh.normals, array2, ref offset, transform); } } offset = 0; for (int m = 0; m < combines.Length; m++) { MeshInstance meshInstance5 = combines[m]; if ((bool)meshInstance5.mesh) { Matrix4x4 transform2 = meshInstance5.transform; transform2 = transform2.inverse.transpose; CopyTangents(meshInstance5.mesh.vertexCount, meshInstance5.mesh.tangents, array3, ref offset, transform2); } } offset = 0; for (int n = 0; n < combines.Length; n++) { MeshInstance meshInstance6 = combines[n]; if ((bool)meshInstance6.mesh) { Copy(meshInstance6.mesh.vertexCount, meshInstance6.mesh.uv, array4, ref offset); } } offset = 0; for (int num5 = 0; num5 < combines.Length; num5++) { MeshInstance meshInstance7 = combines[num5]; if ((bool)meshInstance7.mesh) { Copy(meshInstance7.mesh.vertexCount, meshInstance7.mesh.uv2, array5, ref offset); } } offset = 0; for (int num6 = 0; num6 < combines.Length; num6++) { MeshInstance meshInstance8 = combines[num6]; if ((bool)meshInstance8.mesh) { CopyColors(meshInstance8.mesh.vertexCount, meshInstance8.mesh.colors, array6, ref offset); } } int num7 = 0; int num8 = 0; int num9 = 0; for (int num10 = 0; num10 < combines.Length; num10++) { MeshInstance meshInstance9 = combines[num10]; if (!meshInstance9.mesh) { continue; } if (generateStrips) { int[] triangles = meshInstance9.mesh.GetTriangles(meshInstance9.subMeshIndex); if (num8 != 0) { if ((num8 & 1) == 1) { array8[num8] = array8[num8 - 1]; array8[num8 + 1] = triangles[0] + num9; array8[num8 + 2] = triangles[0] + num9; num8 += 3; } else { array8[num8] = array8[num8 - 1]; array8[num8 + 1] = triangles[0] + num9; num8 += 2; } } for (int num11 = 0; num11 < triangles.Length; num11++) { array8[num11 + num8] = triangles[num11] + num9; } num8 += triangles.Length; } else { int[] triangles2 = meshInstance9.mesh.GetTriangles(meshInstance9.subMeshIndex); for (int num12 = 0; num12 < triangles2.Length; num12++) { array7[num12 + num7] = triangles2[num12] + num9; } num7 += triangles2.Length; } num9 += meshInstance9.mesh.vertexCount; } Mesh mesh = new Mesh(); mesh.name = "Combined Mesh"; mesh.vertices = array; mesh.normals = array2; mesh.colors = array6; mesh.uv = array4; mesh.uv2 = array5; mesh.tangents = array3; if (generateStrips) { mesh.SetTriangles(array8, 0); } else { mesh.triangles = array7; } return mesh; } private static void Copy(int vertexcount, Vector3[] src, Vector3[] dst, ref int offset, Matrix4x4 transform) { for (int i = 0; i < src.Length; i++) { dst[i + offset] = transform.MultiplyPoint(src[i]); } offset += vertexcount; } private static void CopyNormal(int vertexcount, Vector3[] src, Vector3[] dst, ref int offset, Matrix4x4 transform) { for (int i = 0; i < src.Length; i++) { dst[i + offset] = transform.MultiplyVector(src[i]).normalized; } offset += vertexcount; } private static void Copy(int vertexcount, Vector2[] src, Vector2[] dst, ref int offset) { for (int i = 0; i < src.Length; i++) { dst[i + offset] = src[i]; } offset += vertexcount; } private static void CopyColors(int vertexcount, Color[] src, Color[] dst, ref int offset) { for (int i = 0; i < src.Length; i++) { dst[i + offset] = src[i]; } offset += vertexcount; } private static void CopyTangents(int vertexcount, Vector4[] src, Vector4[] dst, ref int offset, Matrix4x4 transform) { for (int i = 0; i < src.Length; i++) { Vector4 vector = src[i]; Vector3 vector2 = new Vector3(vector.x, vector.y, vector.z); vector2 = transform.MultiplyVector(vector2).normalized; dst[i + offset] = new Vector4(vector2.x, vector2.y, vector2.z, vector.w); } offset += vertexcount; } }