diff options
| author | Aaron <51387595+AzureAaron@users.noreply.github.com> | 2024-12-22 05:21:24 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-12-22 05:21:24 -0500 |
| commit | 7e7020b518671325e8249fcee2dbfa3ec9e25c31 (patch) | |
| tree | 96f98cb3602d0b12ede62f1e4cbee195eea34aea /src/main/java | |
| parent | fab3e8a8389206f0e25893fd0003896abd9c5ebe (diff) | |
| download | Skyblocker-7e7020b518671325e8249fcee2dbfa3ec9e25c31.tar.gz Skyblocker-7e7020b518671325e8249fcee2dbfa3ec9e25c31.tar.bz2 Skyblocker-7e7020b518671325e8249fcee2dbfa3ec9e25c31.zip | |
Fix Glowing (#1093)
Diffstat (limited to 'src/main/java')
5 files changed, 88 insertions, 1 deletions
diff --git a/src/main/java/de/hysky/skyblocker/injected/CustomGlowInfo.java b/src/main/java/de/hysky/skyblocker/injected/CustomGlowInfo.java new file mode 100644 index 00000000..fd1ca401 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/injected/CustomGlowInfo.java @@ -0,0 +1,8 @@ +package de.hysky.skyblocker.injected; + +public interface CustomGlowInfo { + + default boolean atLeastOneMobHasCustomGlow() { + return false; + } +} diff --git a/src/main/java/de/hysky/skyblocker/mixins/RenderLayerMultiPhaseMixin.java b/src/main/java/de/hysky/skyblocker/mixins/RenderLayerMultiPhaseMixin.java new file mode 100644 index 00000000..87d591de --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/mixins/RenderLayerMultiPhaseMixin.java @@ -0,0 +1,20 @@ +package de.hysky.skyblocker.mixins; + +import org.objectweb.asm.Opcodes; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; + +import de.hysky.skyblocker.utils.render.SkyblockerRenderLayers; +import net.minecraft.client.render.RenderLayer; +import net.minecraft.client.render.RenderPhase.DepthTest; + +@Mixin(RenderLayer.MultiPhase.class) +public class RenderLayerMultiPhaseMixin { + + @ModifyExpressionValue(method = "method_34844", at = @At(value = "FIELD", target = "Lnet/minecraft/client/render/RenderLayer$MultiPhase;ALWAYS_DEPTH_TEST:Lnet/minecraft/client/render/RenderPhase$DepthTest;", opcode = Opcodes.GETSTATIC)) + private static DepthTest skyblocker$modifyDepthTestForOutlineLayer(DepthTest depthTest) { + return SkyblockerRenderLayers.OUTLINE_ALWAYS; + } +} diff --git a/src/main/java/de/hysky/skyblocker/mixins/RenderPhaseDepthTestMixin.java b/src/main/java/de/hysky/skyblocker/mixins/RenderPhaseDepthTestMixin.java new file mode 100644 index 00000000..d90606db --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/mixins/RenderPhaseDepthTestMixin.java @@ -0,0 +1,49 @@ +package de.hysky.skyblocker.mixins; + +import org.lwjgl.opengl.GL11; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyArg; + +import com.llamalad7.mixinextras.sugar.Local; +import com.mojang.blaze3d.systems.RenderSystem; + +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.render.RenderPhase; +import net.minecraft.client.render.WorldRenderer; + +@Mixin(RenderPhase.DepthTest.class) +public class RenderPhaseDepthTestMixin { + + @ModifyArg(method = "<init>", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/RenderPhase;<init>(Ljava/lang/String;Ljava/lang/Runnable;Ljava/lang/Runnable;)V"), index = 1) + private static Runnable skyblocker$modifyOutlineAlwaysStartAction(Runnable original, @Local(argsOnly = true) String depthFunctionName) { + if (depthFunctionName.equals("outline_always")) { + return () -> { + WorldRenderer worldRenderer = MinecraftClient.getInstance().worldRenderer; + + if (worldRenderer != null && worldRenderer.atLeastOneMobHasCustomGlow()) { + RenderSystem.enableDepthTest(); + RenderSystem.depthFunc(GL11.GL_LEQUAL); + } + }; + } + + return original; + } + + @ModifyArg(method = "<init>", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/RenderPhase;<init>(Ljava/lang/String;Ljava/lang/Runnable;Ljava/lang/Runnable;)V"), index = 2) + private static Runnable skyblocker$modifyOutlineAlwaysEndAction(Runnable original, @Local(argsOnly = true) String depthFunctionName) { + if (depthFunctionName.equals("outline_always")) { + return () -> { + WorldRenderer worldRenderer = MinecraftClient.getInstance().worldRenderer; + + if (worldRenderer != null && worldRenderer.atLeastOneMobHasCustomGlow()) { + RenderSystem.disableDepthTest(); + RenderSystem.depthFunc(GL11.GL_LEQUAL); + } + }; + } + + return original; + } +} diff --git a/src/main/java/de/hysky/skyblocker/mixins/WorldRendererMixin.java b/src/main/java/de/hysky/skyblocker/mixins/WorldRendererMixin.java index 01b1a0d6..c98104af 100644 --- a/src/main/java/de/hysky/skyblocker/mixins/WorldRendererMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixins/WorldRendererMixin.java @@ -15,6 +15,7 @@ import com.llamalad7.mixinextras.sugar.Local; import com.llamalad7.mixinextras.sugar.Share; import com.llamalad7.mixinextras.sugar.ref.LocalBooleanRef; +import de.hysky.skyblocker.injected.CustomGlowInfo; import de.hysky.skyblocker.skyblock.dungeon.LividColor; import de.hysky.skyblocker.skyblock.entity.MobBoundingBoxes; import de.hysky.skyblocker.skyblock.entity.MobGlow; @@ -26,7 +27,7 @@ import net.minecraft.entity.Entity; import net.minecraft.entity.decoration.ArmorStandEntity; @Mixin(WorldRenderer.class) -public class WorldRendererMixin { +public class WorldRendererMixin implements CustomGlowInfo { @Shadow @Final private MinecraftClient client; @@ -81,6 +82,11 @@ public class WorldRendererMixin { } } + @Override + public boolean atLeastOneMobHasCustomGlow() { + return atLeastOneMobHasCustomGlow; + } + @Inject(method = "render", at = @At("TAIL")) private void skyblocker$resetCustomGlowBool(CallbackInfo ci) { atLeastOneMobHasCustomGlow = false; diff --git a/src/main/java/de/hysky/skyblocker/utils/render/SkyblockerRenderLayers.java b/src/main/java/de/hysky/skyblocker/utils/render/SkyblockerRenderLayers.java index 7724be1f..faa4eebc 100644 --- a/src/main/java/de/hysky/skyblocker/utils/render/SkyblockerRenderLayers.java +++ b/src/main/java/de/hysky/skyblocker/utils/render/SkyblockerRenderLayers.java @@ -1,5 +1,7 @@ package de.hysky.skyblocker.utils.render; +import org.lwjgl.opengl.GL11; + import net.minecraft.client.render.RenderLayer; import net.minecraft.client.render.RenderLayer.MultiPhase; import net.minecraft.client.render.RenderLayer.MultiPhaseParameters; @@ -9,6 +11,8 @@ import net.minecraft.client.render.VertexFormat.DrawMode; import net.minecraft.client.render.VertexFormats; public class SkyblockerRenderLayers { + public static final DepthTest OUTLINE_ALWAYS = new DepthTest("outline_always", GL11.GL_ALWAYS); + public static final MultiPhase FILLED = RenderLayer.of("filled", VertexFormats.POSITION_COLOR, DrawMode.TRIANGLE_STRIP, RenderLayer.CUTOUT_BUFFER_SIZE, false, true, MultiPhaseParameters.builder() .program(RenderPhase.POSITION_COLOR_PROGRAM) .layering(RenderPhase.VIEW_OFFSET_Z_LAYERING) |
