// Mesh generation. It's never fun private void GenerateMesh() { // x/y/z int index = 0; for (int y = 0; y < worldSize.y; y++) { for (int x = 0; x < chunkSize; x++) { for (int z = 0; z < chunkSize; z++) { Vector3Int localPosition = new Vector3Int(x, y, z); Vector3Int worldPosition = chunkWorldPosition + localPosition; if (!terrain.IsPresent(worldPosition)) { continue; } TerrainType tileType = terrain.GetType(worldPosition); TerrainTypeMaterialInfo materialInfo = materials[(int)tileType]; if (!terrain.IsPresent(new Vector3Int(worldPosition.x, worldPosition.y + 1, worldPosition.z))) { index += GenerateTopWall(index, worldPosition, localPosition, materialInfo); } if (!terrain.IsPresent(new Vector3Int(worldPosition.x, worldPosition.y - 1, worldPosition.z))) { index += GenerateBottomWall(index, worldPosition, localPosition, materialInfo); } if (!terrain.IsPresent(new Vector3Int(worldPosition.x, worldPosition.y, worldPosition.z - 1))) { index += GenerateSouthWall(index, worldPosition, localPosition, materialInfo); } if (!terrain.IsPresent(new Vector3Int(worldPosition.x, worldPosition.y, worldPosition.z + 1))) { index += GenerateNorthWall(index, worldPosition, localPosition, materialInfo); } if (!terrain.IsPresent(new Vector3Int(worldPosition.x - 1, worldPosition.y, worldPosition.z))) { index += GenerateWestWall(index, worldPosition, localPosition, materialInfo); } if (!terrain.IsPresent(new Vector3Int(worldPosition.x + 1, worldPosition.y, worldPosition.z))) { index += GenerateEastWall(index, worldPosition, localPosition, materialInfo); } } } } counts[0] = index; }
private int GenerateTopWall(int index, Vector3Int worldPosition, Vector3Int chunkPosition, TerrainTypeMaterialInfo materialInfo) { int i = index * 4; int j = index * 6; // Looking along Y axis // Bottom left vertices[i] = new Vector3(chunkPosition.x * tileSize.x, chunkPosition.y * tileSize.y + tileSize.y, chunkPosition.z * tileSize.z); // Top left vertices[i + 1] = new Vector3(chunkPosition.x * tileSize.x, chunkPosition.y * tileSize.y + tileSize.y, chunkPosition.z * tileSize.z + tileSize.z); // Top right vertices[i + 2] = new Vector3(chunkPosition.x * tileSize.x + tileSize.x, chunkPosition.y * tileSize.y + tileSize.y, chunkPosition.z * tileSize.z + tileSize.z); // Bottom right vertices[i + 3] = new Vector3(chunkPosition.x * tileSize.x + tileSize.x, chunkPosition.y * tileSize.y + tileSize.y, chunkPosition.z * tileSize.z); float uv = 1f / textureSize; uv0[i] = new Vector2(worldPosition.x * uv, worldPosition.z * uv); uv0[i + 1] = new Vector2(worldPosition.x * uv, worldPosition.z * uv + uv); uv0[i + 2] = new Vector2(worldPosition.x * uv + uv, worldPosition.z * uv + uv); uv0[i + 3] = new Vector2(worldPosition.x * uv + uv, worldPosition.z * uv); colors[i] = new Color(materialInfo.shaderIndex, materialInfo.smoothness, 0, 0); colors[i + 1] = new Color(materialInfo.shaderIndex, materialInfo.smoothness, 0, 0); colors[i + 2] = new Color(materialInfo.shaderIndex, materialInfo.smoothness, 0, 0); colors[i + 3] = new Color(materialInfo.shaderIndex, materialInfo.smoothness, 0, 0); triangles[j] = i; triangles[j + 1] = i + 1; triangles[j + 2] = i + 2; triangles[j + 3] = i; triangles[j + 4] = i + 2; triangles[j + 5] = i + 3; return(1); }