private BlockTexture GetTexture(BlockFaceField faceDir, BlockType type)
        {
            switch (type)
            {
            case BlockType.Dirt:
                return(BlockTexture.Dirt);

            case BlockType.Grass:
            {
                switch (faceDir)
                {
                case BlockFaceField.YIncreasing:
                    return(BlockTexture.GrassTop);

                case BlockFaceField.YDecreasing:
                    return(BlockTexture.Dirt);

                default:
                    return(BlockTexture.GrassSide);
                }
            }

            case BlockType.Stone:
                return(BlockTexture.Stone);

            default:
                throw new ArgumentException("Unsupported Block Type");
            }
        }
示例#2
0
 public void RemoveFace(Vector3i position, BlockFaceField facing)
 {
     if ((visibleFaceBitField[position.X, position.Y, position.Z] & (byte)facing) > 0)
     {
         visibleFaceBitField[position.X, position.Y, position.Z] ^= (byte)facing;
         visibleFaces--;
         Altered = true;
     }
 }
示例#3
0
 public void AddFace(Vector3i position, BlockFaceField facing)
 {
     if ((visibleFaceBitField[position.X, position.Y, position.Z] & (byte)facing) == 0)
     {
         visibleFaceBitField[position.X, position.Y, position.Z] |= (byte)facing;
         visibleFaces++;
         Altered = true;
     }
 }
        public void ChangeFacing(Vector3i absolutePosition, BlockFaceField facing, bool activate)
        {
            Optional <Region> currentRegion = GetRegionFromAbsolute(absolutePosition);

            Debug.Assert(currentRegion.Valid);

            Vector3i relativePosition = Transformation.AbsoluteToRelative(absolutePosition,
                                                                          currentRegion.Data.RegionOrigin);

            if (activate)
            {
                currentRegion.Data.AddFace(relativePosition, facing);
            }
            else
            {
                currentRegion.Data.RemoveFace(relativePosition, facing);
            }
        }
        private void BuildFace(Vector3i bottomBackLeft, BlockFaceField faceDir, BlockType type)
        {
            if (type == BlockType.Air)
            {
                return;
            }

            BlockTexture faceTexture = GetTexture(faceDir, type);

            Vector2[]  uvMap     = UVMap[faceTexture][faceDir];
            Vector3i[] offsetMap = faceVertexOffsetMap[faceDir];

            Vector3i currentFace;

            for (int k = 0; k < 6; k++)
            {
                if (regionMesh.Length < index + k + 1)
                {
                    break;
                }

                currentFace = (bottomBackLeft + offsetMap[k]);

                if (regionMesh[index + k] == null)
                {
                    regionMesh[index + k] = new VertexPositionTexture(currentFace.ToVector3, uvMap[k]);
                }
                else
                {
                    regionMesh[index + k].Position          = currentFace.ToVector3;
                    regionMesh[index + k].TextureCoordinate = uvMap[k];
                }
            }

            index += 6;
        }