Пример #1
0
        void AddVoxelToMesh(Vector3Int posInt, VoxelMesh voxelMesh, MeshData meshData)
        {
            VoxelData voxel = voxelMesh.GetVoxel(posInt);

            if (voxel == null)
            {
                return;
            }

            Vector3 pos = new Vector3(posInt.x * settings.voxelSize.x, posInt.y * settings.voxelSize.y, posInt.z * settings.voxelSize.z);

            pos -= centerPos;

            if (!voxel.IsVisible)
            {
                return;
            }

            VoxelData voxelUp = voxelMesh.GetVoxel(posInt.x, posInt.y + 1, posInt.z);

            if (voxelUp == null || !voxelUp.IsVisible)
            {
                //UP
                meshData.AddVertex(new Vector3(pos.x, pos.y + settings.voxelSize.y, pos.z + settings.voxelSize.z));
                meshData.AddVertex(new Vector3(pos.x + settings.voxelSize.x, pos.y + settings.voxelSize.y, pos.z + settings.voxelSize.z));
                meshData.AddVertex(new Vector3(pos.x + settings.voxelSize.x, pos.y + settings.voxelSize.y, pos.z));
                meshData.AddVertex(new Vector3(pos.x, pos.y + settings.voxelSize.y, pos.z));
                meshData.AddQuadTriangles();
                SetUVsVoxel(voxel, meshData.uv);
            }

            VoxelData voxelDown = voxelMesh.GetVoxel(posInt.x, posInt.y - 1, posInt.z);

            if (voxelDown == null || !voxelDown.IsVisible)
            {
                //Down
                meshData.AddVertex(new Vector3(pos.x, pos.y, pos.z));
                meshData.AddVertex(new Vector3(pos.x + settings.voxelSize.x, pos.y, pos.z));
                meshData.AddVertex(new Vector3(pos.x + settings.voxelSize.x, pos.y, pos.z + settings.voxelSize.z));
                meshData.AddVertex(new Vector3(pos.x, pos.y, pos.z + settings.voxelSize.z));
                meshData.AddQuadTriangles();
                SetUVsVoxel(voxel, meshData.uv);
            }

            VoxelData voxelFront = voxelMesh.GetVoxel(posInt.x, posInt.y, posInt.z + 1);

            if (voxelFront == null || !voxelFront.IsVisible)
            {
                //Front
                meshData.AddVertex(new Vector3(pos.x + settings.voxelSize.x, pos.y, pos.z + settings.voxelSize.z));
                meshData.AddVertex(new Vector3(pos.x + settings.voxelSize.x, pos.y + settings.voxelSize.y, pos.z + settings.voxelSize.z));
                meshData.AddVertex(new Vector3(pos.x, pos.y + settings.voxelSize.y, pos.z + settings.voxelSize.z));
                meshData.AddVertex(new Vector3(pos.x, pos.y, pos.z + settings.voxelSize.z));

                meshData.AddQuadTriangles();
                SetUVsVoxel(voxel, meshData.uv);
            }

            VoxelData voxelBack = voxelMesh.GetVoxel(posInt.x, posInt.y, posInt.z - 1);

            if (voxelBack == null || !voxelBack.IsVisible)
            {
                //Back
                meshData.AddVertex(new Vector3(pos.x, pos.y, pos.z));
                meshData.AddVertex(new Vector3(pos.x, pos.y + settings.voxelSize.y, pos.z));
                meshData.AddVertex(new Vector3(pos.x + settings.voxelSize.x, pos.y + settings.voxelSize.y, pos.z));
                meshData.AddVertex(new Vector3(pos.x + settings.voxelSize.x, pos.y, pos.z));

                meshData.AddQuadTriangles();
                SetUVsVoxel(voxel, meshData.uv);
            }

            VoxelData voxelRight = voxelMesh.GetVoxel(posInt.x + 1, posInt.y, posInt.z);

            if (voxelRight == null || !voxelRight.IsVisible)
            {
                //Right
                meshData.AddVertex(new Vector3(pos.x + settings.voxelSize.x, pos.y, pos.z));
                meshData.AddVertex(new Vector3(pos.x + settings.voxelSize.x, pos.y + settings.voxelSize.y, pos.z));
                meshData.AddVertex(new Vector3(pos.x + settings.voxelSize.x, pos.y + settings.voxelSize.y, pos.z + settings.voxelSize.z));
                meshData.AddVertex(new Vector3(pos.x + settings.voxelSize.x, pos.y, pos.z + settings.voxelSize.z));

                meshData.AddQuadTriangles();
                SetUVsVoxel(voxel, meshData.uv);
            }

            VoxelData voxelLeft = voxelMesh.GetVoxel(posInt.x - 1, posInt.y, posInt.z);

            if (voxelLeft == null || !voxelLeft.IsVisible)
            {
                //Left
                meshData.AddVertex(new Vector3(pos.x, pos.y, pos.z + settings.voxelSize.z));
                meshData.AddVertex(new Vector3(pos.x, pos.y + settings.voxelSize.y, pos.z + settings.voxelSize.z));
                meshData.AddVertex(new Vector3(pos.x, pos.y + settings.voxelSize.y, pos.z));
                meshData.AddVertex(new Vector3(pos.x, pos.y, pos.z));

                meshData.AddQuadTriangles();
                SetUVsVoxel(voxel, meshData.uv);
            }
        }