From a3281e6d07a264da98cb55fcefaf84f10cbc04f3 Mon Sep 17 00:00:00 2001 From: Drew DeVault Date: Tue, 24 Nov 2015 18:05:30 -0500 Subject: [PATCH] Do lighting updates on client as blocks change This is broken. --- TrueCraft.Client/Events/ChunkEventArgs.cs | 2 ++ TrueCraft.Client/Handlers/ChunkHandlers.cs | 4 +++- TrueCraft.Client/Modules/ChunkModule.cs | 25 +++++++++++++++++++++- TrueCraft.Client/ReadOnlyWorld.cs | 1 + TrueCraft.Core/World/Region.cs | 6 ++++-- TrueCraft.Core/World/World.cs | 4 +++- 6 files changed, 37 insertions(+), 5 deletions(-) diff --git a/TrueCraft.Client/Events/ChunkEventArgs.cs b/TrueCraft.Client/Events/ChunkEventArgs.cs index 30293b7..21bc2f3 100644 --- a/TrueCraft.Client/Events/ChunkEventArgs.cs +++ b/TrueCraft.Client/Events/ChunkEventArgs.cs @@ -1,10 +1,12 @@ using System; +using TrueCraft.API; namespace TrueCraft.Client.Events { public class ChunkEventArgs : EventArgs { public ReadOnlyChunk Chunk { get; set; } + public Coordinates3D Source { get; set; } public ChunkEventArgs(ReadOnlyChunk chunk) { diff --git a/TrueCraft.Client/Handlers/ChunkHandlers.cs b/TrueCraft.Client/Handlers/ChunkHandlers.cs index 16dd9cd..603c0bd 100644 --- a/TrueCraft.Client/Handlers/ChunkHandlers.cs +++ b/TrueCraft.Client/Handlers/ChunkHandlers.cs @@ -28,7 +28,9 @@ namespace TrueCraft.Client.Handlers } chunk.SetBlockID(adjusted, (byte)packet.BlockID); chunk.SetMetadata(adjusted, (byte)packet.Metadata); - client.OnChunkModified(new ChunkEventArgs(new ReadOnlyChunk(chunk))); + var args = new ChunkEventArgs(new ReadOnlyChunk(chunk)); + args.Source = coordinates; + client.OnChunkModified(args); } public static void HandleChunkPreamble(IPacket _packet, MultiplayerClient client) diff --git a/TrueCraft.Client/Modules/ChunkModule.cs b/TrueCraft.Client/Modules/ChunkModule.cs index d4e1a45..fe07d89 100644 --- a/TrueCraft.Client/Modules/ChunkModule.cs +++ b/TrueCraft.Client/Modules/ChunkModule.cs @@ -8,6 +8,9 @@ using System.ComponentModel; using TrueCraft.API; using System.Linq; using System.Threading; +using TrueCraft.Core.Lighting; +using TrueCraft.Client.Events; +using TrueCraft.Core.World; namespace TrueCraft.Client.Modules { @@ -16,6 +19,7 @@ namespace TrueCraft.Client.Modules public TrueCraftGame Game { get; set; } public ChunkRenderer ChunkRenderer { get; set; } public int ChunksRendered { get; set; } + public WorldLighting WorldLighting { get; set; } private HashSet ActiveMeshes { get; set; } private List ChunkMeshes { get; set; } @@ -28,10 +32,12 @@ namespace TrueCraft.Client.Modules { Game = game; + WorldLighting = new WorldLighting(Game.Client.World.World, Game.BlockRepository); + ChunkRenderer = new ChunkRenderer(Game.Client.World, Game, Game.BlockRepository); Game.Client.ChunkLoaded += (sender, e) => ChunkRenderer.Enqueue(e.Chunk); Game.Client.ChunkUnloaded += (sender, e) => UnloadChunk(e.Chunk); - Game.Client.ChunkModified += (sender, e) => ChunkRenderer.Enqueue(e.Chunk, true); + Game.Client.ChunkModified += HandleChunkModified; ChunkRenderer.MeshCompleted += MeshCompleted; ChunkRenderer.Start(); @@ -60,6 +66,23 @@ namespace TrueCraft.Client.Modules IncomingChunks.Add(e.Result); } + void HandleChunkModified(object sender, ChunkEventArgs e) + { + Game.PendingMainThreadActions.Add(() => + { + /*var posA = e.Source; + posA.Y = 0; + var posB = e.Source; + posB.Y = World.Height; + posB.X++; posB.Z++; + WorldLighting.EnqueueOperation(new TrueCraft.API.BoundingBox(posA, posB), true); + WorldLighting.EnqueueOperation(new TrueCraft.API.BoundingBox(posA, posB), false);*/ + //while (WorldLighting.TryLightNext()) { } // flush + WorldLighting.InitialLighting(e.Chunk.Chunk); + ChunkRenderer.Enqueue(e.Chunk, true); + }); + } + void UnloadChunk(ReadOnlyChunk chunk) { Game.Invoke(() => diff --git a/TrueCraft.Client/ReadOnlyWorld.cs b/TrueCraft.Client/ReadOnlyWorld.cs index bd33d2e..9b494c4 100644 --- a/TrueCraft.Client/ReadOnlyWorld.cs +++ b/TrueCraft.Client/ReadOnlyWorld.cs @@ -87,6 +87,7 @@ namespace TrueCraft.Client internal ReadOnlyChunk(IChunk chunk) { Chunk = chunk; + Chunk.TerrainPopulated = true; } public byte GetBlockId(Coordinates3D coordinates) diff --git a/TrueCraft.Core/World/Region.cs b/TrueCraft.Core/World/Region.cs index 1a9b8f7..83bb160 100644 --- a/TrueCraft.Core/World/Region.cs +++ b/TrueCraft.Core/World/Region.cs @@ -134,12 +134,14 @@ namespace TrueCraft.Core.World /// /// Sets the chunk at the specified local position to the given value. /// - public void SetChunk(Coordinates2D position, IChunk chunk) + public bool SetChunk(Coordinates2D position, IChunk chunk) { - if (!Chunks.ContainsKey(position)) + bool isNew = !Chunks.ContainsKey(position); + if (isNew) Chunks.Add(position, chunk); chunk.IsModified = true; Chunks[position] = chunk; + return isNew; } /// diff --git a/TrueCraft.Core/World/World.cs b/TrueCraft.Core/World/World.cs index 5cd6584..2130378 100644 --- a/TrueCraft.Core/World/World.cs +++ b/TrueCraft.Core/World/World.cs @@ -142,7 +142,9 @@ namespace TrueCraft.Core.World lock (region) { chunk.IsModified = true; - region.SetChunk(new Coordinates2D(coordinates.X - regionX * 32, coordinates.Z - regionZ * 32), chunk); + bool isNew = region.SetChunk(new Coordinates2D(coordinates.X - regionX * 32, coordinates.Z - regionZ * 32), chunk); + if (isNew) + OnChunkLoaded(new ChunkLoadedEventArgs(chunk)); } }