package ihl.model; import ihl.items_blocks.FlexibleCableItem; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.EntityClientPlayerMP; import net.minecraft.client.renderer.GLAllocation; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.client.renderer.entity.RenderPlayer; import net.minecraft.item.ItemStack; import net.minecraftforge.client.IItemRenderer; import net.minecraftforge.common.util.ForgeDirection; import org.lwjgl.opengl.GL11; public class FlexibleCableItemRender implements IItemRenderer { private ModelTube model; private ModelTube modelThin; private ModelTube modelLong; private ModelTube modelThinLong; private final int segmentsAmount = 19; private final float spiralStepAngle = 1f; private final float scale = 1 / 32f; private final int[] displayListCache = new int[4]; public FlexibleCableItemRender() { float vOffset = 16f; int longFragmensSize = 24; model = new ModelTube(null, 0, 0, -2F, -3F, -2F + vOffset, 4, 6, 4, 0f, 0.5f, 0.99f, ForgeDirection.UP); modelLong = new ModelTube(null, 0, 0, -2F, -3F, -2F + vOffset, 4, longFragmensSize, 4, 0f, 0f, 0.99f, ForgeDirection.UP); modelThin = new ModelTube(null, 0, 0, -1F, -3F, -1F + vOffset, 2, 6, 2, 0f, 0.5f, 0.99f, ForgeDirection.UP); modelThinLong = new ModelTube(null, 0, 0, -1F, -3F, -1F + vOffset, 2, longFragmensSize, 2, 0f, 0.5f, 0.99f, ForgeDirection.UP); } @Override public boolean handleRenderType(ItemStack item, ItemRenderType type) { switch (type) { case ENTITY: return true; case EQUIPPED: return true; case EQUIPPED_FIRST_PERSON: return true; case INVENTORY: return true; default: return false; } } @Override public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { return true; } @Override public void renderItem(ItemRenderType type, ItemStack stack, Object... data) { GL11.glPushMatrix(); GL11.glEnable(GL11.GL_BLEND); GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); GL11.glScalef(1F, -1F, -1F); switch (type) { case ENTITY: GL11.glTranslatef(0, -1.0F, 0); this.rendercoil(stack); break; case EQUIPPED: GL11.glTranslatef(0.25F, -2F, -0.75F); this.rendercoil(stack); break; case EQUIPPED_FIRST_PERSON: RenderPlayer var25; EntityClientPlayerMP var3 = Minecraft.getMinecraft().thePlayer; Minecraft.getMinecraft().getTextureManager().bindTexture(var3.getLocationSkin()); var25 = (RenderPlayer) RenderManager.instance.getEntityRenderObject(Minecraft.getMinecraft().thePlayer); GL11.glRotatef(135F, 1.0F, 0.0F, 0.0F); GL11.glRotatef(35F, 0.0F, 1.0F, 0.0F); var25.renderFirstPersonArm(Minecraft.getMinecraft().thePlayer); GL11.glRotatef(-35F, 0.0F, 1.0F, 0.0F); GL11.glRotatef(-135F, 1.0F, 0.0F, 0.0F); GL11.glTranslatef(0.0F, 0.2F, 0F); GL11.glTranslatef(-0.25F, -1.0F, 0F); this.rendercoil(stack); break; case INVENTORY: GL11.glTranslatef(0.0F, -0.2F, 0F); this.rendercoil(stack); break; default: } GL11.glPopMatrix(); } private void rendercoil(ItemStack stack) { int type = this.getCableType(stack); if (this.displayListCache[type] != 0) { GL11.glCallList(displayListCache[type]); } else { this.displayListCache[type] = GLAllocation.generateDisplayLists(1); GL11.glNewList(displayListCache[type], 4864 /* GL_COMPILE */); GL11.glDisable(GL11.GL_TEXTURE_2D); int saMax = this.segmentsAmount * 2 + this.segmentsAmount / 2; for (int i = 0; i <= saMax; i++) { GL11.glRotatef(-spiralStepAngle, 0f, 0f, 1f); GL11.glRotatef(360f / this.segmentsAmount, 1f, 0f, 0f); GL11.glTranslatef(0.004f, 0f, 0f); GL11.glRotatef(spiralStepAngle, 0f, 0f, 1f); if (((FlexibleCableItem) stack.getItem()).isDataCable) { GL11.glColor3f(1f, 0.2f, 0f); } else { GL11.glColor3f(1f, 1f, 1f); } if (i == 0) { if (isNoInsulation(stack)) { if (FlexibleCableItem.instance.yellowColoredWires .contains(FlexibleCableItem.instance.getMaterial(stack))) { GL11.glColor3f(1f, 0.75f, 0.1f); } else { GL11.glColor3f(0.65f, 0.65f, 0.67f); } this.modelThinLong.render(Tessellator.instance, scale); } else { this.modelLong.render(Tessellator.instance, scale); } } else if (i == saMax) { GL11.glTranslatef(0.0F, -0.55F, 0F); if (isNoInsulation(stack)) { if (FlexibleCableItem.instance.yellowColoredWires .contains(FlexibleCableItem.instance.getMaterial(stack))) { GL11.glColor3f(1f, 0.75f, 0.1f); } else { GL11.glColor3f(0.65f, 0.65f, 0.67f); } this.modelThinLong.render(Tessellator.instance, scale); } else { this.modelLong.render(Tessellator.instance, scale); } GL11.glTranslatef(0.0F, 0.55F, 0F); } else { if (isNoInsulation(stack)) { if (FlexibleCableItem.instance.yellowColoredWires .contains(FlexibleCableItem.instance.getMaterial(stack))) { GL11.glColor3f(1f, 0.75f, 0.1f); } else { GL11.glColor3f(0.65f, 0.65f, 0.67f); } this.modelThin.render(Tessellator.instance, scale); } else { this.model.render(Tessellator.instance, scale); } } } GL11.glEnable(GL11.GL_TEXTURE_2D); GL11.glEndList(); } } private int getCableType(ItemStack stack) { if (((FlexibleCableItem) stack.getItem()).isDataCable) { return 3; } else if (isNoInsulation(stack)) { if (FlexibleCableItem.instance.yellowColoredWires.contains(FlexibleCableItem.instance.getMaterial(stack))) { return 1; } else { return 2; } } return 0; } private boolean isNoInsulation(ItemStack stack) { return stack.stackTagCompound != null && FlexibleCableItem.instance.getInsulationMaterial(stack).equals("null") && !((FlexibleCableItem) stack.getItem()).isDataCable; } }