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; }
/*! 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; }
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); }
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; }
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; }
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; }
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; }
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; }
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))); }
__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; }
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; }
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; }
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); }
__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; }
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); }
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; } }
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); }
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; }
__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; } }
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); }
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; }
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; }
__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); }
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); } }
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; }