    001package net.minecraftforge.client.model.obj;
    002
    003import net.minecraft.client.renderer.Tessellator;
    004import net.minecraft.util.Vec3;
    005import cpw.mods.fml.relauncher.Side;
    006import cpw.mods.fml.relauncher.SideOnly;
    007
    008@SideOnly(Side.CLIENT)
    009public class Face
    010{
    011
    012    public Vertex[] vertices;
    013    public Vertex[] vertexNormals;
    014    public Vertex faceNormal;
    015    public TextureCoordinate[] textureCoordinates;
    016
    017    public void addFaceForRender(Tessellator tessellator)
    018    {
    019        addFaceForRender(tessellator, 0.0005F);
    020    }
    021
    022    public void addFaceForRender(Tessellator tessellator, float textureOffset)
    023    {
    024        if (faceNormal == null)
    025        {
    026            faceNormal = this.calculateFaceNormal();
    027        }
    028
    029        tessellator.setNormal(faceNormal.x, faceNormal.y, faceNormal.z);
    030
    031        float averageU = 0F;
    032        float averageV = 0F;
    033
    034        if ((textureCoordinates != null) && (textureCoordinates.length > 0))
    035        {
    036            for (int i = 0; i < textureCoordinates.length; ++i)
    037            {
    038                averageU += textureCoordinates[i].u;
    039                averageV += textureCoordinates[i].v;
    040            }
    041
    042            averageU = averageU / textureCoordinates.length;
    043            averageV = averageV / textureCoordinates.length;
    044        }
    045
    046        float offsetU, offsetV;
    047
    048        for (int i = 0; i < vertices.length; ++i)
    049        {
    050
    051            if ((textureCoordinates != null) && (textureCoordinates.length > 0))
    052            {
    053                offsetU = textureOffset;
    054                offsetV = textureOffset;
    055
    056                if (textureCoordinates[i].u > averageU)
    057                {
    058                    offsetU = -offsetU;
    059                }
    060                if (textureCoordinates[i].v > averageV)
    061                {
    062                    offsetV = -offsetV;
    063                }
    064
    065                tessellator.addVertexWithUV(vertices[i].x, vertices[i].y, vertices[i].z, textureCoordinates[i].u + offsetU, textureCoordinates[i].v + offsetV);
    066            }
    067            else
    068            {
    069                tessellator.addVertex(vertices[i].x, vertices[i].y, vertices[i].z);
    070            }
    071        }
    072    }
    073
    074    public Vertex calculateFaceNormal()
    075    {
    076        Vec3 v1 = Vec3.createVectorHelper(vertices[1].x - vertices[0].x, vertices[1].y - vertices[0].y, vertices[1].z - vertices[0].z);
    077        Vec3 v2 = Vec3.createVectorHelper(vertices[2].x - vertices[0].x, vertices[2].y - vertices[0].y, vertices[2].z - vertices[0].z);
    078        Vec3 normalVector = null;
    079
    080        normalVector = v1.crossProduct(v2).normalize();
    081
    082        return new Vertex((float) normalVector.xCoord, (float) normalVector.yCoord, (float) normalVector.zCoord);
    083    }
    084}