aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main/java/de/hysky/skyblocker/mixin/AfterTranslucentMixin.java31
-rw-r--r--src/main/java/de/hysky/skyblocker/utils/render/RenderHelper.java34
-rw-r--r--src/main/java/de/hysky/skyblocker/utils/render/SRenderLayers.java44
-rw-r--r--src/main/resources/skyblocker.mixins.json1
4 files changed, 89 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;
+ }
+}
diff --git a/src/main/resources/skyblocker.mixins.json b/src/main/resources/skyblocker.mixins.json
index 4e7bfe16..5a72f8c6 100644
--- a/src/main/resources/skyblocker.mixins.json
+++ b/src/main/resources/skyblocker.mixins.json
@@ -5,6 +5,7 @@
"compatibilityLevel": "JAVA_17",
"client": [
"AbstractInventoryScreenMixin",
+ "AfterTranslucentMixin",
"ArmorTrimMixin",
"BatEntityMixin",
"ClientPlayerEntityMixin",