159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta/* 259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Copyright (c) 2009-2010 jMonkeyEngine 359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * All rights reserved. 459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Redistribution and use in source and binary forms, with or without 659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * modification, are permitted provided that the following conditions are 759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * met: 859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * * Redistributions of source code must retain the above copyright 1059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * notice, this list of conditions and the following disclaimer. 1159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 1259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * * Redistributions in binary form must reproduce the above copyright 1359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * notice, this list of conditions and the following disclaimer in the 1459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * documentation and/or other materials provided with the distribution. 1559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 1659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * * Neither the name of 'jMonkeyEngine' nor the names of its contributors 1759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * may be used to endorse or promote products derived from this software 1859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * without specific prior written permission. 1959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 2059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 2259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 2359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 2459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 2559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 2659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 2759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 2859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 2959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 3059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 3259b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartapackage com.jme3.math; 3359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 3459b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.export.JmeExporter; 3559b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.export.JmeImporter; 3659b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.export.Savable; 3759b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.io.IOException; 3859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 3959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta/** 4059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * <code>Triangle</code> defines an object for containing triangle information. 4159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * The triangle is defined by a collection of three {@link Vector3f} 4259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * objects. 4359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 4459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @author Mark Powell 4559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @author Joshua Slack 4659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 4759b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartapublic class Triangle extends AbstractTriangle implements Savable, java.io.Serializable { 4859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 4959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta static final long serialVersionUID = 1; 5059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 5159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private Vector3f pointa = new Vector3f(); 5259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private Vector3f pointb = new Vector3f(); 5359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private Vector3f pointc = new Vector3f(); 5459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private transient Vector3f center; 5559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private transient Vector3f normal; 5659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private float projection; 5759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private int index; 5859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 5959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public Triangle() { 6059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 6159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 6259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 6359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Constructor instantiates a new <Code>Triangle</code> object with the 6459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * supplied vectors as the points. It is recommended that the vertices 6559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * be supplied in a counter clockwise winding to support normals for a 6659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * right handed coordinate system. 6759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param p1 the first point of the triangle. 6859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param p2 the second point of the triangle. 6959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param p3 the third point of the triangle. 7059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 7159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public Triangle(Vector3f p1, Vector3f p2, Vector3f p3) { 7259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta pointa.set(p1); 7359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta pointb.set(p2); 7459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta pointc.set(p3); 7559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 7659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 7759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 7859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 7959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * <code>get</code> retrieves a point on the triangle denoted by the index 8059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * supplied. 8159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param i the index of the point. 8259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @return the point. 8359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 8459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public Vector3f get(int i) { 8559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta switch (i) { 8659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case 0: 8759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return pointa; 8859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case 1: 8959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return pointb; 9059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case 2: 9159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return pointc; 9259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta default: 9359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return null; 9459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 9559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 9659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 9759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public Vector3f get1() { 9859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return pointa; 9959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 10059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 10159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public Vector3f get2() { 10259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return pointb; 10359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 10459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 10559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public Vector3f get3() { 10659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return pointc; 10759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 10859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 10959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 11059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 11159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * <code>set</code> sets one of the triangle's points to that specified as 11259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * a parameter. 11359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param i the index to place the point. 11459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param point the point to set. 11559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 11659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void set(int i, Vector3f point) { 11759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta switch (i) { 11859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case 0: 11959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta pointa.set(point); 12059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 12159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case 1: 12259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta pointb.set(point); 12359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 12459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case 2: 12559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta pointc.set(point); 12659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 12759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 12859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 12959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 13059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 13159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 13259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * <code>set</code> sets one of the triangle's points to that specified as 13359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * a parameter. 13459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param i the index to place the point. 13559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 13659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void set(int i, float x, float y, float z) { 13759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta switch (i) { 13859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case 0: 13959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta pointa.set(x, y, z); 14059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 14159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case 1: 14259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta pointb.set(x, y, z); 14359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 14459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case 2: 14559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta pointc.set(x, y, z); 14659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 14759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 14859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 14959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 15059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void set1(Vector3f v) { 15159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta pointa.set(v); 15259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 15359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 15459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void set2(Vector3f v) { 15559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta pointb.set(v); 15659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 15759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 15859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void set3(Vector3f v) { 15959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta pointc.set(v); 16059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 16159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 16259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void set(Vector3f v1, Vector3f v2, Vector3f v3) { 16359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta pointa.set(v1); 16459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta pointb.set(v2); 16559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta pointc.set(v3); 16659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 16759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 16859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 16959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * calculateCenter finds the average point of the triangle. 17059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 17159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 17259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void calculateCenter() { 17359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (center == null) { 17459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta center = new Vector3f(pointa); 17559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } else { 17659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta center.set(pointa); 17759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 17859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta center.addLocal(pointb).addLocal(pointc).multLocal(FastMath.ONE_THIRD); 17959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 18059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 18159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 18259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * calculateNormal generates the normal for this triangle 18359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 18459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 18559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void calculateNormal() { 18659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (normal == null) { 18759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta normal = new Vector3f(pointb); 18859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } else { 18959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta normal.set(pointb); 19059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 19159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta normal.subtractLocal(pointa).crossLocal(pointc.x - pointa.x, pointc.y - pointa.y, pointc.z - pointa.z); 19259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta normal.normalizeLocal(); 19359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 19459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 19559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 19659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * obtains the center point of this triangle (average of the three triangles) 19759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @return the center point. 19859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 19959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public Vector3f getCenter() { 20059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (center == null) { 20159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta calculateCenter(); 20259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 20359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return center; 20459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 20559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 20659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 20759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * sets the center point of this triangle (average of the three triangles) 20859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param center the center point. 20959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 21059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setCenter(Vector3f center) { 21159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.center = center; 21259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 21359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 21459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 21559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * obtains the unit length normal vector of this triangle, if set or 21659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * calculated 21759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 21859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @return the normal vector 21959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 22059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public Vector3f getNormal() { 22159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (normal == null) { 22259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta calculateNormal(); 22359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 22459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return normal; 22559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 22659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 22759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 22859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * sets the normal vector of this triangle (to conform, must be unit length) 22959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param normal the normal vector. 23059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 23159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setNormal(Vector3f normal) { 23259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.normal = normal; 23359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 23459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 23559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 23659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * obtains the projection of the vertices relative to the line origin. 23759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @return the projection of the triangle. 23859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 23959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public float getProjection() { 24059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return this.projection; 24159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 24259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 24359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 24459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * sets the projection of the vertices relative to the line origin. 24559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param projection the projection of the triangle. 24659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 24759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setProjection(float projection) { 24859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.projection = projection; 24959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 25059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 25159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 25259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * obtains an index that this triangle represents if it is contained in a OBBTree. 25359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @return the index in an OBBtree 25459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 25559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public int getIndex() { 25659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return index; 25759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 25859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 25959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 26059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * sets an index that this triangle represents if it is contained in a OBBTree. 26159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param index the index in an OBBtree 26259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 26359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setIndex(int index) { 26459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.index = index; 26559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 26659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 26759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public static Vector3f computeTriangleNormal(Vector3f v1, Vector3f v2, Vector3f v3, Vector3f store) { 26859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (store == null) { 26959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta store = new Vector3f(v2); 27059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } else { 27159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta store.set(v2); 27259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 27359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 27459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta store.subtractLocal(v1).crossLocal(v3.x - v1.x, v3.y - v1.y, v3.z - v1.z); 27559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return store.normalizeLocal(); 27659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 27759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 27859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void write(JmeExporter e) throws IOException { 27959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta e.getCapsule(this).write(pointa, "pointa", Vector3f.ZERO); 28059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta e.getCapsule(this).write(pointb, "pointb", Vector3f.ZERO); 28159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta e.getCapsule(this).write(pointc, "pointc", Vector3f.ZERO); 28259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 28359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 28459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void read(JmeImporter e) throws IOException { 28559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta pointa = (Vector3f) e.getCapsule(this).readSavable("pointa", Vector3f.ZERO.clone()); 28659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta pointb = (Vector3f) e.getCapsule(this).readSavable("pointb", Vector3f.ZERO.clone()); 28759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta pointc = (Vector3f) e.getCapsule(this).readSavable("pointc", Vector3f.ZERO.clone()); 28859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 28959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 29059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta @Override 29159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public Triangle clone() { 29259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta try { 29359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Triangle t = (Triangle) super.clone(); 29459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta t.pointa = pointa.clone(); 29559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta t.pointb = pointb.clone(); 29659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta t.pointc = pointc.clone(); 29759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return t; 29859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } catch (CloneNotSupportedException e) { 29959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta throw new AssertionError(); 30059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 30159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 30259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta} 303