tcr/client/src/main/java/client/renderer/tileentity/DisplayRenderer.java
2025-07-20 14:20:55 +02:00

113 lines
3.5 KiB
Java

package client.renderer.tileentity;
import java.util.Iterator;
import java.util.Map;
import org.lwjgl.opengl.GL11;
import client.Client;
import client.renderer.Drawing;
import client.renderer.GlState;
import client.renderer.texture.DynamicTexture;
import common.block.Block;
import common.block.tech.BlockDisplay;
import common.collect.Maps;
import common.tileentity.TileEntityDisplay;
import common.util.BlockPos;
import common.util.Facing;
import common.world.State;
public class DisplayRenderer extends TileRenderer<TileEntityDisplay> {
private static class TimedTexture {
public long time;
public long updated;
public String texture;
}
private static final Map<String, TimedTexture> DISPLAYS = Maps.<String, TimedTexture>newHashMap();
private static String getTextureLocation(BlockPos pos) {
return "display/" + pos.getX() + "," + pos.getY() + "," + pos.getZ();
}
private static String getTexture(TileEntityDisplay te) {
String id = getTextureLocation(te.getPos());
TimedTexture tex = DISPLAYS.get(id);
if(tex == null) {
if(DISPLAYS.size() >= 256) {
long i = System.currentTimeMillis();
Iterator<String> iterator = DISPLAYS.keySet().iterator();
while(iterator.hasNext()) {
String oid = iterator.next();
TimedTexture ttex = DISPLAYS.get(oid);
if(i - ttex.time > 60000L) {
Client.CLIENT.getTextureManager().deleteTexture(ttex.texture);
iterator.remove();
}
}
if(DISPLAYS.size() >= 256) {
return null;
}
}
tex = new TimedTexture();
tex.texture = id;
tex.updated = te.lastUpdated;
DynamicTexture dtex = new DynamicTexture(te.density, te.density);
System.arraycopy(te.data, 0, dtex.getData(), 0, te.data.length);
dtex.updateTexture();
Client.CLIENT.getTextureManager().loadTexture(tex.texture, dtex);
DISPLAYS.put(id, tex);
}
else if(te.lastUpdated != tex.updated) {
tex.updated = te.lastUpdated;
if(Client.CLIENT.getTextureManager().getTexture(tex.texture) instanceof DynamicTexture dtex) {
if(dtex.getWidth() * dtex.getHeight() != te.data.length) {
Client.CLIENT.getTextureManager().deleteTexture(tex.texture);
Client.CLIENT.getTextureManager().loadTexture(tex.texture, dtex = new DynamicTexture(te.density, te.density));
}
System.arraycopy(te.data, 0, dtex.getData(), 0, te.data.length);
dtex.updateTexture();
}
}
tex.time = System.currentTimeMillis();
return tex.texture;
}
public DisplayRenderer(TileEntityRendererDispatcher renderer) {
super(renderer);
}
public void renderTileEntityAt(TileEntityDisplay te, double x, double y, double z, float partialTicks, int destroyStage) {
Block block = te.getBlockType();
State state = te.getBlockState();
Facing dir = state.getBlock() instanceof BlockDisplay ? state.getValue(BlockDisplay.FACING) : Facing.SOUTH;
float rot = 0.0F;
if(dir == Facing.NORTH)
rot = 180.0F;
else if(dir == Facing.WEST)
rot = 90.0F;
else if(dir == Facing.EAST)
rot = -90.0F;
GL11.glPushMatrix();
GL11.glTranslatef((float)x + 0.5F, (float)y + 1.0f, (float)z + 0.5F);
GL11.glRotatef(-rot, 0.0F, 1.0F, 0.0F);
GL11.glTranslatef(-0.5F, 0.0f, -0.5f + 0.0625f + 0.005f);
float density = 1.0f / (float)(te.density / 16);
GL11.glScalef(0.0625f * density, -0.0625f * density, 0.0625f * density);
GlState.disableLighting();
Drawing.drawTexturedRect(Client.CLIENT, getTexture(te), te.density, te.density, 0, 0, 0, 0, te.density, te.density);
GlState.enableLighting();
GlState.color(1.0F, 1.0F, 1.0F, 1.0F);
GL11.glPopMatrix();
}
}