package pneumaticCraft.client.model; import net.minecraft.client.model.ModelBase; import net.minecraft.client.model.ModelRenderer; import net.minecraft.client.renderer.entity.RenderItem; import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.entity.Entity; import net.minecraft.entity.item.EntityItem; import net.minecraft.item.ItemBlock; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ResourceLocation; import org.lwjgl.opengl.GL11; import pneumaticCraft.api.client.assemblymachine.AssemblyRenderOverriding; import pneumaticCraft.api.client.assemblymachine.AssemblyRenderOverriding.IAssemblyRenderOverriding; import pneumaticCraft.common.tileentity.TileEntityAssemblyIOUnit; import pneumaticCraft.lib.Textures; import cpw.mods.fml.client.FMLClientHandler; public class ModelAssemblyIOUnit extends ModelBase implements IBaseModel{ //fields ModelRenderer Base; ModelRenderer BaseTurn; ModelRenderer BaseTurn2; ModelRenderer ArmBase1; ModelRenderer ArmBase2; ModelRenderer SupportMiddle; ModelRenderer ArmMiddle1; ModelRenderer ArmMiddle2; ModelRenderer ClawBase; ModelRenderer ClawAxil; ModelRenderer ClawTurn; ModelRenderer Claw1; ModelRenderer Claw2; private final RenderItem customRenderItem; public ModelAssemblyIOUnit(){ // EE3 snippet, to initialize an EntityItem which doesn't bob. customRenderItem = new RenderItem(){ @Override public boolean shouldBob(){ return false; }; }; customRenderItem.setRenderManager(RenderManager.instance); textureWidth = 64; textureHeight = 64; Base = new ModelRenderer(this, 0, 0); Base.addBox(0F, 0F, 1F, 16, 1, 16); Base.setRotationPoint(-8F, 23F, -9F); Base.setTextureSize(64, 32); Base.mirror = true; setRotation(Base, 0F, 0F, 0F); BaseTurn = new ModelRenderer(this, 0, 17); BaseTurn.addBox(0F, 0F, 0F, 7, 1, 7); BaseTurn.setRotationPoint(-3.5F, 22F, -3.5F); BaseTurn.setTextureSize(64, 32); BaseTurn.mirror = true; setRotation(BaseTurn, 0F, 0F, 0F); BaseTurn2 = new ModelRenderer(this, 28, 17); BaseTurn2.addBox(0F, 0F, 0F, 4, 5, 4); BaseTurn2.setRotationPoint(-2F, 17F, -2F); BaseTurn2.setTextureSize(64, 32); BaseTurn2.mirror = true; setRotation(BaseTurn2, 0F, 0F, 0F); ArmBase1 = new ModelRenderer(this, 0, 25); ArmBase1.addBox(0F, 0F, 0F, 1, 2, 8); ArmBase1.setRotationPoint(2F, 17F, -1F); ArmBase1.setTextureSize(64, 32); ArmBase1.mirror = true; setRotation(ArmBase1, 0F, 0F, 0F); ArmBase2 = new ModelRenderer(this, 0, 25); ArmBase2.addBox(0F, 0F, 0F, 1, 2, 8); ArmBase2.setRotationPoint(-3F, 17F, -1F); ArmBase2.setTextureSize(64, 32); ArmBase2.mirror = true; setRotation(ArmBase2, 0F, 0F, 0F); SupportMiddle = new ModelRenderer(this, 0, 57); SupportMiddle.addBox(0F, 0F, 0F, 2, 1, 1); SupportMiddle.setRotationPoint(-1F, 17.5F, 5.5F); SupportMiddle.setTextureSize(64, 32); SupportMiddle.mirror = true; setRotation(SupportMiddle, 0F, 0F, 0F); ArmMiddle1 = new ModelRenderer(this, 0, 35); ArmMiddle1.addBox(0F, 0F, 0F, 1, 17, 2); ArmMiddle1.setRotationPoint(-2F, 2F, 5F); ArmMiddle1.setTextureSize(64, 32); ArmMiddle1.mirror = true; setRotation(ArmMiddle1, 0F, 0F, 0F); ArmMiddle2 = new ModelRenderer(this, 0, 35); ArmMiddle2.addBox(0F, 0F, 0F, 1, 17, 2); ArmMiddle2.setRotationPoint(1F, 2F, 5F); ArmMiddle2.setTextureSize(64, 32); ArmMiddle2.mirror = true; setRotation(ArmMiddle2, 0F, 0F, 0F); ClawBase = new ModelRenderer(this, 8, 38); ClawBase.addBox(0F, 0F, 0F, 2, 2, 3); ClawBase.setRotationPoint(-1F, 2F, 4.5F); ClawBase.setTextureSize(64, 32); ClawBase.mirror = true; setRotation(ClawBase, 0F, 0F, 0F); ClawAxil = new ModelRenderer(this, 8, 45); ClawAxil.addBox(0F, 0F, 0F, 1, 1, 1); ClawAxil.setRotationPoint(-0.5F, 2.5F, 4F); ClawAxil.setTextureSize(64, 32); ClawAxil.mirror = true; setRotation(ClawAxil, 0F, 0F, 0F); ClawTurn = new ModelRenderer(this, 8, 49); ClawTurn.addBox(0F, 0F, 0F, 4, 2, 1); ClawTurn.setRotationPoint(-2F, 2F, 3F); ClawTurn.setTextureSize(64, 32); ClawTurn.mirror = true; setRotation(ClawTurn, 0F, 0F, 0F); Claw1 = new ModelRenderer(this, 8, 54); Claw1.addBox(0F, 0F, 0F, 1, 2, 1); Claw1.setRotationPoint(0F, 2F, 2F); Claw1.setTextureSize(64, 32); Claw1.mirror = true; setRotation(Claw1, 0F, 0F, 0F); Claw2 = new ModelRenderer(this, 8, 59); Claw2.addBox(0F, 0F, 0F, 1, 2, 1); Claw2.setRotationPoint(-1F, 2F, 2F); Claw2.setTextureSize(64, 32); Claw2.mirror = true; setRotation(Claw2, 0F, 0F, 0F); } @Override public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5){ super.render(entity, f, f1, f2, f3, f4, f5); setRotationAngles(f, f1, f2, f3, f4, f5, entity); Base.render(f5); BaseTurn.render(f5); BaseTurn2.render(f5); ArmBase1.render(f5); ArmBase2.render(f5); SupportMiddle.render(f5); ArmMiddle1.render(f5); ArmMiddle2.render(f5); ClawBase.render(f5); ClawAxil.render(f5); ClawTurn.render(f5); Claw1.render(f5); Claw2.render(f5); } @Override public void renderStatic(float size, TileEntity te){ } @Override public void renderDynamic(float size, TileEntity te, float partialTicks){ FMLClientHandler.instance().getClient().getTextureManager().bindTexture(te != null && te.getBlockMetadata() == 0 ? Textures.MODEL_ASSEMBLY_IO_IMPORT : Textures.MODEL_ASSEMBLY_IO_EXPORT); if(te instanceof TileEntityAssemblyIOUnit) { TileEntityAssemblyIOUnit tile = (TileEntityAssemblyIOUnit)te; float[] renderAngles = new float[5]; for(int i = 0; i < 5; i++) { renderAngles[i] = tile.oldAngles[i] + (tile.angles[i] - tile.oldAngles[i]) * partialTicks; } // float rotationAngle = (float) (720.0 * // (System.currentTimeMillis() & 0x3FFFL) / 0x3FFFL); EntityItem ghostEntityItem = null; if(tile.inventory[0] != null) { ghostEntityItem = new EntityItem(tile.getWorldObj()); ghostEntityItem.hoverStart = 0.0F; ghostEntityItem.setEntityItemStack(tile.inventory[0]); } boolean fancySetting = RenderManager.instance.options.fancyGraphics; RenderManager.instance.options.fancyGraphics = true; renderModel(size, renderAngles, tile.oldClawProgress + (tile.clawProgress - tile.oldClawProgress) * partialTicks, ghostEntityItem); RenderManager.instance.options.fancyGraphics = fancySetting; } else { renderModel(size, new float[]{0, 0, 35, 55, 0}, 0, null); } } public void renderModel(float size, float[] angles, float clawProgress, EntityItem carriedItem){ float clawTrans; float scaleFactor = 0.7F; IAssemblyRenderOverriding renderOverride = null; if(carriedItem != null) { renderOverride = AssemblyRenderOverriding.renderOverrides.get(carriedItem.getEntityItem()); if(renderOverride != null) { clawTrans = renderOverride.getIOUnitClawShift(carriedItem.getEntityItem()); } else { if(carriedItem.getEntityItem().getItem() instanceof ItemBlock) { clawTrans = 1.5F / 16F - clawProgress * 0.1F / 16F; } else { clawTrans = 1.5F / 16F - clawProgress * 1.4F / 16F; scaleFactor = 0.4F; } } } else { clawTrans = 1.5F / 16F - clawProgress * 1.5F / 16F; } Base.render(size); GL11.glPushMatrix(); GL11.glRotatef(angles[0], 0, 1, 0); BaseTurn.render(size); BaseTurn2.render(size); GL11.glTranslated(0, 18 / 16F, 0); GL11.glRotatef(angles[1], 1, 0, 0); GL11.glTranslated(0, -18 / 16F, 0); ArmBase1.render(size); ArmBase2.render(size); SupportMiddle.render(size); GL11.glTranslated(0, 18 / 16F, 6 / 16F); GL11.glRotatef(angles[2], 1, 0, 0); GL11.glTranslated(0, -18 / 16F, -6 / 16F); ArmMiddle1.render(size); ArmMiddle2.render(size); GL11.glTranslated(0, 3 / 16F, 6 / 16F); GL11.glRotatef(angles[3], 1, 0, 0); GL11.glTranslated(0, -3 / 16F, -6 / 16F); ClawBase.render(size); GL11.glTranslated(0, 3 / 16F, 0); GL11.glRotatef(angles[4], 0, 0, 1); GL11.glTranslated(0, -3 / 16F, 0); ClawAxil.render(size); ClawTurn.render(size); GL11.glPushMatrix(); GL11.glTranslated(clawTrans, 0, 0); Claw1.render(size); GL11.glTranslated(-2 * clawTrans, 0, 0); Claw2.render(size); GL11.glPopMatrix(); if(carriedItem != null) { if(renderOverride == null || renderOverride.applyRenderChangeIOUnit(carriedItem.getEntityItem())) { GL11.glRotated(90, 1, 0, 0); GL11.glTranslated(0, carriedItem.getEntityItem().getItem() instanceof ItemBlock ? 1.5 / 16D : 0.5 / 16D, -3 / 16D); GL11.glRotated(-90, 0, 1, 0); GL11.glScalef(scaleFactor, scaleFactor, scaleFactor); customRenderItem.doRender(carriedItem, 0, 0, 0, 0, 0); } } GL11.glPopMatrix(); } private void setRotation(ModelRenderer model, float x, float y, float z){ model.rotateAngleX = x; model.rotateAngleY = y; model.rotateAngleZ = z; } @Override public ResourceLocation getModelTexture(TileEntity tile){ return null; } @Override public boolean rotateModelBasedOnBlockMeta(){ return false; } }