From be75325edd603ee9d7a46c12cd9225d0d82f75da Mon Sep 17 00:00:00 2001 From: Aaron <51387595+AzureAaron@users.noreply.github.com> Date: Sat, 11 Nov 2023 20:06:58 -0500 Subject: Optimize Filled Box Rendering --- .../skyblocker/mixin/AfterTranslucentMixin.java | 31 +++++++++++++++ .../skyblocker/utils/render/RenderHelper.java | 34 +++++++---------- .../skyblocker/utils/render/SRenderLayers.java | 44 ++++++++++++++++++++++ 3 files changed, 88 insertions(+), 21 deletions(-) create mode 100644 src/main/java/de/hysky/skyblocker/mixin/AfterTranslucentMixin.java create mode 100644 src/main/java/de/hysky/skyblocker/utils/render/SRenderLayers.java (limited to 'src/main/java/de') diff --git a/src/main/java/de/hysky/skyblocker/mixin/AfterTranslucentMixin.java b/src/main/java/de/hysky/skyblocker/mixin/AfterTranslucentMixin.java new file mode 100644 index 00000000..07f5aa75 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/mixin/AfterTranslucentMixin.java @@ -0,0 +1,31 @@ +package de.hysky.skyblocker.mixin; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +import com.llamalad7.mixinextras.sugar.Share; +import com.llamalad7.mixinextras.sugar.ref.LocalBooleanRef; + +import de.hysky.skyblocker.utils.render.RenderHelper; +import dev.cbyrne.betterinject.annotations.Inject; +import net.minecraft.client.render.WorldRenderer; + +/** + * Injects after Fabric's After Translucent world render event + */ +@Mixin(value = WorldRenderer.class, priority = 2000) +public class AfterTranslucentMixin { + + @Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/particle/ParticleManager;renderParticles(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider$Immediate;Lnet/minecraft/client/render/LightmapTextureManager;Lnet/minecraft/client/render/Camera;F)V")) + private void onRenderParticles(@Share("renderedParticles") LocalBooleanRef renderedParticles) { + renderedParticles.set(true); + } + + @Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/util/math/MatrixStack;push()V")) + private void beforeClouds(@Share("renderedParticles") LocalBooleanRef renderedParticles) { + if (renderedParticles.get()) { + renderedParticles.set(false); + RenderHelper.drawGlobalObjectsAfterTranslucent(); + } + } +} diff --git a/src/main/java/de/hysky/skyblocker/utils/render/RenderHelper.java b/src/main/java/de/hysky/skyblocker/utils/render/RenderHelper.java index e4cfea1b..9c6826af 100644 --- a/src/main/java/de/hysky/skyblocker/utils/render/RenderHelper.java +++ b/src/main/java/de/hysky/skyblocker/utils/render/RenderHelper.java @@ -46,33 +46,16 @@ public class RenderHelper { private static void renderFilled(WorldRenderContext context, Vec3d pos, Vec3d dimensions, float[] colorComponents, float alpha, boolean throughWalls) { MatrixStack matrices = context.matrixStack(); Vec3d camera = context.camera().getPos(); - Tessellator tessellator = RenderSystem.renderThreadTesselator(); - BufferBuilder buffer = tessellator.getBuffer(); matrices.push(); matrices.translate(-camera.x, -camera.y, -camera.z); - RenderSystem.setShader(GameRenderer::getPositionColorProgram); - RenderSystem.setShaderColor(1f, 1f, 1f, 1f); - RenderSystem.polygonOffset(-1f, -10f); - RenderSystem.enablePolygonOffset(); - RenderSystem.enableBlend(); - RenderSystem.defaultBlendFunc(); - RenderSystem.enableDepthTest(); - RenderSystem.depthFunc(throughWalls ? GL11.GL_ALWAYS : GL11.GL_LEQUAL); - RenderSystem.disableCull(); + VertexConsumerProvider consumers = context.consumers(); + VertexConsumer buffer = throughWalls ? consumers.getBuffer(SRenderLayers.getFilledThroughWalls()) : consumers.getBuffer(SRenderLayers.getFilled()); - buffer.begin(DrawMode.TRIANGLE_STRIP, VertexFormats.POSITION_COLOR); WorldRenderer.renderFilledBox(matrices, buffer, pos.x, pos.y, pos.z, pos.x + dimensions.x, pos.y + dimensions.y, pos.z + dimensions.z, colorComponents[0], colorComponents[1], colorComponents[2], alpha); - tessellator.draw(); matrices.pop(); - RenderSystem.polygonOffset(0f, 0f); - RenderSystem.disablePolygonOffset(); - RenderSystem.disableBlend(); - RenderSystem.disableDepthTest(); - RenderSystem.depthFunc(GL11.GL_LEQUAL); - RenderSystem.enableCull(); } private static void renderBeaconBeam(WorldRenderContext context, BlockPos pos, float[] colorComponents) { @@ -258,6 +241,15 @@ public class RenderHelper { matrices.pop(); } + public static void drawGlobalObjectsAfterTranslucent() { + Tessellator tessellator = RenderSystem.renderThreadTesselator(); + BufferBuilder buffer = tessellator.getBuffer(); + VertexConsumerProvider.Immediate immediate = VertexConsumerProvider.immediate(buffer); + + immediate.draw(SRenderLayers.getFilled()); + immediate.draw(SRenderLayers.getFilledThroughWalls()); + } + /** * Adds the title to {@link TitleContainer} and {@link #playNotificationSound() plays the notification sound} if the title is not in the {@link TitleContainer} already. * No checking needs to be done on whether the title is in the {@link TitleContainer} already by the caller. @@ -284,8 +276,8 @@ public class RenderHelper { } private static void playNotificationSound() { - if (MinecraftClient.getInstance().player != null) { - MinecraftClient.getInstance().player.playSound(SoundEvents.ENTITY_EXPERIENCE_ORB_PICKUP, 100f, 0.1f); + if (client.player != null) { + client.player.playSound(SoundEvents.ENTITY_EXPERIENCE_ORB_PICKUP, 100f, 0.1f); } } diff --git a/src/main/java/de/hysky/skyblocker/utils/render/SRenderLayers.java b/src/main/java/de/hysky/skyblocker/utils/render/SRenderLayers.java new file mode 100644 index 00000000..4c1beb1f --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/utils/render/SRenderLayers.java @@ -0,0 +1,44 @@ +package de.hysky.skyblocker.utils.render; + +import com.mojang.blaze3d.systems.RenderSystem; + +import net.minecraft.client.render.RenderLayer; +import net.minecraft.client.render.RenderLayer.MultiPhase; +import net.minecraft.client.render.RenderLayer.MultiPhaseParameters; +import net.minecraft.client.render.RenderPhase; +import net.minecraft.client.render.RenderPhase.Cull; +import net.minecraft.client.render.RenderPhase.DepthTest; +import net.minecraft.client.render.RenderPhase.Transparency; +import net.minecraft.client.render.VertexFormat.DrawMode; +import net.minecraft.client.render.VertexFormats; + +public class SRenderLayers { + private static final Transparency DEFAULT_TRANSPARENCY = new Transparency("default", () -> { + RenderSystem.enableBlend(); + RenderSystem.defaultBlendFunc(); + }, () -> RenderSystem.disableBlend()); + + private static final MultiPhase FILLED = RenderLayer.of("filled", VertexFormats.POSITION_COLOR, DrawMode.TRIANGLE_STRIP, 131072, false, true, MultiPhaseParameters.builder() + .program(RenderPhase.COLOR_PROGRAM) + .cull(Cull.DISABLE_CULLING) + .layering(RenderPhase.POLYGON_OFFSET_LAYERING) + .transparency(DEFAULT_TRANSPARENCY) + .depthTest(DepthTest.LEQUAL_DEPTH_TEST) + .build(false)); + + private static final MultiPhase FILLED_THROUGH_WALLS = RenderLayer.of("filled_through_walls", VertexFormats.POSITION_COLOR, DrawMode.TRIANGLE_STRIP, 131072, false, true, MultiPhaseParameters.builder() + .program(RenderPhase.COLOR_PROGRAM) + .cull(Cull.DISABLE_CULLING) + .layering(RenderPhase.POLYGON_OFFSET_LAYERING) + .transparency(DEFAULT_TRANSPARENCY) + .depthTest(DepthTest.ALWAYS_DEPTH_TEST) + .build(false)); + + public static MultiPhase getFilled() { + return FILLED; + } + + public static MultiPhase getFilledThroughWalls() { + return FILLED_THROUGH_WALLS; + } +} -- cgit From c475bbba4cd28f3df65e5147b32e960600e452cb Mon Sep 17 00:00:00 2001 From: Aaron <51387595+AzureAaron@users.noreply.github.com> Date: Sat, 11 Nov 2023 20:14:46 -0500 Subject: Refactor off-thread RenderSystem calls --- .../de/hysky/skyblocker/skyblock/special/SpecialEffects.java | 11 +++-------- .../java/de/hysky/skyblocker/utils/render/RenderHelper.java | 10 +++++++++- 2 files changed, 12 insertions(+), 9 deletions(-) (limited to 'src/main/java/de') diff --git a/src/main/java/de/hysky/skyblocker/skyblock/special/SpecialEffects.java b/src/main/java/de/hysky/skyblocker/skyblock/special/SpecialEffects.java index fba447ea..bc4f98c2 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/special/SpecialEffects.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/special/SpecialEffects.java @@ -1,8 +1,8 @@ package de.hysky.skyblocker.skyblock.special; -import com.mojang.blaze3d.systems.RenderSystem; import de.hysky.skyblocker.config.SkyblockerConfigManager; import de.hysky.skyblocker.utils.Utils; +import de.hysky.skyblocker.utils.render.RenderHelper; import net.fabricmc.fabric.api.client.message.v1.ClientReceiveMessageEvents; import net.minecraft.client.MinecraftClient; import net.minecraft.enchantment.Enchantments; @@ -58,15 +58,10 @@ public class SpecialEffects { ItemStack stack = getStackFromName(matcher.group("item")); if (!stack.isEmpty()) { - if (RenderSystem.isOnRenderThread()) { + RenderHelper.runOnRenderThread(() -> { client.particleManager.addEmitter(client.player, ParticleTypes.PORTAL, 30); client.gameRenderer.showFloatingItem(stack); - } else { - RenderSystem.recordRenderCall(() -> { - client.particleManager.addEmitter(client.player, ParticleTypes.PORTAL, 30); - client.gameRenderer.showFloatingItem(stack); - }); - } + }); } } } diff --git a/src/main/java/de/hysky/skyblocker/utils/render/RenderHelper.java b/src/main/java/de/hysky/skyblocker/utils/render/RenderHelper.java index 9c6826af..7f3a63a3 100644 --- a/src/main/java/de/hysky/skyblocker/utils/render/RenderHelper.java +++ b/src/main/java/de/hysky/skyblocker/utils/render/RenderHelper.java @@ -245,11 +245,19 @@ public class RenderHelper { Tessellator tessellator = RenderSystem.renderThreadTesselator(); BufferBuilder buffer = tessellator.getBuffer(); VertexConsumerProvider.Immediate immediate = VertexConsumerProvider.immediate(buffer); - + immediate.draw(SRenderLayers.getFilled()); immediate.draw(SRenderLayers.getFilledThroughWalls()); } + public static void runOnRenderThread(Runnable runnable) { + if (RenderSystem.isOnRenderThread()) { + runnable.run(); + } else { + RenderSystem.recordRenderCall(() -> runnable.run()); + } + } + /** * Adds the title to {@link TitleContainer} and {@link #playNotificationSound() plays the notification sound} if the title is not in the {@link TitleContainer} already. * No checking needs to be done on whether the title is in the {@link TitleContainer} already by the caller. -- cgit From 82dabc1f9f53ebe135096fb212f10ba9f5ff679b Mon Sep 17 00:00:00 2001 From: Aaron <51387595+AzureAaron@users.noreply.github.com> Date: Sat, 11 Nov 2023 20:42:11 -0500 Subject: Reflection, meet Skyblocker. For compatibility with Sodium's upcoming RenderSystem access restrictions. --- .../skyblocker/utils/render/RenderHelper.java | 35 +++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) (limited to 'src/main/java/de') diff --git a/src/main/java/de/hysky/skyblocker/utils/render/RenderHelper.java b/src/main/java/de/hysky/skyblocker/utils/render/RenderHelper.java index 7f3a63a3..020252e7 100644 --- a/src/main/java/de/hysky/skyblocker/utils/render/RenderHelper.java +++ b/src/main/java/de/hysky/skyblocker/utils/render/RenderHelper.java @@ -1,6 +1,8 @@ package de.hysky.skyblocker.utils.render; import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.logging.LogUtils; + import de.hysky.skyblocker.mixin.accessor.BeaconBlockEntityRendererInvoker; import de.hysky.skyblocker.utils.render.culling.OcclusionCulling; import de.hysky.skyblocker.utils.render.title.Title; @@ -17,11 +19,19 @@ import net.minecraft.text.Text; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Box; import net.minecraft.util.math.Vec3d; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; + import org.joml.Matrix3f; import org.joml.Matrix4f; import org.lwjgl.opengl.GL11; +import org.slf4j.Logger; public class RenderHelper { + private static final Logger LOGGER = LogUtils.getLogger(); + private static final MethodHandle SCHEDULE_DEFERRED_RENDER_TASK = getDeferredRenderTaskHandle(); private static final Vec3d ONE = new Vec3d(1, 1, 1); private static final int MAX_OVERWORLD_BUILD_HEIGHT = 319; private static final MinecraftClient client = MinecraftClient.getInstance(); @@ -253,7 +263,17 @@ public class RenderHelper { public static void runOnRenderThread(Runnable runnable) { if (RenderSystem.isOnRenderThread()) { runnable.run(); - } else { + + return; + } else if (SCHEDULE_DEFERRED_RENDER_TASK != null) { //Sodium + try { + SCHEDULE_DEFERRED_RENDER_TASK.invokeExact(runnable); + } catch (Throwable t) { + LOGGER.error("[Skyblocker] Failed to schedule a render task!", t); + } + + return; + } else { //Vanilla RenderSystem.recordRenderCall(() -> runnable.run()); } } @@ -292,4 +312,17 @@ public class RenderHelper { public static boolean pointIsInArea(double x, double y, double x1, double y1, double x2, double y2) { return x >= x1 && x <= x2 && y >= y1 && y <= y2; } + + private static MethodHandle getDeferredRenderTaskHandle() { + try { + Class deferredTaskClass = Class.forName("me.jellysquid.mods.sodium.client.render.util.DeferredRenderTask"); + + MethodHandles.Lookup lookup = MethodHandles.publicLookup(); + MethodType mt = MethodType.methodType(void.class, Runnable.class); + + return lookup.findStatic(deferredTaskClass, "schedule", mt); + } catch (Throwable ignored) {} + + return null; + } } -- cgit From 56708738729b39392b5c60c1ba96d8e986d9457b Mon Sep 17 00:00:00 2001 From: Aaron <51387595+AzureAaron@users.noreply.github.com> Date: Sat, 11 Nov 2023 21:30:57 -0500 Subject: Batch Beacon Beams + Fix drawing from an incorrect buffer --- .../hysky/skyblocker/mixin/AfterTranslucentMixin.java | 6 +++++- .../hysky/skyblocker/utils/render/RenderHelper.java | 19 ++++++++----------- 2 files changed, 13 insertions(+), 12 deletions(-) (limited to 'src/main/java/de') diff --git a/src/main/java/de/hysky/skyblocker/mixin/AfterTranslucentMixin.java b/src/main/java/de/hysky/skyblocker/mixin/AfterTranslucentMixin.java index 07f5aa75..99ba30e1 100644 --- a/src/main/java/de/hysky/skyblocker/mixin/AfterTranslucentMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixin/AfterTranslucentMixin.java @@ -1,6 +1,7 @@ package de.hysky.skyblocker.mixin; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import com.llamalad7.mixinextras.sugar.Share; @@ -8,6 +9,7 @@ import com.llamalad7.mixinextras.sugar.ref.LocalBooleanRef; import de.hysky.skyblocker.utils.render.RenderHelper; import dev.cbyrne.betterinject.annotations.Inject; +import net.minecraft.client.render.BufferBuilderStorage; import net.minecraft.client.render.WorldRenderer; /** @@ -15,6 +17,8 @@ import net.minecraft.client.render.WorldRenderer; */ @Mixin(value = WorldRenderer.class, priority = 2000) public class AfterTranslucentMixin { + @Shadow + private BufferBuilderStorage bufferBuilders; @Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/particle/ParticleManager;renderParticles(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider$Immediate;Lnet/minecraft/client/render/LightmapTextureManager;Lnet/minecraft/client/render/Camera;F)V")) private void onRenderParticles(@Share("renderedParticles") LocalBooleanRef renderedParticles) { @@ -25,7 +29,7 @@ public class AfterTranslucentMixin { private void beforeClouds(@Share("renderedParticles") LocalBooleanRef renderedParticles) { if (renderedParticles.get()) { renderedParticles.set(false); - RenderHelper.drawGlobalObjectsAfterTranslucent(); + RenderHelper.drawGlobalObjectsAfterAfterTranslucent(bufferBuilders.getEntityVertexConsumers()); } } } diff --git a/src/main/java/de/hysky/skyblocker/utils/render/RenderHelper.java b/src/main/java/de/hysky/skyblocker/utils/render/RenderHelper.java index 020252e7..1058d94c 100644 --- a/src/main/java/de/hysky/skyblocker/utils/render/RenderHelper.java +++ b/src/main/java/de/hysky/skyblocker/utils/render/RenderHelper.java @@ -12,6 +12,7 @@ import net.minecraft.client.MinecraftClient; import net.minecraft.client.font.TextRenderer; import net.minecraft.client.render.*; import net.minecraft.client.render.VertexFormat.DrawMode; +import net.minecraft.client.render.block.entity.BeaconBlockEntityRenderer; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.sound.SoundEvents; import net.minecraft.text.OrderedText; @@ -76,13 +77,8 @@ public class RenderHelper { matrices.push(); matrices.translate(pos.getX() - camera.getX(), pos.getY() - camera.getY(), pos.getZ() - camera.getZ()); - Tessellator tessellator = RenderSystem.renderThreadTesselator(); - BufferBuilder buffer = tessellator.getBuffer(); - VertexConsumerProvider.Immediate consumer = VertexConsumerProvider.immediate(buffer); + BeaconBlockEntityRendererInvoker.renderBeam(matrices, context.consumers(), context.tickDelta(), context.world().getTime(), 0, MAX_OVERWORLD_BUILD_HEIGHT, colorComponents); - BeaconBlockEntityRendererInvoker.renderBeam(matrices, consumer, context.tickDelta(), context.world().getTime(), 0, MAX_OVERWORLD_BUILD_HEIGHT, colorComponents); - - consumer.draw(); matrices.pop(); } } @@ -251,13 +247,14 @@ public class RenderHelper { matrices.pop(); } - public static void drawGlobalObjectsAfterTranslucent() { - Tessellator tessellator = RenderSystem.renderThreadTesselator(); - BufferBuilder buffer = tessellator.getBuffer(); - VertexConsumerProvider.Immediate immediate = VertexConsumerProvider.immediate(buffer); - + public static void drawGlobalObjectsAfterAfterTranslucent(VertexConsumerProvider.Immediate immediate) { + //Filled Blocks immediate.draw(SRenderLayers.getFilled()); immediate.draw(SRenderLayers.getFilledThroughWalls()); + + //Beacon Beams + immediate.draw(RenderLayer.getBeaconBeam(BeaconBlockEntityRenderer.BEAM_TEXTURE, false)); + immediate.draw(RenderLayer.getBeaconBeam(BeaconBlockEntityRenderer.BEAM_TEXTURE, true)); } public static void runOnRenderThread(Runnable runnable) { -- cgit From 6df84520c766cb326ea124031c7a6879cf643380 Mon Sep 17 00:00:00 2001 From: Aaron <51387595+AzureAaron@users.noreply.github.com> Date: Sun, 12 Nov 2023 02:49:29 -0500 Subject: Fix and improve rendering --- .../java/de/hysky/skyblocker/SkyblockerMod.java | 2 ++ .../skyblocker/mixin/AfterTranslucentMixin.java | 35 ---------------------- .../skyblocker/utils/render/RenderHelper.java | 25 ++++++++++------ .../skyblocker/utils/render/SRenderLayers.java | 6 ++-- src/main/resources/skyblocker.mixins.json | 1 - 5 files changed, 21 insertions(+), 48 deletions(-) delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/AfterTranslucentMixin.java (limited to 'src/main/java/de') diff --git a/src/main/java/de/hysky/skyblocker/SkyblockerMod.java b/src/main/java/de/hysky/skyblocker/SkyblockerMod.java index b398e9b6..52c44082 100644 --- a/src/main/java/de/hysky/skyblocker/SkyblockerMod.java +++ b/src/main/java/de/hysky/skyblocker/SkyblockerMod.java @@ -26,6 +26,7 @@ import de.hysky.skyblocker.utils.NEURepoManager; import de.hysky.skyblocker.utils.Utils; import de.hysky.skyblocker.utils.chat.ChatMessageListener; import de.hysky.skyblocker.utils.discord.DiscordRPCManager; +import de.hysky.skyblocker.utils.render.RenderHelper; import de.hysky.skyblocker.utils.render.culling.OcclusionCulling; import de.hysky.skyblocker.utils.render.gui.ContainerSolverManager; import de.hysky.skyblocker.utils.render.title.TitleContainer; @@ -113,6 +114,7 @@ public class SkyblockerMod implements ClientModInitializer { MuseumItemCache.init(); SecretsTracker.init(); ApiUtils.init(); + RenderHelper.init(); containerSolverManager.init(); statusBarTracker.init(); Scheduler.INSTANCE.scheduleCyclic(Utils::update, 20); diff --git a/src/main/java/de/hysky/skyblocker/mixin/AfterTranslucentMixin.java b/src/main/java/de/hysky/skyblocker/mixin/AfterTranslucentMixin.java deleted file mode 100644 index 99ba30e1..00000000 --- a/src/main/java/de/hysky/skyblocker/mixin/AfterTranslucentMixin.java +++ /dev/null @@ -1,35 +0,0 @@ -package de.hysky.skyblocker.mixin; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; - -import com.llamalad7.mixinextras.sugar.Share; -import com.llamalad7.mixinextras.sugar.ref.LocalBooleanRef; - -import de.hysky.skyblocker.utils.render.RenderHelper; -import dev.cbyrne.betterinject.annotations.Inject; -import net.minecraft.client.render.BufferBuilderStorage; -import net.minecraft.client.render.WorldRenderer; - -/** - * Injects after Fabric's After Translucent world render event - */ -@Mixin(value = WorldRenderer.class, priority = 2000) -public class AfterTranslucentMixin { - @Shadow - private BufferBuilderStorage bufferBuilders; - - @Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/particle/ParticleManager;renderParticles(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider$Immediate;Lnet/minecraft/client/render/LightmapTextureManager;Lnet/minecraft/client/render/Camera;F)V")) - private void onRenderParticles(@Share("renderedParticles") LocalBooleanRef renderedParticles) { - renderedParticles.set(true); - } - - @Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/util/math/MatrixStack;push()V")) - private void beforeClouds(@Share("renderedParticles") LocalBooleanRef renderedParticles) { - if (renderedParticles.get()) { - renderedParticles.set(false); - RenderHelper.drawGlobalObjectsAfterAfterTranslucent(bufferBuilders.getEntityVertexConsumers()); - } - } -} diff --git a/src/main/java/de/hysky/skyblocker/utils/render/RenderHelper.java b/src/main/java/de/hysky/skyblocker/utils/render/RenderHelper.java index 1058d94c..b64a8404 100644 --- a/src/main/java/de/hysky/skyblocker/utils/render/RenderHelper.java +++ b/src/main/java/de/hysky/skyblocker/utils/render/RenderHelper.java @@ -3,20 +3,23 @@ package de.hysky.skyblocker.utils.render; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.logging.LogUtils; +import de.hysky.skyblocker.SkyblockerMod; import de.hysky.skyblocker.mixin.accessor.BeaconBlockEntityRendererInvoker; import de.hysky.skyblocker.utils.render.culling.OcclusionCulling; import de.hysky.skyblocker.utils.render.title.Title; import de.hysky.skyblocker.utils.render.title.TitleContainer; import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext; +import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents; +import net.fabricmc.fabric.api.event.Event; import net.minecraft.client.MinecraftClient; import net.minecraft.client.font.TextRenderer; import net.minecraft.client.render.*; import net.minecraft.client.render.VertexFormat.DrawMode; -import net.minecraft.client.render.block.entity.BeaconBlockEntityRenderer; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.sound.SoundEvents; import net.minecraft.text.OrderedText; import net.minecraft.text.Text; +import net.minecraft.util.Identifier; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Box; import net.minecraft.util.math.Vec3d; @@ -32,11 +35,17 @@ import org.slf4j.Logger; public class RenderHelper { private static final Logger LOGGER = LogUtils.getLogger(); + private static final Identifier TRANSLUCENT_DRAW = new Identifier(SkyblockerMod.NAMESPACE, "translucent_draw"); private static final MethodHandle SCHEDULE_DEFERRED_RENDER_TASK = getDeferredRenderTaskHandle(); private static final Vec3d ONE = new Vec3d(1, 1, 1); private static final int MAX_OVERWORLD_BUILD_HEIGHT = 319; private static final MinecraftClient client = MinecraftClient.getInstance(); + public static void init() { + WorldRenderEvents.AFTER_TRANSLUCENT.addPhaseOrdering(Event.DEFAULT_PHASE, TRANSLUCENT_DRAW); + WorldRenderEvents.AFTER_TRANSLUCENT.register(TRANSLUCENT_DRAW, RenderHelper::drawTranslucents); + } + public static void renderFilledThroughWallsWithBeaconBeam(WorldRenderContext context, BlockPos pos, float[] colorComponents, float alpha) { renderFilledThroughWalls(context, pos, colorComponents, alpha); renderBeaconBeam(context, pos, colorComponents); @@ -247,14 +256,12 @@ public class RenderHelper { matrices.pop(); } - public static void drawGlobalObjectsAfterAfterTranslucent(VertexConsumerProvider.Immediate immediate) { - //Filled Blocks - immediate.draw(SRenderLayers.getFilled()); - immediate.draw(SRenderLayers.getFilledThroughWalls()); - - //Beacon Beams - immediate.draw(RenderLayer.getBeaconBeam(BeaconBlockEntityRenderer.BEAM_TEXTURE, false)); - immediate.draw(RenderLayer.getBeaconBeam(BeaconBlockEntityRenderer.BEAM_TEXTURE, true)); + /** + * This is called after all {@link WorldRenderEvents#AFTER_TRANSLUCENT} listeners have been called so that we can draw all remaining render layers. + */ + private static void drawTranslucents(WorldRenderContext context) { + //Draw all render layers that haven't been drawn yet - drawing a specific layer does nothing and idk why + ((VertexConsumerProvider.Immediate) context.consumers()).draw(); } public static void runOnRenderThread(Runnable runnable) { diff --git a/src/main/java/de/hysky/skyblocker/utils/render/SRenderLayers.java b/src/main/java/de/hysky/skyblocker/utils/render/SRenderLayers.java index 4c1beb1f..e2725767 100644 --- a/src/main/java/de/hysky/skyblocker/utils/render/SRenderLayers.java +++ b/src/main/java/de/hysky/skyblocker/utils/render/SRenderLayers.java @@ -13,12 +13,12 @@ import net.minecraft.client.render.VertexFormat.DrawMode; import net.minecraft.client.render.VertexFormats; public class SRenderLayers { - private static final Transparency DEFAULT_TRANSPARENCY = new Transparency("default", () -> { + private static final Transparency DEFAULT_TRANSPARENCY = new Transparency("default_transparency", () -> { RenderSystem.enableBlend(); RenderSystem.defaultBlendFunc(); }, () -> RenderSystem.disableBlend()); - private static final MultiPhase FILLED = RenderLayer.of("filled", VertexFormats.POSITION_COLOR, DrawMode.TRIANGLE_STRIP, 131072, false, true, MultiPhaseParameters.builder() + private static final MultiPhase FILLED = RenderLayer.of("filled", VertexFormats.POSITION_COLOR, DrawMode.TRIANGLE_STRIP, RenderLayer.CUTOUT_BUFFER_SIZE, false, true, MultiPhaseParameters.builder() .program(RenderPhase.COLOR_PROGRAM) .cull(Cull.DISABLE_CULLING) .layering(RenderPhase.POLYGON_OFFSET_LAYERING) @@ -26,7 +26,7 @@ public class SRenderLayers { .depthTest(DepthTest.LEQUAL_DEPTH_TEST) .build(false)); - private static final MultiPhase FILLED_THROUGH_WALLS = RenderLayer.of("filled_through_walls", VertexFormats.POSITION_COLOR, DrawMode.TRIANGLE_STRIP, 131072, false, true, MultiPhaseParameters.builder() + private static final MultiPhase FILLED_THROUGH_WALLS = RenderLayer.of("filled_through_walls", VertexFormats.POSITION_COLOR, DrawMode.TRIANGLE_STRIP, RenderLayer.CUTOUT_BUFFER_SIZE, false, true, MultiPhaseParameters.builder() .program(RenderPhase.COLOR_PROGRAM) .cull(Cull.DISABLE_CULLING) .layering(RenderPhase.POLYGON_OFFSET_LAYERING) diff --git a/src/main/resources/skyblocker.mixins.json b/src/main/resources/skyblocker.mixins.json index 5a72f8c6..4e7bfe16 100644 --- a/src/main/resources/skyblocker.mixins.json +++ b/src/main/resources/skyblocker.mixins.json @@ -5,7 +5,6 @@ "compatibilityLevel": "JAVA_17", "client": [ "AbstractInventoryScreenMixin", - "AfterTranslucentMixin", "ArmorTrimMixin", "BatEntityMixin", "ClientPlayerEntityMixin", -- cgit From 4828dd781882324bd455c199bbf6ad625886a96b Mon Sep 17 00:00:00 2001 From: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> Date: Mon, 13 Nov 2023 20:11:18 -0500 Subject: Refactor RenderHelper --- .../skyblocker/utils/render/RenderHelper.java | 11 ++---- .../skyblocker/utils/render/SRenderLayers.java | 44 ---------------------- .../utils/render/SkyblockerRenderLayers.java | 36 ++++++++++++++++++ 3 files changed, 40 insertions(+), 51 deletions(-) delete mode 100644 src/main/java/de/hysky/skyblocker/utils/render/SRenderLayers.java create mode 100644 src/main/java/de/hysky/skyblocker/utils/render/SkyblockerRenderLayers.java (limited to 'src/main/java/de') diff --git a/src/main/java/de/hysky/skyblocker/utils/render/RenderHelper.java b/src/main/java/de/hysky/skyblocker/utils/render/RenderHelper.java index b64a8404..3d8213fe 100644 --- a/src/main/java/de/hysky/skyblocker/utils/render/RenderHelper.java +++ b/src/main/java/de/hysky/skyblocker/utils/render/RenderHelper.java @@ -71,7 +71,7 @@ public class RenderHelper { matrices.translate(-camera.x, -camera.y, -camera.z); VertexConsumerProvider consumers = context.consumers(); - VertexConsumer buffer = throughWalls ? consumers.getBuffer(SRenderLayers.getFilledThroughWalls()) : consumers.getBuffer(SRenderLayers.getFilled()); + VertexConsumer buffer = consumers.getBuffer(throughWalls ? SkyblockerRenderLayers.FILLED_THROUGH_WALLS : SkyblockerRenderLayers.FILLED); WorldRenderer.renderFilledBox(matrices, buffer, pos.x, pos.y, pos.z, pos.x + dimensions.x, pos.y + dimensions.y, pos.z + dimensions.z, colorComponents[0], colorComponents[1], colorComponents[2], alpha); @@ -267,18 +267,14 @@ public class RenderHelper { public static void runOnRenderThread(Runnable runnable) { if (RenderSystem.isOnRenderThread()) { runnable.run(); - - return; } else if (SCHEDULE_DEFERRED_RENDER_TASK != null) { //Sodium try { SCHEDULE_DEFERRED_RENDER_TASK.invokeExact(runnable); } catch (Throwable t) { LOGGER.error("[Skyblocker] Failed to schedule a render task!", t); } - - return; } else { //Vanilla - RenderSystem.recordRenderCall(() -> runnable.run()); + RenderSystem.recordRenderCall(runnable::run); } } @@ -316,7 +312,8 @@ public class RenderHelper { public static boolean pointIsInArea(double x, double y, double x1, double y1, double x2, double y2) { return x >= x1 && x <= x2 && y >= y1 && y <= y2; } - + + // TODO Get rid of reflection once the new Sodium is released private static MethodHandle getDeferredRenderTaskHandle() { try { Class deferredTaskClass = Class.forName("me.jellysquid.mods.sodium.client.render.util.DeferredRenderTask"); diff --git a/src/main/java/de/hysky/skyblocker/utils/render/SRenderLayers.java b/src/main/java/de/hysky/skyblocker/utils/render/SRenderLayers.java deleted file mode 100644 index e2725767..00000000 --- a/src/main/java/de/hysky/skyblocker/utils/render/SRenderLayers.java +++ /dev/null @@ -1,44 +0,0 @@ -package de.hysky.skyblocker.utils.render; - -import com.mojang.blaze3d.systems.RenderSystem; - -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.RenderLayer.MultiPhase; -import net.minecraft.client.render.RenderLayer.MultiPhaseParameters; -import net.minecraft.client.render.RenderPhase; -import net.minecraft.client.render.RenderPhase.Cull; -import net.minecraft.client.render.RenderPhase.DepthTest; -import net.minecraft.client.render.RenderPhase.Transparency; -import net.minecraft.client.render.VertexFormat.DrawMode; -import net.minecraft.client.render.VertexFormats; - -public class SRenderLayers { - private static final Transparency DEFAULT_TRANSPARENCY = new Transparency("default_transparency", () -> { - RenderSystem.enableBlend(); - RenderSystem.defaultBlendFunc(); - }, () -> RenderSystem.disableBlend()); - - private static final MultiPhase FILLED = RenderLayer.of("filled", VertexFormats.POSITION_COLOR, DrawMode.TRIANGLE_STRIP, RenderLayer.CUTOUT_BUFFER_SIZE, false, true, MultiPhaseParameters.builder() - .program(RenderPhase.COLOR_PROGRAM) - .cull(Cull.DISABLE_CULLING) - .layering(RenderPhase.POLYGON_OFFSET_LAYERING) - .transparency(DEFAULT_TRANSPARENCY) - .depthTest(DepthTest.LEQUAL_DEPTH_TEST) - .build(false)); - - private static final MultiPhase FILLED_THROUGH_WALLS = RenderLayer.of("filled_through_walls", VertexFormats.POSITION_COLOR, DrawMode.TRIANGLE_STRIP, RenderLayer.CUTOUT_BUFFER_SIZE, false, true, MultiPhaseParameters.builder() - .program(RenderPhase.COLOR_PROGRAM) - .cull(Cull.DISABLE_CULLING) - .layering(RenderPhase.POLYGON_OFFSET_LAYERING) - .transparency(DEFAULT_TRANSPARENCY) - .depthTest(DepthTest.ALWAYS_DEPTH_TEST) - .build(false)); - - public static MultiPhase getFilled() { - return FILLED; - } - - public static MultiPhase getFilledThroughWalls() { - return FILLED_THROUGH_WALLS; - } -} diff --git a/src/main/java/de/hysky/skyblocker/utils/render/SkyblockerRenderLayers.java b/src/main/java/de/hysky/skyblocker/utils/render/SkyblockerRenderLayers.java new file mode 100644 index 00000000..ee113cc4 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/utils/render/SkyblockerRenderLayers.java @@ -0,0 +1,36 @@ +package de.hysky.skyblocker.utils.render; + +import com.mojang.blaze3d.systems.RenderSystem; + +import net.minecraft.client.render.RenderLayer; +import net.minecraft.client.render.RenderLayer.MultiPhase; +import net.minecraft.client.render.RenderLayer.MultiPhaseParameters; +import net.minecraft.client.render.RenderPhase; +import net.minecraft.client.render.RenderPhase.Cull; +import net.minecraft.client.render.RenderPhase.DepthTest; +import net.minecraft.client.render.RenderPhase.Transparency; +import net.minecraft.client.render.VertexFormat.DrawMode; +import net.minecraft.client.render.VertexFormats; + +public class SkyblockerRenderLayers { + private static final Transparency DEFAULT_TRANSPARENCY = new Transparency("default_transparency", () -> { + RenderSystem.enableBlend(); + RenderSystem.defaultBlendFunc(); + }, RenderSystem::disableBlend); + + public static final MultiPhase FILLED = RenderLayer.of("filled", VertexFormats.POSITION_COLOR, DrawMode.TRIANGLE_STRIP, RenderLayer.CUTOUT_BUFFER_SIZE, false, true, MultiPhaseParameters.builder() + .program(RenderPhase.COLOR_PROGRAM) + .cull(Cull.DISABLE_CULLING) + .layering(RenderPhase.POLYGON_OFFSET_LAYERING) + .transparency(DEFAULT_TRANSPARENCY) + .depthTest(DepthTest.LEQUAL_DEPTH_TEST) + .build(false)); + + public static final MultiPhase FILLED_THROUGH_WALLS = RenderLayer.of("filled_through_walls", VertexFormats.POSITION_COLOR, DrawMode.TRIANGLE_STRIP, RenderLayer.CUTOUT_BUFFER_SIZE, false, true, MultiPhaseParameters.builder() + .program(RenderPhase.COLOR_PROGRAM) + .cull(Cull.DISABLE_CULLING) + .layering(RenderPhase.POLYGON_OFFSET_LAYERING) + .transparency(DEFAULT_TRANSPARENCY) + .depthTest(DepthTest.ALWAYS_DEPTH_TEST) + .build(false)); +} -- cgit