package shedar.mods.ic2.nuclearcontrol.renderers; import java.util.LinkedList; import java.util.List; import net.minecraft.block.Block; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Facing; import org.lwjgl.opengl.GL11; import shedar.mods.ic2.nuclearcontrol.IScreenPart; import shedar.mods.ic2.nuclearcontrol.api.CardState; import shedar.mods.ic2.nuclearcontrol.api.IPanelDataSource; import shedar.mods.ic2.nuclearcontrol.api.PanelString; import shedar.mods.ic2.nuclearcontrol.panel.CardWrapperImpl; import shedar.mods.ic2.nuclearcontrol.panel.Screen; import shedar.mods.ic2.nuclearcontrol.renderers.model.ModelInfoPanel; import shedar.mods.ic2.nuclearcontrol.tileentities.TileEntityAdvancedInfoPanel; import shedar.mods.ic2.nuclearcontrol.tileentities.TileEntityInfoPanel; import shedar.mods.ic2.nuclearcontrol.utils.StringUtils; public class TileEntityInfoPanelRenderer extends TileEntitySpecialRenderer { private static String implodeArray(String[] inputArray, String glueString) { String output = ""; if (inputArray.length > 0) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < inputArray.length; i++) { if (inputArray[i] == null || inputArray[i].isEmpty()) continue; sb.append(glueString); sb.append(inputArray[i]); } output = sb.toString(); if (output.length() > 1) output = output.substring(1); } return output; } @Override public void renderTileEntityAt(TileEntity tileEntity, double x, double y, double z, float f) { boolean isPanel = tileEntity instanceof TileEntityInfoPanel; if (!isPanel && tileEntity instanceof IScreenPart) { Screen scr = ((IScreenPart) tileEntity).getScreen(); if (scr != null) { TileEntity core = scr.getCore(tileEntity.getWorldObj()); if (core != null) { x += core.xCoord - tileEntity.xCoord; y += core.yCoord - tileEntity.yCoord; z += core.zCoord - tileEntity.zCoord; tileEntity = core; isPanel = tileEntity instanceof TileEntityInfoPanel; } } } if (isPanel) { TileEntityInfoPanel panel = (TileEntityInfoPanel) tileEntity; if (!panel.getPowered()) { return; } List<ItemStack> cards = panel.getCards(); boolean anyCardFound = false; List<PanelString> joinedData = new LinkedList<PanelString>(); for (ItemStack card : cards) { if (card == null || !(card.getItem() instanceof IPanelDataSource)) { continue; } int displaySettings = panel.getDisplaySettingsByCard(card); if (displaySettings == 0) { continue; } CardWrapperImpl helper = new CardWrapperImpl(card, -1); CardState state = helper.getState(); List<PanelString> data; if (state != CardState.OK && state != CardState.CUSTOM_ERROR) { data = StringUtils.getStateMessage(state); } else { data = panel.getCardData(displaySettings, card, helper); } if (data == null) { continue; } joinedData.addAll(data); anyCardFound = true; } if (!anyCardFound) { return; } GL11.glPushMatrix(); GL11.glPolygonOffset(-10, -10); GL11.glEnable(GL11.GL_POLYGON_OFFSET_FILL); short side = (short) Facing.oppositeSide[panel.getFacing()]; Screen screen = panel.getScreen(); float dx = 1F / 16; float dz = 1F / 16; float displayWidth = 1 - 2F / 16; float displayHeight = 1 - 2F / 16; if (screen != null) { y -= panel.yCoord - screen.maxY; if (side == 0 || side == 1 || side == 2 || side == 3 || side == 5) { z -= panel.zCoord - screen.minZ; } else { z -= panel.zCoord - screen.maxZ; } if (side == 0 || side == 2 || side == 4) { x -= panel.xCoord - screen.minX; } else { x -= panel.xCoord - screen.maxX; } } GL11.glTranslatef((float) x, (float) y, (float) z); switch (side) { case 0: if (screen != null) { displayWidth += screen.maxX - screen.minX; displayHeight += screen.maxZ - screen.minZ; } break; case 1: GL11.glTranslatef(1, 1, 0); GL11.glRotatef(180, 1, 0, 0); GL11.glRotatef(180, 0, 1, 0); if (screen != null) { displayWidth += screen.maxX - screen.minX; displayHeight += screen.maxZ - screen.minZ; } break; case 2: GL11.glTranslatef(0, 1, 0); GL11.glRotatef(0, 0, 1, 0); GL11.glRotatef(90, 1, 0, 0); if (screen != null) { displayWidth += screen.maxX - screen.minX; displayHeight += screen.maxY - screen.minY; } break; case 3: GL11.glTranslatef(1, 1, 1); GL11.glRotatef(180, 0, 1, 0); GL11.glRotatef(90, 1, 0, 0); if (screen != null) { displayWidth += screen.maxX - screen.minX; displayHeight += screen.maxY - screen.minY; } break; case 4: GL11.glTranslatef(0, 1, 1); GL11.glRotatef(90, 0, 1, 0); GL11.glRotatef(90, 1, 0, 0); if (screen != null) { displayWidth += screen.maxZ - screen.minZ; displayHeight += screen.maxY - screen.minY; } break; case 5: GL11.glTranslatef(1, 1, 0); GL11.glRotatef(-90, 0, 1, 0); GL11.glRotatef(90, 1, 0, 0); if (screen != null) { displayWidth += screen.maxZ - screen.minZ; displayHeight += screen.maxY - screen.minY; } break; } float thickness = 1; double angleHor = 0; double angleVert = 0; double[] deltas = null; if (panel instanceof TileEntityAdvancedInfoPanel && screen != null) { TileEntityAdvancedInfoPanel advPanel = (TileEntityAdvancedInfoPanel) panel; ModelInfoPanel model = new ModelInfoPanel(); deltas = model.getDeltas(advPanel, screen); thickness = (float) (advPanel.thickness / 16F - (deltas[0] + deltas[1] + deltas[2] + deltas[3]) / 4); } GL11.glTranslatef(dx + displayWidth / 2, thickness, dz + displayHeight / 2); GL11.glRotatef(-90, 1, 0, 0); GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); switch (panel.rotation) { case 0: break; case 1: GL11.glRotatef(-90, 0, 0, 1); float t = displayHeight; displayHeight = displayWidth; displayWidth = t; break; case 2: GL11.glRotatef(90, 0, 0, 1); float tm = displayHeight; displayHeight = displayWidth; displayWidth = tm; break; case 3: GL11.glRotatef(180, 0, 0, 1); break; } if (deltas != null) { if (deltas[0] == 0) { // +1,-2 angleHor = 180 / Math.PI * Math.atan(deltas[1] / (displayWidth + 2F / 16)); angleVert = -180 / Math.PI * Math.atan(deltas[2] / (displayHeight + 2F / 16)); } else if (deltas[1] == 0) { // -0,-3 angleHor = -180 / Math.PI * Math.atan(deltas[0] / (displayWidth + 2F / 16)); angleVert = -180 / Math.PI * Math.atan(deltas[3] / (displayHeight + 2F / 16)); } else if (deltas[2] == 0) { // +3,+0 angleHor = 180 / Math.PI * Math.atan(deltas[3] / (displayWidth + 2F / 16)); angleVert = 180 / Math.PI * Math.atan(deltas[0] / (displayHeight + 2F / 16)); } else { // -2,+1 angleHor = -180 / Math.PI * Math.atan(deltas[2] / (displayWidth + 2F / 16)); angleVert = 180 / Math.PI * Math.atan(deltas[1] / (displayHeight + 2F / 16)); } } GL11.glRotatef((float) -angleVert, 1, 0, 0); GL11.glRotatef((float) angleHor, 0, 1, 0); FontRenderer fontRenderer = this.func_147498_b(); int maxWidth = 1; for (PanelString panelString : joinedData) { String currentString = implodeArray(new String[] { panelString.textLeft, panelString.textCenter, panelString.textRight }, " "); maxWidth = Math.max(fontRenderer.getStringWidth(currentString), maxWidth); } maxWidth += 4; int lineHeight = fontRenderer.FONT_HEIGHT + 2; int requiredHeight = lineHeight * joinedData.size(); float scaleX = displayWidth / maxWidth; float scaleY = displayHeight / requiredHeight; float scale = Math.min(scaleX, scaleY); GL11.glScalef(scale, -scale, scale); GL11.glDepthMask(false); int offsetX; int offsetY; int realHeight = (int) Math.floor(displayHeight / scale); int realWidth = (int) Math.floor(displayWidth / scale); if (scaleX < scaleY) { offsetX = 2; offsetY = (realHeight - requiredHeight) / 2; } else { offsetX = (realWidth - maxWidth) / 2 + 2; offsetY = 0; } Block block = panel.getWorldObj().getBlock(panel.xCoord, panel.yCoord, panel.zCoord); if (block == null) { block = Blocks.stone; } GL11.glDisable(GL11.GL_LIGHTING); int row = 0; for (PanelString panelString : joinedData) { if (panelString.textLeft != null) { fontRenderer.drawString(panelString.textLeft, offsetX - realWidth / 2, 1 + offsetY - realHeight / 2 + row * lineHeight, panelString.colorLeft != 0 ? panelString.colorLeft : panel.getColorTextHex()); } if (panelString.textCenter != null) { fontRenderer .drawString( panelString.textCenter, -fontRenderer .getStringWidth(panelString.textCenter) / 2, offsetY - realHeight / 2 + row * lineHeight, panelString.colorCenter != 0 ? panelString.colorCenter : panel.getColorTextHex()); } if (panelString.textRight != null) { fontRenderer.drawString(panelString.textRight, realWidth/ 2 - fontRenderer.getStringWidth(panelString.textRight), offsetY - realHeight / 2 + row * lineHeight, panelString.colorRight != 0 ? panelString.colorRight : panel.getColorTextHex()); } row++; } GL11.glEnable(GL11.GL_LIGHTING); GL11.glDepthMask(true); GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); GL11.glDisable(GL11.GL_POLYGON_OFFSET_FILL); GL11.glPopMatrix(); } } }