@@ -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 );
@@ -273,7 +282,7 @@ __forceinline bool intersect_instance(intel_ray_query_t& query, RayHit& ray, Geo
273282}
274283
275284template <>
276- __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)
285+ __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 )
277286{
278287 /* perform ray mask test */
279288#if defined(EMBREE_RAY_MASK)
@@ -295,9 +304,18 @@ __forceinline bool intersect_instance(intel_ray_query_t& query, Ray& ray, Geomet
295304 : (Scene*) ((Instance*)geom)->object ;
296305 if (!object) return false ;
297306
298- const AffineSpace3fa world2local = instance_array
299- ? ((InstanceArray*)geom)->getWorld2Local (primID, ray.time ())
300- : ((Instance*)geom)->getWorld2Local (ray.time ());
307+ AffineSpace3fa world2local;
308+ if (feature_mask & RTC_FEATURE_FLAG_MOTION_BLUR) {
309+ world2local =
310+ instance_array
311+ ? ((InstanceArray *)geom)->getWorld2Local (primID, ray.time ())
312+ : ((Instance *)geom)->getWorld2Local (ray.time ());
313+ } else {
314+ world2local =
315+ instance_array
316+ ? ((InstanceArray *)geom)->getWorld2Local (primID)
317+ : ((Instance *)geom)->getWorld2Local ();
318+ }
301319
302320 const Vec3fa ray_org = xfmPoint (world2local, (Vec3f) ray.org );
303321 const Vec3fa ray_dir = xfmVector (world2local, (Vec3f) ray.dir );
@@ -351,7 +369,7 @@ __forceinline bool intersect_primitive(intel_ray_query_t& query, Ray& ray, Scene
351369#if defined(EMBREE_GEOMETRY_INSTANCE) || defined(EMBREE_GEOMETRY_INSTANCE_ARRAY)
352370 if ((feature_mask & RTC_FEATURE_FLAG_INSTANCE) && (geom->getTypeMask () & Geometry::MTY_INSTANCE) ||
353371 (feature_mask & RTC_FEATURE_FLAG_INSTANCE_ARRAY) && (geom->getTypeMask () & Geometry::MTY_INSTANCE_ARRAY)) {
354- return intersect_instance (query,ray,(Instance*)geom, scenes, context, geomID, primID, geom->getTypeMask () & Geometry::MTY_INSTANCE_ARRAY);
372+ return intersect_instance (query,ray,(Instance*)geom, scenes, context, geomID, primID, geom->getTypeMask () & Geometry::MTY_INSTANCE_ARRAY, feature_mask );
355373 }
356374#endif
357375
0 commit comments