class OrbitalLobular extends OrbitalAncestral {

	antesCriar() {
	   super.antesCriar();
	   this.config = {numPartes: 10,numPartesCone: 8,numPartesEsfera: 2};
	   this.alturaCone = this.raio / this.config.numPartes * this.config.numPartesCone;
	   this.raioEsfera = this.raio/ this.config.numPartes * this.config.numPartesEsfera;
	   this.meioRaio = this.raio / 2;
	   this.criarEixosDirecoes();
	   this.geometriaCone = this.cenario.criarGeometriaCone(this.raioEsfera,0,this.alturaCone,128,128,true,doisPi,doisPi,this);
	   this.geometriaEsfera = this.cenario.criarGeometriaEsfera(this.raioEsfera,128,128,0,doisPi,0,meioPi,this);
	   this.geometriaTorus = undefined;
	}

	criarEixosDirecoes() {
	}

	criarLobulo(criarTorus) {
	   this.lobulo = new THREE.Object3D();
	   this.lobulo.cone = this.adicionar(this.lobulo,this.criarConeLobulo());
	   this.lobulo.esfera = this.adicionar(this.lobulo,this.criarEsferaLobulo());
	   var yc = this.meioRaio - (this.raioEsfera / 2);
	   this.lobulo.cone.position.y = yc;
	   this.lobulo.esfera.position.y = yc + (this.alturaCone / 2);
	   if (criarTorus) {
		  this.lobulo.torus = this.adicionar(this.lobulo,this.criarTorus());
	   } else {
		  this.lobulo.torus = undefined
	   }
	   return this.lobulo;
	}

	criarLobulos(angulos,torus) {
	   for (var i = 0; i < angulos.length; i++) {
		  var lobulo = this.criarLobulo(torus);
		  lobulo.rotation.z = angulos[i];
		  this.AdicionarNaNuvem(lobulo);
	   }
	}

	preparar() {
	   super.preparar();
	   var aux = this.eixosDirecoes[this.numEletronsOrbital-1];
	   this.eixo = aux[0];
	   this.direcao = aux[1];
	}

	criarNuvem() {
	   super.criarNuvem();
	}

	duranteDestruirNuvem() {
	   super.duranteDestruirNuvem();
	   for (var i = (this.nuvem.length-1); i >= 0; i--) {
		  var lobulo = this.nuvem[i];
		  this.remover(lobulo,lobulo.cone);
		  lobulo.cone = undefined;
		  this.remover(lobulo,lobulo.esfera);      
		  lobulo.esfera = undefined;
		  if (lobulo.torus) {
			 this.remover(lobulo,lobulo.torus);
			 lobulo.torus = undefined;
		  }
		  this.remover(this.orbital3d,lobulo);
		  this.nuvem[i] = undefined;
		  this.nuvem.pop();
	   }
	}

	rotacionar() {
	   super.rotacionar();
	   this.orbital3d.rotation.set(0,0,0);
	}

	movimentarEletrons() {
	   // if (this.nuvem.length < 3) return;
	   super.movimentarEletrons();
	   var lobulo = this.nuvem[this.proximo++];
	   if (this.proximo === this.nuvem.length) this.proximo = 0;
	   var eletron = this.eletrons[0];
	   var eletron3d = eletron.obterEletron3d();
	   eletron3d.rotation.copy(lobulo.rotation);
	   eletron3d.malha.position.y = Math.random() * this.raio;
	   eletron3d.malha.position.x = (eletron3d.malha.position.y > this.alturaCone) ?
		  (Math.cos(Math.asin((eletron3d.malha.position.y - this.alturaCone) / this.raioEsfera)) * this.raioEsfera) : 
		  (eletron3d.malha.position.y * this.raioEsfera) / this.raio;
	   eletron3d.rotation.y = Math.random() * doisPi;
	}

	criarEsferaLobulo(raio) {
	   return this.cenario.criarMalha(this.geometriaEsfera,this.material[0],this);
	   //return new THREE.Mesh(this.geometriaEsfera,this.material[0]);
	}

	criarConeLobulo() {
	   return this.cenario.criarMalha(this.geometriaCone,this.material[1],this);
	   //return new THREE.Mesh(this.geometriaCone,this.material[1]);
	}

	criarTorus() {
	   var raioTorusInterno = this.raio / 20;
	   var raioTorusExterno = raioTorusInterno * 2;
	   var distanciaTorus = -raioTorusInterno;
	   if (!this.geometriaTorus)
		  this.geometriaTorus = this.cenario.criarGeometriaTorus(raioTorusExterno,raioTorusInterno,128,128,/*Math.PI*/doisPi,this);
	   return this.cenario.criarMalha(this.geometriaTorus,this.material[0],this);
	   //var torus = new THREE.Mesh(this.geometriaTorus,this.material[0]);
	   torus.position.y = distanciaTorus;
	   torus.rotation.x = meioPi;
	   return torus;
	}
}