Esempio n. 1
0
    int convertHairSet(Ref<SceneGraph::HairSetNode> mesh, const AffineSpace3fa& space0, const AffineSpace3fa& space1)
    {
      int materialID = convert(mesh->material);
      
      TutorialScene::HairSet* hairset = new TutorialScene::HairSet;
      
      hairset->v.resize(mesh->v.size()); 
      for (size_t i=0; i<mesh->v.size(); i++) {
        hairset->v[i] = xfmPoint(space0,mesh->v[i]);
        hairset->v[i].w = mesh->v[i].w;
      }
      
      hairset->v2.resize(mesh->v2.size()); 
      for (size_t i=0; i<mesh->v2.size(); i++) {
        hairset->v2[i] = xfmPoint(space1,mesh->v2[i]);
        hairset->v2[i].w = mesh->v2[i].w;
      }
      
      hairset->hairs.resize(mesh->hairs.size()); 
      for (size_t i=0; i<mesh->hairs.size(); i++)
        hairset->hairs[i] = TutorialScene::Hair(mesh->hairs[i].vertex,mesh->hairs[i].id);

      scene->geometries.push_back(hairset);
      return scene->geometries.size()-1;
    }
Esempio n. 2
0
 /*! computes and returns the world-space bounding box of the entire model */
 box3f Model::getBBox() 
 {
   // this does not yet properly support instancing with transforms!
   box3f bBox = ospcommon::empty;
   if (!instance.empty()) {
     std::vector<box3f> meshBounds;
     for (int i=0;i<mesh.size();i++)
       meshBounds.push_back(mesh[i]->getBBox());
     for (int i=0;i<instance.size();i++) {
       box3f b_i = meshBounds[instance[i].meshID];
       vec3f corner;
       for (int iz=0;iz<2;iz++) {
         corner.z = iz?b_i.upper.z:b_i.lower.z;
         for (int iy=0;iy<2;iy++) {
           corner.y = iy?b_i.upper.y:b_i.lower.y;
           for (int ix=0;ix<2;ix++) {
             corner.x = ix?b_i.upper.x:b_i.lower.x;
             bBox.extend(xfmPoint(instance[i].xfm,corner));
           }
         }
       }
     }
   } else {
     for (int i=0;i<mesh.size();i++)
       bBox.extend(mesh[i]->getBBox());
   }
   return bBox;
 }
Esempio n. 3
0
    int convertSubdivMesh(Ref<SceneGraph::SubdivMeshNode> mesh, const AffineSpace3fa& space0, const AffineSpace3fa& space1)
    {
      int materialID = convert(mesh->material);
      
      TutorialScene::SubdivMesh* subdivmesh = new TutorialScene::SubdivMesh();
      const LinearSpace3fa nspace0 = rcp(space0.l).transposed();
      
      subdivmesh->positions.resize(mesh->positions.size()); 
      for (size_t i=0; i<mesh->positions.size(); i++) 
        subdivmesh->positions[i] = xfmPoint(space0,mesh->positions[i]);
      
      subdivmesh->normals.resize(mesh->normals.size()); 
      for (size_t i=0; i<mesh->normals.size(); i++) 
        subdivmesh->normals[i] = xfmVector(nspace0,mesh->normals[i]);
      
      subdivmesh->texcoords = mesh->texcoords;
      subdivmesh->position_indices = mesh->position_indices;
      subdivmesh->normal_indices = mesh->normal_indices;
      subdivmesh->texcoord_indices = mesh->texcoord_indices;
      subdivmesh->verticesPerFace = mesh->verticesPerFace;
      subdivmesh->holes = mesh->holes;
      subdivmesh->edge_creases = mesh->edge_creases;
      subdivmesh->edge_crease_weights = mesh->edge_crease_weights;
      subdivmesh->vertex_creases = mesh->vertex_creases;
      subdivmesh->vertex_crease_weights = mesh->vertex_crease_weights;
      subdivmesh->materialID = materialID;

      scene->geometries.push_back(subdivmesh);
      return scene->geometries.size()-1;
    }
 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);
 }
Esempio n. 5
0
 void FastInstanceIntersector1::occluded (const UserGeometryScene::Instance* instance, Ray& ray, size_t item)
 {
   const Vec3fa ray_org = ray.org;
   const Vec3fa ray_dir = ray.dir;
   ray.org = xfmPoint (instance->world2local,ray_org);
   ray.dir = xfmVector(instance->world2local,ray_dir);
   instance->object->occluded((RTCRay&)ray);
   ray.org = ray_org;
   ray.dir = ray_dir;
 }
Esempio n. 6
0
void instanceOccludedFunc(const Instance* instance, RTCRay& ray, size_t item)
{
  const Vec3f ray_org = ray.org;
  const Vec3f ray_dir = ray.dir;
  ray.org = xfmPoint (instance->world2local,ray_org);
  ray.dir = xfmVector(instance->world2local,ray_dir);
  rtcOccluded(instance->object,ray);
  ray.org = ray_org;
  ray.dir = ray_dir;
}
Esempio n. 7
0
 void FastInstanceIntersector8::occluded (avxb* valid, const UserGeometryScene::Instance* instance, Ray8& ray, size_t item)
 {
   const avx3f ray_org = ray.org;
   const avx3f ray_dir = ray.dir;
   const avxi ray_geomID = ray.geomID;
   const AffineSpace3fAVX world2local(instance->world2local);
   ray.org = xfmPoint (world2local,ray_org);
   ray.dir = xfmVector(world2local,ray_dir);
   instance->object->occluded8(valid,(RTCRay8&)ray);
   ray.org = ray_org;
   ray.dir = ray_dir;
 }
Esempio n. 8
0
 void FastInstanceIntersector4::occluded (sseb* valid, const UserGeometryScene::Instance* instance, Ray4& ray, size_t item)
 {
   const sse3f ray_org = ray.org;
   const sse3f ray_dir = ray.dir;
   const ssei ray_geomID = ray.geomID;
   const AffineSpace3faSSE world2local(instance->world2local);
   ray.org = xfmPoint (world2local,ray_org);
   ray.dir = xfmVector(world2local,ray_dir);
   ray.instID = instance->id;
   instance->object->occluded4(valid,(RTCRay4&)ray);
   ray.org = ray_org;
   ray.dir = ray_dir;
 }
 void FastInstanceIntersector4::occluded (bool4* valid, const Instance* instance, Ray4& ray, size_t item)
 {
   const Vec3f4 ray_org = ray.org;
   const Vec3f4 ray_dir = ray.dir;
   const int4 ray_geomID = ray.geomID;
   const AffineSpace3faSSE world2local(instance->world2local);
   ray.org = xfmPoint (world2local,ray_org);
   ray.dir = xfmVector(world2local,ray_dir);
   ray.instID = instance->id;
   instance->object->occluded4(valid,(RTCRay4&)ray);
   ray.org = ray_org;
   ray.dir = ray_dir;
 }
Esempio n. 10
0
 void FastInstanceIntersector16::occluded (mic_i* valid, const UserGeometryScene::Instance* instance, Ray16& ray, size_t item)
 {
   const mic3f ray_org = ray.org;
   const mic3f ray_dir = ray.dir;
   const mic_i ray_geomID = ray.geomID;
   const AffineSpace3faMIC world2local(instance->world2local);
   ray.org = xfmPoint (world2local,ray_org);
   ray.dir = xfmVector(world2local,ray_dir);
   ray.instID = instance->id;
   instance->object->occluded16(valid,(RTCRay16&)ray);
   ray.org = ray_org;
   ray.dir = ray_dir;
 }
  Ref<Shape> TriangleMeshWithNormals::transform(const AffineSpace3f& xfm) const
  {
    /*! do nothing for identity matrix */
    if (xfm == AffineSpace3f(one))
      return (Shape*)this;

    /*! create transformed mesh */
    TriangleMeshWithNormals* mesh = new TriangleMeshWithNormals(ty);
    mesh->vertices.resize(vertices.size());
    for (size_t i=0; i<vertices.size(); i++) mesh->vertices[i].p = xfmPoint (xfm,*(Vector3f*)(void*)&vertices[i].p);
    for (size_t i=0; i<vertices.size(); i++) mesh->vertices[i].n = xfmNormal(xfm,*(Vector3f*)(void*)&vertices[i].n);
    mesh->triangles = triangles;
    return mesh;
  }
Esempio n. 12
0
 void InstanceBoundsFunction(const UserGeometryScene::Instance* instance, size_t item, BBox3fa& bounds_o)
 {
   Vec3fa lower = instance->object->bounds.lower;
   Vec3fa upper = instance->object->bounds.upper;
   AffineSpace3fa local2world = instance->local2world;
   Vec3fa p000 = xfmPoint(local2world,Vec3fa(lower.x,lower.y,lower.z));
   Vec3fa p001 = xfmPoint(local2world,Vec3fa(lower.x,lower.y,upper.z));
   Vec3fa p010 = xfmPoint(local2world,Vec3fa(lower.x,upper.y,lower.z));
   Vec3fa p011 = xfmPoint(local2world,Vec3fa(lower.x,upper.y,upper.z));
   Vec3fa p100 = xfmPoint(local2world,Vec3fa(upper.x,lower.y,lower.z));
   Vec3fa p101 = xfmPoint(local2world,Vec3fa(upper.x,lower.y,upper.z));
   Vec3fa p110 = xfmPoint(local2world,Vec3fa(upper.x,upper.y,lower.z));
   Vec3fa p111 = xfmPoint(local2world,Vec3fa(upper.x,upper.y,upper.z));
   bounds_o.lower = min(min(min(p000,p001),min(p010,p011)),min(min(p100,p101),min(p110,p111)));
   bounds_o.upper = max(max(max(p000,p001),max(p010,p011)),max(max(p100,p101),max(p110,p111)));
 }
Esempio n. 13
0
 __forceinline void FastInstanceIntersectorN::occluded1(const Instance* instance, const RTCIntersectContext* user_context, Ray& ray, size_t item)
 {
   const AffineSpace3fa world2local = 
     likely(instance->numTimeSteps == 1) ? instance->getWorld2Local() : instance->getWorld2Local(ray.time);
   const Vec3fa ray_org = ray.org;
   const Vec3fa ray_dir = ray.dir;
   ray.org = xfmPoint (world2local,ray_org);
   ray.dir = xfmVector(world2local,ray_dir);
   ray.instID = instance->geomID;
   IntersectContext context(instance->object,user_context);
   instance->object->intersectors.occluded((RTCRay&)ray,&context);
   ray.org = ray_org;
   ray.dir = ray_dir;
 }
Esempio n. 14
0
void instanceIntersectFunc(const Instance* instance, RTCRay& ray, size_t item)
{
  const Vec3f ray_org = ray.org;
  const Vec3f ray_dir = ray.dir;
  const int geomID = ray.geomID;
  ray.org = xfmPoint (instance->world2local,ray_org);
  ray.dir = xfmVector(instance->world2local,ray_dir);
  ray.geomID = RTC_INVALID_GEOMETRY_ID;
  rtcIntersect(instance->object,ray);
  ray.org = ray_org;
  ray.dir = ray_dir;
  if (ray.geomID == RTC_INVALID_GEOMETRY_ID) ray.geomID = geomID;
  else ray.instID = instance->userID;
}
Esempio n. 15
0
    void FastInstanceIntersectorK<K>::occluded(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 AffineSpace3vfK world2local(instance->world2local);
      ray.org = xfmPoint (world2local,ray_org);
      ray.dir = xfmVector(world2local,ray_dir);
      ray.instID = instance->id;
      occludedObject(valid,instance->object,ray);
      ray.org = ray_org;
      ray.dir = ray_dir;
    }
Esempio n. 16
0
 void FastInstanceIntersector8::intersect(avxb* valid, const UserGeometryScene::Instance* instance, Ray8& ray, size_t item)
 {
   const avx3f ray_org = ray.org;
   const avx3f ray_dir = ray.dir;
   const avxi ray_geomID = ray.geomID;
   const AffineSpace3fAVX world2local(instance->world2local);
   ray.org = xfmPoint (world2local,ray_org);
   ray.dir = xfmVector(world2local,ray_dir);
   ray.geomID = -1;
   instance->object->intersect8(valid,(RTCRay8&)ray);
   ray.org = ray_org;
   ray.dir = ray_dir;
   avxb nohit = ray.geomID == avxi(-1);
   ray.geomID = select(nohit,ray_geomID,ray.geomID);
   ray.instID = select(nohit,ray.instID,instance->id);
 }
Esempio n. 17
0
    __noinline void FastInstanceIntersectorN::occludedN(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;
      ray.org = xfmPoint (world2local,ray_org);
      ray.dir = xfmVector(world2local,ray_dir);
      ray.instID = instance->geomID;
      IntersectContext context(instance->object,user_context);
      occludedObject((vint<N>*)validi,instance->object,&context,ray);
      ray.org = ray_org;
      ray.dir = ray_dir;
    }
Esempio n. 18
0
 void FastInstanceIntersector16::intersect(mic_i* valid, const UserGeometryScene::Instance* instance, Ray16& ray, size_t item)
 {
   const mic3f ray_org = ray.org;
   const mic3f ray_dir = ray.dir;
   const mic_i ray_geomID = ray.geomID;
   const mic_i ray_instID = ray.instID;
   const AffineSpace3faMIC world2local(instance->world2local);
   ray.org = xfmPoint (world2local,ray_org);
   ray.dir = xfmVector(world2local,ray_dir);
   ray.geomID = -1;
   ray.instID = instance->id;
   instance->object->intersect16(valid,(RTCRay16&)ray);
   ray.org = ray_org;
   ray.dir = ray_dir;
   mic_m nohit = ray.geomID == mic_i(-1);
   ray.geomID = select(nohit,ray_geomID,ray.geomID);
   ray.instID = select(nohit,ray_instID,ray.instID);
 }
 void FastInstanceIntersector4::intersect(bool4* valid, const Instance* instance, Ray4& ray, size_t item)
 {
   const Vec3f4 ray_org = ray.org;
   const Vec3f4 ray_dir = ray.dir;
   const int4 ray_geomID = ray.geomID;
   const int4 ray_instID = ray.instID;
   const AffineSpace3faSSE world2local(instance->world2local);
   ray.org = xfmPoint (world2local,ray_org);
   ray.dir = xfmVector(world2local,ray_dir);
   ray.geomID = -1;
   ray.instID = instance->id;
   instance->object->intersect4(valid,(RTCRay4&)ray);
   ray.org = ray_org;
   ray.dir = ray_dir;
   bool4 nohit = ray.geomID == int4(-1);
   ray.geomID = select(nohit,ray_geomID,ray.geomID);
   ray.instID = select(nohit,ray_instID,ray.instID);
 }
Esempio n. 20
0
 void FastInstanceIntersector1::intersect(const UserGeometryScene::Instance* instance, Ray& ray, size_t item)
 {
   const Vec3fa ray_org = ray.org;
   const Vec3fa ray_dir = ray.dir;
   const int ray_geomID = ray.geomID;
   const int ray_instID = ray.instID;
   ray.org = xfmPoint (instance->world2local,ray_org);
   ray.dir = xfmVector(instance->world2local,ray_dir);
   ray.geomID = -1;
   ray.instID = instance->id;
   instance->object->intersect((RTCRay&)ray);
   ray.org = ray_org;
   ray.dir = ray_dir;
   if (ray.geomID == -1) {
     ray.geomID = ray_geomID;
     ray.instID = ray_instID;
   }
 }
Esempio n. 21
0
 void FastInstanceIntersector4::intersect(sseb* valid, const UserGeometryScene::Instance* instance, Ray4& ray, size_t item)
 {
   const sse3f ray_org = ray.org;
   const sse3f ray_dir = ray.dir;
   const ssei ray_geomID = ray.geomID;
   const ssei ray_instID = ray.instID;
   const AffineSpace3faSSE world2local(instance->world2local);
   ray.org = xfmPoint (world2local,ray_org);
   ray.dir = xfmVector(world2local,ray_dir);
   ray.geomID = -1;
   ray.instID = instance->id;
   instance->object->intersect4(valid,(RTCRay4&)ray);
   ray.org = ray_org;
   ray.dir = ray_dir;
   sseb nohit = ray.geomID == ssei(-1);
   ray.geomID = select(nohit,ray_geomID,ray.geomID);
   ray.instID = select(nohit,ray_instID,ray.instID);
 }
Esempio n. 22
0
void instanceBoundsFunc(const Instance* instance, size_t item, RTCBounds* bounds_o)
{
  Vec3f l = instance->lower;
  Vec3f u = instance->upper;
  Vec3f p000 = xfmPoint(instance->local2world,Vec3f(l.x,l.y,l.z));
  Vec3f p001 = xfmPoint(instance->local2world,Vec3f(l.x,l.y,u.z));
  Vec3f p010 = xfmPoint(instance->local2world,Vec3f(l.x,u.y,l.z));
  Vec3f p011 = xfmPoint(instance->local2world,Vec3f(l.x,u.y,u.z));
  Vec3f p100 = xfmPoint(instance->local2world,Vec3f(u.x,l.y,l.z));
  Vec3f p101 = xfmPoint(instance->local2world,Vec3f(u.x,l.y,u.z));
  Vec3f p110 = xfmPoint(instance->local2world,Vec3f(u.x,u.y,l.z));
  Vec3f p111 = xfmPoint(instance->local2world,Vec3f(u.x,u.y,u.z));
  Vec3f lower = min(min(min(p000,p001),min(p010,p011)),min(min(p100,p101),min(p110,p111)));
  Vec3f upper = max(max(max(p000,p001),max(p010,p011)),max(max(p100,p101),max(p110,p111)));
  bounds_o->lower_x = lower.x;
  bounds_o->lower_y = lower.y;
  bounds_o->lower_z = lower.z;
  bounds_o->upper_x = upper.x;
  bounds_o->upper_y = upper.y;
  bounds_o->upper_z = upper.z;
}
Esempio n. 23
0
 __forceinline void FastInstanceIntersectorN::intersect1(const Instance* instance, const RTCIntersectContext* user_context, Ray& ray, size_t item)
 {
   const AffineSpace3fa world2local = 
     likely(instance->numTimeSteps == 1) ? instance->getWorld2Local() : instance->getWorld2Local(ray.time);
   const Vec3fa ray_org = ray.org;
   const Vec3fa ray_dir = ray.dir;
   const int ray_geomID = ray.geomID;
   const int 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);
   instance->object->intersectors.intersect((RTCRay&)ray,&context);
   ray.org = ray_org;
   ray.dir = ray_dir;
   if (ray.geomID == RTC_INVALID_GEOMETRY_ID) {
     ray.geomID = ray_geomID;
     ray.instID = ray_instID;
   }
 }
Esempio n. 24
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);
    }
Esempio n. 25
0
  Ref<Shape> TriangleMeshFull::transform(const AffineSpace3f& xfm) const
  {
    /*! do nothing for identity matrix */
    if (xfm == AffineSpace3f(one))
      return (Shape*)this;

    /*! create transformed */
    TriangleMeshFull* mesh = new TriangleMeshFull(ty);
    mesh->position.resize(position.size());
    for (size_t i=0; i<position.size(); i++) mesh->position[i] = xfmPoint(xfm,position[i]);
    mesh->motion.resize(motion.size());
    for (size_t i=0; i<motion.size(); i++) mesh->motion[i] = xfmVector(xfm,motion[i]);
    mesh->normal.resize(normal.size()  );
    for (size_t i=0; i<normal.size(); i++) mesh->normal[i] = xfmNormal(xfm,normal[i]);
    mesh->tangent_x.resize(tangent_x.size()  );
    for (size_t i=0; i<tangent_x.size(); i++) mesh->tangent_x[i] = xfmVector(xfm,tangent_x[i]);
    mesh->tangent_y.resize(tangent_y.size()  );
    for (size_t i=0; i<tangent_y.size(); i++) mesh->tangent_y[i] = xfmVector(xfm,tangent_y[i]);
    mesh->texcoord  = texcoord;
    mesh->triangles = triangles;
    return mesh;
  }
Esempio n. 26
0
    void FastInstanceIntersectorK<K>::occluded(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;
      ray.org = xfmPoint (world2local,ray_org);
      ray.dir = xfmVector(world2local,ray_dir);
      ray.instID = instance->id;
      occludedObject(valid,instance->object,ray);
      ray.org = ray_org;
      ray.dir = ray_dir;
    }
Esempio n. 27
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);
    }
Esempio n. 28
0
  void Instance::finalize(Model *model)
  {
    xfm.l.vx = getParam3f("xfm.l.vx",vec3f(1.f,0.f,0.f));
    xfm.l.vy = getParam3f("xfm.l.vy",vec3f(0.f,1.f,0.f));
    xfm.l.vz = getParam3f("xfm.l.vz",vec3f(0.f,0.f,1.f));
    xfm.p   = getParam3f("xfm.p",vec3f(0.f,0.f,0.f));

    instancedScene = (Model *)getParamObject("model", nullptr);
    assert(instancedScene);

    if (!instancedScene->embreeSceneHandle) {
      instancedScene->commit();
    }

    RTCGeometry embreeGeom   = rtcNewGeometry(ispc_embreeDevice(),RTC_GEOMETRY_TYPE_INSTANCE);
    embreeGeomID = rtcAttachGeometry(model->embreeSceneHandle,embreeGeom);
    rtcSetGeometryInstancedScene(embreeGeom,instancedScene->embreeSceneHandle);

    const box3f b = instancedScene->bounds;
    if (b.empty()) {
      // for now, let's just issue a warning since not all ospray
      // geometries do properly set the boudning box yet. as soon as
      // this gets fixed we will actually switch to reporting an error
      static WarnOnce warning("creating an instance to a model that does not"
                              " have a valid bounding box. epsilons for"
                              " ray offsets may be wrong");
    }
    const vec3f v000(b.lower.x,b.lower.y,b.lower.z);
    const vec3f v001(b.upper.x,b.lower.y,b.lower.z);
    const vec3f v010(b.lower.x,b.upper.y,b.lower.z);
    const vec3f v011(b.upper.x,b.upper.y,b.lower.z);
    const vec3f v100(b.lower.x,b.lower.y,b.upper.z);
    const vec3f v101(b.upper.x,b.lower.y,b.upper.z);
    const vec3f v110(b.lower.x,b.upper.y,b.upper.z);
    const vec3f v111(b.upper.x,b.upper.y,b.upper.z);

    bounds = empty;
    bounds.extend(xfmPoint(xfm,v000));
    bounds.extend(xfmPoint(xfm,v001));
    bounds.extend(xfmPoint(xfm,v010));
    bounds.extend(xfmPoint(xfm,v011));
    bounds.extend(xfmPoint(xfm,v100));
    bounds.extend(xfmPoint(xfm,v101));
    bounds.extend(xfmPoint(xfm,v110));
    bounds.extend(xfmPoint(xfm,v111));

    rtcSetGeometryTransform(embreeGeom,0,RTC_FORMAT_FLOAT3X4_COLUMN_MAJOR,&xfm);
    rtcCommitGeometry(embreeGeom);
    rtcReleaseGeometry(embreeGeom);

    AffineSpace3f rcp_xfm = rcp(xfm);
    areaPDF.resize(instancedScene->geometry.size());
    ispc::InstanceGeometry_set(getIE(),
                               (ispc::AffineSpace3f&)xfm,
                               (ispc::AffineSpace3f&)rcp_xfm,
                               instancedScene->getIE(),
                               &areaPDF[0]);
    for (auto volume : instancedScene->volume) {
      ospSet3f((OSPObject)volume.ptr, "xfm.l.vx", xfm.l.vx.x, xfm.l.vx.y, xfm.l.vx.z);
      ospSet3f((OSPObject)volume.ptr, "xfm.l.vy", xfm.l.vy.x, xfm.l.vy.y, xfm.l.vy.z);
      ospSet3f((OSPObject)volume.ptr, "xfm.l.vz", xfm.l.vz.x, xfm.l.vz.y, xfm.l.vz.z);
      ospSet3f((OSPObject)volume.ptr, "xfm.p", xfm.p.x, xfm.p.y, xfm.p.z);
    }
  }
Esempio n. 29
0
 int convertTriangleMesh(Ref<SceneGraph::TriangleMeshNode> mesh, const AffineSpace3fa& space0, const AffineSpace3fa& space1)
 {
   int materialID = convert(mesh->material);
   
   TutorialScene::TriangleMesh* objmesh = new TutorialScene::TriangleMesh();
   const LinearSpace3fa nspace0 = rcp(space0.l).transposed();
   objmesh->v. resize(mesh->v. size()); for (size_t i=0; i<mesh->v. size(); i++) objmesh->v [i] = xfmPoint ( space0,mesh->v [i]);
   objmesh->v2.resize(mesh->v2.size()); for (size_t i=0; i<mesh->v2.size(); i++) objmesh->v2[i] = xfmPoint ( space1,mesh->v2[i]);
   objmesh->vn.resize(mesh->vn.size()); for (size_t i=0; i<mesh->vn.size(); i++) objmesh->vn[i] = xfmVector(nspace0,mesh->vn[i]);
   objmesh->vt = mesh->vt;
   
   objmesh->triangles.resize(mesh->triangles.size());
   for (size_t i=0; i<mesh->triangles.size(); i++) {
     SceneGraph::TriangleMeshNode::Triangle& tri = mesh->triangles[i];
     objmesh->triangles[i] = TutorialScene::Triangle(tri.v0,tri.v1,tri.v2,materialID);
   }
   objmesh->meshMaterialID = materialID;
   scene->geometries.push_back(objmesh);
   return scene->geometries.size()-1;
 }