Start trying to get chunk updating to work...

This commit is contained in:
TomTheFurry
2022-09-13 12:17:37 +08:00
parent c80a5b102d
commit 4d09441399
8 changed files with 66 additions and 19 deletions
@@ -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);
}
}
}
@@ -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);
}
}
}
@@ -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<DhChunkPos, IChunkWrapper> latestChunkToBuild = new ConcurrentHashMap<>();
private final ConcurrentLinkedDeque<Task> 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<ChunkSizedData> tryGenerateData(IChunkWrapper chunk) {
if (chunk == null) throw new NullPointerException("ChunkWrapper cannot be null!");
IChunkWrapper oldChunk = latestChunkToBuild.put(chunk.getChunkPos(), chunk); // an Exchange operation
@@ -43,7 +43,7 @@ public class RenderMetaFile extends MetaFile
CompletableFuture<LodRenderSource> 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<Void> 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));
@@ -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();
@@ -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<ChunkSizedData> future = chunkToLodBuilder.tryGenerateData(chunk);
if (future != null) {
future.thenAccept(this::saveWrites);
}
}
@Override
public void dumpRamUsage() {
//TODO
@@ -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
}
}
@@ -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);
}