instance_intersector.h 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. // Copyright 2009-2021 Intel Corporation
  2. // SPDX-License-Identifier: Apache-2.0
  3. #pragma once
  4. #include "instance.h"
  5. #include "../common/ray.h"
  6. #include "../common/point_query.h"
  7. namespace embree
  8. {
  9. namespace isa
  10. {
  11. struct InstanceIntersector1
  12. {
  13. typedef InstancePrimitive Primitive;
  14. struct Precalculations {
  15. __forceinline Precalculations (const Ray& ray, const void *ptr) {}
  16. };
  17. static void intersect(const Precalculations& pre, RayHit& ray, RayQueryContext* context, const Primitive& prim);
  18. static bool occluded(const Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive& prim);
  19. static bool pointQuery(PointQuery* query, PointQueryContext* context, const Primitive& prim);
  20. };
  21. struct InstanceIntersector1MB
  22. {
  23. typedef InstancePrimitive Primitive;
  24. struct Precalculations {
  25. __forceinline Precalculations (const Ray& ray, const void *ptr) {}
  26. };
  27. static void intersect(const Precalculations& pre, RayHit& ray, RayQueryContext* context, const Primitive& prim);
  28. static bool occluded(const Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive& prim);
  29. static bool pointQuery(PointQuery* query, PointQueryContext* context, const Primitive& prim);
  30. };
  31. template<int K>
  32. struct InstanceIntersectorK
  33. {
  34. typedef InstancePrimitive Primitive;
  35. struct Precalculations {
  36. __forceinline Precalculations (const vbool<K>& valid, const RayK<K>& ray) {}
  37. };
  38. static void intersect(const vbool<K>& valid_i, const Precalculations& pre, RayHitK<K>& ray, RayQueryContext* context, const Primitive& prim);
  39. static vbool<K> occluded(const vbool<K>& valid_i, const Precalculations& pre, RayK<K>& ray, RayQueryContext* context, const Primitive& prim);
  40. static __forceinline void intersect(Precalculations& pre, RayHitK<K>& ray, size_t k, RayQueryContext* context, const Primitive& prim) {
  41. intersect(vbool<K>(1<<int(k)),pre,ray,context,prim);
  42. }
  43. static __forceinline bool occluded(Precalculations& pre, RayK<K>& ray, size_t k, RayQueryContext* context, const Primitive& prim) {
  44. occluded(vbool<K>(1<<int(k)),pre,ray,context,prim);
  45. return ray.tfar[k] < 0.0f;
  46. }
  47. };
  48. template<int K>
  49. struct InstanceIntersectorKMB
  50. {
  51. typedef InstancePrimitive Primitive;
  52. struct Precalculations {
  53. __forceinline Precalculations (const vbool<K>& valid, const RayK<K>& ray) {}
  54. };
  55. static void intersect(const vbool<K>& valid_i, const Precalculations& pre, RayHitK<K>& ray, RayQueryContext* context, const Primitive& prim);
  56. static vbool<K> occluded(const vbool<K>& valid_i, const Precalculations& pre, RayK<K>& ray, RayQueryContext* context, const Primitive& prim);
  57. static __forceinline void intersect(Precalculations& pre, RayHitK<K>& ray, size_t k, RayQueryContext* context, const Primitive& prim) {
  58. intersect(vbool<K>(1<<int(k)),pre,ray,context,prim);
  59. }
  60. static __forceinline bool occluded(Precalculations& pre, RayK<K>& ray, size_t k, RayQueryContext* context, const Primitive& prim) {
  61. occluded(vbool<K>(1<<int(k)),pre,ray,context,prim);
  62. return ray.tfar[k] < 0.0f;
  63. }
  64. };
  65. }
  66. }