]> git.lizzy.rs Git - BoundingBoxOutlineReloaded.git/commitdiff
Fix Z-ordering of boxes
authorIrtimaled <irtimaled@gmail.com>
Sun, 7 Jun 2020 19:40:34 +0000 (12:40 -0700)
committerIrtimaled <irtimaled@gmail.com>
Thu, 25 Jun 2020 22:57:35 +0000 (15:57 -0700)
12 files changed:
src/main/java/com/irtimaled/bbor/client/ClientRenderer.java
src/main/java/com/irtimaled/bbor/client/models/BoundingBoxBiomeBorder.java
src/main/java/com/irtimaled/bbor/client/models/BoundingBoxLine.java
src/main/java/com/irtimaled/bbor/client/models/BoundingBoxSpawnableBlocks.java
src/main/java/com/irtimaled/bbor/client/models/BoundingBoxSphere.java
src/main/java/com/irtimaled/bbor/client/renderers/AbstractRenderer.java
src/main/java/com/irtimaled/bbor/client/renderers/ConduitRenderer.java
src/main/java/com/irtimaled/bbor/client/renderers/Renderer.java
src/main/java/com/irtimaled/bbor/client/renderers/SpawningSphereRenderer.java
src/main/java/com/irtimaled/bbor/common/MathHelper.java
src/main/java/com/irtimaled/bbor/common/models/AbstractBoundingBox.java
src/main/java/com/irtimaled/bbor/common/models/BoundingBoxCuboid.java

index c80ea92d1030bd7d6c550da4f7bbae450797eea8..e8f2b15bc1a1e9139857090b11ecd9a856375df2 100644 (file)
@@ -11,10 +11,8 @@ import com.irtimaled.bbor.common.models.BoundingBoxCuboid;
 import com.irtimaled.bbor.common.models.DimensionId;
 import org.lwjgl.opengl.GL11;
 
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
+import java.util.stream.Stream;
 
 public class ClientRenderer {
     private static final int CHUNK_SIZE = 16;
@@ -86,8 +84,6 @@ public class ClientRenderer {
     public static void render(DimensionId dimensionId) {
         if (!active) return;
 
-        Set<AbstractBoundingBox> boundingBoxes = getBoundingBoxes(dimensionId);
-
         GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
         GL11.glLineWidth(2.0f);
         GL11.glDisable(GL11.GL_TEXTURE_2D);
@@ -98,29 +94,32 @@ public class ClientRenderer {
             GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT);
         }
 
-        for (AbstractBoundingBox key : boundingBoxes) {
+        getBoundingBoxes(dimensionId).forEach(key -> {
             AbstractRenderer renderer = boundingBoxRendererMap.get(key.getClass());
-            if (renderer == null) continue;
-
-            renderer.render(key);
-        }
+            if (renderer != null) renderer.render(key);
+        });
 
         GL11.glPolygonMode(GL11.GL_FRONT_AND_BACK, GL11.GL_FILL);
         GL11.glEnable(GL11.GL_CULL_FACE);
         GL11.glEnable(GL11.GL_TEXTURE_2D);
     }
 
-    private static Set<AbstractBoundingBox> getBoundingBoxes(DimensionId dimensionId) {
-        Set<AbstractBoundingBox> boundingBoxes = new HashSet<>();
+    public static Stream<AbstractBoundingBox> getBoundingBoxes(DimensionId dimensionId) {
+        Stream.Builder<AbstractBoundingBox> boundingBoxes = Stream.builder();
         for (IBoundingBoxProvider<?> provider : providers) {
             if (provider.canProvide(dimensionId)) {
                 for (AbstractBoundingBox boundingBox : provider.get(dimensionId)) {
                     if (isWithinRenderDistance(boundingBox)) {
-                        boundingBoxes.add(boundingBox);
+                        boundingBoxes.accept(boundingBox);
                     }
                 }
             }
         }
-        return boundingBoxes;
+
+        Point point = Player.getPoint();
+        return boundingBoxes.build()
+                .sorted(Comparator
+                        .comparingDouble((AbstractBoundingBox boundingBox) -> boundingBox.getDistance(point.getX(), point.getY(), point.getZ())).reversed());
     }
+
 }
index e4c4013cc7e7dd1cec0eecd191b2c371917d2723..c8f7e5e3c902908b03fade24774022136e2d6c96 100644 (file)
@@ -32,6 +32,21 @@ public class BoundingBoxBiomeBorder extends AbstractBoundingBox {
                 coords.getZ() <= maxZ;
     }
 
+    @Override
+    protected double getDistanceX(double x) {
+        return x - coords.getX();
+    }
+
+    @Override
+    protected double getDistanceY(double y) {
+        return y - coords.getY();
+    }
+
+    @Override
+    protected double getDistanceZ(double z) {
+        return z - coords.getZ();
+    }
+
     public Coords getCoords() {
         return coords;
     }
index 733efe4e90e94e40746f7cf6fba8d40ed2b9c0bb..7dbe24d3391eb1fe16666b933dd5eee5d04bc067 100644 (file)
@@ -1,6 +1,7 @@
 package com.irtimaled.bbor.client.models;
 
 import com.irtimaled.bbor.common.BoundingBoxType;
+import com.irtimaled.bbor.common.MathHelper;
 import com.irtimaled.bbor.common.TypeHelper;
 import com.irtimaled.bbor.common.models.AbstractBoundingBox;
 
@@ -89,6 +90,21 @@ public class BoundingBoxLine extends AbstractBoundingBox {
                 (maxXWithinBounds && minZWithinBounds);
     }
 
+    @Override
+    protected double getDistanceX(double x) {
+        return x - MathHelper.clamp(x, minPoint.getX(), maxPoint.getX());
+    }
+
+    @Override
+    protected double getDistanceY(double y) {
+        return y - MathHelper.clamp(y, minPoint.getY(), maxPoint.getY());
+    }
+
+    @Override
+    protected double getDistanceZ(double z) {
+        return z - MathHelper.clamp(z, minPoint.getZ(), maxPoint.getZ());
+    }
+
     private boolean isBetween(double val, int min, int max) {
         return val >= min && val <= max;
     }
index 889f2afd7360db99983e89c5d09defc2bcdc2e97..3d9037ed0335ef74326bc2246aac4981aa413cfc 100644 (file)
@@ -22,4 +22,19 @@ public class BoundingBoxSpawnableBlocks extends AbstractBoundingBox {
     public Boolean intersectsBounds(int minX, int minZ, int maxX, int maxZ) {
         return true;
     }
+
+    @Override
+    protected double getDistanceX(double x) {
+        return 0;
+    }
+
+    @Override
+    protected double getDistanceY(double y) {
+        return 0;
+    }
+
+    @Override
+    protected double getDistanceZ(double z) {
+        return 0;
+    }
 }
index 3fb8d0800e6f68507cf2170fa7f9a931ae658325..0fdb1f1c0bed39f659be912b4d007283e34931c0 100644 (file)
@@ -32,6 +32,21 @@ public class BoundingBoxSphere extends AbstractBoundingBox {
                 this.minZ <= maxZ;
     }
 
+    @Override
+    protected double getDistanceX(double x) {
+        return x - point.getX();
+    }
+
+    @Override
+    protected double getDistanceY(double y) {
+        return y - point.getY();
+    }
+
+    @Override
+    protected double getDistanceZ(double z) {
+        return z - point.getZ();
+    }
+
     public double getRadius() {
         return radius;
     }
index f3ab3b044680c2a10a3473d43389c3f295d0ab22..40161d82403aac09ebcb9cc1cc9c37b43824288a 100644 (file)
@@ -18,10 +18,10 @@ public abstract class AbstractRenderer<T extends AbstractBoundingBox> {
 
     void renderCuboid(OffsetBox bb, Color color) {
         OffsetBox nudge = bb.nudge();
+        renderOutlinedCuboid(nudge, color);
         if (ConfigManager.fill.get()) {
             renderFilledFaces(nudge.getMin(), nudge.getMax(), color, 30);
         }
-        renderOutlinedCuboid(nudge, color);
     }
 
     void renderOutlinedCuboid(OffsetBox bb, Color color) {
index 95fe01f8930dbc94243aa5d2e98ffaf3db8af3b2..a03a34c70d67d2f3db7766ceea7de4244696c09b 100644 (file)
@@ -15,6 +15,10 @@ public class ConduitRenderer extends AbstractRenderer<BoundingBoxConduit> {
         Point point = boundingBox.getPoint();
         Color color = BoundingBoxTypeHelper.getColor(boundingBox.getType());
 
+        if (level != 0) {
+            renderSphere(point, boundingBox.getRadius() + 0.5, color, 5, 5);
+        }
+
         OffsetPoint center = new OffsetPoint(point);
         OffsetBox centerBox = new OffsetBox(center, center).grow(0.5, 0.5, 0.5);
         renderCuboid(centerBox, color);
@@ -22,8 +26,5 @@ public class ConduitRenderer extends AbstractRenderer<BoundingBoxConduit> {
             renderCuboid(centerBox.grow(8, 8, 8),
                     ColorHelper.getColor(ConfigManager.colorConduitMobHarmArea));
         }
-        if (level != 0) {
-            renderSphere(point, boundingBox.getRadius() + 0.5, color, 5, 5);
-        }
     }
 }
index b6ea2c7606e07c06bb47f81572ee79d9aed62250..3a0419aaf083ff9365a9dcb1496ea9c8f42f5c3a 100644 (file)
@@ -1,5 +1,6 @@
 package com.irtimaled.bbor.client.renderers;
 
+import com.irtimaled.bbor.client.Camera;
 import net.minecraft.client.renderer.BufferBuilder;
 import net.minecraft.client.renderer.Tessellator;
 import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
@@ -9,6 +10,8 @@ import org.lwjgl.opengl.GL11;
 import java.awt.*;
 
 public class Renderer {
+    private final int glMode;
+
     static Renderer startLines() {
         return new Renderer(GL11.GL_LINES, DefaultVertexFormats.POSITION_COLOR);
     }
@@ -29,8 +32,8 @@ public class Renderer {
         return new Renderer(GL11.GL_QUADS, DefaultVertexFormats.POSITION_TEX_COLOR);
     }
 
-    private final Tessellator tessellator;
-    private final BufferBuilder bufferBuilder;
+    private static final Tessellator tessellator = new Tessellator(2097152);
+    private static final BufferBuilder bufferBuilder = tessellator.getBuffer();
 
     private int red;
     private int green;
@@ -38,9 +41,8 @@ public class Renderer {
     private int alpha;
 
     private Renderer(int glMode, VertexFormat vertexFormat) {
-        tessellator = Tessellator.getInstance();
-        bufferBuilder = tessellator.getBuffer();
         bufferBuilder.begin(glMode, vertexFormat);
+        this.glMode = glMode;
     }
 
     public Renderer setColor(Color color) {
@@ -88,6 +90,9 @@ public class Renderer {
     }
 
     public void render() {
+        if (glMode == GL11.GL_QUADS) {
+            bufferBuilder.sortVertexData((float) Camera.getX(), (float) Camera.getY(), (float) Camera.getZ());
+        }
         tessellator.draw();
     }
 
index 6d07100ae6c3eae9fba5c2ad06797185f16242b7..519e59ab21d9be3805dd56ee0dd704dd6601c6a1 100644 (file)
@@ -17,8 +17,12 @@ public class SpawningSphereRenderer extends AbstractRenderer<BoundingBoxSpawning
         Point point = boundingBox.getPoint();
         OffsetPoint sphereCenter = new OffsetPoint(point);
 
-        OffsetBox offsetBox = new OffsetBox(sphereCenter, sphereCenter).grow(0.5, 0, 0.5);
         Color safeAreaColor = ColorHelper.getColor(ConfigManager.colorAFKSpheresSafeArea);
+        renderSphere(point, BoundingBoxSpawningSphere.SAFE_RADIUS, safeAreaColor, 5, 5);
+
+        renderOuterSphere(boundingBox, point);
+
+        OffsetBox offsetBox = new OffsetBox(sphereCenter, sphereCenter).grow(0.5, 0, 0.5);
         renderCuboid(offsetBox, safeAreaColor);
 
         Integer spawnableSpacesCount = boundingBox.getSpawnableSpacesCount();
@@ -29,10 +33,6 @@ public class SpawningSphereRenderer extends AbstractRenderer<BoundingBoxSpawning
                             String.format("%,d", spawnableSpacesCount));
         }
 
-        renderSphere(point, BoundingBoxSpawningSphere.SAFE_RADIUS, safeAreaColor, 5, 5);
-
-        renderOuterSphere(boundingBox, point);
-
         if (ConfigManager.renderAFKSpawnableBlocks.get() && boundingBox.isWithinSphere(Player.getPoint())) {
             renderSpawnableSpaces(boundingBox);
         }
index 9548239c0cc465a697bd2d2425b2cb5dd75a6313..885ed7e1861935a1ede0c2ec982f63fcb51e34f7 100644 (file)
@@ -14,4 +14,14 @@ public class MathHelper {
         if (fraction % midpoint == 1) fraction++;
         return floor + (fraction / multiplier);
     }
+
+    public static int clamp(int value, int min, int max) {
+        if (value < min) return min;
+        return Math.min(value, max);
+    }
+
+    public static double clamp(double value, double min, double max) {
+        if (value < min) return min;
+        return Math.min(value, max);
+    }
 }
index 76a3f0b7348e20ba7e9b14d337776cf9f78cf553..e4852d0fb04ee27ae46d01f0c291b89ecbeea031 100644 (file)
@@ -14,4 +14,17 @@ public abstract class AbstractBoundingBox {
     public BoundingBoxType getType() {
         return type;
     }
+
+    public double getDistance(double x, double y, double z) {
+        double dX = getDistanceX(x);
+        double dY = getDistanceY(y);
+        double dZ = getDistanceZ(z);
+        return Math.cbrt(dX * dX + dY * dY + dZ * dZ);
+    }
+
+    protected abstract double getDistanceX(double x);
+
+    protected abstract double getDistanceY(double y);
+
+    protected abstract double getDistanceZ(double z);
 }
index d5a15d4043dab77de99bc5735702ef4610e9e77c..765a0653fc45e795bd2494f14e6189590e16cc35 100644 (file)
@@ -1,6 +1,7 @@
 package com.irtimaled.bbor.common.models;
 
 import com.irtimaled.bbor.common.BoundingBoxType;
+import com.irtimaled.bbor.common.MathHelper;
 import com.irtimaled.bbor.common.TypeHelper;
 
 public class BoundingBoxCuboid extends AbstractBoundingBox {
@@ -54,4 +55,19 @@ public class BoundingBoxCuboid extends AbstractBoundingBox {
     private boolean isBetween(int val, int min, int max) {
         return val >= min && val <= max;
     }
+
+    @Override
+    public double getDistanceX(double x) {
+        return x - MathHelper.clamp(x, minCoords.getX(), maxCoords.getX());
+    }
+
+    @Override
+    public double getDistanceY(double y) {
+        return y - MathHelper.clamp(y, minCoords.getY(), maxCoords.getY());
+    }
+
+    @Override
+    public double getDistanceZ(double z) {
+        return z - MathHelper.clamp(z, minCoords.getZ(), maxCoords.getZ());
+    }
 }