public static void BuildForChunk(tk2dTileMap tileMap, SpriteChunk chunk, int baseX, int baseY) { // Build local mesh Vector3[] localMeshVertices = new Vector3[0]; int[] localMeshIndices = new int[0]; BuildLocalMeshForChunk(tileMap, chunk, baseX, baseY, ref localMeshVertices, ref localMeshIndices); // only process when there are more than two triangles // avoids a lot of branches later if (localMeshIndices.Length > 6) { // Remove duplicate verts localMeshVertices = WeldVertices(localMeshVertices, ref localMeshIndices); // Remove duplicate and back-to-back faces // Removes inside faces localMeshIndices = RemoveDuplicateFaces(localMeshIndices); // Merge coplanar faces // Optimize (remove unused vertices, reindex) } if (localMeshVertices.Length > 0) { if (chunk.colliderMesh != null) { GameObject.DestroyImmediate(chunk.colliderMesh); chunk.colliderMesh = null; } if (chunk.meshCollider == null) { chunk.meshCollider = chunk.gameObject.GetComponent <MeshCollider>(); if (chunk.meshCollider == null) { chunk.meshCollider = chunk.gameObject.AddComponent <MeshCollider>(); } } chunk.colliderMesh = tileMap.GetOrCreateMesh(); chunk.colliderMesh.vertices = localMeshVertices; chunk.colliderMesh.triangles = localMeshIndices; chunk.colliderMesh.RecalculateBounds(); if (tileMap.serializeRenderData) { chunk.mesh.RecalculateNormals(); } chunk.meshCollider.sharedMesh = chunk.colliderMesh; } else { chunk.DestroyColliderData(tileMap); } }
public static void BuildForChunk(tk2dTileMap tileMap, SpriteChunk chunk) { // Build local mesh Vector3[] localMeshVertices = new Vector3[0]; int[] localMeshIndices = new int[0]; BuildLocalMeshForChunk(tileMap, chunk, ref localMeshVertices, ref localMeshIndices); // only process when there are more than two triangles // avoids a lot of branches later if (localMeshIndices.Length > 6) { // Remove duplicate verts localMeshVertices = WeldVertices(localMeshVertices, ref localMeshIndices); // Remove duplicate and back-to-back faces // Removes inside faces localMeshIndices = RemoveDuplicateFaces(localMeshIndices); // Merge coplanar faces // Optimize (remove unused vertices, reindex) } if (localMeshVertices.Length > 0) { if (chunk.colliderMesh != null) { GameObject.DestroyImmediate(chunk.colliderMesh); chunk.colliderMesh = null; } if (chunk.meshCollider == null) { chunk.meshCollider = chunk.gameObject.GetComponent<MeshCollider>(); if (chunk.meshCollider == null) chunk.meshCollider = chunk.gameObject.AddComponent<MeshCollider>(); } chunk.colliderMesh = tileMap.GetOrCreateMesh(); chunk.colliderMesh.vertices = localMeshVertices; chunk.colliderMesh.triangles = localMeshIndices; chunk.colliderMesh.RecalculateBounds(); if (tileMap.serializeRenderData) chunk.mesh.RecalculateNormals(); chunk.meshCollider.sharedMesh = chunk.colliderMesh; } else { chunk.DestroyColliderData(tileMap); } }
public static void BuildForChunk(tk2dTileMap tileMap, SpriteChunk chunk, int baseX, int baseY) { // Build local mesh Vector3[] localMeshVertices = new Vector3[0]; int[] localMeshIndices = new int[0]; BuildLocalMeshForChunk(tileMap, chunk, baseX, baseY, ref localMeshVertices, ref localMeshIndices); // only process when there are more than two triangles // avoids a lot of branches later if (localMeshIndices.Length > 6) { // Remove duplicate verts localMeshVertices = WeldVertices(localMeshVertices, ref localMeshIndices); // Remove duplicate and back-to-back faces // Removes inside faces localMeshIndices = RemoveDuplicateFaces(localMeshIndices); // Merge coplanar faces // Optimize (remove unused vertices, reindex) } #if !(UNITY_3_5 || UNITY_4_0 || UNITY_4_0_1 || UNITY_4_1 || UNITY_4_2) foreach (EdgeCollider2D c2d in chunk.edgeColliders) { if (c2d != null) { tk2dUtil.DestroyImmediate(c2d); } } chunk.edgeColliders.Clear(); #endif if (localMeshVertices.Length > 0) { if (chunk.colliderMesh != null) { tk2dUtil.DestroyImmediate(chunk.colliderMesh); chunk.colliderMesh = null; } if (chunk.meshCollider == null) { chunk.meshCollider = chunk.gameObject.GetComponent<MeshCollider>(); if (chunk.meshCollider == null) chunk.meshCollider = tk2dUtil.AddComponent<MeshCollider>(chunk.gameObject); } chunk.colliderMesh = tk2dUtil.CreateMesh(); chunk.colliderMesh.vertices = localMeshVertices; chunk.colliderMesh.triangles = localMeshIndices; chunk.colliderMesh.RecalculateBounds(); chunk.meshCollider.sharedMesh = chunk.colliderMesh; } else { chunk.DestroyColliderData(tileMap); } }
public static void BuildForChunk(tk2dTileMap tileMap, SpriteChunk chunk, int baseX, int baseY) { // Build local mesh Vector3[] localMeshVertices = new Vector3[0]; int[] localMeshIndices = new int[0]; BuildLocalMeshForChunk(tileMap, chunk, baseX, baseY, ref localMeshVertices, ref localMeshIndices); // only process when there are more than two triangles // avoids a lot of branches later if (localMeshIndices.Length > 6) { // Remove duplicate verts localMeshVertices = WeldVertices(localMeshVertices, ref localMeshIndices); // Remove duplicate and back-to-back faces // Removes inside faces localMeshIndices = RemoveDuplicateFaces(localMeshIndices); // Merge coplanar faces // Optimize (remove unused vertices, reindex) } #if !(UNITY_3_5 || UNITY_4_0 || UNITY_4_0_1 || UNITY_4_1 || UNITY_4_2) foreach (PolygonCollider2D c2d in chunk.edgeColliders) { if (c2d != null) { tk2dUtil.DestroyImmediate(c2d); } } chunk.edgeColliders.Clear(); #endif if (localMeshVertices.Length > 0) { if (chunk.colliderMesh != null) { tk2dUtil.DestroyImmediate(chunk.colliderMesh); chunk.colliderMesh = null; } if (chunk.meshCollider == null) { chunk.meshCollider = chunk.gameObject.GetComponent <MeshCollider>(); if (chunk.meshCollider == null) { chunk.meshCollider = tk2dUtil.AddComponent <MeshCollider>(chunk.gameObject); } } chunk.colliderMesh = tk2dUtil.CreateMesh(); chunk.colliderMesh.vertices = localMeshVertices; chunk.colliderMesh.triangles = localMeshIndices; chunk.colliderMesh.RecalculateBounds(); chunk.meshCollider.sharedMesh = chunk.colliderMesh; } else { chunk.DestroyColliderData(tileMap); } }