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