import javax.media.j3d.*;
import javax.vecmath.*;
import com.sun.j3d.utils.geometry.GeometryInfo;
import com.sun.j3d.utils.geometry.NormalGenerator;

class Icosahedron extends Shape3D{
	
    private static final int[] sVertCnt = { 3, 11, 5, 4, 5, 4 };

    public Icosahedron(Point3f pos) {
  	    super();
  	    
        GeometryInfo geoInfo = new GeometryInfo(GeometryInfo.TRIANGLE_STRIP_ARRAY);
        geoInfo.setStripCounts(sVertCnt);  	
        // TriangleStripArray ico = new TriangleStripArray(32, GeometryArray.COORDINATES | GeometryArray.COLOR_3 | GeometryArray.NORMALS, sVertCnt);
    
        Point3f verts[] = new Point3f[12];    
        verts[0] = new Point3f(0.0f + pos.x,     1.4f + pos.y,      0.8652f + pos.z);
        verts[1] = new Point3f(0.0f + pos.x,     1.4f + pos.y,     -0.8652f + pos.z);
        verts[2] = new Point3f(1.4f + pos.x,     0.8652f + pos.y,    0.0f + pos.z);
        verts[3] = new Point3f(1.4f + pos.x,    -0.8652f + pos.y,    0.0f + pos.z);
        verts[4] = new Point3f(0.0f + pos.x,    -1.4f + pos.y,     -0.8652f + pos.z);
        verts[5] = new Point3f(0.0f + pos.x,    -1.4f + pos.y,      0.8652f + pos.z);
        verts[6] = new Point3f(0.8652f + pos.x,   0.0f + pos.y,      1.4f + pos.z);
        verts[7] = new Point3f(-0.8652f + pos.x,  0.0f + pos.y,      1.4f + pos.z);
        verts[8] = new Point3f(0.8652f + pos.x,   0.0f + pos.y,     -1.4f + pos.z);
        verts[9] = new Point3f(-0.8652f + pos.x,  0.0f + pos.y,     -1.4f + pos.z);
        verts[10] = new Point3f(-1.4f + pos.x,   0.8652f + pos.y,    0.0f + pos.z);    
        verts[11] = new Point3f(-1.4f + pos.x,  -0.8652f + pos.y,    0.0f + pos.z);
  
        Point3f pnts[] = new Point3f[32];    
        pnts[0] = verts[4];
        pnts[1] = verts[5];
        pnts[2] = verts[11];
    
        pnts[3] = verts[11];
        pnts[4] = verts[5];
        pnts[5] = verts[7];

        pnts[6] = verts[6];

        pnts[7] = verts[0];

        pnts[8] = verts[2];

        pnts[9] = verts[1];

        pnts[10] = verts[8];

        pnts[11] = verts[9];

        pnts[12] = verts[4];

        pnts[13] = verts[11];
    
        pnts[14] = verts[2];
        pnts[15] = verts[6];
        pnts[16] = verts[3];

        pnts[17] = verts[5];

        pnts[18] = verts[4];

        pnts[19] = verts[4];
        pnts[20] = verts[8];
        pnts[21] = verts[3];

        pnts[22] = verts[2];

        pnts[23] = verts[0];
        pnts[24] = verts[1];
        pnts[25] = verts[10];

        pnts[26] = verts[9];

        pnts[27] = verts[11];

        pnts[28] = verts[0];
        pnts[29] = verts[10];
        pnts[30] = verts[7];

        pnts[31] = verts[11];
    
        geoInfo.setCoordinates(pnts);
        

        Color3f colors[] = new Color3f[12];
        colors[0] = new Color3f(1.0f, 0.0f, 0.0f);
        colors[1] = new Color3f(0.0f, 1.0f, 0.0f);
        colors[2] = new Color3f(0.0f, 0.0f, 1.0f);
        colors[3] = new Color3f(1.0f, 1.0f, 0.0f);
        colors[4] = new Color3f(0.0f, 1.0f, 1.0f);
        colors[5] = new Color3f(1.0f, 0.0f, 1.0f);
        colors[6] = new Color3f(0.0f, 0.5f, 0.0f);
        colors[7] = new Color3f(0.0f, 0.0f, 0.5f);
        colors[8] = new Color3f(0.5f, 0.5f, 0.0f);
        colors[9] = new Color3f(0.0f, 0.5f, 0.5f);
        colors[10] = new Color3f(0.5f, 0.0f, 0.5f);
        colors[11] = new Color3f(0.5f, 0.5f, 0.5f);

        Color3f clrs[] = new Color3f[32];
        clrs[0] = colors[4];
        clrs[1] = colors[5];
        clrs[2] = colors[11];
    
        clrs[3] = colors[11];
        clrs[4] = colors[5]; 
        clrs[5] = colors[7];

        clrs[6] = colors[6];

        clrs[7] = colors[0];

        clrs[8] = colors[2];

        clrs[9] = colors[1];

        clrs[10] = colors[8];

        clrs[11] = colors[9];

        clrs[12] = colors[4];

        clrs[13] = colors[11];
    
        clrs[14] = colors[2];
        clrs[15] = colors[6]; 
        clrs[16] = colors[3];

        clrs[17] = colors[5];

        clrs[18] = colors[4];

        clrs[19] = colors[4];
        clrs[20] = colors[8]; 
        clrs[21] = colors[3];

        clrs[22] = colors[2];

        clrs[23] = colors[0];
        clrs[24] = colors[1]; 
        clrs[25] = colors[10];

        clrs[26] = colors[9];

        clrs[27] = colors[11];

        clrs[28] = colors[0];
        clrs[29] = colors[10]; 
        clrs[30] = colors[7];

        clrs[31] = colors[11];
        geoInfo.setColors(clrs);
        
        // Gera Normals    
        NormalGenerator normal = new NormalGenerator();
        normal.generateNormals(geoInfo);

        //Pega a Geometria
        GeometryArray geometry = geoInfo.getGeometryArray();

        this.setGeometry(geometry);    
        this.setAppearance(new Appearance());        
    }
}