From: ishland Date: Thu, 5 Aug 2021 14:52:55 +0000 (+0800) Subject: Performance improvements X-Git-Url: https://git.lizzy.rs/?a=commitdiff_plain;h=45bc97ba0043b6992f2280e25274bae98b1ef8fd;p=BoundingBoxOutlineReloaded.git 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 554dcdc..1d517b3 100644 --- a/src/main/java/com/irtimaled/bbor/client/ClientRenderer.java +++ b/src/main/java/com/irtimaled/bbor/client/ClientRenderer.java @@ -1,6 +1,7 @@ package com.irtimaled.bbor.client; 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; @@ -66,22 +67,20 @@ public class ClientRenderer { } static { - if (FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT) { - registerProvider(new SlimeChunkProvider()); - registerProvider(new WorldSpawnProvider()); - registerProvider(new SpawningSphereProvider()); - registerProvider(new BeaconProvider()); - registerProvider(new CustomBoxProvider()); - registerProvider(new CustomBeaconProvider()); - registerProvider(new BiomeBorderProvider()); - registerProvider(new MobSpawnerProvider()); - registerProvider(new ConduitProvider()); - registerProvider(new SpawnableBlocksProvider()); - registerProvider(new CustomLineProvider()); - registerProvider(new CustomSphereProvider()); - registerProvider(new FlowerForestProvider()); - registerProvider(new BedrockCeilingProvider()); - } + registerProvider(new SlimeChunkProvider()); + registerProvider(new WorldSpawnProvider()); + registerProvider(new SpawningSphereProvider()); + registerProvider(new BeaconProvider()); + registerProvider(new CustomBoxProvider()); + registerProvider(new CustomBeaconProvider()); + registerProvider(new BiomeBorderProvider()); + registerProvider(new MobSpawnerProvider()); + registerProvider(new ConduitProvider()); + registerProvider(new SpawnableBlocksProvider()); + registerProvider(new CustomLineProvider()); + registerProvider(new CustomSphereProvider()); + registerProvider(new FlowerForestProvider()); + registerProvider(new BedrockCeilingProvider()); } public static void registerProvider(IBoundingBoxProvider provider) { @@ -115,6 +114,7 @@ public class ClientRenderer { long startTime = System.nanoTime(); matrixStack.push(); RenderHelper.beforeRender(); + TileEntitiesHelper.clearCache(); for (AbstractBoundingBox key : getBoundingBoxes(dimensionId)) { AbstractRenderer renderer = key.getRenderer(); diff --git a/src/main/java/com/irtimaled/bbor/client/interop/BiomeBorderHelper.java b/src/main/java/com/irtimaled/bbor/client/interop/BiomeBorderHelper.java index 7cde22b..5dd29e0 100644 --- a/src/main/java/com/irtimaled/bbor/client/interop/BiomeBorderHelper.java +++ b/src/main/java/com/irtimaled/bbor/client/interop/BiomeBorderHelper.java @@ -1,47 +1,47 @@ package com.irtimaled.bbor.client.interop; import com.irtimaled.bbor.common.models.Coords; +import it.unimi.dsi.fastutil.longs.Long2IntOpenHashMap; import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; import net.minecraft.client.MinecraftClient; import net.minecraft.client.world.ClientWorld; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.ChunkPos; import net.minecraft.util.registry.Registry; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.biome.source.BiomeArray; -import net.minecraft.world.biome.source.BiomeCoords; -import net.minecraft.world.chunk.WorldChunk; public class BiomeBorderHelper { - private static final Long2ObjectOpenHashMap biomeCache = new Long2ObjectOpenHashMap<>(); + private static final Long2ObjectOpenHashMap biomeCache = new Long2ObjectOpenHashMap<>(); public static void onChunkLoaded(int chunkX, int chunkZ) { - assert MinecraftClient.getInstance().world != null; - final WorldChunk chunk = MinecraftClient.getInstance().world.getChunk(chunkX, chunkZ); - if (chunk == null) return; - biomeCache.put(ChunkPos.toLong(chunkX, chunkZ), chunk.getBiomeArray()); + } public static void onChunkUnload(int chunkX, int chunkZ) { biomeCache.remove(ChunkPos.toLong(chunkX, chunkZ)); } + public static void onDisconnect() { + biomeCache.clear(); + } + public static int getBiomeId(Coords coords) { return getBiomeId(coords.getX(), coords.getY(), coords.getZ()); } public static int getBiomeId(int x, int y, int z) { BlockPos pos = new BlockPos(x, y, z); - final BiomeArray biomeArray = biomeCache.get(ChunkPos.toLong(pos)); + final Long2IntOpenHashMap biomeArray = biomeCache.computeIfAbsent(ChunkPos.toLong(pos), key -> createNewMap()); final ClientWorld world = MinecraftClient.getInstance().world; - final Biome biome; - if (biomeArray != null) { - biome = biomeArray.getBiomeForNoiseGen(BiomeCoords.fromBlock(x & 15), y, BiomeCoords.fromBlock(z & 15)); - } else { + return biomeArray.computeIfAbsent(pos.asLong(), key -> { assert world != null; - biome = world.getBiome(pos); - } - return world.getRegistryManager().get(Registry.BIOME_KEY).getRawId(biome); + return world.getRegistryManager().get(Registry.BIOME_KEY).getRawId(world.getBiome(pos)); + }); + } + + private static Long2IntOpenHashMap createNewMap() { + final Long2IntOpenHashMap long2IntOpenHashMap = new Long2IntOpenHashMap(); + long2IntOpenHashMap.defaultReturnValue(-1); + return long2IntOpenHashMap; } } diff --git a/src/main/java/com/irtimaled/bbor/client/interop/ClientInterop.java b/src/main/java/com/irtimaled/bbor/client/interop/ClientInterop.java index e0cee81..5501a91 100644 --- a/src/main/java/com/irtimaled/bbor/client/interop/ClientInterop.java +++ b/src/main/java/com/irtimaled/bbor/client/interop/ClientInterop.java @@ -34,6 +34,7 @@ import net.minecraft.util.math.BlockPos; public class ClientInterop { public static void disconnectedFromRemoteServer() { SaveGameStructureLoader.clear(); + BiomeBorderHelper.onDisconnect(); EventBus.publish(new DisconnectedFromRemoteServer()); } diff --git a/src/main/java/com/irtimaled/bbor/client/interop/TileEntitiesHelper.java b/src/main/java/com/irtimaled/bbor/client/interop/TileEntitiesHelper.java index 1119146..11896a0 100644 --- a/src/main/java/com/irtimaled/bbor/client/interop/TileEntitiesHelper.java +++ b/src/main/java/com/irtimaled/bbor/client/interop/TileEntitiesHelper.java @@ -8,6 +8,7 @@ import net.minecraft.block.entity.BlockEntity; import net.minecraft.client.MinecraftClient; import net.minecraft.world.chunk.WorldChunk; +import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.Set; @@ -15,14 +16,30 @@ import java.util.concurrent.atomic.AtomicReferenceArray; import java.util.function.Function; public class TileEntitiesHelper { - public static Iterable map(Class clazz, Function map) { - @SuppressWarnings("ConstantConditions") final AtomicReferenceArray chunks = ((IClientChunkManagerClientChunkMap) (Object) ((IClientChunkManager) MinecraftClient.getInstance().world.getChunkManager()).getChunks()).getChunks(); - Collection tileEntities = new HashSet<>(); - for (int i = 0; i < chunks.length(); i ++) { - final WorldChunk worldChunk = chunks.get(i); - if(worldChunk == null) continue; - tileEntities.addAll(worldChunk.getBlockEntities().values()); + + private static Collection tileEntities = null; + + private static Collection getTileEntities() { + if (tileEntities == null) { + @SuppressWarnings("ConstantConditions") final AtomicReferenceArray chunks = ((IClientChunkManagerClientChunkMap) (Object) ((IClientChunkManager) MinecraftClient.getInstance().world.getChunkManager()).getChunks()).getChunks(); + Collection tileEntities = new ArrayList<>(); + for (int i = 0; i < chunks.length(); i ++) { + final WorldChunk worldChunk = chunks.get(i); + if(worldChunk == null) continue; + tileEntities.addAll(worldChunk.getBlockEntities().values()); + } + TileEntitiesHelper.tileEntities = tileEntities; + return tileEntities; } + return tileEntities; + } + + public static void clearCache() { + tileEntities = null; + } + + public static Iterable map(Class clazz, Function map) { + final Collection tileEntities = getTileEntities(); Set results = new HashSet<>(); for (BlockEntity tileEntity : tileEntities) { 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 14b4973..a8e9cde 100644 --- a/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxBeacon.java +++ b/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxBeacon.java @@ -1,14 +1,14 @@ 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.interop.CommonInterop; 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 static final AbstractRenderer RENDERER = CommonInterop.registerRenderer(BoundingBoxBeacon.class, () -> new BeaconRenderer()); private final Coords coords; private final int level; 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 354b086..39a54e7 100644 --- a/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxBedrockCeiling.java +++ b/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxBedrockCeiling.java @@ -1,14 +1,14 @@ 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.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 = ClientRenderer.registerRenderer(BoundingBoxBedrockCeiling.class, () -> new CuboidRenderer()); + private static final AbstractRenderer RENDERER = CommonInterop.registerRenderer(BoundingBoxBedrockCeiling.class, () -> new CuboidRenderer()); public BoundingBoxBedrockCeiling(Coords coords) { super(coords, coords, BoundingBoxType.BedrockCeiling); 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 daf6b1c..d88d4e8 100644 --- a/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxBiomeBorder.java +++ b/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxBiomeBorder.java @@ -1,15 +1,15 @@ package com.irtimaled.bbor.client.models; -import com.irtimaled.bbor.client.ClientRenderer; import com.irtimaled.bbor.client.RenderCulling; 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.interop.CommonInterop; 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 static final AbstractRenderer RENDERER = CommonInterop.registerRenderer(BoundingBoxBiomeBorder.class, () -> new BiomeBorderRenderer()); private final Coords coords; private final boolean north; 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 3741808..76c7f86 100644 --- a/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxConduit.java +++ b/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxConduit.java @@ -1,14 +1,14 @@ 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.interop.CommonInterop; import com.irtimaled.bbor.common.models.Coords; public class BoundingBoxConduit extends BoundingBoxSphere { - private static final AbstractRenderer RENDERER = ClientRenderer.registerRenderer(BoundingBoxConduit.class, () -> new ConduitRenderer()); + private static final AbstractRenderer RENDERER = CommonInterop.registerRenderer(BoundingBoxConduit.class, () -> new ConduitRenderer()); private final int level; 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 23439b8..11d61d0 100644 --- a/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxFlowerForest.java +++ b/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxFlowerForest.java @@ -1,6 +1,5 @@ package com.irtimaled.bbor.client.models; -import com.irtimaled.bbor.client.ClientRenderer; import com.irtimaled.bbor.client.RenderCulling; import com.irtimaled.bbor.client.config.ColorHelper; import com.irtimaled.bbor.client.config.HexColor; @@ -8,13 +7,14 @@ 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.interop.CommonInterop; 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 RENDERER = ClientRenderer.registerRenderer(BoundingBoxFlowerForest.class, () -> new FlowerForestRenderer()); + private static final AbstractRenderer RENDERER = CommonInterop.registerRenderer(BoundingBoxFlowerForest.class, () -> new FlowerForestRenderer()); private final Coords coords; private final Setting colorSetting; @@ -60,6 +60,6 @@ public class BoundingBoxFlowerForest extends AbstractBoundingBox { @Override public boolean isVisibleCulling() { - return RenderCulling.isVisibleCulling(coords.getX(), coords.getY() + 0.01d, coords.getZ(), coords.getX() + 1, coords.getY(), coords.getZ()); + return RenderCulling.isVisibleCulling(coords.getX(), coords.getY() + 0.01d, coords.getZ(), coords.getX() + 1, coords.getY(), coords.getZ() + 1); } } 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 39e487e..beb00f5 100644 --- a/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxLine.java +++ b/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxLine.java @@ -1,16 +1,16 @@ package com.irtimaled.bbor.client.models; -import com.irtimaled.bbor.client.ClientRenderer; import com.irtimaled.bbor.client.RenderCulling; 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.interop.CommonInterop; import com.irtimaled.bbor.common.models.AbstractBoundingBox; public class BoundingBoxLine extends AbstractBoundingBox { - private static final AbstractRenderer RENDERER = ClientRenderer.registerRenderer(BoundingBoxLine.class, () -> new LineRenderer()); + private static final AbstractRenderer RENDERER = CommonInterop.registerRenderer(BoundingBoxLine.class, () -> new LineRenderer()); private final Point minPoint; private final Point maxPoint; 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 d7573f2..5997c02 100644 --- a/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxMobSpawner.java +++ b/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxMobSpawner.java @@ -1,14 +1,14 @@ 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.interop.CommonInterop; 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 static final AbstractRenderer RENDERER = CommonInterop.registerRenderer(BoundingBoxMobSpawner.class, () -> new MobSpawnerRenderer()); private final Coords coords; 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 8c31514..517813a 100644 --- a/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxSlimeChunk.java +++ b/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxSlimeChunk.java @@ -1,17 +1,17 @@ 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.interop.CommonInterop; 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()); + private static final AbstractRenderer RENDERER = CommonInterop.registerRenderer(BoundingBoxSlimeChunk.class, () -> new SlimeChunkRenderer()); public BoundingBoxSlimeChunk(Coords minCoords, Coords maxCoords) { super(minCoords, maxCoords, BoundingBoxType.SlimeChunks); 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 4976744..de035f2 100644 --- a/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxSpawnableBlocks.java +++ b/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxSpawnableBlocks.java @@ -1,9 +1,9 @@ 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.interop.CommonInterop; import com.irtimaled.bbor.common.models.AbstractBoundingBox; import net.minecraft.util.math.BlockPos; @@ -11,7 +11,7 @@ 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 static final AbstractRenderer RENDERER = CommonInterop.registerRenderer(BoundingBoxSpawnableBlocks.class, () -> new SpawnableBlocksRenderer()); private final Set blocks = new HashSet<>(); 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 396a5c4..c40215c 100644 --- a/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxSpawningSphere.java +++ b/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxSpawningSphere.java @@ -1,16 +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.SpawningSphereRenderer; import com.irtimaled.bbor.common.BoundingBoxType; +import com.irtimaled.bbor.common.interop.CommonInterop; import net.minecraft.util.math.BlockPos; import java.util.HashSet; import java.util.Set; public class BoundingBoxSpawningSphere extends BoundingBoxSphere { - private static final AbstractRenderer RENDERER = ClientRenderer.registerRenderer(BoundingBoxSpawningSphere.class, () -> new SpawningSphereRenderer()); + private static final AbstractRenderer RENDERER = CommonInterop.registerRenderer(BoundingBoxSpawningSphere.class, () -> new SpawningSphereRenderer()); public static final int SAFE_RADIUS = 24; public static final int SPAWN_RADIUS = 128; 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 9198bac..9d12785 100644 --- a/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxSphere.java +++ b/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxSphere.java @@ -1,14 +1,14 @@ 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.interop.CommonInterop; 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 static final AbstractRenderer RENDERER = CommonInterop.registerRenderer(BoundingBoxSphere.class, () -> new SphereRenderer()); private final double radius; private final double minX; 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 22afcf5..34692bb 100644 --- a/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxWorldSpawn.java +++ b/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxWorldSpawn.java @@ -1,14 +1,14 @@ 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.interop.CommonInterop; 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()); + private static final AbstractRenderer RENDERER = CommonInterop.registerRenderer(BoundingBoxWorldSpawn.class, () -> new WorldSpawnRenderer()); public BoundingBoxWorldSpawn(Coords minCoords, Coords maxCoords, BoundingBoxType type) { super(minCoords, maxCoords, type); diff --git a/src/main/java/com/irtimaled/bbor/client/providers/CacheProvider.java b/src/main/java/com/irtimaled/bbor/client/providers/CacheProvider.java index 8e34448..0b563d1 100644 --- a/src/main/java/com/irtimaled/bbor/client/providers/CacheProvider.java +++ b/src/main/java/com/irtimaled/bbor/client/providers/CacheProvider.java @@ -10,7 +10,8 @@ import com.irtimaled.bbor.common.MathHelper; import com.irtimaled.bbor.common.models.AbstractBoundingBox; import com.irtimaled.bbor.common.models.DimensionId; -import java.util.HashSet; +import java.util.ArrayList; +import java.util.List; import java.util.Map; import java.util.Set; @@ -37,7 +38,7 @@ public class CacheProvider implements IBoundingBoxProvider public Iterable get(DimensionId dimensionId) { Boolean outerBoxesOnly = ConfigManager.outerBoxesOnly.get(); - Set boundingBoxes = new HashSet<>(); + List boundingBoxes = new ArrayList<>(); BoundingBoxCache cache = getCache.apply(dimensionId); if (cache != null) { for (Map.Entry> entry : cache.getBoundingBoxes().entrySet()) { 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 1677205..b26745e 100644 --- a/src/main/java/com/irtimaled/bbor/client/providers/FlowerForestProvider.java +++ b/src/main/java/com/irtimaled/bbor/client/providers/FlowerForestProvider.java @@ -59,7 +59,7 @@ public class FlowerForestProvider implements IBoundingBoxProvider boundingBoxes = new HashMap<>(); + Map boundingBoxes = new HashMap<>((maxX - minX) * (maxZ - minZ)); for (int x = minX; x <= maxX; x++) { for (int z = minZ; z <= maxZ; z++) { int biomeId = BiomeBorderHelper.getBiomeId(x, 255, z); @@ -80,7 +80,8 @@ public class FlowerForestProvider implements IBoundingBoxProvider 0) { if (FlowerForestHelper.canGrowFlower(x, topY, z)) return topY; topY--; diff --git a/src/main/java/com/irtimaled/bbor/client/providers/SlimeChunkProvider.java b/src/main/java/com/irtimaled/bbor/client/providers/SlimeChunkProvider.java index 032b1ee..c504b1e 100644 --- a/src/main/java/com/irtimaled/bbor/client/providers/SlimeChunkProvider.java +++ b/src/main/java/com/irtimaled/bbor/client/providers/SlimeChunkProvider.java @@ -16,7 +16,7 @@ import java.util.Set; public class SlimeChunkProvider implements IBoundingBoxProvider, ICachingProvider { private static final double CHUNK_SIZE = 16d; - private static Long seed; + private static volatile Long seed; public static void setSeed(long seed) { SlimeChunkProvider.seed = seed; diff --git a/src/main/java/com/irtimaled/bbor/client/providers/SpawnableBlocksProvider.java b/src/main/java/com/irtimaled/bbor/client/providers/SpawnableBlocksProvider.java index b28b0e1..54c1934 100644 --- a/src/main/java/com/irtimaled/bbor/client/providers/SpawnableBlocksProvider.java +++ b/src/main/java/com/irtimaled/bbor/client/providers/SpawnableBlocksProvider.java @@ -10,7 +10,7 @@ import com.irtimaled.bbor.common.MathHelper; import com.irtimaled.bbor.common.models.DimensionId; import net.minecraft.client.MinecraftClient; -import java.util.HashSet; +import java.util.Collections; import java.util.Set; public class SpawnableBlocksProvider implements IBoundingBoxProvider, ICachingProvider { @@ -54,8 +54,6 @@ public class SpawnableBlocksProvider implements IBoundingBoxProvider boundingBoxes = new HashSet<>(); - boundingBoxes.add(boundingBox); - return boundingBoxes; + return Collections.singleton(boundingBox); } } diff --git a/src/main/java/com/irtimaled/bbor/client/renderers/RenderHelper.java b/src/main/java/com/irtimaled/bbor/client/renderers/RenderHelper.java index 4580f61..28af6b0 100644 --- a/src/main/java/com/irtimaled/bbor/client/renderers/RenderHelper.java +++ b/src/main/java/com/irtimaled/bbor/client/renderers/RenderHelper.java @@ -6,7 +6,6 @@ import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.systems.RenderSystem; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.util.math.Quaternion; -import net.minecraft.util.math.Vec3d; import org.lwjgl.opengl.GL11; public class RenderHelper { @@ -164,22 +163,4 @@ public class RenderHelper { regionZ - Camera.getZ()); } - /** - * Compute hash code for vec3d - * @see Vec3d#hashCode() - * - * @param x x value - * @param y y value - * @param z z value - * @return hash code - */ - public static long hashVec3d(double x, double y, double z) { - long l = Double.doubleToLongBits(x); - int i = (int)(l ^ l >>> 32); - l = Double.doubleToLongBits(y); - i = 31 * i + (int)(l ^ l >>> 32); - l = Double.doubleToLongBits(z); - i = 31 * i + (int)(l ^ l >>> 32); - return i; - } } diff --git a/src/main/java/com/irtimaled/bbor/client/renderers/SpawnableBlocksRenderer.java b/src/main/java/com/irtimaled/bbor/client/renderers/SpawnableBlocksRenderer.java index 83b33c2..06b0ee1 100644 --- a/src/main/java/com/irtimaled/bbor/client/renderers/SpawnableBlocksRenderer.java +++ b/src/main/java/com/irtimaled/bbor/client/renderers/SpawnableBlocksRenderer.java @@ -3,6 +3,7 @@ package com.irtimaled.bbor.client.renderers; import com.irtimaled.bbor.client.config.BoundingBoxTypeHelper; import com.irtimaled.bbor.client.models.BoundingBoxSpawnableBlocks; import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.util.math.BlockPos; import java.awt.*; @@ -10,12 +11,12 @@ public class SpawnableBlocksRenderer extends AbstractRenderer { + for (BlockPos c : boundingBox.getBlocks()) { int x = c.getX(); int y = c.getY(); int z = c.getZ(); OffsetBox offsetBox = new OffsetBox(x, y, z, x + 1, y, z + 1); renderCuboid(matrixStack, offsetBox, color, false, 30); - }); + } } } diff --git a/src/main/java/com/irtimaled/bbor/client/renderers/SpawningSphereRenderer.java b/src/main/java/com/irtimaled/bbor/client/renderers/SpawningSphereRenderer.java index 4c33aee..2d543fd 100644 --- a/src/main/java/com/irtimaled/bbor/client/renderers/SpawningSphereRenderer.java +++ b/src/main/java/com/irtimaled/bbor/client/renderers/SpawningSphereRenderer.java @@ -9,6 +9,7 @@ import com.irtimaled.bbor.client.models.Point; import com.irtimaled.bbor.common.BoundingBoxType; import net.minecraft.client.resource.language.I18n; import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.util.math.BlockPos; import java.awt.*; @@ -47,12 +48,12 @@ public class SpawningSphereRenderer extends AbstractRenderer { + for (BlockPos c : boundingBox.getBlocks()) { int x = c.getX(); int y = c.getY(); int z = c.getZ(); OffsetBox offsetBox = new OffsetBox(x, y, z, x + 1, y, z + 1); renderCuboid(matrixStack, offsetBox, color, false, 30); - }); + } } } diff --git a/src/main/java/com/irtimaled/bbor/common/interop/CommonInterop.java b/src/main/java/com/irtimaled/bbor/common/interop/CommonInterop.java index dd09ffd..321c4c7 100644 --- a/src/main/java/com/irtimaled/bbor/common/interop/CommonInterop.java +++ b/src/main/java/com/irtimaled/bbor/common/interop/CommonInterop.java @@ -1,5 +1,7 @@ package com.irtimaled.bbor.common.interop; +import com.irtimaled.bbor.client.ClientRenderer; +import com.irtimaled.bbor.client.renderers.AbstractRenderer; import com.irtimaled.bbor.common.EventBus; import com.irtimaled.bbor.common.events.PlayerLoggedIn; import com.irtimaled.bbor.common.events.PlayerLoggedOut; @@ -7,8 +9,11 @@ import com.irtimaled.bbor.common.events.PlayerSubscribed; import com.irtimaled.bbor.common.events.ServerTick; import com.irtimaled.bbor.common.events.StructuresLoaded; import com.irtimaled.bbor.common.events.WorldLoaded; +import com.irtimaled.bbor.common.models.AbstractBoundingBox; import com.irtimaled.bbor.common.models.DimensionId; import com.irtimaled.bbor.common.models.ServerPlayer; +import net.fabricmc.api.EnvType; +import net.fabricmc.loader.api.FabricLoader; import net.minecraft.network.ClientConnection; import net.minecraft.server.network.ServerPlayNetworkHandler; import net.minecraft.server.network.ServerPlayerEntity; @@ -19,6 +24,7 @@ import net.minecraft.world.chunk.WorldChunk; import java.util.Collection; import java.util.HashMap; import java.util.Map; +import java.util.function.Supplier; public class CommonInterop { public static void chunkLoaded(WorldChunk chunk) { @@ -59,4 +65,11 @@ public class CommonInterop { public static void playerSubscribed(ServerPlayerEntity player) { EventBus.publish(new PlayerSubscribed(player.getId(), new ServerPlayer(player))); } + + public static AbstractRenderer registerRenderer(Class type, Supplier> renderer) { + if (FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT) { + return ClientRenderer.registerRenderer(type, renderer); + } + return null; + } } 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 1e55a4e..1cfc458 100644 --- a/src/main/java/com/irtimaled/bbor/common/models/BoundingBoxCuboid.java +++ b/src/main/java/com/irtimaled/bbor/common/models/BoundingBoxCuboid.java @@ -1,15 +1,15 @@ package com.irtimaled.bbor.common.models; -import com.irtimaled.bbor.client.ClientRenderer; import com.irtimaled.bbor.client.RenderCulling; 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; +import com.irtimaled.bbor.common.interop.CommonInterop; public class BoundingBoxCuboid extends AbstractBoundingBox { - private static final AbstractRenderer RENDERER = ClientRenderer.registerRenderer(BoundingBoxCuboid.class, () -> new CuboidRenderer()); + private static final AbstractRenderer RENDERER = CommonInterop.registerRenderer(BoundingBoxCuboid.class, () -> new CuboidRenderer()); private final Coords minCoords; private final Coords maxCoords;