/* Stockage d'une lumiere ponctuelle */ /* */ /* Auteur: Nicolas JANEY */ /* nicolas.janey@univ-fcomte.fr */ /* Novembre 2012 */ #include #include #include #include "LumierePonctuelle.h" #include "Position3D.h" #include "Direction3D.h" #include "Energie.h" #include "Couleur.h" /* Constructeurs */ LumierePonctuelle::LumierePonctuelle(void):Lumiere() { p = new Position3D(); attenuation = false; } LumierePonctuelle::LumierePonctuelle(LumierePonctuelle *lp):Lumiere(lp) { p = new Position3D(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,Position3D *p,Direction3D *n,Couleur *kd) { if ( !on ) { e->r = 0.0; e->v = 0.0; e->b = 0.0; return; } Direction3D *nm = new Direction3D(n); Direction3D *dm = new Direction3D(p,this->p); nm->normalisation(); double dist = dm->normalisation(); double ps = nm->produitScalaire(dm); delete(nm); delete(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); }