コード例 #1
0
    public static void PopulateMeshDataToDrawChunk(Chunk chunk, CustomMesh chunkCustomMesh, byte[,,] chunkData)
    {
        chunkCustomMesh.ClearData();

        int currentVertexIndex = 0;

        // Create mesh data
        currentVertexIndex = 0;
        for (int y = 0; y < Chunk.size.y; y++)
        {
            for (int x = 0; x < Chunk.size.x; x++)
            {
                for (int z = 0; z < Chunk.size.x; z++)
                {
                    Vector3Int relativePosition = new Vector3Int(x, y, z);

                    if (chunk.GetCubeFromRelativePosition(relativePosition).isVisible)
                    {
                        //Add each voxel data to mesh data
                        for (int face = 0; face < 6; face++)                                         // 6 faces in a cube
                        {
                            if (!IsCubeOpaque(chunk, relativePosition + VoxelData.faceChecks[face])) //Check if face is visible
                            {
                                byte blockId = chunkData[(int)relativePosition.x, (int)relativePosition.y, (int)relativePosition.z];

                                chunkCustomMesh.verticesInMesh.Add(relativePosition + VoxelData.vertexPosition[VoxelData.verticesOfFace[face, 0]]);
                                chunkCustomMesh.verticesInMesh.Add(relativePosition + VoxelData.vertexPosition[VoxelData.verticesOfFace[face, 1]]);
                                chunkCustomMesh.verticesInMesh.Add(relativePosition + VoxelData.vertexPosition[VoxelData.verticesOfFace[face, 2]]);
                                chunkCustomMesh.verticesInMesh.Add(relativePosition + VoxelData.vertexPosition[VoxelData.verticesOfFace[face, 3]]);

                                AddTexture(CubesManager.Instance.GetCube(blockId).GetTextureId(face), chunkCustomMesh.uvs);

                                chunkCustomMesh.indexOfVerticesToFormTriangles.Add(currentVertexIndex);
                                chunkCustomMesh.indexOfVerticesToFormTriangles.Add(currentVertexIndex + 1);
                                chunkCustomMesh.indexOfVerticesToFormTriangles.Add(currentVertexIndex + 2);
                                chunkCustomMesh.indexOfVerticesToFormTriangles.Add(currentVertexIndex + 2);
                                chunkCustomMesh.indexOfVerticesToFormTriangles.Add(currentVertexIndex + 1);
                                chunkCustomMesh.indexOfVerticesToFormTriangles.Add(currentVertexIndex + 3);
                                currentVertexIndex += 4;

                                /* // OLD METHOD - Adding duplicated vertices but easier tu underestand
                                 * for (int vertexNumber = 0; vertexNumber < 6; vertexNumber++) // 6 vertex per face
                                 * {
                                 *  // Save the vertex position
                                 *  int vertexIndexOfTriangle = VoxelData.verticesOfFace[face, vertexNumber];
                                 *  verticesInMesh.Add(VoxelData.vertexPosition[vertexIndexOfTriangle] + relativePosition);
                                 *
                                 *  // Assign the vertex to the correspondent triangle
                                 *  indexOfVerticesToFormTriangles.Add(currentVertexIndex);
                                 *  currentVertexIndex++;
                                 *
                                 *  // Assign the texture coordinates for that vertex
                                 *  uvs.Add(VoxelData.textureCoordinates[vertexNumber]);
                                 * }*/
                            }
                        }
                    }
                }
            }
        }
    }