// Start is called before the first frame update public void CreateModel(Vector3 _sizesMaxCube, float _sizeCube) { sizeMaxCubeX = (int)_sizesMaxCube.x; sizeMaxCubeY = (int)_sizesMaxCube.y; sizeMaxCubeZ = (int)_sizesMaxCube.z; sizeCube = _sizeCube; mesh = GetComponent <MeshFilter>().mesh; meshCollider = GetComponent <MeshCollider>(); meshCollider.sharedMesh = mesh; cubes = new Cube[sizeMaxCubeX, sizeMaxCubeY, sizeMaxCubeZ]; cubeVertices = new CubeVertice[sizeMaxCubeX + 1, sizeMaxCubeY + 1, sizeMaxCubeZ + 1]; for (int k = 0; k < (sizeMaxCubeZ + 1); k++) { for (int j = 0; j < (sizeMaxCubeY + 1); j++) { for (int i = 0; i < (sizeMaxCubeX + 1); i++) { CubeVertice vertice = cubeVertices[i, j, k]; vertice.gridPosition = new Vector3(i, j, k); //vertice.worldPosition = transform.position + vertice.gridPosition * sizeCube; vertice.localPosition = (vertice.gridPosition) * sizeCube; vertice.isDestroyed = false; vertice.value = 0; if (vertice.gridPosition.x == 0 || vertice.gridPosition.x == sizeMaxCubeX || vertice.gridPosition.y == 0 || vertice.gridPosition.y == sizeMaxCubeY || vertice.gridPosition.z == 0 || vertice.gridPosition.z == sizeMaxCubeZ) { vertice.isDestroyed = true; } cubeVertices[i, j, k] = vertice; } } } for (int k = 0; k < sizeMaxCubeZ; k++) { for (int j = 0; j < sizeMaxCubeY; j++) { for (int i = 0; i < sizeMaxCubeX; i++) { Cube cube = cubes[i, j, k]; cube.configuration = 0; for (int verticeIndex = 0; verticeIndex < 8; verticeIndex++) { Vector3 relativePosition = GetCubeVerticePositionRelativeByIndex(verticeIndex); CubeVertice vertice = cubeVertices[i + (int)relativePosition.x, j + (int)relativePosition.y, k + (int)relativePosition.z]; if (!vertice.isDestroyed) { cube.configuration |= (1 << verticeIndex); } } cubes[i, j, k] = cube; } } } RebuildMesh(); }
public void Destruction(Vector3 impact, float radiusImpact) { for (int k = 0; k < (sizeMaxCubeZ + 1); k++) { for (int j = 0; j < (sizeMaxCubeY + 1); j++) { for (int i = 0; i < (sizeMaxCubeX + 1); i++) { CubeVertice vertice = cubeVertices[i, j, k]; if (Vector3.Distance(impact, vertice.GetWorldPosition(transform.position)) < radiusImpact) { vertice.isDestroyed = true; } cubeVertices[i, j, k] = vertice; } } } for (int k = 0; k < sizeMaxCubeZ; k++) { for (int j = 0; j < sizeMaxCubeY; j++) { for (int i = 0; i < sizeMaxCubeX; i++) { Cube cube = cubes[i, j, k]; cube.configuration = 0; for (int verticeIndex = 0; verticeIndex < 8; verticeIndex++) { Vector3 relativePosition = GetCubeVerticePositionRelativeByIndex(verticeIndex); CubeVertice vertice = cubeVertices[i + (int)relativePosition.x, j + (int)relativePosition.y, k + (int)relativePosition.z]; if (!vertice.isDestroyed) { cube.configuration |= (1 << verticeIndex); } } cubes[i, j, k] = cube; } } } RebuildMesh(); }
public void RebuildMesh() { List <Vector3> verticesMesh = new List <Vector3>(); List <int> trianglesMesh = new List <int>(); for (int k = 0; k < sizeMaxCubeZ; k++) { for (int j = 0; j < sizeMaxCubeY; j++) { for (int i = 0; i < sizeMaxCubeX; i++) { Cube cube = cubes[i, j, k]; int edgeMask = GetCubeEdgesConfigurationByIndex(cube.configuration); if (edgeMask == 0) { continue; } int[] edges = new int[12]; for (int edgeIndex = 0; edgeIndex < 12; edgeIndex++) { if ((edgeMask & (1 << edgeIndex)) == 0) { continue; } int[] verticesEdgeIndex = GetVerticePairsByEdgeIndex(edgeIndex); Vector3 p0 = GetCubeVerticePositionRelativeByIndex(verticesEdgeIndex[0]); Vector3 p1 = GetCubeVerticePositionRelativeByIndex(verticesEdgeIndex[1]); CubeVertice origin = cubeVertices[i + (int)p0.x, j + (int)p0.y, k + (int)p0.z]; CubeVertice end = cubeVertices[i + (int)p1.x, j + (int)p1.y, k + (int)p1.z]; Vector3 midPoint = ((end.localPosition - origin.localPosition) * 0.5f) + origin.localPosition; edges[edgeIndex] = verticesMesh.Count; verticesMesh.Add(midPoint); } int[] trianglesIndexes = GetCubeTrianglesConfigurationByIndex(cube.configuration); for (int n = 0; n < trianglesIndexes.Length; n += 3) { trianglesMesh.Add(edges[trianglesIndexes[n + 2]]); trianglesMesh.Add(edges[trianglesIndexes[n + 1]]); trianglesMesh.Add(edges[trianglesIndexes[n]]); } } } } mesh.Clear(); mesh.vertices = verticesMesh.ToArray(); mesh.triangles = trianglesMesh.ToArray(); mesh.RecalculateBounds(); mesh.RecalculateNormals(); mesh.RecalculateTangents(); meshCollider.sharedMesh = mesh; }