Start trying to get chunk updating to work...
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+2
-7
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user