5 int build_bvh_sah(struct bvhnode *tree)
10 if(tree->num_faces < 5 || tree->left || tree->right) return 0;
12 dx = tree->aabb.vmax.x - tree->aabb.vmin.x;
13 dy = tree->aabb.vmax.y - tree->aabb.vmin.y;
14 dz = tree->aabb.vmax.z - tree->aabb.vmin.z;
16 if((sarea = surf_area(dx, dy, dz)) <= 0.0f) return 0;
18 tree->axis = dx > dy ? (dx > dz ? dx : dz) : (dy > dz ? dy : dz);
23 void free_bvh_tree(struct bvhnode *tree)
26 free_bvh_tree(tree->left);
27 free_bvh_tree(tree->right);
31 int ray_bvhnode(cgm_ray *ray, struct bvhnode *bn, float tmax, struct rayhit *hit)
36 if(!ray_aabox_any(ray, &bn->aabb, tmax)) {
41 for(i=0; i<bn->num_faces; i++) {
42 if(ray_triangle(ray, bn->faces + i, tmax, 0)) {
50 for(i=0; i<bn->num_faces; i++) {
51 if(ray_triangle(ray, bn->faces + i, tmax, hit) && hit->t < hit0.t) {