public void CreateGraphics(ref string message, ChunkData chunkData) { message = "Creating Graphics"; List <VoxelChunk> toRebuild = new List <VoxelChunk>(); while (RebuildList.Count > 0) { VoxelChunk chunk = null; if (!RebuildList.TryDequeue(out chunk)) { break; } if (chunk == null) { continue; } toRebuild.Add(chunk); } message = "Creating Graphics : Updating Ramps"; foreach (VoxelChunk chunk in toRebuild.Where(chunk => GameSettings.Default.CalculateRamps)) { chunk.UpdateRamps(); } message = "Creating Graphics : Calculating lighting "; int j = 0; foreach (VoxelChunk chunk in toRebuild) { j++; message = "Creating Graphics : Calculating lighting " + j + "/" + toRebuild.Count; if (chunk.ShouldRecalculateLighting) { chunk.CalculateGlobalLight(); chunk.ShouldRecalculateLighting = false; } } j = 0; foreach (VoxelChunk chunk in toRebuild) { j++; message = "Creating Graphics : Calculating vertex light " + j + "/" + toRebuild.Count; chunk.CalculateVertexLighting(); } message = "Creating Graphics: Building Vertices"; j = 0; foreach (VoxelChunk chunk in toRebuild) { j++; message = "Creating Graphics : Building Vertices " + j + "/" + toRebuild.Count; if (!chunk.ShouldRebuild) { continue; } chunk.Rebuild(Graphics); chunk.ShouldRebuild = false; chunk.RebuildPending = false; chunk.RebuildLiquidPending = false; } chunkData.RecomputeNeighbors(); message = "Cleaning Up."; }
public void CreateGraphics(ref string message, ChunkData chunkData) { message = "Creating Graphics"; List<VoxelChunk> toRebuild = new List<VoxelChunk>(); while(RebuildList.Count > 0) { VoxelChunk chunk = null; if(!RebuildList.TryDequeue(out chunk)) { break; } if(chunk == null) { continue; } toRebuild.Add(chunk); } message = "Creating Graphics : Updating Max Viewing Level"; foreach(VoxelChunk chunk in toRebuild) { chunk.UpdateMaxViewingLevel(); } message = "Creating Graphics : Updating Ramps"; foreach(VoxelChunk chunk in toRebuild.Where(chunk => GameSettings.Default.CalculateRamps)) { chunk.UpdateRamps(); } message = "Creating Graphics : Calculating lighting "; int j = 0; foreach(VoxelChunk chunk in toRebuild) { j++; message = "Creating Graphics : Calculating lighting " + j + "/" + toRebuild.Count; if(chunk.ShouldRecalculateLighting) { chunk.CalculateGlobalLight(); chunk.ShouldRecalculateLighting = false; } } j = 0; foreach(VoxelChunk chunk in toRebuild) { j++; message = "Creating Graphics : Calculating vertex light " + j + "/" + toRebuild.Count; chunk.CalculateVertexLighting(); } message = "Creating Graphics: Building Vertices"; j = 0; foreach(VoxelChunk chunk in toRebuild) { j++; message = "Creating Graphics : Building Vertices " + j + "/" + toRebuild.Count; if(!chunk.ShouldRebuild) { continue; } chunk.Rebuild(Graphics); chunk.ShouldRebuild = false; chunk.RebuildPending = false; chunk.RebuildLiquidPending = false; } chunkData.RecomputeNeighbors(); message = "Cleaning Up."; }
public void Update(DwarfTime gameTime, Camera camera, GraphicsDevice g) { UpdateRenderList(camera); if (waterUpdateTimer.Update(gameTime)) { WaterUpdateEvent.Set(); } UpdateRebuildList(); generateChunksTimer.Update(gameTime); if (generateChunksTimer.HasTriggered) { if (ToGenerate.Count > 0) { NeedsGenerationEvent.Set(); ChunkData.RecomputeNeighbors(); } foreach (VoxelChunk chunk in GeneratedChunks) { if (!ChunkData.ChunkMap.ContainsKey(chunk.ID)) { ChunkData.AddChunk(chunk); ChunkGen.GenerateVegetation(chunk, Components, Content, Graphics); ChunkGen.GenerateFauna(chunk, Components, Content, Graphics, PlayState.ComponentManager.Factions); List <VoxelChunk> adjacents = ChunkData.GetAdjacentChunks(chunk); foreach (VoxelChunk c in adjacents) { c.ShouldRecalculateLighting = true; c.ShouldRebuild = true; } RecalculateBounds(); } } while (GeneratedChunks.Count > 0) { VoxelChunk gen = null; if (!GeneratedChunks.TryDequeue(out gen)) { break; } } } visibilityChunksTimer.Update(gameTime); if (visibilityChunksTimer.HasTriggered) { visibleSet.Clear(); GetChunksIntersecting(camera.GetFrustrum(), visibleSet); //RemoveDistantBlocks(camera); } foreach (VoxelChunk chunk in ChunkData.ChunkMap.Values) { chunk.Update(gameTime); } Water.Splash(gameTime); Water.HandleTransfers(gameTime); HashSet <VoxelChunk> affectedChunks = new HashSet <VoxelChunk>(); foreach (Voxel voxel in KilledVoxels) { affectedChunks.Add(voxel.Chunk); voxel.Chunk.NotifyDestroyed(new Point3(voxel.GridPosition)); if (!voxel.IsInterior) { foreach (KeyValuePair <Point3, VoxelChunk> n in voxel.Chunk.Neighbors) { affectedChunks.Add(n.Value); } } } if (GameSettings.Default.FogofWar) { ChunkData.Reveal(KilledVoxels); } lock (RebuildList) { foreach (VoxelChunk affected in affectedChunks) { affected.NotifyTotalRebuild(false); } } KilledVoxels.Clear(); }
public void GenerateInitialChunks(Point3 origin, Action <String> SetLoadingMessage) { float origBuildRadius = GenerateDistance; GenerateDistance = origBuildRadius * 2.0f; int i = 0; int iters = WorldSize.X * WorldSize.Y * WorldSize.Z; for (int dx = origin.X - WorldSize.X / 2 + 1; dx < origin.X + WorldSize.X / 2; dx++) { for (int dy = origin.Y - WorldSize.Y / 2; dy <= origin.Y + WorldSize.Y / 2; dy++) { for (int dz = origin.Z - WorldSize.Z / 2 + 1; dz < origin.Z + WorldSize.Z / 2; dz++) { SetLoadingMessage("Generating : " + (i + 1) + "/" + iters); i++; Point3 box = new Point3(dx, dy, dz); if (!ChunkData.ChunkMap.ContainsKey(box)) { Vector3 worldPos = new Vector3(box.X * ChunkData.ChunkSizeX, box.Y * ChunkData.ChunkSizeY, box.Z * ChunkData.ChunkSizeZ); VoxelChunk chunk = ChunkGen.GenerateChunk(worldPos, (int)ChunkData.ChunkSizeX, (int)ChunkData.ChunkSizeY, (int)ChunkData.ChunkSizeZ, Components, Content, Graphics); chunk.ShouldRebuild = true; chunk.ShouldRecalculateLighting = true; chunk.IsVisible = true; chunk.ResetSunlight(0); GeneratedChunks.Enqueue(chunk); foreach (VoxelChunk chunk2 in GeneratedChunks) { if (!ChunkData.ChunkMap.ContainsKey(chunk2.ID)) { ChunkData.AddChunk(chunk2); RecalculateBounds(); } } } } } } RecalculateBounds(); chunkData.RecomputeNeighbors(); SetLoadingMessage("Generating Ores..."); GenerateOres(); SetLoadingMessage("Fog of war..."); // We are going to force fog of war to be on for the first reveal then reset it back to it's previous setting after. // This is a pseudo hack to stop worlds created with Fog of War off then looking awful if it is turned back on. bool fogOfWar = GameSettings.Default.FogofWar; GameSettings.Default.FogofWar = true; ChunkData.Reveal(GeneratedChunks.First().MakeVoxel(0, (int)ChunkData.ChunkSizeY - 1, 0)); GameSettings.Default.FogofWar = fogOfWar; UpdateRebuildList(); GenerateDistance = origBuildRadius; while (GeneratedChunks.Count > 0) { VoxelChunk gen = null; if (!GeneratedChunks.TryDequeue(out gen)) { break; } } ChunkData.ChunkManager.CreateGraphics(SetLoadingMessage, ChunkData); }