private void AppendBlockRenderData(BlockDataManager buffer, int x, int y, int z) { Coord coord = new Coord(x, y, z); var color = GetBlockColor(coord); if (color == 0) { return; } for (int face = 0; face < 6; ++face) { var faceDir = new Coord.Direction1(face); if (!IsNormalCubeBeside(coord, faceDir)) { buffer.AppendRenderData(new BlockRenderData { pos = Translation + coord.ToVector4(1.0f) + faceDir.coord.ToVector4(0) * 0.5f, col = GetColorFromInt(color), dir_u = 0.5f * faceDir.U().coord.ToVector4(0), dir_v = 0.5f * faceDir.V().coord.ToVector4(0), aooffset = GetAOOffset(coord, face), lightness = GetLightnessVec(coord, face), }); } } }
private float GetLightnessForVertex(Coord coord, int face, int index) { Coord.Direction2 vertex = new Coord.Direction1(face).UVPN(index); return(MakeLightnessForVertex(face, GetLightnessOnFace(coord, face), GetLightnessOnFace(coord.WithOffset(vertex.Devide(0).coord), face), GetLightnessOnFace(coord.WithOffset(vertex.Devide(1).coord), face), GetLightnessOnFace(coord.WithOffset(vertex.coord), face) )); }
private Vector4 GetAOOffset(Coord coord, int face) { Coord.Direction1 dir = new Coord.Direction1(face); var offsetCoord = coord.WithOffset(dir.coord); return(AmbientOcculsionTexture.MakeAOOffset( MakeAOInner(offsetCoord, dir.UVPN(0)), MakeAOInner(offsetCoord, dir.UVPN(1)), MakeAOInner(offsetCoord, dir.UVPN(2)), MakeAOInner(offsetCoord, dir.UVPN(3)))); }
private bool IsNormalCubeBeside(Coord coord, Coord.Direction1 offset) { return(AnyBlockAt(coord.WithOffset(offset.coord))); }