import javax.media.j3d.*;
import javax.vecmath.*;
import com.sun.j3d.utils.behaviors.picking.*;

public class Tetrahedron extends myShape 
{    
        private Point3f vertex1=new Point3f(1.0f,1.0f,1.0f);
    private Point3f vertex2=new Point3f(1.0f,-1.0f,-1.0f);
    private Point3f vertex3=new Point3f(-1.0f,-1.0f,1.0f);
    private Point3f vertex4=new Point3f(-1.0f,1.0f,-1.0f);
    
    private Point3f[] vertices= 
    {
            vertex1, vertex2, vertex4,  // front face
            vertex1, vertex4, vertex3,  // left, back face
            vertex2, vertex3, vertex4,  // right, back face
            vertex1, vertex3, vertex2,  // bottom face
    };

    private Point2f texCoord[] = 
    {
        new Point2f(0.0f, 0.0f),
            new Point2f(1.0f, 0.0f),
        new Point2f(0.5f,((float)Math.sqrt(3.0))/2.0f),
    };

    public Tetrahedron() 
    {
            int i;

            TriangleArray tetra=new TriangleArray(12,TriangleArray.COORDINATES|
                TriangleArray.NORMALS|TriangleArray.TEXTURE_COORDINATE_2|TriangleArray.COLOR_3);
                   
                // set the vertex points                
            tetra.setCoordinates(0,vertices);
        for (i = 0; i < 12; i++) 
        {
            tetra.setTextureCoordinate(i,texCoord[i%3]);
        }
        
        // set the colours
        tetra.setColor(0,new Color3f(1.0f,0.0f,0.0f));
        tetra.setColor(1,new Color3f(0.0f,1.0f,0.0f));
        tetra.setColor(2,new Color3f(0.0f,0.0f,1.0f));
        tetra.setColor(3,new Color3f(1.0f,1.0f,0.0f));
        tetra.setColor(4,new Color3f(0.0f,1.0f,1.0f));
        tetra.setColor(5,new Color3f(1.0f,0.0f,1.0f));
        tetra.setColor(6,new Color3f(1.0f,0.0f,0.0f));
        tetra.setColor(7,new Color3f(0.0f,1.0f,0.0f));
        tetra.setColor(8,new Color3f(0.0f,0.0f,1.0f));
        tetra.setColor(9,new Color3f(1.0f,1.0f,0.0f));
        tetra.setColor(10,new Color3f(0.0f,1.0f,1.0f));
        tetra.setColor(11,new Color3f(1.0f,0.0f,1.0f));
         
        // set the normals
            int face;
            Vector3f normal=new Vector3f();
            Vector3f vector1=new Vector3f();
            Vector3f vector2=new Vector3f();
            Point3f [] points=new Point3f[3];
            for(i=0;i<3;i++)points[i]=new Point3f();

            for(face=0;face<4;face++) 
            {
                tetra.getCoordinates(face*3,points);
                vector1.sub(points[1],points[0]);
                vector2.sub(points[2],points[0]);
                normal.cross(vector1,vector2);
                normal.normalize();
                for (i=0;i<3;i++) 
                {
                        tetra.setNormal((face*3+i),normal);
                }
            }
            
            // create the shape
            Appearance thisAppearance=new Appearance();
            this.setGeometry(tetra);
            this.setAppearance(thisAppearance);
    }
    
    public Point3f getTriangleCoordinates(int i)
    {
        return vertices[i];
    }  
    
    public String getName()
    {
        return "tetrahedron";
    }
    
    public int getNumberTriangles()
    {
        return vertices.length/3;
    }
}
