private static int GetVoxelVertexExploredNeighbors(VoxelHandle V, Geo.TemplateFace Face, SliceCache Cache) { var exploredVerts = 0; if (V.IsExplored) { exploredVerts = 4; } else { for (int faceVertex = 0; faceVertex < Face.Mesh.VertexCount; ++faceVertex) { var cacheKey = SliceCache.GetCacheKey(V, Face.Mesh.Verticies[faceVertex].LogicalVertex); var anyNeighborExplored = true; if (!Cache.ExploredCache.TryGetValue(cacheKey, out anyNeighborExplored)) { anyNeighborExplored = VoxelHelpers.EnumerateVertexNeighbors2D(V.Coordinate, Face.Mesh.Verticies[faceVertex].LogicalVertex) .Select(c => new VoxelHandle(V.Chunk.Manager, c)) .Any(n => n.IsValid && n.IsExplored); Cache.ExploredCache.Add(cacheKey, anyNeighborExplored); } if (anyNeighborExplored) { exploredVerts += 1; } } } return(exploredVerts); }
public static VertexColorInfo CalculateVertexLight(VoxelHandle Vox, VoxelVertex Vertex, ChunkManager Chunks, SliceCache Cache) { var r = new VertexColorInfo(); var cacheKey = SliceCache.GetCacheKey(Vox, Vertex); if (!Cache.LightCache.TryGetValue(cacheKey, out r)) { r = CalculateVertexLight(Vox, Vertex, Chunks); Cache.LightCache.Add(cacheKey, r); } return(r); }
private static void PrepVerticies( WorldManager World, VoxelHandle Voxel, Geo.TemplateFace Face, SliceCache Cache, int ExploredVertexCount, TerrainTileSheet TileSheet, Point Tile, bool ApplyLighting, float explodeOffset) { for (var vertex = 0; vertex < Face.Mesh.VertexCount; ++vertex) // Blows up if face has more than 4 verticies. { var lighting = new VertexLighting.VertexColorInfo { AmbientColor = 255, DynamicColor = 255, SunColor = 255 }; if (ApplyLighting) { lighting = VertexLighting.CalculateVertexLight(Voxel, Face.Mesh.Verticies[vertex].LogicalVertex, World.ChunkManager, Cache); } var slopeOffset = Vector3.Zero; if (Face.Mesh.Verticies[vertex].ApplySlope && ShouldSlope(Face.Mesh.Verticies[vertex].LogicalVertex, Voxel)) { slopeOffset = new Vector3(0.0f, -0.5f, 0.0f); } var voxelPosition = Face.Mesh.Verticies[vertex].Position + slopeOffset + Voxel.WorldPosition; voxelPosition += VertexNoise.GetNoiseVectorFromRepeatingTexture(voxelPosition); voxelPosition += explodeOffset * OrientationHelper.GetFaceNeighborOffset(Face.Orientation).AsVector3(); if (ExploredVertexCount == 0) { Cache.FaceGeometry[vertex] = new ExtendedVertex { Position = voxelPosition, TextureCoordinate = TileSheet.MapTileUVs(Face.Mesh.Verticies[vertex].TextureCoordinate, BlackTile), TextureBounds = TileSheet.GetTileBounds(BlackTile), VertColor = new Color(0.0f, 0.0f, 0.0f, 1.0f), Color = new Color(0.0f, 0.0f, 0.0f, 1.0f) }; } else { var anyNeighborExplored = true; if (!Cache.ExploredCache.TryGetValue(SliceCache.GetCacheKey(Voxel, Face.Mesh.Verticies[vertex].LogicalVertex), out anyNeighborExplored)) { anyNeighborExplored = true; } Cache.FaceGeometry[vertex] = new ExtendedVertex { Position = voxelPosition, TextureCoordinate = TileSheet.MapTileUVs(Face.Mesh.Verticies[vertex].TextureCoordinate, Tile), TextureBounds = TileSheet.GetTileBounds(Tile), VertColor = anyNeighborExplored ? new Color(1.0f, 1.0f, 1.0f, 1.0f) : new Color(0.0f, 0.0f, 0.0f, 1.0f), Color = lighting.AsColor() }; } } }