| 218 | |
| 219 | template<> |
| 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) |
| 221 | { |
| 222 | /* perform ray mask test */ |
| 223 | #if defined(EMBREE_RAY_MASK) |
| 224 | if ((ray.mask & geom->mask) == 0) |
| 225 | return false; |
| 226 | #endif |
| 227 | |
| 228 | if (!instance_id_stack::push(context->user, geomID, primID)) |
| 229 | return false; |
| 230 | |
| 231 | #if RTC_MAX_INSTANCE_LEVEL_COUNT > 1 |
| 232 | unsigned int bvh_level = intel_get_hit_bvh_level( query, intel_hit_type_potential_hit ); |
| 233 | #else |
| 234 | constexpr unsigned int bvh_level = 0; |
| 235 | #endif |
| 236 | |
| 237 | Scene* object = instance_array |
| 238 | ? (Scene*) ((InstanceArray*)geom)->getObject(primID) |
| 239 | : (Scene*) ((Instance*)geom)->object; |
| 240 | if (!object) return false; |
| 241 | |
| 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 | } |
| 254 | |
| 255 | const Vec3fa ray_org = xfmPoint (world2local, (Vec3f) ray.org); |
| 256 | const Vec3fa ray_dir = xfmVector(world2local, (Vec3f) ray.dir); |
| 257 | scenes.set(bvh_level+1, object); |
| 258 | |
| 259 | intel_ray_desc_t raydesc; |
| 260 | raydesc.origin = float3(ray_org.x, ray_org.y, ray_org.z); |
| 261 | raydesc.direction = float3(ray_dir.x, ray_dir.y, ray_dir.z); |
| 262 | raydesc.tmin = ray.tnear(); |
| 263 | raydesc.tmax = inf; // unused |
| 264 | raydesc.mask = mask32_to_mask8(ray.mask); |
| 265 | raydesc.flags = intel_ray_flags_force_non_opaque; |
| 266 | |
| 267 | #if defined(EMBREE_BACKFACE_CULLING) |
| 268 | raydesc.flags |= intel_ray_flags_cull_back_facing_triangles; |
| 269 | #endif |
| 270 | |
| 271 | uint32_t bvh_id = 0; |
| 272 | if (feature_mask & RTC_FEATURE_FLAG_MOTION_BLUR) { |
| 273 | float time = clamp(ray.time(),0.0f,1.0f); |
| 274 | uint32_t numTimeSegments = object->getMaxTimeSegments(); |
| 275 | bvh_id = (uint32_t) clamp(uint32_t(numTimeSegments*time), 0u, numTimeSegments-1); |
| 276 | } |
| 277 |
no test coverage detected