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);

}
Example #4
0
    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);
    }
Example #5
0
    __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);
    }