コード例 #1
0
ファイル: ChunkData.cs プロジェクト: scadiot/DopaVoxel
        private int GetTextureNumber(int blocIndex, BlocSide blockSize)
        {
            switch (getMaterial(blocIndex))
            {
            case BlocMaterial.Stone:
                return(1);

            case BlocMaterial.Sand:
                return(18);

            case BlocMaterial.Foliage:
                return(145);

            case BlocMaterial.Plank:
                return(4);

            case BlocMaterial.FlowerRed:
                return(12);

            case BlocMaterial.Reed:
                return(73);

            case BlocMaterial.FlowerYellow:
                return(13);

            case BlocMaterial.Mushroom:
                return(29);

            case BlocMaterial.TreeSprout:
                return(15);

            case BlocMaterial.Grass:
                return(91);

            case BlocMaterial.Wood:
                if (blockSize == BlocSide.BackY)
                {
                    return(21);
                }
                else
                {
                    return(20);
                }

            case BlocMaterial.Earth:
                if (blockSize == BlocSide.BackY)
                {
                    return(0);
                }
                else
                {
                    return(3);
                }

            default:
                return(0);
            }
        }
コード例 #2
0
ファイル: ChunkFaces.cs プロジェクト: scadiot/DopaVoxel
        private VertexPositionNormalTextureColor[] createFaces(BlocSide side, Point3d position, int textureNumber, Vector3 decal)
        {
            Point3d[] decals = listFacesDecal[(byte)side];
            Vector2[] uvs    = listUvs[(byte)side];
            VertexPositionNormalTextureColor[] vertices = new VertexPositionNormalTextureColor[6];

            float sunLuminosity        = (float)getSunLuminosity(position + FirstBlocAbsolutPosition + SideDecal[(byte)side]) / 15;
            float artificialLuminosity = (float)getArtificialLuminosity(position + FirstBlocAbsolutPosition + SideDecal[(byte)side]) / 15;

            if (!LightComputed)
            {
                sunLuminosity        = 1.0f;
                artificialLuminosity = 1.0f;
            }

            for (int i = 0; i < 6; i++)
            {
                Vector3 p = new Vector3((float)position.X + decals[i].X + decal.X, (float)position.Y + decals[i].Y + decal.Y, (float)position.Z + decals[i].Z + decal.Z);

                float decalX = (float)(textureNumber % 16) * (1.0f / 16.0f);
                float decalY = (float)(textureNumber / 16) * (1.0f / 16.0f);
                var   uv     = new Vector2(((1.0f / 16.0f) * uvs[i].X) + decalX, ((1.0f / 16.0f) * uvs[i].Y) + decalY);

                float vertexSunLuminosity        = sunLuminosity;
                float vertexArtificialLuminosity = artificialLuminosity;
                float occlusionLuminosity        = 1.0f;
                if (true)
                {
                    Point3d[] blocPositionOcclusionList = new Point3d[]
                    {
                        FirstBlocAbsolutPosition + position + listDecalForOcclusion[(byte)side][i, 0],
                        FirstBlocAbsolutPosition + position + listDecalForOcclusion[(byte)side][i, 1],
                        FirstBlocAbsolutPosition + position + listDecalForOcclusion[(byte)side][i, 2]
                    };
                    int mixCount = 1;
                    for (int j = 0; j < 3; j++)
                    {
                        var blocPositionOcclusion = blocPositionOcclusionList[j];
                        if (isOpaque(blocPositionOcclusion))
                        {
                            occlusionLuminosity -= 0.2f;
                        }
                        else if (j < 2 || mixCount > 1)
                        {
                            vertexSunLuminosity        += (float)getSunLuminosity(blocPositionOcclusion) / 15;
                            vertexArtificialLuminosity += (float)getArtificialLuminosity(blocPositionOcclusion) / 15;
                            mixCount++;
                        }
                    }
                    vertexSunLuminosity        = Math.Max(vertexSunLuminosity, 0.0f) / mixCount;
                    vertexArtificialLuminosity = Math.Max(vertexArtificialLuminosity, 0.0f) / mixCount;
                }

                vertices[i] = new VertexPositionNormalTextureColor(p, listNormals[(byte)side], uv, vertexSunLuminosity, vertexArtificialLuminosity, occlusionLuminosity);
            }
            return(vertices);
        }
コード例 #3
0
ファイル: ChunkFaces.cs プロジェクト: scadiot/DopaVoxel
        Point3d NeighborsPositionOnNeighborsChunk(BlocSide side, Point3d position)
        {
            var decal = SideDecalToNeighbors[(int)side];

            return(new Point3d()
            {
                X = decal.X == -1 ? position.X : decal.X,
                Y = decal.Y == -1 ? position.Y : decal.Y,
                Z = decal.Z == -1 ? position.Z : decal.Z
            });
        }