diff --git a/core/src/main/java/com/seibel/distanthorizons/core/file/fullDatafile/GeneratedFullDataFileHandler.java b/core/src/main/java/com/seibel/distanthorizons/core/file/fullDatafile/GeneratedFullDataFileHandler.java index d3c338711..43fb41532 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/file/fullDatafile/GeneratedFullDataFileHandler.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/file/fullDatafile/GeneratedFullDataFileHandler.java @@ -23,7 +23,7 @@ import com.seibel.distanthorizons.api.enums.worldGeneration.EDhApiWorldGeneratio import com.seibel.distanthorizons.core.config.Config; import com.seibel.distanthorizons.core.dataObjects.fullData.sources.FullDataSourceV2; import com.seibel.distanthorizons.core.file.structure.AbstractSaveStructure; -import com.seibel.distanthorizons.core.generation.IWorldGenerationQueue; +import com.seibel.distanthorizons.core.generation.IFullDataSourceRetrievalQueue; import com.seibel.distanthorizons.core.generation.tasks.IWorldGenTaskTracker; import com.seibel.distanthorizons.core.generation.tasks.WorldGenResult; import com.seibel.distanthorizons.core.level.IDhLevel; @@ -50,7 +50,7 @@ public class GeneratedFullDataFileHandler extends FullDataFileHandlerV2 implemen public static final int MAX_WORLD_GEN_REQUESTS_PER_THREAD = 20; - private final AtomicReference worldGenQueueRef = new AtomicReference<>(null); + private final AtomicReference worldGenQueueRef = new AtomicReference<>(null); private final ArrayList onWorldGenTaskCompleteListeners = new ArrayList<>(); protected final DelayedFullDataSourceSaveCache delayedFullDataSourceSaveCache = new DelayedFullDataSourceSaveCache(this::onDataSourceSave, 5_000); @@ -73,7 +73,7 @@ public class GeneratedFullDataFileHandler extends FullDataFileHandlerV2 implemen * Assigns the queue for handling world gen and does first time setup as well.
* Assumes there isn't a pre-existing queue. */ - public void setWorldGenerationQueue(IWorldGenerationQueue newWorldGenQueue) + public void setWorldGenerationQueue(IFullDataSourceRetrievalQueue newWorldGenQueue) { boolean oldQueueExists = this.worldGenQueueRef.compareAndSet(null, newWorldGenQueue); LodUtil.assertTrue(oldQueueExists, "previous world gen queue is still here!"); @@ -87,7 +87,7 @@ public class GeneratedFullDataFileHandler extends FullDataFileHandlerV2 implemen { // TODO there has to be a better way to do this - IWorldGenerationQueue worldGenQueue = this.worldGenQueueRef.get(); + IFullDataSourceRetrievalQueue worldGenQueue = this.worldGenQueueRef.get(); if (worldGenQueue != null) { worldGenQueue.removeGenRequestIf(removeIf); @@ -163,7 +163,7 @@ public class GeneratedFullDataFileHandler extends FullDataFileHandlerV2 implemen @Override public void setTotalRetrievalPositionCount(int newCount) { - IWorldGenerationQueue worldGenQueue = this.worldGenQueueRef.get(); + IFullDataSourceRetrievalQueue worldGenQueue = this.worldGenQueueRef.get(); if (worldGenQueue != null) { worldGenQueue.setEstimatedTotalTaskCount(newCount); @@ -179,7 +179,7 @@ public class GeneratedFullDataFileHandler extends FullDataFileHandlerV2 implemen } - IWorldGenerationQueue worldGenQueue = this.worldGenQueueRef.get(); + IFullDataSourceRetrievalQueue worldGenQueue = this.worldGenQueueRef.get(); if (worldGenQueue == null) { // we can't queue anything if the world generator isn't set up yet @@ -203,7 +203,7 @@ public class GeneratedFullDataFileHandler extends FullDataFileHandlerV2 implemen @Override public boolean queuePositionForRetrieval(DhSectionPos genPos) { - IWorldGenerationQueue worldGenQueue = this.worldGenQueueRef.get(); + IFullDataSourceRetrievalQueue worldGenQueue = this.worldGenQueueRef.get(); if (worldGenQueue == null) { return false; @@ -219,7 +219,7 @@ public class GeneratedFullDataFileHandler extends FullDataFileHandlerV2 implemen @Override public ArrayList getPositionsToRetrieve(DhSectionPos pos) { - IWorldGenerationQueue worldGenQueue = this.worldGenQueueRef.get(); + IFullDataSourceRetrievalQueue worldGenQueue = this.worldGenQueueRef.get(); if (worldGenQueue == null) { return null; @@ -288,7 +288,7 @@ public class GeneratedFullDataFileHandler extends FullDataFileHandlerV2 implemen @Override public int getMaxPossibleRetrievalPositionCountForPos(DhSectionPos pos) { - IWorldGenerationQueue worldGenQueue = this.worldGenQueueRef.get(); + IFullDataSourceRetrievalQueue worldGenQueue = this.worldGenQueueRef.get(); if (worldGenQueue == null) { return -1; diff --git a/core/src/main/java/com/seibel/distanthorizons/core/generation/IWorldGenerationQueue.java b/core/src/main/java/com/seibel/distanthorizons/core/generation/IFullDataSourceRetrievalQueue.java similarity index 58% rename from core/src/main/java/com/seibel/distanthorizons/core/generation/IWorldGenerationQueue.java rename to core/src/main/java/com/seibel/distanthorizons/core/generation/IFullDataSourceRetrievalQueue.java index a7a834929..5bf47abd8 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/generation/IWorldGenerationQueue.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/generation/IFullDataSourceRetrievalQueue.java @@ -23,24 +23,80 @@ import com.seibel.distanthorizons.core.generation.tasks.IWorldGenTaskTracker; import com.seibel.distanthorizons.core.generation.tasks.WorldGenResult; import com.seibel.distanthorizons.core.pos.DhBlockPos2D; import com.seibel.distanthorizons.core.pos.DhSectionPos; +import com.seibel.distanthorizons.core.render.LodQuadTree; import java.io.Closeable; import java.util.concurrent.CompletableFuture; import java.util.function.Function; -// TODO This doesn't need an interface, remove the interface -@Deprecated -public interface IWorldGenerationQueue extends Closeable +/** + * Used to track what full data sources the system currently + * wants but doesn't have.
+ * IE, what sections should be generated via the world generator.

+ * + * Note:
+ * This won't contain every position that needs to be retrieved + * (due to causing issues at extreme render distances). + * TODO does that mean this object isn't necessary or + * should just be renamed since it isn't the full queue

+ * + * Use by both world gen and server networking. + * + * @see LodQuadTree + */ +public interface IFullDataSourceRetrievalQueue extends Closeable { + //=========// + // getters // + //=========// + /** the largest numerical detail level */ byte lowestDataDetail(); /** the smallest numerical detail level */ byte highestDataDetail(); + + + //=======// + // setup // + //=======// + + /** + * Starts the retrieval process if not already running, + * and if running updates the target position. + * + * @param targetPos the position that retrieval should be centered around, + * generally this will be the player's position. + * */ + void startAndSetTargetPos(DhBlockPos2D targetPos); + + + + //===============// + // task handling // + //===============// + + /** @deprecated replace with {@link IFullDataSourceRetrievalQueue#removeGenTask(DhSectionPos)} */ + @Deprecated + void removeGenRequestIf(Function removeIf); + void removeGenTask(DhSectionPos pos); + CompletableFuture submitGenTask(DhSectionPos pos, byte requiredDataDetail, IWorldGenTaskTracker tracker); - /** @param targetPos the position that world generation should be centered around, generally this will be the player's position. */ - void startGenerationQueueAndSetTargetPos(DhBlockPos2D targetPos); + + + //==========// + // shutdown // + //==========// + + CompletableFuture startClosing(boolean cancelCurrentGeneration, boolean alsoInterruptRunning); + void close(); + + + + //===============// + // debug display // + //===============// int getWaitingTaskCount(); int getInProgressTaskCount(); @@ -49,11 +105,5 @@ public interface IWorldGenerationQueue extends Closeable int getEstimatedTotalTaskCount(); void setEstimatedTotalTaskCount(int newEstimate); - CompletableFuture startClosing(boolean cancelCurrentGeneration, boolean alsoInterruptRunning); - void close(); - - void removeGenRequestIf(Function removeIf); - void removeGenTask(DhSectionPos pos); - } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/generation/WorldGenerationQueue.java b/core/src/main/java/com/seibel/distanthorizons/core/generation/WorldGenerationQueue.java index d63fe0c17..e946d2698 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/generation/WorldGenerationQueue.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/generation/WorldGenerationQueue.java @@ -49,7 +49,7 @@ import java.util.concurrent.*; import java.util.function.Consumer; import java.util.function.Function; -public class WorldGenerationQueue implements IWorldGenerationQueue, IDebugRenderable +public class WorldGenerationQueue implements IFullDataSourceRetrievalQueue, IDebugRenderable { private static final Logger LOGGER = DhLoggerBuilder.getLogger(); private static final IWrapperFactory WRAPPER_FACTORY = SingletonInjector.INSTANCE.get(IWrapperFactory.class); @@ -187,7 +187,8 @@ public class WorldGenerationQueue implements IWorldGenerationQueue, IDebugRender // running tasks // //===============// - public void startGenerationQueueAndSetTargetPos(DhBlockPos2D targetPos) + @Override + public void startAndSetTargetPos(DhBlockPos2D targetPos) { // update the target pos this.generationTargetPos = targetPos; diff --git a/core/src/main/java/com/seibel/distanthorizons/core/level/WorldGenModule.java b/core/src/main/java/com/seibel/distanthorizons/core/level/WorldGenModule.java index 302e31b1a..9e866d2d1 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/level/WorldGenModule.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/level/WorldGenModule.java @@ -20,7 +20,7 @@ package com.seibel.distanthorizons.core.level; import com.seibel.distanthorizons.core.file.fullDatafile.GeneratedFullDataFileHandler; -import com.seibel.distanthorizons.core.generation.IWorldGenerationQueue; +import com.seibel.distanthorizons.core.generation.IFullDataSourceRetrievalQueue; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; import com.seibel.distanthorizons.core.logging.f3.F3Screen; import com.seibel.distanthorizons.core.pos.DhBlockPos2D; @@ -156,10 +156,10 @@ public class WorldGenModule implements Closeable // helper classes // //================// - /** Handles the {@link IWorldGenerationQueue} and any other necessary world gen information. */ + /** Handles the {@link IFullDataSourceRetrievalQueue} and any other necessary world gen information. */ public static abstract class AbstractWorldGenState { - public IWorldGenerationQueue worldGenerationQueue; + public IFullDataSourceRetrievalQueue worldGenerationQueue; CompletableFuture closeAsync(boolean doInterrupt) { @@ -178,7 +178,8 @@ public class WorldGenModule implements Closeable } /** @param targetPosForGeneration the position that world generation should be centered around */ - public void startGenerationQueueAndSetTargetPos(DhBlockPos2D targetPosForGeneration) { this.worldGenerationQueue.startGenerationQueueAndSetTargetPos(targetPosForGeneration); } + public void startGenerationQueueAndSetTargetPos(DhBlockPos2D targetPosForGeneration) + { this.worldGenerationQueue.startAndSetTargetPos(targetPosForGeneration); } } }