20 Ray(
const Point& _o,
const Vector& _d ) : o(_o), d(_d), tmax(FLT_MAX) {}
21 Ray(
const Point& _o,
const Vector& _d,
const float _tmax ) : o(_o), d(_d), tmax(_tmax) {}
35 Hit( ) : t(FLT_MAX), u(), v(), instance_id(-1), mesh_id(-1), primitive_id(-1), triangle_id(-1) {}
36 Hit(
const Ray& ray ) : t(ray.tmax), u(), v(), instance_id(-1), mesh_id(-1), primitive_id(-1), triangle_id(-1) {}
38 Hit(
const float _t,
const float _u,
const float _v,
const int _mesh_id,
const int _primitive_id,
const int _id ) : t(_t), u(_u), v(_v),
39 instance_id(-1), mesh_id(_mesh_id), primitive_id(_primitive_id), triangle_id(_id) {}
41 operator bool ( ) {
return (triangle_id != -1); }
54 Triangle(
const vec3& a,
const vec3& b,
const vec3&
c,
const int _mesh_id,
const int _primitive_id,
const int _id ) :
56 mesh_id(_mesh_id), primitive_id(_primitive_id), triangle_id(_id) {}
65 Hit intersect(
const Ray &ray,
const float htmax )
const
68 float det=
dot(e1, pvec);
70 float inv_det= 1 / det;
73 float u=
dot(tvec, pvec) * inv_det;
74 if(u < 0 || u > 1)
return Hit();
77 float v=
dot(ray.d, qvec) * inv_det;
78 if(v < 0 || u + v > 1)
return Hit();
80 float t=
dot(e2, qvec) * inv_det;
81 if(t < 0 || t > htmax)
return Hit();
83 return Hit(t, u, v, mesh_id, primitive_id, triangle_id);
88 int main(
const int argc,
const char **argv )
90 const char *filename=
"cornell.gltf";
98 std::vector<Triangle> triangles;
99 for(
unsigned node_id= 0; node_id < scene.
nodes.size(); node_id++)
107 for(
unsigned primitive_id= 0; primitive_id < mesh.
primitives.size(); primitive_id++)
110 for(
unsigned i= 0; i +2 < primitives.indices.size(); i+= 3)
113 int a= primitives.indices[i];
114 int b= primitives.indices[i+1];
115 int c= primitives.indices[i+2];
118 Point pa= primitives.positions[a];
119 Point pb= primitives.positions[b];
120 Point pc= primitives.positions[c];
127 triangles.push_back(
Triangle(pa, pb, pc, mesh_id, primitive_id, i/3) );
131 assert(triangles.size());
140 int height= width / scene.
cameras[0].aspect;
141 Image image(width, height);
149 for(
int y= 0; y < image.height(); y++)
150 for(
int x= 0; x < image.width(); x++)
155 Ray ray(origine, extremite);
159 for(
unsigned i= 0; i < triangles.size(); i++)
161 if(
Hit h= triangles[i].intersect(ray, hit.t))
169 image(x, y)=
Color(1 - hit.u - hit.v, hit.u, hit.v);
representation d'une image.
GLenum primitives() const
renvoie le type de primitives.
int mesh_index
indice du maillage.
GLTFScene read_gltf_scene(const char *filename)
charge un fichier .gltf et construit une scene statique, sans animation.
Transform model
transformation model pour dessiner le maillage.
description d'un maillage.
position et orientation d'un maillage dans la scene.
groupe de triangles d'un maillage. chaque groupe est associe a une matiere.
int write_image(const Image &image, const char *filename)
enregistre une image dans un fichier png.
Transform Inverse(const Transform &m)
renvoie l'inverse de la matrice.
Transform Viewport(const float width, const float height)
renvoie la matrice representant une transformation viewport.
Transform Identity()
construit la transformation identite.
float dot(const Vector &u, const Vector &v)
renvoie le produit scalaire de 2 vecteurs.
Vector cross(const Vector &u, const Vector &v)
renvoie le produit vectoriel de 2 vecteurs.
representation d'une couleur (rgba) transparente ou opaque.
std::vector< GLTFNode > nodes
noeuds / position et orientation des maillages dans la scene.
std::vector< GLTFMesh > meshes
ensemble de maillages.
std::vector< GLTFCamera > cameras
cameras.
intersection avec un triangle.
representation d'un point 3d.
triangle pour le bvh, cf fonction bounds() et intersect().
representation d'un vecteur 3d.
vecteur generique, utilitaire.