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); } }
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); }
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 }); }