quadv_intersector.h 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. // Copyright 2009-2021 Intel Corporation
  2. // SPDX-License-Identifier: Apache-2.0
  3. #pragma once
  4. #include "quadv.h"
  5. #include "quad_intersector_moeller.h"
  6. #include "quad_intersector_pluecker.h"
  7. namespace embree
  8. {
  9. namespace isa
  10. {
  11. /*! Intersects M quads with 1 ray */
  12. template<int M, bool filter>
  13. struct QuadMvIntersector1Moeller
  14. {
  15. typedef QuadMv<M> Primitive;
  16. typedef QuadMIntersector1MoellerTrumbore<M,filter> Precalculations;
  17. /*! Intersect a ray with the M quads and updates the hit. */
  18. static __forceinline void intersect(const Precalculations& pre, RayHit& ray, IntersectContext* context, const Primitive& quad)
  19. {
  20. STAT3(normal.trav_prims,1,1,1);
  21. pre.intersect(ray,context,quad.v0,quad.v1,quad.v2,quad.v3,quad.geomID(),quad.primID());
  22. }
  23. /*! Test if the ray is occluded by one of M quads. */
  24. static __forceinline bool occluded(const Precalculations& pre, Ray& ray, IntersectContext* context, const Primitive& quad)
  25. {
  26. STAT3(shadow.trav_prims,1,1,1);
  27. return pre.occluded(ray,context, quad.v0,quad.v1,quad.v2,quad.v3,quad.geomID(),quad.primID());
  28. }
  29. static __forceinline bool pointQuery(PointQuery* query, PointQueryContext* context, const Primitive& quad)
  30. {
  31. return PrimitivePointQuery1<Primitive>::pointQuery(query, context, quad);
  32. }
  33. };
  34. /*! Intersects M triangles with K rays. */
  35. template<int M, int K, bool filter>
  36. struct QuadMvIntersectorKMoeller
  37. {
  38. typedef QuadMv<M> Primitive;
  39. typedef QuadMIntersectorKMoellerTrumbore<M,K,filter> Precalculations;
  40. /*! Intersects K rays with M triangles. */
  41. static __forceinline void intersect(const vbool<K>& valid_i, Precalculations& pre, RayHitK<K>& ray, IntersectContext* context, const QuadMv<M>& quad)
  42. {
  43. for (size_t i=0; i<QuadMv<M>::max_size(); i++)
  44. {
  45. if (!quad.valid(i)) break;
  46. STAT3(normal.trav_prims,1,popcnt(valid_i),K);
  47. const Vec3vf<K> p0 = broadcast<vfloat<K>>(quad.v0,i);
  48. const Vec3vf<K> p1 = broadcast<vfloat<K>>(quad.v1,i);
  49. const Vec3vf<K> p2 = broadcast<vfloat<K>>(quad.v2,i);
  50. const Vec3vf<K> p3 = broadcast<vfloat<K>>(quad.v3,i);
  51. pre.intersectK(valid_i,ray,p0,p1,p2,p3,IntersectKEpilogM<M,K,filter>(ray,context,quad.geomID(),quad.primID(),i));
  52. }
  53. }
  54. /*! Test for K rays if they are occluded by any of the M triangles. */
  55. static __forceinline vbool<K> occluded(const vbool<K>& valid_i, Precalculations& pre, RayK<K>& ray, IntersectContext* context, const QuadMv<M>& quad)
  56. {
  57. vbool<K> valid0 = valid_i;
  58. for (size_t i=0; i<QuadMv<M>::max_size(); i++)
  59. {
  60. if (!quad.valid(i)) break;
  61. STAT3(shadow.trav_prims,1,popcnt(valid0),K);
  62. const Vec3vf<K> p0 = broadcast<vfloat<K>>(quad.v0,i);
  63. const Vec3vf<K> p1 = broadcast<vfloat<K>>(quad.v1,i);
  64. const Vec3vf<K> p2 = broadcast<vfloat<K>>(quad.v2,i);
  65. const Vec3vf<K> p3 = broadcast<vfloat<K>>(quad.v3,i);
  66. if (pre.intersectK(valid0,ray,p0,p1,p2,p3,OccludedKEpilogM<M,K,filter>(valid0,ray,context,quad.geomID(),quad.primID(),i)))
  67. break;
  68. }
  69. return !valid0;
  70. }
  71. /*! Intersect a ray with M triangles and updates the hit. */
  72. static __forceinline void intersect(Precalculations& pre, RayHitK<K>& ray, size_t k, IntersectContext* context, const QuadMv<M>& quad)
  73. {
  74. STAT3(normal.trav_prims,1,1,1);
  75. pre.intersect1(ray,k,context,quad.v0,quad.v1,quad.v2,quad.v3,quad.geomID(),quad.primID());
  76. }
  77. /*! Test if the ray is occluded by one of the M triangles. */
  78. static __forceinline bool occluded(Precalculations& pre, RayK<K>& ray, size_t k, IntersectContext* context, const QuadMv<M>& quad)
  79. {
  80. STAT3(shadow.trav_prims,1,1,1);
  81. return pre.occluded1(ray,k,context,quad.v0,quad.v1,quad.v2,quad.v3,quad.geomID(),quad.primID());
  82. }
  83. };
  84. /*! Intersects M quads with 1 ray */
  85. template<int M, bool filter>
  86. struct QuadMvIntersector1Pluecker
  87. {
  88. typedef QuadMv<M> Primitive;
  89. typedef QuadMIntersector1Pluecker<M,filter> Precalculations;
  90. /*! Intersect a ray with the M quads and updates the hit. */
  91. static __forceinline void intersect(const Precalculations& pre, RayHit& ray, IntersectContext* context, const Primitive& quad)
  92. {
  93. STAT3(normal.trav_prims,1,1,1);
  94. pre.intersect(ray,context,quad.v0,quad.v1,quad.v2,quad.v3,quad.geomID(),quad.primID());
  95. }
  96. /*! Test if the ray is occluded by one of M quads. */
  97. static __forceinline bool occluded(const Precalculations& pre, Ray& ray, IntersectContext* context, const Primitive& quad)
  98. {
  99. STAT3(shadow.trav_prims,1,1,1);
  100. return pre.occluded(ray,context, quad.v0,quad.v1,quad.v2,quad.v3,quad.geomID(),quad.primID());
  101. }
  102. static __forceinline bool pointQuery(PointQuery* query, PointQueryContext* context, const Primitive& quad)
  103. {
  104. return PrimitivePointQuery1<Primitive>::pointQuery(query, context, quad);
  105. }
  106. };
  107. /*! Intersects M triangles with K rays. */
  108. template<int M, int K, bool filter>
  109. struct QuadMvIntersectorKPluecker
  110. {
  111. typedef QuadMv<M> Primitive;
  112. typedef QuadMIntersectorKPluecker<M,K,filter> Precalculations;
  113. /*! Intersects K rays with M triangles. */
  114. static __forceinline void intersect(const vbool<K>& valid_i, Precalculations& pre, RayHitK<K>& ray, IntersectContext* context, const QuadMv<M>& quad)
  115. {
  116. for (size_t i=0; i<QuadMv<M>::max_size(); i++)
  117. {
  118. if (!quad.valid(i)) break;
  119. STAT3(normal.trav_prims,1,popcnt(valid_i),K);
  120. const Vec3vf<K> p0 = broadcast<vfloat<K>>(quad.v0,i);
  121. const Vec3vf<K> p1 = broadcast<vfloat<K>>(quad.v1,i);
  122. const Vec3vf<K> p2 = broadcast<vfloat<K>>(quad.v2,i);
  123. const Vec3vf<K> p3 = broadcast<vfloat<K>>(quad.v3,i);
  124. pre.intersectK(valid_i,ray,p0,p1,p2,p3,IntersectKEpilogM<M,K,filter>(ray,context,quad.geomID(),quad.primID(),i));
  125. }
  126. }
  127. /*! Test for K rays if they are occluded by any of the M triangles. */
  128. static __forceinline vbool<K> occluded(const vbool<K>& valid_i, Precalculations& pre, RayK<K>& ray, IntersectContext* context, const QuadMv<M>& quad)
  129. {
  130. vbool<K> valid0 = valid_i;
  131. for (size_t i=0; i<QuadMv<M>::max_size(); i++)
  132. {
  133. if (!quad.valid(i)) break;
  134. STAT3(shadow.trav_prims,1,popcnt(valid0),K);
  135. const Vec3vf<K> p0 = broadcast<vfloat<K>>(quad.v0,i);
  136. const Vec3vf<K> p1 = broadcast<vfloat<K>>(quad.v1,i);
  137. const Vec3vf<K> p2 = broadcast<vfloat<K>>(quad.v2,i);
  138. const Vec3vf<K> p3 = broadcast<vfloat<K>>(quad.v3,i);
  139. if (pre.intersectK(valid0,ray,p0,p1,p2,p3,OccludedKEpilogM<M,K,filter>(valid0,ray,context,quad.geomID(),quad.primID(),i)))
  140. break;
  141. }
  142. return !valid0;
  143. }
  144. /*! Intersect a ray with M triangles and updates the hit. */
  145. static __forceinline void intersect(Precalculations& pre, RayHitK<K>& ray, size_t k, IntersectContext* context, const QuadMv<M>& quad)
  146. {
  147. STAT3(normal.trav_prims,1,1,1);
  148. pre.intersect1(ray,k,context,quad.v0,quad.v1,quad.v2,quad.v3,quad.geomID(),quad.primID());
  149. }
  150. /*! Test if the ray is occluded by one of the M triangles. */
  151. static __forceinline bool occluded(Precalculations& pre, RayK<K>& ray, size_t k, IntersectContext* context, const QuadMv<M>& quad)
  152. {
  153. STAT3(shadow.trav_prims,1,1,1);
  154. return pre.occluded1(ray,k,context,quad.v0,quad.v1,quad.v2,quad.v3,quad.geomID(),quad.primID());
  155. }
  156. };
  157. }
  158. }