From 4d0944139969ecd33cf4d4e572fc4818e08eb1d6 Mon Sep 17 00:00:00 2001 From: TomTheFurry Date: Tue, 13 Sep 2022 12:17:37 +0800 Subject: [PATCH] Start trying to get chunk updating to work... --- .../lod/core/api/internal/ClientApi.java | 7 ++++- .../lod/core/api/internal/ServerApi.java | 16 +++++++--- ...LodBuilder.java => ChunkToLodBuilder.java} | 9 ++---- .../core/file/renderfile/RenderMetaFile.java | 3 +- .../seibel/lod/core/level/DhClientLevel.java | 8 ++++- .../lod/core/level/DhClientServerLevel.java | 30 +++++++++++++++++-- .../seibel/lod/core/level/DhServerLevel.java | 8 ++++- .../com/seibel/lod/core/level/ILevel.java | 4 ++- 8 files changed, 66 insertions(+), 19 deletions(-) rename core/src/main/java/com/seibel/lod/core/datatype/transform/{LodBuilder.java => ChunkToLodBuilder.java} (96%) diff --git a/core/src/main/java/com/seibel/lod/core/api/internal/ClientApi.java b/core/src/main/java/com/seibel/lod/core/api/internal/ClientApi.java index 290a17a24..8c8a4d86d 100644 --- a/core/src/main/java/com/seibel/lod/core/api/internal/ClientApi.java +++ b/core/src/main/java/com/seibel/lod/core/api/internal/ClientApi.java @@ -26,6 +26,7 @@ import com.seibel.lod.core.ModInfo; import com.seibel.lod.api.items.enums.rendering.EDebugMode; import com.seibel.lod.api.items.enums.rendering.ERendererMode; import com.seibel.lod.core.dependencyInjection.SingletonInjector; +import com.seibel.lod.core.level.ILevel; import com.seibel.lod.core.logging.ConfigBasedLogger; import com.seibel.lod.core.logging.ConfigBasedSpamLogger; import com.seibel.lod.core.logging.SpamReducedLogger; @@ -137,7 +138,11 @@ public class ClientApi { if (SharedApi.getEnvironment() == WorldEnvironment.Client_Only) { - //TODO: Implement + ILevel dhLevel = SharedApi.currentWorld.getLevel(level); + if (dhLevel != null) + { + dhLevel.updateChunk(chunk); + } } } diff --git a/core/src/main/java/com/seibel/lod/core/api/internal/ServerApi.java b/core/src/main/java/com/seibel/lod/core/api/internal/ServerApi.java index 6d50c8c03..4454ad42f 100644 --- a/core/src/main/java/com/seibel/lod/core/api/internal/ServerApi.java +++ b/core/src/main/java/com/seibel/lod/core/api/internal/ServerApi.java @@ -124,10 +124,18 @@ public class ServerApi } } - public void serverChunkLoadEvent(IChunkWrapper chunk, ILevelWrapper world) { - //TODO + public void serverChunkLoadEvent(IChunkWrapper chunk, ILevelWrapper level) { + ILevel dhLevel = SharedApi.currentWorld.getLevel(level); + if (dhLevel != null) + { + dhLevel.updateChunk(chunk); + } } - public void serverChunkSaveEvent(IChunkWrapper chunk, ILevelWrapper world) { - //TODO + public void serverChunkSaveEvent(IChunkWrapper chunk, ILevelWrapper level) { + ILevel dhLevel = SharedApi.currentWorld.getLevel(level); + if (dhLevel != null) + { + dhLevel.updateChunk(chunk); + } } } diff --git a/core/src/main/java/com/seibel/lod/core/datatype/transform/LodBuilder.java b/core/src/main/java/com/seibel/lod/core/datatype/transform/ChunkToLodBuilder.java similarity index 96% rename from core/src/main/java/com/seibel/lod/core/datatype/transform/LodBuilder.java rename to core/src/main/java/com/seibel/lod/core/datatype/transform/ChunkToLodBuilder.java index c9422b7e1..5c0c0822c 100644 --- a/core/src/main/java/com/seibel/lod/core/datatype/transform/LodBuilder.java +++ b/core/src/main/java/com/seibel/lod/core/datatype/transform/ChunkToLodBuilder.java @@ -13,7 +13,7 @@ import com.seibel.lod.core.wrapperInterfaces.chunk.IChunkWrapper; import org.apache.logging.log4j.LogManager; //FIXME: To-Be-Used class -public class LodBuilder { +public class ChunkToLodBuilder { public static final ConfigBasedLogger LOGGER = new ConfigBasedLogger(LogManager.getLogger(), () -> Config.Client.Advanced.Debugging.DebugSwitch.logLodBuilderEvent.get()); static class Task { @@ -26,14 +26,9 @@ public class LodBuilder { } private final ConcurrentHashMap latestChunkToBuild = new ConcurrentHashMap<>(); private final ConcurrentLinkedDeque taskToBuild = new ConcurrentLinkedDeque<>(); - private final ExecutorService executor = LodUtil.makeSingleThreadPool(LodBuilder.class); + private final ExecutorService executor = LodUtil.makeSingleThreadPool(ChunkToLodBuilder.class); private final EventLoop ticker = new EventLoop(executor, this::_tick); - ILevel level; - public LodBuilder(ILevel level) { - this.level = level; - } - public CompletableFuture tryGenerateData(IChunkWrapper chunk) { if (chunk == null) throw new NullPointerException("ChunkWrapper cannot be null!"); IChunkWrapper oldChunk = latestChunkToBuild.put(chunk.getChunkPos(), chunk); // an Exchange operation diff --git a/core/src/main/java/com/seibel/lod/core/file/renderfile/RenderMetaFile.java b/core/src/main/java/com/seibel/lod/core/file/renderfile/RenderMetaFile.java index 3ec4eaf42..fb5c85c16 100644 --- a/core/src/main/java/com/seibel/lod/core/file/renderfile/RenderMetaFile.java +++ b/core/src/main/java/com/seibel/lod/core/file/renderfile/RenderMetaFile.java @@ -43,7 +43,7 @@ public class RenderMetaFile extends MetaFile CompletableFuture source = _readCached(data.get()); if (source == null) return; - if (source.isDone()) source.join().fastWrite(chunkData, level); + source.thenAccept((renderSource) -> renderSource.fastWrite(chunkData, level)); } public CompletableFuture flushAndSave(ExecutorService renderCacheThread) { @@ -205,7 +205,6 @@ public class RenderMetaFile extends MetaFile } public void save(LodRenderSource data, IClientLevel level) { - LodUtil.assertTrue(data == _readCached(this.data.get()).getNow(null)); LOGGER.info("Saving updated render file v[{}] at sect {}", metaData.dataVersion.get(), pos); try { super.writeData((out) -> data.saveRender(level, this, out)); diff --git a/core/src/main/java/com/seibel/lod/core/level/DhClientLevel.java b/core/src/main/java/com/seibel/lod/core/level/DhClientLevel.java index 3dcb3cf46..200a12f55 100644 --- a/core/src/main/java/com/seibel/lod/core/level/DhClientLevel.java +++ b/core/src/main/java/com/seibel/lod/core/level/DhClientLevel.java @@ -14,6 +14,7 @@ import com.seibel.lod.core.pos.DhBlockPos; import com.seibel.lod.core.util.math.Mat4f; import com.seibel.lod.core.render.renderer.LodRenderer; import com.seibel.lod.core.wrapperInterfaces.block.IBlockStateWrapper; +import com.seibel.lod.core.wrapperInterfaces.chunk.IChunkWrapper; import com.seibel.lod.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper; import com.seibel.lod.core.wrapperInterfaces.minecraft.IProfilerWrapper; import com.seibel.lod.core.wrapperInterfaces.world.IBiomeWrapper; @@ -88,7 +89,12 @@ public class DhClientLevel implements IClientLevel { { return this.level; } - + + @Override + public void updateChunk(IChunkWrapper chunk) { + //TODO + } + @Override public int getMinY() { return level.getMinHeight(); diff --git a/core/src/main/java/com/seibel/lod/core/level/DhClientServerLevel.java b/core/src/main/java/com/seibel/lod/core/level/DhClientServerLevel.java index 9a435600e..799e98b9a 100644 --- a/core/src/main/java/com/seibel/lod/core/level/DhClientServerLevel.java +++ b/core/src/main/java/com/seibel/lod/core/level/DhClientServerLevel.java @@ -1,6 +1,11 @@ package com.seibel.lod.core.level; +import com.seibel.lod.core.datatype.full.ChunkSizedData; +import com.seibel.lod.core.datatype.full.FullDataSource; +import com.seibel.lod.core.datatype.transform.ChunkToLodBuilder; import com.seibel.lod.core.generation.GenerationQueue; +import com.seibel.lod.core.pos.DhLodPos; +import com.seibel.lod.core.pos.DhSectionPos; import com.seibel.lod.core.render.LodQuadTree; import com.seibel.lod.core.file.datafile.GeneratedDataFileHandler; import com.seibel.lod.core.util.FileScanUtil; @@ -18,6 +23,7 @@ import com.seibel.lod.core.util.math.Mat4f; import com.seibel.lod.core.render.renderer.LodRenderer; import com.seibel.lod.core.util.LodUtil; import com.seibel.lod.core.wrapperInterfaces.block.IBlockStateWrapper; +import com.seibel.lod.core.wrapperInterfaces.chunk.IChunkWrapper; import com.seibel.lod.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper; import com.seibel.lod.core.wrapperInterfaces.minecraft.IProfilerWrapper; import com.seibel.lod.core.wrapperInterfaces.world.IBiomeWrapper; @@ -35,6 +41,7 @@ public class DhClientServerLevel implements IClientLevel, IServerLevel { private static final IMinecraftClientWrapper MC_CLIENT = SingletonInjector.INSTANCE.get(IMinecraftClientWrapper.class); public final LocalSaveStructure save; public final GeneratedDataFileHandler dataFileHandler; + public final ChunkToLodBuilder chunkToLodBuilder; public volatile GenerationQueue generationQueue = null; public RenderFileHandler renderFileHandler = null; public RenderBufferHandler renderBufferHandler = null; //TODO: Should this be owned by renderer? @@ -56,6 +63,7 @@ public class DhClientServerLevel implements IClientLevel, IServerLevel { FileScanUtil.scanFile(save, serverLevel, dataFileHandler, null); LOGGER.info("Started DHLevel for {} with saves at {}", level, save); f3Msg = new F3Screen.NestedMessage(this::f3Log); + chunkToLodBuilder = new ChunkToLodBuilder(); } private String[] f3Log() { @@ -94,9 +102,19 @@ public class DhClientServerLevel implements IClientLevel, IServerLevel { } } + private void saveWrites(ChunkSizedData data) { + RenderFileHandler renderFileHandler = this.renderFileHandler; + DhLodPos pos = data.getBBoxLodPos().convertUpwardsTo(FullDataSource.SECTION_SIZE_OFFSET); + if (renderFileHandler != null) { + renderFileHandler.write(new DhSectionPos(pos.detail, pos.x, pos.z), data); + } else { + dataFileHandler.write(new DhSectionPos(pos.detail, pos.x, pos.z), data); + } + } + @Override public void serverTick() { - //TODO Update network packet and stuff or state or etc.. + chunkToLodBuilder.tick(); } public void startRenderer(IClientLevelWrapper clientLevel) { @@ -195,7 +213,15 @@ public class DhClientServerLevel implements IClientLevel, IServerLevel { { return this.serverLevel; } - + + @Override + public void updateChunk(IChunkWrapper chunk) { + CompletableFuture future = chunkToLodBuilder.tryGenerateData(chunk); + if (future != null) { + future.thenAccept(this::saveWrites); + } + } + @Override public void dumpRamUsage() { //TODO diff --git a/core/src/main/java/com/seibel/lod/core/level/DhServerLevel.java b/core/src/main/java/com/seibel/lod/core/level/DhServerLevel.java index 2ea33237a..427bede9c 100644 --- a/core/src/main/java/com/seibel/lod/core/level/DhServerLevel.java +++ b/core/src/main/java/com/seibel/lod/core/level/DhServerLevel.java @@ -4,6 +4,7 @@ import com.seibel.lod.core.util.FileScanUtil; import com.seibel.lod.core.file.datafile.DataFileHandler; import com.seibel.lod.core.file.structure.LocalSaveStructure; import com.seibel.lod.core.logging.DhLoggerBuilder; +import com.seibel.lod.core.wrapperInterfaces.chunk.IChunkWrapper; import com.seibel.lod.core.wrapperInterfaces.world.ILevelWrapper; import com.seibel.lod.core.wrapperInterfaces.world.IServerLevelWrapper; import org.apache.logging.log4j.Logger; @@ -65,5 +66,10 @@ public class DhServerLevel implements IServerLevel { return this.level; } - + + @Override + public void updateChunk(IChunkWrapper chunk) { + //TODO + } + } diff --git a/core/src/main/java/com/seibel/lod/core/level/ILevel.java b/core/src/main/java/com/seibel/lod/core/level/ILevel.java index cbe5b5f38..0a0483fb0 100644 --- a/core/src/main/java/com/seibel/lod/core/level/ILevel.java +++ b/core/src/main/java/com/seibel/lod/core/level/ILevel.java @@ -1,5 +1,6 @@ package com.seibel.lod.core.level; +import com.seibel.lod.core.wrapperInterfaces.chunk.IChunkWrapper; import com.seibel.lod.core.wrapperInterfaces.world.ILevelWrapper; import java.util.concurrent.CompletableFuture; @@ -13,5 +14,6 @@ public interface ILevel extends AutoCloseable /** May return either a client or server level wrapper. */ ILevelWrapper getLevelWrapper(); - + + void updateChunk(IChunkWrapper chunk); }