object_intersector.h 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. // Copyright 2009-2021 Intel Corporation
  2. // SPDX-License-Identifier: Apache-2.0
  3. #pragma once
  4. #include "object.h"
  5. #include "../common/ray.h"
  6. namespace embree
  7. {
  8. namespace isa
  9. {
  10. template<bool mblur>
  11. struct ObjectIntersector1
  12. {
  13. typedef Object Primitive;
  14. static const bool validIntersectorK = false;
  15. struct Precalculations {
  16. __forceinline Precalculations() {}
  17. __forceinline Precalculations (const Ray& ray, const void *ptr) {}
  18. };
  19. static __forceinline void intersect(const Precalculations& pre, RayHit& ray, RayQueryContext* context, const Primitive& prim)
  20. {
  21. AccelSet* accel = (AccelSet*) context->scene->get(prim.geomID());
  22. /* perform ray mask test */
  23. #if defined(EMBREE_RAY_MASK)
  24. if ((ray.mask & accel->mask) == 0)
  25. return;
  26. #endif
  27. accel->intersect(ray,prim.geomID(),prim.primID(),context);
  28. }
  29. static __forceinline bool occluded(const Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive& prim)
  30. {
  31. AccelSet* accel = (AccelSet*) context->scene->get(prim.geomID());
  32. /* perform ray mask test */
  33. #if defined(EMBREE_RAY_MASK)
  34. if ((ray.mask & accel->mask) == 0)
  35. return false;
  36. #endif
  37. accel->occluded(ray,prim.geomID(),prim.primID(),context);
  38. return ray.tfar < 0.0f;
  39. }
  40. static __forceinline bool intersect(const Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive& prim) {
  41. return occluded(pre,ray,context,prim);
  42. }
  43. static __forceinline void intersect(unsigned int k, const Precalculations& pre, RayHit& ray, RayQueryContext* context, const Primitive& prim)
  44. {
  45. AccelSet* accel = (AccelSet*) context->scene->get(prim.geomID());
  46. /* perform ray mask test */
  47. #if defined(EMBREE_RAY_MASK)
  48. if ((ray.mask & accel->mask) == 0)
  49. return;
  50. #endif
  51. accel->intersect(k,ray,prim.geomID(),prim.primID(),context);
  52. }
  53. static __forceinline bool occluded(unsigned int k, const Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive& prim)
  54. {
  55. AccelSet* accel = (AccelSet*) context->scene->get(prim.geomID());
  56. /* perform ray mask test */
  57. #if defined(EMBREE_RAY_MASK)
  58. if ((ray.mask & accel->mask) == 0)
  59. return false;
  60. #endif
  61. accel->occluded(k, ray,prim.geomID(),prim.primID(),context);
  62. return ray.tfar < 0.0f;
  63. }
  64. static __forceinline bool intersect(unsigned int k, const Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive& prim) {
  65. return occluded(k,pre,ray,context,prim);
  66. }
  67. static __forceinline bool pointQuery(PointQuery* query, PointQueryContext* context, const Primitive& prim)
  68. {
  69. AccelSet* accel = (AccelSet*)context->scene->get(prim.geomID());
  70. context->geomID = prim.geomID();
  71. context->primID = prim.primID();
  72. return accel->pointQuery(query, context);
  73. }
  74. template<int K>
  75. static __forceinline void intersectK(const vbool<K>& valid, /* PrecalculationsK& pre, */ RayHitK<K>& ray, RayQueryContext* context, const Primitive* prim, size_t num, size_t& lazy_node)
  76. {
  77. assert(false);
  78. }
  79. template<int K>
  80. static __forceinline vbool<K> occludedK(const vbool<K>& valid, /* PrecalculationsK& pre, */ RayK<K>& ray, RayQueryContext* context, const Primitive* prim, size_t num, size_t& lazy_node)
  81. {
  82. assert(false);
  83. return valid;
  84. }
  85. };
  86. template<int K, bool mblur>
  87. struct ObjectIntersectorK
  88. {
  89. typedef Object Primitive;
  90. struct Precalculations {
  91. __forceinline Precalculations (const vbool<K>& valid, const RayK<K>& ray) {}
  92. };
  93. static __forceinline void intersect(const vbool<K>& valid_i, const Precalculations& pre, RayHitK<K>& ray, RayQueryContext* context, const Primitive& prim)
  94. {
  95. vbool<K> valid = valid_i;
  96. AccelSet* accel = (AccelSet*) context->scene->get(prim.geomID());
  97. /* perform ray mask test */
  98. #if defined(EMBREE_RAY_MASK)
  99. valid &= (ray.mask & accel->mask) != 0;
  100. if (none(valid)) return;
  101. #endif
  102. accel->intersect(valid,ray,prim.geomID(),prim.primID(),context);
  103. }
  104. static __forceinline vbool<K> occluded(const vbool<K>& valid_i, const Precalculations& pre, RayK<K>& ray, RayQueryContext* context, const Primitive& prim)
  105. {
  106. vbool<K> valid = valid_i;
  107. AccelSet* accel = (AccelSet*) context->scene->get(prim.geomID());
  108. /* perform ray mask test */
  109. #if defined(EMBREE_RAY_MASK)
  110. valid &= (ray.mask & accel->mask) != 0;
  111. if (none(valid)) return false;
  112. #endif
  113. accel->occluded(valid,ray,prim.geomID(),prim.primID(),context);
  114. return ray.tfar < 0.0f;
  115. }
  116. static __forceinline void intersect(Precalculations& pre, RayHitK<K>& ray, size_t k, RayQueryContext* context, const Primitive& prim) {
  117. intersect(vbool<K>(1<<int(k)),pre,ray,context,prim);
  118. }
  119. static __forceinline bool occluded(Precalculations& pre, RayK<K>& ray, size_t k, RayQueryContext* context, const Primitive& prim) {
  120. occluded(vbool<K>(1<<int(k)),pre,ray,context,prim);
  121. return ray.tfar[k] < 0.0f;
  122. }
  123. };
  124. typedef ObjectIntersectorK<4,false> ObjectIntersector4;
  125. typedef ObjectIntersectorK<8,false> ObjectIntersector8;
  126. typedef ObjectIntersectorK<16,false> ObjectIntersector16;
  127. typedef ObjectIntersectorK<4,true> ObjectIntersector4MB;
  128. typedef ObjectIntersectorK<8,true> ObjectIntersector8MB;
  129. typedef ObjectIntersectorK<16,true> ObjectIntersector16MB;
  130. }
  131. }