| 466 | } |
| 467 | |
| 468 | inline bool pointQuery(Scene* scene, RTCPointQuery* query, RTCPointQueryContext* userContext, RTCPointQueryFunction queryFunc, void* userPtr) |
| 469 | { |
| 470 | bool changed = false; |
| 471 | if (userContext->instStackSize > 0) |
| 472 | { |
| 473 | const AffineSpace3fa transform = AffineSpace3fa_load_unaligned((AffineSpace3fa*)userContext->world2inst[userContext->instStackSize-1]); |
| 474 | |
| 475 | float similarityScale = 0.f; |
| 476 | const bool similtude = similarityTransform(transform, &similarityScale); |
| 477 | assert((similtude && similarityScale > 0) || (!similtude && similarityScale == 0.f)); |
| 478 | |
| 479 | PointQuery query_inst; |
| 480 | query_inst.p = xfmPoint(transform, Vec3fa(query->x, query->y, query->z)); |
| 481 | query_inst.radius = query->radius * similarityScale; |
| 482 | query_inst.time = query->time; |
| 483 | |
| 484 | PointQueryContext context_inst(scene, (PointQuery*)query, |
| 485 | similtude ? POINT_QUERY_TYPE_SPHERE : POINT_QUERY_TYPE_AABB, |
| 486 | queryFunc, userContext, similarityScale, userPtr); |
| 487 | changed = scene->intersectors.pointQuery((PointQuery*)&query_inst, &context_inst); |
| 488 | } |
| 489 | else |
| 490 | { |
| 491 | PointQueryContext context(scene, (PointQuery*)query, |
| 492 | POINT_QUERY_TYPE_SPHERE, queryFunc, userContext, 1.f, userPtr); |
| 493 | changed = scene->intersectors.pointQuery((PointQuery*)query, &context); |
| 494 | } |
| 495 | return changed; |
| 496 | } |
| 497 | |
| 498 | RTC_API bool rtcPointQuery(RTCScene hscene, RTCPointQuery* query, RTCPointQueryContext* userContext, RTCPointQueryFunction queryFunc, void* userPtr) |
| 499 | { |
no test coverage detected