bool intersectTree(const Vec3& start, const Vec3& dir,
Triangle** tri, float *best, BIHNode* node, int *tris_tested, float tmin, float tmax) {
if(node->isLeaf) {
float u,v,t;
bool hit = node->tri->intersect(start,dir,&u,&v,&t);
(*tris_tested)++;
if(hit && t < *best) {
*best = t;
*tri = node->tri;
return true;
}
}
bool lr=false, rr=false;
int axis = node->axis;
float tsplit_l = (node->split[0] - start[axis]) / dir[axis];
float tsplit_r = (node->split[1] - start[axis]) / dir[axis];
// (Early Termination possible?)
BIHNode *child1 = node->left, *child2 = node->right;
if(dir[axis] <= 0.f) {
std::swap(child1,child2);
std::swap(tsplit_l,tsplit_r);
}
if(tmin > tsplit_l && tmax < tsplit_r)
return false;
if(child2 != NULL)
if(tsplit_r < tmax)
rr = intersectTree(start,dir,tri,best,child2,tris_tested,tsplit_r,tmax);
if(child1 != NULL)
if(tmin < tsplit_l)
lr = intersectTree(start,dir,tri,best,child1,tris_tested,tmin,tsplit_l);
return lr | rr;
}