]> git.lizzy.rs Git - BoundingBoxOutlineReloaded.git/blobdiff - src/main/java/com/irtimaled/bbor/client/ClientRenderer.java
Bedrock ceiling
[BoundingBoxOutlineReloaded.git] / src / main / java / com / irtimaled / bbor / client / ClientRenderer.java
index 554dcdc064f97d3ed2739751cb1e58d4494d19f7..836d0e04fa28e311ef055e9f0a24cb7b1274f912 100644 (file)
@@ -1,6 +1,8 @@
 package com.irtimaled.bbor.client;
 
+import com.irtimaled.bbor.client.config.ConfigManager;
 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;
@@ -10,7 +12,6 @@ import com.irtimaled.bbor.client.providers.CustomBeaconProvider;
 import com.irtimaled.bbor.client.providers.CustomBoxProvider;
 import com.irtimaled.bbor.client.providers.CustomLineProvider;
 import com.irtimaled.bbor.client.providers.CustomSphereProvider;
-import com.irtimaled.bbor.client.providers.FlowerForestProvider;
 import com.irtimaled.bbor.client.providers.IBoundingBoxProvider;
 import com.irtimaled.bbor.client.providers.ICachingProvider;
 import com.irtimaled.bbor.client.providers.MobSpawnerProvider;
@@ -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;
@@ -66,22 +66,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 <T extends AbstractBoundingBox> void registerProvider(IBoundingBoxProvider<T> provider) {
@@ -115,8 +113,11 @@ public class ClientRenderer {
         long startTime = System.nanoTime();
         matrixStack.push();
         RenderHelper.beforeRender();
+        TileEntitiesHelper.clearCache();
 
-        for (AbstractBoundingBox key : getBoundingBoxes(dimensionId)) {
+        final List<AbstractBoundingBox> boundingBoxes = getBoundingBoxes(dimensionId);
+        RenderCulling.flushPreRendering();
+        for (AbstractBoundingBox key : boundingBoxes) {
             AbstractRenderer renderer = key.getRenderer();
             if (renderer != null) renderer.render(matrixStack, key);
         }
@@ -124,27 +125,31 @@ public class ClientRenderer {
         RenderQueue.renderDeferred();
 
         RenderHelper.afterRender();
+        RenderCulling.flushRendering();
         matrixStack.pop();
         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 (boundingBox.isVisibleCulling() && isWithinRenderDistance(boundingBox)) {
-                        tmp.add(boundingBox);
+                    if (isWithinRenderDistance(boundingBox)) {
+                        if (doPreCulling && !boundingBox.isVisibleCulling()) continue;
+                        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() {