From 49d49d47e33da0a06de5487c2ef19fdc72825353 Mon Sep 17 00:00:00 2001 From: Bob Date: Fri, 6 Sep 2024 22:11:53 +0200 Subject: [PATCH] this commit has a working faux first person item renderer --- .../com/hbm/main/ModEventHandlerRenderer.java | 13 +- .../weapon/sedna/ItemRenderWeaponBase.java | 151 +++++++++++++++--- src/main/resources/META-INF/HBM_at.cfg | 3 + 3 files changed, 135 insertions(+), 32 deletions(-) diff --git a/src/main/java/com/hbm/main/ModEventHandlerRenderer.java b/src/main/java/com/hbm/main/ModEventHandlerRenderer.java index 9cb14eac5..693c8e20c 100644 --- a/src/main/java/com/hbm/main/ModEventHandlerRenderer.java +++ b/src/main/java/com/hbm/main/ModEventHandlerRenderer.java @@ -8,7 +8,6 @@ import com.hbm.config.RadiationConfig; import com.hbm.handler.pollution.PollutionHandler.PollutionType; import com.hbm.items.armor.IArmorDisableModel; import com.hbm.items.armor.IArmorDisableModel.EnumPlayerPart; -import com.hbm.items.weapon.sedna.ItemGunBase; import com.hbm.packet.PermaSyncHandler; import com.hbm.render.item.weapon.sedna.ItemRenderWeaponBase; import com.hbm.render.model.ModelMan; @@ -418,16 +417,14 @@ public class ModEventHandlerRenderer { @SubscribeEvent public void onRenderHand(RenderHandEvent event) { - EntityPlayer player = Minecraft.getMinecraft().thePlayer; - ItemStack held = player.getHeldItem(); + //can't use plaxer.getHeldItem() here because the item rendering persists for a few frames after hitting the switch key + ItemStack toRender = Minecraft.getMinecraft().entityRenderer.itemRenderer.itemToRender; - if(held != null) { - IItemRenderer renderer = MinecraftForgeClient.getItemRenderer(held, ItemRenderType.EQUIPPED_FIRST_PERSON); + if(toRender != null) { + IItemRenderer renderer = MinecraftForgeClient.getItemRenderer(toRender, ItemRenderType.EQUIPPED_FIRST_PERSON); if(renderer instanceof ItemRenderWeaponBase) { - renderer.renderItem(ItemRenderType.FIRST_PERSON_MAP, held, null /*RenderBlocks*/, player); - //Minecraft.getMinecraft().entityRenderer.itemRenderer.renderItemInFirstPerson(event.partialTicks); - + ((ItemRenderWeaponBase) renderer).setPerspectiveAndRender(toRender, event.partialTicks); event.setCanceled(true); } } diff --git a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderWeaponBase.java b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderWeaponBase.java index 20f044464..66f862e0f 100644 --- a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderWeaponBase.java +++ b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderWeaponBase.java @@ -1,13 +1,27 @@ package com.hbm.render.item.weapon.sedna; import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; import org.lwjgl.util.glu.Project; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; import net.minecraft.client.Minecraft; +import net.minecraft.client.entity.EntityPlayerSP; +import net.minecraft.client.renderer.ActiveRenderInfo; +import net.minecraft.client.renderer.EntityRenderer; +import net.minecraft.client.renderer.OpenGlHelper; +import net.minecraft.client.renderer.RenderHelper; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.EnumAction; import net.minecraft.item.ItemStack; +import net.minecraft.util.MathHelper; import net.minecraftforge.client.IItemRenderer; public abstract class ItemRenderWeaponBase implements IItemRenderer { + + public static float interp; @Override public boolean handleRenderType(ItemStack item, ItemRenderType type) { @@ -31,49 +45,138 @@ public abstract class ItemRenderWeaponBase implements IItemRenderer { } GL11.glPopMatrix(); } + + public void setPerspectiveAndRender(ItemStack stack, float interp) { + + this.interp = interp; + + Minecraft mc = Minecraft.getMinecraft(); + EntityRenderer entityRenderer = mc.entityRenderer; + float farPlaneDistance = mc.gameSettings.renderDistanceChunks * 16; + + GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT); + GL11.glMatrixMode(GL11.GL_PROJECTION); + GL11.glLoadIdentity(); + + Project.gluPerspective(this.getFOVModifier(interp, false), (float) mc.displayWidth / (float) mc.displayHeight, 0.05F, farPlaneDistance * 2.0F); + + GL11.glMatrixMode(GL11.GL_MODELVIEW); + GL11.glLoadIdentity(); + + GL11.glPushMatrix(); + + if(mc.gameSettings.thirdPersonView == 0 && !mc.renderViewEntity.isPlayerSleeping() && !mc.gameSettings.hideGUI && !mc.playerController.enableEverythingIsScrewedUpMode()) { + entityRenderer.enableLightmap(interp); + this.setupTransformsAndRender(stack); + entityRenderer.disableLightmap(interp); + } + + GL11.glPopMatrix(); + + if(mc.gameSettings.thirdPersonView == 0 && !mc.renderViewEntity.isPlayerSleeping()) { + entityRenderer.itemRenderer.renderOverlays(interp); + } + } + + private float getFOVModifier(float interp, boolean useFOVSetting) { + + Minecraft mc = Minecraft.getMinecraft(); + EntityLivingBase entityplayer = (EntityLivingBase) mc.renderViewEntity; + float fov = 70.0F; + + if(useFOVSetting) fov = mc.gameSettings.fovSetting; + + if(entityplayer.getHealth() <= 0.0F) { + float f2 = (float) entityplayer.deathTime + interp; + fov /= (1.0F - 500.0F / (f2 + 500.0F)) * 2.0F + 1.0F; + } + + Block block = ActiveRenderInfo.getBlockAtEntityViewpoint(mc.theWorld, entityplayer, interp); + if(block.getMaterial() == Material.water) fov = fov * 60.0F / 70.0F; + + return fov; + } - public void setupFirstPerson(ItemStack stack) { - GL11.glMatrixMode(GL11.GL_PROJECTION); - GL11.glLoadIdentity(); - float f1 = 0.07F; - Minecraft mc = Minecraft.getMinecraft(); - float farPlaneDistance = mc.gameSettings.renderDistanceChunks * 16; - float interp = 0; + protected void setupTransformsAndRender(ItemStack itemstack) { + Minecraft mc = Minecraft.getMinecraft(); + EntityPlayer player = mc.thePlayer; - Project.gluPerspective(1, (float)mc.displayWidth / (float)mc.displayHeight, 0.05F, farPlaneDistance * 2.0F); + float pitch = player.prevRotationPitch + (player.rotationPitch - player.prevRotationPitch) * interp; + GL11.glPushMatrix(); + GL11.glRotatef(pitch, 1.0F, 0.0F, 0.0F); + GL11.glRotatef(player.prevRotationYaw + (player.rotationYaw - player.prevRotationYaw) * interp, 0.0F, 1.0F, 0.0F); + RenderHelper.enableStandardItemLighting(); + GL11.glPopMatrix(); + EntityPlayerSP entityplayersp = (EntityPlayerSP) player; + float armPitch = entityplayersp.prevRenderArmPitch + (entityplayersp.renderArmPitch - entityplayersp.prevRenderArmPitch) * interp; + float armYaw = entityplayersp.prevRenderArmYaw + (entityplayersp.renderArmYaw - entityplayersp.prevRenderArmYaw) * interp; + GL11.glRotatef((player.rotationPitch - armPitch) * 0.1F, 1.0F, 0.0F, 0.0F); + GL11.glRotatef((player.rotationYaw - armYaw) * 0.1F, 0.0F, 1.0F, 0.0F); + int i = mc.theWorld.getLightBrightnessForSkyBlocks(MathHelper.floor_double(player.posX), MathHelper.floor_double(player.posY), MathHelper.floor_double(player.posZ), 0); + int j = i % 65536; + int k = i / 65536; + OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, (float) j / 1.0F, (float) k / 1.0F); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - GL11.glMatrixMode(GL11.GL_MODELVIEW); - GL11.glLoadIdentity(); + if(itemstack != null) { + int l = itemstack.getItem().getColorFromItemStack(itemstack, 0); + float r = (float) (l >> 16 & 255) / 255.0F; + float g = (float) (l >> 8 & 255) / 255.0F; + float b = (float) (l & 255) / 255.0F; + GL11.glColor4f(r, g, b, 1.0F); + } - GL11.glPushMatrix(); - //this.hurtCameraEffect(interp); + float f8; + float f13; - if (mc.gameSettings.thirdPersonView == 0 && !mc.renderViewEntity.isPlayerSleeping() && !mc.gameSettings.hideGUI && !mc.playerController.enableEverythingIsScrewedUpMode()) - { - //this.enableLightmap((double)p_78476_1_); - this.renderItem(ItemRenderType.EQUIPPED_FIRST_PERSON, stack, null, mc.thePlayer); - //this.disableLightmap((double)p_78476_1_); - } + GL11.glPushMatrix(); + + f13 = 0.8F; - GL11.glPopMatrix(); - + float swing = player.getSwingProgress(interp); + float swingZ = MathHelper.sin(swing * (float) Math.PI); + float swingX = MathHelper.sin(MathHelper.sqrt_float(swing) * (float) Math.PI); + GL11.glTranslatef(-swingX * 0.4F, MathHelper.sin(MathHelper.sqrt_float(swing) * (float) Math.PI * 2.0F) * 0.2F, -swingZ * 0.2F); + + GL11.glTranslatef(0.7F * f13, -0.65F * f13 - (1.0F - 1/* raiseprogress */) * 0.6F, -0.9F * f13); + GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + float swingYaw = MathHelper.sin(swing * swing * (float) Math.PI); + float swingPitchRoll = MathHelper.sin(MathHelper.sqrt_float(swing) * (float) Math.PI); + GL11.glRotatef(-swingYaw * 20.0F, 0.0F, 1.0F, 0.0F); + GL11.glRotatef(-swingPitchRoll * 20.0F, 0.0F, 0.0F, 1.0F); + GL11.glRotatef(-swingPitchRoll * 80.0F, 1.0F, 0.0F, 0.0F); + + f8 = 0.4F; + GL11.glScalef(f8, f8, f8); + + this.renderItem(ItemRenderType.EQUIPPED_FIRST_PERSON, itemstack, null, player); + + GL11.glPopMatrix(); + + GL11.glDisable(GL12.GL_RESCALE_NORMAL); + RenderHelper.disableStandardItemLighting(); + } + + protected void setupFirstPerson(ItemStack stack) { //GL11.glRotated(90, 0, 1, 0); //GL11.glRotated(40, -1, 0, 0); } - public void setupThirdPerson(ItemStack stack) { - + protected void setupThirdPerson(ItemStack stack) { + double scale = 0.125D; + GL11.glScaled(scale, scale, scale); } - public void setupInv(ItemStack stack) { + protected void setupInv(ItemStack stack) { GL11.glScaled(1, 1, -1); GL11.glTranslated(8, 8, 0); GL11.glRotated(225, 0, 0, 1); GL11.glRotated(90, 0, 1, 0); } - public void setupEntity(ItemStack stack) { + protected void setupEntity(ItemStack stack) { } diff --git a/src/main/resources/META-INF/HBM_at.cfg b/src/main/resources/META-INF/HBM_at.cfg index 09bf2e8c3..c84644c46 100644 --- a/src/main/resources/META-INF/HBM_at.cfg +++ b/src/main/resources/META-INF/HBM_at.cfg @@ -34,3 +34,6 @@ public net.minecraft.world.gen.ChunkProviderFlat field_82702_h # ha # ChunkProviderServer public net.minecraft.world.gen.ChunkProviderServer field_73248_b # chunksToUnload + +# ItemRenderer +public net.minecraft.client.renderer.ItemRenderer.field_78453_b # itemToRender \ No newline at end of file