Skip to content

Commit 4707569

Browse files
authored
Fix drawer item render in perspective (#37)
1 parent 3f75cb3 commit 4707569

File tree

3 files changed

+57
-129
lines changed

3 files changed

+57
-129
lines changed

src/main/java/com/jaquadro/minecraft/storagedrawers/client/renderer/GLUtil.java

Lines changed: 0 additions & 60 deletions
This file was deleted.

src/main/java/com/jaquadro/minecraft/storagedrawers/client/renderer/TileEntityDrawersRenderer.java

Lines changed: 47 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
11
package com.jaquadro.minecraft.storagedrawers.client.renderer;
22

3-
import java.util.ArrayList;
43
import java.util.List;
54

65
import net.minecraft.block.Block;
76
import net.minecraft.client.Minecraft;
8-
import net.minecraft.client.entity.EntityClientPlayerMP;
97
import net.minecraft.client.gui.FontRenderer;
108
import net.minecraft.client.renderer.OpenGlHelper;
119
import net.minecraft.client.renderer.RenderBlocks;
@@ -23,7 +21,6 @@
2321
import net.minecraft.tileentity.TileEntity;
2422
import net.minecraft.util.IIcon;
2523
import net.minecraft.util.ResourceLocation;
26-
import net.minecraft.util.Vec3;
2724
import net.minecraftforge.client.ForgeHooksClient;
2825
import net.minecraftforge.common.util.ForgeDirection;
2926

@@ -46,13 +43,9 @@ public class TileEntityDrawersRenderer extends TileEntitySpecialRenderer {
4643
private static final ResourceLocation RES_ITEM_GLINT = new ResourceLocation(
4744
"textures/misc/enchanted_item_glint.png");
4845

49-
private Vec3[] dirVectors = { Vec3.createVectorHelper(0, -1, 0), Vec3.createVectorHelper(0, 1, 0),
50-
Vec3.createVectorHelper(0, 0, -1), Vec3.createVectorHelper(0, 0, 1), Vec3.createVectorHelper(-1, 0, 0),
51-
Vec3.createVectorHelper(1, 0, 0) };
46+
private final RenderItem itemRenderer = new RenderItem() {
5247

53-
private RenderItem itemRenderer = new RenderItem() {
54-
55-
private RenderBlocks renderBlocksRi = new RenderBlocks();
48+
private final RenderBlocks renderBlocksRi = new RenderBlocks();
5649

5750
@Override
5851
public byte getMiniBlockCount(ItemStack stack, byte original) {
@@ -211,55 +204,34 @@ private void renderItemIntoGUIBlock(FontRenderer fontRenderer, TextureManager te
211204
}
212205
};
213206

214-
private float itemOffset1X[] = new float[] { .5f };
215-
private float itemOffset1Y[] = new float[] { 8.25f };
216-
217-
private float itemOffset2X[] = new float[] { .5f, .5f };
218-
private float itemOffset2Y[] = new float[] { 10.25f, 2.25f };
207+
private final float[] itemOffset2X = new float[] { .5f, .5f };
208+
private final float[] itemOffset2Y = new float[] { 10.25f, 2.25f };
219209

220-
private float itemOffset4X[] = new float[] { .25f, .25f, .75f, .75f };
221-
private float itemOffset4Y[] = new float[] { 10.25f, 2.25f, 10.25f, 2.25f };
210+
private final float[] itemOffset4X = new float[] { .25f, .25f, .75f, .75f };
211+
private final float[] itemOffset4Y = new float[] { 10.25f, 2.25f, 10.25f, 2.25f };
222212

223-
private float itemOffset3X[] = new float[] { .5f, .25f, .75f };
224-
private float itemOffset3Y[] = new float[] { 9.75f, 2.25f, 2.25f };
213+
private final float[] itemOffset3X = new float[] { .5f, .25f, .75f };
214+
private final float[] itemOffset3Y = new float[] { 9.75f, 2.25f, 2.25f };
225215

226-
private RenderBlocks renderBlocks = new RenderBlocks();
216+
private final RenderBlocks renderBlocks = new RenderBlocks();
227217

228218
private float brightness;
229219

230-
private static final float unit = .0625f;
231-
232-
private static int[] glStateRender = { GL11.GL_LIGHTING, GL11.GL_BLEND };
233-
private List<int[]> savedGLStateRender = GLUtil.makeGLState(glStateRender);
234-
235-
private static int[] glStateItemRender = { GL11.GL_LIGHTING, GL11.GL_ALPHA_TEST, GL11.GL_BLEND };
236-
private List<int[]> savedGLStateItemRender = GLUtil.makeGLState(glStateItemRender);
237-
238-
private static int[] glLightRender = { GL11.GL_LIGHT0, GL11.GL_LIGHT1, GL11.GL_COLOR_MATERIAL,
239-
GL12.GL_RESCALE_NORMAL };
240-
private List<int[]> savedGLLightRender = GLUtil.makeGLState(glLightRender);
241-
242-
private List<IRenderLabel> preLabelRenderHandlers = new ArrayList<IRenderLabel>();
220+
private static final float unit = 0.0625f;
243221

244222
@Override
245223
public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float partialTickTime) {
246224
TileEntityDrawers tileDrawers = (TileEntityDrawers) tile;
247225
if (tileDrawers == null) return;
248-
249226
if (tileDrawers.isShrouded() || tileDrawers.isSealed()) return;
250227

251-
// Don't bother rendering anything that is (probably) facing away from the player.
252-
EntityClientPlayerMP player = Minecraft.getMinecraft().thePlayer;
253-
Vec3 faceVector = dirVectors[tileDrawers.getDirection()];
254-
float lookProduct = (float) player.getLook(partialTickTime).dotProduct(faceVector);
255-
256-
if (lookProduct > .75f) return;
257-
258228
float depth;
259-
260229
Block block = tile.getWorldObj().getBlock(tile.xCoord, tile.yCoord, tile.zCoord);
261-
if (block instanceof BlockDrawers) depth = ((BlockDrawers) block).halfDepth ? .5f : 1;
262-
else return;
230+
if (block instanceof BlockDrawers) {
231+
depth = ((BlockDrawers) block).halfDepth ? .5f : 1;
232+
} else {
233+
return;
234+
}
263235

264236
GL11.glPushMatrix();
265237
GL11.glTranslated(x, y, z);
@@ -286,9 +258,11 @@ public void renderTileEntityAt(TileEntity tile, double x, double y, double z, fl
286258
mc.gameSettings.fancyGraphics = true;
287259

288260
try {
289-
if (StorageDrawers.config.isFancyItemRenderEnabled())
290-
renderFancyItemSet(tileDrawers, side, depth, partialTickTime);
291-
else renderFastItemSet(tileDrawers, side, depth, partialTickTime);
261+
if (StorageDrawers.config.isFancyItemRenderEnabled()) {
262+
renderFancyItemSet(tileDrawers, side, depth);
263+
} else {
264+
renderFastItemSet(tileDrawers, side, depth, partialTickTime);
265+
}
292266
} catch (Exception e) {
293267
// Swallow exception
294268
}
@@ -298,8 +272,10 @@ public void renderTileEntityAt(TileEntity tile, double x, double y, double z, fl
298272
GL11.glPopMatrix();
299273
}
300274

301-
private void renderFancyItemSet(TileEntityDrawers tile, ForgeDirection side, float depth, float partialTickTime) {
275+
private void renderFancyItemSet(TileEntityDrawers tile, ForgeDirection side, float depth) {
302276
boolean restoreGLState = false;
277+
boolean isLightingEnabled = false;
278+
boolean isBlendEnabled = false;
303279
int drawerCount = tile.getDrawerCount();
304280

305281
for (int i = 0; i < drawerCount; i++) {
@@ -311,17 +287,23 @@ private void renderFancyItemSet(TileEntityDrawers tile, ForgeDirection side, flo
311287

312288
if (!restoreGLState) {
313289
restoreGLState = true;
314-
GLUtil.saveGLState(savedGLStateRender, glStateRender);
290+
isLightingEnabled = GL11.glIsEnabled(GL11.GL_LIGHTING);
291+
isBlendEnabled = GL11.glIsEnabled(GL11.GL_BLEND);
315292
}
316293

317-
renderFancyItem(itemStack, tile, i, side, depth, partialTickTime);
294+
renderFancyItem(itemStack, tile, i, side, depth);
318295
}
319296

320-
if (restoreGLState) GLUtil.restoreGLState(savedGLStateRender);
297+
if (restoreGLState) {
298+
if (isLightingEnabled) GL11.glEnable(GL11.GL_LIGHTING);
299+
else GL11.glDisable(GL11.GL_LIGHTING);
300+
if (isBlendEnabled) GL11.glEnable(GL11.GL_BLEND);
301+
else GL11.glDisable(GL11.GL_BLEND);
302+
}
321303
}
322304

323-
private boolean[] renderAsBlock = new boolean[4];
324-
private ItemStack[] renderStacks = new ItemStack[4];
305+
private final boolean[] renderAsBlock = new boolean[4];
306+
private final ItemStack[] renderStacks = new ItemStack[4];
325307

326308
private void renderFastItemSet(TileEntityDrawers tile, ForgeDirection side, float depth, float partialTickTime) {
327309
int drawerCount = tile.getDrawerCount();
@@ -339,22 +321,27 @@ private void renderFastItemSet(TileEntityDrawers tile, ForgeDirection side, floa
339321
renderStacks[i] = itemStack;
340322
renderAsBlock[i] = isItemBlockType(itemStack);
341323

342-
if (renderAsBlock[i]) restoreBlockState = true;
343-
else restoreItemState = true;
324+
if (renderAsBlock[i]) {
325+
restoreBlockState = true;
326+
} else {
327+
restoreItemState = true;
328+
}
344329
}
345330

346331
if (restoreItemState || restoreBlockState) {
347332
GL11.glPushAttrib(GL11.GL_ENABLE_BIT | GL11.GL_LIGHTING_BIT | GL11.GL_COLOR_BUFFER_BIT);
348333
}
349334

350335
for (int i = 0; i < drawerCount; i++) {
351-
if (renderStacks[i] != null && !renderAsBlock[i])
336+
if (renderStacks[i] != null && !renderAsBlock[i]) {
352337
renderFastItem(renderStacks[i], tile, i, side, depth, partialTickTime);
338+
}
353339
}
354340

355341
for (int i = 0; i < drawerCount; i++) {
356-
if (renderStacks[i] != null && renderAsBlock[i])
342+
if (renderStacks[i] != null && renderAsBlock[i]) {
357343
renderFastItem(renderStacks[i], tile, i, side, depth, partialTickTime);
344+
}
358345
}
359346

360347
if (restoreItemState || restoreBlockState) {
@@ -363,7 +350,7 @@ private void renderFastItemSet(TileEntityDrawers tile, ForgeDirection side, floa
363350
}
364351

365352
private void renderFancyItem(ItemStack itemStack, TileEntityDrawers tile, int slot, ForgeDirection side,
366-
float depth, float partialTickTime) {
353+
float depth) {
367354
int drawerCount = tile.getDrawerCount();
368355
boolean isBlockType = isItemBlockType(itemStack);
369356

@@ -385,7 +372,7 @@ private void renderFancyItem(ItemStack itemStack, TileEntityDrawers tile, int sl
385372

386373
double zDepth = 1 / relScale - itemBlock.getBlockBoundsMaxZ();
387374
itemDepth += zDepth * zunit;
388-
} catch (Exception e) {} ;
375+
} catch (Exception e) {}
389376
}
390377

391378
switch (tile.getDirection()) {
@@ -500,7 +487,7 @@ private boolean isItemBlockType(ItemStack itemStack) {
500487
private float getXOffset(int drawerCount, int slot) {
501488
switch (drawerCount) {
502489
case 1:
503-
return itemOffset1X[slot];
490+
return 0.5f;
504491
case 2:
505492
return itemOffset2X[slot];
506493
case 3:
@@ -515,7 +502,7 @@ private float getXOffset(int drawerCount, int slot) {
515502
private float getYOffset(int drawerCount, int slot) {
516503
switch (drawerCount) {
517504
case 1:
518-
return itemOffset1Y[slot];
505+
return 8.25f;
519506
case 2:
520507
return itemOffset2Y[slot];
521508
case 3:

src/main/java/com/jaquadro/minecraft/storagedrawers/integration/Thaumcraft.java

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import net.minecraft.nbt.NBTTagList;
1111
import net.minecraft.tileentity.TileEntity;
1212
import net.minecraft.util.ResourceLocation;
13-
import net.minecraft.util.Vec3;
1413
import net.minecraftforge.common.MinecraftForge;
1514
import net.minecraftforge.common.util.Constants;
1615

@@ -100,7 +99,7 @@ private void setDrawerAspectName(IDrawer drawer, String aspectName) {
10099
}
101100
}
102101

103-
private class WailaTooltipHandler implements IWailaTooltipHandler {
102+
private static class WailaTooltipHandler implements IWailaTooltipHandler {
104103

105104
@Override
106105
public String transformItemName(IDrawer drawer, String defaultName) {
@@ -117,7 +116,7 @@ public String transformItemName(IDrawer drawer, String defaultName) {
117116
}
118117
}
119118

120-
private class LabelRenderHandler implements IRenderLabel {
119+
private static class LabelRenderHandler implements IRenderLabel {
121120

122121
@Override
123122
public void render(TileEntity tileEntity, IDrawerGroup drawerGroup, int slot, float brightness,
@@ -129,11 +128,11 @@ public void render(TileEntity tileEntity, IDrawerGroup drawerGroup, int slot, fl
129128
if (!(aspectObj instanceof Aspect)) return;
130129

131130
EntityClientPlayerMP player = Minecraft.getMinecraft().thePlayer;
132-
Vec3 blockPos = Vec3
133-
.createVectorHelper(tileEntity.xCoord + .5, tileEntity.yCoord + .5, tileEntity.zCoord + .5);
134-
double distance = blockPos.distanceTo(player.getPosition(partialTickTime));
135-
136-
if (distance > 10) return;
131+
final double distX = player.posX - (tileEntity.xCoord + .5);
132+
final double distY = player.posY - (tileEntity.yCoord + .5);
133+
final double distZ = player.posZ - (tileEntity.zCoord + .5);
134+
final double distSq = distX * distX + distY * distY + distZ * distZ;
135+
if (distSq > 100d) return;
137136

138137
Aspect aspect = (Aspect) aspectObj;
139138
if (!ThaumcraftApiHelper.hasDiscoveredAspect(player.getDisplayName(), aspect)) return;
@@ -151,7 +150,9 @@ public void render(TileEntity tileEntity, IDrawerGroup drawerGroup, int slot, fl
151150
}
152151

153152
float alpha = 1;
154-
if (distance > 3) alpha = 1f - (float) ((distance - 3) / 7);
153+
if (distSq > 9) {
154+
alpha = 1f - (float) ((Math.sqrt(distSq) - 3) / 7);
155+
}
155156

156157
int color = aspect.getColor();
157158
float r = (float) (color >> 16 & 255) / 255.0F;

0 commit comments

Comments
 (0)