/*
 * Sphere.java
 *
 * Alex S.
 */

/**
 * Sphere
 */
public class Sphere extends Shape {

    /**
     * make a globe sphere mesh
     *
     * @param m Horizontal splits.
     * @param n Vertical Splits.
     */
    public float[][][] globeMesh(int m,int n){
        float mesh[][][] = new float[m][n][3];
        for (int i = 0 ; i < m ; i++){
            for (int j = 0 ; j < n ; j++) {
                float u = (float)(i / (m - 1.0));
                float v = (float)(j / (n - 1.0));
                float theta = (float)(2.0 * Math.PI * u);
                float phi = (float)(Math.PI * v - Math.PI/2.0);
                mesh[i][j][0] = (float)(Math.cos(theta) * Math.cos(phi));
                mesh[i][j][1] = (float)(Math.sin(theta) * Math.cos(phi));
                mesh[i][j][2] = (float)(Math.sin(phi));
            }
        }
        return mesh;
    }

    /**
     * spheres
     */
    public Sphere (Material m){
        super(m);
         
        int detail = 32;
       
        float[][][] mesh = globeMesh(detail,detail);

        faces = new int[(detail-1)*(detail-1)][4];
        for(int i=0;i<mesh.length-1;i++){
            for(int j=0;j<mesh[i].length-1;j++){
                faces[i*(detail-1)+j][0] = i * detail + j;
                faces[i*(detail-1)+j][1] = (i+1) * detail + j;
                faces[i*(detail-1)+j][2] = (i+1) * detail + (j+1);
                faces[i*(detail-1)+j][3] = i * detail + j+1;
            }
        }

        vertices = new float[detail*detail][6];
        for(int i=0;i<mesh.length;i++){
            for(int j=0;j<mesh[i].length;j++){
                vertices[i*detail+j][0] = mesh[i][j][0];
                vertices[i*detail+j][1] = mesh[i][j][1];
                vertices[i*detail+j][2] = mesh[i][j][2];
                vertices[i*detail+j][3] = mesh[i][j][0];
                vertices[i*detail+j][4] = mesh[i][j][1];
                vertices[i*detail+j][5] = mesh[i][j][2];
            }
        }
        
        verticest = new float[vertices.length][6];        
    }

}




