Maintenant que la base fonctionne pour tout le monde, on va
pouvoir tout casser...
struct Hit
{
int triangle_id;
float t;
float u, v;
Hit( ) : triangle_id(-1), t(FLT_MAX), u(0), v(0) {} // init par defaut, pas d'intersection
Hit( const int _id, const float _t, const float _u, const float _v ) : triangle_id(_id), t(_t), u(_u), v(_v) {}
operator bool( ) const { return (triangle_id != -1); } // renvoie vrai si l'intersection est initialisee...
};
struct Triangle
{
Point p;
Vector e1, e2;
int id;
Triangle( const Point& a, const Point& b, const Point& c, const int i ) : p(a), e1(Vector(a, b)), e2(Vector(a, c)), id(i) {}
/* cf Optimizing Ray-Triangle Intersection via Automated Search
https://perso.univ-lyon1.fr/jean-claude.iehl/Public/educ/M1IMAGE/kensler_triangle.pdf
equations 2b, page 3, colonne de droite
*/
Hit intersect( const Ray& ray, const float tmax ) const
{
Vector op= Vector(ray.o, p);
float V= dot( cross(e1, -e2), ray.d);
float Vp= dot( cross(e1, -e2), op);
float V1= dot( cross(op, ray.d), -e2);
float V2= dot( cross(op, ray.d), e1);
float t= Vp / V;
if(t < 0 || t > tmax) return {};
float u= V1 / V;
if(u < 0 || u > 1) return {};
float v= V2 / V;
if(v < 0 || u+v > 1) return {};
return Hit(id, t, u, v);
}
};
struct Scene
{
std::vector<Triangle> triangles;
Scene( const char *file )
{
// lire le fichier et construire les triangles
}
Hit intersect( const Point&o, const Vector& d, const float tmax ); // ou un rayon
bool visible( const Point& p, const Point& q ); // ou un rayon
};

const Material& material( const Hit& hit
); // renvoie la matiere au point d'intersection
Color diffuse( const Hit& hit
);
// renvoie la couleur diffuse au point d'intersection

Color Fr( const Material&
material, const Vector& o, const Vector& n, const
Vector& l ) qui renvoie l'évaluation de la couleur
de la matière dans la configuration paramétrée par la normale,
la direction vers la source ainsi que la direction vers
l'observateur.

