public static void CombineMeshes(Queue <CombineInstance> items , byte area , InputGeometryCompiler compiler) { const int MaxTris = 65000; List <CombineInstance> combineInstancesPart = new List <CombineInstance>(); byte[] areas = NMGen.CreateAreaBuffer(MaxTris, area); while (items.Count != 0) { int vertCount = 0; while (items.Count > 0 && (vertCount + items.Peek().mesh.vertexCount < MaxTris)) { vertCount += items.Peek().mesh.vertexCount; combineInstancesPart.Add(items.Dequeue()); } Mesh meshPart = new Mesh(); meshPart.CombineMeshes(combineInstancesPart.ToArray(), true, true); UnityEngine.Vector3[] vs = meshPart.vertices; Vector3[] vvs = VectorHelper.ToVector3Array(ref vs); compiler.AddTriangles(vvs, meshPart.vertexCount , meshPart.triangles, areas, meshPart.triangles.Length / 3); Object.DestroyImmediate(meshPart); combineInstancesPart.Clear(); } }
public static void CombineMeshes(Queue<CombineInstance> items , byte area , InputGeometryCompiler compiler) { const int MaxTris = 65000; List<CombineInstance> combineInstancesPart = new List<CombineInstance>(); byte[] areas = NMGen.CreateAreaBuffer(MaxTris, area); while (items.Count != 0) { int vertCount = 0; while (items.Count > 0 && (vertCount + items.Peek().mesh.vertexCount < MaxTris)) { vertCount += items.Peek().mesh.vertexCount; combineInstancesPart.Add(items.Dequeue()); } Mesh meshPart = new Mesh(); meshPart.CombineMeshes(combineInstancesPart.ToArray(), true, true); compiler.AddTriangles(meshPart.vertices, meshPart.vertexCount , meshPart.triangles, areas, meshPart.triangles.Length / 3); Object.DestroyImmediate(meshPart); combineInstancesPart.Clear(); } }
private void Compile(InputBuildContext context) { context.info.compilerCount++; InputGeometryCompiler compiler = context.geomCompiler; List <Component> items = context.components; List <byte> areas = context.areas; for (int i = 0; i < items.Count; i++) { Component item = items[i]; if (item is Terrain) { Terrain terrain = (Terrain)item; if (terrain.terrainData != terrainData) { continue; } TriangleMesh mesh = TerrainUtil.TriangulateSurface(terrain, mResolution); byte[] lareas = NMGen.CreateAreaBuffer(mesh.triCount, areas[i]); if (compiler.AddTriangles(mesh, lareas)) { string msg = string.Format("Compiled the {0} terrain surface. Triangles: {1}" , terrain.name, mesh.triCount); context.Log(msg, this); } else { string msg = string.Format("Compiler rejected mesh for the {0} terrain.", terrain.name); context.LogError(msg, this); return; } if (includeTrees) { int before = compiler.TriCount; TerrainUtil.TriangluateTrees(terrain, areas[i], compiler); string msg = string.Format("Compiled the {0} terrain trees. Triangles: {1}" , terrain.name, compiler.TriCount - before); context.Log(msg, this); } break; } } }