diff --git a/src/main/java/com/seibel/lod/builders/bufferBuilding/LodBufferBuilderFactory.java b/src/main/java/com/seibel/lod/builders/bufferBuilding/LodBufferBuilderFactory.java
index 94d8d1f9e..2a65a3155 100644
--- a/src/main/java/com/seibel/lod/builders/bufferBuilding/LodBufferBuilderFactory.java
+++ b/src/main/java/com/seibel/lod/builders/bufferBuilding/LodBufferBuilderFactory.java
@@ -37,12 +37,12 @@ import org.lwjgl.opengl.GL45;
import com.google.common.util.concurrent.ThreadFactoryBuilder;
import com.mojang.blaze3d.systems.RenderSystem;
-import com.seibel.lod.builders.bufferBuilding.lodTemplates.Box;
import com.seibel.lod.config.LodConfig;
import com.seibel.lod.enums.config.GpuUploadMethod;
import com.seibel.lod.enums.config.VanillaOverdraw;
import com.seibel.lod.enums.rendering.GlProxyContext;
import com.seibel.lod.lodApi.ClientApi;
+import com.seibel.lod.objects.Box;
import com.seibel.lod.objects.PosToRenderContainer;
import com.seibel.lod.objects.lod.LodDimension;
import com.seibel.lod.objects.lod.LodRegion;
diff --git a/src/main/java/com/seibel/lod/builders/bufferBuilding/lodTemplates/AbstractLodTemplate.java b/src/main/java/com/seibel/lod/builders/bufferBuilding/lodTemplates/AbstractLodTemplate.java
index e51bd6190..8edf33289 100644
--- a/src/main/java/com/seibel/lod/builders/bufferBuilding/lodTemplates/AbstractLodTemplate.java
+++ b/src/main/java/com/seibel/lod/builders/bufferBuilding/lodTemplates/AbstractLodTemplate.java
@@ -22,6 +22,7 @@ package com.seibel.lod.builders.bufferBuilding.lodTemplates;
import java.util.Map;
import com.seibel.lod.enums.rendering.DebugMode;
+import com.seibel.lod.objects.Box;
import com.seibel.lod.objects.opengl.LodBufferBuilder;
import com.seibel.lod.util.ColorUtil;
import com.seibel.lod.wrappers.Block.BlockPosWrapper;
diff --git a/src/main/java/com/seibel/lod/builders/bufferBuilding/lodTemplates/CubicLodTemplate.java b/src/main/java/com/seibel/lod/builders/bufferBuilding/lodTemplates/CubicLodTemplate.java
index b5c0ac17c..c2f82df3f 100644
--- a/src/main/java/com/seibel/lod/builders/bufferBuilding/lodTemplates/CubicLodTemplate.java
+++ b/src/main/java/com/seibel/lod/builders/bufferBuilding/lodTemplates/CubicLodTemplate.java
@@ -22,6 +22,7 @@ package com.seibel.lod.builders.bufferBuilding.lodTemplates;
import java.util.Map;
import com.seibel.lod.enums.rendering.DebugMode;
+import com.seibel.lod.objects.Box;
import com.seibel.lod.objects.opengl.LodBufferBuilder;
import com.seibel.lod.util.ColorUtil;
import com.seibel.lod.util.DataPointUtil;
diff --git a/src/main/java/com/seibel/lod/builders/bufferBuilding/lodTemplates/DynamicLodTemplate.java b/src/main/java/com/seibel/lod/builders/bufferBuilding/lodTemplates/DynamicLodTemplate.java
index af2c9ee56..9a3bdd013 100644
--- a/src/main/java/com/seibel/lod/builders/bufferBuilding/lodTemplates/DynamicLodTemplate.java
+++ b/src/main/java/com/seibel/lod/builders/bufferBuilding/lodTemplates/DynamicLodTemplate.java
@@ -23,6 +23,7 @@ import java.util.Map;
import com.seibel.lod.enums.rendering.DebugMode;
import com.seibel.lod.lodApi.ClientApi;
+import com.seibel.lod.objects.Box;
import com.seibel.lod.objects.opengl.LodBufferBuilder;
import com.seibel.lod.wrappers.Block.BlockPosWrapper;
diff --git a/src/main/java/com/seibel/lod/builders/bufferBuilding/lodTemplates/TriangularLodTemplate.java b/src/main/java/com/seibel/lod/builders/bufferBuilding/lodTemplates/TriangularLodTemplate.java
index 4d016ce27..8aab660a3 100644
--- a/src/main/java/com/seibel/lod/builders/bufferBuilding/lodTemplates/TriangularLodTemplate.java
+++ b/src/main/java/com/seibel/lod/builders/bufferBuilding/lodTemplates/TriangularLodTemplate.java
@@ -23,6 +23,7 @@ import java.util.Map;
import com.seibel.lod.enums.rendering.DebugMode;
import com.seibel.lod.lodApi.ClientApi;
+import com.seibel.lod.objects.Box;
import com.seibel.lod.objects.opengl.LodBufferBuilder;
import com.seibel.lod.wrappers.Block.BlockPosWrapper;
diff --git a/src/main/java/com/seibel/lod/lodApi/ClientApi.java b/src/main/java/com/seibel/lod/lodApi/ClientApi.java
index 8b61934cc..2220df221 100644
--- a/src/main/java/com/seibel/lod/lodApi/ClientApi.java
+++ b/src/main/java/com/seibel/lod/lodApi/ClientApi.java
@@ -25,7 +25,7 @@ import org.apache.logging.log4j.Logger;
import com.seibel.lod.builders.worldGeneration.LodGenWorker;
import com.seibel.lod.config.LodConfig;
import com.seibel.lod.objects.lod.LodDimension;
-import com.seibel.lod.objects.rending.Mat4f;
+import com.seibel.lod.objects.math.Mat4f;
import com.seibel.lod.proxy.GlProxy;
import com.seibel.lod.render.LodRenderer;
import com.seibel.lod.util.DetailDistanceUtil;
diff --git a/src/main/java/com/seibel/lod/mixin/MixinWorldRenderer.java b/src/main/java/com/seibel/lod/mixin/MixinWorldRenderer.java
index 6c3867fad..f99c6c984 100644
--- a/src/main/java/com/seibel/lod/mixin/MixinWorldRenderer.java
+++ b/src/main/java/com/seibel/lod/mixin/MixinWorldRenderer.java
@@ -27,7 +27,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.seibel.lod.lodApi.ClientApi;
-import com.seibel.lod.objects.rending.Mat4f;
+import com.seibel.lod.objects.math.Mat4f;
import com.seibel.lod.wrappers.McObjectConverter;
import net.minecraft.client.renderer.RenderType;
diff --git a/src/main/java/com/seibel/lod/builders/bufferBuilding/lodTemplates/Box.java b/src/main/java/com/seibel/lod/objects/Box.java
similarity index 99%
rename from src/main/java/com/seibel/lod/builders/bufferBuilding/lodTemplates/Box.java
rename to src/main/java/com/seibel/lod/objects/Box.java
index 60cb7c9ba..33b735367 100644
--- a/src/main/java/com/seibel/lod/builders/bufferBuilding/lodTemplates/Box.java
+++ b/src/main/java/com/seibel/lod/objects/Box.java
@@ -17,7 +17,7 @@
* along with this program. If not, see .
*/
-package com.seibel.lod.builders.bufferBuilding.lodTemplates;
+package com.seibel.lod.objects;
import java.util.Arrays;
import java.util.HashMap;
diff --git a/src/main/java/com/seibel/lod/objects/rending/Mat4f.java b/src/main/java/com/seibel/lod/objects/math/Mat4f.java
similarity index 99%
rename from src/main/java/com/seibel/lod/objects/rending/Mat4f.java
rename to src/main/java/com/seibel/lod/objects/math/Mat4f.java
index da374d932..e0ebfc1c3 100644
--- a/src/main/java/com/seibel/lod/objects/rending/Mat4f.java
+++ b/src/main/java/com/seibel/lod/objects/math/Mat4f.java
@@ -17,7 +17,7 @@
* along with this program. If not, see .
*/
-package com.seibel.lod.objects.rending;
+package com.seibel.lod.objects.math;
import java.nio.FloatBuffer;
diff --git a/src/main/java/com/seibel/lod/objects/rending/Vec3f.java b/src/main/java/com/seibel/lod/objects/math/Vec3f.java
similarity index 99%
rename from src/main/java/com/seibel/lod/objects/rending/Vec3f.java
rename to src/main/java/com/seibel/lod/objects/math/Vec3f.java
index 9da51aa5d..202ef0449 100644
--- a/src/main/java/com/seibel/lod/objects/rending/Vec3f.java
+++ b/src/main/java/com/seibel/lod/objects/math/Vec3f.java
@@ -17,7 +17,7 @@
* along with this program. If not, see .
*/
-package com.seibel.lod.objects.rending;
+package com.seibel.lod.objects.math;
import com.seibel.lod.util.LodUtil;
diff --git a/src/main/java/com/seibel/lod/objects/math/Vec3i.java b/src/main/java/com/seibel/lod/objects/math/Vec3i.java
new file mode 100644
index 000000000..c44bbad24
--- /dev/null
+++ b/src/main/java/com/seibel/lod/objects/math/Vec3i.java
@@ -0,0 +1,205 @@
+/*
+ * This file is part of the Distant Horizon mod (formerly the LOD Mod),
+ * licensed under the GNU GPL v3 License.
+ *
+ * Copyright (C) 2020 James Seibel
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 3.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package com.seibel.lod.objects.math;
+
+import com.seibel.lod.util.LodUtil;
+
+import net.minecraft.util.math.vector.Vector3i;
+
+/**
+ * A (almost) exact copy of Minecraft's 1.16.5
+ * implementation of a 3 element vector.
+ *
+ * @author James Seibel
+ * @version 11-11-2021
+ */
+public class Vec3i
+{
+ public static Vec3i XNeg = new Vec3i(-1, 0, 0);
+ public static Vec3i XPos = new Vec3i(1, 0, 0);
+ public static Vec3i YNeg = new Vec3i(0, -1, 0);
+ public static Vec3i YPos = new Vec3i(0, 1, 0);
+ public static Vec3i ZNeg = new Vec3i(0, 0, -1);
+ public static Vec3i ZPos = new Vec3i(0, 0, 1);
+
+
+ public int x;
+ public int y;
+ public int z;
+
+
+
+ public Vec3i()
+ {
+
+ }
+
+ public Vec3i(int x, int y, int z)
+ {
+ this.x = x;
+ this.y = y;
+ this.z = z;
+ }
+
+ @Override
+ public boolean equals(Object obj)
+ {
+ if (this == obj)
+ {
+ return true;
+ }
+ else if (obj != null && this.getClass() == obj.getClass())
+ {
+ Vec3i Vec3f = (Vec3i) obj;
+ if (Float.compare(Vec3f.x, this.x) != 0)
+ {
+ return false;
+ }
+ else if (Float.compare(Vec3f.y, this.y) != 0)
+ {
+ return false;
+ }
+ else
+ {
+ return Float.compare(Vec3f.z, this.z) == 0;
+ }
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ @Override
+ public int hashCode()
+ {
+ int i = Float.floatToIntBits(this.x);
+ i = 31 * i + Float.floatToIntBits(this.y);
+ return 31 * i + Float.floatToIntBits(this.z);
+ }
+
+ public void mul(float scalar)
+ {
+ this.x *= scalar;
+ this.y *= scalar;
+ this.z *= scalar;
+ }
+
+ public void mul(float x, float y, float z)
+ {
+ this.x *= x;
+ this.y *= y;
+ this.z *= z;
+ }
+
+ public void clamp(int min, int max)
+ {
+ this.x = LodUtil.clamp(min, this.x, max);
+ this.y = LodUtil.clamp(min, this.y, max);
+ this.z = LodUtil.clamp(min, this.z, max);
+ }
+
+ public void set(int x, int y, int z)
+ {
+ this.x = x;
+ this.y = y;
+ this.z = z;
+ }
+
+ public void add(int x, int y, int z)
+ {
+ this.x += x;
+ this.y += y;
+ this.z += z;
+ }
+
+ public void add(Vec3i vector)
+ {
+ this.x += vector.x;
+ this.y += vector.y;
+ this.z += vector.z;
+ }
+
+ public void subtract(Vec3i vector)
+ {
+ this.x -= vector.x;
+ this.y -= vector.y;
+ this.z -= vector.z;
+ }
+
+ public double distSqr(double x, double y, double z, boolean centerOfBlock)
+ {
+ double offset = centerOfBlock ? 0.5 : 0.0;
+ double xAdd = this.x + offset - x;
+ double yAdd = this.y + offset - y;
+ double zAdd = this.z + offset - z;
+ return (xAdd * xAdd) + (yAdd * yAdd) + (zAdd * zAdd);
+ }
+
+ public int distManhattan(Vector3i otherVec)
+ {
+ float xSub = Math.abs(otherVec.getX() - this.x);
+ float ySub = Math.abs(otherVec.getY() - this.y);
+ float zSub = Math.abs(otherVec.getZ() - this.z);
+ return (int) (xSub + ySub + zSub);
+ }
+
+ /** inner product */
+ public float dotProduct(Vec3i vector)
+ {
+ return (this.x * vector.x) + (this.y * vector.y) + (this.z * vector.z);
+ }
+
+ /** Cross product */
+ public Vec3i cross(Vec3i otherVec)
+ {
+ return new Vec3i(
+ (this.y * otherVec.z) - (this.z * otherVec.y),
+ (this.z * otherVec.x) - (this.x * otherVec.z),
+ (this.x * otherVec.y) - (this.y * otherVec.x));
+ }
+
+ public Vec3i copy()
+ {
+ return new Vec3i(this.x, this.y, this.z);
+ }
+
+
+
+ @Override
+ public String toString()
+ {
+ return "[" + this.x + ", " + this.y + ", " + this.z + "]";
+ }
+
+
+ // Forge start
+ public Vec3i(int[] values)
+ {
+ set(values);
+ }
+
+ public void set(int[] values)
+ {
+ this.x = values[0];
+ this.y = values[1];
+ this.z = values[2];
+ }
+}
diff --git a/src/main/java/com/seibel/lod/render/LodRenderer.java b/src/main/java/com/seibel/lod/render/LodRenderer.java
index fb78fa6c3..8466ab44e 100644
--- a/src/main/java/com/seibel/lod/render/LodRenderer.java
+++ b/src/main/java/com/seibel/lod/render/LodRenderer.java
@@ -38,8 +38,8 @@ import com.seibel.lod.handlers.ReflectionHandler;
import com.seibel.lod.lodApi.ApiShared;
import com.seibel.lod.objects.lod.LodDimension;
import com.seibel.lod.objects.lod.RegionPos;
+import com.seibel.lod.objects.math.Mat4f;
import com.seibel.lod.objects.opengl.LodVertexBuffer;
-import com.seibel.lod.objects.rending.Mat4f;
import com.seibel.lod.objects.rending.NearFarFogSettings;
import com.seibel.lod.proxy.GlProxy;
import com.seibel.lod.render.shader.LodShaderProgram;
diff --git a/src/main/java/com/seibel/lod/render/shader/LodShaderProgram.java b/src/main/java/com/seibel/lod/render/shader/LodShaderProgram.java
index ae0671c2b..6a1a58f6e 100644
--- a/src/main/java/com/seibel/lod/render/shader/LodShaderProgram.java
+++ b/src/main/java/com/seibel/lod/render/shader/LodShaderProgram.java
@@ -24,7 +24,7 @@ import java.nio.FloatBuffer;
import org.lwjgl.opengl.GL20;
import org.lwjgl.system.MemoryStack;
-import com.seibel.lod.objects.rending.Mat4f;
+import com.seibel.lod.objects.math.Mat4f;
/**
diff --git a/src/main/java/com/seibel/lod/util/LodUtil.java b/src/main/java/com/seibel/lod/util/LodUtil.java
index 8590837e3..fa9f0057f 100644
--- a/src/main/java/com/seibel/lod/util/LodUtil.java
+++ b/src/main/java/com/seibel/lod/util/LodUtil.java
@@ -23,10 +23,10 @@ import java.awt.Color;
import java.io.File;
import java.util.HashSet;
-import com.seibel.lod.builders.bufferBuilding.lodTemplates.Box;
import com.seibel.lod.config.LodConfig;
import com.seibel.lod.enums.config.HorizontalResolution;
import com.seibel.lod.enums.config.VanillaOverdraw;
+import com.seibel.lod.objects.Box;
import com.seibel.lod.objects.lod.LodDimension;
import com.seibel.lod.objects.lod.RegionPos;
import com.seibel.lod.objects.opengl.DefaultLodVertexFormats;
diff --git a/src/main/java/com/seibel/lod/util/ThreadMapUtil.java b/src/main/java/com/seibel/lod/util/ThreadMapUtil.java
index 8d7f705fd..14ecafcdd 100644
--- a/src/main/java/com/seibel/lod/util/ThreadMapUtil.java
+++ b/src/main/java/com/seibel/lod/util/ThreadMapUtil.java
@@ -25,7 +25,7 @@ import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
-import com.seibel.lod.builders.bufferBuilding.lodTemplates.Box;
+import com.seibel.lod.objects.Box;
import net.minecraft.util.Direction;
diff --git a/src/main/java/com/seibel/lod/wrappers/McObjectConverter.java b/src/main/java/com/seibel/lod/wrappers/McObjectConverter.java
index 9336dd98d..10c16d1aa 100644
--- a/src/main/java/com/seibel/lod/wrappers/McObjectConverter.java
+++ b/src/main/java/com/seibel/lod/wrappers/McObjectConverter.java
@@ -21,7 +21,7 @@ package com.seibel.lod.wrappers;
import java.nio.FloatBuffer;
-import com.seibel.lod.objects.rending.Mat4f;
+import com.seibel.lod.objects.math.Mat4f;
import net.minecraft.util.math.vector.Matrix4f;