
//=============================================
// 
// Mercredi 12 decembre 2001
//  
// Arash Habibi
// 
// Phong.c
//
//============================================


#include <Phong.h>


//-------------------------------------------
//-------------------------------------------

void PH_Check(surface_t s, char *commentaire) 
{
  fprintf(stderr," -- %s : Check Surface --\n", commentaire); 
  C_Check(s.coef_diffus,     "composante diffuse   "); 
  C_Check(s.coef_speculaire, "composante spéculaire"); 
  C_Check(s.coef_ambiant,    "composante ambiante  "); 

  if(s.miroir)
    fprintf(stderr,"A des propriétés de miroir.\n"); 
  else
    fprintf(stderr,"N'a pas de propriétés de miroir.\n"); 

  if(s.dioptre)
    fprintf(stderr,"A des propriétés de dioptre avec un indice de %f .\n", s.indice); 
  else
    fprintf(stderr,"N'a pas de propriétés de dioptre.\n"); 
}

//-------------------------------------------
//-------------------------------------------

void PH_Set(surface_t *s, couleur_t diffus, couleur_t speculaire, couleur_t ambiant, int brillance, unsigned char miroir, unsigned char dioptre, float indice)
{
  s->coef_diffus     = diffus; 
  s->coef_speculaire = speculaire; 
  s->coef_ambiant    = ambiant; 

  s->brillance = brillance; 

  s->miroir  = miroir; 
  s->dioptre = dioptre; 
  s->indice  = indice; 
}


//-------------------------------------------
//-------------------------------------------

vecteur_t PH_Miroir(surface_t s, vecteur_t normal, vecteur_t incident) 
{
  normal = V_Unitaire(normal); 
  return(V_Unitaire(V_Difference(V_Homothetie(2*V_ProduitScalaire(incident,normal), normal), incident))); 
}


//-------------------------------------------
// source, obs et ainsi de suite representent
// la POSITION de la source, de l'observateur
// et ainsi de suite. 
//-------------------------------------------

couleur_t PH_CouleurReflechie(surface_t s, vecteur_t normal, vecteur_t intersect, vecteur_t source, vecteur_t obs, couleur_t incident, couleur_t ambiant) 
{
  double r, r2, prod_scal_positif; 
  vecteur_t N, L, O, R;
  couleur_t coef, resultat; 

  L = V_Unitaire(V_Difference(intersect, source)); 
  O = V_Unitaire(V_Difference(intersect, obs)); 
  N = V_Unitaire(normal); 
  r2 = V_ProduitScalaire(V_Difference(intersect, source), 
			 V_Difference(intersect, source)); 
  r = V_Distance(source, intersect); 
  R = PH_Miroir(s, N, L); 
			      
  C_SetFL(&resultat, 0.0, 0.0, 0.0); 

  // composante diffuse 

  prod_scal_positif = V_ProduitScalaire(L,N); 
  if(prod_scal_positif>0.0) prod_scal_positif = 0.0; 
  else prod_scal_positif = -prod_scal_positif; 
  coef = C_Homothetie(prod_scal_positif/r, s.coef_diffus); 
  // coef = C_Homothetie(prod_scal_positif, s.coef_diffus); 
  resultat = C_Addition(resultat, C_ProduitTermeATerme(coef, incident)); 

  // composante speculaire

  prod_scal_positif = V_ProduitScalaire(R,O);
  // if(prod_scal_positif>0.0) prod_scal_positif = 0.0; 
  // else prod_scal_positif = - prod_scal_positif; 

  coef = C_Homothetie(pow(prod_scal_positif/r, s.brillance), s.coef_speculaire); 
  // coef = C_Homothetie(pow(prod_scal_positif, s.brillance), s.coef_speculaire); 
  resultat = C_Addition(resultat, C_ProduitTermeATerme(coef, incident)); 

  // composante ambiante
  resultat = C_Addition(resultat, C_ProduitTermeATerme(s.coef_ambiant, ambiant)); 

  resultat = C_Truncate(resultat); 

  return(resultat); 
}


//-------------------------------------------
// n1.sin(i1) = n2.sin(i2)
//-------------------------------------------

vecteur_t PH_Dioptre(vecteur_t normal, vecteur_t incident, float indice) 
{
  return normal;
}



