From 3ec81d5c35b9c08748ce6bb73e54383fa8f24849 Mon Sep 17 00:00:00 2001 From: Jonas Herzig Date: Sat, 27 Feb 2021 20:45:19 +0100 Subject: [PATCH] Split MixinEntityRenderer into multiple, more focused files --- .../render/mixin/MixinEntityRenderer.java | 240 +----------------- .../mixin/Mixin_Omnidirectional_Camera.java | 24 ++ .../mixin/Mixin_Omnidirectional_SkipHand.java | 34 +++ .../mixin/Mixin_Stereoscopic_Camera.java | 42 +++ .../Mixin_Stereoscopic_HandRenderPass.java | 10 + .../resources/mixins.render.replaymod.json | 4 + .../mixin/Mixin_Omnidirectional_Camera.java | 40 +++ .../Mixin_Stereoscopic_HandRenderPass.java | 29 +++ .../mixin/Mixin_Omnidirectional_Camera.java | 34 +++ .../mixin/Mixin_Stereoscopic_Camera.java | 43 ++++ 10 files changed, 262 insertions(+), 238 deletions(-) create mode 100644 src/main/java/com/replaymod/render/mixin/Mixin_Omnidirectional_Camera.java create mode 100644 src/main/java/com/replaymod/render/mixin/Mixin_Omnidirectional_SkipHand.java create mode 100644 src/main/java/com/replaymod/render/mixin/Mixin_Stereoscopic_Camera.java create mode 100644 src/main/java/com/replaymod/render/mixin/Mixin_Stereoscopic_HandRenderPass.java create mode 100644 versions/1.12.2/src/main/java/com/replaymod/render/mixin/Mixin_Omnidirectional_Camera.java create mode 100644 versions/1.12.2/src/main/java/com/replaymod/render/mixin/Mixin_Stereoscopic_HandRenderPass.java create mode 100644 versions/1.14.4/src/main/java/com/replaymod/render/mixin/Mixin_Omnidirectional_Camera.java create mode 100644 versions/1.14.4/src/main/java/com/replaymod/render/mixin/Mixin_Stereoscopic_Camera.java diff --git a/src/main/java/com/replaymod/render/mixin/MixinEntityRenderer.java b/src/main/java/com/replaymod/render/mixin/MixinEntityRenderer.java index 348f86e8..559f2336 100644 --- a/src/main/java/com/replaymod/render/mixin/MixinEntityRenderer.java +++ b/src/main/java/com/replaymod/render/mixin/MixinEntityRenderer.java @@ -1,66 +1,11 @@ package com.replaymod.render.mixin; -import com.replaymod.core.versions.MCVer; -import com.replaymod.render.capturer.StereoscopicOpenGlFrameCapturer; import com.replaymod.render.hooks.EntityRendererHandler; -import net.minecraft.client.MinecraftClient; -import net.minecraft.entity.player.PlayerEntity; -import org.lwjgl.opengl.GL11; -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.Redirect; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -//#if MC>=11500 -import net.minecraft.client.util.math.MatrixStack; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -//#endif - -//#if MC>=11400 -import net.minecraft.client.render.Camera; -import net.minecraft.util.hit.HitResult; -//#endif - -//#if MC>=11400 -import net.minecraft.client.options.GameOptions; import net.minecraft.client.render.GameRenderer; -import net.minecraft.util.math.Matrix4f; -import net.minecraft.client.render.WorldRenderer; -//#else -//$$ import com.replaymod.replay.camera.CameraEntity; -//$$ import net.minecraft.client.renderer.EntityRenderer; -//$$ import net.minecraft.client.renderer.RenderGlobal; -//$$ import net.minecraft.client.settings.GameSettings; -//$$ import net.minecraft.entity.Entity; -//$$ import org.lwjgl.util.glu.Project; -//#endif +import org.spongepowered.asm.mixin.Mixin; -//#if MC>=10904 -import net.minecraft.world.RaycastContext; -//#else -//$$ import net.minecraft.util.MovingObjectPosition; -//#endif - -//#if MC>=10800 -import com.mojang.blaze3d.platform.GlStateManager; -//#else -//$$ import net.minecraft.entity.EntityLivingBase; -//$$ import com.replaymod.core.versions.MCVer.GlStateManager; -//#endif - -import static com.replaymod.core.versions.MCVer.*; - -//#if MC>=11400 -@Mixin(value = GameRenderer.class) -//#else -//$$ @Mixin(value = EntityRenderer.class) -//#endif +@Mixin(GameRenderer.class) public abstract class MixinEntityRenderer implements EntityRendererHandler.IEntityRenderer { - @Shadow - public MinecraftClient client; - private EntityRendererHandler replayModRender_handler; @Override @@ -72,185 +17,4 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti public EntityRendererHandler replayModRender_getHandler() { return replayModRender_handler; } - - @Inject(method = "renderHand", at = @At("HEAD"), cancellable = true) - private void replayModRender_renderSpectatorHand( - //#if MC>=11500 - MatrixStack matrixStack, - //#endif - //#if MC>=11400 - Camera camera, - //#endif - float partialTicks, - //#if MC<11400 - //$$ int renderPass, - //#endif - CallbackInfo ci - ) { - if (replayModRender_handler != null) { - if (replayModRender_handler.omnidirectional) { - // No spectator hands during 360° view, we wouldn't even know where to put it - ci.cancel(); - //#if MC>=11400 - } - //#else - //$$ } else { - //$$ Entity currentEntity = this.mc.getRenderViewEntity(); - //$$ if (currentEntity instanceof EntityPlayer && !(currentEntity instanceof CameraEntity)) { - //$$ if (renderPass == 2) { // Need to update render pass - //$$ renderPass = replayModRender_handler.data == StereoscopicOpenGlFrameCapturer.Data.LEFT_EYE ? 1 : 0; - //$$ renderHand(partialTicks, renderPass); - //$$ ci.cancel(); - //$$ } // else, render normally - //$$ } - //$$ } - //#endif - } - } - - //#if MC<11400 - //$$ @Shadow - //$$ public abstract void renderHand(float partialTicks, int renderPass); - //#endif - - /* - * Stereoscopic Renderer - */ - - //#if MC>=11500 - @Inject(method = "method_22973", at = @At("RETURN"), cancellable = true) - private void replayModRender_setupStereoscopicProjection(CallbackInfoReturnable ci) { - if (replayModRender_getHandler() != null) { - Matrix4f offset; - if (replayModRender_getHandler().data == StereoscopicOpenGlFrameCapturer.Data.LEFT_EYE) { - offset = Matrix4f.translate(0.07f, 0, 0); - } else if (replayModRender_getHandler().data == StereoscopicOpenGlFrameCapturer.Data.RIGHT_EYE) { - offset = Matrix4f.translate(-0.07f, 0, 0); - } else { - return; - } - offset.multiply(ci.getReturnValue()); - ci.setReturnValue(offset); - } - } - //#else - //#if MC>=10800 - //$$ @Inject(method = "applyCameraTransformations", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/platform/GlStateManager;loadIdentity()V", shift = At.Shift.AFTER, ordinal = 0)) - //#else - //$$ @Inject(method = "setupCameraTransform", at = @At(value = "INVOKE", target = "Lorg/lwjgl/opengl/GL11;glLoadIdentity()V", shift = At.Shift.AFTER, ordinal = 0, remap = false)) - //#endif - //$$ private void replayModRender_setupStereoscopicProjection( - //$$ float partialTicks, - //#if MC<11400 - //$$ int renderPass, - //#endif - //$$ CallbackInfo ci - //$$ ) { - //$$ if (replayModRender_getHandler() != null) { - //$$ if (replayModRender_getHandler().data == StereoscopicOpenGlFrameCapturer.Data.LEFT_EYE) { - //$$ GL11.glTranslatef(0.07f, 0, 0); - //$$ } else if (replayModRender_getHandler().data == StereoscopicOpenGlFrameCapturer.Data.RIGHT_EYE) { - //$$ GL11.glTranslatef(-0.07f, 0, 0); - //$$ } - //$$ } - //$$ } - //#endif - - //#if MC>=11500 - @Inject(method = "renderWorld", at = @At("HEAD")) - private void replayModRender_setupStereoscopicProjection(float partialTicks, long frameStartNano, MatrixStack matrixStack, CallbackInfo ci) { - if (replayModRender_getHandler() != null) { - if (replayModRender_getHandler().data == StereoscopicOpenGlFrameCapturer.Data.LEFT_EYE) { - matrixStack.translate(0.1, 0, 0); - } else if (replayModRender_getHandler().data == StereoscopicOpenGlFrameCapturer.Data.RIGHT_EYE) { - matrixStack.translate(-0.1, 0, 0); - } - } - } - //#else - //#if MC>=10800 - //$$ @Inject(method = "applyCameraTransformations", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/platform/GlStateManager;loadIdentity()V", shift = At.Shift.AFTER, ordinal = 1)) - //#else - //$$ @Inject(method = "setupCameraTransform", at = @At(value = "INVOKE", target = "Lorg/lwjgl/opengl/GL11;glLoadIdentity()V", shift = At.Shift.AFTER, ordinal = 1, remap = false)) - //#endif - //$$ private void replayModRender_setupStereoscopicModelView( - //$$ float partialTicks, - //#if MC<11400 - //$$ int renderPass, - //#endif - //$$ CallbackInfo ci - //$$ ) { - //$$ if (replayModRender_getHandler() != null) { - //$$ if (replayModRender_getHandler().data == StereoscopicOpenGlFrameCapturer.Data.LEFT_EYE) { - //$$ GL11.glTranslatef(0.1f, 0, 0); - //$$ } else if (replayModRender_getHandler().data == StereoscopicOpenGlFrameCapturer.Data.RIGHT_EYE) { - //$$ GL11.glTranslatef(-0.1f, 0, 0); - //$$ } - //$$ } - //$$ } - //#endif - - /* - * Cubic Renderer - */ - - //#if MC>=11400 - @Redirect(method = "method_22973", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/math/Matrix4f;viewboxMatrix(DFFF)Lnet/minecraft/util/math/Matrix4f;")) - private Matrix4f replayModRender_perspective$0(double fovY, float aspect, float zNear, float zFar) { - return replayModRender_perspective((float) fovY, aspect, zNear, zFar); - } - - //#if MC<11500 - //#if MC>=11400 - //$$ @Redirect(method = "renderCenter", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/util/math/Matrix4f;method_4929(DFFF)Lnet/minecraft/client/util/math/Matrix4f;")) - //#else - //$$ @Redirect(method = "updateCameraAndRender(FJ)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/Matrix4f;perspective(DFFF)Lnet/minecraft/client/renderer/Matrix4f;")) - //#endif - //$$ private Matrix4f replayModRender_perspective$1(double fovY, float aspect, float zNear, float zFar) { - //$$ return replayModRender_perspective((float) fovY, aspect, zNear, zFar); - //$$ } - //$$ - //$$ @Redirect(method = "renderAboveClouds", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/util/math/Matrix4f;method_4929(DFFF)Lnet/minecraft/client/util/math/Matrix4f;")) - //$$ private Matrix4f replayModRender_perspective$2(double fovY, float aspect, float zNear, float zFar) { - //$$ return replayModRender_perspective((float) fovY, aspect, zNear, zFar); - //$$ } - //#endif - - private Matrix4f replayModRender_perspective(float fovY, float aspect, float zNear, float zFar) { - if (replayModRender_getHandler() != null && replayModRender_getHandler().omnidirectional) { - fovY = 90; - aspect = 1; - } - return Matrix4f.viewboxMatrix(fovY, aspect, zNear, zFar); - } - //#else - //$$ @Redirect(method = "setupCameraTransform", at = @At(value = "INVOKE", target = "Lorg/lwjgl/util/glu/Project;gluPerspective(FFFF)V", remap = false)) - //$$ private void replayModRender_gluPerspective$0(float fovY, float aspect, float zNear, float zFar) { - //$$ replayModRender_gluPerspective(fovY, aspect, zNear, zFar); - //$$ } - //$$ - //#if MC>=10800 - //$$ @Redirect(method = "renderWorldPass", at = @At(value = "INVOKE", target = "Lorg/lwjgl/util/glu/Project;gluPerspective(FFFF)V", remap = false)) - //#else - //$$ @Redirect(method = "renderHand", at = @At(value = "INVOKE", target = "Lorg/lwjgl/util/glu/Project;gluPerspective(FFFF)V", remap = false)) - //#endif - //$$ private void replayModRender_gluPerspective$1(float fovY, float aspect, float zNear, float zFar) { - //$$ replayModRender_gluPerspective(fovY, aspect, zNear, zFar); - //$$ } - //$$ - //#if MC>=10800 - //$$ @Redirect(method = "renderCloudsCheck", at = @At(value = "INVOKE", target = "Lorg/lwjgl/util/glu/Project;gluPerspective(FFFF)V", remap = false)) - //$$ private void replayModRender_gluPerspective$2(float fovY, float aspect, float zNear, float zFar) { - //$$ replayModRender_gluPerspective(fovY, aspect, zNear, zFar); - //$$ } - //#endif - //$$ - //$$ private void replayModRender_gluPerspective(float fovY, float aspect, float zNear, float zFar) { - //$$ if (replayModRender_getHandler() != null && replayModRender_getHandler().omnidirectional) { - //$$ fovY = 90; - //$$ aspect = 1; - //$$ } - //$$ Project.gluPerspective(fovY, aspect, zNear, zFar); - //$$ } - //#endif } diff --git a/src/main/java/com/replaymod/render/mixin/Mixin_Omnidirectional_Camera.java b/src/main/java/com/replaymod/render/mixin/Mixin_Omnidirectional_Camera.java new file mode 100644 index 00000000..fb58ab87 --- /dev/null +++ b/src/main/java/com/replaymod/render/mixin/Mixin_Omnidirectional_Camera.java @@ -0,0 +1,24 @@ +package com.replaymod.render.mixin; + +import com.replaymod.render.hooks.EntityRendererHandler; +import net.minecraft.client.render.GameRenderer; +import net.minecraft.util.math.Matrix4f; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(GameRenderer.class) +public abstract class Mixin_Omnidirectional_Camera implements EntityRendererHandler.IEntityRenderer { + @Redirect(method = "method_22973", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/math/Matrix4f;viewboxMatrix(DFFF)Lnet/minecraft/util/math/Matrix4f;")) + private Matrix4f replayModRender_perspective$0(double fovY, float aspect, float zNear, float zFar) { + return replayModRender_perspective((float) fovY, aspect, zNear, zFar); + } + + private Matrix4f replayModRender_perspective(float fovY, float aspect, float zNear, float zFar) { + if (replayModRender_getHandler() != null && replayModRender_getHandler().omnidirectional) { + fovY = 90; + aspect = 1; + } + return Matrix4f.viewboxMatrix(fovY, aspect, zNear, zFar); + } +} diff --git a/src/main/java/com/replaymod/render/mixin/Mixin_Omnidirectional_SkipHand.java b/src/main/java/com/replaymod/render/mixin/Mixin_Omnidirectional_SkipHand.java new file mode 100644 index 00000000..939f6ec8 --- /dev/null +++ b/src/main/java/com/replaymod/render/mixin/Mixin_Omnidirectional_SkipHand.java @@ -0,0 +1,34 @@ +package com.replaymod.render.mixin; + +import com.replaymod.render.hooks.EntityRendererHandler; +import net.minecraft.client.render.Camera; +import net.minecraft.client.render.GameRenderer; +import net.minecraft.client.util.math.MatrixStack; +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(GameRenderer.class) +public abstract class Mixin_Omnidirectional_SkipHand implements EntityRendererHandler.IEntityRenderer { + @Inject(method = "renderHand", at = @At("HEAD"), cancellable = true) + private void replayModRender_renderSpectatorHand( + //#if MC>=11500 + MatrixStack matrixStack, + //#endif + //#if MC>=11400 + Camera camera, + //#endif + float partialTicks, + //#if MC<11400 + //$$ int renderPass, + //#endif + CallbackInfo ci + ) { + EntityRendererHandler handler = replayModRender_getHandler(); + if (handler != null && handler.omnidirectional) { + // No spectator hands during 360° view, we wouldn't even know where to put it + ci.cancel(); + } + } +} diff --git a/src/main/java/com/replaymod/render/mixin/Mixin_Stereoscopic_Camera.java b/src/main/java/com/replaymod/render/mixin/Mixin_Stereoscopic_Camera.java new file mode 100644 index 00000000..945ac107 --- /dev/null +++ b/src/main/java/com/replaymod/render/mixin/Mixin_Stereoscopic_Camera.java @@ -0,0 +1,42 @@ +package com.replaymod.render.mixin; + +import com.replaymod.render.capturer.StereoscopicOpenGlFrameCapturer; +import com.replaymod.render.hooks.EntityRendererHandler; +import net.minecraft.client.render.GameRenderer; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.util.math.Matrix4f; +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; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(GameRenderer.class) +public abstract class Mixin_Stereoscopic_Camera implements EntityRendererHandler.IEntityRenderer { + @Inject(method = "method_22973", at = @At("RETURN"), cancellable = true) + private void replayModRender_setupStereoscopicProjection(CallbackInfoReturnable ci) { + if (replayModRender_getHandler() != null) { + Matrix4f offset; + if (replayModRender_getHandler().data == StereoscopicOpenGlFrameCapturer.Data.LEFT_EYE) { + offset = Matrix4f.translate(0.07f, 0, 0); + } else if (replayModRender_getHandler().data == StereoscopicOpenGlFrameCapturer.Data.RIGHT_EYE) { + offset = Matrix4f.translate(-0.07f, 0, 0); + } else { + return; + } + offset.multiply(ci.getReturnValue()); + ci.setReturnValue(offset); + } + } + + @Inject(method = "renderWorld", at = @At("HEAD")) + private void replayModRender_setupStereoscopicProjection(float partialTicks, long frameStartNano, MatrixStack matrixStack, CallbackInfo ci) { + if (replayModRender_getHandler() != null) { + if (replayModRender_getHandler().data == StereoscopicOpenGlFrameCapturer.Data.LEFT_EYE) { + matrixStack.translate(0.1, 0, 0); + } else if (replayModRender_getHandler().data == StereoscopicOpenGlFrameCapturer.Data.RIGHT_EYE) { + matrixStack.translate(-0.1, 0, 0); + } + } + } +} diff --git a/src/main/java/com/replaymod/render/mixin/Mixin_Stereoscopic_HandRenderPass.java b/src/main/java/com/replaymod/render/mixin/Mixin_Stereoscopic_HandRenderPass.java new file mode 100644 index 00000000..c4facf6d --- /dev/null +++ b/src/main/java/com/replaymod/render/mixin/Mixin_Stereoscopic_HandRenderPass.java @@ -0,0 +1,10 @@ +package com.replaymod.render.mixin; + +import net.minecraft.client.render.GameRenderer; +import org.spongepowered.asm.mixin.Mixin; + +@Mixin(GameRenderer.class) +public abstract class Mixin_Stereoscopic_HandRenderPass { + // MC's builtin stereoscopic 3D feature was dropped + // 1.12.2 and before +} diff --git a/src/main/resources/mixins.render.replaymod.json b/src/main/resources/mixins.render.replaymod.json index 72c246e8..18efc908 100644 --- a/src/main/resources/mixins.render.replaymod.json +++ b/src/main/resources/mixins.render.replaymod.json @@ -9,7 +9,11 @@ "Mixin_ChromaKeyForceSky", "Mixin_CubicRotation", "Mixin_ForceChunkLoading", + "Mixin_Omnidirectional_Camera", + "Mixin_Omnidirectional_SkipHand", "Mixin_SkipBlockOutlinesDuringRender", + "Mixin_Stereoscopic_Camera", + "Mixin_Stereoscopic_HandRenderPass", //#if MC>=10800 //#if MC>=11500 "Mixin_BlockOnChunkRebuilds", diff --git a/versions/1.12.2/src/main/java/com/replaymod/render/mixin/Mixin_Omnidirectional_Camera.java b/versions/1.12.2/src/main/java/com/replaymod/render/mixin/Mixin_Omnidirectional_Camera.java new file mode 100644 index 00000000..9f7d56de --- /dev/null +++ b/versions/1.12.2/src/main/java/com/replaymod/render/mixin/Mixin_Omnidirectional_Camera.java @@ -0,0 +1,40 @@ +package com.replaymod.render.mixin; + +import com.replaymod.render.hooks.EntityRendererHandler; +import net.minecraft.client.renderer.EntityRenderer; +import org.lwjgl.util.glu.Project; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(EntityRenderer.class) +public abstract class Mixin_Omnidirectional_Camera implements EntityRendererHandler.IEntityRenderer { + @Redirect(method = "setupCameraTransform", at = @At(value = "INVOKE", target = "Lorg/lwjgl/util/glu/Project;gluPerspective(FFFF)V", remap = false)) + private void replayModRender_gluPerspective$0(float fovY, float aspect, float zNear, float zFar) { + replayModRender_gluPerspective(fovY, aspect, zNear, zFar); + } + + //#if MC>=10800 + @Redirect(method = "renderWorldPass", at = @At(value = "INVOKE", target = "Lorg/lwjgl/util/glu/Project;gluPerspective(FFFF)V", remap = false)) + //#else + //$$ @Redirect(method = "renderHand", at = @At(value = "INVOKE", target = "Lorg/lwjgl/util/glu/Project;gluPerspective(FFFF)V", remap = false)) + //#endif + private void replayModRender_gluPerspective$1(float fovY, float aspect, float zNear, float zFar) { + replayModRender_gluPerspective(fovY, aspect, zNear, zFar); + } + + //#if MC>=10800 + @Redirect(method = "renderCloudsCheck", at = @At(value = "INVOKE", target = "Lorg/lwjgl/util/glu/Project;gluPerspective(FFFF)V", remap = false)) + private void replayModRender_gluPerspective$2(float fovY, float aspect, float zNear, float zFar) { + replayModRender_gluPerspective(fovY, aspect, zNear, zFar); + } + //#endif + + private void replayModRender_gluPerspective(float fovY, float aspect, float zNear, float zFar) { + if (replayModRender_getHandler() != null && replayModRender_getHandler().omnidirectional) { + fovY = 90; + aspect = 1; + } + Project.gluPerspective(fovY, aspect, zNear, zFar); + } +} diff --git a/versions/1.12.2/src/main/java/com/replaymod/render/mixin/Mixin_Stereoscopic_HandRenderPass.java b/versions/1.12.2/src/main/java/com/replaymod/render/mixin/Mixin_Stereoscopic_HandRenderPass.java new file mode 100644 index 00000000..5cf178a5 --- /dev/null +++ b/versions/1.12.2/src/main/java/com/replaymod/render/mixin/Mixin_Stereoscopic_HandRenderPass.java @@ -0,0 +1,29 @@ +package com.replaymod.render.mixin; + +import com.replaymod.render.capturer.StereoscopicOpenGlFrameCapturer; +import com.replaymod.render.hooks.EntityRendererHandler; +import com.replaymod.replay.camera.CameraEntity; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.EntityRenderer; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyVariable; + +@Mixin(EntityRenderer.class) +public abstract class Mixin_Stereoscopic_HandRenderPass implements EntityRendererHandler.IEntityRenderer { + @ModifyVariable(method = "renderHand", at = @At("HEAD"), argsOnly = true) + private int replayModRender_renderSpectatorHand(int renderPass) { + EntityRendererHandler handler = replayModRender_getHandler(); + if (handler != null) { + Entity currentEntity = Minecraft.getMinecraft().getRenderViewEntity(); + if (currentEntity instanceof EntityPlayer && !(currentEntity instanceof CameraEntity)) { + if (renderPass == 2) { // Need to update render pass + renderPass = handler.data == StereoscopicOpenGlFrameCapturer.Data.LEFT_EYE ? 1 : 0; + } + } + } + return renderPass; + } +} diff --git a/versions/1.14.4/src/main/java/com/replaymod/render/mixin/Mixin_Omnidirectional_Camera.java b/versions/1.14.4/src/main/java/com/replaymod/render/mixin/Mixin_Omnidirectional_Camera.java new file mode 100644 index 00000000..6a0dd1e4 --- /dev/null +++ b/versions/1.14.4/src/main/java/com/replaymod/render/mixin/Mixin_Omnidirectional_Camera.java @@ -0,0 +1,34 @@ +package com.replaymod.render.mixin; + +import com.replaymod.render.hooks.EntityRendererHandler; +import net.minecraft.client.render.GameRenderer; +import net.minecraft.client.util.math.Matrix4f; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(GameRenderer.class) +public abstract class Mixin_Omnidirectional_Camera implements EntityRendererHandler.IEntityRenderer { + @Redirect(method = "applyCameraTransformations", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/util/math/Matrix4f;method_4929(DFFF)Lnet/minecraft/client/util/math/Matrix4f;")) + private Matrix4f replayModRender_perspective$0(double fovY, float aspect, float zNear, float zFar) { + return replayModRender_perspective((float) fovY, aspect, zNear, zFar); + } + + @Redirect(method = "renderCenter", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/util/math/Matrix4f;method_4929(DFFF)Lnet/minecraft/client/util/math/Matrix4f;")) + private Matrix4f replayModRender_perspective$1(double fovY, float aspect, float zNear, float zFar) { + return replayModRender_perspective((float) fovY, aspect, zNear, zFar); + } + + @Redirect(method = "renderAboveClouds", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/util/math/Matrix4f;method_4929(DFFF)Lnet/minecraft/client/util/math/Matrix4f;")) + private Matrix4f replayModRender_perspective$2(double fovY, float aspect, float zNear, float zFar) { + return replayModRender_perspective((float) fovY, aspect, zNear, zFar); + } + + private Matrix4f replayModRender_perspective(float fovY, float aspect, float zNear, float zFar) { + if (replayModRender_getHandler() != null && replayModRender_getHandler().omnidirectional) { + fovY = 90; + aspect = 1; + } + return Matrix4f.method_4929(fovY, aspect, zNear, zFar); + } +} diff --git a/versions/1.14.4/src/main/java/com/replaymod/render/mixin/Mixin_Stereoscopic_Camera.java b/versions/1.14.4/src/main/java/com/replaymod/render/mixin/Mixin_Stereoscopic_Camera.java new file mode 100644 index 00000000..400e80e7 --- /dev/null +++ b/versions/1.14.4/src/main/java/com/replaymod/render/mixin/Mixin_Stereoscopic_Camera.java @@ -0,0 +1,43 @@ +package com.replaymod.render.mixin; + +import com.replaymod.render.capturer.StereoscopicOpenGlFrameCapturer; +import com.replaymod.render.hooks.EntityRendererHandler; +import net.minecraft.client.render.GameRenderer; +import org.lwjgl.opengl.GL11; +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(GameRenderer.class) +public abstract class Mixin_Stereoscopic_Camera implements EntityRendererHandler.IEntityRenderer { + //#if MC>=10800 + @Inject(method = "applyCameraTransformations", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/platform/GlStateManager;loadIdentity()V", shift = At.Shift.AFTER, ordinal = 0)) + //#else + //$$ @Inject(method = "setupCameraTransform", at = @At(value = "INVOKE", target = "Lorg/lwjgl/opengl/GL11;glLoadIdentity()V", shift = At.Shift.AFTER, ordinal = 0, remap = false)) + //#endif + private void replayModRender_setupStereoscopicProjection(CallbackInfo ci) { + if (replayModRender_getHandler() != null) { + if (replayModRender_getHandler().data == StereoscopicOpenGlFrameCapturer.Data.LEFT_EYE) { + GL11.glTranslatef(0.07f, 0, 0); + } else if (replayModRender_getHandler().data == StereoscopicOpenGlFrameCapturer.Data.RIGHT_EYE) { + GL11.glTranslatef(-0.07f, 0, 0); + } + } + } + + //#if MC>=10800 + @Inject(method = "applyCameraTransformations", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/platform/GlStateManager;loadIdentity()V", shift = At.Shift.AFTER, ordinal = 1)) + //#else + //$$ @Inject(method = "setupCameraTransform", at = @At(value = "INVOKE", target = "Lorg/lwjgl/opengl/GL11;glLoadIdentity()V", shift = At.Shift.AFTER, ordinal = 1, remap = false)) + //#endif + private void replayModRender_setupStereoscopicModelView(CallbackInfo ci) { + if (replayModRender_getHandler() != null) { + if (replayModRender_getHandler().data == StereoscopicOpenGlFrameCapturer.Data.LEFT_EYE) { + GL11.glTranslatef(0.1f, 0, 0); + } else if (replayModRender_getHandler().data == StereoscopicOpenGlFrameCapturer.Data.RIGHT_EYE) { + GL11.glTranslatef(-0.1f, 0, 0); + } + } + } +}