From 52608a9f3f737389b1ea724ed360d27c1945e8fc Mon Sep 17 00:00:00 2001 From: James Seibel Date: Sun, 8 Aug 2021 22:06:45 -0500 Subject: [PATCH] Create issue #54 --- .../lod/objects/LodQuadTreeDimension.java | 8 +++---- .../java/com/seibel/lod/util/LodUtil.java | 24 +++++-------------- 2 files changed, 10 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/seibel/lod/objects/LodQuadTreeDimension.java b/src/main/java/com/seibel/lod/objects/LodQuadTreeDimension.java index cba728b30..b07f79571 100644 --- a/src/main/java/com/seibel/lod/objects/LodQuadTreeDimension.java +++ b/src/main/java/com/seibel/lod/objects/LodQuadTreeDimension.java @@ -385,10 +385,10 @@ public class LodQuadTreeDimension if (detailLevel > LodQuadTreeNode.REGION_LEVEL) throw new IllegalArgumentException("getLodFromCoordinates given a level of \"" + detailLevel + "\" when \"" + LodQuadTreeNode.REGION_LEVEL + "\" is the max."); - // TODO possibly put this in LodUtil - int regionPosX = Math.floorDiv(chunkPos.x, (int) Math.pow(2,LodQuadTreeNode.REGION_LEVEL - detailLevel)); - int regionPosZ = Math.floorDiv(chunkPos.z, (int) Math.pow(2,LodQuadTreeNode.REGION_LEVEL - detailLevel)); - LodQuadTree region = getRegion(new RegionPos(regionPosX, regionPosZ)); + // issue #54 + // TODO this works, but only in all positive coordinates. + int[] relativePos = LodUtil.convertAbsolutePosToQuadTreeRelativePos(chunkPos.x, chunkPos.z, LodQuadTreeNode.CHUNK_LEVEL); + LodQuadTree region = getRegion(new RegionPos(relativePos[0], relativePos[1])); if(region == null) { diff --git a/src/main/java/com/seibel/lod/util/LodUtil.java b/src/main/java/com/seibel/lod/util/LodUtil.java index 49dabae19..dfabb4b4d 100644 --- a/src/main/java/com/seibel/lod/util/LodUtil.java +++ b/src/main/java/com/seibel/lod/util/LodUtil.java @@ -20,12 +20,11 @@ package com.seibel.lod.util; import java.awt.Color; import java.io.File; -import com.seibel.lod.objects.RegionPos; +import com.seibel.lod.objects.LodQuadTreeNode; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ServerData; import net.minecraft.server.integrated.IntegratedServer; -import net.minecraft.util.math.ChunkPos; import net.minecraft.world.DimensionType; import net.minecraft.world.IWorld; import net.minecraft.world.chunk.ChunkSection; @@ -96,25 +95,14 @@ public class LodUtil } /** - * Convert the given ChunkPos into a RegionPos. + * Convert a 2D absolute position into a quad tree relative position. */ - public static RegionPos convertChunkPosToRegionPos(ChunkPos pos) + public static int[] convertAbsolutePosToQuadTreeRelativePos(int x, int z, int detailLevel) { - RegionPos rPos = new RegionPos(); - rPos.x = pos.x / 512; - rPos.z = pos.z / 512; + int relativePosX = Math.floorDiv(x, (int) Math.pow(2, LodQuadTreeNode.REGION_LEVEL - detailLevel)); + int relativePosZ = Math.floorDiv(z, (int) Math.pow(2, LodQuadTreeNode.REGION_LEVEL - detailLevel)); - // prevent issues if X/Z is negative and less than 16 - if (pos.x < 0) - { - rPos.x = (Math.abs(rPos.x) * -1) - 1; - } - if (pos.z < 0) - { - rPos.z = (Math.abs(rPos.z) * -1) - 1; - } - - return rPos; + return new int[] {relativePosX, relativePosZ}; } /**