var ProgessiveSphere = function(loader, res) {
    Displayable.call(this);
    this.started = false;
    this.finished = false;
    this.wasFinished = false;
    this.begin = false;
    this.addedToScene = false;

    if (res === undefined)
        res = 5;

    (function(self) {
        loader.load(static_path + 'data/spheres/' + res + '.obj', function(object) {
            object.traverse(function(child) {
                if (child instanceof THREE.Mesh) {
                    child.up = new THREE.Vector3(0,0,1);
                    self.totalMesh = child;
                    self.geometry = new THREE.Geometry();
                    self.material = new THREE.MeshLambertMaterial();
                    self.material.color.setRGB(1,0,0);
                    self.material.side = THREE.DoubleSide;
                    self.mesh = new THREE.Mesh(self.geometry, self.material);
                    self.current_face = 0;
                    self.started = true;
                    self.begin = true;
                    self.addToScene(scene);
                }
            });
        });
    })(this);

}
ProgessiveSphere.prototype = Object.create(Displayable.prototype);
ProgessiveSphere.prototype.constructor = ProgessiveSphere;

ProgessiveSphere.prototype.addFace = function() {
    if (this.started && this.begin && this.addedToScene) {
        if (this.current_face < this.totalMesh.geometry.attributes.position.array.length / 3) {

            // Add the 3 new vertices
            this.geometry.vertices.push(new THREE.Vector3(
                this.totalMesh.geometry.attributes.position.array[3*this.current_face],
                this.totalMesh.geometry.attributes.position.array[3*this.current_face+1],
                this.totalMesh.geometry.attributes.position.array[3*this.current_face+2]
            ));

            this.geometry.vertices.push(new THREE.Vector3(
                this.totalMesh.geometry.attributes.position.array[3*this.current_face+3],
                this.totalMesh.geometry.attributes.position.array[3*this.current_face+4],
                this.totalMesh.geometry.attributes.position.array[3*this.current_face+5]
            ));

            this.geometry.vertices.push(new THREE.Vector3(
                this.totalMesh.geometry.attributes.position.array[3*this.current_face+6],
                this.totalMesh.geometry.attributes.position.array[3*this.current_face+7],
                this.totalMesh.geometry.attributes.position.array[3*this.current_face+8]
            ));

            // Add the new face
            this.geometry.faces.push(new THREE.Face3(
                this.geometry.vertices.length-3,
                this.geometry.vertices.length-2,
                this.geometry.vertices.length-1
            ));

            // Update the stuff
            this.geometry.mergeVertices();
            this.geometry.computeFaceNormals();
            this.geometry.computeVertexNormals();
            this.current_face += 3;
            this.geometry.elementsNeedUpdate = true;
            this.geometry.normalsNeedUpdate = true;
            this.geometry.verticesNeedUpdate = true;
            this.geometry.groupsNeedUpdate = true;
        } else {
            this.finished = true;
        }
    }

    if (!this.wasFinished && this.finished) {
        this.wasFinished = true;
        console.log("Finished reconstructing the mesh !");
    }
}

ProgessiveSphere.prototype.addToScene = function(scene) {
    Displayable.prototype.addToScene.call(this, scene);
    this.addedToScene = true;
}
