From 4707569443ade4a324ecbb7c9f8d2e04f2a09e41 Mon Sep 17 00:00:00 2001 From: Alexdoru <57050655+Alexdoru@users.noreply.github.com> Date: Fri, 11 Oct 2024 11:22:34 +0200 Subject: [PATCH] Fix drawer item render in perspective (#37) --- .../client/renderer/GLUtil.java | 60 ---------- .../renderer/TileEntityDrawersRenderer.java | 107 ++++++++---------- .../integration/Thaumcraft.java | 19 ++-- 3 files changed, 57 insertions(+), 129 deletions(-) delete mode 100644 src/main/java/com/jaquadro/minecraft/storagedrawers/client/renderer/GLUtil.java diff --git a/src/main/java/com/jaquadro/minecraft/storagedrawers/client/renderer/GLUtil.java b/src/main/java/com/jaquadro/minecraft/storagedrawers/client/renderer/GLUtil.java deleted file mode 100644 index 1cce2d2..0000000 --- a/src/main/java/com/jaquadro/minecraft/storagedrawers/client/renderer/GLUtil.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.jaquadro.minecraft.storagedrawers.client.renderer; - -import java.util.ArrayList; -import java.util.List; - -import org.lwjgl.opengl.GL11; - -public final class GLUtil { - - private GLUtil() {} - - public static List makeGLState() { - return new ArrayList(8); - } - - public static List makeGLState(int[] saveList) { - List state = new ArrayList(saveList.length); - - for (int i = 0, n = saveList.length; i < n; i++) state.add(new int[] { 0, 0 }); - - return state; - } - - public static List saveGLState(int[] saveList) { - List state = makeGLState(saveList); - saveGLStateCore(state, saveList); - - return state; - } - - public static void saveGLState(List state, int[] saveList) { - if (state == null || saveList == null) return; - - for (int i = state.size(), n = saveList.length; i < n; i++) state.add(new int[2]); - - for (int i = 0, n = state.size(); i < n; i++) state.get(i)[0] = 0; - - saveGLStateCore(state, saveList); - } - - private static void saveGLStateCore(List state, int[] saveList) { - for (int i = 0, n = saveList.length; i < n; i++) { - int[] entry = state.get(i); - entry[0] = saveList[i]; - entry[1] = GL11.glIsEnabled(entry[0]) ? 1 : 0; - } - } - - public static void restoreGLState(List state) { - if (state == null) return; - - for (int i = 0, n = state.size(); i < n; i++) { - int[] entry = state.get(i); - if (entry[0] == 0) break; - - if (entry[1] == 0) GL11.glDisable(entry[0]); - else GL11.glEnable(entry[0]); - } - } -} diff --git a/src/main/java/com/jaquadro/minecraft/storagedrawers/client/renderer/TileEntityDrawersRenderer.java b/src/main/java/com/jaquadro/minecraft/storagedrawers/client/renderer/TileEntityDrawersRenderer.java index fd9086f..52c8f14 100644 --- a/src/main/java/com/jaquadro/minecraft/storagedrawers/client/renderer/TileEntityDrawersRenderer.java +++ b/src/main/java/com/jaquadro/minecraft/storagedrawers/client/renderer/TileEntityDrawersRenderer.java @@ -1,11 +1,9 @@ package com.jaquadro.minecraft.storagedrawers.client.renderer; -import java.util.ArrayList; import java.util.List; import net.minecraft.block.Block; import net.minecraft.client.Minecraft; -import net.minecraft.client.entity.EntityClientPlayerMP; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.renderer.OpenGlHelper; import net.minecraft.client.renderer.RenderBlocks; @@ -23,7 +21,6 @@ import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.IIcon; import net.minecraft.util.ResourceLocation; -import net.minecraft.util.Vec3; import net.minecraftforge.client.ForgeHooksClient; import net.minecraftforge.common.util.ForgeDirection; @@ -46,13 +43,9 @@ public class TileEntityDrawersRenderer extends TileEntitySpecialRenderer { private static final ResourceLocation RES_ITEM_GLINT = new ResourceLocation( "textures/misc/enchanted_item_glint.png"); - private Vec3[] dirVectors = { Vec3.createVectorHelper(0, -1, 0), Vec3.createVectorHelper(0, 1, 0), - Vec3.createVectorHelper(0, 0, -1), Vec3.createVectorHelper(0, 0, 1), Vec3.createVectorHelper(-1, 0, 0), - Vec3.createVectorHelper(1, 0, 0) }; + private final RenderItem itemRenderer = new RenderItem() { - private RenderItem itemRenderer = new RenderItem() { - - private RenderBlocks renderBlocksRi = new RenderBlocks(); + private final RenderBlocks renderBlocksRi = new RenderBlocks(); @Override public byte getMiniBlockCount(ItemStack stack, byte original) { @@ -211,55 +204,34 @@ public class TileEntityDrawersRenderer extends TileEntitySpecialRenderer { } }; - private float itemOffset1X[] = new float[] { .5f }; - private float itemOffset1Y[] = new float[] { 8.25f }; + private final float[] itemOffset2X = new float[] { .5f, .5f }; + private final float[] itemOffset2Y = new float[] { 10.25f, 2.25f }; - private float itemOffset2X[] = new float[] { .5f, .5f }; - private float itemOffset2Y[] = new float[] { 10.25f, 2.25f }; + private final float[] itemOffset4X = new float[] { .25f, .25f, .75f, .75f }; + private final float[] itemOffset4Y = new float[] { 10.25f, 2.25f, 10.25f, 2.25f }; - private float itemOffset4X[] = new float[] { .25f, .25f, .75f, .75f }; - private float itemOffset4Y[] = new float[] { 10.25f, 2.25f, 10.25f, 2.25f }; + private final float[] itemOffset3X = new float[] { .5f, .25f, .75f }; + private final float[] itemOffset3Y = new float[] { 9.75f, 2.25f, 2.25f }; - private float itemOffset3X[] = new float[] { .5f, .25f, .75f }; - private float itemOffset3Y[] = new float[] { 9.75f, 2.25f, 2.25f }; - - private RenderBlocks renderBlocks = new RenderBlocks(); + private final RenderBlocks renderBlocks = new RenderBlocks(); private float brightness; - private static final float unit = .0625f; - - private static int[] glStateRender = { GL11.GL_LIGHTING, GL11.GL_BLEND }; - private List savedGLStateRender = GLUtil.makeGLState(glStateRender); - - private static int[] glStateItemRender = { GL11.GL_LIGHTING, GL11.GL_ALPHA_TEST, GL11.GL_BLEND }; - private List savedGLStateItemRender = GLUtil.makeGLState(glStateItemRender); - - private static int[] glLightRender = { GL11.GL_LIGHT0, GL11.GL_LIGHT1, GL11.GL_COLOR_MATERIAL, - GL12.GL_RESCALE_NORMAL }; - private List savedGLLightRender = GLUtil.makeGLState(glLightRender); - - private List preLabelRenderHandlers = new ArrayList(); + private static final float unit = 0.0625f; @Override public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float partialTickTime) { TileEntityDrawers tileDrawers = (TileEntityDrawers) tile; if (tileDrawers == null) return; - if (tileDrawers.isShrouded() || tileDrawers.isSealed()) return; - // Don't bother rendering anything that is (probably) facing away from the player. - EntityClientPlayerMP player = Minecraft.getMinecraft().thePlayer; - Vec3 faceVector = dirVectors[tileDrawers.getDirection()]; - float lookProduct = (float) player.getLook(partialTickTime).dotProduct(faceVector); - - if (lookProduct > .75f) return; - float depth; - Block block = tile.getWorldObj().getBlock(tile.xCoord, tile.yCoord, tile.zCoord); - if (block instanceof BlockDrawers) depth = ((BlockDrawers) block).halfDepth ? .5f : 1; - else return; + if (block instanceof BlockDrawers) { + depth = ((BlockDrawers) block).halfDepth ? .5f : 1; + } else { + return; + } GL11.glPushMatrix(); GL11.glTranslated(x, y, z); @@ -286,9 +258,11 @@ public class TileEntityDrawersRenderer extends TileEntitySpecialRenderer { mc.gameSettings.fancyGraphics = true; try { - if (StorageDrawers.config.isFancyItemRenderEnabled()) - renderFancyItemSet(tileDrawers, side, depth, partialTickTime); - else renderFastItemSet(tileDrawers, side, depth, partialTickTime); + if (StorageDrawers.config.isFancyItemRenderEnabled()) { + renderFancyItemSet(tileDrawers, side, depth); + } else { + renderFastItemSet(tileDrawers, side, depth, partialTickTime); + } } catch (Exception e) { // Swallow exception } @@ -298,8 +272,10 @@ public class TileEntityDrawersRenderer extends TileEntitySpecialRenderer { GL11.glPopMatrix(); } - private void renderFancyItemSet(TileEntityDrawers tile, ForgeDirection side, float depth, float partialTickTime) { + private void renderFancyItemSet(TileEntityDrawers tile, ForgeDirection side, float depth) { boolean restoreGLState = false; + boolean isLightingEnabled = false; + boolean isBlendEnabled = false; int drawerCount = tile.getDrawerCount(); for (int i = 0; i < drawerCount; i++) { @@ -311,17 +287,23 @@ public class TileEntityDrawersRenderer extends TileEntitySpecialRenderer { if (!restoreGLState) { restoreGLState = true; - GLUtil.saveGLState(savedGLStateRender, glStateRender); + isLightingEnabled = GL11.glIsEnabled(GL11.GL_LIGHTING); + isBlendEnabled = GL11.glIsEnabled(GL11.GL_BLEND); } - renderFancyItem(itemStack, tile, i, side, depth, partialTickTime); + renderFancyItem(itemStack, tile, i, side, depth); } - if (restoreGLState) GLUtil.restoreGLState(savedGLStateRender); + if (restoreGLState) { + if (isLightingEnabled) GL11.glEnable(GL11.GL_LIGHTING); + else GL11.glDisable(GL11.GL_LIGHTING); + if (isBlendEnabled) GL11.glEnable(GL11.GL_BLEND); + else GL11.glDisable(GL11.GL_BLEND); + } } - private boolean[] renderAsBlock = new boolean[4]; - private ItemStack[] renderStacks = new ItemStack[4]; + private final boolean[] renderAsBlock = new boolean[4]; + private final ItemStack[] renderStacks = new ItemStack[4]; private void renderFastItemSet(TileEntityDrawers tile, ForgeDirection side, float depth, float partialTickTime) { int drawerCount = tile.getDrawerCount(); @@ -339,8 +321,11 @@ public class TileEntityDrawersRenderer extends TileEntitySpecialRenderer { renderStacks[i] = itemStack; renderAsBlock[i] = isItemBlockType(itemStack); - if (renderAsBlock[i]) restoreBlockState = true; - else restoreItemState = true; + if (renderAsBlock[i]) { + restoreBlockState = true; + } else { + restoreItemState = true; + } } if (restoreItemState || restoreBlockState) { @@ -348,13 +333,15 @@ public class TileEntityDrawersRenderer extends TileEntitySpecialRenderer { } for (int i = 0; i < drawerCount; i++) { - if (renderStacks[i] != null && !renderAsBlock[i]) + if (renderStacks[i] != null && !renderAsBlock[i]) { renderFastItem(renderStacks[i], tile, i, side, depth, partialTickTime); + } } for (int i = 0; i < drawerCount; i++) { - if (renderStacks[i] != null && renderAsBlock[i]) + if (renderStacks[i] != null && renderAsBlock[i]) { renderFastItem(renderStacks[i], tile, i, side, depth, partialTickTime); + } } if (restoreItemState || restoreBlockState) { @@ -363,7 +350,7 @@ public class TileEntityDrawersRenderer extends TileEntitySpecialRenderer { } private void renderFancyItem(ItemStack itemStack, TileEntityDrawers tile, int slot, ForgeDirection side, - float depth, float partialTickTime) { + float depth) { int drawerCount = tile.getDrawerCount(); boolean isBlockType = isItemBlockType(itemStack); @@ -385,7 +372,7 @@ public class TileEntityDrawersRenderer extends TileEntitySpecialRenderer { double zDepth = 1 / relScale - itemBlock.getBlockBoundsMaxZ(); itemDepth += zDepth * zunit; - } catch (Exception e) {} ; + } catch (Exception e) {} } switch (tile.getDirection()) { @@ -500,7 +487,7 @@ public class TileEntityDrawersRenderer extends TileEntitySpecialRenderer { private float getXOffset(int drawerCount, int slot) { switch (drawerCount) { case 1: - return itemOffset1X[slot]; + return 0.5f; case 2: return itemOffset2X[slot]; case 3: @@ -515,7 +502,7 @@ public class TileEntityDrawersRenderer extends TileEntitySpecialRenderer { private float getYOffset(int drawerCount, int slot) { switch (drawerCount) { case 1: - return itemOffset1Y[slot]; + return 8.25f; case 2: return itemOffset2Y[slot]; case 3: diff --git a/src/main/java/com/jaquadro/minecraft/storagedrawers/integration/Thaumcraft.java b/src/main/java/com/jaquadro/minecraft/storagedrawers/integration/Thaumcraft.java index b260876..ede76c8 100644 --- a/src/main/java/com/jaquadro/minecraft/storagedrawers/integration/Thaumcraft.java +++ b/src/main/java/com/jaquadro/minecraft/storagedrawers/integration/Thaumcraft.java @@ -10,7 +10,6 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ResourceLocation; -import net.minecraft.util.Vec3; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.util.Constants; @@ -100,7 +99,7 @@ public class Thaumcraft extends IntegrationModule { } } - private class WailaTooltipHandler implements IWailaTooltipHandler { + private static class WailaTooltipHandler implements IWailaTooltipHandler { @Override public String transformItemName(IDrawer drawer, String defaultName) { @@ -117,7 +116,7 @@ public class Thaumcraft extends IntegrationModule { } } - private class LabelRenderHandler implements IRenderLabel { + private static class LabelRenderHandler implements IRenderLabel { @Override public void render(TileEntity tileEntity, IDrawerGroup drawerGroup, int slot, float brightness, @@ -129,11 +128,11 @@ public class Thaumcraft extends IntegrationModule { if (!(aspectObj instanceof Aspect)) return; EntityClientPlayerMP player = Minecraft.getMinecraft().thePlayer; - Vec3 blockPos = Vec3 - .createVectorHelper(tileEntity.xCoord + .5, tileEntity.yCoord + .5, tileEntity.zCoord + .5); - double distance = blockPos.distanceTo(player.getPosition(partialTickTime)); - - if (distance > 10) return; + final double distX = player.posX - (tileEntity.xCoord + .5); + final double distY = player.posY - (tileEntity.yCoord + .5); + final double distZ = player.posZ - (tileEntity.zCoord + .5); + final double distSq = distX * distX + distY * distY + distZ * distZ; + if (distSq > 100d) return; Aspect aspect = (Aspect) aspectObj; if (!ThaumcraftApiHelper.hasDiscoveredAspect(player.getDisplayName(), aspect)) return; @@ -151,7 +150,9 @@ public class Thaumcraft extends IntegrationModule { } float alpha = 1; - if (distance > 3) alpha = 1f - (float) ((distance - 3) / 7); + if (distSq > 9) { + alpha = 1f - (float) ((Math.sqrt(distSq) - 3) / 7); + } int color = aspect.getColor(); float r = (float) (color >> 16 & 255) / 255.0F;