From: ishland Date: Sun, 15 Aug 2021 06:27:15 +0000 (+0800) Subject: Add "Fast Render" option to configure culling behaviors X-Git-Url: https://git.lizzy.rs/?a=commitdiff_plain;h=bca7c1e95d2b17051dc60788234d00a0ed0542fb;p=BoundingBoxOutlineReloaded.git Add "Fast Render" option to configure culling behaviors --- diff --git a/src/main/java/com/irtimaled/bbor/client/ClientRenderer.java b/src/main/java/com/irtimaled/bbor/client/ClientRenderer.java index 1d517b3..15aa493 100644 --- a/src/main/java/com/irtimaled/bbor/client/ClientRenderer.java +++ b/src/main/java/com/irtimaled/bbor/client/ClientRenderer.java @@ -1,5 +1,6 @@ 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; @@ -116,7 +117,9 @@ public class ClientRenderer { RenderHelper.beforeRender(); TileEntitiesHelper.clearCache(); - for (AbstractBoundingBox key : getBoundingBoxes(dimensionId)) { + final List boundingBoxes = getBoundingBoxes(dimensionId); + RenderCulling.flushPreRendering(); + for (AbstractBoundingBox key : boundingBoxes) { AbstractRenderer renderer = key.getRenderer(); if (renderer != null) renderer.render(matrixStack, key); } @@ -124,16 +127,19 @@ public class ClientRenderer { RenderQueue.renderDeferred(); RenderHelper.afterRender(); + RenderCulling.flushRendering(); matrixStack.pop(); lastDurationNanos.set(System.nanoTime() - startTime); } public static List getBoundingBoxes(DimensionId dimensionId) { List tmp = new LinkedList<>(); + 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)) { + if (isWithinRenderDistance(boundingBox)) { + if (doPreCulling && !boundingBox.isVisibleCulling()) continue; tmp.add(boundingBox); } } diff --git a/src/main/java/com/irtimaled/bbor/client/RenderCulling.java b/src/main/java/com/irtimaled/bbor/client/RenderCulling.java index 4a31ecb..cda5636 100644 --- a/src/main/java/com/irtimaled/bbor/client/RenderCulling.java +++ b/src/main/java/com/irtimaled/bbor/client/RenderCulling.java @@ -1,8 +1,11 @@ package com.irtimaled.bbor.client; +import com.irtimaled.bbor.client.config.ConfigManager; import net.minecraft.client.render.Frustum; import net.minecraft.util.math.Box; +import java.util.ArrayList; +import java.util.List; import java.util.concurrent.atomic.AtomicInteger; public class RenderCulling { @@ -13,12 +16,14 @@ public class RenderCulling { private static final AtomicInteger totalCount = new AtomicInteger(); private static final AtomicInteger culledCountLast = new AtomicInteger(); private static final AtomicInteger totalCountLast = new AtomicInteger(); + private static final AtomicInteger preCulledCountLast = new AtomicInteger(); + private static final AtomicInteger preTotalCountLast = new AtomicInteger(); public static void setFrustum(Frustum frustum) { RenderCulling.frustum = frustum; } - public static void flushStats() { + public static void flushRendering() { synchronized (mutex) { culledCountLast.set(culledCount.get()); totalCountLast.set(totalCount.get()); @@ -27,18 +32,37 @@ public class RenderCulling { } } - public static String debugString() { - final int culledCountLast; - final int totalCountLast; + public static void flushPreRendering() { synchronized (mutex) { - culledCountLast = RenderCulling.culledCountLast.get(); - totalCountLast = RenderCulling.totalCountLast.get(); + preCulledCountLast.set(culledCount.get()); + preTotalCountLast.set(totalCount.get()); + culledCount.set(0); + totalCount.set(0); } - if (totalCountLast != 0) { - return String.format("[BBOR] Rendering culling: %d / %d (%.1f%%)", culledCountLast, totalCountLast, (culledCountLast / (float) totalCountLast) * 100.0); - } else { - return "[BBOR] Rendering not enabled"; + } + + public static List debugStrings() { + if (!ClientRenderer.getActive()) return List.of("[BBOR] Rendering not enabled"); + final ArrayList list = new ArrayList<>(2); + if (ConfigManager.fastRender.get() >= 2) { + final int preCulledCountLast; + final int preTotalCountLast; + synchronized (mutex) { + preCulledCountLast = RenderCulling.preCulledCountLast.get(); + preTotalCountLast = RenderCulling.preTotalCountLast.get(); + } + list.add(String.format("[BBOR] Pre-culling: %d / %d (%.1f%%)", preCulledCountLast, preTotalCountLast, (preCulledCountLast / (float) preTotalCountLast) * 100.0)); } + if (ConfigManager.fastRender.get() >= 1) { + final int culledCountLast; + final int totalCountLast; + synchronized (mutex) { + culledCountLast = RenderCulling.culledCountLast.get(); + totalCountLast = RenderCulling.totalCountLast.get(); + } + list.add(String.format("[BBOR] Rendering culling: %d / %d (%.1f%%)", culledCountLast, totalCountLast, (culledCountLast / (float) totalCountLast) * 100.0)); + } + return list; } private static boolean cullFrustum(Box box) { @@ -61,4 +85,8 @@ public class RenderCulling { return cullResult; } + public static void incrementCulling() { + totalCount.incrementAndGet(); + } + } 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 ceeda12..7a53b9c 100644 --- a/src/main/java/com/irtimaled/bbor/client/config/ConfigManager.java +++ b/src/main/java/com/irtimaled/bbor/client/config/ConfigManager.java @@ -105,6 +105,8 @@ public class ConfigManager { public static Setting buttonOnOverlay; + public static Setting fastRender; + public static void loadConfig() { configDir = new File(".", "config"); configDir.mkdirs(); @@ -117,6 +119,7 @@ public class ConfigManager { invertBoxColorPlayerInside = setup(config, "general", "invertBoxColorPlayerInside", false, "If set to true the color of any bounding box the player is inside will be inverted."); renderSphereAsDots = setup(config, "general", "renderSphereAsDots", false, "If set to true spheres will be rendered as dots."); buttonOnOverlay = setup(config, "general", "buttonEnabledOverlay", HexColor.from("#3000ff00"), "The color and alpha of the button overlay when a button is on."); + fastRender = setup(config, "general", "fastRender", 2, "Fast render settings. Higher value for faster rendering. "); drawBeacons = setup(config, "beacons", "drawBeacons", true, "If set to true beacon bounding boxes will be 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 49e5e68..a4b135a 100644 --- a/src/main/java/com/irtimaled/bbor/client/gui/SettingsScreen.java +++ b/src/main/java/com/irtimaled/bbor/client/gui/SettingsScreen.java @@ -53,7 +53,11 @@ public class SettingsScreen extends ListScreen { } }, width -> new BoolSettingButton(width, I18n.translate("bbor.options.outerBoxOnly"), ConfigManager.outerBoxesOnly), - width -> new BoolSettingButton(width, I18n.translate("bbor.options.fill"), ConfigManager.fill)) + width -> new BoolSettingButton(width, I18n.translate("bbor.options.fill"), ConfigManager.fill), + width -> new IntSettingSlider(width, 0, 2, "bbor.options.fastRender", ConfigManager.fastRender) + .addDisplayValue(0, I18n.translate("bbor.options.fastRender.0")) + .addDisplayValue(1, I18n.translate("bbor.options.fastRender.1")) + .addDisplayValue(2, I18n.translate("bbor.options.fastRender.2"))) .section(I18n.translate("bbor.features.spawnChunks"), width -> new BoundingBoxTypeButton(width, I18n.translate("bbor.features.spawnChunks"), BoundingBoxType.WorldSpawn), width -> new BoundingBoxTypeButton(width, I18n.translate("bbor.features.lazyChunks"), BoundingBoxType.LazySpawnChunks), diff --git a/src/main/java/com/irtimaled/bbor/client/renderers/AbstractRenderer.java b/src/main/java/com/irtimaled/bbor/client/renderers/AbstractRenderer.java index 8074e49..69724b6 100644 --- a/src/main/java/com/irtimaled/bbor/client/renderers/AbstractRenderer.java +++ b/src/main/java/com/irtimaled/bbor/client/renderers/AbstractRenderer.java @@ -35,7 +35,7 @@ public abstract class AbstractRenderer { } private void renderCuboid0(MatrixStack stack, OffsetBox nudge, Color color, boolean fillOnly, int fillAlpha, boolean mask) { - if (!RenderCulling.isVisibleCulling(nudge.toBox())) return; + if (ConfigManager.fastRender.get() >= 1 && !RenderCulling.isVisibleCulling(nudge.toBox())) return; if (ConfigManager.invertBoxColorPlayerInside.get() && playerInsideBoundingBox(nudge)) { color = new Color(255 - color.getRed(), 255 - color.getGreen(), 255 - color.getBlue()); @@ -97,7 +97,7 @@ public abstract class AbstractRenderer { // } if (cullIfEmpty && startPoint.equals(endPoint)) return; - if (!RenderCulling.isVisibleCulling(new OffsetBox(startPoint, endPoint).toBox())) return; // TODO better culling + if (ConfigManager.fastRender.get() >= 1 && !RenderCulling.isVisibleCulling(new OffsetBox(startPoint, endPoint).toBox())) return; // TODO better culling matrixStack.push(); @@ -129,7 +129,7 @@ public abstract class AbstractRenderer { } private void renderLineSphere(MatrixStack matrixStack, Point center, double radius, Color color) { - if (!RenderCulling.isVisibleCulling(new Box(new BlockPos(center.getX(), center.getY(), center.getZ())).expand(radius))) return; + if (ConfigManager.fastRender.get() >= 1 && !RenderCulling.isVisibleCulling(new Box(new BlockPos(center.getX(), center.getY(), center.getZ())).expand(radius))) return; double offset = ((radius - (int) radius) == 0) ? center.getY() - (int) center.getY() : 0; int dyStep = radius < 64 ? 1 : MathHelper.floor(radius / 32); @@ -165,7 +165,7 @@ public abstract class AbstractRenderer { } private void renderDotSphere(MatrixStack matrixStack, Point center, double radius, Color color) { - if (!RenderCulling.isVisibleCulling(new Box(new BlockPos(center.getX(), center.getY(), center.getZ())).expand(radius))) return; + if (ConfigManager.fastRender.get() >= 1 && !RenderCulling.isVisibleCulling(new Box(new BlockPos(center.getX(), center.getY(), center.getZ())).expand(radius))) return; matrixStack.push(); for (double phi = 0.0D; phi < TAU; phi += PHI_SEGMENT) { diff --git a/src/main/java/com/irtimaled/bbor/common/models/AbstractBoundingBox.java b/src/main/java/com/irtimaled/bbor/common/models/AbstractBoundingBox.java index 9036fb2..4b86703 100644 --- a/src/main/java/com/irtimaled/bbor/common/models/AbstractBoundingBox.java +++ b/src/main/java/com/irtimaled/bbor/common/models/AbstractBoundingBox.java @@ -1,6 +1,7 @@ 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.common.BoundingBoxType; @@ -35,6 +36,7 @@ public abstract class AbstractBoundingBox { } public boolean isVisibleCulling() { + RenderCulling.incrementCulling(); return true; } } 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 1cfc458..7f2906c 100644 --- a/src/main/java/com/irtimaled/bbor/common/models/BoundingBoxCuboid.java +++ b/src/main/java/com/irtimaled/bbor/common/models/BoundingBoxCuboid.java @@ -1,6 +1,5 @@ package com.irtimaled.bbor.common.models; -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; @@ -82,8 +81,9 @@ public class BoundingBoxCuboid extends AbstractBoundingBox { return RENDERER; } - @Override - public boolean isVisibleCulling() { - return RenderCulling.isVisibleCulling(minCoords.getX(), minCoords.getY(), minCoords.getZ(), maxCoords.getX(), maxCoords.getY(), maxCoords.getZ()); - } + // TODO +// @Override +// public boolean isVisibleCulling() { +// return RenderCulling.isVisibleCulling(minCoords.getX(), minCoords.getY(), minCoords.getZ(), maxCoords.getX() + 1, maxCoords.getY() + 1, maxCoords.getZ() + 1); +// } } diff --git a/src/main/java/com/irtimaled/bbor/mixin/client/renderer/MixinDebugHud.java b/src/main/java/com/irtimaled/bbor/mixin/client/renderer/MixinDebugHud.java index e604e12..b1cb122 100644 --- a/src/main/java/com/irtimaled/bbor/mixin/client/renderer/MixinDebugHud.java +++ b/src/main/java/com/irtimaled/bbor/mixin/client/renderer/MixinDebugHud.java @@ -21,7 +21,7 @@ public class MixinDebugHud { return; } - cir.getReturnValue().add(RenderCulling.debugString()); + cir.getReturnValue().addAll(RenderCulling.debugStrings()); cir.getReturnValue().add(RenderBatch.debugString()); cir.getReturnValue().add(String.format("[BBOR] Rendering took %.2fms", ClientRenderer.getLastDurationNanos() / 1_000_000.0)); } diff --git a/src/main/java/com/irtimaled/bbor/mixin/client/renderer/MixinWorldRenderer.java b/src/main/java/com/irtimaled/bbor/mixin/client/renderer/MixinWorldRenderer.java index 0adc756..9e77b17 100644 --- a/src/main/java/com/irtimaled/bbor/mixin/client/renderer/MixinWorldRenderer.java +++ b/src/main/java/com/irtimaled/bbor/mixin/client/renderer/MixinWorldRenderer.java @@ -30,7 +30,6 @@ public class MixinWorldRenderer { private void onRender(MatrixStack matrixStack, float partialTicks, long ignored_2, boolean ignored_3, Camera ignored_4, GameRenderer ignored_5, LightmapTextureManager ignored_6, Matrix4f ignored_7, CallbackInfo ci) { Preconditions.checkNotNull(this.client.player); RenderCulling.setFrustum(frustum); - RenderCulling.flushStats(); Player.setPosition(partialTicks, this.client.player); ClientInterop.render(matrixStack, this.client.player); } diff --git a/src/main/resources/assets/bbor/lang/en_us.json b/src/main/resources/assets/bbor/lang/en_us.json index 481c654..bdb5403 100644 --- a/src/main/resources/assets/bbor/lang/en_us.json +++ b/src/main/resources/assets/bbor/lang/en_us.json @@ -7,7 +7,11 @@ "bbor.options.active": "Active", "bbor.options.outerBoxOnly": "Outer Box Only", "bbor.options.fill": "Fill", - "bbor.options.lineWidthModifier": "Line Width Modifier", + + "bbor.options.fastRender": "Fast Render: %s", + "bbor.options.fastRender.0": "Off", + "bbor.options.fastRender.1": "Medium", + "bbor.options.fastRender.2": "High", "bbor.options.maxY": "Max Y: %s", "bbor.options.maxY.activated": "Activated",