From: ishland Date: Tue, 3 Aug 2021 15:54:05 +0000 (+0800) Subject: General performance improvements X-Git-Url: https://git.lizzy.rs/?a=commitdiff_plain;h=a6ee7e8e342c031cb5c385c145999ce7c6fc4b08;p=BoundingBoxOutlineReloaded.git General performance improvements --- diff --git a/src/main/java/com/irtimaled/bbor/client/ClientRenderer.java b/src/main/java/com/irtimaled/bbor/client/ClientRenderer.java index 2073e1d..76af6f2 100644 --- a/src/main/java/com/irtimaled/bbor/client/ClientRenderer.java +++ b/src/main/java/com/irtimaled/bbor/client/ClientRenderer.java @@ -1,18 +1,6 @@ package com.irtimaled.bbor.client; import com.irtimaled.bbor.client.interop.ClientInterop; -import com.irtimaled.bbor.client.models.BoundingBoxBeacon; -import com.irtimaled.bbor.client.models.BoundingBoxBedrockCeiling; -import com.irtimaled.bbor.client.models.BoundingBoxBiomeBorder; -import com.irtimaled.bbor.client.models.BoundingBoxConduit; -import com.irtimaled.bbor.client.models.BoundingBoxFlowerForest; -import com.irtimaled.bbor.client.models.BoundingBoxLine; -import com.irtimaled.bbor.client.models.BoundingBoxMobSpawner; -import com.irtimaled.bbor.client.models.BoundingBoxSlimeChunk; -import com.irtimaled.bbor.client.models.BoundingBoxSpawnableBlocks; -import com.irtimaled.bbor.client.models.BoundingBoxSpawningSphere; -import com.irtimaled.bbor.client.models.BoundingBoxSphere; -import com.irtimaled.bbor.client.models.BoundingBoxWorldSpawn; import com.irtimaled.bbor.client.models.Point; import com.irtimaled.bbor.client.providers.BeaconProvider; import com.irtimaled.bbor.client.providers.BedrockCeilingProvider; @@ -31,38 +19,27 @@ import com.irtimaled.bbor.client.providers.SpawnableBlocksProvider; import com.irtimaled.bbor.client.providers.SpawningSphereProvider; import com.irtimaled.bbor.client.providers.WorldSpawnProvider; import com.irtimaled.bbor.client.renderers.AbstractRenderer; -import com.irtimaled.bbor.client.renderers.BeaconRenderer; -import com.irtimaled.bbor.client.renderers.BiomeBorderRenderer; -import com.irtimaled.bbor.client.renderers.ConduitRenderer; -import com.irtimaled.bbor.client.renderers.CuboidRenderer; -import com.irtimaled.bbor.client.renderers.FlowerForestRenderer; -import com.irtimaled.bbor.client.renderers.LineRenderer; -import com.irtimaled.bbor.client.renderers.MobSpawnerRenderer; import com.irtimaled.bbor.client.renderers.RenderHelper; import com.irtimaled.bbor.client.renderers.RenderQueue; -import com.irtimaled.bbor.client.renderers.SlimeChunkRenderer; -import com.irtimaled.bbor.client.renderers.SpawnableBlocksRenderer; -import com.irtimaled.bbor.client.renderers.SpawningSphereRenderer; -import com.irtimaled.bbor.client.renderers.SphereRenderer; -import com.irtimaled.bbor.client.renderers.WorldSpawnRenderer; import com.irtimaled.bbor.common.MathHelper; import com.irtimaled.bbor.common.TypeHelper; import com.irtimaled.bbor.common.models.AbstractBoundingBox; -import com.irtimaled.bbor.common.models.BoundingBoxCuboid; import com.irtimaled.bbor.common.models.DimensionId; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import net.minecraft.client.util.math.MatrixStack; +import java.util.ArrayList; import java.util.Comparator; -import java.util.HashMap; import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.atomic.AtomicLong; -import java.util.stream.Stream; public class ClientRenderer { private static final int CHUNK_SIZE = 16; - private static final Map, AbstractRenderer> boundingBoxRendererMap = new HashMap<>(); + private static final Map, AbstractRenderer> boundingBoxRendererMap = new Object2ObjectOpenHashMap<>(); private static boolean active; private static final Set providers = new HashSet<>(); @@ -85,19 +62,14 @@ public class ClientRenderer { } static { - registerRenderer(BoundingBoxSlimeChunk.class, new SlimeChunkRenderer()); - registerRenderer(BoundingBoxWorldSpawn.class, new WorldSpawnRenderer()); - registerRenderer(BoundingBoxCuboid.class, new CuboidRenderer()); - registerRenderer(BoundingBoxMobSpawner.class, new MobSpawnerRenderer()); - registerRenderer(BoundingBoxSpawningSphere.class, new SpawningSphereRenderer()); - registerRenderer(BoundingBoxBeacon.class, new BeaconRenderer()); - registerRenderer(BoundingBoxBiomeBorder.class, new BiomeBorderRenderer()); - registerRenderer(BoundingBoxConduit.class, new ConduitRenderer()); - registerRenderer(BoundingBoxSpawnableBlocks.class, new SpawnableBlocksRenderer()); - registerRenderer(BoundingBoxLine.class, new LineRenderer()); - registerRenderer(BoundingBoxSphere.class, new SphereRenderer()); - registerRenderer(BoundingBoxFlowerForest.class, new FlowerForestRenderer()); - registerRenderer(BoundingBoxBedrockCeiling.class, new CuboidRenderer()); + + + + + + + + registerProvider(new SlimeChunkProvider()); registerProvider(new WorldSpawnProvider()); @@ -119,8 +91,13 @@ public class ClientRenderer { providers.add(provider); } - public static void registerRenderer(Class type, AbstractRenderer renderer) { + public static AbstractRenderer registerRenderer(Class type, AbstractRenderer renderer) { boundingBoxRendererMap.put(type, renderer); + return renderer; + } + + public static AbstractRenderer getRenderer(Class clazz) { + return boundingBoxRendererMap.get(clazz); } private static boolean isWithinRenderDistance(AbstractBoundingBox boundingBox) { @@ -141,7 +118,7 @@ public class ClientRenderer { RenderHelper.beforeRender(); getBoundingBoxes(dimensionId).forEach(key -> { - AbstractRenderer renderer = boundingBoxRendererMap.get(key.getClass()); + AbstractRenderer renderer = key.getRenderer(); if (renderer != null) renderer.render(matrixStack, key); }); @@ -152,22 +129,23 @@ public class ClientRenderer { lastDurationNanos.set(System.nanoTime() - startTime); } - public static Stream getBoundingBoxes(DimensionId dimensionId) { - Stream.Builder boundingBoxes = Stream.builder(); + public static List getBoundingBoxes(DimensionId dimensionId) { + List tmp = new LinkedList<>(); for (IBoundingBoxProvider provider : providers) { if (provider.canProvide(dimensionId)) { for (AbstractBoundingBox boundingBox : provider.get(dimensionId)) { if (isWithinRenderDistance(boundingBox)) { - boundingBoxes.accept(boundingBox); + tmp.add(boundingBox); } } } } Point point = Player.getPoint(); - return boundingBoxes.build() - .sorted(Comparator - .comparingDouble((AbstractBoundingBox boundingBox) -> boundingBox.getDistance(point.getX(), point.getY(), point.getZ())).reversed()); + final ArrayList result = new ArrayList<>(tmp); + result.sort(Comparator.comparingDouble((AbstractBoundingBox boundingBox) -> boundingBox.getDistance(point.getX(), point.getY(), point.getZ())).reversed()); + + return result; } public static void clear() { diff --git a/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxBeacon.java b/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxBeacon.java index cb285ae..7e4575f 100644 --- a/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxBeacon.java +++ b/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxBeacon.java @@ -1,10 +1,15 @@ package com.irtimaled.bbor.client.models; +import com.irtimaled.bbor.client.ClientRenderer; +import com.irtimaled.bbor.client.renderers.AbstractRenderer; +import com.irtimaled.bbor.client.renderers.BeaconRenderer; import com.irtimaled.bbor.common.BoundingBoxType; import com.irtimaled.bbor.common.models.BoundingBoxCuboid; import com.irtimaled.bbor.common.models.Coords; public class BoundingBoxBeacon extends BoundingBoxCuboid { + private static final AbstractRenderer RENDERER = ClientRenderer.registerRenderer(BoundingBoxBeacon.class, new BeaconRenderer()); + private final Coords coords; private final int level; @@ -45,4 +50,9 @@ public class BoundingBoxBeacon extends BoundingBoxCuboid { public int getLevel() { return level; } + + @Override + public AbstractRenderer getRenderer() { + return RENDERER; + } } diff --git a/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxBedrockCeiling.java b/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxBedrockCeiling.java index d661c52..62e0ddd 100644 --- a/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxBedrockCeiling.java +++ b/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxBedrockCeiling.java @@ -1,11 +1,21 @@ package com.irtimaled.bbor.client.models; +import com.irtimaled.bbor.client.ClientRenderer; +import com.irtimaled.bbor.client.renderers.AbstractRenderer; +import com.irtimaled.bbor.client.renderers.CuboidRenderer; import com.irtimaled.bbor.common.BoundingBoxType; import com.irtimaled.bbor.common.models.BoundingBoxCuboid; import com.irtimaled.bbor.common.models.Coords; public class BoundingBoxBedrockCeiling extends BoundingBoxCuboid { + private static final AbstractRenderer RENDERER = ClientRenderer.registerRenderer(BoundingBoxBedrockCeiling.class, new CuboidRenderer()); + public BoundingBoxBedrockCeiling(Coords coords) { super(coords, coords, BoundingBoxType.BedrockCeiling); } + + @Override + public AbstractRenderer getRenderer() { + return RENDERER; + } } diff --git a/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxBiomeBorder.java b/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxBiomeBorder.java index 63c92e1..e7b4481 100644 --- a/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxBiomeBorder.java +++ b/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxBiomeBorder.java @@ -1,10 +1,15 @@ package com.irtimaled.bbor.client.models; +import com.irtimaled.bbor.client.ClientRenderer; +import com.irtimaled.bbor.client.renderers.AbstractRenderer; +import com.irtimaled.bbor.client.renderers.BiomeBorderRenderer; import com.irtimaled.bbor.common.BoundingBoxType; import com.irtimaled.bbor.common.models.AbstractBoundingBox; import com.irtimaled.bbor.common.models.Coords; public class BoundingBoxBiomeBorder extends AbstractBoundingBox { + private static final AbstractRenderer RENDERER = ClientRenderer.registerRenderer(BoundingBoxBiomeBorder.class, new BiomeBorderRenderer()); + private final Coords coords; private final boolean north; private final boolean east; @@ -63,4 +68,8 @@ public class BoundingBoxBiomeBorder extends AbstractBoundingBox { return west; } + @Override + public AbstractRenderer getRenderer() { + return RENDERER; + } } diff --git a/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxConduit.java b/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxConduit.java index 4df25b2..bdbf3c6 100644 --- a/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxConduit.java +++ b/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxConduit.java @@ -1,10 +1,15 @@ package com.irtimaled.bbor.client.models; +import com.irtimaled.bbor.client.ClientRenderer; +import com.irtimaled.bbor.client.renderers.AbstractRenderer; +import com.irtimaled.bbor.client.renderers.ConduitRenderer; import com.irtimaled.bbor.common.BoundingBoxType; import com.irtimaled.bbor.common.TypeHelper; import com.irtimaled.bbor.common.models.Coords; public class BoundingBoxConduit extends BoundingBoxSphere { + private static final AbstractRenderer RENDERER = ClientRenderer.registerRenderer(BoundingBoxConduit.class, new ConduitRenderer()); + private final int level; private BoundingBoxConduit(Coords coords, int level, int radius) { @@ -33,4 +38,9 @@ public class BoundingBoxConduit extends BoundingBoxSphere { public int getLevel() { return level; } + + @Override + public AbstractRenderer getRenderer() { + return RENDERER; + } } diff --git a/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxFlowerForest.java b/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxFlowerForest.java index 2f598cd..e13e386 100644 --- a/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxFlowerForest.java +++ b/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxFlowerForest.java @@ -1,8 +1,11 @@ package com.irtimaled.bbor.client.models; +import com.irtimaled.bbor.client.ClientRenderer; import com.irtimaled.bbor.client.config.ColorHelper; import com.irtimaled.bbor.client.config.HexColor; import com.irtimaled.bbor.client.config.Setting; +import com.irtimaled.bbor.client.renderers.AbstractRenderer; +import com.irtimaled.bbor.client.renderers.FlowerForestRenderer; import com.irtimaled.bbor.common.BoundingBoxType; import com.irtimaled.bbor.common.models.AbstractBoundingBox; import com.irtimaled.bbor.common.models.Coords; @@ -10,6 +13,8 @@ import com.irtimaled.bbor.common.models.Coords; import java.awt.*; public class BoundingBoxFlowerForest extends AbstractBoundingBox { + private static final AbstractRenderer RENDERER = ClientRenderer.registerRenderer(BoundingBoxFlowerForest.class, new FlowerForestRenderer()); + private final Coords coords; private final Setting colorSetting; @@ -46,4 +51,9 @@ public class BoundingBoxFlowerForest extends AbstractBoundingBox { public double getDistanceZ(double z) { return z - coords.getZ(); } + + @Override + public AbstractRenderer getRenderer() { + return RENDERER; + } } diff --git a/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxLine.java b/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxLine.java index 7dbe24d..26ba5b7 100644 --- a/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxLine.java +++ b/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxLine.java @@ -1,11 +1,16 @@ package com.irtimaled.bbor.client.models; +import com.irtimaled.bbor.client.ClientRenderer; +import com.irtimaled.bbor.client.renderers.AbstractRenderer; +import com.irtimaled.bbor.client.renderers.LineRenderer; 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; public class BoundingBoxLine extends AbstractBoundingBox { + private static final AbstractRenderer RENDERER = ClientRenderer.registerRenderer(BoundingBoxLine.class, new LineRenderer()); + private final Point minPoint; private final Point maxPoint; private final Double width; @@ -108,4 +113,9 @@ public class BoundingBoxLine extends AbstractBoundingBox { private boolean isBetween(double val, int min, int max) { return val >= min && val <= max; } + + @Override + public AbstractRenderer getRenderer() { + return RENDERER; + } } diff --git a/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxMobSpawner.java b/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxMobSpawner.java index cc6c76a..71e919e 100644 --- a/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxMobSpawner.java +++ b/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxMobSpawner.java @@ -1,10 +1,15 @@ package com.irtimaled.bbor.client.models; +import com.irtimaled.bbor.client.ClientRenderer; +import com.irtimaled.bbor.client.renderers.AbstractRenderer; +import com.irtimaled.bbor.client.renderers.MobSpawnerRenderer; import com.irtimaled.bbor.common.BoundingBoxType; import com.irtimaled.bbor.common.models.BoundingBoxCuboid; import com.irtimaled.bbor.common.models.Coords; public class BoundingBoxMobSpawner extends BoundingBoxCuboid { + private static final AbstractRenderer RENDERER = ClientRenderer.registerRenderer(BoundingBoxMobSpawner.class, new MobSpawnerRenderer()); + private final Coords coords; private BoundingBoxMobSpawner(Coords coords, Coords minCoords, Coords maxCoords) { @@ -25,4 +30,9 @@ public class BoundingBoxMobSpawner extends BoundingBoxCuboid { public Coords getCoords() { return coords; } + + @Override + public AbstractRenderer getRenderer() { + return RENDERER; + } } diff --git a/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxSlimeChunk.java b/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxSlimeChunk.java index 09ec81a..cd7470b 100644 --- a/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxSlimeChunk.java +++ b/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxSlimeChunk.java @@ -1,13 +1,18 @@ package com.irtimaled.bbor.client.models; +import com.irtimaled.bbor.client.ClientRenderer; import com.irtimaled.bbor.client.Player; import com.irtimaled.bbor.client.config.ConfigManager; +import com.irtimaled.bbor.client.renderers.AbstractRenderer; +import com.irtimaled.bbor.client.renderers.SlimeChunkRenderer; import com.irtimaled.bbor.common.BoundingBoxType; import com.irtimaled.bbor.common.MathHelper; import com.irtimaled.bbor.common.models.BoundingBoxCuboid; import com.irtimaled.bbor.common.models.Coords; public class BoundingBoxSlimeChunk extends BoundingBoxCuboid { + private static final AbstractRenderer RENDERER = ClientRenderer.registerRenderer(BoundingBoxSlimeChunk.class, new SlimeChunkRenderer()); + public BoundingBoxSlimeChunk(Coords minCoords, Coords maxCoords) { super(minCoords, maxCoords, BoundingBoxType.SlimeChunks); } @@ -20,4 +25,9 @@ public class BoundingBoxSlimeChunk extends BoundingBoxCuboid { else return super.getDistanceY(y); } + + @Override + public AbstractRenderer getRenderer() { + return RENDERER; + } } diff --git a/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxSpawnableBlocks.java b/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxSpawnableBlocks.java index 3d9037e..797481f 100644 --- a/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxSpawnableBlocks.java +++ b/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxSpawnableBlocks.java @@ -1,5 +1,8 @@ package com.irtimaled.bbor.client.models; +import com.irtimaled.bbor.client.ClientRenderer; +import com.irtimaled.bbor.client.renderers.AbstractRenderer; +import com.irtimaled.bbor.client.renderers.SpawnableBlocksRenderer; import com.irtimaled.bbor.common.BoundingBoxType; import com.irtimaled.bbor.common.models.AbstractBoundingBox; import net.minecraft.util.math.BlockPos; @@ -8,6 +11,8 @@ import java.util.HashSet; import java.util.Set; public class BoundingBoxSpawnableBlocks extends AbstractBoundingBox { + private static final AbstractRenderer RENDERER = ClientRenderer.registerRenderer(BoundingBoxSpawnableBlocks.class, new SpawnableBlocksRenderer()); + private final Set blocks = new HashSet<>(); public BoundingBoxSpawnableBlocks() { @@ -37,4 +42,9 @@ public class BoundingBoxSpawnableBlocks extends AbstractBoundingBox { protected double getDistanceZ(double z) { return 0; } + + @Override + public AbstractRenderer getRenderer() { + return RENDERER; + } } diff --git a/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxSpawningSphere.java b/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxSpawningSphere.java index 5d3087e..47a2e3a 100644 --- a/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxSpawningSphere.java +++ b/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxSpawningSphere.java @@ -1,5 +1,8 @@ package com.irtimaled.bbor.client.models; +import com.irtimaled.bbor.client.ClientRenderer; +import com.irtimaled.bbor.client.renderers.AbstractRenderer; +import com.irtimaled.bbor.client.renderers.SpawningSphereRenderer; import com.irtimaled.bbor.common.BoundingBoxType; import net.minecraft.util.math.BlockPos; @@ -7,6 +10,8 @@ import java.util.HashSet; import java.util.Set; public class BoundingBoxSpawningSphere extends BoundingBoxSphere { + private static final AbstractRenderer RENDERER = ClientRenderer.registerRenderer(BoundingBoxSpawningSphere.class, new SpawningSphereRenderer()); + public static final int SAFE_RADIUS = 24; public static final int SPAWN_RADIUS = 128; @@ -32,4 +37,9 @@ public class BoundingBoxSpawningSphere extends BoundingBoxSphere { public Integer getSpawnableSpacesCount() { return this.spawnableCount; } + + @Override + public AbstractRenderer getRenderer() { + return RENDERER; + } } diff --git a/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxSphere.java b/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxSphere.java index 0fdb1f1..8b4b9b5 100644 --- a/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxSphere.java +++ b/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxSphere.java @@ -1,10 +1,15 @@ package com.irtimaled.bbor.client.models; +import com.irtimaled.bbor.client.ClientRenderer; +import com.irtimaled.bbor.client.renderers.AbstractRenderer; +import com.irtimaled.bbor.client.renderers.SphereRenderer; import com.irtimaled.bbor.common.BoundingBoxType; import com.irtimaled.bbor.common.models.AbstractBoundingBox; import com.irtimaled.bbor.common.models.Coords; public class BoundingBoxSphere extends AbstractBoundingBox { + private static final AbstractRenderer RENDERER = ClientRenderer.registerRenderer(BoundingBoxSphere.class, new SphereRenderer()); + private final double radius; private final double minX; private final double minZ; diff --git a/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxWorldSpawn.java b/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxWorldSpawn.java index 7715a42..89de627 100644 --- a/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxWorldSpawn.java +++ b/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxWorldSpawn.java @@ -1,11 +1,21 @@ package com.irtimaled.bbor.client.models; +import com.irtimaled.bbor.client.ClientRenderer; +import com.irtimaled.bbor.client.renderers.AbstractRenderer; +import com.irtimaled.bbor.client.renderers.WorldSpawnRenderer; import com.irtimaled.bbor.common.BoundingBoxType; import com.irtimaled.bbor.common.models.BoundingBoxCuboid; import com.irtimaled.bbor.common.models.Coords; public class BoundingBoxWorldSpawn extends BoundingBoxCuboid { + private static final AbstractRenderer RENDERER = ClientRenderer.registerRenderer(BoundingBoxWorldSpawn.class, new WorldSpawnRenderer()); + public BoundingBoxWorldSpawn(Coords minCoords, Coords maxCoords, BoundingBoxType type) { super(minCoords, maxCoords, type); } + + @Override + public AbstractRenderer getRenderer() { + return RENDERER; + } } diff --git a/src/main/java/com/irtimaled/bbor/client/providers/FlowerForestProvider.java b/src/main/java/com/irtimaled/bbor/client/providers/FlowerForestProvider.java index 1ca34ec..1677205 100644 --- a/src/main/java/com/irtimaled/bbor/client/providers/FlowerForestProvider.java +++ b/src/main/java/com/irtimaled/bbor/client/providers/FlowerForestProvider.java @@ -10,7 +10,9 @@ import com.irtimaled.bbor.common.BoundingBoxType; import com.irtimaled.bbor.common.MathHelper; import com.irtimaled.bbor.common.models.Coords; import com.irtimaled.bbor.common.models.DimensionId; +import net.minecraft.client.MinecraftClient; import net.minecraft.util.registry.BuiltinRegistries; +import net.minecraft.world.Heightmap; import java.util.HashMap; import java.util.Map; @@ -78,9 +80,10 @@ public class FlowerForestProvider implements IBoundingBoxProvider 0) { - if (FlowerForestHelper.canGrowFlower(x, y, z)) return y; - y--; + int topY = MinecraftClient.getInstance().world.getTopY(Heightmap.Type.MOTION_BLOCKING, x, z) + 1; + while (topY > 0) { + if (FlowerForestHelper.canGrowFlower(x, topY, z)) return topY; + topY--; } return 0; } diff --git a/src/main/java/com/irtimaled/bbor/client/renderers/AbstractRenderer.java b/src/main/java/com/irtimaled/bbor/client/renderers/AbstractRenderer.java index f576b6a..7a7a464 100644 --- a/src/main/java/com/irtimaled/bbor/client/renderers/AbstractRenderer.java +++ b/src/main/java/com/irtimaled/bbor/client/renderers/AbstractRenderer.java @@ -27,10 +27,9 @@ public abstract class AbstractRenderer { public abstract void render(MatrixStack matrixStack, T boundingBox); void renderCuboid(MatrixStack matrixStack, OffsetBox bb, Color color, boolean fillOnly, int fillAlpha) { - OffsetBox nudge = bb.nudge(); matrixStack.push(); - renderCuboid0(matrixStack, nudge, color, fillOnly, fillAlpha, false); + renderCuboid0(matrixStack, bb, color, fillOnly, fillAlpha, false); matrixStack.pop(); } diff --git a/src/main/java/com/irtimaled/bbor/client/renderers/RenderBatch.java b/src/main/java/com/irtimaled/bbor/client/renderers/RenderBatch.java index a24f0e1..c2dfa8c 100644 --- a/src/main/java/com/irtimaled/bbor/client/renderers/RenderBatch.java +++ b/src/main/java/com/irtimaled/bbor/client/renderers/RenderBatch.java @@ -47,39 +47,61 @@ public class RenderBatch { final int green = color.getGreen(); final int blue = color.getBlue(); - if (mask) quadMaskedCount.getAndIncrement(); - else quadNonMaskedCount.getAndIncrement(); - final BufferBuilder bufferBuilder = mask ? RenderBatch.quadBufferBuilderMasked : RenderBatch.quadBufferBuilderNonMasked; - bufferBuilder.vertex(matrixEntry.getModel(), minX, minY, minZ).color(red, green, blue, alpha).next(); - bufferBuilder.vertex(matrixEntry.getModel(), maxX, minY, minZ).color(red, green, blue, alpha).next(); - bufferBuilder.vertex(matrixEntry.getModel(), maxX, minY, maxZ).color(red, green, blue, alpha).next(); - bufferBuilder.vertex(matrixEntry.getModel(), minX, minY, maxZ).color(red, green, blue, alpha).next(); - - bufferBuilder.vertex(matrixEntry.getModel(), minX, maxY, minZ).color(red, green, blue, alpha).next(); - bufferBuilder.vertex(matrixEntry.getModel(), minX, maxY, maxZ).color(red, green, blue, alpha).next(); - bufferBuilder.vertex(matrixEntry.getModel(), maxX, maxY, maxZ).color(red, green, blue, alpha).next(); - bufferBuilder.vertex(matrixEntry.getModel(), maxX, maxY, minZ).color(red, green, blue, alpha).next(); - - bufferBuilder.vertex(matrixEntry.getModel(), minX, minY, minZ).color(red, green, blue, alpha).next(); - bufferBuilder.vertex(matrixEntry.getModel(), minX, maxY, minZ).color(red, green, blue, alpha).next(); - bufferBuilder.vertex(matrixEntry.getModel(), maxX, maxY, minZ).color(red, green, blue, alpha).next(); - bufferBuilder.vertex(matrixEntry.getModel(), maxX, minY, minZ).color(red, green, blue, alpha).next(); - - bufferBuilder.vertex(matrixEntry.getModel(), maxX, minY, minZ).color(red, green, blue, alpha).next(); - bufferBuilder.vertex(matrixEntry.getModel(), maxX, maxY, minZ).color(red, green, blue, alpha).next(); - bufferBuilder.vertex(matrixEntry.getModel(), maxX, maxY, maxZ).color(red, green, blue, alpha).next(); - bufferBuilder.vertex(matrixEntry.getModel(), maxX, minY, maxZ).color(red, green, blue, alpha).next(); - - bufferBuilder.vertex(matrixEntry.getModel(), minX, minY, maxZ).color(red, green, blue, alpha).next(); - bufferBuilder.vertex(matrixEntry.getModel(), maxX, minY, maxZ).color(red, green, blue, alpha).next(); - bufferBuilder.vertex(matrixEntry.getModel(), maxX, maxY, maxZ).color(red, green, blue, alpha).next(); - bufferBuilder.vertex(matrixEntry.getModel(), minX, maxY, maxZ).color(red, green, blue, alpha).next(); - - bufferBuilder.vertex(matrixEntry.getModel(), minX, minY, minZ).color(red, green, blue, alpha).next(); - bufferBuilder.vertex(matrixEntry.getModel(), minX, minY, maxZ).color(red, green, blue, alpha).next(); - bufferBuilder.vertex(matrixEntry.getModel(), minX, maxY, maxZ).color(red, green, blue, alpha).next(); - bufferBuilder.vertex(matrixEntry.getModel(), minX, maxY, minZ).color(red, green, blue, alpha).next(); + + if (minX != maxX && minZ != maxZ) { + if (mask) quadMaskedCount.getAndIncrement(); + else quadNonMaskedCount.getAndIncrement(); + bufferBuilder.vertex(matrixEntry.getModel(), minX, minY, minZ).color(red, green, blue, alpha).next(); + bufferBuilder.vertex(matrixEntry.getModel(), maxX, minY, minZ).color(red, green, blue, alpha).next(); + bufferBuilder.vertex(matrixEntry.getModel(), maxX, minY, maxZ).color(red, green, blue, alpha).next(); + bufferBuilder.vertex(matrixEntry.getModel(), minX, minY, maxZ).color(red, green, blue, alpha).next(); + } + + if (minX != maxX && minZ != maxZ) { + if (mask) quadMaskedCount.getAndIncrement(); + else quadNonMaskedCount.getAndIncrement(); + bufferBuilder.vertex(matrixEntry.getModel(), minX, maxY, minZ).color(red, green, blue, alpha).next(); + bufferBuilder.vertex(matrixEntry.getModel(), minX, maxY, maxZ).color(red, green, blue, alpha).next(); + bufferBuilder.vertex(matrixEntry.getModel(), maxX, maxY, maxZ).color(red, green, blue, alpha).next(); + bufferBuilder.vertex(matrixEntry.getModel(), maxX, maxY, minZ).color(red, green, blue, alpha).next(); + } + + if (minX != maxX && minY != maxY) { + if (mask) quadMaskedCount.getAndIncrement(); + else quadNonMaskedCount.getAndIncrement(); + bufferBuilder.vertex(matrixEntry.getModel(), minX, minY, minZ).color(red, green, blue, alpha).next(); + bufferBuilder.vertex(matrixEntry.getModel(), minX, maxY, minZ).color(red, green, blue, alpha).next(); + bufferBuilder.vertex(matrixEntry.getModel(), maxX, maxY, minZ).color(red, green, blue, alpha).next(); + bufferBuilder.vertex(matrixEntry.getModel(), maxX, minY, minZ).color(red, green, blue, alpha).next(); + } + + if (minY != maxY && minZ != maxZ) { + if (mask) quadMaskedCount.getAndIncrement(); + else quadNonMaskedCount.getAndIncrement(); + bufferBuilder.vertex(matrixEntry.getModel(), maxX, minY, minZ).color(red, green, blue, alpha).next(); + bufferBuilder.vertex(matrixEntry.getModel(), maxX, maxY, minZ).color(red, green, blue, alpha).next(); + bufferBuilder.vertex(matrixEntry.getModel(), maxX, maxY, maxZ).color(red, green, blue, alpha).next(); + bufferBuilder.vertex(matrixEntry.getModel(), maxX, minY, maxZ).color(red, green, blue, alpha).next(); + } + + if (minX != maxX && minY != maxY) { + if (mask) quadMaskedCount.getAndIncrement(); + else quadNonMaskedCount.getAndIncrement(); + bufferBuilder.vertex(matrixEntry.getModel(), minX, minY, maxZ).color(red, green, blue, alpha).next(); + bufferBuilder.vertex(matrixEntry.getModel(), maxX, minY, maxZ).color(red, green, blue, alpha).next(); + bufferBuilder.vertex(matrixEntry.getModel(), maxX, maxY, maxZ).color(red, green, blue, alpha).next(); + bufferBuilder.vertex(matrixEntry.getModel(), minX, maxY, maxZ).color(red, green, blue, alpha).next(); + } + + if (minY != maxY && minZ != maxZ) { + if (mask) quadMaskedCount.getAndIncrement(); + else quadNonMaskedCount.getAndIncrement(); + bufferBuilder.vertex(matrixEntry.getModel(), minX, minY, minZ).color(red, green, blue, alpha).next(); + bufferBuilder.vertex(matrixEntry.getModel(), minX, minY, maxZ).color(red, green, blue, alpha).next(); + bufferBuilder.vertex(matrixEntry.getModel(), minX, maxY, maxZ).color(red, green, blue, alpha).next(); + bufferBuilder.vertex(matrixEntry.getModel(), minX, maxY, minZ).color(red, green, blue, alpha).next(); + } } static void drawLine(MatrixStack.Entry matrixEntry, Point startPoint, Point endPoint, Color color, int alpha) { @@ -132,7 +154,7 @@ public class RenderBatch { } public static String debugString() { - return String.format("[BBOR] Statistics: Boxes: %d,%d Lines: %d @ %.2fms", quadMaskedCountLast.get(), quadNonMaskedCountLast.get(), lineCountLast.get(), lastDurationNanos.get() / 1_000_000.0); + return String.format("[BBOR] Statistics: Filled faces: %d,%d Lines: %d @ %.2fms", quadMaskedCountLast.get(), quadNonMaskedCountLast.get(), lineCountLast.get(), lastDurationNanos.get() / 1_000_000.0); } } diff --git a/src/main/java/com/irtimaled/bbor/common/models/AbstractBoundingBox.java b/src/main/java/com/irtimaled/bbor/common/models/AbstractBoundingBox.java index e4852d0..7682249 100644 --- a/src/main/java/com/irtimaled/bbor/common/models/AbstractBoundingBox.java +++ b/src/main/java/com/irtimaled/bbor/common/models/AbstractBoundingBox.java @@ -1,5 +1,7 @@ package com.irtimaled.bbor.common.models; +import com.irtimaled.bbor.client.ClientRenderer; +import com.irtimaled.bbor.client.renderers.AbstractRenderer; import com.irtimaled.bbor.common.BoundingBoxType; public abstract class AbstractBoundingBox { @@ -19,7 +21,7 @@ public abstract class AbstractBoundingBox { double dX = getDistanceX(x); double dY = getDistanceY(y); double dZ = getDistanceZ(z); - return Math.cbrt(dX * dX + dY * dY + dZ * dZ); + return dX * dX + dY * dY + dZ * dZ; } protected abstract double getDistanceX(double x); @@ -27,4 +29,8 @@ public abstract class AbstractBoundingBox { protected abstract double getDistanceY(double y); protected abstract double getDistanceZ(double z); + + public AbstractRenderer getRenderer() { + return ClientRenderer.getRenderer(this.getClass()); + } } diff --git a/src/main/java/com/irtimaled/bbor/common/models/BoundingBoxCuboid.java b/src/main/java/com/irtimaled/bbor/common/models/BoundingBoxCuboid.java index 765a065..6cfa81a 100644 --- a/src/main/java/com/irtimaled/bbor/common/models/BoundingBoxCuboid.java +++ b/src/main/java/com/irtimaled/bbor/common/models/BoundingBoxCuboid.java @@ -1,10 +1,15 @@ package com.irtimaled.bbor.common.models; +import com.irtimaled.bbor.client.ClientRenderer; +import com.irtimaled.bbor.client.renderers.AbstractRenderer; +import com.irtimaled.bbor.client.renderers.CuboidRenderer; import com.irtimaled.bbor.common.BoundingBoxType; import com.irtimaled.bbor.common.MathHelper; import com.irtimaled.bbor.common.TypeHelper; public class BoundingBoxCuboid extends AbstractBoundingBox { + private static final AbstractRenderer RENDERER = ClientRenderer.registerRenderer(BoundingBoxCuboid.class, new CuboidRenderer()); + private final Coords minCoords; private final Coords maxCoords; @@ -70,4 +75,9 @@ public class BoundingBoxCuboid extends AbstractBoundingBox { public double getDistanceZ(double z) { return z - MathHelper.clamp(z, minCoords.getZ(), maxCoords.getZ()); } + + @Override + public AbstractRenderer getRenderer() { + return RENDERER; + } }