import javax.media.j3d.*;
import javax.vecmath.*;
import javax.swing.*;

public class Cube extends myShape
{
    private int noFaces=6;
    private int noVertices=8;
    QuadArray cube=new QuadArray(24,QuadArray.COORDINATES|QuadArray.NORMALS|QuadArray.COLOR_3);
    
    private Point3f vertex0=new Point3f(1.0f,-1.0f,1.0f);
        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 vertex5=new Point3f(-1.0f,1.0f,-1.0f);
    private Point3f vertex6=new Point3f(1.0f,1.0f,-1.0f);
    private Point3f vertex7=new Point3f(1.0f,-1.0f,-1.0f);
    
    private Point3f[] triangleVertices= 
    {
        // front face
            vertex0, vertex1, vertex2,
            vertex0, vertex2, vertex3,
        // back face
            vertex4, vertex5, vertex6, 
            vertex4, vertex6, vertex7, 
        // right face
            vertex7, vertex6, vertex1, 
            vertex7, vertex1, vertex0,
        // left face
            vertex3, vertex2, vertex5, 
            vertex3, vertex5, vertex4,
        // top face
            vertex1, vertex6, vertex5, 
            vertex1, vertex5, vertex2,
        // bottom face
            vertex3, vertex4, vertex7, 
            vertex3, vertex7, vertex0
    };
    
    private Point3f[]verts= 
    {
        // front face
            vertex0, 
            vertex1, 
            vertex2, 
            vertex3,
        // back face
            vertex4, 
            vertex5,
            vertex6, 
            vertex7, 
        // right face
            vertex7,
            vertex6,
            vertex1,
            vertex0,
        // left face
            vertex3,
            vertex2,
            vertex5,
            vertex4,
        // top face
            vertex1,
            vertex6,
            vertex5,
            vertex2,
        // bottom face
            vertex3,
            vertex4,
            vertex7,
            vertex0,
    };

    // set the normals
    private Vector3f[]normals= 
    {
            new Vector3f(0.0f,0.0f,1.0f),       // front face
            new Vector3f(0.0f,0.0f,-1.0f),      // back face
            new Vector3f(1.0f,0.0f,0.0f),       // right face
            new Vector3f(-1.0f,0.0f,0.0f),      // left face
            new Vector3f(0.0f,1.0f,0.0f),       // top face
            new Vector3f(0.0f,-1.0f,0.0f),      // bottom face
    };
    
    

    public Cube() 
    {
            super();
            int i;
            
            cube.setCoordinates(0,verts);
            
            // set the normal
        for(i=0;i<24;i++) 
        {
            cube.setNormal(i,normals[i/4]);
        }
        
        // set the colours
        Color3f colour[]=new Color3f[6];
        colour[0]=new Color3f(1.0f, 0.0f, 0.0f);
        colour[1]=new Color3f(0.0f, 1.0f, 0.0f);
        colour[2]=new Color3f(0.0f, 0.0f, 1.0f);
        colour[3]=new Color3f(1.0f, 1.0f, 0.0f);
        colour[4]=new Color3f(0.0f, 1.0f, 1.0f);
        colour[5]=new Color3f(1.0f, 0.0f, 1.0f);
         
        for(i=0;i<24;i++)
        {
            cube.setColor(i,colour[i%6]);
        }
        
        setGeometry(cube);
        setAppearance(new Appearance());
    }
    
    
    public Point3f getTriangleCoordinates(int i)
    {
        return triangleVertices[i];
    }
    
    public String getName()
    {
        return "cube";
    }
    
    public int getNumberTriangles()
    {
        return 12;
    }
}
