diff options
Diffstat (limited to 'src/main/java')
3 files changed, 88 insertions, 21 deletions
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; + } +} |