/* Stockage d'une lumiere directionnelle    */
/*                                          */
/* Auteur: Nicolas JANEY                    */
/* nicolas.janey@univ-fcomte.fr             */
/* Novembre 2012                            */

#include <stdlib.h>
#include <stdio.h>
#include <math.h>

#include "LumiereDirectionnelle.h"
#include "Direction3D.h"
#include "Energie.h"
#include "Couleur.h"

/* Constructeurs                            */
LumiereDirectionnelle::LumiereDirectionnelle(void):Lumiere() {
  d = new Direction3D(0.0,0.0,-1.0);
}

LumiereDirectionnelle::LumiereDirectionnelle(LumiereDirectionnelle *ld):Lumiere(ld) {
  d = new Direction3D(ld->d);
}

/* Destructeur                              */
LumiereDirectionnelle::~LumiereDirectionnelle(void) {
  delete(d);
}

//////////////////////////////////////////////

/* Methode de calcul de la quantite         */
/* d'energie diffusee en un point p         */
/* de normale n et de coefficient           */
/* de diffusion kd                          */
void LumiereDirectionnelle::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(d);
  nm->normalisation();
  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; }
}

//////////////////////////////////////////////

/* Methode d'affichage texte                */
void LumiereDirectionnelle::print(void) {
  Lumiere::print();
  printf(" - ");
  d->print();
}
