From 98e55bb1a364fca60f596e165f8e8237f7dd96d6 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Tue, 16 May 2023 20:03:23 -0500 Subject: [PATCH] Fix RenderSource Building ignoring adjacent sections The sections were never being passed in, only the initial section --- .../render/ColumnRenderSource.java | 21 ++++------------- .../lod/core/render/RenderBufferHandler.java | 23 ++++++++++++++++++- 2 files changed, 27 insertions(+), 17 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 e0b0648d8..38cb73551 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 @@ -349,22 +349,11 @@ public class ColumnRenderSource //================// // TODO return future? - private void tryBuildBuffer(IDhClientLevel level, ColumnRenderSource renderSource) + private void tryBuildBuffer(IDhClientLevel level, ColumnRenderSource[] adjacentRenderSources) { if (this.buildRenderBufferFuture == null && !ColumnRenderBufferBuilder.isBusy() && !this.isEmpty) { - ColumnRenderSource[] columnRenderSources = new ColumnRenderSource[ELodDirection.ADJ_DIRECTIONS.length]; - for (ELodDirection direction : ELodDirection.ADJ_DIRECTIONS) - { - if (renderSource != null) - { - columnRenderSources[direction.ordinal() - 2] = renderSource; - //LOGGER.info("attempting to build buffer for: "+renderSection.pos); - } - } - - // TODO this needs to allow generating partial sections to allow for non-full quadTree RenderSections to render - this.buildRenderBufferFuture = ColumnRenderBufferBuilder.buildBuffers(level, this.columnRenderBufferRef, this, columnRenderSources); + this.buildRenderBufferFuture = ColumnRenderBufferBuilder.buildBuffers(level, this.columnRenderBufferRef, this, adjacentRenderSources); } } @@ -390,7 +379,7 @@ public class ColumnRenderSource * @param renderBufferRefToSwap 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 trySwapInNewlyBuiltRenderBuffer(ColumnRenderSource renderSource, AtomicReference renderBufferRefToSwap) + public boolean trySwapInNewlyBuiltRenderBuffer(AtomicReference renderBufferRefToSwap, ColumnRenderSource[] adjacentRenderSources) { // prevent swapping the buffer to quickly if (this.lastNs != -1 && System.nanoTime() - this.lastNs < SWAP_TIMEOUT_IN_NS) @@ -408,7 +397,7 @@ public class ColumnRenderSource ColumnRenderBuffer newBuffer = this.buildRenderBufferFuture.join(); - LodUtil.assertTrue(newBuffer.buffersUploaded, "The buffer future for "+renderSource.sectionPos+" returned an un-built buffer."); + LodUtil.assertTrue(newBuffer.buffersUploaded, "The buffer future for "+this.sectionPos+" returned an un-built buffer."); ColumnRenderBuffer oldBuffer = renderBufferRefToSwap.getAndSet(newBuffer); if (oldBuffer != null) @@ -435,7 +424,7 @@ public class ColumnRenderSource } else { - this.tryBuildBuffer(this.level, renderSource); + this.tryBuildBuffer(this.level, adjacentRenderSources); } } } 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 065a63c3c..c3b48d92f 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 @@ -180,8 +180,29 @@ public class RenderBufferHandler // if the render source is present, attempt to load it if (sectionRenderSource != null) { + ColumnRenderSource[] adjacentRenderSources = new ColumnRenderSource[ELodDirection.ADJ_DIRECTIONS.length]; + for (ELodDirection direction : ELodDirection.ADJ_DIRECTIONS) + { + try + { + DhSectionPos adjPos = sectionRenderSource.sectionPos.getAdjacentPos(direction); + LodRenderSection adjRenderSection = this.lodQuadTree.getValue(adjPos); + // adjacent render sources can be null + if (adjRenderSection != null) + { + ColumnRenderSource adjRenderSource = adjRenderSection.getRenderSource(); + adjacentRenderSources[direction.ordinal() - 2] = adjRenderSource; + } + } + catch (IndexOutOfBoundsException e) + { + // adjacent positions can be out of bounds, in that case a null render source will be used + } + } + + // TODO why are we always trying to swap the buffers? shouldn't we only swap them when a new buffer has been built? we have a future object specifically for that in ColumnRenderSource - sectionRenderSource.trySwapInNewlyBuiltRenderBuffer(renderSection.getRenderSource(), renderSection.renderBufferRef); + sectionRenderSource.trySwapInNewlyBuiltRenderBuffer(renderSection.renderBufferRef, adjacentRenderSources); } } }