Ejemplo n.º 1
0
        private void AddVoxelMesh(Chunk chunk, Vector3I pos)
        {
            List <Voxel> neededVoxels  = CalculateNeededVoxels(chunk, pos);
            List <int>   vertexNumbers = GetVertexNumbersFromLookup(neededVoxels);

            if (vertexNumbers.Count > 0)
            {
                VoxelMesh voxelMesh = new VoxelMesh();

                List <float>   internalDistances = CalculateInternalDistances(neededVoxels);
                List <Vector3> internalPositions = CalculateInternalPositions(internalDistances);

                List <float> materialAmounts = CalculateMaterialAmounts(neededVoxels);
                List <int>   materialIds     = CalculateMaterialIds(neededVoxels);

                for (int i = 0; i < 8; i++)
                {
                    voxelMesh.MaterialAmount.Add(materialAmounts[i]);
                    voxelMesh.MaterialId.Add(materialIds[i]);
                }

                uint id = 0;
                void Add(int index, Vector3 n)
                {
                    voxelMesh.DefaultMesh.Position.Add(internalPositions[index]);
                    voxelMesh.DefaultMesh.Normal.Add(n);
                    voxelMesh.DefaultMesh.IDs.Add(id);
                    voxelMesh.TexCoord3D.Add(internalPositions[index]);
                    voxelMesh.VoxelId.Add(0);
                    id++;
                }

                for (int i = 0; i < vertexNumbers.Count; i += 3)
                {
                    Vector3 n = CalculateNormal(internalPositions[vertexNumbers[i]], internalPositions[vertexNumbers[i + 1]], internalPositions[vertexNumbers[i + 2]]);
                    Add(vertexNumbers[i + 2], n);
                    Add(vertexNumbers[i + 1], n);
                    Add(vertexNumbers[i], n);
                }

                this.Add(voxelMesh.Transform(Matrix4x4.CreateTranslation((Vector3)pos)));
            }
        }