From cd94a21ad5ee2a16a72915330514035f0c0b0816 Mon Sep 17 00:00:00 2001 From: maximumpower55 <62370320+maximumpower55@users.noreply.github.com> Date: Sat, 2 Oct 2021 00:28:06 -0700 Subject: [PATCH 01/53] Add In Level Hand Renderering --- .../iris/mixin/MixinLevelRenderer.java | 16 ++++ .../mixin/rendertype/MixinRenderType.java | 8 +- .../DeferredWorldRenderingPipeline.java | 4 + .../coderbot/iris/pipeline/HandRendering.java | 75 +++++++++++++++++++ 4 files changed, 102 insertions(+), 1 deletion(-) create mode 100644 src/main/java/net/coderbot/iris/pipeline/HandRendering.java diff --git a/src/main/java/net/coderbot/iris/mixin/MixinLevelRenderer.java b/src/main/java/net/coderbot/iris/mixin/MixinLevelRenderer.java index 6cd7c31191..de88af0b5b 100644 --- a/src/main/java/net/coderbot/iris/mixin/MixinLevelRenderer.java +++ b/src/main/java/net/coderbot/iris/mixin/MixinLevelRenderer.java @@ -8,6 +8,7 @@ import net.coderbot.iris.Iris; import net.coderbot.iris.gl.program.Program; import net.coderbot.iris.layer.GbufferProgram; +import net.coderbot.iris.pipeline.HandRendering; import net.coderbot.iris.pipeline.WorldRenderingPipeline; import net.coderbot.iris.uniforms.CapturedRenderingState; import net.minecraft.client.Camera; @@ -15,7 +16,10 @@ import net.minecraft.client.Options; import net.minecraft.client.renderer.*; import net.minecraft.world.phys.Vec3; + +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -29,6 +33,10 @@ @Mixin(LevelRenderer.class) @Environment(EnvType.CLIENT) public class MixinLevelRenderer { + @Shadow + @Final + private RenderBuffers renderBuffers; + private static final String RENDER_LEVEL = "Lnet/minecraft/client/renderer/LevelRenderer;renderLevel(Lcom/mojang/blaze3d/vertex/PoseStack;FJZLnet/minecraft/client/Camera;Lnet/minecraft/client/renderer/GameRenderer;Lnet/minecraft/client/renderer/LightTexture;Lcom/mojang/math/Matrix4f;)V"; private static final String CLEAR = "Lcom/mojang/blaze3d/systems/RenderSystem;clear(IZ)V"; private static final String RENDER_SKY = "Lnet/minecraft/client/renderer/LevelRenderer;renderSky(Lcom/mojang/blaze3d/vertex/PoseStack;F)V"; @@ -59,6 +67,8 @@ public class MixinLevelRenderer { pipeline = Iris.getPipelineManager().preparePipeline(Iris.getCurrentDimension()); pipeline.beginLevelRendering(); + + HandRendering.prepareForRendering(renderBuffers, poseStack, tickDelta, camera, gameRenderer); } // Inject a bit early so that we can end our rendering before mods like VoxelMap (which inject at RETURN) @@ -212,4 +222,10 @@ public class MixinLevelRenderer { Minecraft.getInstance().getProfiler().popPush("iris_pre_translucent"); pipeline.beginTranslucents(); } + + @Inject(method = "renderLevel", at = @At(value = "CONSTANT", args = "stringValue=translucent")) + private void iris$renderHands(CallbackInfo ci) { + Minecraft.getInstance().getProfiler().popPush("iris_hand"); + HandRendering.render(); + } } diff --git a/src/main/java/net/coderbot/iris/mixin/rendertype/MixinRenderType.java b/src/main/java/net/coderbot/iris/mixin/rendertype/MixinRenderType.java index f720cf502c..4064722bd7 100644 --- a/src/main/java/net/coderbot/iris/mixin/rendertype/MixinRenderType.java +++ b/src/main/java/net/coderbot/iris/mixin/rendertype/MixinRenderType.java @@ -3,6 +3,8 @@ import net.coderbot.iris.layer.GbufferProgram; import net.coderbot.iris.layer.IrisRenderTypeWrapper; import net.coderbot.iris.layer.UseProgramRenderStateShard; +import net.coderbot.iris.pipeline.HandRendering; + import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mutable; @@ -150,7 +152,11 @@ private static RenderType wrap(RenderType wrapped, GbufferProgram program) { private static void iris$wrapEntityRenderTypes(ResourceLocation texture, CallbackInfoReturnable cir) { RenderType base = cir.getReturnValue(); - cir.setReturnValue(wrap(base, GbufferProgram.ENTITIES)); + if(HandRendering.isRendering()) { + cir.setReturnValue(wrap(base, GbufferProgram.HAND)); + } else { + cir.setReturnValue(wrap(base, GbufferProgram.ENTITIES)); + } } @Inject(at = @At("RETURN"), method = { diff --git a/src/main/java/net/coderbot/iris/pipeline/DeferredWorldRenderingPipeline.java b/src/main/java/net/coderbot/iris/pipeline/DeferredWorldRenderingPipeline.java index 2be0ac39b4..96b218eda3 100644 --- a/src/main/java/net/coderbot/iris/pipeline/DeferredWorldRenderingPipeline.java +++ b/src/main/java/net/coderbot/iris/pipeline/DeferredWorldRenderingPipeline.java @@ -82,6 +82,8 @@ public class DeferredWorldRenderingPipeline implements WorldRenderingPipeline { @Nullable private final Pass blockEntities; @Nullable + private final Pass hand; + @Nullable private final Pass glowingEntities; @Nullable private final Pass glint; @@ -256,6 +258,7 @@ public DeferredWorldRenderingPipeline(ProgramSet programs) { this.beaconBeam = programs.getGbuffersBeaconBeam().map(this::createPass).orElse(textured); this.entities = programs.getGbuffersEntities().map(this::createPass).orElse(texturedLit); this.blockEntities = programs.getGbuffersBlock().map(this::createPass).orElse(terrain); + this.hand = programs.getGbuffersHand().map(this::createPass).orElse(entities); this.glowingEntities = programs.getGbuffersEntitiesGlowing().map(this::createPass).orElse(entities); this.glint = programs.getGbuffersGlint().map(this::createPass).orElse(textured); this.eyes = programs.getGbuffersEntityEyes().map(this::createPass).orElse(textured); @@ -381,6 +384,7 @@ private Pass getPass(GbufferProgram program) { case WEATHER: return weather; case HAND: + return hand; default: // TODO throw new UnsupportedOperationException("TODO: Unsupported gbuffer program: " + program); diff --git a/src/main/java/net/coderbot/iris/pipeline/HandRendering.java b/src/main/java/net/coderbot/iris/pipeline/HandRendering.java new file mode 100644 index 0000000000..5ba404a2c4 --- /dev/null +++ b/src/main/java/net/coderbot/iris/pipeline/HandRendering.java @@ -0,0 +1,75 @@ +package net.coderbot.iris.pipeline; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Matrix4f; +import com.mojang.math.Vector3f; + +import net.minecraft.client.Camera; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.client.renderer.RenderBuffers; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.GameType; + +public class HandRendering { + private static final Minecraft minecraft = Minecraft.getInstance(); + + private static GameRenderer gameRenderer; + private static RenderBuffers renderBuffers; + private static PoseStack poseStack; + private static float tickDelta; + private static Camera camera; + + private static boolean rendering; + + private static boolean canRender; + + public static void prepareForRendering(RenderBuffers renderBuffers, PoseStack poseStack, float tickDelta, Camera camera, GameRenderer gameRenderer) { + canRender = !(camera.isDetached() || !(camera.getEntity() instanceof Player) || minecraft.options.hideGui || (camera.getEntity() instanceof LivingEntity && ((LivingEntity)camera.getEntity()).isSleeping()) || minecraft.gameMode.getPlayerMode() == GameType.SPECTATOR); + + HandRendering.gameRenderer = gameRenderer; + HandRendering.renderBuffers = renderBuffers; + HandRendering.poseStack = poseStack; + HandRendering.tickDelta = tickDelta; + HandRendering.camera = camera; + } + + public static void render() { + if(!canRender) return; + + rendering = true; + + poseStack.pushPose(); + + final PoseStack.Pose pose = poseStack.last(); + + pose.pose().multiply(Matrix4f.perspective(minecraft.options.fov, minecraft.getWindow().getWidth() / (float)minecraft.getWindow().getHeight(), .05f, gameRenderer.getRenderDistance() * 4f)); + + pose.pose().setIdentity(); + pose.normal().setIdentity(); + + if(minecraft.options.bobView) { + final float g = minecraft.player.walkDist - minecraft.player.walkDistO; + final float h = -(minecraft.player.walkDist + g * tickDelta); + final float i = Mth.lerp(tickDelta, minecraft.player.oBob, minecraft.player.bob); + + poseStack.translate((double)(Mth.sin(h * 3.1415927f) * i * 0.5f), (double)(-Math.abs(Mth.cos(h * 3.1415927f) * i)), 0.0); + + poseStack.mulPose(Vector3f.ZP.rotationDegrees(Mth.sin(h * 3.1415927f) * i * 3.0f)); + poseStack.mulPose(Vector3f.XP.rotationDegrees(Math.abs(Mth.cos(h * 3.1415927f - 0.2f) * i) * 5.0f)); + } + + minecraft.getItemInHandRenderer().renderHandsWithItems(tickDelta, poseStack, renderBuffers.bufferSource(), minecraft.player, minecraft.getEntityRenderDispatcher().getPackedLightCoords(camera.getEntity(), tickDelta)); + + + poseStack.popPose(); + + rendering = false; + } + + public static boolean isRendering() { + return rendering; + } +} From c46cb75fcb53d3b04ce22a3ed3cea392c45d84d8 Mon Sep 17 00:00:00 2001 From: maximumpower55 <62370320+maximumpower55@users.noreply.github.com> Date: Sat, 2 Oct 2021 00:31:01 -0700 Subject: [PATCH 02/53] Disable Vanilla Hand Rendering --- src/main/java/net/coderbot/iris/mixin/MixinGameRenderer.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/net/coderbot/iris/mixin/MixinGameRenderer.java b/src/main/java/net/coderbot/iris/mixin/MixinGameRenderer.java index 8014caa6f3..6a87fa4e07 100644 --- a/src/main/java/net/coderbot/iris/mixin/MixinGameRenderer.java +++ b/src/main/java/net/coderbot/iris/mixin/MixinGameRenderer.java @@ -41,4 +41,9 @@ public class MixinGameRenderer { SystemTimeUniforms.COUNTER.beginFrame(); SystemTimeUniforms.TIMER.beginFrame(startTime); } + + @Inject(method = "renderItemInHand", at = @At("HEAD"), cancellable = true) + private void cancelRenderItemInHand(CallbackInfo ci) { + ci.cancel(); + } } From 9c35b4fbb5f2df14572d109ade2138524d0b1799 Mon Sep 17 00:00:00 2001 From: maximumpower55 <62370320+maximumpower55@users.noreply.github.com> Date: Sat, 2 Oct 2021 12:59:50 -0700 Subject: [PATCH 03/53] Fix major issues --- .../java/net/coderbot/iris/mixin/MixinLevelRenderer.java | 2 +- src/main/java/net/coderbot/iris/pipeline/HandRendering.java | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/coderbot/iris/mixin/MixinLevelRenderer.java b/src/main/java/net/coderbot/iris/mixin/MixinLevelRenderer.java index de88af0b5b..1ecf90de8a 100644 --- a/src/main/java/net/coderbot/iris/mixin/MixinLevelRenderer.java +++ b/src/main/java/net/coderbot/iris/mixin/MixinLevelRenderer.java @@ -223,7 +223,7 @@ public class MixinLevelRenderer { pipeline.beginTranslucents(); } - @Inject(method = "renderLevel", at = @At(value = "CONSTANT", args = "stringValue=translucent")) + @Inject(method = "renderLevel", at = @At(value = "RETURN", by = -3, shift = At.Shift.BY)) private void iris$renderHands(CallbackInfo ci) { Minecraft.getInstance().getProfiler().popPush("iris_hand"); HandRendering.render(); diff --git a/src/main/java/net/coderbot/iris/pipeline/HandRendering.java b/src/main/java/net/coderbot/iris/pipeline/HandRendering.java index 5ba404a2c4..24dd62e96b 100644 --- a/src/main/java/net/coderbot/iris/pipeline/HandRendering.java +++ b/src/main/java/net/coderbot/iris/pipeline/HandRendering.java @@ -1,5 +1,6 @@ package net.coderbot.iris.pipeline; +import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.math.Matrix4f; import com.mojang.math.Vector3f; @@ -41,11 +42,13 @@ public static void render() { rendering = true; + RenderSystem.clear(256, Minecraft.ON_OSX); + poseStack.pushPose(); final PoseStack.Pose pose = poseStack.last(); - pose.pose().multiply(Matrix4f.perspective(minecraft.options.fov, minecraft.getWindow().getWidth() / (float)minecraft.getWindow().getHeight(), .05f, gameRenderer.getRenderDistance() * 4f)); + gameRenderer.resetProjectionMatrix(gameRenderer.getProjectionMatrix(camera, tickDelta, false)); pose.pose().setIdentity(); pose.normal().setIdentity(); From efc299975c52c857333b164171c86658e818ead5 Mon Sep 17 00:00:00 2001 From: maximumpower55 <62370320+maximumpower55@users.noreply.github.com> Date: Sat, 2 Oct 2021 15:42:43 -0700 Subject: [PATCH 04/53] Change Mixin --- src/main/java/net/coderbot/iris/mixin/MixinLevelRenderer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/coderbot/iris/mixin/MixinLevelRenderer.java b/src/main/java/net/coderbot/iris/mixin/MixinLevelRenderer.java index 1ecf90de8a..240782702c 100644 --- a/src/main/java/net/coderbot/iris/mixin/MixinLevelRenderer.java +++ b/src/main/java/net/coderbot/iris/mixin/MixinLevelRenderer.java @@ -223,7 +223,7 @@ public class MixinLevelRenderer { pipeline.beginTranslucents(); } - @Inject(method = "renderLevel", at = @At(value = "RETURN", by = -3, shift = At.Shift.BY)) + @Inject(method = "renderLevel", at = @At(value = "RETURN", by = -2, shift = At.Shift.BY)) private void iris$renderHands(CallbackInfo ci) { Minecraft.getInstance().getProfiler().popPush("iris_hand"); HandRendering.render(); From 1aada4cf952f301f7e9be4393f2412d1cdece5a8 Mon Sep 17 00:00:00 2001 From: maximumpower55 <62370320+maximumpower55@users.noreply.github.com> Date: Sat, 2 Oct 2021 16:39:14 -0700 Subject: [PATCH 05/53] Use Redirect --- .../java/net/coderbot/iris/mixin/MixinGameRenderer.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/coderbot/iris/mixin/MixinGameRenderer.java b/src/main/java/net/coderbot/iris/mixin/MixinGameRenderer.java index 6a87fa4e07..93235bbc30 100644 --- a/src/main/java/net/coderbot/iris/mixin/MixinGameRenderer.java +++ b/src/main/java/net/coderbot/iris/mixin/MixinGameRenderer.java @@ -10,6 +10,7 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; @@ -42,8 +43,8 @@ public class MixinGameRenderer { SystemTimeUniforms.TIMER.beginFrame(startTime); } - @Inject(method = "renderItemInHand", at = @At("HEAD"), cancellable = true) - private void cancelRenderItemInHand(CallbackInfo ci) { - ci.cancel(); + @Redirect(method = "renderLevel", at = @At(value = "FIELD", target = "Lnet/minecraft/client/renderer/GameRenderer;renderHand:Z")) + private boolean disableVanillaHandRendering(GameRenderer gameRenderer) { + return false; } } From 52281af2e019fb66a540d8de222b059fb84f4b55 Mon Sep 17 00:00:00 2001 From: maximumpower55 <62370320+maximumpower55@users.noreply.github.com> Date: Sat, 2 Oct 2021 17:41:51 -0700 Subject: [PATCH 06/53] Use a instance --- .../coderbot/iris/mixin/MixinLevelRenderer.java | 4 ++-- .../iris/mixin/rendertype/MixinRenderType.java | 2 +- .../net/coderbot/iris/pipeline/HandRendering.java | 15 ++++++++------- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/main/java/net/coderbot/iris/mixin/MixinLevelRenderer.java b/src/main/java/net/coderbot/iris/mixin/MixinLevelRenderer.java index 240782702c..0d6bbf5eed 100644 --- a/src/main/java/net/coderbot/iris/mixin/MixinLevelRenderer.java +++ b/src/main/java/net/coderbot/iris/mixin/MixinLevelRenderer.java @@ -68,7 +68,7 @@ public class MixinLevelRenderer { pipeline.beginLevelRendering(); - HandRendering.prepareForRendering(renderBuffers, poseStack, tickDelta, camera, gameRenderer); + HandRendering.INSTANCE.prepareForRendering(renderBuffers, poseStack, tickDelta, camera, gameRenderer); } // Inject a bit early so that we can end our rendering before mods like VoxelMap (which inject at RETURN) @@ -226,6 +226,6 @@ public class MixinLevelRenderer { @Inject(method = "renderLevel", at = @At(value = "RETURN", by = -2, shift = At.Shift.BY)) private void iris$renderHands(CallbackInfo ci) { Minecraft.getInstance().getProfiler().popPush("iris_hand"); - HandRendering.render(); + HandRendering.INSTANCE.render(); } } diff --git a/src/main/java/net/coderbot/iris/mixin/rendertype/MixinRenderType.java b/src/main/java/net/coderbot/iris/mixin/rendertype/MixinRenderType.java index 4064722bd7..f7c68f157d 100644 --- a/src/main/java/net/coderbot/iris/mixin/rendertype/MixinRenderType.java +++ b/src/main/java/net/coderbot/iris/mixin/rendertype/MixinRenderType.java @@ -152,7 +152,7 @@ private static RenderType wrap(RenderType wrapped, GbufferProgram program) { private static void iris$wrapEntityRenderTypes(ResourceLocation texture, CallbackInfoReturnable cir) { RenderType base = cir.getReturnValue(); - if(HandRendering.isRendering()) { + if(HandRendering.INSTANCE.isRendering()) { cir.setReturnValue(wrap(base, GbufferProgram.HAND)); } else { cir.setReturnValue(wrap(base, GbufferProgram.ENTITIES)); diff --git a/src/main/java/net/coderbot/iris/pipeline/HandRendering.java b/src/main/java/net/coderbot/iris/pipeline/HandRendering.java index 24dd62e96b..87f7c3dc8b 100644 --- a/src/main/java/net/coderbot/iris/pipeline/HandRendering.java +++ b/src/main/java/net/coderbot/iris/pipeline/HandRendering.java @@ -2,7 +2,6 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.math.Matrix4f; import com.mojang.math.Vector3f; import net.minecraft.client.Camera; @@ -15,7 +14,9 @@ import net.minecraft.world.level.GameType; public class HandRendering { - private static final Minecraft minecraft = Minecraft.getInstance(); + public static final HandRendering INSTANCE = new HandRendering(); + + private final Minecraft minecraft = Minecraft.getInstance(); private static GameRenderer gameRenderer; private static RenderBuffers renderBuffers; @@ -23,11 +24,11 @@ public class HandRendering { private static float tickDelta; private static Camera camera; - private static boolean rendering; + private boolean rendering; - private static boolean canRender; + private boolean canRender; - public static void prepareForRendering(RenderBuffers renderBuffers, PoseStack poseStack, float tickDelta, Camera camera, GameRenderer gameRenderer) { + public void prepareForRendering(RenderBuffers renderBuffers, PoseStack poseStack, float tickDelta, Camera camera, GameRenderer gameRenderer) { canRender = !(camera.isDetached() || !(camera.getEntity() instanceof Player) || minecraft.options.hideGui || (camera.getEntity() instanceof LivingEntity && ((LivingEntity)camera.getEntity()).isSleeping()) || minecraft.gameMode.getPlayerMode() == GameType.SPECTATOR); HandRendering.gameRenderer = gameRenderer; @@ -37,7 +38,7 @@ public static void prepareForRendering(RenderBuffers renderBuffers, PoseStack po HandRendering.camera = camera; } - public static void render() { + public void render() { if(!canRender) return; rendering = true; @@ -72,7 +73,7 @@ public static void render() { rendering = false; } - public static boolean isRendering() { + public boolean isRendering() { return rendering; } } From 5a5c9324709f6c163a686315ed0ddcab7f2c0ff5 Mon Sep 17 00:00:00 2001 From: maximumpower55 <62370320+maximumpower55@users.noreply.github.com> Date: Sat, 2 Oct 2021 17:42:46 -0700 Subject: [PATCH 07/53] oops! --- .../coderbot/iris/pipeline/HandRendering.java | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/main/java/net/coderbot/iris/pipeline/HandRendering.java b/src/main/java/net/coderbot/iris/pipeline/HandRendering.java index 87f7c3dc8b..4faf637c91 100644 --- a/src/main/java/net/coderbot/iris/pipeline/HandRendering.java +++ b/src/main/java/net/coderbot/iris/pipeline/HandRendering.java @@ -18,24 +18,24 @@ public class HandRendering { private final Minecraft minecraft = Minecraft.getInstance(); - private static GameRenderer gameRenderer; - private static RenderBuffers renderBuffers; - private static PoseStack poseStack; - private static float tickDelta; - private static Camera camera; + private GameRenderer gameRenderer; + private RenderBuffers renderBuffers; + private PoseStack poseStack; + private float tickDelta; + private Camera camera; private boolean rendering; private boolean canRender; public void prepareForRendering(RenderBuffers renderBuffers, PoseStack poseStack, float tickDelta, Camera camera, GameRenderer gameRenderer) { - canRender = !(camera.isDetached() || !(camera.getEntity() instanceof Player) || minecraft.options.hideGui || (camera.getEntity() instanceof LivingEntity && ((LivingEntity)camera.getEntity()).isSleeping()) || minecraft.gameMode.getPlayerMode() == GameType.SPECTATOR); + this.canRender = !(camera.isDetached() || !(camera.getEntity() instanceof Player) || minecraft.options.hideGui || (camera.getEntity() instanceof LivingEntity && ((LivingEntity)camera.getEntity()).isSleeping()) || minecraft.gameMode.getPlayerMode() == GameType.SPECTATOR); - HandRendering.gameRenderer = gameRenderer; - HandRendering.renderBuffers = renderBuffers; - HandRendering.poseStack = poseStack; - HandRendering.tickDelta = tickDelta; - HandRendering.camera = camera; + this.gameRenderer = gameRenderer; + this.renderBuffers = renderBuffers; + this.poseStack = poseStack; + this.tickDelta = tickDelta; + this.camera = camera; } public void render() { From 315f986f76c22c6fde722e494d898564a19b9294 Mon Sep 17 00:00:00 2001 From: maximumpower55 <62370320+maximumpower55@users.noreply.github.com> Date: Sat, 2 Oct 2021 21:21:20 -0700 Subject: [PATCH 08/53] Use a Accessor --- .../coderbot/iris/mixin/GameRendererAccessor.java | 14 ++++++++++++++ .../net/coderbot/iris/pipeline/HandRendering.java | 13 ++----------- src/main/resources/mixins.iris.json | 1 + 3 files changed, 17 insertions(+), 11 deletions(-) create mode 100644 src/main/java/net/coderbot/iris/mixin/GameRendererAccessor.java diff --git a/src/main/java/net/coderbot/iris/mixin/GameRendererAccessor.java b/src/main/java/net/coderbot/iris/mixin/GameRendererAccessor.java new file mode 100644 index 0000000000..a3bd645217 --- /dev/null +++ b/src/main/java/net/coderbot/iris/mixin/GameRendererAccessor.java @@ -0,0 +1,14 @@ +package net.coderbot.iris.mixin; + +import com.mojang.blaze3d.vertex.PoseStack; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +import net.minecraft.client.renderer.GameRenderer; + +@Mixin(GameRenderer.class) +public interface GameRendererAccessor { + @Invoker("bobView") + void invokeBobView(PoseStack poseStack, float tickDelta); +} diff --git a/src/main/java/net/coderbot/iris/pipeline/HandRendering.java b/src/main/java/net/coderbot/iris/pipeline/HandRendering.java index 4faf637c91..b482cdca5b 100644 --- a/src/main/java/net/coderbot/iris/pipeline/HandRendering.java +++ b/src/main/java/net/coderbot/iris/pipeline/HandRendering.java @@ -2,13 +2,12 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.math.Vector3f; +import net.coderbot.iris.mixin.GameRendererAccessor; import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.GameRenderer; import net.minecraft.client.renderer.RenderBuffers; -import net.minecraft.util.Mth; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.GameType; @@ -55,19 +54,11 @@ public void render() { pose.normal().setIdentity(); if(minecraft.options.bobView) { - final float g = minecraft.player.walkDist - minecraft.player.walkDistO; - final float h = -(minecraft.player.walkDist + g * tickDelta); - final float i = Mth.lerp(tickDelta, minecraft.player.oBob, minecraft.player.bob); - - poseStack.translate((double)(Mth.sin(h * 3.1415927f) * i * 0.5f), (double)(-Math.abs(Mth.cos(h * 3.1415927f) * i)), 0.0); - - poseStack.mulPose(Vector3f.ZP.rotationDegrees(Mth.sin(h * 3.1415927f) * i * 3.0f)); - poseStack.mulPose(Vector3f.XP.rotationDegrees(Math.abs(Mth.cos(h * 3.1415927f - 0.2f) * i) * 5.0f)); + ((GameRendererAccessor)gameRenderer).invokeBobView(poseStack, tickDelta); } minecraft.getItemInHandRenderer().renderHandsWithItems(tickDelta, poseStack, renderBuffers.bufferSource(), minecraft.player, minecraft.getEntityRenderDispatcher().getPackedLightCoords(camera.getEntity(), tickDelta)); - poseStack.popPose(); rendering = false; diff --git a/src/main/resources/mixins.iris.json b/src/main/resources/mixins.iris.json index 5dc449216b..e35f7c092d 100644 --- a/src/main/resources/mixins.iris.json +++ b/src/main/resources/mixins.iris.json @@ -6,6 +6,7 @@ "compatibilityLevel": "JAVA_8", "client": [ "DimensionTypeAccessor", + "GameRendererAccessor", "LevelRendererAccessor", "MixinBlockStateBehavior", "MixinClientLanguage", From fbd2845d79f34f14f349b39365a6366ba4f81b61 Mon Sep 17 00:00:00 2001 From: maximumpower55 <62370320+maximumpower55@users.noreply.github.com> Date: Sat, 2 Oct 2021 21:54:37 -0700 Subject: [PATCH 09/53] more fixes --- .../net/coderbot/iris/mixin/GameRendererAccessor.java | 9 ++++++++- .../java/net/coderbot/iris/mixin/MixinLevelRenderer.java | 7 ++++++- .../java/net/coderbot/iris/pipeline/HandRendering.java | 2 +- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/coderbot/iris/mixin/GameRendererAccessor.java b/src/main/java/net/coderbot/iris/mixin/GameRendererAccessor.java index a3bd645217..1731835eb7 100644 --- a/src/main/java/net/coderbot/iris/mixin/GameRendererAccessor.java +++ b/src/main/java/net/coderbot/iris/mixin/GameRendererAccessor.java @@ -3,12 +3,19 @@ import com.mojang.blaze3d.vertex.PoseStack; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; import org.spongepowered.asm.mixin.gen.Invoker; import net.minecraft.client.renderer.GameRenderer; @Mixin(GameRenderer.class) public interface GameRendererAccessor { - @Invoker("bobView") + @Accessor + boolean getRenderHand(); + + @Accessor + boolean getPanoramicMode(); + + @Invoker void invokeBobView(PoseStack poseStack, float tickDelta); } diff --git a/src/main/java/net/coderbot/iris/mixin/MixinLevelRenderer.java b/src/main/java/net/coderbot/iris/mixin/MixinLevelRenderer.java index 0d6bbf5eed..787f0abeb8 100644 --- a/src/main/java/net/coderbot/iris/mixin/MixinLevelRenderer.java +++ b/src/main/java/net/coderbot/iris/mixin/MixinLevelRenderer.java @@ -224,7 +224,12 @@ public class MixinLevelRenderer { } @Inject(method = "renderLevel", at = @At(value = "RETURN", by = -2, shift = At.Shift.BY)) - private void iris$renderHands(CallbackInfo ci) { + private void iris$renderHands(PoseStack poseStack, float tickDelta, long limitTime, + boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, + LightTexture lightTexture, Matrix4f projection, + CallbackInfo ci) { + if(!((GameRendererAccessor)gameRenderer).getRenderHand()) return; + Minecraft.getInstance().getProfiler().popPush("iris_hand"); HandRendering.INSTANCE.render(); } diff --git a/src/main/java/net/coderbot/iris/pipeline/HandRendering.java b/src/main/java/net/coderbot/iris/pipeline/HandRendering.java index b482cdca5b..904c1c2530 100644 --- a/src/main/java/net/coderbot/iris/pipeline/HandRendering.java +++ b/src/main/java/net/coderbot/iris/pipeline/HandRendering.java @@ -28,7 +28,7 @@ public class HandRendering { private boolean canRender; public void prepareForRendering(RenderBuffers renderBuffers, PoseStack poseStack, float tickDelta, Camera camera, GameRenderer gameRenderer) { - this.canRender = !(camera.isDetached() || !(camera.getEntity() instanceof Player) || minecraft.options.hideGui || (camera.getEntity() instanceof LivingEntity && ((LivingEntity)camera.getEntity()).isSleeping()) || minecraft.gameMode.getPlayerMode() == GameType.SPECTATOR); + this.canRender = !(camera.isDetached() || !(camera.getEntity() instanceof Player) || ((GameRendererAccessor)gameRenderer).getPanoramicMode() | minecraft.options.hideGui || (camera.getEntity() instanceof LivingEntity && ((LivingEntity)camera.getEntity()).isSleeping()) || minecraft.gameMode.getPlayerMode() == GameType.SPECTATOR); this.gameRenderer = gameRenderer; this.renderBuffers = renderBuffers; From de4a0eefbcfac4fe158e3fc156fdeee069596d57 Mon Sep 17 00:00:00 2001 From: maximumpower55 <62370320+maximumpower55@users.noreply.github.com> Date: Sun, 3 Oct 2021 23:06:55 -0700 Subject: [PATCH 10/53] Fix gbuffers_hand not applying on the held item --- .../rendertype/MixinItemBlockRenderTypes.java | 45 +++++++++++++++++++ src/main/resources/mixins.iris.json | 1 + 2 files changed, 46 insertions(+) create mode 100644 src/main/java/net/coderbot/iris/mixin/rendertype/MixinItemBlockRenderTypes.java diff --git a/src/main/java/net/coderbot/iris/mixin/rendertype/MixinItemBlockRenderTypes.java b/src/main/java/net/coderbot/iris/mixin/rendertype/MixinItemBlockRenderTypes.java new file mode 100644 index 0000000000..73a037d8ef --- /dev/null +++ b/src/main/java/net/coderbot/iris/mixin/rendertype/MixinItemBlockRenderTypes.java @@ -0,0 +1,45 @@ +package net.coderbot.iris.mixin.rendertype; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.ItemBlockRenderTypes; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.texture.TextureAtlas; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; + +@Mixin(ItemBlockRenderTypes.class) +public class MixinItemBlockRenderTypes { + @Shadow + private static RenderType getChunkRenderType(final BlockState blockState) { + throw new AssertionError("not shadowed"); + } + + @Overwrite + public static RenderType getRenderType(final BlockState blockState, final boolean bl) { + final RenderType renderType = getChunkRenderType(blockState); + if (renderType != RenderType.translucent()) { + return RenderType.entityCutout(TextureAtlas.LOCATION_BLOCKS); + } + if (!Minecraft.useShaderTransparency()) { + return RenderType.entityTranslucentCull(TextureAtlas.LOCATION_BLOCKS); + } + return bl ? RenderType.entityTranslucentCull(TextureAtlas.LOCATION_BLOCKS) : RenderType.itemEntityTranslucentCull(TextureAtlas.LOCATION_BLOCKS); + } + + @Overwrite + public static RenderType getRenderType(final ItemStack itemStack, final boolean bl) { + final Item item = itemStack.getItem(); + if (item instanceof BlockItem) { + final Block block = ((BlockItem)item).getBlock(); + return getRenderType(block.defaultBlockState(), bl); + } + return bl ? RenderType.entityTranslucentCull(TextureAtlas.LOCATION_BLOCKS) : RenderType.itemEntityTranslucentCull(TextureAtlas.LOCATION_BLOCKS); + } +} diff --git a/src/main/resources/mixins.iris.json b/src/main/resources/mixins.iris.json index e35f7c092d..cb56850f01 100644 --- a/src/main/resources/mixins.iris.json +++ b/src/main/resources/mixins.iris.json @@ -36,6 +36,7 @@ "math.MixinMatrix4f", "rendertype.MixinFixEyesTranslucency", "rendertype.MixinRenderType", + "rendertype.MixinItemBlockRenderTypes", "rendertype.RenderStateShardAccessor", "rendertype.RenderTypeAccessor", "shadows.MixinBeaconRenderer", From ac6814eda488b7eaf7129d9a218bc49e1040617a Mon Sep 17 00:00:00 2001 From: maximumpower55 <62370320+maximumpower55@users.noreply.github.com> Date: Tue, 5 Oct 2021 23:40:36 -0700 Subject: [PATCH 11/53] texturedLit --- .../coderbot/iris/pipeline/DeferredWorldRenderingPipeline.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/coderbot/iris/pipeline/DeferredWorldRenderingPipeline.java b/src/main/java/net/coderbot/iris/pipeline/DeferredWorldRenderingPipeline.java index 96b218eda3..e6d55a630f 100644 --- a/src/main/java/net/coderbot/iris/pipeline/DeferredWorldRenderingPipeline.java +++ b/src/main/java/net/coderbot/iris/pipeline/DeferredWorldRenderingPipeline.java @@ -258,7 +258,7 @@ public DeferredWorldRenderingPipeline(ProgramSet programs) { this.beaconBeam = programs.getGbuffersBeaconBeam().map(this::createPass).orElse(textured); this.entities = programs.getGbuffersEntities().map(this::createPass).orElse(texturedLit); this.blockEntities = programs.getGbuffersBlock().map(this::createPass).orElse(terrain); - this.hand = programs.getGbuffersHand().map(this::createPass).orElse(entities); + this.hand = programs.getGbuffersHand().map(this::createPass).orElse(texturedLit); this.glowingEntities = programs.getGbuffersEntitiesGlowing().map(this::createPass).orElse(entities); this.glint = programs.getGbuffersGlint().map(this::createPass).orElse(textured); this.eyes = programs.getGbuffersEntityEyes().map(this::createPass).orElse(textured); From bf1f276970a416d1e8be4d34e9bfb6749a1c58ca Mon Sep 17 00:00:00 2001 From: maximumpower55 <62370320+maximumpower55@users.noreply.github.com> Date: Sat, 9 Oct 2021 16:52:42 -0700 Subject: [PATCH 12/53] fix some issues with continuum --- src/main/java/net/coderbot/iris/pipeline/HandRendering.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/net/coderbot/iris/pipeline/HandRendering.java b/src/main/java/net/coderbot/iris/pipeline/HandRendering.java index 904c1c2530..548a4fc3ba 100644 --- a/src/main/java/net/coderbot/iris/pipeline/HandRendering.java +++ b/src/main/java/net/coderbot/iris/pipeline/HandRendering.java @@ -2,8 +2,10 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Matrix4f; import net.coderbot.iris.mixin.GameRendererAccessor; +import net.coderbot.iris.uniforms.CapturedRenderingState; import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.GameRenderer; @@ -48,6 +50,8 @@ public void render() { final PoseStack.Pose pose = poseStack.last(); + Matrix4f oldProjectionMatrix = CapturedRenderingState.INSTANCE.getGbufferProjection(); + gameRenderer.resetProjectionMatrix(gameRenderer.getProjectionMatrix(camera, tickDelta, false)); pose.pose().setIdentity(); @@ -61,6 +65,8 @@ public void render() { poseStack.popPose(); + CapturedRenderingState.INSTANCE.setGbufferProjection(oldProjectionMatrix); + rendering = false; } From 276a51433ea3aafea76f714a4b4cb1d5f9550b66 Mon Sep 17 00:00:00 2001 From: maximumpower55 <62370320+maximumpower55@users.noreply.github.com> Date: Sun, 10 Oct 2021 12:08:07 -0700 Subject: [PATCH 13/53] rework fix some issues with continuum --- src/main/java/net/coderbot/iris/mixin/MixinGameRenderer.java | 3 +++ src/main/java/net/coderbot/iris/pipeline/HandRendering.java | 4 ---- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/java/net/coderbot/iris/mixin/MixinGameRenderer.java b/src/main/java/net/coderbot/iris/mixin/MixinGameRenderer.java index 93235bbc30..02fb6c1771 100644 --- a/src/main/java/net/coderbot/iris/mixin/MixinGameRenderer.java +++ b/src/main/java/net/coderbot/iris/mixin/MixinGameRenderer.java @@ -4,6 +4,7 @@ import com.mojang.blaze3d.platform.GlUtil; import com.mojang.math.Matrix4f; import net.coderbot.iris.Iris; +import net.coderbot.iris.pipeline.HandRendering; import net.coderbot.iris.uniforms.CapturedRenderingState; import net.coderbot.iris.uniforms.SystemTimeUniforms; import org.lwjgl.opengl.GL20; @@ -34,6 +35,8 @@ public class MixinGameRenderer { // https://github.com/jellysquid3/sodium-fabric/blob/1df506fd39dac56bb410725c245e6e51208ec732/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/shader/ChunkProgram.java#L56 @Inject(method = "resetProjectionMatrix", at = @At("HEAD")) private void iris$captureProjectionMatrix(Matrix4f projectionMatrix, CallbackInfo callback) { + if(HandRendering.INSTANCE.isRendering()) return; + CapturedRenderingState.INSTANCE.setGbufferProjection(projectionMatrix); } diff --git a/src/main/java/net/coderbot/iris/pipeline/HandRendering.java b/src/main/java/net/coderbot/iris/pipeline/HandRendering.java index 548a4fc3ba..bd30449e85 100644 --- a/src/main/java/net/coderbot/iris/pipeline/HandRendering.java +++ b/src/main/java/net/coderbot/iris/pipeline/HandRendering.java @@ -50,8 +50,6 @@ public void render() { final PoseStack.Pose pose = poseStack.last(); - Matrix4f oldProjectionMatrix = CapturedRenderingState.INSTANCE.getGbufferProjection(); - gameRenderer.resetProjectionMatrix(gameRenderer.getProjectionMatrix(camera, tickDelta, false)); pose.pose().setIdentity(); @@ -65,8 +63,6 @@ public void render() { poseStack.popPose(); - CapturedRenderingState.INSTANCE.setGbufferProjection(oldProjectionMatrix); - rendering = false; } From 61aa1dae814c3207aacce2c98135bb3346cebc4f Mon Sep 17 00:00:00 2001 From: maximumpower55 <62370320+maximumpower55@users.noreply.github.com> Date: Sun, 17 Oct 2021 15:32:59 -0700 Subject: [PATCH 14/53] refactor --- .../iris/mixin/MixinGameRenderer.java | 4 +-- .../iris/mixin/MixinLevelRenderer.java | 9 +++-- .../mixin/rendertype/MixinRenderType.java | 4 +-- .../{HandRendering.java => HandRenderer.java} | 36 +++++++++---------- 4 files changed, 26 insertions(+), 27 deletions(-) rename src/main/java/net/coderbot/iris/pipeline/{HandRendering.java => HandRenderer.java} (87%) diff --git a/src/main/java/net/coderbot/iris/mixin/MixinGameRenderer.java b/src/main/java/net/coderbot/iris/mixin/MixinGameRenderer.java index 02fb6c1771..df23061520 100644 --- a/src/main/java/net/coderbot/iris/mixin/MixinGameRenderer.java +++ b/src/main/java/net/coderbot/iris/mixin/MixinGameRenderer.java @@ -4,7 +4,7 @@ import com.mojang.blaze3d.platform.GlUtil; import com.mojang.math.Matrix4f; import net.coderbot.iris.Iris; -import net.coderbot.iris.pipeline.HandRendering; +import net.coderbot.iris.pipeline.HandRenderer; import net.coderbot.iris.uniforms.CapturedRenderingState; import net.coderbot.iris.uniforms.SystemTimeUniforms; import org.lwjgl.opengl.GL20; @@ -35,7 +35,7 @@ public class MixinGameRenderer { // https://github.com/jellysquid3/sodium-fabric/blob/1df506fd39dac56bb410725c245e6e51208ec732/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/shader/ChunkProgram.java#L56 @Inject(method = "resetProjectionMatrix", at = @At("HEAD")) private void iris$captureProjectionMatrix(Matrix4f projectionMatrix, CallbackInfo callback) { - if(HandRendering.INSTANCE.isRendering()) return; + if(HandRenderer.ACTIVE) return; // TODO: This probably should be replaced with something better CapturedRenderingState.INSTANCE.setGbufferProjection(projectionMatrix); } diff --git a/src/main/java/net/coderbot/iris/mixin/MixinLevelRenderer.java b/src/main/java/net/coderbot/iris/mixin/MixinLevelRenderer.java index 787f0abeb8..5015da4395 100644 --- a/src/main/java/net/coderbot/iris/mixin/MixinLevelRenderer.java +++ b/src/main/java/net/coderbot/iris/mixin/MixinLevelRenderer.java @@ -8,7 +8,7 @@ import net.coderbot.iris.Iris; import net.coderbot.iris.gl.program.Program; import net.coderbot.iris.layer.GbufferProgram; -import net.coderbot.iris.pipeline.HandRendering; +import net.coderbot.iris.pipeline.HandRenderer; import net.coderbot.iris.pipeline.WorldRenderingPipeline; import net.coderbot.iris.uniforms.CapturedRenderingState; import net.minecraft.client.Camera; @@ -52,6 +52,9 @@ public class MixinLevelRenderer { @Unique private WorldRenderingPipeline pipeline; + @Unique + private HandRenderer handRenderer = new HandRenderer(); + @Inject(method = RENDER_LEVEL, at = @At("HEAD")) private void iris$beginLevelRender(PoseStack poseStack, float tickDelta, long limitTime, boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, LightTexture lightTexture, Matrix4f projection, CallbackInfo callback) { if (Iris.isSodiumInvalid()) { @@ -68,7 +71,7 @@ public class MixinLevelRenderer { pipeline.beginLevelRendering(); - HandRendering.INSTANCE.prepareForRendering(renderBuffers, poseStack, tickDelta, camera, gameRenderer); + handRenderer.prepareForRendering(renderBuffers, poseStack, tickDelta, camera, gameRenderer); } // Inject a bit early so that we can end our rendering before mods like VoxelMap (which inject at RETURN) @@ -231,6 +234,6 @@ public class MixinLevelRenderer { if(!((GameRendererAccessor)gameRenderer).getRenderHand()) return; Minecraft.getInstance().getProfiler().popPush("iris_hand"); - HandRendering.INSTANCE.render(); + handRenderer.render(); } } diff --git a/src/main/java/net/coderbot/iris/mixin/rendertype/MixinRenderType.java b/src/main/java/net/coderbot/iris/mixin/rendertype/MixinRenderType.java index f7c68f157d..29976c9d0a 100644 --- a/src/main/java/net/coderbot/iris/mixin/rendertype/MixinRenderType.java +++ b/src/main/java/net/coderbot/iris/mixin/rendertype/MixinRenderType.java @@ -3,7 +3,7 @@ import net.coderbot.iris.layer.GbufferProgram; import net.coderbot.iris.layer.IrisRenderTypeWrapper; import net.coderbot.iris.layer.UseProgramRenderStateShard; -import net.coderbot.iris.pipeline.HandRendering; +import net.coderbot.iris.pipeline.HandRenderer; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; @@ -152,7 +152,7 @@ private static RenderType wrap(RenderType wrapped, GbufferProgram program) { private static void iris$wrapEntityRenderTypes(ResourceLocation texture, CallbackInfoReturnable cir) { RenderType base = cir.getReturnValue(); - if(HandRendering.INSTANCE.isRendering()) { + if(HandRenderer.ACTIVE) { cir.setReturnValue(wrap(base, GbufferProgram.HAND)); } else { cir.setReturnValue(wrap(base, GbufferProgram.ENTITIES)); diff --git a/src/main/java/net/coderbot/iris/pipeline/HandRendering.java b/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java similarity index 87% rename from src/main/java/net/coderbot/iris/pipeline/HandRendering.java rename to src/main/java/net/coderbot/iris/pipeline/HandRenderer.java index bd30449e85..7331c391fb 100644 --- a/src/main/java/net/coderbot/iris/pipeline/HandRendering.java +++ b/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java @@ -2,10 +2,8 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.math.Matrix4f; import net.coderbot.iris.mixin.GameRendererAccessor; -import net.coderbot.iris.uniforms.CapturedRenderingState; import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.GameRenderer; @@ -14,9 +12,7 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.GameType; -public class HandRendering { - public static final HandRendering INSTANCE = new HandRendering(); - +public class HandRenderer { private final Minecraft minecraft = Minecraft.getInstance(); private GameRenderer gameRenderer; @@ -25,7 +21,7 @@ public class HandRendering { private float tickDelta; private Camera camera; - private boolean rendering; + public static boolean ACTIVE; private boolean canRender; @@ -39,15 +35,7 @@ public void prepareForRendering(RenderBuffers renderBuffers, PoseStack poseStack this.camera = camera; } - public void render() { - if(!canRender) return; - - rendering = true; - - RenderSystem.clear(256, Minecraft.ON_OSX); - - poseStack.pushPose(); - + private void setupProjectionMatrix() { final PoseStack.Pose pose = poseStack.last(); gameRenderer.resetProjectionMatrix(gameRenderer.getProjectionMatrix(camera, tickDelta, false)); @@ -58,15 +46,23 @@ public void render() { if(minecraft.options.bobView) { ((GameRendererAccessor)gameRenderer).invokeBobView(poseStack, tickDelta); } + } + + public void render() { + if(!canRender) return; + + ACTIVE = true; + + RenderSystem.clear(256, Minecraft.ON_OSX); + + poseStack.pushPose(); + + setupProjectionMatrix(); minecraft.getItemInHandRenderer().renderHandsWithItems(tickDelta, poseStack, renderBuffers.bufferSource(), minecraft.player, minecraft.getEntityRenderDispatcher().getPackedLightCoords(camera.getEntity(), tickDelta)); poseStack.popPose(); - rendering = false; - } - - public boolean isRendering() { - return rendering; + ACTIVE = false; } } From 1944fd07d9c6b1b8f5569d0d7f6c359417bac488 Mon Sep 17 00:00:00 2001 From: maximumpower55 <62370320+maximumpower55@users.noreply.github.com> Date: Sun, 17 Oct 2021 15:46:34 -0700 Subject: [PATCH 15/53] rename setupProjectionMatrix to setupGlState --- src/main/java/net/coderbot/iris/pipeline/HandRenderer.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java b/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java index 7331c391fb..678276d070 100644 --- a/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java +++ b/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java @@ -35,7 +35,7 @@ public void prepareForRendering(RenderBuffers renderBuffers, PoseStack poseStack this.camera = camera; } - private void setupProjectionMatrix() { + private void setupGlState() { final PoseStack.Pose pose = poseStack.last(); gameRenderer.resetProjectionMatrix(gameRenderer.getProjectionMatrix(camera, tickDelta, false)); @@ -57,7 +57,7 @@ public void render() { poseStack.pushPose(); - setupProjectionMatrix(); + setupGlState(); minecraft.getItemInHandRenderer().renderHandsWithItems(tickDelta, poseStack, renderBuffers.bufferSource(), minecraft.player, minecraft.getEntityRenderDispatcher().getPackedLightCoords(camera.getEntity(), tickDelta)); From d75b8b1dfe3b500755e1a67446b61e1e160973f0 Mon Sep 17 00:00:00 2001 From: maximumpower55 <62370320+maximumpower55@users.noreply.github.com> Date: Sun, 24 Oct 2021 16:58:30 -0700 Subject: [PATCH 16/53] cleanup --- .../java/net/coderbot/iris/mixin/MixinLevelRenderer.java | 7 ++----- .../java/net/coderbot/iris/pipeline/HandRenderer.java | 8 ++++++-- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/main/java/net/coderbot/iris/mixin/MixinLevelRenderer.java b/src/main/java/net/coderbot/iris/mixin/MixinLevelRenderer.java index 5015da4395..fad278e2cc 100644 --- a/src/main/java/net/coderbot/iris/mixin/MixinLevelRenderer.java +++ b/src/main/java/net/coderbot/iris/mixin/MixinLevelRenderer.java @@ -52,9 +52,6 @@ public class MixinLevelRenderer { @Unique private WorldRenderingPipeline pipeline; - @Unique - private HandRenderer handRenderer = new HandRenderer(); - @Inject(method = RENDER_LEVEL, at = @At("HEAD")) private void iris$beginLevelRender(PoseStack poseStack, float tickDelta, long limitTime, boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, LightTexture lightTexture, Matrix4f projection, CallbackInfo callback) { if (Iris.isSodiumInvalid()) { @@ -71,7 +68,7 @@ public class MixinLevelRenderer { pipeline.beginLevelRendering(); - handRenderer.prepareForRendering(renderBuffers, poseStack, tickDelta, camera, gameRenderer); + HandRenderer.INSTANCE.prepareForRendering(renderBuffers, poseStack, tickDelta, camera, gameRenderer); } // Inject a bit early so that we can end our rendering before mods like VoxelMap (which inject at RETURN) @@ -234,6 +231,6 @@ public class MixinLevelRenderer { if(!((GameRendererAccessor)gameRenderer).getRenderHand()) return; Minecraft.getInstance().getProfiler().popPush("iris_hand"); - handRenderer.render(); + HandRenderer.INSTANCE.render(); } } diff --git a/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java b/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java index 678276d070..28893a6d3b 100644 --- a/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java +++ b/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java @@ -3,6 +3,8 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; +import org.lwjgl.opengl.GL11C; + import net.coderbot.iris.mixin.GameRendererAccessor; import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; @@ -13,6 +15,8 @@ import net.minecraft.world.level.GameType; public class HandRenderer { + public static final HandRenderer INSTANCE = new HandRenderer(); + private final Minecraft minecraft = Minecraft.getInstance(); private GameRenderer gameRenderer; @@ -36,6 +40,8 @@ public void prepareForRendering(RenderBuffers renderBuffers, PoseStack poseStack } private void setupGlState() { + RenderSystem.clear(GL11C.GL_DEPTH_BUFFER_BIT, false); + final PoseStack.Pose pose = poseStack.last(); gameRenderer.resetProjectionMatrix(gameRenderer.getProjectionMatrix(camera, tickDelta, false)); @@ -53,8 +59,6 @@ public void render() { ACTIVE = true; - RenderSystem.clear(256, Minecraft.ON_OSX); - poseStack.pushPose(); setupGlState(); From 127b01d1f4e0e86e3f11b016e7ea3850f1a04cbd Mon Sep 17 00:00:00 2001 From: maximumpower55 <62370320+maximumpower55@users.noreply.github.com> Date: Sun, 24 Oct 2021 17:31:35 -0700 Subject: [PATCH 17/53] better mixins --- .../rendertype/MixinItemBlockRenderTypes.java | 56 ++++++++----------- .../mixin/rendertype/MixinRenderType.java | 6 +- 2 files changed, 26 insertions(+), 36 deletions(-) diff --git a/src/main/java/net/coderbot/iris/mixin/rendertype/MixinItemBlockRenderTypes.java b/src/main/java/net/coderbot/iris/mixin/rendertype/MixinItemBlockRenderTypes.java index 73a037d8ef..b25b1a72d6 100644 --- a/src/main/java/net/coderbot/iris/mixin/rendertype/MixinItemBlockRenderTypes.java +++ b/src/main/java/net/coderbot/iris/mixin/rendertype/MixinItemBlockRenderTypes.java @@ -1,45 +1,35 @@ package net.coderbot.iris.mixin.rendertype; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Overwrite; -import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import net.minecraft.client.Minecraft; +import net.coderbot.iris.layer.GbufferProgram; +import net.coderbot.iris.layer.IrisRenderTypeWrapper; +import net.coderbot.iris.layer.UseProgramRenderStateShard; +import net.coderbot.iris.pipeline.HandRenderer; import net.minecraft.client.renderer.ItemBlockRenderTypes; import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.texture.TextureAtlas; -import net.minecraft.world.item.BlockItem; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; @Mixin(ItemBlockRenderTypes.class) public class MixinItemBlockRenderTypes { - @Shadow - private static RenderType getChunkRenderType(final BlockState blockState) { - throw new AssertionError("not shadowed"); - } + private static RenderType wrap(String name, RenderType wrapped, GbufferProgram program) { + return new IrisRenderTypeWrapper(name, wrapped, new UseProgramRenderStateShard(program)); + } - @Overwrite - public static RenderType getRenderType(final BlockState blockState, final boolean bl) { - final RenderType renderType = getChunkRenderType(blockState); - if (renderType != RenderType.translucent()) { - return RenderType.entityCutout(TextureAtlas.LOCATION_BLOCKS); - } - if (!Minecraft.useShaderTransparency()) { - return RenderType.entityTranslucentCull(TextureAtlas.LOCATION_BLOCKS); - } - return bl ? RenderType.entityTranslucentCull(TextureAtlas.LOCATION_BLOCKS) : RenderType.itemEntityTranslucentCull(TextureAtlas.LOCATION_BLOCKS); - } - - @Overwrite - public static RenderType getRenderType(final ItemStack itemStack, final boolean bl) { - final Item item = itemStack.getItem(); - if (item instanceof BlockItem) { - final Block block = ((BlockItem)item).getBlock(); - return getRenderType(block.defaultBlockState(), bl); - } - return bl ? RenderType.entityTranslucentCull(TextureAtlas.LOCATION_BLOCKS) : RenderType.itemEntityTranslucentCull(TextureAtlas.LOCATION_BLOCKS); + private static RenderType wrap(RenderType wrapped, GbufferProgram program) { + String name = ((RenderStateShardAccessor) wrapped).getName(); + + return wrap("iris:" + name, wrapped, program); + } + + @Inject(method = "getRenderType", at = @At("RETURN"), cancellable = true) + private static void getRenderType(CallbackInfoReturnable cir) { + RenderType base = cir.getReturnValue(); + + if(HandRenderer.ACTIVE) { + cir.setReturnValue(wrap(base, GbufferProgram.HAND)); + } } } diff --git a/src/main/java/net/coderbot/iris/mixin/rendertype/MixinRenderType.java b/src/main/java/net/coderbot/iris/mixin/rendertype/MixinRenderType.java index 29976c9d0a..bdbd99f9c7 100644 --- a/src/main/java/net/coderbot/iris/mixin/rendertype/MixinRenderType.java +++ b/src/main/java/net/coderbot/iris/mixin/rendertype/MixinRenderType.java @@ -152,10 +152,10 @@ private static RenderType wrap(RenderType wrapped, GbufferProgram program) { private static void iris$wrapEntityRenderTypes(ResourceLocation texture, CallbackInfoReturnable cir) { RenderType base = cir.getReturnValue(); - if(HandRenderer.ACTIVE) { - cir.setReturnValue(wrap(base, GbufferProgram.HAND)); - } else { + if(!HandRenderer.ACTIVE) { cir.setReturnValue(wrap(base, GbufferProgram.ENTITIES)); + } else { + cir.setReturnValue(wrap(base, GbufferProgram.HAND)); } } From 7925c23eee3ad6f6911b2263326205822cbae8cd Mon Sep 17 00:00:00 2001 From: maximumpower55 <62370320+maximumpower55@users.noreply.github.com> Date: Wed, 27 Oct 2021 14:15:14 -0700 Subject: [PATCH 18/53] Resolve conflicts --- src/main/java/net/coderbot/iris/mixin/MixinGameRenderer.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/net/coderbot/iris/mixin/MixinGameRenderer.java b/src/main/java/net/coderbot/iris/mixin/MixinGameRenderer.java index df23061520..378235c014 100644 --- a/src/main/java/net/coderbot/iris/mixin/MixinGameRenderer.java +++ b/src/main/java/net/coderbot/iris/mixin/MixinGameRenderer.java @@ -35,8 +35,6 @@ public class MixinGameRenderer { // https://github.com/jellysquid3/sodium-fabric/blob/1df506fd39dac56bb410725c245e6e51208ec732/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/shader/ChunkProgram.java#L56 @Inject(method = "resetProjectionMatrix", at = @At("HEAD")) private void iris$captureProjectionMatrix(Matrix4f projectionMatrix, CallbackInfo callback) { - if(HandRenderer.ACTIVE) return; // TODO: This probably should be replaced with something better - CapturedRenderingState.INSTANCE.setGbufferProjection(projectionMatrix); } From 4330c1e38950afde2e1826b50c2dd544fb3e8436 Mon Sep 17 00:00:00 2001 From: maximumpower55 <62370320+maximumpower55@users.noreply.github.com> Date: Wed, 27 Oct 2021 14:15:42 -0700 Subject: [PATCH 19/53] Resolve conflicts try 2 --- src/main/java/net/coderbot/iris/mixin/MixinGameRenderer.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/main/java/net/coderbot/iris/mixin/MixinGameRenderer.java b/src/main/java/net/coderbot/iris/mixin/MixinGameRenderer.java index 378235c014..205986d387 100644 --- a/src/main/java/net/coderbot/iris/mixin/MixinGameRenderer.java +++ b/src/main/java/net/coderbot/iris/mixin/MixinGameRenderer.java @@ -43,9 +43,4 @@ public class MixinGameRenderer { SystemTimeUniforms.COUNTER.beginFrame(); SystemTimeUniforms.TIMER.beginFrame(startTime); } - - @Redirect(method = "renderLevel", at = @At(value = "FIELD", target = "Lnet/minecraft/client/renderer/GameRenderer;renderHand:Z")) - private boolean disableVanillaHandRendering(GameRenderer gameRenderer) { - return false; - } } From e6076e5c58bc941a6fd1d55d550aee26ddbda41e Mon Sep 17 00:00:00 2001 From: maximumpower55 <62370320+maximumpower55@users.noreply.github.com> Date: Wed, 27 Oct 2021 14:17:13 -0700 Subject: [PATCH 20/53] Resolve conflicts --- .../iris/mixin/MixinGameRenderer.java | 23 ++----------------- 1 file changed, 2 insertions(+), 21 deletions(-) diff --git a/src/main/java/net/coderbot/iris/mixin/MixinGameRenderer.java b/src/main/java/net/coderbot/iris/mixin/MixinGameRenderer.java index 205986d387..63ce18b57f 100644 --- a/src/main/java/net/coderbot/iris/mixin/MixinGameRenderer.java +++ b/src/main/java/net/coderbot/iris/mixin/MixinGameRenderer.java @@ -1,17 +1,10 @@ package net.coderbot.iris.mixin; -import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.platform.GlUtil; -import com.mojang.math.Matrix4f; import net.coderbot.iris.Iris; -import net.coderbot.iris.pipeline.HandRenderer; -import net.coderbot.iris.uniforms.CapturedRenderingState; -import net.coderbot.iris.uniforms.SystemTimeUniforms; -import org.lwjgl.opengl.GL20; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; @@ -24,23 +17,11 @@ @Environment(EnvType.CLIENT) public class MixinGameRenderer { @Inject(method = "", at = @At("TAIL")) - private void iris$logSystem(Minecraft client, ResourceManager resourceManager, RenderBuffers bufferBuilderStorage, CallbackInfo ci) { + private void iris$logSystem(Minecraft client, ResourceManager resourceManager, RenderBuffers bufferBuilderStorage, + CallbackInfo ci) { Iris.logger.info("Hardware information:"); Iris.logger.info("CPU: " + GlUtil.getCpuInfo()); Iris.logger.info("GPU: " + GlUtil.getRenderer() + " (Supports OpenGL " + GlUtil.getOpenGLVersion() + ")"); Iris.logger.info("OS: " + System.getProperty("os.name")); } - - // TODO: This probably won't be compatible with mods that directly mess with the GL projection matrix. - // https://github.com/jellysquid3/sodium-fabric/blob/1df506fd39dac56bb410725c245e6e51208ec732/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/shader/ChunkProgram.java#L56 - @Inject(method = "resetProjectionMatrix", at = @At("HEAD")) - private void iris$captureProjectionMatrix(Matrix4f projectionMatrix, CallbackInfo callback) { - CapturedRenderingState.INSTANCE.setGbufferProjection(projectionMatrix); - } - - @Inject(method = "render(FJZ)V", at = @At("HEAD")) - private void iris$beginFrame(float tickDelta, long startTime, boolean tick, CallbackInfo callback) { - SystemTimeUniforms.COUNTER.beginFrame(); - SystemTimeUniforms.TIMER.beginFrame(startTime); - } } From 9ece6fa8718bf8645bc5cbd611194e5ea06f4554 Mon Sep 17 00:00:00 2001 From: maximumpower55 <62370320+maximumpower55@users.noreply.github.com> Date: Wed, 27 Oct 2021 14:25:13 -0700 Subject: [PATCH 21/53] Disable Vanilla Hand Rendering Again --- .../java/net/coderbot/iris/mixin/MixinGameRenderer.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/net/coderbot/iris/mixin/MixinGameRenderer.java b/src/main/java/net/coderbot/iris/mixin/MixinGameRenderer.java index 63ce18b57f..d8230f28ba 100644 --- a/src/main/java/net/coderbot/iris/mixin/MixinGameRenderer.java +++ b/src/main/java/net/coderbot/iris/mixin/MixinGameRenderer.java @@ -5,6 +5,7 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; @@ -24,4 +25,9 @@ public class MixinGameRenderer { Iris.logger.info("GPU: " + GlUtil.getRenderer() + " (Supports OpenGL " + GlUtil.getOpenGLVersion() + ")"); Iris.logger.info("OS: " + System.getProperty("os.name")); } + + @Redirect(method = "renderLevel", at = @At(value = "FIELD", target = "Lnet/minecraft/client/renderer/GameRenderer;renderHand:Z")) + private boolean disableVanillaHandRendering(GameRenderer gameRenderer) { + return false; + } } From b8f894b88259ade83fae418a96f66fb1de454520 Mon Sep 17 00:00:00 2001 From: maximumpower55 <62370320+maximumpower55@users.noreply.github.com> Date: Tue, 2 Nov 2021 14:40:59 -0700 Subject: [PATCH 22/53] some changes --- .../iris/mixin/MixinLevelRenderer.java | 7 +-- .../coderbot/iris/pipeline/HandRenderer.java | 52 +++++++++---------- 2 files changed, 25 insertions(+), 34 deletions(-) diff --git a/src/main/java/net/coderbot/iris/mixin/MixinLevelRenderer.java b/src/main/java/net/coderbot/iris/mixin/MixinLevelRenderer.java index fcb6973056..53d6d7afc3 100644 --- a/src/main/java/net/coderbot/iris/mixin/MixinLevelRenderer.java +++ b/src/main/java/net/coderbot/iris/mixin/MixinLevelRenderer.java @@ -77,8 +77,6 @@ public class MixinLevelRenderer { pipeline = Iris.getPipelineManager().preparePipeline(Iris.getCurrentDimension()); pipeline.beginLevelRendering(); - - HandRenderer.INSTANCE.prepareForRendering(renderBuffers, poseStack, tickDelta, camera, gameRenderer); } // Inject a bit early so that we can end our rendering before mods like VoxelMap (which inject at RETURN) @@ -228,9 +226,6 @@ public class MixinLevelRenderer { boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, LightTexture lightTexture, Matrix4f projection, CallbackInfo ci) { - if(!((GameRendererAccessor)gameRenderer).getRenderHand()) return; - - Minecraft.getInstance().getProfiler().popPush("iris_hand"); - HandRenderer.INSTANCE.render(); + HandRenderer.INSTANCE.render(renderBuffers, poseStack, tickDelta, camera, gameRenderer); } } diff --git a/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java b/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java index 28893a6d3b..cc3f5e6535 100644 --- a/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java +++ b/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java @@ -6,6 +6,7 @@ import org.lwjgl.opengl.GL11C; import net.coderbot.iris.mixin.GameRendererAccessor; +import net.coderbot.iris.uniforms.CapturedRenderingState; import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.GameRenderer; @@ -17,31 +18,9 @@ public class HandRenderer { public static final HandRenderer INSTANCE = new HandRenderer(); - private final Minecraft minecraft = Minecraft.getInstance(); - - private GameRenderer gameRenderer; - private RenderBuffers renderBuffers; - private PoseStack poseStack; - private float tickDelta; - private Camera camera; - public static boolean ACTIVE; - private boolean canRender; - - public void prepareForRendering(RenderBuffers renderBuffers, PoseStack poseStack, float tickDelta, Camera camera, GameRenderer gameRenderer) { - this.canRender = !(camera.isDetached() || !(camera.getEntity() instanceof Player) || ((GameRendererAccessor)gameRenderer).getPanoramicMode() | minecraft.options.hideGui || (camera.getEntity() instanceof LivingEntity && ((LivingEntity)camera.getEntity()).isSleeping()) || minecraft.gameMode.getPlayerMode() == GameType.SPECTATOR); - - this.gameRenderer = gameRenderer; - this.renderBuffers = renderBuffers; - this.poseStack = poseStack; - this.tickDelta = tickDelta; - this.camera = camera; - } - - private void setupGlState() { - RenderSystem.clear(GL11C.GL_DEPTH_BUFFER_BIT, false); - + private void setupGlState(GameRenderer gameRenderer, PoseStack poseStack, float tickDelta, Camera camera) { final PoseStack.Pose pose = poseStack.last(); gameRenderer.resetProjectionMatrix(gameRenderer.getProjectionMatrix(camera, tickDelta, false)); @@ -49,21 +28,38 @@ private void setupGlState() { pose.pose().setIdentity(); pose.normal().setIdentity(); - if(minecraft.options.bobView) { + if(Minecraft.getInstance().options.bobView) { ((GameRendererAccessor)gameRenderer).invokeBobView(poseStack, tickDelta); } } - public void render() { - if(!canRender) return; + private boolean canRender(Camera camera, GameRenderer gameRenderer) { + return !(camera.isDetached() + || !(camera.getEntity() instanceof Player) + || ((GameRendererAccessor)gameRenderer).getPanoramicMode() + || Minecraft.getInstance().options.hideGui + || (camera.getEntity() instanceof LivingEntity && ((LivingEntity)camera.getEntity()).isSleeping()) + || Minecraft.getInstance().gameMode.getPlayerMode() == GameType.SPECTATOR); + } + + public void render(RenderBuffers renderBuffers, PoseStack poseStack, float tickDelta, Camera camera, GameRenderer gameRenderer) { + if(!canRender(camera, gameRenderer)) { + return; + } ACTIVE = true; poseStack.pushPose(); - setupGlState(); + Minecraft.getInstance().getProfiler().push("iris_hand"); + + setupGlState(gameRenderer, poseStack, tickDelta, camera); + + Minecraft.getInstance().getItemInHandRenderer().renderHandsWithItems(tickDelta, poseStack, renderBuffers.bufferSource(), Minecraft.getInstance().player, Minecraft.getInstance().getEntityRenderDispatcher().getPackedLightCoords(camera.getEntity(), tickDelta)); + + Minecraft.getInstance().getProfiler().pop(); - minecraft.getItemInHandRenderer().renderHandsWithItems(tickDelta, poseStack, renderBuffers.bufferSource(), minecraft.player, minecraft.getEntityRenderDispatcher().getPackedLightCoords(camera.getEntity(), tickDelta)); + gameRenderer.resetProjectionMatrix(CapturedRenderingState.INSTANCE.getGbufferModelView()); poseStack.popPose(); From dab75fa086e06ee9964d91ff8f26516c4c447a92 Mon Sep 17 00:00:00 2001 From: maximumpower55 <62370320+maximumpower55@users.noreply.github.com> Date: Tue, 2 Nov 2021 19:48:33 -0700 Subject: [PATCH 23/53] better hand clipping (Thanks Ims) --- .../coderbot/iris/mixin/MixinGameRenderer.java | 17 +++++++++++++++++ .../coderbot/iris/pipeline/HandRenderer.java | 2 -- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/coderbot/iris/mixin/MixinGameRenderer.java b/src/main/java/net/coderbot/iris/mixin/MixinGameRenderer.java index d8230f28ba..1462aea563 100644 --- a/src/main/java/net/coderbot/iris/mixin/MixinGameRenderer.java +++ b/src/main/java/net/coderbot/iris/mixin/MixinGameRenderer.java @@ -1,14 +1,23 @@ package net.coderbot.iris.mixin; import com.mojang.blaze3d.platform.GlUtil; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Matrix4f; + import net.coderbot.iris.Iris; +import net.coderbot.iris.pipeline.HandRenderer; + import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; + import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; +import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.GameRenderer; import net.minecraft.client.renderer.RenderBuffers; @@ -26,6 +35,14 @@ public class MixinGameRenderer { Iris.logger.info("OS: " + System.getProperty("os.name")); } + @Inject(method = "getProjectionMatrix", at = @At(value = "INVOKE", target = "Lcom/mojang/math/Matrix4f;multiply(Lcom/mojang/math/Matrix4f;)V"), locals = LocalCapture.CAPTURE_FAILHARD) + private void scaleHandDepth(Camera camera, float f, boolean bl, CallbackInfoReturnable cir, PoseStack poseStack) { + if (HandRenderer.ACTIVE) { + // This value is taken directly from Shaders Mod. + poseStack.scale(1F, 1F, 0.125F); + } + } + @Redirect(method = "renderLevel", at = @At(value = "FIELD", target = "Lnet/minecraft/client/renderer/GameRenderer;renderHand:Z")) private boolean disableVanillaHandRendering(GameRenderer gameRenderer) { return false; diff --git a/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java b/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java index cc3f5e6535..0964f10a01 100644 --- a/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java +++ b/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java @@ -59,8 +59,6 @@ public void render(RenderBuffers renderBuffers, PoseStack poseStack, float tickD Minecraft.getInstance().getProfiler().pop(); - gameRenderer.resetProjectionMatrix(CapturedRenderingState.INSTANCE.getGbufferModelView()); - poseStack.popPose(); ACTIVE = false; From bbfed1dc52057a4841bdc9d84172bb9f38175373 Mon Sep 17 00:00:00 2001 From: IMS212 Date: Tue, 2 Nov 2021 19:55:01 -0700 Subject: [PATCH 24/53] Reset projection matrix after hand rendering --- src/main/java/net/coderbot/iris/pipeline/HandRenderer.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java b/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java index 0964f10a01..c456fd4dff 100644 --- a/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java +++ b/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java @@ -59,6 +59,8 @@ public void render(RenderBuffers renderBuffers, PoseStack poseStack, float tickD Minecraft.getInstance().getProfiler().pop(); + gameRenderer.resetProjectionMatrix(CapturedRenderingState.INSTANCE.getGbufferProjection()); + poseStack.popPose(); ACTIVE = false; From 34b4946aad85dffdceb34ce01f65c6f391c67579 Mon Sep 17 00:00:00 2001 From: IMS212 Date: Tue, 2 Nov 2021 20:35:07 -0700 Subject: [PATCH 25/53] Move hand rendering to right before translucents --- .../java/net/coderbot/iris/mixin/MixinLevelRenderer.java | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/main/java/net/coderbot/iris/mixin/MixinLevelRenderer.java b/src/main/java/net/coderbot/iris/mixin/MixinLevelRenderer.java index 53d6d7afc3..5d5f3873ee 100644 --- a/src/main/java/net/coderbot/iris/mixin/MixinLevelRenderer.java +++ b/src/main/java/net/coderbot/iris/mixin/MixinLevelRenderer.java @@ -217,15 +217,8 @@ public class MixinLevelRenderer { boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, LightTexture lightTexture, Matrix4f projection, CallbackInfo ci) { + HandRenderer.INSTANCE.render(renderBuffers, poseStack, tickDelta, camera, gameRenderer); Minecraft.getInstance().getProfiler().popPush("iris_pre_translucent"); pipeline.beginTranslucents(); } - - @Inject(method = "renderLevel", at = @At(value = "RETURN", by = -2, shift = At.Shift.BY)) - private void iris$renderHands(PoseStack poseStack, float tickDelta, long limitTime, - boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, - LightTexture lightTexture, Matrix4f projection, - CallbackInfo ci) { - HandRenderer.INSTANCE.render(renderBuffers, poseStack, tickDelta, camera, gameRenderer); - } } From 1dd7a36a0f0d50f196a86c7905e5e833d8c03afa Mon Sep 17 00:00:00 2001 From: IMS212 Date: Tue, 2 Nov 2021 20:44:56 -0700 Subject: [PATCH 26/53] Initial support for hand_water, encapsulate --- .../coderbot/iris/layer/GbufferProgram.java | 1 + .../iris/mixin/MixinGameRenderer.java | 2 +- .../rendertype/MixinItemBlockRenderTypes.java | 19 ++++++++++++++----- .../mixin/rendertype/MixinRenderType.java | 2 +- .../DeferredWorldRenderingPipeline.java | 5 +++++ .../coderbot/iris/pipeline/HandRenderer.java | 6 +++++- 6 files changed, 27 insertions(+), 8 deletions(-) diff --git a/src/main/java/net/coderbot/iris/layer/GbufferProgram.java b/src/main/java/net/coderbot/iris/layer/GbufferProgram.java index 770a564863..e82bf62f57 100644 --- a/src/main/java/net/coderbot/iris/layer/GbufferProgram.java +++ b/src/main/java/net/coderbot/iris/layer/GbufferProgram.java @@ -18,5 +18,6 @@ public enum GbufferProgram { ARMOR_GLINT, EYES, HAND, + HAND_TRANSLUCENT, WEATHER } diff --git a/src/main/java/net/coderbot/iris/mixin/MixinGameRenderer.java b/src/main/java/net/coderbot/iris/mixin/MixinGameRenderer.java index 1462aea563..da9cc32b20 100644 --- a/src/main/java/net/coderbot/iris/mixin/MixinGameRenderer.java +++ b/src/main/java/net/coderbot/iris/mixin/MixinGameRenderer.java @@ -37,7 +37,7 @@ public class MixinGameRenderer { @Inject(method = "getProjectionMatrix", at = @At(value = "INVOKE", target = "Lcom/mojang/math/Matrix4f;multiply(Lcom/mojang/math/Matrix4f;)V"), locals = LocalCapture.CAPTURE_FAILHARD) private void scaleHandDepth(Camera camera, float f, boolean bl, CallbackInfoReturnable cir, PoseStack poseStack) { - if (HandRenderer.ACTIVE) { + if (HandRenderer.isActive()) { // This value is taken directly from Shaders Mod. poseStack.scale(1F, 1F, 0.125F); } diff --git a/src/main/java/net/coderbot/iris/mixin/rendertype/MixinItemBlockRenderTypes.java b/src/main/java/net/coderbot/iris/mixin/rendertype/MixinItemBlockRenderTypes.java index b25b1a72d6..6015b3f24e 100644 --- a/src/main/java/net/coderbot/iris/mixin/rendertype/MixinItemBlockRenderTypes.java +++ b/src/main/java/net/coderbot/iris/mixin/rendertype/MixinItemBlockRenderTypes.java @@ -1,6 +1,9 @@ package net.coderbot.iris.mixin.rendertype; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.state.BlockState; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @@ -13,7 +16,12 @@ import net.minecraft.client.renderer.RenderType; @Mixin(ItemBlockRenderTypes.class) -public class MixinItemBlockRenderTypes { +public abstract class MixinItemBlockRenderTypes { + @Shadow + private static RenderType getChunkRenderType(BlockState blockState) { + throw new UnsupportedOperationException("not shadowed"); + } + private static RenderType wrap(String name, RenderType wrapped, GbufferProgram program) { return new IrisRenderTypeWrapper(name, wrapped, new UseProgramRenderStateShard(program)); } @@ -24,12 +32,13 @@ private static RenderType wrap(RenderType wrapped, GbufferProgram program) { return wrap("iris:" + name, wrapped, program); } - @Inject(method = "getRenderType", at = @At("RETURN"), cancellable = true) - private static void getRenderType(CallbackInfoReturnable cir) { + @Inject(method = "getRenderType(Lnet/minecraft/world/level/block/state/BlockState;Z)Lnet/minecraft/client/renderer/RenderType;", at = @At("RETURN"), cancellable = true) + private static void getRenderType(BlockState blockState, boolean bl, CallbackInfoReturnable cir) { RenderType base = cir.getReturnValue(); - if(HandRenderer.ACTIVE) { - cir.setReturnValue(wrap(base, GbufferProgram.HAND)); + if(HandRenderer.isActive()) { + //TODO: Is there a better way to do this? + cir.setReturnValue(wrap(base, getChunkRenderType(blockState) == RenderType.translucent() ? GbufferProgram.HAND_TRANSLUCENT : GbufferProgram.HAND)); } } } diff --git a/src/main/java/net/coderbot/iris/mixin/rendertype/MixinRenderType.java b/src/main/java/net/coderbot/iris/mixin/rendertype/MixinRenderType.java index bdbd99f9c7..e5b728beeb 100644 --- a/src/main/java/net/coderbot/iris/mixin/rendertype/MixinRenderType.java +++ b/src/main/java/net/coderbot/iris/mixin/rendertype/MixinRenderType.java @@ -152,7 +152,7 @@ private static RenderType wrap(RenderType wrapped, GbufferProgram program) { private static void iris$wrapEntityRenderTypes(ResourceLocation texture, CallbackInfoReturnable cir) { RenderType base = cir.getReturnValue(); - if(!HandRenderer.ACTIVE) { + if(!HandRenderer.isActive()) { cir.setReturnValue(wrap(base, GbufferProgram.ENTITIES)); } else { cir.setReturnValue(wrap(base, GbufferProgram.HAND)); diff --git a/src/main/java/net/coderbot/iris/pipeline/DeferredWorldRenderingPipeline.java b/src/main/java/net/coderbot/iris/pipeline/DeferredWorldRenderingPipeline.java index d7acda7d94..f31d836c55 100644 --- a/src/main/java/net/coderbot/iris/pipeline/DeferredWorldRenderingPipeline.java +++ b/src/main/java/net/coderbot/iris/pipeline/DeferredWorldRenderingPipeline.java @@ -86,6 +86,8 @@ public class DeferredWorldRenderingPipeline implements WorldRenderingPipeline { @Nullable private final Pass hand; @Nullable + private final Pass handTranslucent; + @Nullable private final Pass glowingEntities; @Nullable private final Pass glint; @@ -262,6 +264,7 @@ public DeferredWorldRenderingPipeline(ProgramSet programs) { this.entities = programs.getGbuffersEntities().map(this::createPass).orElse(texturedLit); this.blockEntities = programs.getGbuffersBlock().map(this::createPass).orElse(terrain); this.hand = programs.getGbuffersHand().map(this::createPass).orElse(texturedLit); + this.handTranslucent = programs.getGbuffersHandWater().map(this::createPass).orElse(hand); this.glowingEntities = programs.getGbuffersEntitiesGlowing().map(this::createPass).orElse(entities); this.glint = programs.getGbuffersGlint().map(this::createPass).orElse(textured); this.eyes = programs.getGbuffersEntityEyes().map(this::createPass).orElse(textured); @@ -389,6 +392,8 @@ private Pass getPass(GbufferProgram program) { return weather; case HAND: return hand; + case HAND_TRANSLUCENT: + return handTranslucent; default: // TODO throw new UnsupportedOperationException("TODO: Unsupported gbuffer program: " + program); diff --git a/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java b/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java index c456fd4dff..f11f55ac3a 100644 --- a/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java +++ b/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java @@ -18,7 +18,7 @@ public class HandRenderer { public static final HandRenderer INSTANCE = new HandRenderer(); - public static boolean ACTIVE; + private static boolean ACTIVE; private void setupGlState(GameRenderer gameRenderer, PoseStack poseStack, float tickDelta, Camera camera) { final PoseStack.Pose pose = poseStack.last(); @@ -65,4 +65,8 @@ public void render(RenderBuffers renderBuffers, PoseStack poseStack, float tickD ACTIVE = false; } + + public static boolean isActive() { + return ACTIVE; + } } From 945a9df8d01445211e5ac4dc4a17c7dca695d27b Mon Sep 17 00:00:00 2001 From: maximumpower55 <62370320+maximumpower55@users.noreply.github.com> Date: Tue, 2 Nov 2021 21:37:11 -0700 Subject: [PATCH 27/53] fix rendertypes --- .../iris/mixin/rendertype/MixinItemBlockRenderTypes.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/main/java/net/coderbot/iris/mixin/rendertype/MixinItemBlockRenderTypes.java b/src/main/java/net/coderbot/iris/mixin/rendertype/MixinItemBlockRenderTypes.java index 6015b3f24e..ebbb5cdc38 100644 --- a/src/main/java/net/coderbot/iris/mixin/rendertype/MixinItemBlockRenderTypes.java +++ b/src/main/java/net/coderbot/iris/mixin/rendertype/MixinItemBlockRenderTypes.java @@ -32,6 +32,15 @@ private static RenderType wrap(RenderType wrapped, GbufferProgram program) { return wrap("iris:" + name, wrapped, program); } + @Inject(method = "getRenderType(Lnet/minecraft/world/item/ItemStack;Z)Lnet/minecraft/client/renderer/RenderType;", at = @At("RETURN"), cancellable = true) + private static void getRenderType(ItemStack itemStack, boolean bl, CallbackInfoReturnable cir) { + RenderType base = cir.getReturnValue(); + + if(HandRenderer.isActive()) { + cir.setReturnValue(wrap(base, GbufferProgram.HAND)); + } + } + @Inject(method = "getRenderType(Lnet/minecraft/world/level/block/state/BlockState;Z)Lnet/minecraft/client/renderer/RenderType;", at = @At("RETURN"), cancellable = true) private static void getRenderType(BlockState blockState, boolean bl, CallbackInfoReturnable cir) { RenderType base = cir.getReturnValue(); From 8ae0e4fbb18c3f611f88acb7b5037aff2499a88f Mon Sep 17 00:00:00 2001 From: maximumpower55 <62370320+maximumpower55@users.noreply.github.com> Date: Tue, 2 Nov 2021 21:39:55 -0700 Subject: [PATCH 28/53] fix rendertypes 2 --- .../iris/mixin/rendertype/MixinItemBlockRenderTypes.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/coderbot/iris/mixin/rendertype/MixinItemBlockRenderTypes.java b/src/main/java/net/coderbot/iris/mixin/rendertype/MixinItemBlockRenderTypes.java index ebbb5cdc38..6f25460209 100644 --- a/src/main/java/net/coderbot/iris/mixin/rendertype/MixinItemBlockRenderTypes.java +++ b/src/main/java/net/coderbot/iris/mixin/rendertype/MixinItemBlockRenderTypes.java @@ -8,6 +8,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import net.coderbot.batchedentityrendering.impl.WrappableRenderType; import net.coderbot.iris.layer.GbufferProgram; import net.coderbot.iris.layer.IrisRenderTypeWrapper; import net.coderbot.iris.layer.UseProgramRenderStateShard; @@ -37,7 +38,9 @@ private static void getRenderType(ItemStack itemStack, boolean bl, CallbackInfoR RenderType base = cir.getReturnValue(); if(HandRenderer.isActive()) { - cir.setReturnValue(wrap(base, GbufferProgram.HAND)); + if(!(base instanceof WrappableRenderType)) { + cir.setReturnValue(wrap(base, GbufferProgram.HAND)); + } } } From 5a10bff17e6641d396eccee6f1b14a9f62003c0c Mon Sep 17 00:00:00 2001 From: IMS212 Date: Wed, 3 Nov 2021 08:07:12 -0700 Subject: [PATCH 29/53] Initial depthtex2 support --- .../net/coderbot/iris/mixin/MixinLevelRenderer.java | 1 + .../pipeline/DeferredWorldRenderingPipeline.java | 12 +++++++++++- .../FixedFunctionWorldRenderingPipeline.java | 5 +++++ .../iris/pipeline/WorldRenderingPipeline.java | 3 +++ .../coderbot/iris/rendertarget/RenderTargets.java | 6 ++++++ .../net/coderbot/iris/samplers/IrisSamplers.java | 5 +++-- 6 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/coderbot/iris/mixin/MixinLevelRenderer.java b/src/main/java/net/coderbot/iris/mixin/MixinLevelRenderer.java index 5d5f3873ee..d28d00a8c0 100644 --- a/src/main/java/net/coderbot/iris/mixin/MixinLevelRenderer.java +++ b/src/main/java/net/coderbot/iris/mixin/MixinLevelRenderer.java @@ -217,6 +217,7 @@ public class MixinLevelRenderer { boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, LightTexture lightTexture, Matrix4f projection, CallbackInfo ci) { + pipeline.beginHand(); HandRenderer.INSTANCE.render(renderBuffers, poseStack, tickDelta, camera, gameRenderer); Minecraft.getInstance().getProfiler().popPush("iris_pre_translucent"); pipeline.beginTranslucents(); diff --git a/src/main/java/net/coderbot/iris/pipeline/DeferredWorldRenderingPipeline.java b/src/main/java/net/coderbot/iris/pipeline/DeferredWorldRenderingPipeline.java index f31d836c55..9e637fa54a 100644 --- a/src/main/java/net/coderbot/iris/pipeline/DeferredWorldRenderingPipeline.java +++ b/src/main/java/net/coderbot/iris/pipeline/DeferredWorldRenderingPipeline.java @@ -663,11 +663,21 @@ private void prepareRenderTargets() { } } + @Override + public void beginHand() { + // We need to copy the current depth texture so that depthtex2 can contain the depth values for + // all non-translucent content without the hand, as required. + baseline.bindAsReadBuffer(); + GlStateManager._bindTexture(renderTargets.getDepthTextureNoHand().getTextureId()); + GL20C.glCopyTexImage2D(GL20C.GL_TEXTURE_2D, 0, GL20C.GL_DEPTH_COMPONENT, 0, 0, renderTargets.getCurrentWidth(), renderTargets.getCurrentHeight(), 0); + GlStateManager._bindTexture(0); + } + @Override public void beginTranslucents() { isBeforeTranslucent = false; - // We need to copy the current depth texture so that depthtex1 and depthtex2 can contain the depth values for + // We need to copy the current depth texture so that depthtex1 can contain the depth values for // all non-translucent content, as required. baseline.bindAsReadBuffer(); GlStateManager._bindTexture(renderTargets.getDepthTextureNoTranslucents().getTextureId()); diff --git a/src/main/java/net/coderbot/iris/pipeline/FixedFunctionWorldRenderingPipeline.java b/src/main/java/net/coderbot/iris/pipeline/FixedFunctionWorldRenderingPipeline.java index b5d5d374c2..13c6294dd2 100644 --- a/src/main/java/net/coderbot/iris/pipeline/FixedFunctionWorldRenderingPipeline.java +++ b/src/main/java/net/coderbot/iris/pipeline/FixedFunctionWorldRenderingPipeline.java @@ -48,6 +48,11 @@ public void endShadowRender() { // stub: nothing to do here } + @Override + public void beginHand() { + + } + @Override public void beginTranslucents() { // stub: nothing to do here diff --git a/src/main/java/net/coderbot/iris/pipeline/WorldRenderingPipeline.java b/src/main/java/net/coderbot/iris/pipeline/WorldRenderingPipeline.java index 720d351095..2981756e08 100644 --- a/src/main/java/net/coderbot/iris/pipeline/WorldRenderingPipeline.java +++ b/src/main/java/net/coderbot/iris/pipeline/WorldRenderingPipeline.java @@ -13,6 +13,9 @@ public interface WorldRenderingPipeline { OptionalInt getForcedShadowRenderDistanceChunksForDisplay(); void beginShadowRender(); void endShadowRender(); + + void beginHand(); + void beginTranslucents(); void pushProgram(GbufferProgram program); void popProgram(GbufferProgram program); diff --git a/src/main/java/net/coderbot/iris/rendertarget/RenderTargets.java b/src/main/java/net/coderbot/iris/rendertarget/RenderTargets.java index cdf5ccac09..4402d34dcf 100644 --- a/src/main/java/net/coderbot/iris/rendertarget/RenderTargets.java +++ b/src/main/java/net/coderbot/iris/rendertarget/RenderTargets.java @@ -12,6 +12,7 @@ public class RenderTargets { private final RenderTarget[] targets; private final DepthTexture depthTexture; private final DepthTexture noTranslucents; + private final DepthTexture noHand; private final List ownedFramebuffers; @@ -33,6 +34,7 @@ public RenderTargets(int width, int height, Map Date: Wed, 3 Nov 2021 08:07:37 -0700 Subject: [PATCH 30/53] Add stub comment --- .../iris/pipeline/FixedFunctionWorldRenderingPipeline.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/coderbot/iris/pipeline/FixedFunctionWorldRenderingPipeline.java b/src/main/java/net/coderbot/iris/pipeline/FixedFunctionWorldRenderingPipeline.java index 13c6294dd2..dbb958f949 100644 --- a/src/main/java/net/coderbot/iris/pipeline/FixedFunctionWorldRenderingPipeline.java +++ b/src/main/java/net/coderbot/iris/pipeline/FixedFunctionWorldRenderingPipeline.java @@ -50,7 +50,7 @@ public void endShadowRender() { @Override public void beginHand() { - + // stub: nothing to do here } @Override From 1c223a338ca08cc40ea6bfb1ca1f603341fb04c9 Mon Sep 17 00:00:00 2001 From: IMS212 Date: Wed, 3 Nov 2021 08:15:52 -0700 Subject: [PATCH 31/53] Resize and destroy no-hand depth texture when needed --- src/main/java/net/coderbot/iris/rendertarget/RenderTargets.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/net/coderbot/iris/rendertarget/RenderTargets.java b/src/main/java/net/coderbot/iris/rendertarget/RenderTargets.java index 4402d34dcf..a3de8d5237 100644 --- a/src/main/java/net/coderbot/iris/rendertarget/RenderTargets.java +++ b/src/main/java/net/coderbot/iris/rendertarget/RenderTargets.java @@ -57,6 +57,7 @@ public void destroy() { depthTexture.destroy(); noTranslucents.destroy(); + noHand.destroy(); } public int getRenderTargetCount() { @@ -94,6 +95,7 @@ public void resizeIfNeeded(int newWidth, int newHeight) { depthTexture.resize(newWidth, newHeight); noTranslucents.resize(newWidth, newHeight); + noHand.resize(newWidth, newHeight); fullClearRequired = true; } From 9ab76110c96486aa079563c235699400b829dd22 Mon Sep 17 00:00:00 2001 From: maximumpower55 <62370320+maximumpower55@users.noreply.github.com> Date: Thu, 4 Nov 2021 00:36:38 -0700 Subject: [PATCH 32/53] cleanup --- .../iris/mixin/rendertype/MixinItemBlockRenderTypes.java | 6 ++---- src/main/java/net/coderbot/iris/pipeline/HandRenderer.java | 3 --- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/src/main/java/net/coderbot/iris/mixin/rendertype/MixinItemBlockRenderTypes.java b/src/main/java/net/coderbot/iris/mixin/rendertype/MixinItemBlockRenderTypes.java index 6f25460209..b79d462812 100644 --- a/src/main/java/net/coderbot/iris/mixin/rendertype/MixinItemBlockRenderTypes.java +++ b/src/main/java/net/coderbot/iris/mixin/rendertype/MixinItemBlockRenderTypes.java @@ -37,10 +37,8 @@ private static RenderType wrap(RenderType wrapped, GbufferProgram program) { private static void getRenderType(ItemStack itemStack, boolean bl, CallbackInfoReturnable cir) { RenderType base = cir.getReturnValue(); - if(HandRenderer.isActive()) { - if(!(base instanceof WrappableRenderType)) { - cir.setReturnValue(wrap(base, GbufferProgram.HAND)); - } + if(HandRenderer.isActive() && !(base instanceof WrappableRenderType)) { + cir.setReturnValue(wrap(base, GbufferProgram.HAND)); } } diff --git a/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java b/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java index f11f55ac3a..efe8ba3ab6 100644 --- a/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java +++ b/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java @@ -1,10 +1,7 @@ package net.coderbot.iris.pipeline; -import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; -import org.lwjgl.opengl.GL11C; - import net.coderbot.iris.mixin.GameRendererAccessor; import net.coderbot.iris.uniforms.CapturedRenderingState; import net.minecraft.client.Camera; From a4ab7cb8eae1446e06962548fbc7c486ef5eeaec Mon Sep 17 00:00:00 2001 From: IMS212 Date: Thu, 4 Nov 2021 17:30:03 -0700 Subject: [PATCH 33/53] Make a comment about the projection matrix, force hand program --- .../java/net/coderbot/iris/mixin/MixinLevelRenderer.java | 2 +- .../coderbot/iris/mixin/rendertype/MixinRenderType.java | 6 +++--- .../java/net/coderbot/iris/pipeline/HandRenderer.java | 8 +++++++- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/main/java/net/coderbot/iris/mixin/MixinLevelRenderer.java b/src/main/java/net/coderbot/iris/mixin/MixinLevelRenderer.java index d28d00a8c0..b9df12db8d 100644 --- a/src/main/java/net/coderbot/iris/mixin/MixinLevelRenderer.java +++ b/src/main/java/net/coderbot/iris/mixin/MixinLevelRenderer.java @@ -218,7 +218,7 @@ public class MixinLevelRenderer { LightTexture lightTexture, Matrix4f projection, CallbackInfo ci) { pipeline.beginHand(); - HandRenderer.INSTANCE.render(renderBuffers, poseStack, tickDelta, camera, gameRenderer); + HandRenderer.INSTANCE.render(renderBuffers, poseStack, tickDelta, camera, gameRenderer, pipeline); Minecraft.getInstance().getProfiler().popPush("iris_pre_translucent"); pipeline.beginTranslucents(); } diff --git a/src/main/java/net/coderbot/iris/mixin/rendertype/MixinRenderType.java b/src/main/java/net/coderbot/iris/mixin/rendertype/MixinRenderType.java index e5b728beeb..b73a48f67d 100644 --- a/src/main/java/net/coderbot/iris/mixin/rendertype/MixinRenderType.java +++ b/src/main/java/net/coderbot/iris/mixin/rendertype/MixinRenderType.java @@ -152,10 +152,10 @@ private static RenderType wrap(RenderType wrapped, GbufferProgram program) { private static void iris$wrapEntityRenderTypes(ResourceLocation texture, CallbackInfoReturnable cir) { RenderType base = cir.getReturnValue(); - if(!HandRenderer.isActive()) { - cir.setReturnValue(wrap(base, GbufferProgram.ENTITIES)); - } else { + if(HandRenderer.isActive()) { cir.setReturnValue(wrap(base, GbufferProgram.HAND)); + } else { + cir.setReturnValue(wrap(base, GbufferProgram.ENTITIES)); } } diff --git a/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java b/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java index efe8ba3ab6..efd20fe5ae 100644 --- a/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java +++ b/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java @@ -2,6 +2,7 @@ import com.mojang.blaze3d.vertex.PoseStack; +import net.coderbot.iris.layer.GbufferProgram; import net.coderbot.iris.mixin.GameRendererAccessor; import net.coderbot.iris.uniforms.CapturedRenderingState; import net.minecraft.client.Camera; @@ -20,6 +21,7 @@ public class HandRenderer { private void setupGlState(GameRenderer gameRenderer, PoseStack poseStack, float tickDelta, Camera camera) { final PoseStack.Pose pose = poseStack.last(); + // We have a inject in getProjectionMatrix to scale the matrix so the hand doesn't clip through blocks. gameRenderer.resetProjectionMatrix(gameRenderer.getProjectionMatrix(camera, tickDelta, false)); pose.pose().setIdentity(); @@ -39,7 +41,7 @@ private boolean canRender(Camera camera, GameRenderer gameRenderer) { || Minecraft.getInstance().gameMode.getPlayerMode() == GameType.SPECTATOR); } - public void render(RenderBuffers renderBuffers, PoseStack poseStack, float tickDelta, Camera camera, GameRenderer gameRenderer) { + public void render(RenderBuffers renderBuffers, PoseStack poseStack, float tickDelta, Camera camera, GameRenderer gameRenderer, WorldRenderingPipeline pipeline) { if(!canRender(camera, gameRenderer)) { return; } @@ -52,8 +54,12 @@ public void render(RenderBuffers renderBuffers, PoseStack poseStack, float tickD setupGlState(gameRenderer, poseStack, tickDelta, camera); + pipeline.pushProgram(GbufferProgram.HAND); + Minecraft.getInstance().getItemInHandRenderer().renderHandsWithItems(tickDelta, poseStack, renderBuffers.bufferSource(), Minecraft.getInstance().player, Minecraft.getInstance().getEntityRenderDispatcher().getPackedLightCoords(camera.getEntity(), tickDelta)); + pipeline.popProgram(GbufferProgram.HAND); + Minecraft.getInstance().getProfiler().pop(); gameRenderer.resetProjectionMatrix(CapturedRenderingState.INSTANCE.getGbufferProjection()); From 09af08c90955e974278fe8d02b3f1cd7ab270a74 Mon Sep 17 00:00:00 2001 From: maximumpower55 <62370320+maximumpower55@users.noreply.github.com> Date: Thu, 4 Nov 2021 17:45:42 -0700 Subject: [PATCH 34/53] remove redundant code --- .../iris/mixin/rendertype/MixinItemBlockRenderTypes.java | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/main/java/net/coderbot/iris/mixin/rendertype/MixinItemBlockRenderTypes.java b/src/main/java/net/coderbot/iris/mixin/rendertype/MixinItemBlockRenderTypes.java index b79d462812..5aeba0b781 100644 --- a/src/main/java/net/coderbot/iris/mixin/rendertype/MixinItemBlockRenderTypes.java +++ b/src/main/java/net/coderbot/iris/mixin/rendertype/MixinItemBlockRenderTypes.java @@ -33,15 +33,6 @@ private static RenderType wrap(RenderType wrapped, GbufferProgram program) { return wrap("iris:" + name, wrapped, program); } - @Inject(method = "getRenderType(Lnet/minecraft/world/item/ItemStack;Z)Lnet/minecraft/client/renderer/RenderType;", at = @At("RETURN"), cancellable = true) - private static void getRenderType(ItemStack itemStack, boolean bl, CallbackInfoReturnable cir) { - RenderType base = cir.getReturnValue(); - - if(HandRenderer.isActive() && !(base instanceof WrappableRenderType)) { - cir.setReturnValue(wrap(base, GbufferProgram.HAND)); - } - } - @Inject(method = "getRenderType(Lnet/minecraft/world/level/block/state/BlockState;Z)Lnet/minecraft/client/renderer/RenderType;", at = @At("RETURN"), cancellable = true) private static void getRenderType(BlockState blockState, boolean bl, CallbackInfoReturnable cir) { RenderType base = cir.getReturnValue(); From d6fe168c83f0813469595f5165405f8d1f5e8fda Mon Sep 17 00:00:00 2001 From: IMS212 Date: Fri, 5 Nov 2021 20:35:04 -0700 Subject: [PATCH 35/53] Simple hand translucent rendering --- .../iris/mixin/MixinItemInHandRenderer.java | 23 +++++++++ .../iris/mixin/MixinLevelRenderer.java | 1 + .../coderbot/iris/pipeline/HandRenderer.java | 48 +++++++++++++++++++ src/main/resources/mixins.iris.json | 1 + 4 files changed, 73 insertions(+) create mode 100644 src/main/java/net/coderbot/iris/mixin/MixinItemInHandRenderer.java diff --git a/src/main/java/net/coderbot/iris/mixin/MixinItemInHandRenderer.java b/src/main/java/net/coderbot/iris/mixin/MixinItemInHandRenderer.java new file mode 100644 index 0000000000..6e4b5962bc --- /dev/null +++ b/src/main/java/net/coderbot/iris/mixin/MixinItemInHandRenderer.java @@ -0,0 +1,23 @@ +package net.coderbot.iris.mixin; + +import com.mojang.blaze3d.vertex.PoseStack; +import net.coderbot.iris.pipeline.HandRenderer; +import net.minecraft.client.player.AbstractClientPlayer; +import net.minecraft.client.renderer.ItemInHandRenderer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.item.ItemStack; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(ItemInHandRenderer.class) +public class MixinItemInHandRenderer { + @Inject(method = "renderArmWithItem", at = @At("HEAD"), cancellable = true) + private void skipTranslucentHands(AbstractClientPlayer abstractClientPlayer, float f, float g, InteractionHand interactionHand, float h, ItemStack itemStack, float i, PoseStack poseStack, MultiBufferSource multiBufferSource, int j, CallbackInfo ci) { + if (HandRenderer.renderingSolid && HandRenderer.INSTANCE.isHandTranslucent(interactionHand)) { + ci.cancel(); + } + } +} diff --git a/src/main/java/net/coderbot/iris/mixin/MixinLevelRenderer.java b/src/main/java/net/coderbot/iris/mixin/MixinLevelRenderer.java index b9df12db8d..ea760d59b3 100644 --- a/src/main/java/net/coderbot/iris/mixin/MixinLevelRenderer.java +++ b/src/main/java/net/coderbot/iris/mixin/MixinLevelRenderer.java @@ -83,6 +83,7 @@ public class MixinLevelRenderer { // render their waypoint beams. @Inject(method = RENDER_LEVEL, at = @At(value = "RETURN", shift = At.Shift.BEFORE)) private void iris$endLevelRender(PoseStack poseStack, float tickDelta, long limitTime, boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, LightTexture lightTexture, Matrix4f projection, CallbackInfo callback) { + HandRenderer.INSTANCE.renderTranslucent(renderBuffers, poseStack, tickDelta, camera, gameRenderer, pipeline); Minecraft.getInstance().getProfiler().popPush("iris_final"); pipeline.finalizeLevelRendering(); pipeline = null; diff --git a/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java b/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java index efd20fe5ae..17b2cbbe0c 100644 --- a/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java +++ b/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java @@ -1,5 +1,6 @@ package net.coderbot.iris.pipeline; +import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import net.coderbot.iris.layer.GbufferProgram; @@ -8,15 +9,21 @@ import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.client.renderer.ItemBlockRenderTypes; import net.minecraft.client.renderer.RenderBuffers; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.BlockItem; import net.minecraft.world.level.GameType; public class HandRenderer { public static final HandRenderer INSTANCE = new HandRenderer(); private static boolean ACTIVE; + public static boolean renderingSolid; private void setupGlState(GameRenderer gameRenderer, PoseStack poseStack, float tickDelta, Camera camera) { final PoseStack.Pose pose = poseStack.last(); @@ -41,6 +48,13 @@ private boolean canRender(Camera camera, GameRenderer gameRenderer) { || Minecraft.getInstance().gameMode.getPlayerMode() == GameType.SPECTATOR); } + public boolean isHandTranslucent(InteractionHand hand) { + if (Minecraft.getInstance().player.getItemBySlot(hand == InteractionHand.OFF_HAND ? EquipmentSlot.OFFHAND : EquipmentSlot.MAINHAND).getItem() instanceof BlockItem) { + return ItemBlockRenderTypes.getChunkRenderType(((BlockItem) Minecraft.getInstance().player.getItemBySlot(hand == InteractionHand.OFF_HAND ? EquipmentSlot.OFFHAND : EquipmentSlot.MAINHAND).getItem()).getBlock().defaultBlockState()) == RenderType.translucent(); + } + return false; + } + public void render(RenderBuffers renderBuffers, PoseStack poseStack, float tickDelta, Camera camera, GameRenderer gameRenderer, WorldRenderingPipeline pipeline) { if(!canRender(camera, gameRenderer)) { return; @@ -56,8 +70,14 @@ public void render(RenderBuffers renderBuffers, PoseStack poseStack, float tickD pipeline.pushProgram(GbufferProgram.HAND); + RenderSystem.disableBlend(); + + renderingSolid = true; + Minecraft.getInstance().getItemInHandRenderer().renderHandsWithItems(tickDelta, poseStack, renderBuffers.bufferSource(), Minecraft.getInstance().player, Minecraft.getInstance().getEntityRenderDispatcher().getPackedLightCoords(camera.getEntity(), tickDelta)); + renderingSolid = false; + pipeline.popProgram(GbufferProgram.HAND); Minecraft.getInstance().getProfiler().pop(); @@ -69,6 +89,34 @@ public void render(RenderBuffers renderBuffers, PoseStack poseStack, float tickD ACTIVE = false; } + public void renderTranslucent(RenderBuffers renderBuffers, PoseStack poseStack, float tickDelta, Camera camera, GameRenderer gameRenderer, WorldRenderingPipeline pipeline) { + if(!canRender(camera, gameRenderer)) { + return; + } + + ACTIVE = true; + + poseStack.pushPose(); + + Minecraft.getInstance().getProfiler().push("iris_hand_translucent"); + + setupGlState(gameRenderer, poseStack, tickDelta, camera); + + pipeline.pushProgram(GbufferProgram.HAND_TRANSLUCENT); + + Minecraft.getInstance().getItemInHandRenderer().renderHandsWithItems(tickDelta, poseStack, renderBuffers.bufferSource(), Minecraft.getInstance().player, Minecraft.getInstance().getEntityRenderDispatcher().getPackedLightCoords(camera.getEntity(), tickDelta)); + + pipeline.popProgram(GbufferProgram.HAND_TRANSLUCENT); + + poseStack.popPose(); + + Minecraft.getInstance().getProfiler().pop(); + + gameRenderer.resetProjectionMatrix(CapturedRenderingState.INSTANCE.getGbufferProjection()); + + ACTIVE = false; + } + public static boolean isActive() { return ACTIVE; } diff --git a/src/main/resources/mixins.iris.json b/src/main/resources/mixins.iris.json index cb56850f01..4fd93ec582 100644 --- a/src/main/resources/mixins.iris.json +++ b/src/main/resources/mixins.iris.json @@ -17,6 +17,7 @@ "MixinGlStateManager", "MixinGlStateManager_AmdCrashFix", "MixinGlStateManager_AtlasTracking", + "MixinItemInHandRenderer", "MixinLevelRenderer", "MixinLivingEntityRenderer", "MixinMinecraft", From 2b4f03f9e84d3c0c83ab8e903a3052a2888f3df2 Mon Sep 17 00:00:00 2001 From: maximumpower55 <62370320+maximumpower55@users.noreply.github.com> Date: Fri, 5 Nov 2021 20:43:05 -0700 Subject: [PATCH 36/53] bit of renaming --- src/main/java/net/coderbot/iris/mixin/MixinLevelRenderer.java | 2 +- src/main/java/net/coderbot/iris/pipeline/HandRenderer.java | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/coderbot/iris/mixin/MixinLevelRenderer.java b/src/main/java/net/coderbot/iris/mixin/MixinLevelRenderer.java index ea760d59b3..2c70f23e10 100644 --- a/src/main/java/net/coderbot/iris/mixin/MixinLevelRenderer.java +++ b/src/main/java/net/coderbot/iris/mixin/MixinLevelRenderer.java @@ -219,7 +219,7 @@ public class MixinLevelRenderer { LightTexture lightTexture, Matrix4f projection, CallbackInfo ci) { pipeline.beginHand(); - HandRenderer.INSTANCE.render(renderBuffers, poseStack, tickDelta, camera, gameRenderer, pipeline); + HandRenderer.INSTANCE.renderSolid(renderBuffers, poseStack, tickDelta, camera, gameRenderer, pipeline); Minecraft.getInstance().getProfiler().popPush("iris_pre_translucent"); pipeline.beginTranslucents(); } diff --git a/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java b/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java index 17b2cbbe0c..07a3fc75f7 100644 --- a/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java +++ b/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java @@ -52,10 +52,11 @@ public boolean isHandTranslucent(InteractionHand hand) { if (Minecraft.getInstance().player.getItemBySlot(hand == InteractionHand.OFF_HAND ? EquipmentSlot.OFFHAND : EquipmentSlot.MAINHAND).getItem() instanceof BlockItem) { return ItemBlockRenderTypes.getChunkRenderType(((BlockItem) Minecraft.getInstance().player.getItemBySlot(hand == InteractionHand.OFF_HAND ? EquipmentSlot.OFFHAND : EquipmentSlot.MAINHAND).getItem()).getBlock().defaultBlockState()) == RenderType.translucent(); } + return false; } - public void render(RenderBuffers renderBuffers, PoseStack poseStack, float tickDelta, Camera camera, GameRenderer gameRenderer, WorldRenderingPipeline pipeline) { + public void renderSolid(RenderBuffers renderBuffers, PoseStack poseStack, float tickDelta, Camera camera, GameRenderer gameRenderer, WorldRenderingPipeline pipeline) { if(!canRender(camera, gameRenderer)) { return; } From 3d68cb8ca236fb226de2147ca1f8809de32d0134 Mon Sep 17 00:00:00 2001 From: maximumpower55 <62370320+maximumpower55@users.noreply.github.com> Date: Sat, 6 Nov 2021 17:12:16 -0700 Subject: [PATCH 37/53] fix render types this time i hope --- .../rendertype/MixinItemBlockRenderTypes.java | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/coderbot/iris/mixin/rendertype/MixinItemBlockRenderTypes.java b/src/main/java/net/coderbot/iris/mixin/rendertype/MixinItemBlockRenderTypes.java index 5aeba0b781..98b5bca10b 100644 --- a/src/main/java/net/coderbot/iris/mixin/rendertype/MixinItemBlockRenderTypes.java +++ b/src/main/java/net/coderbot/iris/mixin/rendertype/MixinItemBlockRenderTypes.java @@ -8,13 +8,14 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import net.coderbot.batchedentityrendering.impl.WrappableRenderType; import net.coderbot.iris.layer.GbufferProgram; import net.coderbot.iris.layer.IrisRenderTypeWrapper; import net.coderbot.iris.layer.UseProgramRenderStateShard; import net.coderbot.iris.pipeline.HandRenderer; import net.minecraft.client.renderer.ItemBlockRenderTypes; import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.Sheets; +import net.minecraft.client.renderer.texture.TextureAtlas; @Mixin(ItemBlockRenderTypes.class) public abstract class MixinItemBlockRenderTypes { @@ -33,6 +34,20 @@ private static RenderType wrap(RenderType wrapped, GbufferProgram program) { return wrap("iris:" + name, wrapped, program); } + @Inject(method = "getRenderType(Lnet/minecraft/world/item/ItemStack;Z)Lnet/minecraft/client/renderer/RenderType;", at = @At("RETURN"), cancellable = true) + private static void getRenderType(ItemStack itemStack, boolean bl, CallbackInfoReturnable cir) { + RenderType base = cir.getReturnValue(); + + if(HandRenderer.isActive()) { + //TODO: Is there a better way to do this? + if(base == Sheets.translucentItemSheet()) { + cir.setReturnValue(RenderType.entityTranslucentCull(TextureAtlas.LOCATION_BLOCKS)); + } else if(base == Sheets.translucentCullBlockSheet()) { + cir.setReturnValue(RenderType.itemEntityTranslucentCull(TextureAtlas.LOCATION_BLOCKS)); + } + } + } + @Inject(method = "getRenderType(Lnet/minecraft/world/level/block/state/BlockState;Z)Lnet/minecraft/client/renderer/RenderType;", at = @At("RETURN"), cancellable = true) private static void getRenderType(BlockState blockState, boolean bl, CallbackInfoReturnable cir) { RenderType base = cir.getReturnValue(); From d000284503fcb324cba6b8b9023aa8fbc86f9f1c Mon Sep 17 00:00:00 2001 From: maximumpower55 <62370320+maximumpower55@users.noreply.github.com> Date: Sun, 7 Nov 2021 12:40:14 -0800 Subject: [PATCH 38/53] fix render bugs --- .../coderbot/iris/mixin/rendertype/MixinRenderType.java | 2 +- .../java/net/coderbot/iris/pipeline/HandRenderer.java | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/coderbot/iris/mixin/rendertype/MixinRenderType.java b/src/main/java/net/coderbot/iris/mixin/rendertype/MixinRenderType.java index b73a48f67d..dcaccd782b 100644 --- a/src/main/java/net/coderbot/iris/mixin/rendertype/MixinRenderType.java +++ b/src/main/java/net/coderbot/iris/mixin/rendertype/MixinRenderType.java @@ -152,7 +152,7 @@ private static RenderType wrap(RenderType wrapped, GbufferProgram program) { private static void iris$wrapEntityRenderTypes(ResourceLocation texture, CallbackInfoReturnable cir) { RenderType base = cir.getReturnValue(); - if(HandRenderer.isActive()) { + if (HandRenderer.isActive()) { cir.setReturnValue(wrap(base, GbufferProgram.HAND)); } else { cir.setReturnValue(wrap(base, GbufferProgram.ENTITIES)); diff --git a/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java b/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java index 07a3fc75f7..516ce16ad5 100644 --- a/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java +++ b/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java @@ -56,6 +56,10 @@ public boolean isHandTranslucent(InteractionHand hand) { return false; } + public boolean isAnyHandTranslucent() { + return isHandTranslucent(InteractionHand.MAIN_HAND) || isHandTranslucent(InteractionHand.OFF_HAND); + } + public void renderSolid(RenderBuffers renderBuffers, PoseStack poseStack, float tickDelta, Camera camera, GameRenderer gameRenderer, WorldRenderingPipeline pipeline) { if(!canRender(camera, gameRenderer)) { return; @@ -91,7 +95,7 @@ public void renderSolid(RenderBuffers renderBuffers, PoseStack poseStack, float } public void renderTranslucent(RenderBuffers renderBuffers, PoseStack poseStack, float tickDelta, Camera camera, GameRenderer gameRenderer, WorldRenderingPipeline pipeline) { - if(!canRender(camera, gameRenderer)) { + if(!canRender(camera, gameRenderer) || !isAnyHandTranslucent()) { return; } @@ -103,6 +107,8 @@ public void renderTranslucent(RenderBuffers renderBuffers, PoseStack poseStack, setupGlState(gameRenderer, poseStack, tickDelta, camera); + RenderSystem.enableBlend(); + pipeline.pushProgram(GbufferProgram.HAND_TRANSLUCENT); Minecraft.getInstance().getItemInHandRenderer().renderHandsWithItems(tickDelta, poseStack, renderBuffers.bufferSource(), Minecraft.getInstance().player, Minecraft.getInstance().getEntityRenderDispatcher().getPackedLightCoords(camera.getEntity(), tickDelta)); From a959e4cac06bff5fc127b4caa36686e8577f78ae Mon Sep 17 00:00:00 2001 From: maximumpower55 <62370320+maximumpower55@users.noreply.github.com> Date: Sun, 7 Nov 2021 14:07:38 -0800 Subject: [PATCH 39/53] fix render bug with multi layered skins --- .../net/coderbot/iris/mixin/rendertype/MixinRenderType.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/coderbot/iris/mixin/rendertype/MixinRenderType.java b/src/main/java/net/coderbot/iris/mixin/rendertype/MixinRenderType.java index dcaccd782b..ad07fec158 100644 --- a/src/main/java/net/coderbot/iris/mixin/rendertype/MixinRenderType.java +++ b/src/main/java/net/coderbot/iris/mixin/rendertype/MixinRenderType.java @@ -167,7 +167,11 @@ private static RenderType wrap(RenderType wrapped, GbufferProgram program) { private static void iris$wrapEntityRenderTypesZ(ResourceLocation texture, boolean affectsOutline, CallbackInfoReturnable cir) { RenderType base = cir.getReturnValue(); - cir.setReturnValue(wrap(base, GbufferProgram.ENTITIES)); + if (HandRenderer.isActive()) { + cir.setReturnValue(wrap(base, GbufferProgram.HAND)); + } else { + cir.setReturnValue(wrap(base, GbufferProgram.ENTITIES)); + } } @Inject(at = @At("RETURN"), method = { From 2c40afb068cf510958428a99ed95ec75d23aa738 Mon Sep 17 00:00:00 2001 From: IMS212 Date: Sun, 7 Nov 2021 15:56:17 -0800 Subject: [PATCH 40/53] Fix block entities not having the hand shader --- .../entity_render_context/MixinEntityRenderDispatcher.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/coderbot/iris/mixin/entity_render_context/MixinEntityRenderDispatcher.java b/src/main/java/net/coderbot/iris/mixin/entity_render_context/MixinEntityRenderDispatcher.java index 443aa9102c..218a119728 100644 --- a/src/main/java/net/coderbot/iris/mixin/entity_render_context/MixinEntityRenderDispatcher.java +++ b/src/main/java/net/coderbot/iris/mixin/entity_render_context/MixinEntityRenderDispatcher.java @@ -5,6 +5,7 @@ import net.coderbot.iris.fantastic.WrappingMultiBufferSource; import net.coderbot.iris.layer.EntityRenderStateShard; import net.coderbot.iris.layer.OuterWrappedRenderType; +import net.coderbot.iris.pipeline.HandRenderer; import net.coderbot.iris.shaderpack.IdMap; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderStateShard; @@ -33,7 +34,7 @@ public class MixinEntityRenderDispatcher { private void iris$beginEntityRender(Entity entity, double x, double y, double z, float yaw, float tickDelta, PoseStack poseStack, MultiBufferSource bufferSource, int light, CallbackInfo ci) { - if (!(bufferSource instanceof WrappingMultiBufferSource)) { + if (!(bufferSource instanceof WrappingMultiBufferSource) || HandRenderer.isActive()) { return; } @@ -58,7 +59,7 @@ public class MixinEntityRenderDispatcher { private void iris$endEntityRender(Entity entity, double x, double y, double z, float yaw, float tickDelta, PoseStack poseStack, MultiBufferSource bufferSource, int light, CallbackInfo ci) { - if (!(bufferSource instanceof WrappingMultiBufferSource)) { + if (!(bufferSource instanceof WrappingMultiBufferSource) || HandRenderer.isActive()) { return; } From b6bf2b86f8a5b74903a8f063bcef9ec1305a0155 Mon Sep 17 00:00:00 2001 From: IMS212 Date: Sun, 7 Nov 2021 16:03:23 -0800 Subject: [PATCH 41/53] Fix block entities not having the hand shader, part 2 --- src/main/java/net/coderbot/iris/layer/GbufferPrograms.java | 5 ++++- .../entity_render_context/MixinEntityRenderDispatcher.java | 5 ++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/java/net/coderbot/iris/layer/GbufferPrograms.java b/src/main/java/net/coderbot/iris/layer/GbufferPrograms.java index 1d1ae8b5bb..0158419cdc 100644 --- a/src/main/java/net/coderbot/iris/layer/GbufferPrograms.java +++ b/src/main/java/net/coderbot/iris/layer/GbufferPrograms.java @@ -1,6 +1,7 @@ package net.coderbot.iris.layer; import net.coderbot.iris.Iris; +import net.coderbot.iris.pipeline.HandRenderer; import net.coderbot.iris.pipeline.WorldRenderingPipeline; public class GbufferPrograms { @@ -12,7 +13,9 @@ public class GbufferPrograms { */ private static GbufferProgram refine(GbufferProgram program) { if (program == GbufferProgram.ENTITIES || program == GbufferProgram.TERRAIN || program == GbufferProgram.TRANSLUCENT_TERRAIN) { - if (entities) { + if (HandRenderer.isActive()) { + return GbufferProgram.HAND; + } else if (entities) { return GbufferProgram.ENTITIES; } else if (blockEntities) { return GbufferProgram.BLOCK_ENTITIES; diff --git a/src/main/java/net/coderbot/iris/mixin/entity_render_context/MixinEntityRenderDispatcher.java b/src/main/java/net/coderbot/iris/mixin/entity_render_context/MixinEntityRenderDispatcher.java index 218a119728..443aa9102c 100644 --- a/src/main/java/net/coderbot/iris/mixin/entity_render_context/MixinEntityRenderDispatcher.java +++ b/src/main/java/net/coderbot/iris/mixin/entity_render_context/MixinEntityRenderDispatcher.java @@ -5,7 +5,6 @@ import net.coderbot.iris.fantastic.WrappingMultiBufferSource; import net.coderbot.iris.layer.EntityRenderStateShard; import net.coderbot.iris.layer.OuterWrappedRenderType; -import net.coderbot.iris.pipeline.HandRenderer; import net.coderbot.iris.shaderpack.IdMap; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderStateShard; @@ -34,7 +33,7 @@ public class MixinEntityRenderDispatcher { private void iris$beginEntityRender(Entity entity, double x, double y, double z, float yaw, float tickDelta, PoseStack poseStack, MultiBufferSource bufferSource, int light, CallbackInfo ci) { - if (!(bufferSource instanceof WrappingMultiBufferSource) || HandRenderer.isActive()) { + if (!(bufferSource instanceof WrappingMultiBufferSource)) { return; } @@ -59,7 +58,7 @@ public class MixinEntityRenderDispatcher { private void iris$endEntityRender(Entity entity, double x, double y, double z, float yaw, float tickDelta, PoseStack poseStack, MultiBufferSource bufferSource, int light, CallbackInfo ci) { - if (!(bufferSource instanceof WrappingMultiBufferSource) || HandRenderer.isActive()) { + if (!(bufferSource instanceof WrappingMultiBufferSource)) { return; } From a18400a665761ebe41c68a8f0903b181075b6f5b Mon Sep 17 00:00:00 2001 From: IMS212 Date: Mon, 15 Nov 2021 08:16:49 -0800 Subject: [PATCH 42/53] Fix many review issues --- .../coderbot/iris/layer/GbufferPrograms.java | 2 +- .../iris/mixin/GameRendererAccessor.java | 3 ++ .../iris/mixin/MixinItemInHandRenderer.java | 2 +- .../iris/mixin/MixinLevelRenderer.java | 4 +-- .../mixin/rendertype/MixinRenderType.java | 14 ++------ .../coderbot/iris/pipeline/HandRenderer.java | 36 +++++++++++++------ 6 files changed, 35 insertions(+), 26 deletions(-) diff --git a/src/main/java/net/coderbot/iris/layer/GbufferPrograms.java b/src/main/java/net/coderbot/iris/layer/GbufferPrograms.java index 0158419cdc..0bdbfb7f58 100644 --- a/src/main/java/net/coderbot/iris/layer/GbufferPrograms.java +++ b/src/main/java/net/coderbot/iris/layer/GbufferPrograms.java @@ -11,7 +11,7 @@ public class GbufferPrograms { /** * Uses additional information to choose a more specific (and appropriate) GbufferProgram. */ - private static GbufferProgram refine(GbufferProgram program) { + public static GbufferProgram refine(GbufferProgram program) { if (program == GbufferProgram.ENTITIES || program == GbufferProgram.TERRAIN || program == GbufferProgram.TRANSLUCENT_TERRAIN) { if (HandRenderer.isActive()) { return GbufferProgram.HAND; diff --git a/src/main/java/net/coderbot/iris/mixin/GameRendererAccessor.java b/src/main/java/net/coderbot/iris/mixin/GameRendererAccessor.java index 1731835eb7..854fbe3c95 100644 --- a/src/main/java/net/coderbot/iris/mixin/GameRendererAccessor.java +++ b/src/main/java/net/coderbot/iris/mixin/GameRendererAccessor.java @@ -18,4 +18,7 @@ public interface GameRendererAccessor { @Invoker void invokeBobView(PoseStack poseStack, float tickDelta); + + @Invoker + void invokeBobHurt(PoseStack poseStack, float tickDelta); } diff --git a/src/main/java/net/coderbot/iris/mixin/MixinItemInHandRenderer.java b/src/main/java/net/coderbot/iris/mixin/MixinItemInHandRenderer.java index 6e4b5962bc..c1dbdd5ebb 100644 --- a/src/main/java/net/coderbot/iris/mixin/MixinItemInHandRenderer.java +++ b/src/main/java/net/coderbot/iris/mixin/MixinItemInHandRenderer.java @@ -16,7 +16,7 @@ public class MixinItemInHandRenderer { @Inject(method = "renderArmWithItem", at = @At("HEAD"), cancellable = true) private void skipTranslucentHands(AbstractClientPlayer abstractClientPlayer, float f, float g, InteractionHand interactionHand, float h, ItemStack itemStack, float i, PoseStack poseStack, MultiBufferSource multiBufferSource, int j, CallbackInfo ci) { - if (HandRenderer.renderingSolid && HandRenderer.INSTANCE.isHandTranslucent(interactionHand)) { + if (HandRenderer.isRenderingSolid() && HandRenderer.INSTANCE.isHandTranslucent(interactionHand)) { ci.cancel(); } } diff --git a/src/main/java/net/coderbot/iris/mixin/MixinLevelRenderer.java b/src/main/java/net/coderbot/iris/mixin/MixinLevelRenderer.java index 2c70f23e10..612e5ee283 100644 --- a/src/main/java/net/coderbot/iris/mixin/MixinLevelRenderer.java +++ b/src/main/java/net/coderbot/iris/mixin/MixinLevelRenderer.java @@ -83,7 +83,7 @@ public class MixinLevelRenderer { // render their waypoint beams. @Inject(method = RENDER_LEVEL, at = @At(value = "RETURN", shift = At.Shift.BEFORE)) private void iris$endLevelRender(PoseStack poseStack, float tickDelta, long limitTime, boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, LightTexture lightTexture, Matrix4f projection, CallbackInfo callback) { - HandRenderer.INSTANCE.renderTranslucent(renderBuffers, poseStack, tickDelta, camera, gameRenderer, pipeline); + HandRenderer.INSTANCE.renderTranslucent(poseStack, tickDelta, camera, gameRenderer, pipeline); Minecraft.getInstance().getProfiler().popPush("iris_final"); pipeline.finalizeLevelRendering(); pipeline = null; @@ -219,7 +219,7 @@ public class MixinLevelRenderer { LightTexture lightTexture, Matrix4f projection, CallbackInfo ci) { pipeline.beginHand(); - HandRenderer.INSTANCE.renderSolid(renderBuffers, poseStack, tickDelta, camera, gameRenderer, pipeline); + HandRenderer.INSTANCE.renderSolid(poseStack, tickDelta, camera, gameRenderer, pipeline); Minecraft.getInstance().getProfiler().popPush("iris_pre_translucent"); pipeline.beginTranslucents(); } diff --git a/src/main/java/net/coderbot/iris/mixin/rendertype/MixinRenderType.java b/src/main/java/net/coderbot/iris/mixin/rendertype/MixinRenderType.java index ad07fec158..95815a82a2 100644 --- a/src/main/java/net/coderbot/iris/mixin/rendertype/MixinRenderType.java +++ b/src/main/java/net/coderbot/iris/mixin/rendertype/MixinRenderType.java @@ -1,9 +1,9 @@ package net.coderbot.iris.mixin.rendertype; import net.coderbot.iris.layer.GbufferProgram; +import net.coderbot.iris.layer.GbufferPrograms; import net.coderbot.iris.layer.IrisRenderTypeWrapper; import net.coderbot.iris.layer.UseProgramRenderStateShard; -import net.coderbot.iris.pipeline.HandRenderer; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; @@ -152,11 +152,7 @@ private static RenderType wrap(RenderType wrapped, GbufferProgram program) { private static void iris$wrapEntityRenderTypes(ResourceLocation texture, CallbackInfoReturnable cir) { RenderType base = cir.getReturnValue(); - if (HandRenderer.isActive()) { - cir.setReturnValue(wrap(base, GbufferProgram.HAND)); - } else { - cir.setReturnValue(wrap(base, GbufferProgram.ENTITIES)); - } + cir.setReturnValue(wrap(base, GbufferPrograms.refine(GbufferProgram.ENTITIES))); } @Inject(at = @At("RETURN"), method = { @@ -167,11 +163,7 @@ private static RenderType wrap(RenderType wrapped, GbufferProgram program) { private static void iris$wrapEntityRenderTypesZ(ResourceLocation texture, boolean affectsOutline, CallbackInfoReturnable cir) { RenderType base = cir.getReturnValue(); - if (HandRenderer.isActive()) { - cir.setReturnValue(wrap(base, GbufferProgram.HAND)); - } else { - cir.setReturnValue(wrap(base, GbufferProgram.ENTITIES)); - } + cir.setReturnValue(wrap(base, GbufferPrograms.refine(GbufferProgram.ENTITIES))); } @Inject(at = @At("RETURN"), method = { diff --git a/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java b/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java index 516ce16ad5..ccbc5dd9b8 100644 --- a/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java +++ b/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java @@ -3,27 +3,27 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; +import net.coderbot.batchedentityrendering.impl.FullyBufferedMultiBufferSource; import net.coderbot.iris.layer.GbufferProgram; import net.coderbot.iris.mixin.GameRendererAccessor; import net.coderbot.iris.uniforms.CapturedRenderingState; import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.GameRenderer; -import net.minecraft.client.renderer.ItemBlockRenderTypes; -import net.minecraft.client.renderer.RenderBuffers; -import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.*; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.Item; import net.minecraft.world.level.GameType; public class HandRenderer { public static final HandRenderer INSTANCE = new HandRenderer(); private static boolean ACTIVE; - public static boolean renderingSolid; + private static boolean renderingSolid; + private FullyBufferedMultiBufferSource bufferSource = new FullyBufferedMultiBufferSource(); private void setupGlState(GameRenderer gameRenderer, PoseStack poseStack, float tickDelta, Camera camera) { final PoseStack.Pose pose = poseStack.last(); @@ -34,6 +34,8 @@ private void setupGlState(GameRenderer gameRenderer, PoseStack poseStack, float pose.pose().setIdentity(); pose.normal().setIdentity(); + ((GameRendererAccessor)gameRenderer).invokeBobHurt(poseStack, tickDelta); + if(Minecraft.getInstance().options.bobView) { ((GameRendererAccessor)gameRenderer).invokeBobView(poseStack, tickDelta); } @@ -49,8 +51,10 @@ private boolean canRender(Camera camera, GameRenderer gameRenderer) { } public boolean isHandTranslucent(InteractionHand hand) { - if (Minecraft.getInstance().player.getItemBySlot(hand == InteractionHand.OFF_HAND ? EquipmentSlot.OFFHAND : EquipmentSlot.MAINHAND).getItem() instanceof BlockItem) { - return ItemBlockRenderTypes.getChunkRenderType(((BlockItem) Minecraft.getInstance().player.getItemBySlot(hand == InteractionHand.OFF_HAND ? EquipmentSlot.OFFHAND : EquipmentSlot.MAINHAND).getItem()).getBlock().defaultBlockState()) == RenderType.translucent(); + Item item = Minecraft.getInstance().player.getItemBySlot(hand == InteractionHand.OFF_HAND ? EquipmentSlot.OFFHAND : EquipmentSlot.MAINHAND).getItem(); + + if (item instanceof BlockItem) { + return ItemBlockRenderTypes.getChunkRenderType(((BlockItem) item).getBlock().defaultBlockState()) == RenderType.translucent(); } return false; @@ -60,7 +64,7 @@ public boolean isAnyHandTranslucent() { return isHandTranslucent(InteractionHand.MAIN_HAND) || isHandTranslucent(InteractionHand.OFF_HAND); } - public void renderSolid(RenderBuffers renderBuffers, PoseStack poseStack, float tickDelta, Camera camera, GameRenderer gameRenderer, WorldRenderingPipeline pipeline) { + public void renderSolid(PoseStack poseStack, float tickDelta, Camera camera, GameRenderer gameRenderer, WorldRenderingPipeline pipeline) { if(!canRender(camera, gameRenderer)) { return; } @@ -79,7 +83,7 @@ public void renderSolid(RenderBuffers renderBuffers, PoseStack poseStack, float renderingSolid = true; - Minecraft.getInstance().getItemInHandRenderer().renderHandsWithItems(tickDelta, poseStack, renderBuffers.bufferSource(), Minecraft.getInstance().player, Minecraft.getInstance().getEntityRenderDispatcher().getPackedLightCoords(camera.getEntity(), tickDelta)); + Minecraft.getInstance().getItemInHandRenderer().renderHandsWithItems(tickDelta, poseStack, bufferSource, Minecraft.getInstance().player, Minecraft.getInstance().getEntityRenderDispatcher().getPackedLightCoords(camera.getEntity(), tickDelta)); renderingSolid = false; @@ -91,10 +95,12 @@ public void renderSolid(RenderBuffers renderBuffers, PoseStack poseStack, float poseStack.popPose(); + bufferSource.endBatch(); + ACTIVE = false; } - public void renderTranslucent(RenderBuffers renderBuffers, PoseStack poseStack, float tickDelta, Camera camera, GameRenderer gameRenderer, WorldRenderingPipeline pipeline) { + public void renderTranslucent(PoseStack poseStack, float tickDelta, Camera camera, GameRenderer gameRenderer, WorldRenderingPipeline pipeline) { if(!canRender(camera, gameRenderer) || !isAnyHandTranslucent()) { return; } @@ -111,7 +117,7 @@ public void renderTranslucent(RenderBuffers renderBuffers, PoseStack poseStack, pipeline.pushProgram(GbufferProgram.HAND_TRANSLUCENT); - Minecraft.getInstance().getItemInHandRenderer().renderHandsWithItems(tickDelta, poseStack, renderBuffers.bufferSource(), Minecraft.getInstance().player, Minecraft.getInstance().getEntityRenderDispatcher().getPackedLightCoords(camera.getEntity(), tickDelta)); + Minecraft.getInstance().getItemInHandRenderer().renderHandsWithItems(tickDelta, poseStack, bufferSource, Minecraft.getInstance().player, Minecraft.getInstance().getEntityRenderDispatcher().getPackedLightCoords(camera.getEntity(), tickDelta)); pipeline.popProgram(GbufferProgram.HAND_TRANSLUCENT); @@ -121,10 +127,18 @@ public void renderTranslucent(RenderBuffers renderBuffers, PoseStack poseStack, gameRenderer.resetProjectionMatrix(CapturedRenderingState.INSTANCE.getGbufferProjection()); + bufferSource.endBatch(); + + bufferSource.resetDrawCalls(); + ACTIVE = false; } public static boolean isActive() { return ACTIVE; } + + public static boolean isRenderingSolid() { + return renderingSolid; + } } From 2321d80bddbc0e1496ec2e46b9f211a041fad066 Mon Sep 17 00:00:00 2001 From: IMS212 Date: Mon, 15 Nov 2021 09:11:46 -0800 Subject: [PATCH 43/53] More changes --- .../iris/mixin/GameRendererAccessor.java | 7 +++-- .../iris/mixin/MixinGameRenderer.java | 17 ++--------- .../iris/mixin/MixinLevelRenderer.java | 4 --- .../coderbot/iris/pipeline/HandRenderer.java | 30 ++++++++++++------- 4 files changed, 26 insertions(+), 32 deletions(-) diff --git a/src/main/java/net/coderbot/iris/mixin/GameRendererAccessor.java b/src/main/java/net/coderbot/iris/mixin/GameRendererAccessor.java index 854fbe3c95..2f3e216cf6 100644 --- a/src/main/java/net/coderbot/iris/mixin/GameRendererAccessor.java +++ b/src/main/java/net/coderbot/iris/mixin/GameRendererAccessor.java @@ -2,6 +2,7 @@ import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.Camera; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; import org.spongepowered.asm.mixin.gen.Invoker; @@ -10,9 +11,6 @@ @Mixin(GameRenderer.class) public interface GameRendererAccessor { - @Accessor - boolean getRenderHand(); - @Accessor boolean getPanoramicMode(); @@ -21,4 +19,7 @@ public interface GameRendererAccessor { @Invoker void invokeBobHurt(PoseStack poseStack, float tickDelta); + + @Invoker + double invokeGetFov(Camera camera, float tickDelta, boolean bobView); } diff --git a/src/main/java/net/coderbot/iris/mixin/MixinGameRenderer.java b/src/main/java/net/coderbot/iris/mixin/MixinGameRenderer.java index da9cc32b20..12128d0d08 100644 --- a/src/main/java/net/coderbot/iris/mixin/MixinGameRenderer.java +++ b/src/main/java/net/coderbot/iris/mixin/MixinGameRenderer.java @@ -1,23 +1,18 @@ package net.coderbot.iris.mixin; import com.mojang.blaze3d.platform.GlUtil; -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.math.Matrix4f; import net.coderbot.iris.Iris; -import net.coderbot.iris.pipeline.HandRenderer; +import net.coderbot.iris.pipeline.FixedFunctionWorldRenderingPipeline; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import org.spongepowered.asm.mixin.injection.callback.LocalCapture; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.GameRenderer; import net.minecraft.client.renderer.RenderBuffers; @@ -35,16 +30,8 @@ public class MixinGameRenderer { Iris.logger.info("OS: " + System.getProperty("os.name")); } - @Inject(method = "getProjectionMatrix", at = @At(value = "INVOKE", target = "Lcom/mojang/math/Matrix4f;multiply(Lcom/mojang/math/Matrix4f;)V"), locals = LocalCapture.CAPTURE_FAILHARD) - private void scaleHandDepth(Camera camera, float f, boolean bl, CallbackInfoReturnable cir, PoseStack poseStack) { - if (HandRenderer.isActive()) { - // This value is taken directly from Shaders Mod. - poseStack.scale(1F, 1F, 0.125F); - } - } - @Redirect(method = "renderLevel", at = @At(value = "FIELD", target = "Lnet/minecraft/client/renderer/GameRenderer;renderHand:Z")) private boolean disableVanillaHandRendering(GameRenderer gameRenderer) { - return false; + return Iris.getPipelineManager().getPipeline() instanceof FixedFunctionWorldRenderingPipeline; } } diff --git a/src/main/java/net/coderbot/iris/mixin/MixinLevelRenderer.java b/src/main/java/net/coderbot/iris/mixin/MixinLevelRenderer.java index 612e5ee283..c568f95cb7 100644 --- a/src/main/java/net/coderbot/iris/mixin/MixinLevelRenderer.java +++ b/src/main/java/net/coderbot/iris/mixin/MixinLevelRenderer.java @@ -34,10 +34,6 @@ @Mixin(LevelRenderer.class) @Environment(EnvType.CLIENT) public class MixinLevelRenderer { - @Shadow - @Final - private RenderBuffers renderBuffers; - private static final String RENDER_LEVEL = "Lnet/minecraft/client/renderer/LevelRenderer;renderLevel(Lcom/mojang/blaze3d/vertex/PoseStack;FJZLnet/minecraft/client/Camera;Lnet/minecraft/client/renderer/GameRenderer;Lnet/minecraft/client/renderer/LightTexture;Lcom/mojang/math/Matrix4f;)V"; private static final String CLEAR = "Lcom/mojang/blaze3d/systems/RenderSystem;clear(IZ)V"; private static final String RENDER_SKY = "Lnet/minecraft/client/renderer/LevelRenderer;renderSky(Lcom/mojang/blaze3d/vertex/PoseStack;F)V"; diff --git a/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java b/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java index ccbc5dd9b8..da9266c643 100644 --- a/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java +++ b/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java @@ -3,6 +3,7 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Matrix4f; import net.coderbot.batchedentityrendering.impl.FullyBufferedMultiBufferSource; import net.coderbot.iris.layer.GbufferProgram; import net.coderbot.iris.mixin.GameRendererAccessor; @@ -25,19 +26,19 @@ public class HandRenderer { private static boolean renderingSolid; private FullyBufferedMultiBufferSource bufferSource = new FullyBufferedMultiBufferSource(); - private void setupGlState(GameRenderer gameRenderer, PoseStack poseStack, float tickDelta, Camera camera) { + private void setupGlState(GameRenderer gameRenderer, Camera camera, PoseStack poseStack, float tickDelta) { final PoseStack.Pose pose = poseStack.last(); - // We have a inject in getProjectionMatrix to scale the matrix so the hand doesn't clip through blocks. - gameRenderer.resetProjectionMatrix(gameRenderer.getProjectionMatrix(camera, tickDelta, false)); + // We need to scale the matrix by 0.125 so the hand doesn't clip through blocks. + gameRenderer.resetProjectionMatrix(getHandProjectionMatrix(gameRenderer, camera, tickDelta)); - pose.pose().setIdentity(); + pose.pose().setIdentity(); pose.normal().setIdentity(); - ((GameRendererAccessor)gameRenderer).invokeBobHurt(poseStack, tickDelta); + ((GameRendererAccessor) gameRenderer).invokeBobHurt(poseStack, tickDelta); if(Minecraft.getInstance().options.bobView) { - ((GameRendererAccessor)gameRenderer).invokeBobView(poseStack, tickDelta); + ((GameRendererAccessor) gameRenderer).invokeBobView(poseStack, tickDelta); } } @@ -64,8 +65,17 @@ public boolean isAnyHandTranslucent() { return isHandTranslucent(InteractionHand.MAIN_HAND) || isHandTranslucent(InteractionHand.OFF_HAND); } + public Matrix4f getHandProjectionMatrix(GameRenderer gameRenderer, Camera camera, float tickDelta) { + PoseStack poseStack = new PoseStack(); + poseStack.last().pose().setIdentity(); + + poseStack.scale(1F, 1F, 0.125F); + poseStack.last().pose().multiply(Matrix4f.perspective(((GameRendererAccessor) gameRenderer).invokeGetFov(camera, tickDelta, false), (float) Minecraft.getInstance().getWindow().getWidth() / (float) Minecraft.getInstance().getWindow().getHeight(), 0.05F, Math.max(43.25F, gameRenderer.getRenderDistance() * 2.0F))); + return poseStack.last().pose(); + } + public void renderSolid(PoseStack poseStack, float tickDelta, Camera camera, GameRenderer gameRenderer, WorldRenderingPipeline pipeline) { - if(!canRender(camera, gameRenderer)) { + if(!canRender(camera, gameRenderer) || pipeline instanceof FixedFunctionWorldRenderingPipeline) { return; } @@ -75,7 +85,7 @@ public void renderSolid(PoseStack poseStack, float tickDelta, Camera camera, Gam Minecraft.getInstance().getProfiler().push("iris_hand"); - setupGlState(gameRenderer, poseStack, tickDelta, camera); + setupGlState(gameRenderer, camera, poseStack, tickDelta); pipeline.pushProgram(GbufferProgram.HAND); @@ -101,7 +111,7 @@ public void renderSolid(PoseStack poseStack, float tickDelta, Camera camera, Gam } public void renderTranslucent(PoseStack poseStack, float tickDelta, Camera camera, GameRenderer gameRenderer, WorldRenderingPipeline pipeline) { - if(!canRender(camera, gameRenderer) || !isAnyHandTranslucent()) { + if(!canRender(camera, gameRenderer) || !isAnyHandTranslucent() || pipeline instanceof FixedFunctionWorldRenderingPipeline) { return; } @@ -111,7 +121,7 @@ public void renderTranslucent(PoseStack poseStack, float tickDelta, Camera camer Minecraft.getInstance().getProfiler().push("iris_hand_translucent"); - setupGlState(gameRenderer, poseStack, tickDelta, camera); + setupGlState(gameRenderer, camera, poseStack, tickDelta); RenderSystem.enableBlend(); From c411c823954fe95e59c9c18594b86524b943f4e1 Mon Sep 17 00:00:00 2001 From: IMS212 Date: Mon, 15 Nov 2021 09:22:17 -0800 Subject: [PATCH 44/53] Even more changes --- src/main/java/net/coderbot/iris/layer/GbufferPrograms.java | 2 +- .../net/coderbot/iris/mixin/rendertype/MixinRenderType.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/coderbot/iris/layer/GbufferPrograms.java b/src/main/java/net/coderbot/iris/layer/GbufferPrograms.java index 0bdbfb7f58..0158419cdc 100644 --- a/src/main/java/net/coderbot/iris/layer/GbufferPrograms.java +++ b/src/main/java/net/coderbot/iris/layer/GbufferPrograms.java @@ -11,7 +11,7 @@ public class GbufferPrograms { /** * Uses additional information to choose a more specific (and appropriate) GbufferProgram. */ - public static GbufferProgram refine(GbufferProgram program) { + private static GbufferProgram refine(GbufferProgram program) { if (program == GbufferProgram.ENTITIES || program == GbufferProgram.TERRAIN || program == GbufferProgram.TRANSLUCENT_TERRAIN) { if (HandRenderer.isActive()) { return GbufferProgram.HAND; diff --git a/src/main/java/net/coderbot/iris/mixin/rendertype/MixinRenderType.java b/src/main/java/net/coderbot/iris/mixin/rendertype/MixinRenderType.java index 95815a82a2..d202f559a9 100644 --- a/src/main/java/net/coderbot/iris/mixin/rendertype/MixinRenderType.java +++ b/src/main/java/net/coderbot/iris/mixin/rendertype/MixinRenderType.java @@ -152,7 +152,7 @@ private static RenderType wrap(RenderType wrapped, GbufferProgram program) { private static void iris$wrapEntityRenderTypes(ResourceLocation texture, CallbackInfoReturnable cir) { RenderType base = cir.getReturnValue(); - cir.setReturnValue(wrap(base, GbufferPrograms.refine(GbufferProgram.ENTITIES))); + cir.setReturnValue(wrap(base, GbufferProgram.ENTITIES)); } @Inject(at = @At("RETURN"), method = { @@ -163,7 +163,7 @@ private static RenderType wrap(RenderType wrapped, GbufferProgram program) { private static void iris$wrapEntityRenderTypesZ(ResourceLocation texture, boolean affectsOutline, CallbackInfoReturnable cir) { RenderType base = cir.getReturnValue(); - cir.setReturnValue(wrap(base, GbufferPrograms.refine(GbufferProgram.ENTITIES))); + cir.setReturnValue(wrap(base, GbufferProgram.ENTITIES)); } @Inject(at = @At("RETURN"), method = { From 9883f211a7178bbcb1b3dc3d01aed06a010853ee Mon Sep 17 00:00:00 2001 From: IMS212 Date: Mon, 15 Nov 2021 09:49:49 -0800 Subject: [PATCH 45/53] Reset draw calls as part of finalizing world pipeline --- .../net/coderbot/iris/layer/GbufferPrograms.java | 2 +- .../iris/mixin/MixinItemInHandRenderer.java | 2 +- .../rendertype/MixinItemBlockRenderTypes.java | 4 ++-- .../pipeline/DeferredWorldRenderingPipeline.java | 1 + .../net/coderbot/iris/pipeline/HandRenderer.java | 14 ++++++++------ 5 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/main/java/net/coderbot/iris/layer/GbufferPrograms.java b/src/main/java/net/coderbot/iris/layer/GbufferPrograms.java index 0158419cdc..7265bce587 100644 --- a/src/main/java/net/coderbot/iris/layer/GbufferPrograms.java +++ b/src/main/java/net/coderbot/iris/layer/GbufferPrograms.java @@ -13,7 +13,7 @@ public class GbufferPrograms { */ private static GbufferProgram refine(GbufferProgram program) { if (program == GbufferProgram.ENTITIES || program == GbufferProgram.TERRAIN || program == GbufferProgram.TRANSLUCENT_TERRAIN) { - if (HandRenderer.isActive()) { + if (HandRenderer.INSTANCE.isActive()) { return GbufferProgram.HAND; } else if (entities) { return GbufferProgram.ENTITIES; diff --git a/src/main/java/net/coderbot/iris/mixin/MixinItemInHandRenderer.java b/src/main/java/net/coderbot/iris/mixin/MixinItemInHandRenderer.java index c1dbdd5ebb..21cd56be48 100644 --- a/src/main/java/net/coderbot/iris/mixin/MixinItemInHandRenderer.java +++ b/src/main/java/net/coderbot/iris/mixin/MixinItemInHandRenderer.java @@ -16,7 +16,7 @@ public class MixinItemInHandRenderer { @Inject(method = "renderArmWithItem", at = @At("HEAD"), cancellable = true) private void skipTranslucentHands(AbstractClientPlayer abstractClientPlayer, float f, float g, InteractionHand interactionHand, float h, ItemStack itemStack, float i, PoseStack poseStack, MultiBufferSource multiBufferSource, int j, CallbackInfo ci) { - if (HandRenderer.isRenderingSolid() && HandRenderer.INSTANCE.isHandTranslucent(interactionHand)) { + if (HandRenderer.INSTANCE.isRenderingSolid() && HandRenderer.INSTANCE.isHandTranslucent(interactionHand)) { ci.cancel(); } } diff --git a/src/main/java/net/coderbot/iris/mixin/rendertype/MixinItemBlockRenderTypes.java b/src/main/java/net/coderbot/iris/mixin/rendertype/MixinItemBlockRenderTypes.java index 98b5bca10b..56d59f17cd 100644 --- a/src/main/java/net/coderbot/iris/mixin/rendertype/MixinItemBlockRenderTypes.java +++ b/src/main/java/net/coderbot/iris/mixin/rendertype/MixinItemBlockRenderTypes.java @@ -38,7 +38,7 @@ private static RenderType wrap(RenderType wrapped, GbufferProgram program) { private static void getRenderType(ItemStack itemStack, boolean bl, CallbackInfoReturnable cir) { RenderType base = cir.getReturnValue(); - if(HandRenderer.isActive()) { + if(HandRenderer.INSTANCE.isActive()) { //TODO: Is there a better way to do this? if(base == Sheets.translucentItemSheet()) { cir.setReturnValue(RenderType.entityTranslucentCull(TextureAtlas.LOCATION_BLOCKS)); @@ -52,7 +52,7 @@ private static void getRenderType(ItemStack itemStack, boolean bl, CallbackInfoR private static void getRenderType(BlockState blockState, boolean bl, CallbackInfoReturnable cir) { RenderType base = cir.getReturnValue(); - if(HandRenderer.isActive()) { + if(HandRenderer.INSTANCE.isActive()) { //TODO: Is there a better way to do this? cir.setReturnValue(wrap(base, getChunkRenderType(blockState) == RenderType.translucent() ? GbufferProgram.HAND_TRANSLUCENT : GbufferProgram.HAND)); } diff --git a/src/main/java/net/coderbot/iris/pipeline/DeferredWorldRenderingPipeline.java b/src/main/java/net/coderbot/iris/pipeline/DeferredWorldRenderingPipeline.java index 9e637fa54a..dcd616353d 100644 --- a/src/main/java/net/coderbot/iris/pipeline/DeferredWorldRenderingPipeline.java +++ b/src/main/java/net/coderbot/iris/pipeline/DeferredWorldRenderingPipeline.java @@ -770,6 +770,7 @@ public void finalizeLevelRendering() { isRenderingWorld = false; programStackLog.clear(); + HandRenderer.INSTANCE.getBufferSource().resetDrawCalls(); compositeRenderer.renderAll(); finalPassRenderer.renderFinalPass(); diff --git a/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java b/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java index da9266c643..ca695a1228 100644 --- a/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java +++ b/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java @@ -22,8 +22,8 @@ public class HandRenderer { public static final HandRenderer INSTANCE = new HandRenderer(); - private static boolean ACTIVE; - private static boolean renderingSolid; + private boolean ACTIVE; + private boolean renderingSolid; private FullyBufferedMultiBufferSource bufferSource = new FullyBufferedMultiBufferSource(); private void setupGlState(GameRenderer gameRenderer, Camera camera, PoseStack poseStack, float tickDelta) { @@ -139,16 +139,18 @@ public void renderTranslucent(PoseStack poseStack, float tickDelta, Camera camer bufferSource.endBatch(); - bufferSource.resetDrawCalls(); - ACTIVE = false; } - public static boolean isActive() { + public boolean isActive() { return ACTIVE; } - public static boolean isRenderingSolid() { + public boolean isRenderingSolid() { return renderingSolid; } + + public FullyBufferedMultiBufferSource getBufferSource() { + return bufferSource; + } } From 8bf9a358426d63bbd73066e76afe46b78fb027c2 Mon Sep 17 00:00:00 2001 From: IMS212 Date: Mon, 15 Nov 2021 12:23:36 -0800 Subject: [PATCH 46/53] Reset draw calls as part of starting world pipeline --- .../coderbot/iris/pipeline/DeferredWorldRenderingPipeline.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/coderbot/iris/pipeline/DeferredWorldRenderingPipeline.java b/src/main/java/net/coderbot/iris/pipeline/DeferredWorldRenderingPipeline.java index dcd616353d..a2a55516d0 100644 --- a/src/main/java/net/coderbot/iris/pipeline/DeferredWorldRenderingPipeline.java +++ b/src/main/java/net/coderbot/iris/pipeline/DeferredWorldRenderingPipeline.java @@ -728,6 +728,7 @@ public OptionalInt getForcedShadowRenderDistanceChunksForDisplay() { public void beginLevelRendering() { isRenderingWorld = true; isBeforeTranslucent = true; + HandRenderer.INSTANCE.getBufferSource().resetDrawCalls(); checkWorld(); @@ -770,7 +771,6 @@ public void finalizeLevelRendering() { isRenderingWorld = false; programStackLog.clear(); - HandRenderer.INSTANCE.getBufferSource().resetDrawCalls(); compositeRenderer.renderAll(); finalPassRenderer.renderFinalPass(); From f3785d1cad2c19106777fc72b3c755c901c71d89 Mon Sep 17 00:00:00 2001 From: maximumpower55 <62370320+maximumpower55@users.noreply.github.com> Date: Mon, 15 Nov 2021 12:38:09 -0800 Subject: [PATCH 47/53] Fix last review issues --- .../coderbot/iris/pipeline/HandRenderer.java | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java b/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java index ca695a1228..22482b0dc3 100644 --- a/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java +++ b/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java @@ -30,7 +30,9 @@ private void setupGlState(GameRenderer gameRenderer, Camera camera, PoseStack po final PoseStack.Pose pose = poseStack.last(); // We need to scale the matrix by 0.125 so the hand doesn't clip through blocks. - gameRenderer.resetProjectionMatrix(getHandProjectionMatrix(gameRenderer, camera, tickDelta)); + Matrix4f scaleMatrix = Matrix4f.createScaleMatrix(1F, 1F, 0.125F); + scaleMatrix.multiply(gameRenderer.getProjectionMatrix(camera, tickDelta, false)); + gameRenderer.resetProjectionMatrix(scaleMatrix); pose.pose().setIdentity(); pose.normal().setIdentity(); @@ -65,15 +67,6 @@ public boolean isAnyHandTranslucent() { return isHandTranslucent(InteractionHand.MAIN_HAND) || isHandTranslucent(InteractionHand.OFF_HAND); } - public Matrix4f getHandProjectionMatrix(GameRenderer gameRenderer, Camera camera, float tickDelta) { - PoseStack poseStack = new PoseStack(); - poseStack.last().pose().setIdentity(); - - poseStack.scale(1F, 1F, 0.125F); - poseStack.last().pose().multiply(Matrix4f.perspective(((GameRendererAccessor) gameRenderer).invokeGetFov(camera, tickDelta, false), (float) Minecraft.getInstance().getWindow().getWidth() / (float) Minecraft.getInstance().getWindow().getHeight(), 0.05F, Math.max(43.25F, gameRenderer.getRenderDistance() * 2.0F))); - return poseStack.last().pose(); - } - public void renderSolid(PoseStack poseStack, float tickDelta, Camera camera, GameRenderer gameRenderer, WorldRenderingPipeline pipeline) { if(!canRender(camera, gameRenderer) || pipeline instanceof FixedFunctionWorldRenderingPipeline) { return; @@ -89,8 +82,6 @@ public void renderSolid(PoseStack poseStack, float tickDelta, Camera camera, Gam pipeline.pushProgram(GbufferProgram.HAND); - RenderSystem.disableBlend(); - renderingSolid = true; Minecraft.getInstance().getItemInHandRenderer().renderHandsWithItems(tickDelta, poseStack, bufferSource, Minecraft.getInstance().player, Minecraft.getInstance().getEntityRenderDispatcher().getPackedLightCoords(camera.getEntity(), tickDelta)); @@ -123,8 +114,6 @@ public void renderTranslucent(PoseStack poseStack, float tickDelta, Camera camer setupGlState(gameRenderer, camera, poseStack, tickDelta); - RenderSystem.enableBlend(); - pipeline.pushProgram(GbufferProgram.HAND_TRANSLUCENT); Minecraft.getInstance().getItemInHandRenderer().renderHandsWithItems(tickDelta, poseStack, bufferSource, Minecraft.getInstance().player, Minecraft.getInstance().getEntityRenderDispatcher().getPackedLightCoords(camera.getEntity(), tickDelta)); From 2cba3b5f82b93bce3c38e91d149c7da57653822c Mon Sep 17 00:00:00 2001 From: IMS212 Date: Mon, 15 Nov 2021 14:58:37 -0800 Subject: [PATCH 48/53] Add ENTITIES_TRANSLUCENT This is the same as ENTITIES, except it returns HAND_TRANSLUCENT if hand rendering is in progress. --- .../java/net/coderbot/iris/layer/GbufferProgram.java | 1 + .../java/net/coderbot/iris/layer/GbufferPrograms.java | 4 ++-- .../coderbot/iris/mixin/rendertype/MixinRenderType.java | 9 +++++++-- .../iris/pipeline/DeferredWorldRenderingPipeline.java | 2 ++ 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/main/java/net/coderbot/iris/layer/GbufferProgram.java b/src/main/java/net/coderbot/iris/layer/GbufferProgram.java index e82bf62f57..15b8529c32 100644 --- a/src/main/java/net/coderbot/iris/layer/GbufferProgram.java +++ b/src/main/java/net/coderbot/iris/layer/GbufferProgram.java @@ -14,6 +14,7 @@ public enum GbufferProgram { BLOCK_ENTITIES, BEACON_BEAM, ENTITIES, + ENTITIES_TRANSLUCENT, ENTITIES_GLOWING, ARMOR_GLINT, EYES, diff --git a/src/main/java/net/coderbot/iris/layer/GbufferPrograms.java b/src/main/java/net/coderbot/iris/layer/GbufferPrograms.java index 7265bce587..0626ea9c6a 100644 --- a/src/main/java/net/coderbot/iris/layer/GbufferPrograms.java +++ b/src/main/java/net/coderbot/iris/layer/GbufferPrograms.java @@ -12,9 +12,9 @@ public class GbufferPrograms { * Uses additional information to choose a more specific (and appropriate) GbufferProgram. */ private static GbufferProgram refine(GbufferProgram program) { - if (program == GbufferProgram.ENTITIES || program == GbufferProgram.TERRAIN || program == GbufferProgram.TRANSLUCENT_TERRAIN) { + if (program == GbufferProgram.ENTITIES || program == GbufferProgram.ENTITIES_TRANSLUCENT || program == GbufferProgram.TERRAIN || program == GbufferProgram.TRANSLUCENT_TERRAIN) { if (HandRenderer.INSTANCE.isActive()) { - return GbufferProgram.HAND; + return program == GbufferProgram.ENTITIES_TRANSLUCENT ? GbufferProgram.HAND_TRANSLUCENT : GbufferProgram.HAND; } else if (entities) { return GbufferProgram.ENTITIES; } else if (blockEntities) { diff --git a/src/main/java/net/coderbot/iris/mixin/rendertype/MixinRenderType.java b/src/main/java/net/coderbot/iris/mixin/rendertype/MixinRenderType.java index d202f559a9..b580218740 100644 --- a/src/main/java/net/coderbot/iris/mixin/rendertype/MixinRenderType.java +++ b/src/main/java/net/coderbot/iris/mixin/rendertype/MixinRenderType.java @@ -140,8 +140,6 @@ private static RenderType wrap(RenderType wrapped, GbufferProgram program) { "armorCutoutNoCull", "entitySolid", "entityCutout", - "itemEntityTranslucentCull", - "entityTranslucentCull", "entitySmoothCutout", "entityDecal", "entityNoOutline", @@ -155,6 +153,13 @@ private static RenderType wrap(RenderType wrapped, GbufferProgram program) { cir.setReturnValue(wrap(base, GbufferProgram.ENTITIES)); } + @Inject(method = {"itemEntityTranslucentCull", "entityTranslucentCull"}, at = @At("RETURN"), cancellable = true) + private static void iris$wrapItemTranslucentRenderType(ResourceLocation resourceLocation, CallbackInfoReturnable cir) { + RenderType base = cir.getReturnValue(); + + cir.setReturnValue(wrap(base, GbufferProgram.ENTITIES_TRANSLUCENT)); + } + @Inject(at = @At("RETURN"), method = { "entityCutoutNoCull(Lnet/minecraft/resources/ResourceLocation;Z)Lnet/minecraft/client/renderer/RenderType;", "entityCutoutNoCullZOffset(Lnet/minecraft/resources/ResourceLocation;Z)Lnet/minecraft/client/renderer/RenderType;", diff --git a/src/main/java/net/coderbot/iris/pipeline/DeferredWorldRenderingPipeline.java b/src/main/java/net/coderbot/iris/pipeline/DeferredWorldRenderingPipeline.java index a2a55516d0..71093df444 100644 --- a/src/main/java/net/coderbot/iris/pipeline/DeferredWorldRenderingPipeline.java +++ b/src/main/java/net/coderbot/iris/pipeline/DeferredWorldRenderingPipeline.java @@ -370,6 +370,8 @@ private Pass getPass(GbufferProgram program) { return beaconBeam; case ENTITIES: return entities; + case ENTITIES_TRANSLUCENT: + return entities; case BLOCK_ENTITIES: return blockEntities; case ENTITIES_GLOWING: From 8a36472aecb958a11163984d74d104f639cb6e3f Mon Sep 17 00:00:00 2001 From: IMS212 Date: Mon, 15 Nov 2021 15:01:27 -0800 Subject: [PATCH 49/53] Remove MixinItemBlockRenderTypes.java --- .../rendertype/MixinItemBlockRenderTypes.java | 60 ------------------- src/main/resources/mixins.iris.json | 1 - 2 files changed, 61 deletions(-) delete mode 100644 src/main/java/net/coderbot/iris/mixin/rendertype/MixinItemBlockRenderTypes.java diff --git a/src/main/java/net/coderbot/iris/mixin/rendertype/MixinItemBlockRenderTypes.java b/src/main/java/net/coderbot/iris/mixin/rendertype/MixinItemBlockRenderTypes.java deleted file mode 100644 index 56d59f17cd..0000000000 --- a/src/main/java/net/coderbot/iris/mixin/rendertype/MixinItemBlockRenderTypes.java +++ /dev/null @@ -1,60 +0,0 @@ -package net.coderbot.iris.mixin.rendertype; - -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.block.state.BlockState; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import net.coderbot.iris.layer.GbufferProgram; -import net.coderbot.iris.layer.IrisRenderTypeWrapper; -import net.coderbot.iris.layer.UseProgramRenderStateShard; -import net.coderbot.iris.pipeline.HandRenderer; -import net.minecraft.client.renderer.ItemBlockRenderTypes; -import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.Sheets; -import net.minecraft.client.renderer.texture.TextureAtlas; - -@Mixin(ItemBlockRenderTypes.class) -public abstract class MixinItemBlockRenderTypes { - @Shadow - private static RenderType getChunkRenderType(BlockState blockState) { - throw new UnsupportedOperationException("not shadowed"); - } - - private static RenderType wrap(String name, RenderType wrapped, GbufferProgram program) { - return new IrisRenderTypeWrapper(name, wrapped, new UseProgramRenderStateShard(program)); - } - - private static RenderType wrap(RenderType wrapped, GbufferProgram program) { - String name = ((RenderStateShardAccessor) wrapped).getName(); - - return wrap("iris:" + name, wrapped, program); - } - - @Inject(method = "getRenderType(Lnet/minecraft/world/item/ItemStack;Z)Lnet/minecraft/client/renderer/RenderType;", at = @At("RETURN"), cancellable = true) - private static void getRenderType(ItemStack itemStack, boolean bl, CallbackInfoReturnable cir) { - RenderType base = cir.getReturnValue(); - - if(HandRenderer.INSTANCE.isActive()) { - //TODO: Is there a better way to do this? - if(base == Sheets.translucentItemSheet()) { - cir.setReturnValue(RenderType.entityTranslucentCull(TextureAtlas.LOCATION_BLOCKS)); - } else if(base == Sheets.translucentCullBlockSheet()) { - cir.setReturnValue(RenderType.itemEntityTranslucentCull(TextureAtlas.LOCATION_BLOCKS)); - } - } - } - - @Inject(method = "getRenderType(Lnet/minecraft/world/level/block/state/BlockState;Z)Lnet/minecraft/client/renderer/RenderType;", at = @At("RETURN"), cancellable = true) - private static void getRenderType(BlockState blockState, boolean bl, CallbackInfoReturnable cir) { - RenderType base = cir.getReturnValue(); - - if(HandRenderer.INSTANCE.isActive()) { - //TODO: Is there a better way to do this? - cir.setReturnValue(wrap(base, getChunkRenderType(blockState) == RenderType.translucent() ? GbufferProgram.HAND_TRANSLUCENT : GbufferProgram.HAND)); - } - } -} diff --git a/src/main/resources/mixins.iris.json b/src/main/resources/mixins.iris.json index 4fd93ec582..fa73440b3b 100644 --- a/src/main/resources/mixins.iris.json +++ b/src/main/resources/mixins.iris.json @@ -37,7 +37,6 @@ "math.MixinMatrix4f", "rendertype.MixinFixEyesTranslucency", "rendertype.MixinRenderType", - "rendertype.MixinItemBlockRenderTypes", "rendertype.RenderStateShardAccessor", "rendertype.RenderTypeAccessor", "shadows.MixinBeaconRenderer", From 68bbf9475ba4f2af117d7b822750574680dcf88e Mon Sep 17 00:00:00 2001 From: IMS212 Date: Mon, 15 Nov 2021 15:05:40 -0800 Subject: [PATCH 50/53] Only apply ENTITY_TRANSLUCENT to entityTranslucentCull --- .../net/coderbot/iris/mixin/rendertype/MixinRenderType.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/coderbot/iris/mixin/rendertype/MixinRenderType.java b/src/main/java/net/coderbot/iris/mixin/rendertype/MixinRenderType.java index b580218740..81a88d84c9 100644 --- a/src/main/java/net/coderbot/iris/mixin/rendertype/MixinRenderType.java +++ b/src/main/java/net/coderbot/iris/mixin/rendertype/MixinRenderType.java @@ -144,6 +144,7 @@ private static RenderType wrap(RenderType wrapped, GbufferProgram program) { "entityDecal", "entityNoOutline", "entityShadow", + "itemEntityTranslucentCull", "text", "textSeeThrough", }, cancellable = true) @@ -153,7 +154,7 @@ private static RenderType wrap(RenderType wrapped, GbufferProgram program) { cir.setReturnValue(wrap(base, GbufferProgram.ENTITIES)); } - @Inject(method = {"itemEntityTranslucentCull", "entityTranslucentCull"}, at = @At("RETURN"), cancellable = true) + @Inject(method = "entityTranslucentCull", at = @At("RETURN"), cancellable = true) private static void iris$wrapItemTranslucentRenderType(ResourceLocation resourceLocation, CallbackInfoReturnable cir) { RenderType base = cir.getReturnValue(); From 9a884f67f4cd79be5fb89c656abfddcc87d16546 Mon Sep 17 00:00:00 2001 From: IMS212 Date: Mon, 15 Nov 2021 15:52:42 -0800 Subject: [PATCH 51/53] Fix translucent hand rendering --- src/main/java/net/coderbot/iris/layer/GbufferProgram.java | 1 - .../java/net/coderbot/iris/layer/GbufferPrograms.java | 4 ++-- .../net/coderbot/iris/mixin/MixinItemInHandRenderer.java | 2 ++ .../coderbot/iris/mixin/rendertype/MixinRenderType.java | 8 +------- .../iris/pipeline/DeferredWorldRenderingPipeline.java | 2 -- 5 files changed, 5 insertions(+), 12 deletions(-) diff --git a/src/main/java/net/coderbot/iris/layer/GbufferProgram.java b/src/main/java/net/coderbot/iris/layer/GbufferProgram.java index 15b8529c32..e82bf62f57 100644 --- a/src/main/java/net/coderbot/iris/layer/GbufferProgram.java +++ b/src/main/java/net/coderbot/iris/layer/GbufferProgram.java @@ -14,7 +14,6 @@ public enum GbufferProgram { BLOCK_ENTITIES, BEACON_BEAM, ENTITIES, - ENTITIES_TRANSLUCENT, ENTITIES_GLOWING, ARMOR_GLINT, EYES, diff --git a/src/main/java/net/coderbot/iris/layer/GbufferPrograms.java b/src/main/java/net/coderbot/iris/layer/GbufferPrograms.java index 0626ea9c6a..7abea1dca6 100644 --- a/src/main/java/net/coderbot/iris/layer/GbufferPrograms.java +++ b/src/main/java/net/coderbot/iris/layer/GbufferPrograms.java @@ -12,9 +12,9 @@ public class GbufferPrograms { * Uses additional information to choose a more specific (and appropriate) GbufferProgram. */ private static GbufferProgram refine(GbufferProgram program) { - if (program == GbufferProgram.ENTITIES || program == GbufferProgram.ENTITIES_TRANSLUCENT || program == GbufferProgram.TERRAIN || program == GbufferProgram.TRANSLUCENT_TERRAIN) { + if (program == GbufferProgram.ENTITIES || program == GbufferProgram.TERRAIN || program == GbufferProgram.TRANSLUCENT_TERRAIN) { if (HandRenderer.INSTANCE.isActive()) { - return program == GbufferProgram.ENTITIES_TRANSLUCENT ? GbufferProgram.HAND_TRANSLUCENT : GbufferProgram.HAND; + return HandRenderer.INSTANCE.isRenderingSolid() ? GbufferProgram.HAND : GbufferProgram.HAND_TRANSLUCENT; } else if (entities) { return GbufferProgram.ENTITIES; } else if (blockEntities) { diff --git a/src/main/java/net/coderbot/iris/mixin/MixinItemInHandRenderer.java b/src/main/java/net/coderbot/iris/mixin/MixinItemInHandRenderer.java index 21cd56be48..afd483cfd4 100644 --- a/src/main/java/net/coderbot/iris/mixin/MixinItemInHandRenderer.java +++ b/src/main/java/net/coderbot/iris/mixin/MixinItemInHandRenderer.java @@ -18,6 +18,8 @@ public class MixinItemInHandRenderer { private void skipTranslucentHands(AbstractClientPlayer abstractClientPlayer, float f, float g, InteractionHand interactionHand, float h, ItemStack itemStack, float i, PoseStack poseStack, MultiBufferSource multiBufferSource, int j, CallbackInfo ci) { if (HandRenderer.INSTANCE.isRenderingSolid() && HandRenderer.INSTANCE.isHandTranslucent(interactionHand)) { ci.cancel(); + } else if (!HandRenderer.INSTANCE.isRenderingSolid() && !HandRenderer.INSTANCE.isHandTranslucent(interactionHand)) { + ci.cancel(); } } } diff --git a/src/main/java/net/coderbot/iris/mixin/rendertype/MixinRenderType.java b/src/main/java/net/coderbot/iris/mixin/rendertype/MixinRenderType.java index 81a88d84c9..71f5561869 100644 --- a/src/main/java/net/coderbot/iris/mixin/rendertype/MixinRenderType.java +++ b/src/main/java/net/coderbot/iris/mixin/rendertype/MixinRenderType.java @@ -144,6 +144,7 @@ private static RenderType wrap(RenderType wrapped, GbufferProgram program) { "entityDecal", "entityNoOutline", "entityShadow", + "entityTranslucentCull", "itemEntityTranslucentCull", "text", "textSeeThrough", @@ -154,13 +155,6 @@ private static RenderType wrap(RenderType wrapped, GbufferProgram program) { cir.setReturnValue(wrap(base, GbufferProgram.ENTITIES)); } - @Inject(method = "entityTranslucentCull", at = @At("RETURN"), cancellable = true) - private static void iris$wrapItemTranslucentRenderType(ResourceLocation resourceLocation, CallbackInfoReturnable cir) { - RenderType base = cir.getReturnValue(); - - cir.setReturnValue(wrap(base, GbufferProgram.ENTITIES_TRANSLUCENT)); - } - @Inject(at = @At("RETURN"), method = { "entityCutoutNoCull(Lnet/minecraft/resources/ResourceLocation;Z)Lnet/minecraft/client/renderer/RenderType;", "entityCutoutNoCullZOffset(Lnet/minecraft/resources/ResourceLocation;Z)Lnet/minecraft/client/renderer/RenderType;", diff --git a/src/main/java/net/coderbot/iris/pipeline/DeferredWorldRenderingPipeline.java b/src/main/java/net/coderbot/iris/pipeline/DeferredWorldRenderingPipeline.java index 71093df444..a2a55516d0 100644 --- a/src/main/java/net/coderbot/iris/pipeline/DeferredWorldRenderingPipeline.java +++ b/src/main/java/net/coderbot/iris/pipeline/DeferredWorldRenderingPipeline.java @@ -370,8 +370,6 @@ private Pass getPass(GbufferProgram program) { return beaconBeam; case ENTITIES: return entities; - case ENTITIES_TRANSLUCENT: - return entities; case BLOCK_ENTITIES: return blockEntities; case ENTITIES_GLOWING: From d915f61aa50451432f616c56b7bc2b03ee9ea2d2 Mon Sep 17 00:00:00 2001 From: maximumpower55 <62370320+maximumpower55@users.noreply.github.com> Date: Tue, 16 Nov 2021 14:14:27 -0800 Subject: [PATCH 52/53] Remove leftover code --- .../java/net/coderbot/iris/pipeline/HandRenderer.java | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java b/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java index 22482b0dc3..97bbacae4d 100644 --- a/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java +++ b/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java @@ -80,16 +80,12 @@ public void renderSolid(PoseStack poseStack, float tickDelta, Camera camera, Gam setupGlState(gameRenderer, camera, poseStack, tickDelta); - pipeline.pushProgram(GbufferProgram.HAND); - renderingSolid = true; Minecraft.getInstance().getItemInHandRenderer().renderHandsWithItems(tickDelta, poseStack, bufferSource, Minecraft.getInstance().player, Minecraft.getInstance().getEntityRenderDispatcher().getPackedLightCoords(camera.getEntity(), tickDelta)); renderingSolid = false; - pipeline.popProgram(GbufferProgram.HAND); - Minecraft.getInstance().getProfiler().pop(); gameRenderer.resetProjectionMatrix(CapturedRenderingState.INSTANCE.getGbufferProjection()); @@ -114,12 +110,8 @@ public void renderTranslucent(PoseStack poseStack, float tickDelta, Camera camer setupGlState(gameRenderer, camera, poseStack, tickDelta); - pipeline.pushProgram(GbufferProgram.HAND_TRANSLUCENT); - Minecraft.getInstance().getItemInHandRenderer().renderHandsWithItems(tickDelta, poseStack, bufferSource, Minecraft.getInstance().player, Minecraft.getInstance().getEntityRenderDispatcher().getPackedLightCoords(camera.getEntity(), tickDelta)); - pipeline.popProgram(GbufferProgram.HAND_TRANSLUCENT); - poseStack.popPose(); Minecraft.getInstance().getProfiler().pop(); From d147d1146d59d6672e9c342520fb50ea44f05669 Mon Sep 17 00:00:00 2001 From: IMS212 Date: Tue, 16 Nov 2021 14:25:20 -0800 Subject: [PATCH 53/53] Put renderingSolide = false after ending batch --- src/main/java/net/coderbot/iris/pipeline/HandRenderer.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java b/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java index 97bbacae4d..3f2183afe4 100644 --- a/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java +++ b/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java @@ -84,8 +84,6 @@ public void renderSolid(PoseStack poseStack, float tickDelta, Camera camera, Gam Minecraft.getInstance().getItemInHandRenderer().renderHandsWithItems(tickDelta, poseStack, bufferSource, Minecraft.getInstance().player, Minecraft.getInstance().getEntityRenderDispatcher().getPackedLightCoords(camera.getEntity(), tickDelta)); - renderingSolid = false; - Minecraft.getInstance().getProfiler().pop(); gameRenderer.resetProjectionMatrix(CapturedRenderingState.INSTANCE.getGbufferProjection()); @@ -94,6 +92,8 @@ public void renderSolid(PoseStack poseStack, float tickDelta, Camera camera, Gam bufferSource.endBatch(); + renderingSolid = false; + ACTIVE = false; }