Example #1
0
        // 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;
        }
Example #2
0
        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);
        }