001 package net.minecraft.src; 002 003 import cpw.mods.fml.common.Side; 004 import cpw.mods.fml.common.asm.SideOnly; 005 import java.util.ArrayList; 006 import java.util.Iterator; 007 import java.util.List; 008 import org.lwjgl.opengl.GL11; 009 010 public class ModelRenderer 011 { 012 /** The size of the texture file's width in pixels. */ 013 public float textureWidth; 014 015 /** The size of the texture file's height in pixels. */ 016 public float textureHeight; 017 018 /** The X offset into the texture used for displaying this model */ 019 private int textureOffsetX; 020 021 /** The Y offset into the texture used for displaying this model */ 022 private int textureOffsetY; 023 public float rotationPointX; 024 public float rotationPointY; 025 public float rotationPointZ; 026 public float rotateAngleX; 027 public float rotateAngleY; 028 public float rotateAngleZ; 029 private boolean compiled; 030 031 /** The GL display list rendered by the Tessellator for this model */ 032 private int displayList; 033 public boolean mirror; 034 public boolean showModel; 035 036 /** Hides the model. */ 037 public boolean isHidden; 038 public List cubeList; 039 public List childModels; 040 public final String boxName; 041 private ModelBase baseModel; 042 public float field_82906_o; 043 public float field_82908_p; 044 public float field_82907_q; 045 046 public ModelRenderer(ModelBase par1ModelBase, String par2Str) 047 { 048 this.textureWidth = 64.0F; 049 this.textureHeight = 32.0F; 050 this.compiled = false; 051 this.displayList = 0; 052 this.mirror = false; 053 this.showModel = true; 054 this.isHidden = false; 055 this.cubeList = new ArrayList(); 056 this.baseModel = par1ModelBase; 057 par1ModelBase.boxList.add(this); 058 this.boxName = par2Str; 059 this.setTextureSize(par1ModelBase.textureWidth, par1ModelBase.textureHeight); 060 } 061 062 public ModelRenderer(ModelBase par1ModelBase) 063 { 064 this(par1ModelBase, (String)null); 065 } 066 067 public ModelRenderer(ModelBase par1ModelBase, int par2, int par3) 068 { 069 this(par1ModelBase); 070 this.setTextureOffset(par2, par3); 071 } 072 073 /** 074 * Sets the current box's rotation points and rotation angles to another box. 075 */ 076 public void addChild(ModelRenderer par1ModelRenderer) 077 { 078 if (this.childModels == null) 079 { 080 this.childModels = new ArrayList(); 081 } 082 083 this.childModels.add(par1ModelRenderer); 084 } 085 086 public ModelRenderer setTextureOffset(int par1, int par2) 087 { 088 this.textureOffsetX = par1; 089 this.textureOffsetY = par2; 090 return this; 091 } 092 093 public ModelRenderer addBox(String par1Str, float par2, float par3, float par4, int par5, int par6, int par7) 094 { 095 par1Str = this.boxName + "." + par1Str; 096 TextureOffset var8 = this.baseModel.getTextureOffset(par1Str); 097 this.setTextureOffset(var8.textureOffsetX, var8.textureOffsetY); 098 this.cubeList.add((new ModelBox(this, this.textureOffsetX, this.textureOffsetY, par2, par3, par4, par5, par6, par7, 0.0F)).func_78244_a(par1Str)); 099 return this; 100 } 101 102 public ModelRenderer addBox(float par1, float par2, float par3, int par4, int par5, int par6) 103 { 104 this.cubeList.add(new ModelBox(this, this.textureOffsetX, this.textureOffsetY, par1, par2, par3, par4, par5, par6, 0.0F)); 105 return this; 106 } 107 108 /** 109 * Creates a textured box. Args: originX, originY, originZ, width, height, depth, scaleFactor. 110 */ 111 public void addBox(float par1, float par2, float par3, int par4, int par5, int par6, float par7) 112 { 113 this.cubeList.add(new ModelBox(this, this.textureOffsetX, this.textureOffsetY, par1, par2, par3, par4, par5, par6, par7)); 114 } 115 116 public void setRotationPoint(float par1, float par2, float par3) 117 { 118 this.rotationPointX = par1; 119 this.rotationPointY = par2; 120 this.rotationPointZ = par3; 121 } 122 123 @SideOnly(Side.CLIENT) 124 public void render(float par1) 125 { 126 if (!this.isHidden) 127 { 128 if (this.showModel) 129 { 130 if (!this.compiled) 131 { 132 this.compileDisplayList(par1); 133 } 134 135 GL11.glTranslatef(this.field_82906_o, this.field_82908_p, this.field_82907_q); 136 Iterator var2; 137 ModelRenderer var3; 138 139 if (this.rotateAngleX == 0.0F && this.rotateAngleY == 0.0F && this.rotateAngleZ == 0.0F) 140 { 141 if (this.rotationPointX == 0.0F && this.rotationPointY == 0.0F && this.rotationPointZ == 0.0F) 142 { 143 GL11.glCallList(this.displayList); 144 145 if (this.childModels != null) 146 { 147 var2 = this.childModels.iterator(); 148 149 while (var2.hasNext()) 150 { 151 var3 = (ModelRenderer)var2.next(); 152 var3.render(par1); 153 } 154 } 155 } 156 else 157 { 158 GL11.glTranslatef(this.rotationPointX * par1, this.rotationPointY * par1, this.rotationPointZ * par1); 159 GL11.glCallList(this.displayList); 160 161 if (this.childModels != null) 162 { 163 var2 = this.childModels.iterator(); 164 165 while (var2.hasNext()) 166 { 167 var3 = (ModelRenderer)var2.next(); 168 var3.render(par1); 169 } 170 } 171 172 GL11.glTranslatef(-this.rotationPointX * par1, -this.rotationPointY * par1, -this.rotationPointZ * par1); 173 } 174 } 175 else 176 { 177 GL11.glPushMatrix(); 178 GL11.glTranslatef(this.rotationPointX * par1, this.rotationPointY * par1, this.rotationPointZ * par1); 179 180 if (this.rotateAngleZ != 0.0F) 181 { 182 GL11.glRotatef(this.rotateAngleZ * (180F / (float)Math.PI), 0.0F, 0.0F, 1.0F); 183 } 184 185 if (this.rotateAngleY != 0.0F) 186 { 187 GL11.glRotatef(this.rotateAngleY * (180F / (float)Math.PI), 0.0F, 1.0F, 0.0F); 188 } 189 190 if (this.rotateAngleX != 0.0F) 191 { 192 GL11.glRotatef(this.rotateAngleX * (180F / (float)Math.PI), 1.0F, 0.0F, 0.0F); 193 } 194 195 GL11.glCallList(this.displayList); 196 197 if (this.childModels != null) 198 { 199 var2 = this.childModels.iterator(); 200 201 while (var2.hasNext()) 202 { 203 var3 = (ModelRenderer)var2.next(); 204 var3.render(par1); 205 } 206 } 207 208 GL11.glPopMatrix(); 209 } 210 211 GL11.glTranslatef(-this.field_82906_o, -this.field_82908_p, -this.field_82907_q); 212 } 213 } 214 } 215 216 @SideOnly(Side.CLIENT) 217 public void renderWithRotation(float par1) 218 { 219 if (!this.isHidden) 220 { 221 if (this.showModel) 222 { 223 if (!this.compiled) 224 { 225 this.compileDisplayList(par1); 226 } 227 228 GL11.glPushMatrix(); 229 GL11.glTranslatef(this.rotationPointX * par1, this.rotationPointY * par1, this.rotationPointZ * par1); 230 231 if (this.rotateAngleY != 0.0F) 232 { 233 GL11.glRotatef(this.rotateAngleY * (180F / (float)Math.PI), 0.0F, 1.0F, 0.0F); 234 } 235 236 if (this.rotateAngleX != 0.0F) 237 { 238 GL11.glRotatef(this.rotateAngleX * (180F / (float)Math.PI), 1.0F, 0.0F, 0.0F); 239 } 240 241 if (this.rotateAngleZ != 0.0F) 242 { 243 GL11.glRotatef(this.rotateAngleZ * (180F / (float)Math.PI), 0.0F, 0.0F, 1.0F); 244 } 245 246 GL11.glCallList(this.displayList); 247 GL11.glPopMatrix(); 248 } 249 } 250 } 251 252 /** 253 * Allows the changing of Angles after a box has been rendered 254 */ 255 @SideOnly(Side.CLIENT) 256 public void postRender(float par1) 257 { 258 if (!this.isHidden) 259 { 260 if (this.showModel) 261 { 262 if (!this.compiled) 263 { 264 this.compileDisplayList(par1); 265 } 266 267 if (this.rotateAngleX == 0.0F && this.rotateAngleY == 0.0F && this.rotateAngleZ == 0.0F) 268 { 269 if (this.rotationPointX != 0.0F || this.rotationPointY != 0.0F || this.rotationPointZ != 0.0F) 270 { 271 GL11.glTranslatef(this.rotationPointX * par1, this.rotationPointY * par1, this.rotationPointZ * par1); 272 } 273 } 274 else 275 { 276 GL11.glTranslatef(this.rotationPointX * par1, this.rotationPointY * par1, this.rotationPointZ * par1); 277 278 if (this.rotateAngleZ != 0.0F) 279 { 280 GL11.glRotatef(this.rotateAngleZ * (180F / (float)Math.PI), 0.0F, 0.0F, 1.0F); 281 } 282 283 if (this.rotateAngleY != 0.0F) 284 { 285 GL11.glRotatef(this.rotateAngleY * (180F / (float)Math.PI), 0.0F, 1.0F, 0.0F); 286 } 287 288 if (this.rotateAngleX != 0.0F) 289 { 290 GL11.glRotatef(this.rotateAngleX * (180F / (float)Math.PI), 1.0F, 0.0F, 0.0F); 291 } 292 } 293 } 294 } 295 } 296 297 /** 298 * Compiles a GL display list for this model 299 */ 300 @SideOnly(Side.CLIENT) 301 private void compileDisplayList(float par1) 302 { 303 this.displayList = GLAllocation.generateDisplayLists(1); 304 GL11.glNewList(this.displayList, GL11.GL_COMPILE); 305 Tessellator var2 = Tessellator.instance; 306 Iterator var3 = this.cubeList.iterator(); 307 308 while (var3.hasNext()) 309 { 310 ModelBox var4 = (ModelBox)var3.next(); 311 var4.render(var2, par1); 312 } 313 314 GL11.glEndList(); 315 this.compiled = true; 316 } 317 318 /** 319 * Returns the model renderer with the new texture parameters. 320 */ 321 public ModelRenderer setTextureSize(int par1, int par2) 322 { 323 this.textureWidth = (float)par1; 324 this.textureHeight = (float)par2; 325 return this; 326 } 327 }