2025-03-11 00:23:54 +01:00
|
|
|
package game.renderer.model;
|
|
|
|
|
|
|
|
import java.util.List;
|
|
|
|
|
2025-03-16 17:40:47 +01:00
|
|
|
import com.google.common.collect.Lists;
|
|
|
|
|
2025-03-11 00:23:54 +01:00
|
|
|
import game.renderer.RenderBuffer;
|
|
|
|
import game.renderer.Tessellator;
|
2025-03-11 10:26:48 +01:00
|
|
|
import game.window.WCF;
|
2025-03-11 00:23:54 +01:00
|
|
|
|
|
|
|
public class ModelRenderer
|
|
|
|
{
|
|
|
|
/** The size of the texture file's width in pixels. */
|
|
|
|
public float textureWidth;
|
|
|
|
|
|
|
|
/** The size of the texture file's height in pixels. */
|
|
|
|
public float textureHeight;
|
|
|
|
|
|
|
|
/** The X offset into the texture used for displaying this model */
|
|
|
|
private int textureOffsetX;
|
|
|
|
|
|
|
|
/** The Y offset into the texture used for displaying this model */
|
|
|
|
private int textureOffsetY;
|
|
|
|
public float rotationPointX;
|
|
|
|
public float rotationPointY;
|
|
|
|
public float rotationPointZ;
|
|
|
|
public float rotateAngleX;
|
|
|
|
public float rotateAngleY;
|
|
|
|
public float rotateAngleZ;
|
|
|
|
private boolean compiled;
|
|
|
|
|
|
|
|
/** The GL display list rendered by the Tessellator for this model */
|
|
|
|
private int displayList;
|
|
|
|
public boolean mirror;
|
|
|
|
public boolean showModel;
|
|
|
|
|
|
|
|
/** Hides the model. */
|
|
|
|
public boolean isHidden;
|
|
|
|
public List<ModelBox> cubeList;
|
|
|
|
public List<ModelRenderer> childModels;
|
|
|
|
public final String boxName;
|
|
|
|
private ModelBase baseModel;
|
|
|
|
public float offsetX;
|
|
|
|
public float offsetY;
|
|
|
|
public float offsetZ;
|
|
|
|
|
|
|
|
public ModelRenderer()
|
|
|
|
{
|
|
|
|
this.showModel = true;
|
|
|
|
this.cubeList = Lists.<ModelBox>newArrayList();
|
|
|
|
this.baseModel = null;
|
|
|
|
this.boxName = null;
|
|
|
|
this.setTextureSize(64, 64);
|
|
|
|
this.setTextureOffset(0, 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
public ModelRenderer(ModelBase model, String boxNameIn)
|
|
|
|
{
|
|
|
|
this.textureWidth = 64.0F;
|
|
|
|
this.textureHeight = 32.0F;
|
|
|
|
this.showModel = true;
|
|
|
|
this.cubeList = Lists.<ModelBox>newArrayList();
|
|
|
|
this.baseModel = model;
|
|
|
|
if(model != null)
|
|
|
|
model.boxList.add(this);
|
|
|
|
this.boxName = boxNameIn;
|
|
|
|
if(model != null)
|
|
|
|
this.setTextureSize(model.textureWidth, model.textureHeight);
|
|
|
|
}
|
|
|
|
|
|
|
|
public ModelRenderer(ModelBase model)
|
|
|
|
{
|
|
|
|
this(model, (String)null);
|
|
|
|
}
|
|
|
|
|
|
|
|
public ModelRenderer(ModelBase model, int texOffX, int texOffY)
|
|
|
|
{
|
|
|
|
this(model);
|
|
|
|
this.setTextureOffset(texOffX, texOffY);
|
|
|
|
}
|
|
|
|
|
|
|
|
public ModelRenderer(int texOffX, int texOffY, int width, int height)
|
|
|
|
{
|
|
|
|
this(null);
|
|
|
|
this.setTextureOffset(texOffX, texOffY);
|
|
|
|
this.setTextureSize(width, height);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Sets the current box's rotation points and rotation angles to another box.
|
|
|
|
*/
|
|
|
|
public void addChild(ModelRenderer renderer)
|
|
|
|
{
|
|
|
|
if (this.childModels == null)
|
|
|
|
{
|
|
|
|
this.childModels = Lists.<ModelRenderer>newArrayList();
|
|
|
|
}
|
|
|
|
|
|
|
|
this.childModels.add(renderer);
|
|
|
|
}
|
|
|
|
|
|
|
|
public ModelRenderer setTextureOffset(int x, int y)
|
|
|
|
{
|
|
|
|
this.textureOffsetX = x;
|
|
|
|
this.textureOffsetY = y;
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public ModelRenderer addBoxes(List<ModelBox> cubes)
|
|
|
|
{
|
|
|
|
this.cubeList.addAll(cubes);
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public ModelRenderer addBox(String partName, float offX, float offY, float offZ, int width, int height, int depth)
|
|
|
|
{
|
|
|
|
partName = this.boxName + "." + partName;
|
|
|
|
TextureOffset textureoffset = this.baseModel.getTextureOffset(partName);
|
|
|
|
this.setTextureOffset(textureoffset.textureOffsetX, textureoffset.textureOffsetY);
|
|
|
|
this.cubeList.add((new ModelBox(this, this.textureOffsetX, this.textureOffsetY, offX, offY, offZ, width, height, depth, 0.0F))); // .setBoxName(partName));
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public ModelRenderer addBox(String partName, float offX, float offY, float offZ, int width, int height)
|
|
|
|
{
|
|
|
|
partName = this.boxName + "." + partName;
|
|
|
|
TextureOffset textureoffset = this.baseModel.getTextureOffset(partName);
|
|
|
|
this.setTextureOffset(textureoffset.textureOffsetX, textureoffset.textureOffsetY);
|
|
|
|
this.cubeList.add((new ModelBox(this, this.textureOffsetX, this.textureOffsetY, offX, offY, offZ, width, height))); // .setBoxName(partName));
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public ModelRenderer addBox(float offX, float offY, float offZ, int width, int height, int depth)
|
|
|
|
{
|
|
|
|
this.cubeList.add(new ModelBox(this, this.textureOffsetX, this.textureOffsetY, offX, offY, offZ, width, height, depth, 0.0F));
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public ModelRenderer addBox(float p_178769_1_, float p_178769_2_, float p_178769_3_, int p_178769_4_, int p_178769_5_, int p_178769_6_, boolean p_178769_7_)
|
|
|
|
{
|
|
|
|
this.cubeList.add(new ModelBox(this, this.textureOffsetX, this.textureOffsetY, p_178769_1_, p_178769_2_, p_178769_3_, p_178769_4_, p_178769_5_, p_178769_6_, 0.0F, p_178769_7_));
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Creates a textured box. Args: originX, originY, originZ, width, height, depth, scaleFactor.
|
|
|
|
*/
|
|
|
|
public void addBox(float p_78790_1_, float p_78790_2_, float p_78790_3_, int width, int height, int depth, float scaleFactor)
|
|
|
|
{
|
|
|
|
this.cubeList.add(new ModelBox(this, this.textureOffsetX, this.textureOffsetY, p_78790_1_, p_78790_2_, p_78790_3_, width, height, depth, scaleFactor));
|
|
|
|
}
|
|
|
|
|
|
|
|
public void addBox(float x, float y, float z, int width, int height, int depth, int rwidth, int rheight, int rdepth, float scaleFactor)
|
|
|
|
{
|
|
|
|
this.cubeList.add(new ModelBox(this, this.textureOffsetX, this.textureOffsetY, x, y, z, width, height, depth, rwidth, rheight, rdepth, scaleFactor));
|
|
|
|
}
|
|
|
|
|
|
|
|
public void setRotationPoint(float rotationPointXIn, float rotationPointYIn, float rotationPointZIn)
|
|
|
|
{
|
|
|
|
this.rotationPointX = rotationPointXIn;
|
|
|
|
this.rotationPointY = rotationPointYIn;
|
|
|
|
this.rotationPointZ = rotationPointZIn;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void render(float p_78785_1_)
|
|
|
|
{
|
|
|
|
if (!this.isHidden)
|
|
|
|
{
|
|
|
|
if (this.showModel)
|
|
|
|
{
|
|
|
|
if (!this.compiled)
|
|
|
|
{
|
|
|
|
this.compileDisplayList(p_78785_1_);
|
|
|
|
}
|
|
|
|
|
|
|
|
WCF.glTranslatef(this.offsetX, this.offsetY, this.offsetZ);
|
|
|
|
|
|
|
|
if (this.rotateAngleX == 0.0F && this.rotateAngleY == 0.0F && this.rotateAngleZ == 0.0F)
|
|
|
|
{
|
|
|
|
if (this.rotationPointX == 0.0F && this.rotationPointY == 0.0F && this.rotationPointZ == 0.0F)
|
|
|
|
{
|
|
|
|
WCF.glCallList(this.displayList);
|
|
|
|
|
|
|
|
if (this.childModels != null)
|
|
|
|
{
|
|
|
|
for (int k = 0; k < this.childModels.size(); ++k)
|
|
|
|
{
|
|
|
|
((ModelRenderer)this.childModels.get(k)).render(p_78785_1_);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
WCF.glTranslatef(this.rotationPointX * p_78785_1_, this.rotationPointY * p_78785_1_, this.rotationPointZ * p_78785_1_);
|
|
|
|
WCF.glCallList(this.displayList);
|
|
|
|
|
|
|
|
if (this.childModels != null)
|
|
|
|
{
|
|
|
|
for (int j = 0; j < this.childModels.size(); ++j)
|
|
|
|
{
|
|
|
|
((ModelRenderer)this.childModels.get(j)).render(p_78785_1_);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
WCF.glTranslatef(-this.rotationPointX * p_78785_1_, -this.rotationPointY * p_78785_1_, -this.rotationPointZ * p_78785_1_);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
WCF.glPushMatrix();
|
|
|
|
WCF.glTranslatef(this.rotationPointX * p_78785_1_, this.rotationPointY * p_78785_1_, this.rotationPointZ * p_78785_1_);
|
|
|
|
|
|
|
|
if (this.rotateAngleZ != 0.0F)
|
|
|
|
{
|
|
|
|
WCF.glRotatef(this.rotateAngleZ * (180F / (float)Math.PI), 0.0F, 0.0F, 1.0F);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (this.rotateAngleY != 0.0F)
|
|
|
|
{
|
|
|
|
WCF.glRotatef(this.rotateAngleY * (180F / (float)Math.PI), 0.0F, 1.0F, 0.0F);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (this.rotateAngleX != 0.0F)
|
|
|
|
{
|
|
|
|
WCF.glRotatef(this.rotateAngleX * (180F / (float)Math.PI), 1.0F, 0.0F, 0.0F);
|
|
|
|
}
|
|
|
|
|
|
|
|
WCF.glCallList(this.displayList);
|
|
|
|
|
|
|
|
if (this.childModels != null)
|
|
|
|
{
|
|
|
|
for (int i = 0; i < this.childModels.size(); ++i)
|
|
|
|
{
|
|
|
|
((ModelRenderer)this.childModels.get(i)).render(p_78785_1_);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
WCF.glPopMatrix();
|
|
|
|
}
|
|
|
|
|
|
|
|
WCF.glTranslatef(-this.offsetX, -this.offsetY, -this.offsetZ);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public void renderWithRotation(float p_78791_1_)
|
|
|
|
{
|
|
|
|
if (!this.isHidden)
|
|
|
|
{
|
|
|
|
if (this.showModel)
|
|
|
|
{
|
|
|
|
if (!this.compiled)
|
|
|
|
{
|
|
|
|
this.compileDisplayList(p_78791_1_);
|
|
|
|
}
|
|
|
|
|
|
|
|
WCF.glPushMatrix();
|
|
|
|
WCF.glTranslatef(this.rotationPointX * p_78791_1_, this.rotationPointY * p_78791_1_, this.rotationPointZ * p_78791_1_);
|
|
|
|
|
|
|
|
if (this.rotateAngleY != 0.0F)
|
|
|
|
{
|
|
|
|
WCF.glRotatef(this.rotateAngleY * (180F / (float)Math.PI), 0.0F, 1.0F, 0.0F);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (this.rotateAngleX != 0.0F)
|
|
|
|
{
|
|
|
|
WCF.glRotatef(this.rotateAngleX * (180F / (float)Math.PI), 1.0F, 0.0F, 0.0F);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (this.rotateAngleZ != 0.0F)
|
|
|
|
{
|
|
|
|
WCF.glRotatef(this.rotateAngleZ * (180F / (float)Math.PI), 0.0F, 0.0F, 1.0F);
|
|
|
|
}
|
|
|
|
|
|
|
|
WCF.glCallList(this.displayList);
|
|
|
|
WCF.glPopMatrix();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Allows the changing of Angles after a box has been rendered
|
|
|
|
*/
|
|
|
|
public void postRender(float scale)
|
|
|
|
{
|
|
|
|
if (!this.isHidden)
|
|
|
|
{
|
|
|
|
if (this.showModel)
|
|
|
|
{
|
|
|
|
if (!this.compiled)
|
|
|
|
{
|
|
|
|
this.compileDisplayList(scale);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (this.rotateAngleX == 0.0F && this.rotateAngleY == 0.0F && this.rotateAngleZ == 0.0F)
|
|
|
|
{
|
|
|
|
if (this.rotationPointX != 0.0F || this.rotationPointY != 0.0F || this.rotationPointZ != 0.0F)
|
|
|
|
{
|
|
|
|
WCF.glTranslatef(this.rotationPointX * scale, this.rotationPointY * scale, this.rotationPointZ * scale);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
WCF.glTranslatef(this.rotationPointX * scale, this.rotationPointY * scale, this.rotationPointZ * scale);
|
|
|
|
|
|
|
|
if (this.rotateAngleZ != 0.0F)
|
|
|
|
{
|
|
|
|
WCF.glRotatef(this.rotateAngleZ * (180F / (float)Math.PI), 0.0F, 0.0F, 1.0F);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (this.rotateAngleY != 0.0F)
|
|
|
|
{
|
|
|
|
WCF.glRotatef(this.rotateAngleY * (180F / (float)Math.PI), 0.0F, 1.0F, 0.0F);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (this.rotateAngleX != 0.0F)
|
|
|
|
{
|
|
|
|
WCF.glRotatef(this.rotateAngleX * (180F / (float)Math.PI), 1.0F, 0.0F, 0.0F);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public void postRender(float scale, float x, float y, float z)
|
|
|
|
{
|
|
|
|
if (!this.isHidden)
|
|
|
|
{
|
|
|
|
if (this.showModel)
|
|
|
|
{
|
|
|
|
if (!this.compiled)
|
|
|
|
{
|
|
|
|
this.compileDisplayList(scale);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (this.rotateAngleX == 0.0F && this.rotateAngleY == 0.0F && this.rotateAngleZ == 0.0F)
|
|
|
|
{
|
|
|
|
if (this.rotationPointX + x != 0.0F || this.rotationPointY + y != 0.0F || this.rotationPointZ + z != 0.0F)
|
|
|
|
{
|
|
|
|
WCF.glTranslatef((this.rotationPointX + x) * scale, (this.rotationPointY + y) * scale, (this.rotationPointZ + z) * scale);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
WCF.glTranslatef((this.rotationPointX + x) * scale, (this.rotationPointY + y) * scale, (this.rotationPointZ + z) * scale);
|
|
|
|
|
|
|
|
if (this.rotateAngleZ != 0.0F)
|
|
|
|
{
|
|
|
|
WCF.glRotatef(this.rotateAngleZ * (180F / (float)Math.PI), 0.0F, 0.0F, 1.0F);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (this.rotateAngleY != 0.0F)
|
|
|
|
{
|
|
|
|
WCF.glRotatef(this.rotateAngleY * (180F / (float)Math.PI), 0.0F, 1.0F, 0.0F);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (this.rotateAngleX != 0.0F)
|
|
|
|
{
|
|
|
|
WCF.glRotatef(this.rotateAngleX * (180F / (float)Math.PI), 1.0F, 0.0F, 0.0F);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private void compileDisplayList(float scale)
|
|
|
|
{
|
|
|
|
this.displayList = WCF.glGenLists(1);
|
|
|
|
WCF.glNewList(this.displayList, WCF.GL_COMPILE);
|
|
|
|
// Tessellator.getInstance();
|
|
|
|
RenderBuffer worldrenderer = Tessellator.getBuffer();
|
|
|
|
|
|
|
|
for (int i = 0; i < this.cubeList.size(); ++i)
|
|
|
|
{
|
|
|
|
((ModelBox)this.cubeList.get(i)).makeList(worldrenderer, scale);
|
|
|
|
}
|
|
|
|
|
|
|
|
WCF.glEndList();
|
|
|
|
this.compiled = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void deleteDisplayList() {
|
|
|
|
if(this.displayList != 0)
|
|
|
|
WCF.glDeleteLists(this.displayList, 1);
|
|
|
|
this.displayList = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the model renderer with the new texture parameters.
|
|
|
|
*/
|
|
|
|
public ModelRenderer setTextureSize(int textureWidthIn, int textureHeightIn)
|
|
|
|
{
|
|
|
|
this.textureWidth = (float)textureWidthIn;
|
|
|
|
this.textureHeight = (float)textureHeightIn;
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
}
|