package mcjty.rftools.blocks.screens; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import mcjty.lib.varia.Coordinate; import mcjty.rftools.RFTools; import mcjty.rftools.blocks.screens.modulesclient.ClientScreenModule; import mcjty.rftools.blocks.screens.network.PacketGetScreenData; import mcjty.rftools.network.RFToolsMessages; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ResourceLocation; import org.lwjgl.opengl.GL11; import java.util.Collections; import java.util.List; import java.util.Map; @SideOnly(Side.CLIENT) public class ScreenRenderer extends TileEntitySpecialRenderer { private static final ResourceLocation texture = new ResourceLocation(RFTools.MODID, "textures/blocks/screenFrame.png"); private final ModelScreen screenModel = new ModelScreen(ScreenTileEntity.SIZE_NORMAL); private final ModelScreen screenModelLarge = new ModelScreen(ScreenTileEntity.SIZE_LARGE); private final ModelScreen screenModelHuge = new ModelScreen(ScreenTileEntity.SIZE_HUGE); @Override public void renderTileEntityAt(TileEntity tileEntity, double x, double y, double z, float f) { GL11.glPushAttrib(GL11.GL_CURRENT_BIT | GL11.GL_DEPTH_BUFFER_BIT | GL11.GL_ENABLE_BIT | GL11.GL_LIGHTING_BIT | GL11.GL_TEXTURE_BIT); GL11.glPushMatrix(); float f3; int meta = tileEntity.getBlockMetadata(); f3 = 0.0F; if (meta == 2) { f3 = 180.0F; } if (meta == 4) { f3 = 90.0F; } if (meta == 5) { f3 = -90.0F; } GL11.glTranslatef((float) x + 0.5F, (float) y + 0.75F, (float) z + 0.5F); GL11.glRotatef(-f3, 0.0F, 1.0F, 0.0F); GL11.glTranslatef(0.0F, -0.2500F, -0.4375F); ScreenTileEntity screenTileEntity = (ScreenTileEntity) tileEntity; if (!screenTileEntity.isTransparent()) { GL11.glDisable(GL11.GL_LIGHTING); renderScreenBoard(screenTileEntity.getSize(), screenTileEntity.getColor()); } if (screenTileEntity.isPowerOn()) { FontRenderer fontrenderer = this.func_147498_b(); ClientScreenModule.TransformMode mode = ClientScreenModule.TransformMode.NONE; GL11.glDepthMask(false); GL11.glDisable(GL11.GL_LIGHTING); Map<Integer, Object[]> screenData = updateScreenData(screenTileEntity); List<ClientScreenModule> modules = screenTileEntity.getClientScreenModules(); renderModules(fontrenderer, mode, modules, screenData, screenTileEntity.getSize()); } GL11.glPopMatrix(); GL11.glPopAttrib(); } private Map<Integer, Object[]> updateScreenData(ScreenTileEntity screenTileEntity) { long millis = System.currentTimeMillis(); if ((millis - screenTileEntity.lastTime > 500) && screenTileEntity.isNeedsServerData()) { screenTileEntity.lastTime = millis; RFToolsMessages.INSTANCE.sendToServer(new PacketGetScreenData(screenTileEntity.xCoord, screenTileEntity.yCoord, screenTileEntity.zCoord, millis)); } Map<Integer,Object[]> screenData = ScreenTileEntity.screenData.get(new Coordinate(screenTileEntity.xCoord, screenTileEntity.yCoord, screenTileEntity.zCoord)); if (screenData == null) { screenData = Collections.EMPTY_MAP; } return screenData; } private void renderModules(FontRenderer fontrenderer, ClientScreenModule.TransformMode mode, List<ClientScreenModule> modules, Map<Integer, Object[]> screenData, int size) { float f3; float factor = size + 1.0f; int currenty = 7; int moduleIndex = 0; for (ClientScreenModule module : modules) { if (module != null) { int height = module.getHeight(); // Check if this module has enough room if (currenty + height <= 124) { if (module.getTransformMode() != mode) { if (mode != ClientScreenModule.TransformMode.NONE) { GL11.glPopMatrix(); } GL11.glPushMatrix(); mode = module.getTransformMode(); switch (mode) { case TEXT: GL11.glTranslatef(-0.5F, 0.5F, 0.07F); f3 = 0.0075F; GL11.glScalef(f3 * factor, -f3 * factor, f3); GL11.glNormal3f(0.0F, 0.0F, -1.0F); GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); break; case TEXTLARGE: GL11.glTranslatef(-0.5F, 0.5F, 0.07F); f3 = 0.0075F * 2; GL11.glScalef(f3 * factor, -f3 * factor, f3); GL11.glNormal3f(0.0F, 0.0F, -1.0F); GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); break; case ITEM: break; default: break; } } module.render(fontrenderer, currenty, screenData.get(moduleIndex), factor); currenty += height; } } moduleIndex++; } if (mode != ClientScreenModule.TransformMode.NONE) { GL11.glPopMatrix(); } } private void renderScreenBoard(int size, int color) { this.bindTexture(texture); GL11.glPushMatrix(); GL11.glScalef(1, -1, -1); if (size == ScreenTileEntity.SIZE_HUGE) { this.screenModelHuge.render(); } else if (size == ScreenTileEntity.SIZE_LARGE) { this.screenModelLarge.render(); } else { this.screenModel.render(); } GL11.glDepthMask(false); Tessellator tessellator = Tessellator.instance; tessellator.startDrawingQuads(); tessellator.setBrightness(240); tessellator.setColorRGBA_I(color, 255); // tessellator.setColorOpaque(0, 0, 0); float r; if (size == ScreenTileEntity.SIZE_HUGE) { r = 2.46f; } else if (size == ScreenTileEntity.SIZE_LARGE) { r = 1.46f; } else { r = .46f; } tessellator.addVertex(-.46f, r, -0.08f); tessellator.addVertex(r, r, -0.08f); tessellator.addVertex(r, -.46f, -0.08f); tessellator.addVertex(-.46f, -.46f, -0.08f); tessellator.draw(); GL11.glPopMatrix(); } }