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