void Ray::intersectOctree(const Octree* tree, Fragment &inter) const { double t; if(intersectSimpleBbox(tree->bBox, t)) { // intersection the objects in current tree node for (int i = 0; i < tree->objects.size(); i++) { MeshObject* obj = tree->objects[i]->parent; if(obj->type == SPHERE) { intersectObject(obj, inter); } else if (intersectTriangle(*tree->objects[i], inter)) { inter.id = tree->objects[i]->parent; } } // recusive intersects its children nodes for(int i = 0; i < tree->nodes.size(); i++) { intersectOctree(tree->nodes[i], inter); } } }
void FastInstanceIntersectorK<K>::intersect(vint<K>* valid, const Instance* instance, RayK<K>& ray, size_t item) { typedef Vec3<vfloat<K>> Vec3vfK; typedef AffineSpaceT<LinearSpace3<Vec3vfK>> AffineSpace3vfK; AffineSpace3vfK world2local; if (likely(instance->numTimeSteps == 1)) { world2local = instance->world2local[0]; } else { vfloat<K> t1 = ray.time, t0 = vfloat<K>(1.0f)-t1; world2local = rcp(t0*AffineSpace3vfK(instance->local2world[0]) + t1*AffineSpace3vfK(instance->local2world[1])); } const Vec3vfK ray_org = ray.org; const Vec3vfK ray_dir = ray.dir; const vint<K> ray_geomID = ray.geomID; const vint<K> ray_instID = ray.instID; ray.org = xfmPoint (world2local,ray_org); ray.dir = xfmVector(world2local,ray_dir); ray.geomID = RTC_INVALID_GEOMETRY_ID; ray.instID = instance->id; intersectObject(valid,instance->object,ray); ray.org = ray_org; ray.dir = ray_dir; vbool<K> nohit = ray.geomID == vint<K>(RTC_INVALID_GEOMETRY_ID); ray.geomID = select(nohit,ray_geomID,ray.geomID); ray.instID = select(nohit,ray_instID,ray.instID); }
RGB Ray::rayTrace(Scene &scene) const { Fragment intersection; for (int i = 0; i < scene.objects.size(); i++) { //! be careful, intersectObject only intersect the first object, everything that are occluded but intersects the ray //! is not considered intersection if (intersectObject(scene.objects[i], intersection)) { intersection.id = scene.objects[i]; } } return getColor(scene, intersection); }
void FastInstanceIntersectorK<K>::intersect(vint<K>* valid, const Instance* instance, RayK<K>& ray, size_t item) { typedef Vec3<vfloat<K>> Vec3vfK; typedef AffineSpaceT<LinearSpace3<Vec3vfK>> AffineSpace3vfK; const Vec3vfK ray_org = ray.org; const Vec3vfK ray_dir = ray.dir; const vint<K> ray_geomID = ray.geomID; const vint<K> ray_instID = ray.instID; const AffineSpace3vfK world2local(instance->world2local); ray.org = xfmPoint (world2local,ray_org); ray.dir = xfmVector(world2local,ray_dir); ray.geomID = -1; ray.instID = instance->id; intersectObject(valid,instance->object,ray); ray.org = ray_org; ray.dir = ray_dir; vbool<K> nohit = ray.geomID == vint<K>(-1); ray.geomID = select(nohit,ray_geomID,ray.geomID); ray.instID = select(nohit,ray_instID,ray.instID); }
__noinline void FastInstanceIntersectorN::intersectN(vint<N>* validi, const Instance* instance, const RTCIntersectContext* user_context, RayK<N>& ray, size_t item) { AffineSpace3vf<N> world2local; const vbool<N> valid = *validi == vint<N>(-1); if (likely(instance->numTimeSteps == 1)) world2local = instance->getWorld2Local(); else world2local = instance->getWorld2Local<N>(valid,ray.time); const Vec3vf<N> ray_org = ray.org; const Vec3vf<N> ray_dir = ray.dir; const vint<N> ray_geomID = ray.geomID; const vint<N> ray_instID = ray.instID; ray.org = xfmPoint (world2local,ray_org); ray.dir = xfmVector(world2local,ray_dir); ray.geomID = RTC_INVALID_GEOMETRY_ID; ray.instID = instance->geomID; IntersectContext context(instance->object,user_context); intersectObject((vint<N>*)validi,instance->object,&context,ray); ray.org = ray_org; ray.dir = ray_dir; vbool<N> nohit = ray.geomID == vint<N>(RTC_INVALID_GEOMETRY_ID); ray.geomID = select(nohit,ray_geomID,ray.geomID); ray.instID = select(nohit,ray_instID,ray.instID); }