From 779d0841d6b11a88431478fcaf9a1651a3f9182c Mon Sep 17 00:00:00 2001 From: johni0702 Date: Sun, 31 May 2015 17:24:37 +0200 Subject: [PATCH] Properly render spectator hand in all custom rendering modes Fix hand clipping with nearby blocks Immediately show hand/item if a different player is spectated --- .../replaymod/renderer/SpectatorRenderer.java | 23 ++++++++++++++++++- .../video/entity/CubicEntityRenderer.java | 5 ++++ .../video/entity/CustomEntityRenderer.java | 18 ++++++++++++--- .../entity/StereoscopicEntityRenderer.java | 13 +++++++++++ 4 files changed, 55 insertions(+), 4 deletions(-) diff --git a/src/main/java/eu/crushedpixel/replaymod/renderer/SpectatorRenderer.java b/src/main/java/eu/crushedpixel/replaymod/renderer/SpectatorRenderer.java index f4e3164e..44e14bfa 100644 --- a/src/main/java/eu/crushedpixel/replaymod/renderer/SpectatorRenderer.java +++ b/src/main/java/eu/crushedpixel/replaymod/renderer/SpectatorRenderer.java @@ -29,6 +29,7 @@ import org.lwjgl.util.glu.Project; public class SpectatorRenderer { private final Minecraft mc = Minecraft.getMinecraft(); + private EntityPlayer currentPlayer; private EntityPlayer getSpectatedPlayer() { Entity current = ReplayHandler.getCurrentEntity(); @@ -36,7 +37,16 @@ public class SpectatorRenderer { return (EntityPlayer)current; } + protected void gluPerspective(float fovY, float aspect, float zNear, float zFar) { + Project.gluPerspective(fovY, aspect, zNear, zFar); + } + public void renderSpectatorHand(EntityPlayer entityPlayer, float partialTicks, int renderPass) { + if (entityPlayer != currentPlayer) { + updateNow(entityPlayer); + } + + GlStateManager.clear(GL11.GL_DEPTH_BUFFER_BIT); GlStateManager.matrixMode(GL11.GL_PROJECTION); GlStateManager.loadIdentity(); @@ -47,7 +57,7 @@ public class SpectatorRenderer { GlStateManager.translate((float)(-(renderPass * 2 - 1)) * f1, 0.0F, 0.0F); } - Project.gluPerspective(mc.entityRenderer.getFOVModifier(partialTicks, false), + gluPerspective(mc.entityRenderer.getFOVModifier(partialTicks, false), (float) this.mc.displayWidth / (float) this.mc.displayHeight, 0.05F, mc.entityRenderer.farPlaneDistance * 2.0F); GlStateManager.matrixMode(GL11.GL_MODELVIEW); @@ -441,6 +451,17 @@ public class SpectatorRenderer { mc.entityRenderer.itemRenderer.equippedItemSlot = player.inventory.currentItem; } } + + public void updateNow(EntityPlayer player) { + this.currentPlayer = player; + + prevEquippedProgress = equippedProgress = 1; + itemToRender = player.inventory.getCurrentItem(); + mc.entityRenderer.itemRenderer.equippedItemSlot = player.inventory.currentItem; + + renderArmYaw = prevRenderArmYaw = player.rotationYaw; + renderArmPitch = prevRenderArmPitch = player.rotationPitch; + } /** * The GUI Overlays (Fire, Water) diff --git a/src/main/java/eu/crushedpixel/replaymod/video/entity/CubicEntityRenderer.java b/src/main/java/eu/crushedpixel/replaymod/video/entity/CubicEntityRenderer.java index f9fe24df..43284826 100644 --- a/src/main/java/eu/crushedpixel/replaymod/video/entity/CubicEntityRenderer.java +++ b/src/main/java/eu/crushedpixel/replaymod/video/entity/CubicEntityRenderer.java @@ -106,4 +106,9 @@ public class CubicEntityRenderer extends CustomEntityRenderer { GlStateManager.translate(0.0F, 0.0F, 0.1F); super.orientCamera(partialTicks); } + + @Override + protected void renderSpectatorHand(float partialTicks, int renderPass) { + // No spectator hands during 360° view + } } diff --git a/src/main/java/eu/crushedpixel/replaymod/video/entity/CustomEntityRenderer.java b/src/main/java/eu/crushedpixel/replaymod/video/entity/CustomEntityRenderer.java index fa54086b..6ca7ada8 100644 --- a/src/main/java/eu/crushedpixel/replaymod/video/entity/CustomEntityRenderer.java +++ b/src/main/java/eu/crushedpixel/replaymod/video/entity/CustomEntityRenderer.java @@ -1,6 +1,6 @@ package eu.crushedpixel.replaymod.video.entity; -import eu.crushedpixel.replaymod.ReplayMod; +import eu.crushedpixel.replaymod.renderer.SpectatorRenderer; import eu.crushedpixel.replaymod.replay.ReplayHandler; import net.minecraft.client.Minecraft; import net.minecraft.client.particle.EffectRenderer; @@ -21,6 +21,12 @@ import static org.lwjgl.opengl.GL11.*; public abstract class CustomEntityRenderer { protected final Minecraft mc = Minecraft.getMinecraft(); protected final EntityRenderer proxied = mc.entityRenderer; + protected final SpectatorRenderer spectatorRenderer = new SpectatorRenderer(){ + @Override + protected void gluPerspective(float fovY, float aspect, float zNear, float zFar) { + CustomEntityRenderer.this.gluPerspective(fovY, aspect, zNear, zFar); + } + }; protected int frameCount; protected void gluPerspective(float fovY, float aspect, float zNear, float zFar) { @@ -176,8 +182,14 @@ public abstract class CustomEntityRenderer { net.minecraftforge.client.ForgeHooksClient.dispatchRenderLast(renderglobal, partialTicks); - if(!ReplayHandler.isCamera() && ReplayHandler.getCurrentEntity() instanceof EntityPlayer) - ReplayMod.spectatorRenderer.renderSpectatorHand((EntityPlayer)ReplayHandler.getCurrentEntity(), partialTicks, renderPass); + renderSpectatorHand(partialTicks, renderPass); + } + + protected void renderSpectatorHand(float partialTicks, int renderPass) { + Entity currentEntity = ReplayHandler.getCurrentEntity(); + if(!ReplayHandler.isCamera() && currentEntity instanceof EntityPlayer) { + spectatorRenderer.renderSpectatorHand((EntityPlayer) currentEntity, partialTicks, renderPass); + } } protected void setupCameraTransform(float partialTicks) { diff --git a/src/main/java/eu/crushedpixel/replaymod/video/entity/StereoscopicEntityRenderer.java b/src/main/java/eu/crushedpixel/replaymod/video/entity/StereoscopicEntityRenderer.java index b984de46..d76e495a 100644 --- a/src/main/java/eu/crushedpixel/replaymod/video/entity/StereoscopicEntityRenderer.java +++ b/src/main/java/eu/crushedpixel/replaymod/video/entity/StereoscopicEntityRenderer.java @@ -16,6 +16,14 @@ public class StereoscopicEntityRenderer extends CustomEntityRenderer { this.leftEye = leftEye; } + @Override + public void updateCameraAndRender(float renderPartialTicks) { + boolean wasAnaglyph = mc.gameSettings.anaglyph; + mc.gameSettings.anaglyph = true; + super.updateCameraAndRender(renderPartialTicks); + mc.gameSettings.anaglyph = wasAnaglyph; + } + protected void translateStereoscopic() { GlStateManager.translate(leftEye ? 0.07 : -0.07, 0, 0); } @@ -36,4 +44,9 @@ public class StereoscopicEntityRenderer extends CustomEntityRenderer { orientCamera(partialTicks); } + + @Override + protected void renderSpectatorHand(float partialTicks, int renderPass) { + super.renderSpectatorHand(partialTicks, leftEye ? 1 : 0); + } }