/*
* This program is free software: you can redistribute it and/or modify it under
* the terms of the GNU Lesser 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. You should have received a copy of the GNU
* Lesser General Public License along with this program. If not, see
* <http://www.gnu.org/licenses/>
*/
package net.slimevoid.library.render;
import net.minecraft.client.model.ModelRenderer;
import net.minecraft.client.model.PositionTextureVertex;
import net.minecraft.client.model.TexturedQuad;
import net.minecraft.client.renderer.Tessellator;
import java.awt.geom.Point2D;
import java.util.ArrayList;
import java.util.List;
public class ModelSlimevoidObject {
private List<TexturedQuad> faceList;
private List<PositionTextureVertex> vertexList;
private List<Point2D.Float> vertexTexList;
private ModelRenderer modelRenderer;
private ModelSlimevoidObjectBounds boundsCache;
private int polyCount = 0;
public ModelSlimevoidObject(ModelRenderer modelRenderer) {
faceList = new ArrayList<TexturedQuad>();
vertexList = new ArrayList<PositionTextureVertex>();
vertexTexList = new ArrayList<Point2D.Float>();
this.modelRenderer = modelRenderer;
}
public ModelRenderer getModelRenderer() {
return this.modelRenderer;
}
public int addVertex(float x, float y, float z, float u, float v) {
int id = vertexList.size();
vertexList.add(new PositionTextureVertex(x, y, z, u, v));
return id;
}
public int addVertexTexture(float x, float y) {
int id = vertexTexList.size();
vertexTexList.add(new Point2D.Float(x, 1 - y));
return id;
}
public void addQuad(int a, int b, int c, int d, int at, int bt, int ct, int dt, boolean flip) {
PositionTextureVertex ap = new PositionTextureVertex(vertexList.get(a).vector3D, vertexTexList.get(at).x, vertexTexList.get(at).y);
PositionTextureVertex bp = new PositionTextureVertex(vertexList.get(b).vector3D, vertexTexList.get(bt).x, vertexTexList.get(bt).y);
PositionTextureVertex cp = new PositionTextureVertex(vertexList.get(c).vector3D, vertexTexList.get(ct).x, vertexTexList.get(ct).y);
PositionTextureVertex dp = new PositionTextureVertex(vertexList.get(d).vector3D, vertexTexList.get(dt).x, vertexTexList.get(dt).y);
TexturedQuad quad = new TexturedQuad(new PositionTextureVertex[]{
ap,
bp,
cp,
dp});
if (flip) quad.flipFace();
faceList.add(quad);
polyCount += 2;
}
public void addTriangle(int a, int b, int c, int at, int bt, int ct, boolean flip) {
PositionTextureVertex ap = new PositionTextureVertex(vertexList.get(a).vector3D, vertexTexList.get(at).x, vertexTexList.get(at).y);
PositionTextureVertex bp = new PositionTextureVertex(vertexList.get(b).vector3D, vertexTexList.get(bt).x, vertexTexList.get(bt).y);
PositionTextureVertex cp = new PositionTextureVertex(vertexList.get(c).vector3D, vertexTexList.get(ct).x, vertexTexList.get(ct).y);
TexturedTriangle triangle = new TexturedTriangle(new PositionTextureVertex[]{
ap,
bp,
cp});
if (flip) triangle.flipFace();
faceList.add(triangle);
polyCount += 1;
}
public ModelSlimevoidObjectBounds getBounds() {
if (boundsCache != null) return boundsCache;
int minX = 0;
int minY = 0;
int minZ = 0;
int maxX = 0;
int maxY = 0;
int maxZ = 0;
for (PositionTextureVertex v : vertexList) {
if (v.vector3D.xCoord < minX
|| (minX == 0 && v.vector3D.xCoord != 0)) minX = (int) v.vector3D.xCoord;
if (v.vector3D.yCoord < minY) minY = (int) v.vector3D.yCoord;
if (v.vector3D.zCoord < minZ
|| (minZ == 0 && v.vector3D.zCoord != 0)) minZ = (int) v.vector3D.zCoord;
if (v.vector3D.xCoord > maxX) maxX = (int) v.vector3D.xCoord;
if (v.vector3D.yCoord > maxY) maxY = (int) v.vector3D.yCoord;
if (v.vector3D.zCoord > maxZ) maxZ = (int) v.vector3D.zCoord;
}
boundsCache = new ModelSlimevoidObjectBounds(minX, minY, minZ, maxX, maxY, maxZ);
return boundsCache;
}
public void render(float par2) {
for (int i = 0; i < faceList.size(); i++) {
faceList.get(i).draw(Tessellator.getInstance().getWorldRenderer(),
par2);
}
}
public int vertexCount() {
return vertexList.size();
}
public int faceCount() {
return faceList.size();
}
public int polyCount() {
return polyCount;
}
public class ModelSlimevoidObjectBounds {
public int minX = 0;
public int minY = 0;
public int minZ = 0;
public int maxX = 0;
public int maxY = 0;
public int maxZ = 0;
public ModelSlimevoidObjectBounds(int minX, int minY, int minZ, int maxX, int maxY, int maxZ) {
this.minX = minX;
this.minY = minY;
this.minZ = minZ;
this.maxX = maxX;
this.maxY = maxY;
this.maxZ = maxZ;
}
}
}