/* Stockage d'une lumiere ponctuelle */ /* */ /* Auteur: Nicolas JANEY */ /* nicolas.janey@univ-fcomte.fr */ /* Novembre 2012 */ #include #include #include #include "LumierePonctuelle.h" #include "Pos3D.h" #include "Dir3D.h" #include "Energie.h" #include "Couleur.h" /* Constructeurs */ LumierePonctuelle::LumierePonctuelle(void):Lumiere() { p = new Pos3D(); attenuation = false; } LumierePonctuelle::LumierePonctuelle(LumierePonctuelle *lp):Lumiere(lp) { p = new Pos3D(lp->p); attenuation = lp->attenuation; } /* Destructeur */ LumierePonctuelle::~LumierePonctuelle(void) { delete(p); } ////////////////////////////////////////////// /* Methode de calcul de la quantite */ /* d'energie diffusee en un point p */ /* de normale n et de coefficient */ /* de diffusion kd */ void LumierePonctuelle::energieDiffusee(Energie *e,Pos3D *p,Dir3D *n,Couleur *kd) { if ( !on ) { e->r = 0.0; e->v = 0.0; e->b = 0.0; return; } Dir3D nm(n); Dir3D dm(p,this->p); nm.normalisation(); double dist = dm.normalisation(); double ps = nm.produitScalaire(&dm); if ( ps < 0.0 ) { e->r = 0.0; e->v = 0.0; e->b = 0.0; } else { e->r = intensite*c->r*ps*kd->r; e->v = intensite*c->v*ps*kd->v; e->b = intensite*c->b*ps*kd->b; if ( attenuation ) { e->r /= (dist*dist); e->v /= (dist*dist); e->b /= (dist*dist); } } } ////////////////////////////////////////////// /* Methode d'affichage texte */ void LumierePonctuelle::print(void) { Lumiere::print(); printf(" - "); p->print(); printf(" - %d",attenuation); }