Java tutorial
/** Copyright (C) 2014 by jabelar This file is part of jabelar's Minecraft Forge modding examples; as such, you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. For a copy of the GNU General Public License see <http://www.gnu.org/licenses/>. */ package com.blogspot.jabelarminecraft.wildanimals.models; import java.util.ArrayList; import java.util.List; import net.minecraft.client.model.ModelBase; import net.minecraft.client.model.TextureOffset; import net.minecraft.client.renderer.GLAllocation; import net.minecraft.client.renderer.Tessellator; import org.lwjgl.opengl.GL11; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; public class ModelRendererWildAnimals { /** 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 */ protected int textureOffsetX; /** The Y offset into the texture used for displaying this model */ protected 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 cubeList; public List childModels; public final String boxName; protected final ModelBase baseModel; public float offsetX; public float offsetY; public float offsetZ; public ModelRendererWildAnimals(ModelBase par1ModelBase, String par2Str) { this.textureWidth = 64.0F; this.textureHeight = 32.0F; this.showModel = true; this.cubeList = new ArrayList(); this.baseModel = par1ModelBase; par1ModelBase.boxList.add(this); this.boxName = par2Str; this.setTextureSize(par1ModelBase.textureWidth, par1ModelBase.textureHeight); } public ModelRendererWildAnimals(ModelBase par1ModelBase) { this(par1ModelBase, (String) null); } public ModelRendererWildAnimals(ModelBase par1ModelBase, int par2, int par3) { this(par1ModelBase); this.setTextureOffset(par2, par3); } /** * Sets the current box's rotation points and rotation angles to another box. */ public void addChild(ModelRendererWildAnimals par1ModelRenderer) { if (this.childModels == null) { this.childModels = new ArrayList(); } this.childModels.add(par1ModelRenderer); } public ModelRendererWildAnimals setTextureOffset(int par1, int par2) { this.textureOffsetX = par1; this.textureOffsetY = par2; return this; } public ModelRendererWildAnimals addBox(String par1Str, float par2, float par3, float par4, int par5, int par6, int par7) { par1Str = this.boxName + "." + par1Str; TextureOffset textureoffset = this.baseModel.getTextureOffset(par1Str); this.setTextureOffset(textureoffset.textureOffsetX, textureoffset.textureOffsetY); this.cubeList.add((new ModelBoxWildAnimals(this, this.textureOffsetX, this.textureOffsetY, par2, par3, par4, par5, par6, par7, 0.0F)).func_78244_a(par1Str)); return this; } public ModelRendererWildAnimals addBox(float par1, float par2, float par3, int par4, int par5, int par6) { this.cubeList.add(new ModelBoxWildAnimals(this, this.textureOffsetX, this.textureOffsetY, par1, par2, par3, par4, par5, par6, 0.0F)); return this; } /** * Creates a textured box. Args: originX, originY, originZ, width, height, depth, scaleFactor. */ public void addBox(float par1, float par2, float par3, int par4, int par5, int par6, float par7) { this.cubeList.add(new ModelBoxWildAnimals(this, this.textureOffsetX, this.textureOffsetY, par1, par2, par3, par4, par5, par6, par7)); } public void setRotationPoint(float par1, float par2, float par3) { this.rotationPointX = par1; this.rotationPointY = par2; this.rotationPointZ = par3; } @SideOnly(Side.CLIENT) public void render(float par1) { if (!this.isHidden) { if (this.showModel) { if (!this.compiled) { this.compileDisplayList(par1); } GL11.glTranslatef(this.offsetX, this.offsetY, this.offsetZ); int i; 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) { GL11.glCallList(this.displayList); if (this.childModels != null) { for (i = 0; i < this.childModels.size(); ++i) { ((ModelRendererWildAnimals) this.childModels.get(i)).render(par1); } } } else { GL11.glTranslatef(this.rotationPointX * par1, this.rotationPointY * par1, this.rotationPointZ * par1); GL11.glCallList(this.displayList); if (this.childModels != null) { for (i = 0; i < this.childModels.size(); ++i) { ((ModelRendererWildAnimals) this.childModels.get(i)).render(par1); } } GL11.glTranslatef(-this.rotationPointX * par1, -this.rotationPointY * par1, -this.rotationPointZ * par1); } } else { GL11.glPushMatrix(); GL11.glTranslatef(this.rotationPointX * par1, this.rotationPointY * par1, this.rotationPointZ * par1); if (this.rotateAngleZ != 0.0F) { GL11.glRotatef(this.rotateAngleZ * (180F / (float) Math.PI), 0.0F, 0.0F, 1.0F); } if (this.rotateAngleY != 0.0F) { GL11.glRotatef(this.rotateAngleY * (180F / (float) Math.PI), 0.0F, 1.0F, 0.0F); } if (this.rotateAngleX != 0.0F) { GL11.glRotatef(this.rotateAngleX * (180F / (float) Math.PI), 1.0F, 0.0F, 0.0F); } GL11.glCallList(this.displayList); if (this.childModels != null) { for (i = 0; i < this.childModels.size(); ++i) { ((ModelRendererWildAnimals) this.childModels.get(i)).render(par1); } } GL11.glPopMatrix(); } GL11.glTranslatef(-this.offsetX, -this.offsetY, -this.offsetZ); } } } @SideOnly(Side.CLIENT) public void renderWithRotation(float par1) { if (!this.isHidden) { if (this.showModel) { if (!this.compiled) { this.compileDisplayList(par1); } GL11.glPushMatrix(); GL11.glTranslatef(this.rotationPointX * par1, this.rotationPointY * par1, this.rotationPointZ * par1); if (this.rotateAngleY != 0.0F) { GL11.glRotatef(this.rotateAngleY * (180F / (float) Math.PI), 0.0F, 1.0F, 0.0F); } if (this.rotateAngleX != 0.0F) { GL11.glRotatef(this.rotateAngleX * (180F / (float) Math.PI), 1.0F, 0.0F, 0.0F); } if (this.rotateAngleZ != 0.0F) { GL11.glRotatef(this.rotateAngleZ * (180F / (float) Math.PI), 0.0F, 0.0F, 1.0F); } GL11.glCallList(this.displayList); GL11.glPopMatrix(); } } } /** * Allows the changing of Angles after a box has been rendered */ @SideOnly(Side.CLIENT) public void postRender(float par1) { if (!this.isHidden) { if (this.showModel) { if (!this.compiled) { this.compileDisplayList(par1); } 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) { GL11.glTranslatef(this.rotationPointX * par1, this.rotationPointY * par1, this.rotationPointZ * par1); } } else { GL11.glTranslatef(this.rotationPointX * par1, this.rotationPointY * par1, this.rotationPointZ * par1); if (this.rotateAngleZ != 0.0F) { GL11.glRotatef(this.rotateAngleZ * (180F / (float) Math.PI), 0.0F, 0.0F, 1.0F); } if (this.rotateAngleY != 0.0F) { GL11.glRotatef(this.rotateAngleY * (180F / (float) Math.PI), 0.0F, 1.0F, 0.0F); } if (this.rotateAngleX != 0.0F) { GL11.glRotatef(this.rotateAngleX * (180F / (float) Math.PI), 1.0F, 0.0F, 0.0F); } } } } } /** * Compiles a GL display list for this model */ @SideOnly(Side.CLIENT) private void compileDisplayList(float par1) { this.displayList = GLAllocation.generateDisplayLists(1); GL11.glNewList(this.displayList, GL11.GL_COMPILE); Tessellator tessellator = Tessellator.instance; for (int i = 0; i < this.cubeList.size(); ++i) { ((ModelBoxWildAnimals) this.cubeList.get(i)).render(tessellator, par1); } GL11.glEndList(); this.compiled = true; } /** * Returns the model renderer with the new texture parameters. */ public ModelRendererWildAnimals setTextureSize(int par1, int par2) { this.textureWidth = par1; this.textureHeight = par2; return this; } } //public class ModelRendererWildAnimals extends ModelRenderer //{ // // protected float renderScalingX; // protected float renderScalingY; // protected float renderScalingZ; // // /* // * Some parent fields are private without setters and getters // * so create fields here // */ // /** The GL display list rendered by the Tessellator for this model */ // protected int displayList; // /** The X offset into the texture used for displaying this model */ // protected int textureOffsetX; // /** The Y offset into the texture used for displaying this model */ // protected int textureOffsetY; // protected boolean compiled; // protected ModelBase baseModel; // // public ModelRendererWildAnimals(ModelBase par1ModelBase, String par2Str) // { // super(par1ModelBase, par2Str); // baseModel = par1ModelBase; // } // // public ModelRendererWildAnimals(ModelBase par1ModelBase) { // this(par1ModelBase, (String)null); // } // // public ModelRendererWildAnimals(ModelBase par1ModelBase, int par2, int par3) // { // this(par1ModelBase); // setTextureOffset(par2, par3); // } // // // public void setRenderScaling(float parScaleX, float parScaleY, float parScaleZ) // { // // Set Variables // renderScalingX = parScaleX; // renderScalingY = parScaleY; // renderScalingZ = parScaleZ; // } // // public void preventOverlapFlicker() // { // setRenderScaling(0.99F, 0.99F, 0.99F); // } // // public void allowOverlapFlicker() // { // setRenderScaling(1.0F, 1.0F, 1.0F); // } // // protected void customCallList() // { // // // Scale the render // GL11.glScalef(1 * renderScalingX, 1 * renderScalingY, 1 * renderScalingZ); // // // Make the display call // GL11.glCallList(displayList); // // // Remove the scale // GL11.glScalef(1 / renderScalingX, 1 / renderScalingY, 1 / renderScalingZ); // // } // // @Override // public ModelRendererWildAnimals setTextureOffset(int par1, int par2) // { // textureOffsetX = par1; // textureOffsetY = par2; // return this; // } // // @Override // @SideOnly(Side.CLIENT) // public void render(float par1) // { // if (!isHidden) // { // if (showModel) // { // if (!compiled) // { // compileDisplayList(par1); // } // // GL11.glTranslatef(offsetX, offsetY, offsetZ); // int i; // // if (rotateAngleX == 0.0F && rotateAngleY == 0.0F && rotateAngleZ == 0.0F) // { // if (rotationPointX == 0.0F && rotationPointY == 0.0F && rotationPointZ == 0.0F) // { // // replace GL11.glCallList(displayList); // customCallList(); // // if (childModels != null) // { // for (i = 0; i < childModels.size(); ++i) // { // ((ModelRendererWildAnimals)childModels.get(i)).render(par1); // } // } // } // else // { // GL11.glTranslatef(rotationPointX * par1, rotationPointY * par1, rotationPointZ * par1); // // replace GL11.glCallList(displayList); // customCallList(); // // if (childModels != null) // { // for (i = 0; i < childModels.size(); ++i) // { // ((ModelRendererWildAnimals)childModels.get(i)).render(par1); // } // } // // GL11.glTranslatef(-rotationPointX * par1, -rotationPointY * par1, -rotationPointZ * par1); // } // } // else // { // GL11.glPushMatrix(); // GL11.glTranslatef(rotationPointX * par1, rotationPointY * par1, rotationPointZ * par1); // // if (rotateAngleZ != 0.0F) // { // GL11.glRotatef(rotateAngleZ * (180F / (float)Math.PI), 0.0F, 0.0F, 1.0F); // } // // if (rotateAngleY != 0.0F) // { // GL11.glRotatef(rotateAngleY * (180F / (float)Math.PI), 0.0F, 1.0F, 0.0F); // } // // if (rotateAngleX != 0.0F) // { // GL11.glRotatef(rotateAngleX * (180F / (float)Math.PI), 1.0F, 0.0F, 0.0F); // } // // //GL11.glCallList(displayList); // customCallList(); // // if (childModels != null) // { // for (i = 0; i < childModels.size(); ++i) // { // ((ModelRendererWildAnimals)childModels.get(i)).render(par1); // } // } // // GL11.glPopMatrix(); // } // // GL11.glTranslatef(-offsetX, -offsetY, -offsetZ); // } // } // } // // @Override // @SideOnly(Side.CLIENT) // public void renderWithRotation(float par1) // { // if (!isHidden) // { // if (showModel) // { // if (!compiled) // { // compileDisplayList(par1); // } // // GL11.glPushMatrix(); // GL11.glTranslatef(rotationPointX * par1, rotationPointY * par1, rotationPointZ * par1); // // if (rotateAngleY != 0.0F) // { // GL11.glRotatef(rotateAngleY * (180F / (float)Math.PI), 0.0F, 1.0F, 0.0F); // } // // if (rotateAngleX != 0.0F) // { // GL11.glRotatef(rotateAngleX * (180F / (float)Math.PI), 1.0F, 0.0F, 0.0F); // } // // if (rotateAngleZ != 0.0F) // { // GL11.glRotatef(rotateAngleZ * (180F / (float)Math.PI), 0.0F, 0.0F, 1.0F); // } // // GL11.glCallList(displayList); // GL11.glPopMatrix(); // } // } // } // // /** // * Allows the changing of Angles after a box has been rendered // */ // @Override // @SideOnly(Side.CLIENT) // public void postRender(float par1) // { // if (!isHidden) // { // if (showModel) // { // if (!compiled) // { // compileDisplayList(par1); // } // // if (rotateAngleX == 0.0F && rotateAngleY == 0.0F && rotateAngleZ == 0.0F) // { // if (rotationPointX != 0.0F || rotationPointY != 0.0F || rotationPointZ != 0.0F) // { // GL11.glTranslatef(rotationPointX * par1, rotationPointY * par1, rotationPointZ * par1); // } // } // else // { // GL11.glTranslatef(rotationPointX * par1, rotationPointY * par1, rotationPointZ * par1); // // if (rotateAngleZ != 0.0F) // { // GL11.glRotatef(rotateAngleZ * (180F / (float)Math.PI), 0.0F, 0.0F, 1.0F); // } // // if (rotateAngleY != 0.0F) // { // GL11.glRotatef(rotateAngleY * (180F / (float)Math.PI), 0.0F, 1.0F, 0.0F); // } // // if (rotateAngleX != 0.0F) // { // GL11.glRotatef(rotateAngleX * (180F / (float)Math.PI), 1.0F, 0.0F, 0.0F); // } // } // } // } // } // // /** // * Compiles a GL display list for this model // */ // @SideOnly(Side.CLIENT) // private void compileDisplayList(float par1) // { // displayList = GLAllocation.generateDisplayLists(1); // GL11.glNewList(displayList, GL11.GL_COMPILE); // Tessellator tessellator = Tessellator.instance; // // for (int i = 0; i < cubeList.size(); ++i) // { // ((ModelBoxWildAnimals)cubeList.get(i)).render(tessellator, par1); // } // // GL11.glEndList(); // compiled = true; // } //}