From a50ef74a5eaca17619dcabdbfd8c70e95920e0ac Mon Sep 17 00:00:00 2001 From: tom lee Date: Mon, 17 Jan 2022 22:00:40 +0800 Subject: [PATCH] Fixed a bug in posToGenerate and the buffer now reset on too far away --- .../builders/bufferBuilding/LodBufferBuilderFactory.java | 6 ++++-- .../java/com/seibel/lod/core/objects/lod/LodDimension.java | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/seibel/lod/core/builders/bufferBuilding/LodBufferBuilderFactory.java b/src/main/java/com/seibel/lod/core/builders/bufferBuilding/LodBufferBuilderFactory.java index 0f050860d..218c3bf9d 100644 --- a/src/main/java/com/seibel/lod/core/builders/bufferBuilding/LodBufferBuilderFactory.java +++ b/src/main/java/com/seibel/lod/core/builders/bufferBuilding/LodBufferBuilderFactory.java @@ -219,6 +219,7 @@ public class LodBufferBuilderFactory } else { fullRegen = allBuffersRequireReset || frontBufferRequireReset; } + if (!fullRegen && !partialRegen) return false; generatingBuffers = true; @@ -257,9 +258,10 @@ public class LodBufferBuilderFactory int vboX; int vboY; int vboZ; + + boolean tooFar = Math.abs(buildableCenterBlockX-playerX)+Math.abs(buildableCenterBlockZ-playerZ)>100_000; - - if (fullRegen || buildableBuffers==null || buildableVbos==null + if (fullRegen || tooFar || buildableBuffers==null || buildableVbos==null || setsToRender==null || vertexOptimizerCache==null) { renderRange = lodDim.getWidth()/2; //get lodDim half width buildableBuffers = new MovableGridList(renderRange, playerRegionX, playerRegionZ); diff --git a/src/main/java/com/seibel/lod/core/objects/lod/LodDimension.java b/src/main/java/com/seibel/lod/core/objects/lod/LodDimension.java index ed0f0e8c0..64070b1f0 100644 --- a/src/main/java/com/seibel/lod/core/objects/lod/LodDimension.java +++ b/src/main/java/com/seibel/lod/core/objects/lod/LodDimension.java @@ -523,11 +523,13 @@ public class LodDimension PosToGenerateContainer posToGenerate; posToGenerate = new PosToGenerateContainer((byte) 8, maxDataToGenerate, playerBlockPosX, playerBlockPosZ); iterateByDistance((int x, int z) -> { - if (posToGenerate.isFull()) return; + boolean isCloseRange = (Math.abs(x-halfWidth)+Math.abs(z-halfWidth)<2); + if (!isCloseRange && posToGenerate.isFull()) return; //All of this is handled directly by the region, which scan every pos from top to bottom of the quad tree LodRegion lodRegion = regions[x][z]; if (lodRegion != null) - lodRegion.getPosToGenerate(posToGenerate, playerBlockPosX, playerBlockPosZ, priority, (Math.abs(x)+Math.abs(z)<2)); + lodRegion.getPosToGenerate(posToGenerate, playerBlockPosX, playerBlockPosZ, priority, + isCloseRange); }); return posToGenerate; }