import com.irtimaled.bbor.client.interop.TileEntitiesHelper;
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.BiomeBorderProvider;
import com.irtimaled.bbor.client.providers.ConduitProvider;
import com.irtimaled.bbor.client.providers.CustomBeaconProvider;
import com.irtimaled.bbor.common.models.DimensionId;
import it.unimi.dsi.fastutil.objects.Object2ObjectMaps;
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
+import it.unimi.dsi.fastutil.objects.ObjectArrayList;
import net.fabricmc.api.EnvType;
import net.fabricmc.loader.api.FabricLoader;
import net.minecraft.client.util.math.MatrixStack;
-import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashSet;
-import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
registerProvider(new CustomLineProvider());
registerProvider(new CustomSphereProvider());
// registerProvider(new FlowerForestProvider());
-// registerProvider(new BedrockCeilingProvider());
+ registerProvider(new BedrockCeilingProvider());
}
public static <T extends AbstractBoundingBox> void registerProvider(IBoundingBoxProvider<T> provider) {
lastDurationNanos.set(System.nanoTime() - startTime);
}
+ private static final ObjectArrayList<AbstractBoundingBox> listForRendering = new ObjectArrayList<>();
+
public static List<AbstractBoundingBox> getBoundingBoxes(DimensionId dimensionId) {
- List<AbstractBoundingBox> tmp = new LinkedList<>();
+ listForRendering.clear();
final boolean doPreCulling = ConfigManager.fastRender.get() >= 2;
for (IBoundingBoxProvider<?> provider : providers) {
if (provider.canProvide(dimensionId)) {
for (AbstractBoundingBox boundingBox : provider.get(dimensionId)) {
if (isWithinRenderDistance(boundingBox)) {
if (doPreCulling && !boundingBox.isVisibleCulling()) continue;
- tmp.add(boundingBox);
+ listForRendering.add(boundingBox);
}
}
}
}
Point point = Player.getPoint();
- final ArrayList<AbstractBoundingBox> result = new ArrayList<>(tmp);
- result.sort(Comparator.comparingDouble((AbstractBoundingBox boundingBox) -> boundingBox.getDistance(point.getX(), point.getY(), point.getZ())).reversed());
+ listForRendering.sort(Comparator.comparingDouble((AbstractBoundingBox boundingBox) -> boundingBox.getDistance(point.getX(), point.getY(), point.getZ())).reversed());
- return result;
+ return listForRendering;
}
public static void clear() {
registerType(BoundingBoxType.Conduit, ConfigManager.drawConduits, ConfigManager.colorConduits);
registerType(BoundingBoxType.SpawnableBlocks, ConfigManager.drawSpawnableBlocks, ConfigManager.colorSpawnableBlocks);
// registerType(BoundingBoxType.FlowerForest, ConfigManager.drawFlowerForests, null);
-// registerType(BoundingBoxType.BedrockCeiling, ConfigManager.drawBedrockCeilingBlocks, ConfigManager.colorBedrockCeilingBlocks);
+ registerType(BoundingBoxType.BedrockCeiling, ConfigManager.drawBedrockCeilingBlocks, ConfigManager.colorBedrockCeilingBlocks);
registerType(BoundingBoxType.JungleTemple, ConfigManager.drawJungleTemples, ConfigManager.colorJungleTemples);
registerType(BoundingBoxType.DesertTemple, ConfigManager.drawDesertTemples, ConfigManager.colorDesertTemples);
public static Setting<Boolean> renderSphereAsDots;
// public static Setting<Boolean> drawFlowerForests;
// public static Setting<Integer> flowerForestsRenderDistance;
-// public static Setting<Boolean> drawBedrockCeilingBlocks;
+ public static Setting<Boolean> drawBedrockCeilingBlocks;
public static Setting<HexColor> colorWorldSpawn;
public static Setting<HexColor> colorLazySpawnChunks;
// drawFlowerForests = setup(config, "flowerForests", "drawFlowerForests", true, "If set to true flower forest flower overlays will be drawn.");
// flowerForestsRenderDistance = setup(config, "flowerForests", "flowerForestsRenderDistance", 3, "The distance from the player where flower forests will be drawn.");
-// drawBedrockCeilingBlocks = setup(config, "bedrockCeiling", "drawBedrockCeilingBlocks", true, "If set to true position with only one layer of bedrock will be drawn.");
+ drawBedrockCeilingBlocks = setup(config, "bedrockCeiling", "drawBedrockCeilingBlocks", true, "If set to true position with only one layer of bedrock will be drawn.");
drawVillages = setup(config, "structures", "drawVillages", false, "If set to true village bounding boxes will be drawn.");
drawDesertTemples = setup(config, "structures", "drawDesertTemples", true, "If set to true desert temple bounding boxes are drawn.");
// .addDisplayValue(1, I18n.translate("bbor.options.distance.nearest"))
// .addDisplayValue(2, I18n.translate("bbor.options.distance.nearer"))
// .addDisplayValue(3, I18n.translate("bbor.options.distance.normal")))
-// .section(I18n.translate("bbor.features.bedrockCeilingBlocks"),
-// width -> new BoundingBoxTypeButton(width, I18n.translate("bbor.features.bedrockCeilingBlocks"), BoundingBoxType.BedrockCeiling))
+ .section(I18n.translate("bbor.features.bedrockCeilingBlocks"),
+ width -> new BoundingBoxTypeButton(width, I18n.translate("bbor.features.bedrockCeilingBlocks"), BoundingBoxType.BedrockCeiling))
.section(I18n.translate("bbor.features.mobSpawners"),
width -> new BoundingBoxTypeButton(width, I18n.translate("bbor.features.mobSpawners"), BoundingBoxType.MobSpawner),
width -> new BoolSettingButton(width, I18n.translate("bbor.features.mobSpawners.spawnArea"), ConfigManager.renderMobSpawnerSpawnArea),
-/*
package com.irtimaled.bbor.client.interop;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.client.MinecraftClient;
import net.minecraft.util.math.BlockPos;
-import net.minecraft.world.gen.random.ChunkRandom;
-import net.minecraft.world.gen.random.SimpleRandom;
-
-import java.util.Random;
public class BedrockCeilingHelper {
public static boolean isBedrock(int x, int y, int z){
return MinecraftClient.getInstance().world.getChunkManager().isChunkLoaded(chunkX, chunkZ);
}
- public static Random getRandomForChunk(int chunkX, int chunkZ) {
- ChunkRandom random = new ChunkRandom(new SimpleRandom());
- random.setTerrainSeed(chunkX, chunkZ);
- return random;
- }
+// public static Random getRandomForChunk(int chunkX, int chunkZ) {
+// ChunkRandom random = new ChunkRandom(new SimpleRandom());
+// random.setTerrainSeed(chunkX, chunkZ);
+// return random;
+// }
}
- */
-/*
package com.irtimaled.bbor.client.models;
import com.irtimaled.bbor.client.renderers.AbstractRenderer;
-import com.irtimaled.bbor.client.renderers.CuboidRenderer;
+import com.irtimaled.bbor.client.renderers.BedrockCeilingRenderer;
import com.irtimaled.bbor.common.BoundingBoxType;
import com.irtimaled.bbor.common.interop.CommonInterop;
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 = CommonInterop.registerRenderer(BoundingBoxBedrockCeiling.class, () -> new CuboidRenderer());
+ private static final AbstractRenderer<BoundingBoxBedrockCeiling> RENDERER = CommonInterop.registerRenderer(BoundingBoxBedrockCeiling.class, () -> new BedrockCeilingRenderer());
public BoundingBoxBedrockCeiling(Coords coords) {
super(coords, coords, BoundingBoxType.BedrockCeiling);
return RENDERER;
}
}
- */
-/*
package com.irtimaled.bbor.client.providers;
import com.irtimaled.bbor.client.Player;
import com.irtimaled.bbor.common.MathHelper;
import com.irtimaled.bbor.common.models.Coords;
import com.irtimaled.bbor.common.models.DimensionId;
+import it.unimi.dsi.fastutil.objects.ObjectArrayList;
+import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
-import java.util.HashSet;
+import java.util.List;
import java.util.Map;
-import java.util.Random;
-import java.util.Set;
public class BedrockCeilingProvider implements IBoundingBoxProvider<BoundingBoxBedrockCeiling>, ICachingProvider {
private static final double CHUNK_SIZE = 16d;
private static final Map<String, BedrockChunk> chunks = new HashMap<>();
private static class BedrockChunk {
- private final Set<BoundingBoxBedrockCeiling> boxes = new HashSet<>();
+ private final List<BoundingBoxBedrockCeiling> boxes = new ObjectArrayList<>();
public BedrockChunk(int chunkX, int chunkZ) {
int chunkStartX = chunkX << 4;
int chunkStartZ = chunkZ << 4;
if (BedrockCeilingHelper.chunkLoaded(chunkX, chunkZ)) findBoxesFromBlockState(chunkStartX, chunkStartZ);
- else findBoxesFromRNG(chunkX, chunkZ, chunkStartX, chunkStartZ);
+// else findBoxesFromRNG(chunkX, chunkZ, chunkStartX, chunkStartZ);
}
private void findBoxesFromBlockState(int chunkStartX, int chunkStartZ) {
return coords;
}
- private void findBoxesFromRNG(int chunkX, int chunkZ, int chunkStartX, int chunkStartZ) {
- Random random = BedrockCeilingHelper.getRandomForChunk(chunkX, chunkZ);
-
- // preseed 16x16x3 calls to nextDouble
- for (int dummy = 0; dummy < 768; dummy++) {
- random.nextDouble();
- }
- for (int z = 0; z < 16; z++) {
- for (int x = 0; x < 16; x++) {
- Coords coords = getBlocksFromRNG(random, chunkStartX + x, chunkStartZ + z);
-
- if (coords != null) {
- boxes.add(new BoundingBoxBedrockCeiling(coords));
- }
- }
- }
- }
-
- private Coords getBlocksFromRNG(Random random, int x, int z) {
- int count = 0;
- for (int y = 127; y >= 123; y--) {
- if (y >= 127 - random.nextInt(5)) {
- count++;
- }
- }
- for (int y = 4; y >= 0; y--) {
- random.nextInt(5);
- }
- return count == 1 ? new Coords(x, 127, z) : null;
- }
+// private void findBoxesFromRNG(int chunkX, int chunkZ, int chunkStartX, int chunkStartZ) {
+// Random random = BedrockCeilingHelper.getRandomForChunk(chunkX, chunkZ);
+//
+// // preseed 16x16x3 calls to nextDouble
+// for (int dummy = 0; dummy < 768; dummy++) {
+// random.nextDouble();
+// }
+// for (int z = 0; z < 16; z++) {
+// for (int x = 0; x < 16; x++) {
+// Coords coords = getBlocksFromRNG(random, chunkStartX + x, chunkStartZ + z);
+//
+// if (coords != null) {
+// boxes.add(new BoundingBoxBedrockCeiling(coords));
+// }
+// }
+// }
+// }
+//
+// private Coords getBlocksFromRNG(Random random, int x, int z) {
+// int count = 0;
+// for (int y = 127; y >= 123; y--) {
+// if (y >= 127 - random.nextInt(5)) {
+// count++;
+// }
+// }
+// for (int y = 4; y >= 0; y--) {
+// random.nextInt(5);
+// }
+// return count == 1 ? new Coords(x, 127, z) : null;
+// }
public Collection<? extends BoundingBoxBedrockCeiling> getBlocks() {
return boxes;
int playerChunkX = MathHelper.floor(Player.getX() / CHUNK_SIZE);
int playerChunkZ = MathHelper.floor(Player.getZ() / CHUNK_SIZE);
- Set<BoundingBoxBedrockCeiling> boxes = new HashSet<>();
+ ArrayList<BoundingBoxBedrockCeiling> boxes = new ArrayList<>();
for (int chunkX = playerChunkX - renderDistanceChunks; chunkX <= playerChunkX + renderDistanceChunks; chunkX++) {
for (int chunkZ = playerChunkZ - renderDistanceChunks; chunkZ <= playerChunkZ + renderDistanceChunks; chunkZ++) {
public boolean shouldRecalculate() {
long gameTime = ClientInterop.getGameTime();
- if (!((Long) gameTime).equals(lastGameTime) && gameTime % 2L == 0L) {
+ if (!((Long) gameTime).equals(lastGameTime) && (gameTime & 0b1111) == 0) {
lastGameTime = gameTime;
return true;
}
return dimensionId == DimensionId.NETHER && BoundingBoxTypeHelper.shouldRender(BoundingBoxType.BedrockCeiling) && Player.getY() > 110;
}
}
- */
import com.irtimaled.bbor.common.MathHelper;
import com.irtimaled.bbor.common.models.Coords;
import com.irtimaled.bbor.common.models.DimensionId;
+import it.unimi.dsi.fastutil.objects.Object2ObjectLinkedOpenHashMap;
import java.util.HashMap;
import java.util.Map;
private static Boolean lastRenderAllTransitions = null;
private static Integer lastRenderDistance = null;
private static Integer lastMaxY = null;
- private static Map<Coords, BoundingBoxBiomeBorder> lastBorders = new HashMap<>();
+ private static Map<Coords, BoundingBoxBiomeBorder> lastBorders = new Object2ObjectLinkedOpenHashMap<>();
@Override
public boolean canProvide(DimensionId dimensionId) {
--- /dev/null
+package com.irtimaled.bbor.client.renderers;
+
+import com.irtimaled.bbor.client.config.BoundingBoxTypeHelper;
+import com.irtimaled.bbor.client.models.BoundingBoxBedrockCeiling;
+import com.irtimaled.bbor.common.models.Coords;
+import net.minecraft.client.util.math.MatrixStack;
+
+public class BedrockCeilingRenderer extends AbstractRenderer<BoundingBoxBedrockCeiling> {
+ @Override
+ public void render(MatrixStack matrixStack, BoundingBoxBedrockCeiling boundingBox) {
+ Coords coords = boundingBox.getMinCoords();
+ int x = coords.getX();
+ int y = coords.getY();
+ int z = coords.getZ();
+ renderCuboid(matrixStack, new OffsetBox(new OffsetPoint(x, y + 1.01d, z),
+ new OffsetPoint(x + 1, y + 1.01d, z + 1)),
+ BoundingBoxTypeHelper.getColor(boundingBox.getType()), true, 127);
+ }
+}
public static final BoundingBoxType Conduit = register("Conduit");
public static final BoundingBoxType SpawnableBlocks = register("Spawnable Blocks");
// public static final BoundingBoxType FlowerForest = register("Flower Forest");
-// public static final BoundingBoxType BedrockCeiling = register("Bedrock Ceiling");
+ public static final BoundingBoxType BedrockCeiling = register("Bedrock Ceiling");
public static final BoundingBoxType JungleTemple = register("jungle_pyramid");
public static final BoundingBoxType DesertTemple = register("desert_pyramid");