void GeomTree::TraceCoherentRays(const BVHNode *currnode, int numRays, const vector3f &a_origin, const vector3f *a_dirs, isect_t *isects) const { bvhstack stack[32]; int stackpos = -1; vector3f *invDirs = static_cast<vector3f*>(alloca(sizeof(vector3f)*numRays)); for (int i=0; i<numRays; i++) { invDirs[i] = vector3f(1.0f/a_dirs[i].x, 1.0f/a_dirs[i].y, 1.0f/a_dirs[i].z); } int activeRay = numRays - 1; for (;;) { while (!currnode->IsLeaf()) { do { if (SlabsRayAabbTest(currnode, a_origin, invDirs[activeRay], &isects[activeRay])) break; } while (activeRay-- > 0); if (activeRay < 0) goto pop_bstack; stackpos++; stack[stackpos].node = currnode->kids[1]; stack[stackpos].activeRay = activeRay; currnode = currnode->kids[0]; } // triangle intersection j**z for (int i=0; i<currnode->numTris; i++) { RayTriIntersect(activeRay+1, a_origin, a_dirs, currnode->triIndicesStart[i], isects); } pop_bstack: if (stackpos < 0) break; currnode = stack[stackpos].node; activeRay = stack[stackpos].activeRay; stackpos--; } }
void GeomTree::TraceRay(const BVHNode *currnode, const vector3f &a_origin, const vector3f &a_dir, isect_t *isect) const { BVHNode *stack[32]; int stackpos = -1; vector3f invDir(1.0f/a_dir.x, 1.0f/a_dir.y, 1.0f/a_dir.z); for (;;) { while (!currnode->IsLeaf()) { if (!SlabsRayAabbTest(currnode, a_origin, invDir, isect)) goto pop_bstack; stackpos++; stack[stackpos] = currnode->kids[1]; currnode = currnode->kids[0]; } // triangle intersection j**z for (int i=0; i<currnode->numTris; i++) { RayTriIntersect(1, a_origin, &a_dir, currnode->triIndicesStart[i], isect); } pop_bstack: if (stackpos < 0) break; currnode = stack[stackpos]; stackpos--; } }