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;
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<Class<? extends AbstractBoundingBox>, AbstractRenderer> boundingBoxRendererMap = new HashMap<>();
+ private static final Map<Class<? extends AbstractBoundingBox>, AbstractRenderer> boundingBoxRendererMap = new Object2ObjectOpenHashMap<>();
private static boolean active;
private static final Set<IBoundingBoxProvider> providers = new HashSet<>();
}
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());
providers.add(provider);
}
- public static <T extends AbstractBoundingBox> void registerRenderer(Class<? extends T> type, AbstractRenderer<T> renderer) {
+ public static <T extends AbstractBoundingBox> AbstractRenderer<T> registerRenderer(Class<? extends T> type, AbstractRenderer<T> renderer) {
boundingBoxRendererMap.put(type, renderer);
+ return renderer;
+ }
+
+ public static AbstractRenderer getRenderer(Class<? extends AbstractBoundingBox> clazz) {
+ return boundingBoxRendererMap.get(clazz);
}
private static boolean isWithinRenderDistance(AbstractBoundingBox boundingBox) {
RenderHelper.beforeRender();
getBoundingBoxes(dimensionId).forEach(key -> {
- AbstractRenderer renderer = boundingBoxRendererMap.get(key.getClass());
+ AbstractRenderer renderer = key.getRenderer();
if (renderer != null) renderer.render(matrixStack, key);
});
lastDurationNanos.set(System.nanoTime() - startTime);
}
- public static Stream<AbstractBoundingBox> getBoundingBoxes(DimensionId dimensionId) {
- Stream.Builder<AbstractBoundingBox> boundingBoxes = Stream.builder();
+ public static List<AbstractBoundingBox> getBoundingBoxes(DimensionId dimensionId) {
+ List<AbstractBoundingBox> 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<AbstractBoundingBox> 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() {
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<BoundingBoxBeacon> RENDERER = ClientRenderer.registerRenderer(BoundingBoxBeacon.class, new BeaconRenderer());
+
private final Coords coords;
private final int level;
public int getLevel() {
return level;
}
+
+ @Override
+ public AbstractRenderer<?> getRenderer() {
+ return RENDERER;
+ }
}
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<BoundingBoxCuboid> RENDERER = ClientRenderer.registerRenderer(BoundingBoxBedrockCeiling.class, new CuboidRenderer());
+
public BoundingBoxBedrockCeiling(Coords coords) {
super(coords, coords, BoundingBoxType.BedrockCeiling);
}
+
+ @Override
+ public AbstractRenderer<?> getRenderer() {
+ return RENDERER;
+ }
}
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<BoundingBoxBiomeBorder> RENDERER = ClientRenderer.registerRenderer(BoundingBoxBiomeBorder.class, new BiomeBorderRenderer());
+
private final Coords coords;
private final boolean north;
private final boolean east;
return west;
}
+ @Override
+ public AbstractRenderer<?> getRenderer() {
+ return RENDERER;
+ }
}
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<BoundingBoxConduit> RENDERER = ClientRenderer.registerRenderer(BoundingBoxConduit.class, new ConduitRenderer());
+
private final int level;
private BoundingBoxConduit(Coords coords, int level, int radius) {
public int getLevel() {
return level;
}
+
+ @Override
+ public AbstractRenderer<?> getRenderer() {
+ return RENDERER;
+ }
}
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;
import java.awt.*;
public class BoundingBoxFlowerForest extends AbstractBoundingBox {
+ private static final AbstractRenderer<BoundingBoxFlowerForest> RENDERER = ClientRenderer.registerRenderer(BoundingBoxFlowerForest.class, new FlowerForestRenderer());
+
private final Coords coords;
private final Setting<HexColor> colorSetting;
public double getDistanceZ(double z) {
return z - coords.getZ();
}
+
+ @Override
+ public AbstractRenderer<?> getRenderer() {
+ return RENDERER;
+ }
}
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<BoundingBoxLine> RENDERER = ClientRenderer.registerRenderer(BoundingBoxLine.class, new LineRenderer());
+
private final Point minPoint;
private final Point maxPoint;
private final Double width;
private boolean isBetween(double val, int min, int max) {
return val >= min && val <= max;
}
+
+ @Override
+ public AbstractRenderer<?> getRenderer() {
+ return RENDERER;
+ }
}
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<BoundingBoxMobSpawner> RENDERER = ClientRenderer.registerRenderer(BoundingBoxMobSpawner.class, new MobSpawnerRenderer());
+
private final Coords coords;
private BoundingBoxMobSpawner(Coords coords, Coords minCoords, Coords maxCoords) {
public Coords getCoords() {
return coords;
}
+
+ @Override
+ public AbstractRenderer<?> getRenderer() {
+ return RENDERER;
+ }
}
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<BoundingBoxSlimeChunk> RENDERER = ClientRenderer.registerRenderer(BoundingBoxSlimeChunk.class, new SlimeChunkRenderer());
+
public BoundingBoxSlimeChunk(Coords minCoords, Coords maxCoords) {
super(minCoords, maxCoords, BoundingBoxType.SlimeChunks);
}
else
return super.getDistanceY(y);
}
+
+ @Override
+ public AbstractRenderer<BoundingBoxSlimeChunk> getRenderer() {
+ return RENDERER;
+ }
}
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;
import java.util.Set;
public class BoundingBoxSpawnableBlocks extends AbstractBoundingBox {
+ private static final AbstractRenderer<BoundingBoxSpawnableBlocks> RENDERER = ClientRenderer.registerRenderer(BoundingBoxSpawnableBlocks.class, new SpawnableBlocksRenderer());
+
private final Set<BlockPos> blocks = new HashSet<>();
public BoundingBoxSpawnableBlocks() {
protected double getDistanceZ(double z) {
return 0;
}
+
+ @Override
+ public AbstractRenderer<?> getRenderer() {
+ return RENDERER;
+ }
}
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;
import java.util.Set;
public class BoundingBoxSpawningSphere extends BoundingBoxSphere {
+ private static final AbstractRenderer<BoundingBoxSpawningSphere> RENDERER = ClientRenderer.registerRenderer(BoundingBoxSpawningSphere.class, new SpawningSphereRenderer());
+
public static final int SAFE_RADIUS = 24;
public static final int SPAWN_RADIUS = 128;
public Integer getSpawnableSpacesCount() {
return this.spawnableCount;
}
+
+ @Override
+ public AbstractRenderer<?> getRenderer() {
+ return RENDERER;
+ }
}
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<BoundingBoxSphere> RENDERER = ClientRenderer.registerRenderer(BoundingBoxSphere.class, new SphereRenderer());
+
private final double radius;
private final double minX;
private final double minZ;
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<BoundingBoxWorldSpawn> 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;
+ }
}
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;
}
private static int getMaxYForPos(int x, int y, int z) {
- while (y > 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;
}
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();
}
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) {
}
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);
}
}
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 {
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);
protected abstract double getDistanceY(double y);
protected abstract double getDistanceZ(double z);
+
+ public AbstractRenderer<?> getRenderer() {
+ return ClientRenderer.getRenderer(this.getClass());
+ }
}
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<BoundingBoxCuboid> RENDERER = ClientRenderer.registerRenderer(BoundingBoxCuboid.class, new CuboidRenderer());
+
private final Coords minCoords;
private final Coords maxCoords;
public double getDistanceZ(double z) {
return z - MathHelper.clamp(z, minCoords.getZ(), maxCoords.getZ());
}
+
+ @Override
+ public AbstractRenderer<?> getRenderer() {
+ return RENDERER;
+ }
}