@@ -214,10 +214,10 @@ __forceinline bool intersect_user_geometry(intel_ray_query_t& query, Ray& ray, U
214214}
215215
216216template <typename Ray>
217- __forceinline bool intersect_instance (intel_ray_query_t & query, Ray& ray, Geometry* geom, Scenes& scenes, sycl::private_ptr<RayQueryContext> context, uint32_t geomID, uint32_t primID, bool instance_array);
217+ __forceinline bool intersect_instance (intel_ray_query_t & query, Ray& ray, Geometry* geom, Scenes& scenes, sycl::private_ptr<RayQueryContext> context, uint32_t geomID, uint32_t primID, bool instance_array, const RTCFeatureFlags feature_mask );
218218
219219template <>
220- __forceinline bool intersect_instance (intel_ray_query_t & query, RayHit& ray, Geometry* geom, Scenes& scenes, sycl::private_ptr<RayQueryContext> context, uint32_t geomID, uint32_t primID, bool instance_array)
220+ __forceinline bool intersect_instance (intel_ray_query_t & query, RayHit& ray, Geometry* geom, Scenes& scenes, sycl::private_ptr<RayQueryContext> context, uint32_t geomID, uint32_t primID, bool instance_array, const RTCFeatureFlags feature_mask )
221221{
222222 /* perform ray mask test */
223223#if defined(EMBREE_RAY_MASK)
@@ -239,9 +239,18 @@ __forceinline bool intersect_instance(intel_ray_query_t& query, RayHit& ray, Geo
239239 : (Scene*) ((Instance*)geom)->object ;
240240 if (!object) return false ;
241241
242- const AffineSpace3fa world2local = instance_array
243- ? ((InstanceArray*)geom)->getWorld2Local (primID, ray.time ())
244- : ((Instance*)geom)->getWorld2Local (ray.time ());
242+ AffineSpace3fa world2local;
243+ if (feature_mask & RTC_FEATURE_FLAG_MOTION_BLUR ) {
244+ world2local =
245+ instance_array
246+ ? ((InstanceArray *)geom)->getWorld2Local (primID, ray.time ())
247+ : ((Instance *)geom)->getWorld2Local (ray.time ());
248+ } else {
249+ world2local =
250+ instance_array
251+ ? ((InstanceArray *)geom)->getWorld2Local (primID)
252+ : ((Instance *)geom)->getWorld2Local ();
253+ }
245254
246255 const Vec3fa ray_org = xfmPoint (world2local, (Vec3f) ray.org );
247256 const Vec3fa ray_dir = xfmVector (world2local, (Vec3f) ray.dir );
@@ -260,7 +269,7 @@ __forceinline bool intersect_instance(intel_ray_query_t& query, RayHit& ray, Geo
260269#endif
261270
262271 uint32_t bvh_id = 0 ;
263- if (context-> args -> feature_mask & RTC_FEATURE_FLAG_MOTION_BLUR ) {
272+ if (feature_mask & RTC_FEATURE_FLAG_MOTION_BLUR ) {
264273 float time = clamp (ray.time (),0 .0f ,1 .0f );
265274 uint32_t numTimeSegments = object->getMaxTimeSegments ();
266275 bvh_id = (uint32_t ) clamp (uint32_t (numTimeSegments*time), 0u , numTimeSegments-1 );
@@ -274,7 +283,7 @@ __forceinline bool intersect_instance(intel_ray_query_t& query, RayHit& ray, Geo
274283}
275284
276285template <>
277- __forceinline bool intersect_instance (intel_ray_query_t & query, Ray& ray, Geometry* geom, Scenes& scenes, sycl::private_ptr<RayQueryContext> context, uint32_t geomID, uint32_t primID, bool instance_array)
286+ __forceinline bool intersect_instance (intel_ray_query_t & query, Ray& ray, Geometry* geom, Scenes& scenes, sycl::private_ptr<RayQueryContext> context, uint32_t geomID, uint32_t primID, bool instance_array, const RTCFeatureFlags feature_mask )
278287{
279288 /* perform ray mask test */
280289#if defined(EMBREE_RAY_MASK)
@@ -296,9 +305,18 @@ __forceinline bool intersect_instance(intel_ray_query_t& query, Ray& ray, Geomet
296305 : (Scene*) ((Instance*)geom)->object ;
297306 if (!object) return false ;
298307
299- const AffineSpace3fa world2local = instance_array
300- ? ((InstanceArray*)geom)->getWorld2Local (primID, ray.time ())
301- : ((Instance*)geom)->getWorld2Local (ray.time ());
308+ AffineSpace3fa world2local;
309+ if (feature_mask & RTC_FEATURE_FLAG_MOTION_BLUR ) {
310+ world2local =
311+ instance_array
312+ ? ((InstanceArray *)geom)->getWorld2Local (primID, ray.time ())
313+ : ((Instance *)geom)->getWorld2Local (ray.time ());
314+ } else {
315+ world2local =
316+ instance_array
317+ ? ((InstanceArray *)geom)->getWorld2Local (primID)
318+ : ((Instance *)geom)->getWorld2Local ();
319+ }
302320
303321 const Vec3fa ray_org = xfmPoint (world2local, (Vec3f) ray.org );
304322 const Vec3fa ray_dir = xfmVector (world2local, (Vec3f) ray.dir );
@@ -352,7 +370,7 @@ __forceinline bool intersect_primitive(intel_ray_query_t& query, Ray& ray, Scene
352370#if defined(EMBREE_GEOMETRY_INSTANCE) || defined(EMBREE_GEOMETRY_INSTANCE_ARRAY)
353371 if ((feature_mask & RTC_FEATURE_FLAG_INSTANCE ) && (geom->getTypeMask () & Geometry::MTY_INSTANCE ) ||
354372 (feature_mask & RTC_FEATURE_FLAG_INSTANCE_ARRAY ) && (geom->getTypeMask () & Geometry::MTY_INSTANCE_ARRAY )) {
355- return intersect_instance (query,ray,(Instance*)geom, scenes, context, geomID, primID, geom->getTypeMask () & Geometry::MTY_INSTANCE_ARRAY );
373+ return intersect_instance (query,ray,(Instance*)geom, scenes, context, geomID, primID, geom->getTypeMask () & Geometry::MTY_INSTANCE_ARRAY , feature_mask );
356374 }
357375#endif
358376
0 commit comments