From 32897138b5ff88142288e137a497a377244a0f72 Mon Sep 17 00:00:00 2001 From: Nico de Poel Date: Mon, 10 May 2021 11:52:29 +0200 Subject: [PATCH] Build a single giant mesh for every texture-lightmap group of surfaces. Greatly improves rendering performance. --- Assets/Scripts/Modules/BrushModel.cs | 50 +++++++++++++++++++++++++--- 1 file changed, 46 insertions(+), 4 deletions(-) diff --git a/Assets/Scripts/Modules/BrushModel.cs b/Assets/Scripts/Modules/BrushModel.cs index 1757cf5..37f9b97 100644 --- a/Assets/Scripts/Modules/BrushModel.cs +++ b/Assets/Scripts/Modules/BrushModel.cs @@ -47,10 +47,7 @@ public class BrushModel var groupGO = new GameObject($"T{key.Item1}_L{key.Item2}"); groupGO.transform.SetParent(modelGO.transform); - for (int i = 0; i < group.Value.Count; ++i) - { - CreateSurfaceMeshes(group.Value[i], $"{i}", groupGO); - } + CreateMeshFromSurfaces(group.Value, groupGO.name, groupGO); } } } @@ -138,6 +135,51 @@ public class BrushModel } } + private void CreateMeshFromSurfaces(List surfaces, string key, GameObject parentGO) + { + tempVertices.Clear(); + tempTextureUVs.Clear(); + tempLightmapUVs.Clear(); + tempIndices.Clear(); + + int vertOffset = 0; + + for (int surfIdx = 0; surfIdx < surfaces.Count; ++surfIdx) + { + foreach (var polyVerts in surfaces[surfIdx].GetPolygons()) + { + for (int vertIdx = 0; vertIdx < polyVerts.Length; ++vertIdx) + { + tempVertices.Add(polyVerts[vertIdx].position.ToVector3().ToUnity()); + tempTextureUVs.Add(polyVerts[vertIdx].textureUV.ToVector2()); + tempLightmapUVs.Add(polyVerts[vertIdx].lightmapUV.ToVector2()); + } + + // Reconstruct triangle fan + for (ushort index = 2; index < polyVerts.Length; ++index) + { + tempIndices.Add((ushort)vertOffset); + tempIndices.Add((ushort)(vertOffset + index - 1)); + tempIndices.Add((ushort)(vertOffset + index)); + } + + vertOffset += polyVerts.Length; + } + } + + Mesh mesh = new Mesh(); + mesh.name = $"Surfaces_{key}"; + mesh.SetVertices(tempVertices); + mesh.SetUVs(0, tempTextureUVs); + mesh.SetUVs(1, tempLightmapUVs); + mesh.SetIndices(tempIndices, MeshTopology.Triangles, 0); + mesh.RecalculateNormals(); + mesh.UploadMeshData(true); + meshes.Add(mesh); + + CreateMeshObject(mesh, parentGO); + } + private void CreateMeshObject(Mesh mesh, GameObject parentGO) { var meshGO = new GameObject(mesh.name);