public void UpdateWaterThread() { EventWaitHandle[] waitHandles = { WaterUpdateEvent, Program.ShutdownEvent }; #if CREATE_CRASH_LOGS try #endif { while (!DwarfGame.ExitGame && !ExitThreads) { EventWaitHandle wh = Datastructures.WaitFor(waitHandles); if (wh == Program.ShutdownEvent) { break; } if (!PauseThreads) { Water.UpdateWater(); } } } #if CREATE_CRASH_LOGS catch (Exception exception) { ProgramData.WriteExceptionLog(exception); } #endif }
public void GenerateThread() { EventWaitHandle[] waitHandles = { NeedsGenerationEvent, Program.ShutdownEvent }; #if CREATE_CRASH_LOGS try #endif { while (!ExitThreads) { EventWaitHandle wh = Datastructures.WaitFor(waitHandles); //GeneratorLock.WaitOne(); if (!PauseThreads && ToGenerate != null && ToGenerate.Count > 0) { Point3 box = ToGenerate[0]; 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); Drawer3D.DrawBox(chunk.GetBoundingBox(), Color.Red, 0.1f); chunk.ShouldRebuild = true; chunk.ShouldRecalculateLighting = true; GeneratedChunks.Enqueue(chunk); } ToGenerate.Remove(box); } //GeneratorLock.ReleaseMutex(); if (wh == Program.ShutdownEvent) { break; } } } #if CREATE_CRASH_LOGS catch (Exception exception) { ProgramData.WriteExceptionLog(exception); } #endif }
public void GenerateThread() { EventWaitHandle[] waitHandles = { NeedsGenerationEvent, Program.ShutdownEvent }; #if CREATE_CRASH_LOGS try #endif { while (!ExitThreads) { EventWaitHandle wh = Datastructures.WaitFor(waitHandles); //GeneratorLock.WaitOne(); if (!PauseThreads && ToGenerate != null && ToGenerate.Count > 0) { System.Threading.Tasks.Parallel.ForEach(ToGenerate, box => { //if (!ChunkData.CheckBounds(box)) //{ Vector3 worldPos = new Vector3( box.X * VoxelConstants.ChunkSizeX, box.Y * VoxelConstants.ChunkSizeY, box.Z * VoxelConstants.ChunkSizeZ); VoxelChunk chunk = ChunkGen.GenerateChunk(worldPos, World); //Drawer3D.DrawBox(chunk.GetBoundingBox(), Color.Red, 0.1f, false); //} }); ToGenerate.Clear(); } //GeneratorLock.ReleaseMutex(); if (wh == Program.ShutdownEvent) { break; } } } #if CREATE_CRASH_LOGS catch (Exception exception) { ProgramData.WriteExceptionLog(exception); } #endif }
public void ServiceThread() { EventWaitHandle[] waitHandles = { NeedsServiceEvent, Program.ShutdownEvent }; while (!DwarfGame.ExitGame && !ExitThreads) { EventWaitHandle wh = Datastructures.WaitFor(waitHandles); if (wh == Program.ShutdownEvent) { break; } Update(); } }
public void UpdateWaterThread() { EventWaitHandle[] waitHandles = { WaterUpdateEvent, Program.ShutdownEvent }; GamePerformance.Instance.RegisterThreadLoopTracker("UpdateWater", GamePerformance.ThreadIdentifier.UpdateWater); #if CREATE_CRASH_LOGS try #endif { while (!DwarfGame.ExitGame && !ExitThreads) { EventWaitHandle wh = Datastructures.WaitFor(waitHandles); GamePerformance.Instance.PreThreadLoop(GamePerformance.ThreadIdentifier.UpdateWater); GamePerformance.Instance.EnterZone("UpdateWater"); if (wh == Program.ShutdownEvent) { break; } if (!PauseThreads) { Water.UpdateWater(); } GamePerformance.Instance.PostThreadLoop(GamePerformance.ThreadIdentifier.UpdateWater); GamePerformance.Instance.ExitZone("UpdateWater"); } } #if CREATE_CRASH_LOGS catch (Exception exception) { ProgramData.WriteExceptionLog(exception); } #endif }
public void RebuildVoxelsThread() { EventWaitHandle[] waitHandles = { NeedsRebuildEvent, Program.ShutdownEvent }; #if CREATE_CRASH_LOGS try #endif { while (!DwarfGame.ExitGame && !ExitThreads) { EventWaitHandle wh = Datastructures.WaitFor(waitHandles); if (wh == Program.ShutdownEvent) { break; } { if (PauseThreads) { continue; } Dictionary <Point3, VoxelChunk> toRebuild = new Dictionary <Point3, VoxelChunk>(); bool calculateRamps = GameSettings.Default.CalculateRamps; lock (RebuildList) { while (RebuildList.Count > 0) { VoxelChunk chunk = null; if (!RebuildList.TryDequeue(out chunk)) { continue; } if (chunk == null) { continue; } toRebuild[chunk.ID] = chunk; if (PauseThreads) { break; } } } if (calculateRamps) { foreach (VoxelChunk chunk in toRebuild.Select(chunkPair => chunkPair.Value)) { chunk.UpdateRamps(); } } foreach ( VoxelChunk chunk in toRebuild.Select(chunkPair => chunkPair.Value) .Where(chunk => chunk.ShouldRecalculateLighting)) { chunk.CalculateGlobalLight(); } foreach (VoxelChunk chunk in toRebuild.Select(chunkPair => chunkPair.Value)) { if (chunk.RebuildPending && chunk.ShouldRebuild) { if (chunk.ShouldRecalculateLighting) { chunk.CalculateVertexLighting(); } chunk.Rebuild(Graphics); chunk.ShouldRebuild = false; chunk.RebuildPending = false; chunk.ShouldRecalculateLighting = false; } else { chunk.RebuildPending = false; } } } } } #if CREATE_CRASH_LOGS catch (Exception exception) { ProgramData.WriteExceptionLog(exception); throw; } #endif }
public void RebuildLiquidsThread() { EventWaitHandle[] waitHandles = { NeedsLiquidEvent, Program.ShutdownEvent }; #if CREATE_CRASH_LOGS try #endif { bool shouldExit = false; while (!shouldExit && !DwarfGame.ExitGame && !ExitThreads) { EventWaitHandle wh = Datastructures.WaitFor(waitHandles); if (wh == Program.ShutdownEvent) { break; } while (!PauseThreads && RebuildLiquidsList.Count > 0) { VoxelChunk chunk = null; //LiquidLock.WaitOne(); if (!RebuildLiquidsList.TryDequeue(out chunk)) { //LiquidLock.ReleaseMutex(); break; } //LiquidLock.ReleaseMutex(); if (chunk == null) { continue; } try { chunk.RebuildLiquids(Graphics); chunk.RebuildLiquidPending = false; chunk.ShouldRebuildWater = false; } catch (Exception e) { Console.Error.WriteLine(e.Message); shouldExit = true; break; } } } } #if CREATE_CRASH_LOGS catch (Exception exception) { ProgramData.WriteExceptionLog(exception); } #endif }