Fix RenderSource Building ignoring adjacent sections

The sections were never being passed in, only the initial section
This commit is contained in:
James Seibel
2023-05-16 20:03:23 -05:00
parent a3f2cdc72f
commit 98e55bb1a3
2 changed files with 27 additions and 17 deletions
@@ -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<ColumnRenderBuffer> renderBufferRefToSwap)
public boolean trySwapInNewlyBuiltRenderBuffer(AtomicReference<ColumnRenderBuffer> 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);
}
}
}
@@ -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);
}
}
}