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); } }
private static GameObject ConstructGeneratedMesh(GeneratedMeshPartInfo[,,] dataArray, int materialID) { Vector3 scale = Vector3.one; var ci = new CombineInstance[RefineGeneratedMesh(ref dataArray)]; int i = 0, xsize = dataArray.GetLength(0), ysize = dataArray.GetLength(1), zsize = dataArray.GetLength(2); float xhalf = xsize / 2f, zhalf = zsize / 2f; Quaternion[] rotations = new Quaternion[6] { Quaternion.identity, Quaternion.Euler(0f, 90f, 0f), Quaternion.Euler(0f, 180f, 0f), Quaternion.Euler(0f, 270f, 0f), Quaternion.Euler(90f, 0f, 0f), Quaternion.Euler(-90f, 0f, 0f) }; Vector3[] correctionVectors = new Vector3[6] { Vector3.forward * 0.5f *scale.z, Vector3.right * 0.5f *scale.x, Vector3.back * 0.5f *scale.z, Vector3.left * 0.5f *scale.x, Vector3.up * 0.5f *scale.y, Vector3.down * 0.5f *scale.y }; for (int x = 0; x < xsize; x++) { for (int y = 0; y < ysize; y++) { for (int z = 0; z < zsize; z++) { var gmi = dataArray[x, y, z]; if (gmi.fwdFaceType != MeshType.NoMesh) { ci[i].mesh = MeshMaster.GetMesh(gmi.fwdFaceType, materialID); ci[i].transform = Matrix4x4.TRS((new Vector3(x - xhalf, y - ysize, z - zhalf) + correctionVectors[0]), rotations[0], scale); i++; } if (gmi.rightFaceType != MeshType.NoMesh) { ci[i].mesh = MeshMaster.GetMesh(gmi.rightFaceType, materialID); ci[i].transform = Matrix4x4.TRS((new Vector3(x - xhalf, y - ysize, z - zhalf) + correctionVectors[1]), rotations[1], scale); i++; } if (gmi.backFaceType != MeshType.NoMesh) { ci[i].mesh = MeshMaster.GetMesh(gmi.backFaceType, materialID); ci[i].transform = Matrix4x4.TRS((new Vector3(x - xhalf, y - ysize, z - zhalf) + correctionVectors[2]), rotations[2], scale); i++; } if (gmi.leftFaceType != MeshType.NoMesh) { ci[i].mesh = MeshMaster.GetMesh(gmi.leftFaceType, materialID); ci[i].transform = Matrix4x4.TRS((new Vector3(x - xhalf, y - ysize, z - zhalf) + correctionVectors[3]), rotations[3], scale); i++; } if (gmi.upFaceType != MeshType.NoMesh) { ci[i].mesh = MeshMaster.GetMesh(gmi.upFaceType, materialID); ci[i].transform = Matrix4x4.TRS((new Vector3(x - xhalf, y - ysize, z - zhalf) + correctionVectors[4]), rotations[5], scale); i++; } if (gmi.downFaceType != MeshType.NoMesh) { ci[i].mesh = MeshMaster.GetMesh(gmi.downFaceType, materialID); ci[i].transform = Matrix4x4.TRS((new Vector3(x - xhalf, y - ysize, z - zhalf) + correctionVectors[5]), rotations[5], scale); i++; } if (gmi.innerFaceType != MeshType.NoMesh) { ci[i].mesh = MeshMaster.GetMesh(gmi.innerFaceType, materialID); ci[i].transform = Matrix4x4.TRS((new Vector3(x - xhalf, y - ysize, z - zhalf)), (gmi.fwdFaceType == MeshType.NoMesh) ? rotations[0] : (gmi.rightFaceType == MeshType.NoMesh ? rotations[1] : ( gmi.backFaceType == MeshType.NoMesh ? rotations[2] : rotations[3] )), scale); i++; } } } } GameObject g = new GameObject("peak model"); var mf = g.AddComponent <MeshFilter>(); var m = new Mesh(); m.CombineMeshes(ci, true); mf.sharedMesh = m; var mr = g.AddComponent <MeshRenderer>(); mr.sharedMaterial = PoolMaster.GetMaterial(materialID); if (PoolMaster.shadowCasting) { mr.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.On; mr.receiveShadows = true; } else { mr.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off; mr.receiveShadows = false; } mr.lightProbeUsage = UnityEngine.Rendering.LightProbeUsage.Off; mr.reflectionProbeUsage = UnityEngine.Rendering.ReflectionProbeUsage.Off; return(g); }
private void CreateBlockpartsRenderer(MeshVisualizeInfo mvi) { if (renderers.ContainsKey(mvi)) { return; } var processingIndexes = new List <int>(); for (int i = 0; i < blockVisualizersList.Count; i++) { if (blockVisualizersList[i].meshInfo == mvi) { processingIndexes.Add(i); } } int pcount = processingIndexes.Count; if (pcount > 0) { var ci = new CombineInstance[pcount]; Mesh m; BlockpartVisualizeInfo cdata; for (int j = 0; j < pcount; j++) { cdata = blockVisualizersList[processingIndexes[j]]; m = MeshMaster.GetMesh(cdata.meshType, cdata.materialID); ci[j].mesh = m; ci[j].transform = cdata.GetPositionMatrix(); } GameObject g = new GameObject(); m = new Mesh(); m.CombineMeshes(ci, true); // все подмеши используют один материал //удаление копий вершин на стыках - отменено из-за uv var mf = g.AddComponent <MeshFilter>(); mf.sharedMesh = m; var mr = g.AddComponent <MeshRenderer>(); mr.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off; mr.receiveShadows = PoolMaster.shadowCasting; mr.lightProbeUsage = UnityEngine.Rendering.LightProbeUsage.Off; mr.reflectionProbeUsage = UnityEngine.Rendering.ReflectionProbeUsage.Off; if (!PoolMaster.useIlluminationSystem) { mr.sharedMaterial = PoolMaster.GetMaterial(mvi.materialType); } else { mr.sharedMaterial = PoolMaster.GetMaterial(mvi.materialType, mvi.illumination); } g.transform.parent = renderersHolders[mvi.faceIndex].transform; g.AddComponent <MeshCollider>().sharedMesh = m; g.tag = BLOCK_COLLIDER_TAG; renderers.Add(mvi, g); } }