From 4d863adac50f06341671271d47dd5d0d9ffa5b86 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Thu, 14 Sep 2023 20:07:25 -0500 Subject: [PATCH] replace DhSectionPos getCenter() with getCenterBlockPos() --- .../fullDatafile/FullDataFileHandler.java | 1 - .../core/pos/DhBlockPos2D.java | 6 +- .../core/pos/DhSectionPos.java | 51 ++++++++--------- .../core/render/LodQuadTree.java | 2 +- .../core/render/RenderBufferHandler.java | 6 +- .../core/util/objects/quadTree/QuadNode.java | 2 +- .../src/test/java/tests/DhSectionPosTest.java | 56 ++++++++++++++----- 7 files changed, 78 insertions(+), 46 deletions(-) diff --git a/core/src/main/java/com/seibel/distanthorizons/core/file/fullDatafile/FullDataFileHandler.java b/core/src/main/java/com/seibel/distanthorizons/core/file/fullDatafile/FullDataFileHandler.java index b892bc185..a3f4231bb 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/file/fullDatafile/FullDataFileHandler.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/file/fullDatafile/FullDataFileHandler.java @@ -44,7 +44,6 @@ import java.util.*; import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Consumer; -import java.util.function.Function; public class FullDataFileHandler implements IFullDataSourceProvider { diff --git a/core/src/main/java/com/seibel/distanthorizons/core/pos/DhBlockPos2D.java b/core/src/main/java/com/seibel/distanthorizons/core/pos/DhBlockPos2D.java index 86a8b247f..c6f8c1906 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/pos/DhBlockPos2D.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/pos/DhBlockPos2D.java @@ -67,9 +67,11 @@ public class DhBlockPos2D // calculations // //==============// - public double dist(DhBlockPos2D other) { return Math.sqrt(Math.pow(this.x - other.x, 2) + Math.pow(this.z - other.z, 2)); } + public double dist(DhBlockPos2D other) { return this.dist(other.x, other.z); } + public double dist(int x, int z) { return Math.sqrt(Math.pow(this.x - x, 2) + Math.pow(this.z - z, 2)); } - public long distSquared(DhBlockPos2D other) { return MathUtil.pow2((long) this.x - other.x) + MathUtil.pow2((long) this.z - other.z); } + public long distSquared(DhBlockPos2D other) { return this.distSquared(other.x, other.z); } + public long distSquared(int x, int z) { return MathUtil.pow2((long) this.x - x) + MathUtil.pow2((long) this.z - z); } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/pos/DhSectionPos.java b/core/src/main/java/com/seibel/distanthorizons/core/pos/DhSectionPos.java index 57fff321c..396d5c7eb 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/pos/DhSectionPos.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/pos/DhSectionPos.java @@ -143,31 +143,6 @@ public class DhSectionPos // getters // //=========// - /** Returns the center for detail level 0 */ - public DhLodPos getCenter() { return this.getCenter((byte) 0); } // TODO why does this use detail level 0 instead of this object's detail level? - public DhLodPos getCenter(byte returnDetailLevel) - { - LodUtil.assertTrue(returnDetailLevel <= this.sectionDetailLevel, "returnDetailLevel must be less than sectionDetail"); - - if (returnDetailLevel == this.sectionDetailLevel) - { - return new DhLodPos(this.sectionDetailLevel, this.sectionX, this.sectionZ); - } - - byte detailLevelOffset = (byte) (this.sectionDetailLevel - returnDetailLevel); - - // we can't get the center of the position at block level, only attempt to get the position offset for detail levels above 0 // TODO should this also apply to detail level 1 or is it fine? - int positionOffset = 0; - if (this.sectionDetailLevel != 1 || returnDetailLevel != 0) - { - positionOffset = BitShiftUtil.powerOfTwo(detailLevelOffset - 1); - } - - return new DhLodPos(returnDetailLevel, - (this.sectionX * BitShiftUtil.powerOfTwo(detailLevelOffset)) + positionOffset, - (this.sectionZ * BitShiftUtil.powerOfTwo(detailLevelOffset)) + positionOffset); - } - /** @return the corner with the smallest X and Z coordinate */ public DhLodPos getCorner() { return this.getCorner((byte) (this.sectionDetailLevel - 1)); } /** @return the corner with the smallest X and Z coordinate */ @@ -202,6 +177,32 @@ public class DhSectionPos public int getBlockWidth() { return BitShiftUtil.powerOfTwo(this.sectionDetailLevel); } + public DhBlockPos2D getCenterBlockPos() { return new DhBlockPos2D(this.getCenterBlockPosX(), this.getCenterBlockPosZ()); } + + public int getCenterBlockPosX() { return this.getCenterBlockPos(true); } + public int getCenterBlockPosZ() { return this.getCenterBlockPos(false); } + private int getCenterBlockPos(boolean returnX) + { + int centerBlockPos = returnX ? this.sectionX : this.sectionZ; + + if (this.sectionDetailLevel == 0) + { + // already at block detail level, no conversion necessary + return centerBlockPos; + } + + // we can't get the center of the position at block level, only attempt to get the position offset for detail levels above 0 + int positionOffset = 0; + if (this.sectionDetailLevel != 1) + { + positionOffset = BitShiftUtil.powerOfTwo(this.sectionDetailLevel - 1); + } + + return (centerBlockPos * BitShiftUtil.powerOfTwo(this.sectionDetailLevel)) + positionOffset; + } + + + //==================// // parent child pos // //==================// 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 0a81cc761..8caa1641e 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 @@ -320,7 +320,7 @@ public class LodQuadTree extends QuadTree implements AutoClose * @param sectionPos section position * @return detail level of this section pos */ - public byte calculateExpectedDetailLevel(DhBlockPos2D playerPos, DhSectionPos sectionPos) { return this.getDetailLevelFromDistance(playerPos.dist(sectionPos.getCenter().getCenterBlockPos())); } + public byte calculateExpectedDetailLevel(DhBlockPos2D playerPos, DhSectionPos sectionPos) { return this.getDetailLevelFromDistance(playerPos.dist(sectionPos.getCenterBlockPosX(), sectionPos.getCenterBlockPosZ())); } private byte getDetailLevelFromDistance(double distance) { // special case, never drop the quality 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 db50ae3fa..c4f51f256 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 @@ -118,13 +118,13 @@ public class RenderBufferHandler } } - Pos2D cPos = lodQuadTree.getCenterBlockPos().toPos2D(); + Pos2D cPos = this.lodQuadTree.getCenterBlockPos().toPos2D(); // Now that we have the axis directions, we can sort the render list Comparator farToNearComparator = (loadedBufferA, loadedBufferB) -> { - Pos2D aPos = loadedBufferA.pos.getCenter().getCenterBlockPos().toPos2D(); - Pos2D bPos = loadedBufferB.pos.getCenter().getCenterBlockPos().toPos2D(); + Pos2D aPos = loadedBufferA.pos.getCenterBlockPos().toPos2D(); + Pos2D bPos = loadedBufferB.pos.getCenterBlockPos().toPos2D(); if (true) { int aManhattanDistance = aPos.manhattanDist(cPos); diff --git a/core/src/main/java/com/seibel/distanthorizons/core/util/objects/quadTree/QuadNode.java b/core/src/main/java/com/seibel/distanthorizons/core/util/objects/quadTree/QuadNode.java index d3666a9cc..70aa58e97 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/util/objects/quadTree/QuadNode.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/util/objects/quadTree/QuadNode.java @@ -179,7 +179,7 @@ public class QuadNode if (!this.sectionPos.contains(inputSectionPos)) { - LOGGER.error((replaceValue ? "set " : "get ") + inputSectionPos + " center block: " + inputSectionPos.getCenter().getCornerBlockPos() + ", this pos: " + this.sectionPos + " this center block: " + this.sectionPos.getCenter().getCornerBlockPos()); + LOGGER.error((replaceValue ? "set " : "get ") + inputSectionPos + " center block: " + inputSectionPos.getCenterBlockPos() + ", this pos: " + this.sectionPos + " this center block: " + this.sectionPos.getCenterBlockPos()); throw new IllegalArgumentException("Input section pos " + inputSectionPos + " outside of this quadNode's pos: " + this.sectionPos + ", this node's blockPos: " + this.sectionPos.convertNewToDetailLevel(LodUtil.BLOCK_DETAIL_LEVEL) + " block width: " + this.sectionPos.getBlockWidth() + " input detail level: " + inputSectionPos.convertNewToDetailLevel(LodUtil.BLOCK_DETAIL_LEVEL) + " width: " + inputSectionPos.getBlockWidth()); } diff --git a/core/src/test/java/tests/DhSectionPosTest.java b/core/src/test/java/tests/DhSectionPosTest.java index 2c305a3cf..ff2419d1b 100644 --- a/core/src/test/java/tests/DhSectionPosTest.java +++ b/core/src/test/java/tests/DhSectionPosTest.java @@ -130,17 +130,17 @@ public class DhSectionPosTest public void GetCenterTest() { DhSectionPos node = new DhSectionPos((byte) 1, 2303, 0); - DhLodPos centerNode = node.getCenter(); - DhLodPos expectedCenterNode = new DhLodPos((byte) 0, 4606, 0); - Assert.assertEquals("", expectedCenterNode, centerNode); + DhBlockPos2D centerBlockPos = node.getCenterBlockPos(); + DhBlockPos2D expectedCenterNode = new DhBlockPos2D(4606, 0); + Assert.assertEquals("", expectedCenterNode, centerBlockPos); node = new DhSectionPos((byte) 10, 0, 0); // 1024 blocks wide - centerNode = node.getCenter(); - expectedCenterNode = new DhLodPos((byte) 0, 1024 / 2, 1024 / 2); - Assert.assertEquals("", expectedCenterNode, centerNode); - + centerBlockPos = node.getCenterBlockPos(); + expectedCenterNode = new DhBlockPos2D(1024 / 2, 1024 / 2); + Assert.assertEquals("", expectedCenterNode, centerBlockPos); + } @Test @@ -150,11 +150,11 @@ public class DhSectionPosTest DhSectionPos inputPos = new DhSectionPos((byte) 0, 4606, 0); // width 1 block Assert.assertTrue(parentNode.contains(inputPos)); - DhLodPos parentCenter = parentNode.getCenter(); - DhLodPos inputCenter = inputPos.getCenter(); + DhBlockPos2D parentCenter = parentNode.getCenterBlockPos(); + DhBlockPos2D inputCenter = inputPos.getCenterBlockPos(); - Assert.assertEquals(new DhLodPos((byte) 0, 4606, 2), parentCenter); - Assert.assertEquals(new DhLodPos((byte) 0, 4606, 0), inputCenter); + Assert.assertEquals(new DhBlockPos2D(4606, 2), parentCenter); + Assert.assertEquals(new DhBlockPos2D(4606, 0), inputCenter); } @@ -273,7 +273,6 @@ public class DhSectionPosTest Assert.assertEquals(2, sectionPos.getWidthCountForLowerDetailedSection(returnDetailLevel)); - // 2 -> 1 returnDetailLevel = 1; originSectionPos = originSectionPos.convertNewToDetailLevel((byte) 2); @@ -283,7 +282,6 @@ public class DhSectionPosTest Assert.assertEquals(2, sectionPos.getWidthCountForLowerDetailedSection(returnDetailLevel)); - // Block -> 0 returnDetailLevel = 0; originSectionPos = originSectionPos.convertNewToDetailLevel(DhSectionPos.SECTION_BLOCK_DETAIL_LEVEL); @@ -329,4 +327,36 @@ public class DhSectionPosTest Assert.assertEquals(32768, sectionPos.getBlockWidth()); } + + @Test + public void GetCenterBlockPos() + { + DhSectionPos originSectionPos = new DhSectionPos((byte) 0,0,0); + DhSectionPos sectionPos = new DhSectionPos((byte) 0,-10000,5000); + + + Assert.assertEquals(new DhBlockPos2D(0, 0), originSectionPos.getCenterBlockPos()); + Assert.assertEquals(new DhBlockPos2D(-10000, 5000), sectionPos.getCenterBlockPos()); + + + originSectionPos = originSectionPos.convertNewToDetailLevel((byte) 1); + Assert.assertEquals(new DhBlockPos2D(0, 0), originSectionPos.getCenterBlockPos()); + sectionPos = sectionPos.convertNewToDetailLevel((byte) 1); + Assert.assertEquals(new DhBlockPos2D(-10000, 5000), sectionPos.getCenterBlockPos()); + + + originSectionPos = originSectionPos.convertNewToDetailLevel(DhSectionPos.SECTION_BLOCK_DETAIL_LEVEL); + Assert.assertEquals(new DhBlockPos2D(32, 32), originSectionPos.getCenterBlockPos()); + sectionPos = sectionPos.convertNewToDetailLevel(DhSectionPos.SECTION_BLOCK_DETAIL_LEVEL); + Assert.assertEquals(new DhBlockPos2D(-10016, 5024), sectionPos.getCenterBlockPos()); + + + originSectionPos = originSectionPos.convertNewToDetailLevel(DhSectionPos.SECTION_REGION_DETAIL_LEVEL); + Assert.assertEquals(new DhBlockPos2D(16384, 16384), originSectionPos.getCenterBlockPos()); + sectionPos = sectionPos.convertNewToDetailLevel(DhSectionPos.SECTION_REGION_DETAIL_LEVEL); + Assert.assertEquals(new DhBlockPos2D(-16384, 16384), sectionPos.getCenterBlockPos()); + + } + + }