gKit2 light
Loading...
Searching...
No Matches
BVH Struct Reference

Public Member Functions

int build (const BBox &_bounds, const std::vector< Triangle > &_triangles)
void intersect (RayHit &ray) const
void intersect_fast (RayHit &ray) const

Public Attributes

std::vector< Nodenodes
std::vector< Triangletriangles
int root
int direct_tests

Protected Member Functions

int build (const BBox &bounds, const int begin, const int end)
BBox triangle_bounds (const int begin, const int end)
void intersect (const int index, RayHit &ray, const Vector &invd) const
void intersect_fast (const int index, RayHit &ray, const Vector &invd) const

Detailed Description

Definition at line 180 of file tuto_bvh.cpp.

Member Function Documentation

◆ build() [1/2]

int BVH::build ( const BBox & _bounds,
const std::vector< Triangle > & _triangles )
inline

Definition at line 189 of file tuto_bvh.cpp.

190 {
191 triangles= _triangles; // copie les triangles pour les trier
192 nodes.clear(); // efface les noeuds
193 nodes.reserve(triangles.size());
194
195 // construit l'arbre...
196 root= build(_bounds, 0, triangles.size());
197 // et renvoie la racine
198 return root;
199 }

◆ intersect() [1/2]

void BVH::intersect ( RayHit & ray) const
inline

Definition at line 201 of file tuto_bvh.cpp.

202 {
203 Vector invd= Vector(1 / ray.d.x, 1 / ray.d.y, 1 / ray.d.z);
204 intersect(root, ray, invd);
205 }

◆ intersect_fast() [1/2]

void BVH::intersect_fast ( RayHit & ray) const
inline

Definition at line 207 of file tuto_bvh.cpp.

208 {
209 Vector invd= Vector(1 / ray.d.x, 1 / ray.d.y, 1 / ray.d.z);
210 intersect_fast(root, ray, invd);
211 }

◆ build() [2/2]

int BVH::build ( const BBox & bounds,
const int begin,
const int end )
inlineprotected

Definition at line 215 of file tuto_bvh.cpp.

216 {
217 if(end - begin < 2)
218 {
219 // inserer une feuille et renvoyer son indice
220 int index= nodes.size();
221 nodes.push_back(make_leaf(bounds, begin, end));
222 return index;
223 }
224
225 // axe le plus etire de l'englobant
226 Vector d= Vector(bounds.pmin, bounds.pmax);
227 int axis;
228 if(d.x > d.y && d.x > d.z) // x plus grand que y et z ?
229 axis= 0;
230 else if(d.y > d.z) // y plus grand que z ? (et que x implicitement)
231 axis= 1;
232 else // x et y ne sont pas les plus grands...
233 axis= 2;
234
235 // coupe l'englobant au milieu
236 float cut= bounds.centroid(axis);
237
238 // repartit les triangles
239 Triangle *pm= std::partition(triangles.data() + begin, triangles.data() + end, triangle_less1(axis, cut));
240 int m= std::distance(triangles.data(), pm);
241
242 // la repartition des triangles peut echouer, et tous les triangles sont dans la meme partie...
243 // forcer quand meme un decoupage en 2 ensembles
244 if(m == begin || m == end)
245 m= (begin + end) / 2;
246 assert(m != begin);
247 assert(m != end);
248
249 // construire le fils gauche
250 // les triangles se trouvent dans [begin .. m)
251 BBox bounds_left= triangle_bounds(begin, m);
252 int left= build(bounds_left, begin, m);
253
254 // on recommence pour le fils droit
255 // les triangles se trouvent dans [m .. end)
256 BBox bounds_right= triangle_bounds(m, end);
257 int right= build(bounds_right, m, end);
258
259 int index= nodes.size();
260 nodes.push_back(make_node(bounds, left, right));
261 return index;
262 }
void begin(Widgets &w)
debut de la description des elements de l'interface graphique.
Definition widgets.cpp:29
void bounds(const MeshData &data, Point &pmin, Point &pmax)
renvoie l'englobant.

◆ triangle_bounds()

BBox BVH::triangle_bounds ( const int begin,
const int end )
inlineprotected

Definition at line 264 of file tuto_bvh.cpp.

265 {
266 BBox bbox= triangles[begin].bounds();
267 for(int i= begin +1; i < end; i++)
268 bbox.insert(triangles[i].bounds());
269
270 return bbox;
271 }

◆ intersect() [2/2]

void BVH::intersect ( const int index,
RayHit & ray,
const Vector & invd ) const
inlineprotected

Definition at line 273 of file tuto_bvh.cpp.

274 {
275 const Node& node= nodes[index];
276 if(node.bounds.intersect(ray, invd))
277 {
278 if(node.leaf())
279 {
280 for(int i= node.leaf_begin(); i < node.leaf_end(); i++)
281 triangles[i].intersect(ray);
282 }
283 else // if(node.internal())
284 {
285 intersect(node.internal_left(), ray, invd);
286 intersect(node.internal_right(), ray, invd);
287 }
288 }
289 }

◆ intersect_fast() [2/2]

void BVH::intersect_fast ( const int index,
RayHit & ray,
const Vector & invd ) const
inlineprotected

Definition at line 291 of file tuto_bvh.cpp.

292 {
293 const Node& node= nodes[index];
294 if(node.leaf())
295 {
296 for(int i= node.leaf_begin(); i < node.leaf_end(); i++)
297 triangles[i].intersect(ray);
298 }
299 else // if(node.internal())
300 {
301 const Node& left_node= nodes[node.left];
302 const Node& right_node= nodes[node.right];
303
304 BBoxHit left= left_node.bounds.intersect(ray, invd);
305 BBoxHit right= right_node.bounds.intersect(ray, invd);
306 if(left && right) // les 2 fils sont touches par le rayon...
307 {
308 if(left.centroid() < right.centroid()) // parcours de gauche a droite
309 {
310 intersect_fast(node.internal_left(), ray, invd);
311 intersect_fast(node.internal_right(), ray, invd);
312 }
313 else // parcours de droite a gauche
314 {
315 intersect_fast(node.internal_right(), ray, invd);
316 intersect_fast(node.internal_left(), ray, invd);
317 }
318 }
319 else if(left) // uniquement le fils gauche
320 intersect_fast(node.internal_left(), ray, invd);
321 else if(right)
322 intersect_fast(node.internal_right(), ray, invd); // uniquement le fils droit
323 }
324 }

Member Data Documentation

◆ nodes

std::vector<Node> BVH::nodes

Definition at line 182 of file tuto_bvh.cpp.

◆ triangles

std::vector<Triangle> BVH::triangles

Definition at line 183 of file tuto_bvh.cpp.

◆ root

int BVH::root

Definition at line 184 of file tuto_bvh.cpp.

◆ direct_tests

int BVH::direct_tests

Definition at line 186 of file tuto_bvh.cpp.


The documentation for this struct was generated from the following file: