public void TestTerrain() { var grids = new MarchingCubes.GridCell[WIDTH * HEIGHT * DEPTH]; var mc = new MarchingCubes(); var triangles = new MarchingCubes.Triangle[5]; var triCount = 0; for (int z = 0; z < DEPTH; z++) { for (int y = 0; y < HEIGHT; y++) { for (int x = 0; x < WIDTH; x++) { var gridCell = new MarchingCubes.GridCell(); gridCell.p[0] = new Vector3(x + 0, y + 0, z + 1); gridCell.p[1] = new Vector3(x + 1, y + 0, z + 1); gridCell.p[2] = new Vector3(x + 1, y + 0, z + 0); gridCell.p[3] = new Vector3(x + 0, y + 0, z + 0); gridCell.p[4] = new Vector3(x + 0, y + 1, z + 1); gridCell.p[5] = new Vector3(x + 1, y + 1, z + 1); gridCell.p[6] = new Vector3(x + 1, y + 1, z + 0); gridCell.p[7] = new Vector3(x + 0, y + 1, z + 0); gridCell.val[0] = MyTerrain.noise[((int)position.x * WIDTH + x + 0) + ((int)position.y * HEIGHT + y + 0) * MyTerrain.NOISE_WIDTH + ((int)position.z * DEPTH + z + 1) * MyTerrain.NOISE_HEIGHT * MyTerrain.NOISE_WIDTH]; gridCell.val[1] = MyTerrain.noise[((int)position.x * WIDTH + x + 1) + ((int)position.y * HEIGHT + y + 0) * MyTerrain.NOISE_WIDTH + ((int)position.z * DEPTH + z + 1) * MyTerrain.NOISE_HEIGHT * MyTerrain.NOISE_WIDTH]; gridCell.val[2] = MyTerrain.noise[((int)position.x * WIDTH + x + 1) + ((int)position.y * HEIGHT + y + 0) * MyTerrain.NOISE_WIDTH + ((int)position.z * DEPTH + z + 0) * MyTerrain.NOISE_HEIGHT * MyTerrain.NOISE_WIDTH]; gridCell.val[3] = MyTerrain.noise[((int)position.x * WIDTH + x + 0) + ((int)position.y * HEIGHT + y + 0) * MyTerrain.NOISE_WIDTH + ((int)position.z * DEPTH + z + 0) * MyTerrain.NOISE_HEIGHT * MyTerrain.NOISE_WIDTH]; gridCell.val[4] = MyTerrain.noise[((int)position.x * WIDTH + x + 0) + ((int)position.y * HEIGHT + y + 1) * MyTerrain.NOISE_WIDTH + ((int)position.z * DEPTH + z + 1) * MyTerrain.NOISE_HEIGHT * MyTerrain.NOISE_WIDTH]; gridCell.val[5] = MyTerrain.noise[((int)position.x * WIDTH + x + 1) + ((int)position.y * HEIGHT + y + 1) * MyTerrain.NOISE_WIDTH + ((int)position.z * DEPTH + z + 1) * MyTerrain.NOISE_HEIGHT * MyTerrain.NOISE_WIDTH]; gridCell.val[6] = MyTerrain.noise[((int)position.x * WIDTH + x + 1) + ((int)position.y * HEIGHT + y + 1) * MyTerrain.NOISE_WIDTH + ((int)position.z * DEPTH + z + 0) * MyTerrain.NOISE_HEIGHT * MyTerrain.NOISE_WIDTH]; gridCell.val[7] = MyTerrain.noise[((int)position.x * WIDTH + x + 0) + ((int)position.y * HEIGHT + y + 1) * MyTerrain.NOISE_WIDTH + ((int)position.z * DEPTH + z + 0) * MyTerrain.NOISE_HEIGHT * MyTerrain.NOISE_WIDTH]; grids[x + y * WIDTH + z * HEIGHT * WIDTH] = gridCell; } } } for (int i = 0; i < grids.Length; i++) { triangles = new MarchingCubes.Triangle[5]; for (int k = 0; k < triangles.Length; k++) { triangles[k] = new MarchingCubes.Triangle(); } numTris = mc.Polygonize(grids[i], terrain.isolevel, triangles); for (int j = 0; j < numTris; j++) { verts.Add(triangles[j].p[0]); verts.Add(triangles[j].p[1]); verts.Add(triangles[j].p[2]); tris.Add(triCount * 3 + 0); tris.Add(triCount * 3 + 1); tris.Add(triCount * 3 + 2); triCount++; } } canRender = true; }
public Chunk(GameObject gameObject, Vector3 noiseVector) { go = gameObject; go.transform.parent = GameObject.Find("Terrain").transform; meshFilter = go.AddComponent <MeshFilter>(); meshRenderer = go.AddComponent <MeshRenderer>(); meshRenderer.material = Resources.Load <Material>("Materials/Dark Green"); noisePosition = new Vector3(noiseVector.x, noiseVector.y, noiseVector.z); grids = new MarchingCubes.GridCell[WIDTH * HEIGHT * DEPTH]; mc = new MarchingCubes(); triangles = new MarchingCubes.Triangle[5]; triCount = 0; //Debug.Log(go.name); for (int z = 0; z < DEPTH; z++) { for (int y = 0; y < HEIGHT; y++) { for (int x = 0; x < WIDTH; x++) { var gridCell = new MarchingCubes.GridCell(); gridCell.p[0] = new Vector3(x + 0, y + 0, z + 1); gridCell.p[1] = new Vector3(x + 1, y + 0, z + 1); gridCell.p[2] = new Vector3(x + 1, y + 0, z + 0); gridCell.p[3] = new Vector3(x + 0, y + 0, z + 0); gridCell.p[4] = new Vector3(x + 0, y + 1, z + 1); gridCell.p[5] = new Vector3(x + 1, y + 1, z + 1); gridCell.p[6] = new Vector3(x + 1, y + 1, z + 0); gridCell.p[7] = new Vector3(x + 0, y + 1, z + 0); var noiseIndexX = (int)noisePosition.x + x; var noiseIndexY = (int)noisePosition.y + y; var noiseIndexZ = (int)noisePosition.z + z; #region old 1d array way doesn't quite work right //gridCell.val[0] = MapTerrain.noise[(noiseIndexX + 0) + (noiseIndexY + 0) * MapTerrain.NOISE_WIDTH + (noiseIndexZ + 1) * MapTerrain.NOISE_HEIGHT * MapTerrain.NOISE_WIDTH]; //gridCell.val[1] = MapTerrain.noise[(noiseIndexX + 1) + (noiseIndexY + 0) * MapTerrain.NOISE_WIDTH + (noiseIndexZ + 1) * MapTerrain.NOISE_HEIGHT * MapTerrain.NOISE_WIDTH]; //gridCell.val[2] = MapTerrain.noise[(noiseIndexX + 1) + (noiseIndexY + 0) * MapTerrain.NOISE_WIDTH + (noiseIndexZ + 0) * MapTerrain.NOISE_HEIGHT * MapTerrain.NOISE_WIDTH]; //gridCell.val[3] = MapTerrain.noise[(noiseIndexX + 0) + (noiseIndexY + 0) * MapTerrain.NOISE_WIDTH + (noiseIndexZ + 0) * MapTerrain.NOISE_HEIGHT * MapTerrain.NOISE_WIDTH]; //gridCell.val[4] = MapTerrain.noise[(noiseIndexX + 0) + (noiseIndexY + 1) * MapTerrain.NOISE_WIDTH + (noiseIndexZ + 1) * MapTerrain.NOISE_HEIGHT * MapTerrain.NOISE_WIDTH]; //gridCell.val[5] = MapTerrain.noise[(noiseIndexX + 1) + (noiseIndexY + 1) * MapTerrain.NOISE_WIDTH + (noiseIndexZ + 1) * MapTerrain.NOISE_HEIGHT * MapTerrain.NOISE_WIDTH]; //gridCell.val[6] = MapTerrain.noise[(noiseIndexX + 1) + (noiseIndexY + 1) * MapTerrain.NOISE_WIDTH + (noiseIndexZ + 0) * MapTerrain.NOISE_HEIGHT * MapTerrain.NOISE_WIDTH]; //gridCell.val[7] = MapTerrain.noise[(noiseIndexX + 0) + (noiseIndexY + 1) * MapTerrain.NOISE_WIDTH + (noiseIndexZ + 0) * MapTerrain.NOISE_HEIGHT * MapTerrain.NOISE_WIDTH]; #endregion gridCell.val[0] = MapTerrain.noise[(noiseIndexX + 0), (noiseIndexY + 0), (noiseIndexZ + 1)]; gridCell.val[1] = MapTerrain.noise[(noiseIndexX + 1), (noiseIndexY + 0), (noiseIndexZ + 1)]; gridCell.val[2] = MapTerrain.noise[(noiseIndexX + 1), (noiseIndexY + 0), (noiseIndexZ + 0)]; gridCell.val[3] = MapTerrain.noise[(noiseIndexX + 0), (noiseIndexY + 0), (noiseIndexZ + 0)]; gridCell.val[4] = MapTerrain.noise[(noiseIndexX + 0), (noiseIndexY + 1), (noiseIndexZ + 1)]; gridCell.val[5] = MapTerrain.noise[(noiseIndexX + 1), (noiseIndexY + 1), (noiseIndexZ + 1)]; gridCell.val[6] = MapTerrain.noise[(noiseIndexX + 1), (noiseIndexY + 1), (noiseIndexZ + 0)]; gridCell.val[7] = MapTerrain.noise[(noiseIndexX + 0), (noiseIndexY + 1), (noiseIndexZ + 0)]; grids[x + y * WIDTH + z * HEIGHT * WIDTH] = gridCell; } } } }