From 7db6e0c5990b2ea5909529ee8866fa7fcda18e86 Mon Sep 17 00:00:00 2001 From: ishland Date: Wed, 9 Feb 2022 23:18:17 +0800 Subject: [PATCH] Bedrock ceiling --- .../irtimaled/bbor/client/ClientRenderer.java | 17 +++-- .../client/config/BoundingBoxTypeHelper.java | 2 +- .../bbor/client/config/ConfigManager.java | 4 +- .../bbor/client/gui/SettingsScreen.java | 4 +- .../client/interop/BedrockCeilingHelper.java | 16 ++-- .../models/BoundingBoxBedrockCeiling.java | 6 +- .../providers/BedrockCeilingProvider.java | 76 +++++++++---------- .../client/providers/BiomeBorderProvider.java | 3 +- .../renderers/BedrockCeilingRenderer.java | 19 +++++ .../bbor/common/BoundingBoxType.java | 2 +- 10 files changed, 80 insertions(+), 69 deletions(-) create mode 100644 src/main/java/com/irtimaled/bbor/client/renderers/BedrockCeilingRenderer.java diff --git a/src/main/java/com/irtimaled/bbor/client/ClientRenderer.java b/src/main/java/com/irtimaled/bbor/client/ClientRenderer.java index 4ea6885..836d0e0 100644 --- a/src/main/java/com/irtimaled/bbor/client/ClientRenderer.java +++ b/src/main/java/com/irtimaled/bbor/client/ClientRenderer.java @@ -5,6 +5,7 @@ import com.irtimaled.bbor.client.interop.ClientInterop; 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; @@ -27,14 +28,13 @@ import com.irtimaled.bbor.common.models.AbstractBoundingBox; 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; @@ -79,7 +79,7 @@ public class ClientRenderer { registerProvider(new CustomLineProvider()); registerProvider(new CustomSphereProvider()); // registerProvider(new FlowerForestProvider()); -// registerProvider(new BedrockCeilingProvider()); + registerProvider(new BedrockCeilingProvider()); } public static void registerProvider(IBoundingBoxProvider provider) { @@ -130,25 +130,26 @@ public class ClientRenderer { lastDurationNanos.set(System.nanoTime() - startTime); } + private static final ObjectArrayList listForRendering = new ObjectArrayList<>(); + public static List getBoundingBoxes(DimensionId dimensionId) { - List 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 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() { diff --git a/src/main/java/com/irtimaled/bbor/client/config/BoundingBoxTypeHelper.java b/src/main/java/com/irtimaled/bbor/client/config/BoundingBoxTypeHelper.java index 27850a1..f06b553 100644 --- a/src/main/java/com/irtimaled/bbor/client/config/BoundingBoxTypeHelper.java +++ b/src/main/java/com/irtimaled/bbor/client/config/BoundingBoxTypeHelper.java @@ -26,7 +26,7 @@ public class BoundingBoxTypeHelper { 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); diff --git a/src/main/java/com/irtimaled/bbor/client/config/ConfigManager.java b/src/main/java/com/irtimaled/bbor/client/config/ConfigManager.java index d0e5caa..c8ff868 100644 --- a/src/main/java/com/irtimaled/bbor/client/config/ConfigManager.java +++ b/src/main/java/com/irtimaled/bbor/client/config/ConfigManager.java @@ -55,7 +55,7 @@ public class ConfigManager { public static Setting renderSphereAsDots; // public static Setting drawFlowerForests; // public static Setting flowerForestsRenderDistance; -// public static Setting drawBedrockCeilingBlocks; + public static Setting drawBedrockCeilingBlocks; public static Setting colorWorldSpawn; public static Setting colorLazySpawnChunks; @@ -134,7 +134,7 @@ public class ConfigManager { // 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."); diff --git a/src/main/java/com/irtimaled/bbor/client/gui/SettingsScreen.java b/src/main/java/com/irtimaled/bbor/client/gui/SettingsScreen.java index d07db83..5741b07 100644 --- a/src/main/java/com/irtimaled/bbor/client/gui/SettingsScreen.java +++ b/src/main/java/com/irtimaled/bbor/client/gui/SettingsScreen.java @@ -78,8 +78,8 @@ public class SettingsScreen extends ListScreen { // .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), diff --git a/src/main/java/com/irtimaled/bbor/client/interop/BedrockCeilingHelper.java b/src/main/java/com/irtimaled/bbor/client/interop/BedrockCeilingHelper.java index 05a9adf..7bc225f 100644 --- a/src/main/java/com/irtimaled/bbor/client/interop/BedrockCeilingHelper.java +++ b/src/main/java/com/irtimaled/bbor/client/interop/BedrockCeilingHelper.java @@ -1,14 +1,9 @@ -/* 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){ @@ -21,11 +16,10 @@ public class BedrockCeilingHelper { 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; +// } } - */ 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 ab6d2c1..be66d3e 100644 --- a/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxBedrockCeiling.java +++ b/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxBedrockCeiling.java @@ -1,15 +1,14 @@ -/* 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 RENDERER = CommonInterop.registerRenderer(BoundingBoxBedrockCeiling.class, () -> new CuboidRenderer()); + private static final AbstractRenderer RENDERER = CommonInterop.registerRenderer(BoundingBoxBedrockCeiling.class, () -> new BedrockCeilingRenderer()); public BoundingBoxBedrockCeiling(Coords coords) { super(coords, coords, BoundingBoxType.BedrockCeiling); @@ -20,4 +19,3 @@ public class BoundingBoxBedrockCeiling extends BoundingBoxCuboid { return RENDERER; } } - */ diff --git a/src/main/java/com/irtimaled/bbor/client/providers/BedrockCeilingProvider.java b/src/main/java/com/irtimaled/bbor/client/providers/BedrockCeilingProvider.java index a35d5d6..473fe5e 100644 --- a/src/main/java/com/irtimaled/bbor/client/providers/BedrockCeilingProvider.java +++ b/src/main/java/com/irtimaled/bbor/client/providers/BedrockCeilingProvider.java @@ -1,4 +1,3 @@ -/* package com.irtimaled.bbor.client.providers; import com.irtimaled.bbor.client.Player; @@ -10,13 +9,13 @@ 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 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, ICachingProvider { private static final double CHUNK_SIZE = 16d; @@ -24,14 +23,14 @@ public class BedrockCeilingProvider implements IBoundingBoxProvider chunks = new HashMap<>(); private static class BedrockChunk { - private final Set boxes = new HashSet<>(); + private final List 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) { @@ -59,36 +58,36 @@ public class BedrockCeilingProvider implements IBoundingBoxProvider= 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 getBlocks() { return boxes; @@ -112,7 +111,7 @@ public class BedrockCeilingProvider implements IBoundingBoxProvider boxes = new HashSet<>(); + ArrayList boxes = new ArrayList<>(); for (int chunkX = playerChunkX - renderDistanceChunks; chunkX <= playerChunkX + renderDistanceChunks; chunkX++) { for (int chunkZ = playerChunkZ - renderDistanceChunks; chunkZ <= playerChunkZ + renderDistanceChunks; chunkZ++) { @@ -129,7 +128,7 @@ public class BedrockCeilingProvider implements IBoundingBoxProvider 110; } } - */ diff --git a/src/main/java/com/irtimaled/bbor/client/providers/BiomeBorderProvider.java b/src/main/java/com/irtimaled/bbor/client/providers/BiomeBorderProvider.java index 8447a4d..2fa6320 100644 --- a/src/main/java/com/irtimaled/bbor/client/providers/BiomeBorderProvider.java +++ b/src/main/java/com/irtimaled/bbor/client/providers/BiomeBorderProvider.java @@ -9,6 +9,7 @@ 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 it.unimi.dsi.fastutil.objects.Object2ObjectLinkedOpenHashMap; import java.util.HashMap; import java.util.Map; @@ -18,7 +19,7 @@ public class BiomeBorderProvider implements IBoundingBoxProvider lastBorders = new HashMap<>(); + private static Map lastBorders = new Object2ObjectLinkedOpenHashMap<>(); @Override public boolean canProvide(DimensionId dimensionId) { diff --git a/src/main/java/com/irtimaled/bbor/client/renderers/BedrockCeilingRenderer.java b/src/main/java/com/irtimaled/bbor/client/renderers/BedrockCeilingRenderer.java new file mode 100644 index 0000000..22b88b7 --- /dev/null +++ b/src/main/java/com/irtimaled/bbor/client/renderers/BedrockCeilingRenderer.java @@ -0,0 +1,19 @@ +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 { + @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); + } +} diff --git a/src/main/java/com/irtimaled/bbor/common/BoundingBoxType.java b/src/main/java/com/irtimaled/bbor/common/BoundingBoxType.java index 98a747a..eabd102 100644 --- a/src/main/java/com/irtimaled/bbor/common/BoundingBoxType.java +++ b/src/main/java/com/irtimaled/bbor/common/BoundingBoxType.java @@ -18,7 +18,7 @@ public class BoundingBoxType { 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"); -- 2.44.0