org.jtrfp.trcl.Triangle.java Source code

Java tutorial

Introduction

Here is the source code for org.jtrfp.trcl.Triangle.java

Source

/*******************************************************************************
 * This file is part of TERMINAL RECALL
 * Copyright (c) 2012-2014 Chuck Ritola
 * Part of the jTRFP.org project
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the GNU Public License v3.0
 * which accompanies this distribution, and is available at
 * http://www.gnu.org/licenses/gpl.html
 * 
 * Contributors:
 *     chuck - initial API and implementation
 ******************************************************************************/
package org.jtrfp.trcl;

import org.apache.commons.math3.geometry.euclidean.threed.Vector3D;
import org.apache.commons.math3.geometry.euclidean.twod.Vector2D;
import org.jtrfp.trcl.core.TRFutureTask;
import org.jtrfp.trcl.core.TextureDescription;
import org.jtrfp.trcl.gpu.Vertex;

public class Triangle {
    private Vertex[] vertices = new Vertex[3];
    private Vector2D[] uv = new Vector2D[3];
    private RenderMode renderMode;
    private boolean isAlphaBlended = false;
    private Vector3D centroidNormal;
    private final StackTraceElement[] creationStackTrace;

    public final TextureDescription texture;
    public static boolean debugTriangles = false;

    public Triangle(TextureDescription texture) {
        if (debugTriangles)
            creationStackTrace = new Exception().getStackTrace();
        else
            creationStackTrace = null;
        this.texture = texture;
    }

    public Triangle(Vertex[] vertices, TextureDescription texture) {
        this(texture);
        setVertex(vertices[0], 0);
        setVertex(vertices[1], 1);
        setVertex(vertices[2], 2);
    }

    public static Triangle[] quad2Triangles(Vertex[] vertices, Vector2D[] uvs, TextureDescription texture,
            RenderMode mode, boolean hasAlpha, Vector3D centroidNormal, String debugName) {
        return quad2Triangles(vertices, uvs, texture, mode, hasAlpha, centroidNormal, new Triangle[2], 0,
                debugName);
    }

    public static Triangle[] quad2Triangles(double[] x, double[] y, double[] z, double[] u, double[] v,
            TextureDescription texture, RenderMode mode, Vector3D[] normals, int ringRotation, Triangle[] dest,
            int destOffset) {
        return quad2Triangles(x, y, z, u, v, texture, mode, false, normals, ringRotation, dest, destOffset);
    }

    public void setVertex(Vertex vtx, int index) {
        if (vertices[index] != null) {
            vertices[index].removeTriangle(this);
        }
        vertices[index] = vtx;
        vtx.addTriangle(this);
    }// end setVertex(...)

    public void setUV(Vector2D uv, int index) {
        this.uv[index] = uv;
    }

    public void setUVNoCopy(Vector2D[] uv) {
        this.uv = uv;
    }

    public void setUVCopy(Vector2D[] uv) {
        for (int i = 0; i < 3; i++) {
            this.uv[i] = uv[i];
        }
    }// end setUVCopy

    public Vector2D getUV(int index) {
        return this.uv[index];
    }

    public static Triangle[] quad2Triangles(Vertex[] vertices, Vector2D[] uv, TextureDescription texture,
            RenderMode mode, boolean hasAlpha, Triangle[] dest, int destOffset) {
        Triangle t;
        t = new Triangle(texture);
        t.setRenderMode(mode);
        t.setAlphaBlended(hasAlpha);
        t.setVertex(vertices[0], 0);
        t.setVertex(vertices[1], 1);
        t.setVertex(vertices[2], 2);
        t.setUV(uv[0], 0);
        t.setUV(uv[1], 1);
        t.setUV(uv[2], 2);
        dest[0 + destOffset] = t;
        t = new Triangle(texture);
        t.setRenderMode(mode);
        t.setAlphaBlended(hasAlpha);

        t.setVertex(vertices[2], 0);
        t.setVertex(vertices[3], 1);
        t.setVertex(vertices[0], 2);
        t.setUV(uv[2], 0);
        t.setUV(uv[3], 1);
        t.setUV(uv[0], 2);
        dest[1 + destOffset] = t;
        return dest;
    }

    public static Triangle[] quad2Triangles(Vertex[] vertices, Vector2D[] uv, TextureDescription texture,
            RenderMode mode, boolean hasAlpha, Vector3D centroidNormal, Triangle[] dest, int destOffset,
            String debugName) {
        Triangle t;
        t = new Triangle(texture);
        t.setRenderMode(mode);
        t.setAlphaBlended(hasAlpha);
        t.setVertex(vertices[0], 0);
        t.setVertex(vertices[1], 1);
        t.setVertex(vertices[2], 2);
        t.setUV(uv[0], 0);
        t.setUV(uv[1], 1);
        t.setUV(uv[2], 2);
        t.setCentroidNormal(centroidNormal);
        dest[0 + destOffset] = t;
        t = new Triangle(texture);
        t.setRenderMode(mode);
        t.setAlphaBlended(hasAlpha);

        t.setVertex(vertices[2], 0);
        t.setVertex(vertices[3], 1);
        t.setVertex(vertices[0], 2);
        t.setUV(uv[2], 0);
        t.setUV(uv[3], 1);
        t.setUV(uv[0], 2);
        t.setCentroidNormal(centroidNormal);
        dest[1 + destOffset] = t;
        return dest;
    }

    public static Triangle[] quad2Triangles(double[] x, double[] y, double[] z, double[] u, double[] v,
            TextureDescription texture, RenderMode mode, boolean hasAlpha, Vector3D centroidNormal,
            String debugName) {
        return quad2Triangles(x, y, z, u, v, texture, mode, hasAlpha, centroidNormal, new Triangle[2], 0,
                debugName);
    }

    /**
     * Converts supplied quad coordinates to a pair of triangles in clockwise
     * order, top-left being index zero.
     * 
     */
    public static Triangle[] quad2Triangles(double[] x, double[] y, double[] z, double[] u, double[] v,
            TextureDescription texture, RenderMode mode, boolean hasAlpha, Vector3D centroidNormal, Triangle[] dest,
            int destOffset, String debugName) {
        final Vertex[] vertices = new Vertex[] { new Vertex().setPosition(new Vector3D(x[0], y[0], z[0])),
                new Vertex().setPosition(new Vector3D(x[1], y[1], z[1])),
                new Vertex().setPosition(new Vector3D(x[2], y[2], z[2])),
                new Vertex().setPosition(new Vector3D(x[3], y[3], z[3])), };
        Vector2D[] uvs = new Vector2D[4];
        for (int i = 0; i < 4; i++) {
            uvs[i] = new Vector2D(u[i], v[i]);
        }
        return quad2Triangles(vertices, uvs, texture, mode, hasAlpha, centroidNormal, dest, destOffset, debugName);
    }// end quad2Triangles(...)

    public static Triangle[] quad2Triangles(double[] x, double[] y, double[] z, double[] u, double[] v,
            TextureDescription texture, RenderMode mode, boolean hasAlpha, Vector3D[] normals, int ringRotation) {
        return quad2Triangles(x, y, z, u, v, texture, mode, hasAlpha, normals, ringRotation, new Triangle[2], 0);
    }

    /**
     * Converts supplied quad coordinates to a pair of triangles in clockwise
     * order, top-left being index zero+ringRotation.
     * 
     * @param ringRotation
     * 
     */
    public static Triangle[] quad2Triangles(double[] x, double[] y, double[] z, double[] u, double[] v,
            TextureDescription texture, RenderMode mode, boolean hasAlpha, Vector3D[] normals, int ringRotation,
            Triangle[] dest, int destOffset) {
        final Vertex[] vertices = new Vertex[] {
                new Vertex().setPosition(new Vector3D(x[(0 + ringRotation) % 4], y[(0 + ringRotation) % 4],
                        z[(0 + ringRotation) % 4])).setNormal(normals[(0 + ringRotation) % 4]),
                new Vertex().setPosition(new Vector3D(x[(1 + ringRotation) % 4], y[(1 + ringRotation) % 4],
                        z[(1 + ringRotation) % 4])).setNormal(normals[(1 + ringRotation) % 4]),
                new Vertex().setPosition(new Vector3D(x[(2 + ringRotation) % 4], y[(2 + ringRotation) % 4],
                        z[(2 + ringRotation) % 4])).setNormal(normals[(2 + ringRotation) % 4]),
                new Vertex().setPosition(new Vector3D(x[(3 + ringRotation) % 4], y[(3 + ringRotation) % 4],
                        z[(3 + ringRotation) % 4])).setNormal(normals[(3 + ringRotation) % 4]), };
        Vector2D[] uvs = new Vector2D[4];
        for (int i = 0; i < 4; i++) {
            final int rotI = (i + ringRotation) % 4;
            uvs[i] = new Vector2D(u[rotI], v[rotI]);
        }
        return quad2Triangles(vertices, uvs, texture, mode, hasAlpha, dest, destOffset);
    }// end quad2Triangles(...)

    /**
     * @return the renderMode
     */
    public RenderMode getRenderMode() {
        return renderMode;
    }

    /**
     * @param renderMode
     *            the renderMode to set
     */
    public void setRenderMode(RenderMode renderMode) {
        this.renderMode = renderMode;
    }

    /**
     * @return the isAlphaBlended
     */
    public boolean isAlphaBlended() {
        return isAlphaBlended;
    }

    /**
     * @param isAlphaBlended
     *            the isAlphaBlended to set
     */
    public void setAlphaBlended(boolean isAlphaBlended) {
        this.isAlphaBlended = isAlphaBlended;
    }

    /**
     * @return the vertices
     */
    public Vertex[] getVertices() {
        return vertices;
    }

    /**
     * @param vertices
     *            the vertices to set
     */
    public void setVertices(Vertex[] vertices) {
        this.vertices = vertices;
    }

    /**
     * @return the centroidNormal
     */
    public Vector3D getCentroidNormal() {
        return centroidNormal;
    }

    /**
     * @param centroidNormal
     *            the centroidNormal to set
     */
    public void setCentroidNormal(Vector3D centroidNormal) {
        this.centroidNormal = centroidNormal;
    }

    public static Triangle[] quad2Triangles(double[] x, double[] y, double[] z, double[] u, double[] v,
            TextureDescription texture, RenderMode renderMode, Vector3D[] normals, int ringRotation) {
        return quad2Triangles(x, y, z, u, v, texture, renderMode, normals, ringRotation, new Triangle[2], 0);
    }

    public static Triangle[] quad2Triangles(double[] x, double[] y, double[] z, double[] u, double[] v,
            TextureDescription texture, RenderMode renderMode, Vector3D centroidNormal, String debugName) {
        return quad2Triangles(x, y, z, u, v, texture, renderMode, false, centroidNormal, new Triangle[2], 0,
                debugName);
    }

    /**
     * @return the creationStackTrace
     */
    public StackTraceElement[] getCreationStackTrace() {
        return creationStackTrace;
    }
}// Triangle