private void INLINE_CombineMeshes(ref List <int> indexes, ref Mesh visibleMesh, ref Mesh colliderMesh) { int count = indexes.Count; if (count > 0) { CombineInstance[] visibleCI = new CombineInstance[count], colliderCI = new CombineInstance[count]; Mesh m; BlockpartVisualizeInfo bvi; Matrix4x4 mtr; for (int i = 0; i < count; i++) { bvi = blockVisualizersList[indexes[i]]; m = MeshMaster.GetMesh(bvi.meshType, bvi.materialID); visibleCI[i].mesh = m; visibleCI[i].transform = bvi.GetPositionMatrix(); mtr = bvi.GetPositionMatrix(); visibleCI[i].transform = mtr; colliderCI[i].mesh = bvi.meshType == MeshType.Quad ? m : MeshMaster.GetMeshColliderLink(bvi.meshType); colliderCI[i].transform = mtr; } visibleMesh.CombineMeshes(visibleCI, true); // все подмеши используют один материал colliderMesh.CombineMeshes(colliderCI); } }
private void RedrawRenderer(MeshVisualizeInfo mvi) { GameObject g; renderers.TryGetValue(mvi, out g); if (g != null) { int n = blockVisualizersList.Count; if (n > 0) { var indexes = new List <int>(); for (int i = 0; i < n; i++) { if (blockVisualizersList[i].meshInfo == mvi) { indexes.Add(i); } } n = indexes.Count; if (n > 0) { CombineInstance[] cir = new CombineInstance[n], cic = new CombineInstance[n]; BlockpartVisualizeInfo bvi; Mesh cm; Matrix4x4 mtr; for (int i = 0; i < n; i++) { bvi = blockVisualizersList[indexes[i]]; cm = MeshMaster.GetMesh(bvi.meshType, bvi.materialID); cir[i].mesh = cm; mtr = bvi.GetPositionMatrix(); cir[i].transform = mtr; cic[i].mesh = bvi.meshType == MeshType.Quad ? cm : MeshMaster.GetMeshColliderLink(bvi.meshType); cic[i].transform = mtr; } cm = new Mesh(); cm.CombineMeshes(cir); g.GetComponent <MeshFilter>().sharedMesh = cm; cm = new Mesh(); cm.CombineMeshes(cic); g.GetComponent <MeshCollider>().sharedMesh = cm; if (PoolMaster.useIlluminationSystem) { g.GetComponent <MeshRenderer>().sharedMaterial = PoolMaster.GetMaterial(mvi.materialType, mvi.illumination); } else { g.GetComponent <MeshRenderer>().sharedMaterial = PoolMaster.GetMaterial(mvi.materialType); } } else { renderers.Remove(mvi); Destroy(g); } } } else { CreateBlockpartsRenderer(mvi); } }