public void InitializeFromChunk(VoxelChunk chunk, DesignationSet DesignationSet, WorldManager World) { DebugHelper.AssertNotNull(chunk); DebugHelper.AssertNotNull(DesignationSet); DebugHelper.AssertNotNull(World); BoxPrimitive bedrockModel = Library.GetVoxelPrimitive("Bedrock"); var sliceStack = new List <RawPrimitive>(); var cache = new Cache(); int maxViewingLevel = World.Renderer.PersistentSettings.MaxViewingLevel; for (var localY = 0; localY < maxViewingLevel - chunk.Origin.Y && localY < VoxelConstants.ChunkSizeY; ++localY) // Todo: Only iterate inside the chunk. { RawPrimitive sliceGeometry = null; lock (chunk.Data.SliceCache) { var cachedSlice = chunk.Data.SliceCache[localY]; if (cachedSlice != null) { cache.Clear(); sliceStack.Add(cachedSlice); if (GameSettings.Default.GrassMotes) { chunk.RebuildMoteLayerIfNull(localY); } continue; } sliceGeometry = new RawPrimitive { Vertices = null, Indexes = null }; chunk.Data.SliceCache[localY] = sliceGeometry; } if (GameSettings.Default.CalculateRamps) { UpdateCornerRamps(World.ChunkManager, chunk, localY); UpdateNeighborEdgeRamps(World.ChunkManager, chunk, localY); } if (GameSettings.Default.GrassMotes) { chunk.RebuildMoteLayer(localY); } DebugHelper.AssertNotNull(sliceGeometry); BuildSliceGeometry(chunk, bedrockModel, cache, localY, sliceGeometry, DesignationSet, World); sliceStack.Add(sliceGeometry); } var combinedGeometry = RawPrimitive.Concat(sliceStack); Vertices = combinedGeometry.Vertices; VertexCount = combinedGeometry.VertexCount; Indexes = combinedGeometry.Indexes.Select(s => (ushort)s).ToArray(); IndexCount = combinedGeometry.IndexCount; }
public void InitializeFromChunk(VoxelChunk chunk) { if (chunk == null) { return; } BoxPrimitive bedrockModel = VoxelLibrary.GetPrimitive("Bedrock"); var sliceStack = new List <RawPrimitive>(); var cache = new Cache(); for (var y = 0; y < chunk.Manager.ChunkData.MaxViewingLevel; ++y) { RawPrimitive sliceGeometry = null; lock (chunk.Data.SliceCache) { var cachedSlice = chunk.Data.SliceCache[y]; if (chunk.Data.VoxelsPresentInSlice[y] == 0) { cache.Clear(); if (cachedSlice != null) { chunk.Data.SliceCache[y] = null; } continue; } if (cachedSlice != null) { cache.Clear(); sliceStack.Add(cachedSlice); if (GameSettings.Default.GrassMotes) { chunk.RebuildMoteLayerIfNull(y); } continue; } sliceGeometry = new RawPrimitive { Vertices = new ExtendedVertex[128], Indexes = new short[128] }; chunk.Data.SliceCache[y] = sliceGeometry; } if (GameSettings.Default.CalculateRamps) { UpdateCornerRamps(chunk, y); UpdateNeighborEdgeRamps(chunk, y); } if (GameSettings.Default.GrassMotes) { chunk.RebuildMoteLayer(y); } BuildSliceGeometry(chunk, bedrockModel, cache, y, sliceGeometry); sliceStack.Add(sliceGeometry); } var combinedGeometry = RawPrimitive.Concat(sliceStack); Vertices = combinedGeometry.Vertices; VertexCount = combinedGeometry.VertexCount; Indexes = combinedGeometry.Indexes.Select(s => (ushort)s).ToArray(); IndexCount = combinedGeometry.IndexCount; chunk.PrimitiveMutex.WaitOne(); chunk.NewPrimitive = this; chunk.NewPrimitiveReceived = true; chunk.PrimitiveMutex.ReleaseMutex(); }