From 7c11bb42588097ee44f63f55f7d94b881bdf7a32 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Fri, 9 Aug 2024 07:25:24 -0500 Subject: [PATCH] Fix beacons not enabling/disabling correctly --- .../core/generation/DhLightingEngine.java | 2 +- .../core/render/LodQuadTree.java | 33 +++------- .../core/render/LodRenderSection.java | 34 +++++++++- .../core/render/RenderBufferHandler.java | 2 +- .../renderer/generic/BeaconRenderHandler.java | 66 +++++++------------ 5 files changed, 65 insertions(+), 72 deletions(-) diff --git a/core/src/main/java/com/seibel/distanthorizons/core/generation/DhLightingEngine.java b/core/src/main/java/com/seibel/distanthorizons/core/generation/DhLightingEngine.java index c160ef482..901aa8583 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/generation/DhLightingEngine.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/generation/DhLightingEngine.java @@ -147,7 +147,7 @@ public class DhLightingEngine { for (int relZ = 0; relZ < LodUtil.CHUNK_WIDTH; relZ++) { - // set each pos' sky light all the way down until a opaque block is hit + // set each pos' sky light all the way down until an opaque block is hit for (int y = maxY; y >= minY; y--) { IBlockStateWrapper block = chunk.getBlockState(relX, y, relZ); diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/LodQuadTree.java b/core/src/main/java/com/seibel/distanthorizons/core/render/LodQuadTree.java index 0ac323dab..312ee0a60 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/render/LodQuadTree.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/render/LodQuadTree.java @@ -189,7 +189,7 @@ public class LodQuadTree extends QuadTree implements IDebugRen try { LodRenderSection renderSection = this.getValue(pos); - if (renderSection != null && renderSection.renderingEnabled) + if (renderSection != null && renderSection.getRenderingEnabled()) { renderSection.uploadRenderDataToGpuAsync(); } @@ -296,7 +296,7 @@ public class LodQuadTree extends QuadTree implements IDebugRen if (DhSectionPos.getDetailLevel(sectionPos) > expectedDetailLevel) { // section detail level too high // - boolean thisPosIsRendering = renderSection.renderingEnabled; + boolean thisPosIsRendering = renderSection.getRenderingEnabled(); boolean allChildrenSectionsAreLoaded = true; // recursively update all child render sections @@ -314,24 +314,8 @@ public class LodQuadTree extends QuadTree implements IDebugRen } else { - if (renderSection.renderingEnabled - && Config.Client.Advanced.Debugging.DebugWireframe.showRenderSectionStatus.get()) - { - // show that this position has just been disabled - DebugRenderer.makeParticle( - new DebugRenderer.BoxParticle( - new DebugRenderer.Box(renderSection.pos, 128f, 156f, 0.09f, Color.CYAN.darker()), - 0.2, 32f - ) - ); - } - // all child positions are loaded, disable this section and enable its children. - if (renderSection.renderingEnabled) - { - this.level.unloadBeaconBeamsInPos(renderSection.pos); - } - renderSection.renderingEnabled = false; + renderSection.setRenderingEnabled(false); // walk back down the tree and enable the child sections //TODO there are probably more efficient ways of doing this, but this will work for now for (int i = 0; i < 4; i++) @@ -382,17 +366,14 @@ public class LodQuadTree extends QuadTree implements IDebugRen if (!parentSectionIsRendering && renderSection.canRender()) { // if rendering is already enabled we don't have to re-enable it - if (!renderSection.renderingEnabled) + if (!renderSection.getRenderingEnabled()) { - renderSection.renderingEnabled = true; - this.level.loadBeaconBeamsInPos(renderSection.pos); - // delete/disable children, all of them will be a lower detail level than requested quadNode.deleteAllChildren((childRenderSection) -> { if (childRenderSection != null) { - if (childRenderSection.renderingEnabled) + if (childRenderSection.getRenderingEnabled()) { // show that this position's rendering has been disabled due to a parent rendering DebugRenderer.makeParticle( @@ -403,10 +384,12 @@ public class LodQuadTree extends QuadTree implements IDebugRen ); } - childRenderSection.renderingEnabled = false; + childRenderSection.setRenderingEnabled(false); childRenderSection.close(); } }); + + renderSection.setRenderingEnabled(true); } } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/LodRenderSection.java b/core/src/main/java/com/seibel/distanthorizons/core/render/LodRenderSection.java index ec71b3419..ff571bfad 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/render/LodRenderSection.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/render/LodRenderSection.java @@ -70,7 +70,7 @@ public class LodRenderSection implements IDebugRenderable, AutoCloseable private final LodQuadTree quadTree; - public boolean renderingEnabled = false; + private boolean renderingEnabled = false; private boolean canRender = false; /** this reference is necessary so we can determine what VBO to render */ @@ -392,6 +392,38 @@ public class LodRenderSection implements IDebugRenderable, AutoCloseable public boolean canRender() { return this.canRender; } + public boolean getRenderingEnabled() { return this.renderingEnabled; } + public void setRenderingEnabled(boolean enabled) + { + // some logic should only be run when enabling/disabling + // a section for the first time + boolean stateChanged = (this.renderingEnabled != enabled); + if (stateChanged) + { + if (enabled) + { + this.level.loadBeaconBeamsInPos(this.pos); + } + else + { + this.level.unloadBeaconBeamsInPos(this.pos); + + if (Config.Client.Advanced.Debugging.DebugWireframe.showRenderSectionStatus.get()) + { + // show that this position has just been disabled + DebugRenderer.makeParticle( + new DebugRenderer.BoxParticle( + new DebugRenderer.Box(this.pos, 128f, 156f, 0.09f, Color.CYAN.darker()), + 0.2, 32f + ) + ); + } + } + } + + this.renderingEnabled = enabled; + } + public boolean gpuUploadInProgress() { return this.buildAndUploadRenderDataToGpuFuture != null; } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/RenderBufferHandler.java b/core/src/main/java/com/seibel/distanthorizons/core/render/RenderBufferHandler.java index d02a238fb..aa2c2ed22 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/render/RenderBufferHandler.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/render/RenderBufferHandler.java @@ -311,7 +311,7 @@ public class RenderBufferHandler implements AutoCloseable } ColumnRenderBuffer buffer = renderSection.renderBuffer; - if (buffer == null || !renderSection.renderingEnabled) + if (buffer == null || !renderSection.getRenderingEnabled()) { continue; } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/generic/BeaconRenderHandler.java b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/generic/BeaconRenderHandler.java index abb909a82..798289ed0 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/generic/BeaconRenderHandler.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/generic/BeaconRenderHandler.java @@ -22,7 +22,6 @@ package com.seibel.distanthorizons.core.render.renderer.generic; import com.seibel.distanthorizons.api.enums.rendering.EDhApiBlockMaterial; import com.seibel.distanthorizons.api.interfaces.render.IDhApiRenderableBoxGroup; import com.seibel.distanthorizons.api.objects.math.DhApiVec3d; -import com.seibel.distanthorizons.api.objects.math.DhApiVec3f; import com.seibel.distanthorizons.api.objects.render.DhApiRenderableBox; import com.seibel.distanthorizons.api.objects.render.DhApiRenderableBoxGroupShading; import com.seibel.distanthorizons.core.config.Config; @@ -42,7 +41,6 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; public class BeaconRenderHandler { @@ -56,7 +54,7 @@ public class BeaconRenderHandler private final BeaconBeamRepo beaconBeamRepo; private final IDhApiRenderableBoxGroup beaconBoxGroup; - private final HashMap beaconRefCountByBlockPos = new HashMap<>(); + private final HashSet beaconBlockPosSet = new HashSet<>(); @@ -143,7 +141,7 @@ public class BeaconRenderHandler { // beam no longer exists at position, remove from DB this.beaconBeamRepo.deleteWithKey(beaconPos); // TODO broken when updating adjacent chunks - this.stopRenderingBeaconAtPos(beaconPos, true); + this.stopRenderingBeaconAtPos(beaconPos); } } @@ -168,7 +166,7 @@ public class BeaconRenderHandler for (int i = 0; i < existingBeamList.size(); i++) { BeaconBeamDTO beam = existingBeamList.get(i); - this.stopRenderingBeaconAtPos(beam.pos, false); + this.stopRenderingBeaconAtPos(beam.pos); } } @@ -180,52 +178,32 @@ public class BeaconRenderHandler private void startRenderingBeacon(BeaconBeamDTO beacon) { - this.beaconRefCountByBlockPos.compute(beacon.pos, (beamPos, beaconRefCount) -> + if (this.beaconBlockPosSet.add(beacon.pos)) { - if (beaconRefCount == null) { beaconRefCount = new AtomicInteger(); } - if (beaconRefCount.getAndIncrement() == 0) - { - DhApiRenderableBox beaconBox = new DhApiRenderableBox( - new DhApiVec3d(beacon.pos.x, beacon.pos.y+1, beacon.pos.z), - new DhApiVec3d(beacon.pos.x+1, BEAM_TOP_Y, beacon.pos.z+1), - beacon.color, - EDhApiBlockMaterial.ILLUMINATED - ); - - this.beaconBoxGroup.add(beaconBox); - this.beaconBoxGroup.triggerBoxChange(); - } - return beaconRefCount; - }); + DhApiRenderableBox beaconBox = new DhApiRenderableBox( + new DhApiVec3d(beacon.pos.x, beacon.pos.y+1, beacon.pos.z), + new DhApiVec3d(beacon.pos.x+1, BEAM_TOP_Y, beacon.pos.z+1), + beacon.color, + EDhApiBlockMaterial.ILLUMINATED + ); + + this.beaconBoxGroup.add(beaconBox); + this.beaconBoxGroup.triggerBoxChange(); + } } - private void stopRenderingBeaconAtPos(DhBlockPos beaconPos, boolean ignoreReferenceCount) + private void stopRenderingBeaconAtPos(DhBlockPos beaconPos) { - this.beaconRefCountByBlockPos.compute(beaconPos, (pos, beaconRefCount) -> + if (this.beaconBlockPosSet.remove(beaconPos)) { - // ignoring the reference count is needed when deleting beacons - if (ignoreReferenceCount - || - // respecting the reference count is used when unloading beacons - ( - beaconRefCount != null - && beaconRefCount.decrementAndGet() <= 0 - )) + this.beaconBoxGroup.removeIf((box) -> { - this.beaconBoxGroup.removeIf((box) -> - box.minPos.x == beaconPos.x + return box.minPos.x == beaconPos.x && box.minPos.y == beaconPos.y+1 // plus 1 because the beam starts above the beacon - && box.minPos.z == beaconPos.z - ); - - this.beaconBoxGroup.triggerBoxChange(); - return null; - } - else - { - return beaconRefCount; - } - }); + && box.minPos.z == beaconPos.z; + }); + this.beaconBoxGroup.triggerBoxChange(); + } } private void updateBeaconColor(BeaconBeamDTO newBeam)