public static GeometricPrimitive CreateFromChunk(VoxelChunk Chunk, WorldManager World) { DebugHelper.AssertNotNull(Chunk); DebugHelper.AssertNotNull(World); var sliceStack = new List <RawPrimitive>(); var sliceCache = new SliceCache(); int maxViewingLevel = World.Renderer.PersistentSettings.MaxViewingLevel; var terrainTileSheet = new TerrainTileSheet(512, 512, 32, 32); for (var localY = 0; localY < maxViewingLevel - Chunk.Origin.Y && localY < VoxelConstants.ChunkSizeY; ++localY) { RawPrimitive sliceGeometry = null; sliceCache.ClearSliceCache(); lock (Chunk.Data.SliceCache) { var cachedSlice = Chunk.Data.SliceCache[localY]; if (cachedSlice != null) { sliceStack.Add(cachedSlice); // Todo: Get rid of the raw primitive / geometric primitive bullshit entirely if (GameSettings.Current.GrassMotes) { Chunk.RebuildMoteLayerIfNull(localY); } continue; } sliceGeometry = new RawPrimitive(); Chunk.Data.SliceCache[localY] = sliceGeometry; } if (GameSettings.Current.CalculateRamps) { PrecomputeVoxelSlopesSlice(World.ChunkManager, Chunk, localY); } if (GameSettings.Current.GrassMotes) { Chunk.RebuildMoteLayer(localY); } DebugHelper.AssertNotNull(sliceGeometry); GenerateSliceGeometry(sliceGeometry, Chunk, localY, terrainTileSheet, World, sliceCache); sliceStack.Add(sliceGeometry); } var chunkGeo = RawPrimitive.Concat(sliceStack); var r = new GeometricPrimitive(); r.Vertices = chunkGeo.Vertices; r.VertexCount = chunkGeo.VertexCount; r.Indexes = chunkGeo.Indexes.Select(c => (ushort)c).ToArray(); r.IndexCount = chunkGeo.IndexCount; return(r); }