From 82fe7c099d87b6f98d5b2bc3c6b3663a35b00dad Mon Sep 17 00:00:00 2001 From: James Seibel Date: Mon, 27 Mar 2023 21:11:09 -0500 Subject: [PATCH] refactoring quadTree/Node, RenderSection, and ColRenderSource --- .../core/dataObjects/render/ColumnRenderSource.java | 7 ++----- .../com/seibel/lod/core/render/LodQuadTree.java | 8 +++----- .../seibel/lod/core/render/LodRenderSection.java | 8 +++++--- .../seibel/lod/core/render/RenderBufferHandler.java | 10 +++++----- .../lod/core/util/objects/quadTree/QuadNode.java | 13 +++++++++++-- .../lod/core/util/objects/quadTree/QuadTree.java | 9 +++++++++ 6 files changed, 35 insertions(+), 20 deletions(-) diff --git a/core/src/main/java/com/seibel/lod/core/dataObjects/render/ColumnRenderSource.java b/core/src/main/java/com/seibel/lod/core/dataObjects/render/ColumnRenderSource.java index 838ae80bb..9539c3938 100644 --- a/core/src/main/java/com/seibel/lod/core/dataObjects/render/ColumnRenderSource.java +++ b/core/src/main/java/com/seibel/lod/core/dataObjects/render/ColumnRenderSource.java @@ -13,8 +13,6 @@ import com.seibel.lod.core.render.AbstractRenderBuffer; import com.seibel.lod.core.enums.ELodDirection; import com.seibel.lod.core.logging.DhLoggerBuilder; import com.seibel.lod.core.level.IDhLevel; -import com.seibel.lod.core.render.LodQuadTree; -import com.seibel.lod.core.render.LodRenderSection; import com.seibel.lod.core.util.BitShiftUtil; import com.seibel.lod.core.util.ColorUtil; import com.seibel.lod.core.util.RenderDataPointUtil; @@ -366,10 +364,9 @@ public class ColumnRenderSource } } - public void enableRender(IDhClientLevel level, LodQuadTree quadTree) + public void enableRender(IDhClientLevel level) { this.level = level; - //this.tryBuildBuffer(level, quadTree); // FIXME why was this commented out? } public void disableRender() { this.cancelBuildBuffer(); } @@ -382,7 +379,7 @@ public class ColumnRenderSource * @param renderBufferToSwap The slot for swapping in the new buffer. * @return True if the swap was successful. False if swap is not needed or if it is in progress. */ - public boolean trySwapRenderBufferAsync(ColumnRenderSource renderSource, AtomicReference renderBufferToSwap) + public boolean trySwapRenderBuffer(ColumnRenderSource renderSource, AtomicReference renderBufferToSwap) { // prevent swapping the buffer to quickly if (this.lastNs != -1 && System.nanoTime() - this.lastNs < SWAP_TIMEOUT_IN_NS) diff --git a/core/src/main/java/com/seibel/lod/core/render/LodQuadTree.java b/core/src/main/java/com/seibel/lod/core/render/LodQuadTree.java index bcfeaafba..517d3893b 100644 --- a/core/src/main/java/com/seibel/lod/core/render/LodQuadTree.java +++ b/core/src/main/java/com/seibel/lod/core/render/LodQuadTree.java @@ -7,8 +7,6 @@ import com.seibel.lod.core.pos.DhSectionPos; import com.seibel.lod.core.file.renderfile.ILodRenderSourceProvider; import com.seibel.lod.core.logging.DhLoggerBuilder; import com.seibel.lod.core.util.DetailDistanceUtil; -import com.seibel.lod.core.util.LodUtil; -import com.seibel.lod.core.util.gridList.MovableGridRingList; import com.seibel.lod.core.util.objects.quadTree.QuadNode; import com.seibel.lod.core.util.objects.quadTree.QuadTree; import org.apache.logging.log4j.Logger; @@ -247,14 +245,14 @@ public class LodQuadTree extends QuadTree implements AutoClose // enable the render section nullableRenderSection.loadRenderSourceAndEnableRendering(this.renderSourceProvider); - nullableRenderSection.tick(this, this.level); + nullableRenderSection.tick(this.level); // delete/disable children nullableQuadNode.deleteAllChildren((renderSection) -> { if (renderSection != null) { - renderSection.disableAndDisposeRender(); + renderSection.disableAndDisposeRendering(); } }); } @@ -290,7 +288,7 @@ public class LodQuadTree extends QuadTree implements AutoClose } private static boolean isSectionLoaded(LodRenderSection renderSection) { - return renderSection != null && renderSection.isLoaded() && !renderSection.getRenderSource().isEmpty(); + return renderSection != null && renderSection.isLoaded() && renderSection.isRenderingEnabled() && !renderSection.getRenderSource().isEmpty(); } diff --git a/core/src/main/java/com/seibel/lod/core/render/LodRenderSection.java b/core/src/main/java/com/seibel/lod/core/render/LodRenderSection.java index 41f6ef249..79d619c4e 100644 --- a/core/src/main/java/com/seibel/lod/core/render/LodRenderSection.java +++ b/core/src/main/java/com/seibel/lod/core/render/LodRenderSection.java @@ -53,7 +53,9 @@ public class LodRenderSection } this.isRenderEnabled = true; } - public void disableAndDisposeRender() + + + public void disableAndDisposeRendering() { if (!this.isRenderEnabled) { @@ -102,7 +104,7 @@ public class LodRenderSection // update methods // //================// - public void tick(LodQuadTree quadTree, IDhClientLevel level) + public void tick(IDhClientLevel level) { // get the renderSource if it has finished loading if (this.loadFuture != null && this.loadFuture.isDone()) @@ -112,7 +114,7 @@ public class LodRenderSection if (this.isRenderEnabled) { - this.renderSource.enableRender(level, quadTree); + this.renderSource.enableRender(level); } } } diff --git a/core/src/main/java/com/seibel/lod/core/render/RenderBufferHandler.java b/core/src/main/java/com/seibel/lod/core/render/RenderBufferHandler.java index 6742742ce..8b89663a9 100644 --- a/core/src/main/java/com/seibel/lod/core/render/RenderBufferHandler.java +++ b/core/src/main/java/com/seibel/lod/core/render/RenderBufferHandler.java @@ -135,7 +135,7 @@ public class RenderBufferHandler // Build the sorted list this.loadedNearToFarBuffers = new SortedArraySet<>((a, b) -> -farToNearComparator.compare(a, b)); // TODO is the comparator named wrong? - this.quadTree.forEachLeafValue((renderSection, sectionPos) -> + this.quadTree.forEachValue((renderSection, sectionPos) -> { if (renderSection != null && renderSection.shouldRender()) { @@ -166,7 +166,7 @@ public class RenderBufferHandler public void update() { - this.quadTree.forEachLeafValue((renderSection, sectionPos) -> + this.quadTree.forEachValue((renderSection, sectionPos) -> { if (renderSection != null) { @@ -185,7 +185,7 @@ public class RenderBufferHandler else { LodUtil.assertTrue(currentRenderSource != null); // section.shouldRender() should have ensured this - currentRenderSource.trySwapRenderBufferAsync(renderSection.getRenderSource(), renderSection.abstractRenderBufferRef); + currentRenderSource.trySwapRenderBuffer(renderSection.getRenderSource(), renderSection.abstractRenderBufferRef); } } }); @@ -193,9 +193,9 @@ public class RenderBufferHandler public void close() { - this.quadTree.forEachLeafValue((renderSection) -> + this.quadTree.forEachValue((renderSection) -> { - if (renderSection.abstractRenderBufferRef.get() != null) + if (renderSection != null && renderSection.abstractRenderBufferRef.get() != null) { renderSection.abstractRenderBufferRef.get().close(); renderSection.abstractRenderBufferRef.set(null); diff --git a/core/src/main/java/com/seibel/lod/core/util/objects/quadTree/QuadNode.java b/core/src/main/java/com/seibel/lod/core/util/objects/quadTree/QuadNode.java index 34620d9c0..9f6737e0a 100644 --- a/core/src/main/java/com/seibel/lod/core/util/objects/quadTree/QuadNode.java +++ b/core/src/main/java/com/seibel/lod/core/util/objects/quadTree/QuadNode.java @@ -268,7 +268,10 @@ public class QuadNode * Applies the given consumer to all leaf nodes below this node.
* Note: this will pass in null values. */ - public void forAllLeafValues(BiConsumer consumer) + public void forAllLeafValues(BiConsumer consumer) { this.forAllChildValues(consumer, true, true); } + + public void forAllChildValues(BiConsumer consumer) { this.forAllChildValues(consumer, false, true); } + private void forAllChildValues(BiConsumer consumer, boolean onlyReturnLeafNodes, boolean topCaller) // TODO rename/refactor topCaller parameter { if (this.getChildCount() == 0 || this.sectionPos.sectionDetailLevel == this.minimumDetailLevel) { @@ -277,18 +280,24 @@ public class QuadNode } else { + if (!onlyReturnLeafNodes && !topCaller) + { + consumer.accept(this.value, this.sectionPos); + } + for (int i = 0; i < 4; i++) { QuadNode childNode = this.getChildByIndex(i); if (childNode != null) { // TODO should this pass in a null value if the child node is null? - childNode.forAllLeafValues(consumer); + childNode.forAllChildValues(consumer, onlyReturnLeafNodes, false); } } } } + public void deleteAllChildren() { this.deleteAllChildren(null); } /** @param removedItemConsumer is only fired for non-null nodes, however the value passed in may be null */ public void deleteAllChildren(Consumer removedItemConsumer) diff --git a/core/src/main/java/com/seibel/lod/core/util/objects/quadTree/QuadTree.java b/core/src/main/java/com/seibel/lod/core/util/objects/quadTree/QuadTree.java index 5fe8b5ac4..4928067cf 100644 --- a/core/src/main/java/com/seibel/lod/core/util/objects/quadTree/QuadTree.java +++ b/core/src/main/java/com/seibel/lod/core/util/objects/quadTree/QuadTree.java @@ -216,6 +216,15 @@ public class QuadTree }); } + public void forEachValue(Consumer consumer) { this.forEachValue((value, sectionPos) -> { consumer.accept(value); }); } + public void forEachValue(BiConsumer consumer) + { + this.forEachRootNode((rootNode) -> + { + rootNode.forAllChildValues(consumer); + }); + } +