disci_intersector.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. // Copyright 2009-2021 Intel Corporation
  2. // SPDX-License-Identifier: Apache-2.0
  3. #pragma once
  4. #include "disc_intersector.h"
  5. #include "intersector_epilog.h"
  6. #include "pointi.h"
  7. namespace embree
  8. {
  9. namespace isa
  10. {
  11. template<int M, bool filter>
  12. struct DiscMiIntersector1
  13. {
  14. typedef PointMi<M> Primitive;
  15. typedef CurvePrecalculations1 Precalculations;
  16. static __forceinline void intersect(const Precalculations& pre,
  17. RayHit& ray,
  18. IntersectContext* context,
  19. const Primitive& Disc)
  20. {
  21. STAT3(normal.trav_prims, 1, 1, 1);
  22. const Points* geom = context->scene->get<Points>(Disc.geomID());
  23. Vec4vf<M> v0; Disc.gather(v0, geom);
  24. const vbool<M> valid = Disc.valid();
  25. DiscIntersector1<M>::intersect(
  26. valid, ray, context, geom, pre, v0, Intersect1EpilogM<M, filter>(ray, context, Disc.geomID(), Disc.primID()));
  27. }
  28. static __forceinline bool occluded(const Precalculations& pre,
  29. Ray& ray,
  30. IntersectContext* context,
  31. const Primitive& Disc)
  32. {
  33. STAT3(shadow.trav_prims, 1, 1, 1);
  34. const Points* geom = context->scene->get<Points>(Disc.geomID());
  35. Vec4vf<M> v0; Disc.gather(v0, geom);
  36. const vbool<M> valid = Disc.valid();
  37. return DiscIntersector1<M>::intersect(
  38. valid, ray, context, geom, pre, v0, Occluded1EpilogM<M, filter>(ray, context, Disc.geomID(), Disc.primID()));
  39. }
  40. };
  41. template<int M, bool filter>
  42. struct DiscMiMBIntersector1
  43. {
  44. typedef PointMi<M> Primitive;
  45. typedef CurvePrecalculations1 Precalculations;
  46. static __forceinline void intersect(const Precalculations& pre,
  47. RayHit& ray,
  48. IntersectContext* context,
  49. const Primitive& Disc)
  50. {
  51. STAT3(normal.trav_prims, 1, 1, 1);
  52. const Points* geom = context->scene->get<Points>(Disc.geomID());
  53. Vec4vf<M> v0; Disc.gather(v0, geom, ray.time());
  54. const vbool<M> valid = Disc.valid();
  55. DiscIntersector1<M>::intersect(
  56. valid, ray, context, geom, pre, v0, Intersect1EpilogM<M, filter>(ray, context, Disc.geomID(), Disc.primID()));
  57. }
  58. static __forceinline bool occluded(const Precalculations& pre,
  59. Ray& ray,
  60. IntersectContext* context,
  61. const Primitive& Disc)
  62. {
  63. STAT3(shadow.trav_prims, 1, 1, 1);
  64. const Points* geom = context->scene->get<Points>(Disc.geomID());
  65. Vec4vf<M> v0; Disc.gather(v0, geom, ray.time());
  66. const vbool<M> valid = Disc.valid();
  67. return DiscIntersector1<M>::intersect(
  68. valid, ray, context, geom, pre, v0, Occluded1EpilogM<M, filter>(ray, context, Disc.geomID(), Disc.primID()));
  69. }
  70. };
  71. template<int M, int K, bool filter>
  72. struct DiscMiIntersectorK
  73. {
  74. typedef PointMi<M> Primitive;
  75. typedef CurvePrecalculationsK<K> Precalculations;
  76. static __forceinline void intersect(
  77. const Precalculations& pre, RayHitK<K>& ray, size_t k, IntersectContext* context, const Primitive& Disc)
  78. {
  79. STAT3(normal.trav_prims, 1, 1, 1);
  80. const Points* geom = context->scene->get<Points>(Disc.geomID());
  81. Vec4vf<M> v0; Disc.gather(v0, geom);
  82. const vbool<M> valid = Disc.valid();
  83. DiscIntersectorK<M, K>::intersect(
  84. valid, ray, k, context, geom, pre, v0,
  85. Intersect1KEpilogM<M, K, filter>(ray, k, context, Disc.geomID(), Disc.primID()));
  86. }
  87. static __forceinline bool occluded(
  88. const Precalculations& pre, RayK<K>& ray, size_t k, IntersectContext* context, const Primitive& Disc)
  89. {
  90. STAT3(shadow.trav_prims, 1, 1, 1);
  91. const Points* geom = context->scene->get<Points>(Disc.geomID());
  92. Vec4vf<M> v0; Disc.gather(v0, geom);
  93. const vbool<M> valid = Disc.valid();
  94. return DiscIntersectorK<M, K>::intersect(
  95. valid, ray, k, context, geom, pre, v0,
  96. Occluded1KEpilogM<M, K, filter>(ray, k, context, Disc.geomID(), Disc.primID()));
  97. }
  98. };
  99. template<int M, int K, bool filter>
  100. struct DiscMiMBIntersectorK
  101. {
  102. typedef PointMi<M> Primitive;
  103. typedef CurvePrecalculationsK<K> Precalculations;
  104. static __forceinline void intersect(
  105. const Precalculations& pre, RayHitK<K>& ray, size_t k, IntersectContext* context, const Primitive& Disc)
  106. {
  107. STAT3(normal.trav_prims, 1, 1, 1);
  108. const Points* geom = context->scene->get<Points>(Disc.geomID());
  109. Vec4vf<M> v0; Disc.gather(v0, geom, ray.time()[k]);
  110. const vbool<M> valid = Disc.valid();
  111. DiscIntersectorK<M, K>::intersect(
  112. valid, ray, k, context, geom, pre, v0,
  113. Intersect1KEpilogM<M, K, filter>(ray, k, context, Disc.geomID(), Disc.primID()));
  114. }
  115. static __forceinline bool occluded(
  116. const Precalculations& pre, RayK<K>& ray, size_t k, IntersectContext* context, const Primitive& Disc)
  117. {
  118. STAT3(shadow.trav_prims, 1, 1, 1);
  119. const Points* geom = context->scene->get<Points>(Disc.geomID());
  120. Vec4vf<M> v0; Disc.gather(v0, geom, ray.time()[k]);
  121. const vbool<M> valid = Disc.valid();
  122. return DiscIntersectorK<M, K>::intersect(
  123. valid, ray, k, context, geom, pre, v0, Occluded1KEpilogM<M, K, filter>(ray, k, context, Disc.geomID(), Disc.primID()));
  124. }
  125. };
  126. template<int M, bool filter>
  127. struct OrientedDiscMiIntersector1
  128. {
  129. typedef PointMi<M> Primitive;
  130. typedef CurvePrecalculations1 Precalculations;
  131. static __forceinline void intersect(const Precalculations& pre,
  132. RayHit& ray,
  133. IntersectContext* context,
  134. const Primitive& Disc)
  135. {
  136. STAT3(normal.trav_prims, 1, 1, 1);
  137. const Points* geom = context->scene->get<Points>(Disc.geomID());
  138. Vec4vf<M> v0; Vec3vf<M> n0;
  139. Disc.gather(v0, n0, geom);
  140. const vbool<M> valid = Disc.valid();
  141. DiscIntersector1<M>::intersect(
  142. valid, ray, context, geom, pre, v0, n0, Intersect1EpilogM<M, filter>(ray, context, Disc.geomID(), Disc.primID()));
  143. }
  144. static __forceinline bool occluded(const Precalculations& pre,
  145. Ray& ray,
  146. IntersectContext* context,
  147. const Primitive& Disc)
  148. {
  149. STAT3(shadow.trav_prims, 1, 1, 1);
  150. const Points* geom = context->scene->get<Points>(Disc.geomID());
  151. Vec4vf<M> v0; Vec3vf<M> n0;
  152. Disc.gather(v0, n0, geom);
  153. const vbool<M> valid = Disc.valid();
  154. return DiscIntersector1<M>::intersect(
  155. valid, ray, context, geom, pre, v0, n0, Occluded1EpilogM<M, filter>(ray, context, Disc.geomID(), Disc.primID()));
  156. }
  157. };
  158. template<int M, bool filter>
  159. struct OrientedDiscMiMBIntersector1
  160. {
  161. typedef PointMi<M> Primitive;
  162. typedef CurvePrecalculations1 Precalculations;
  163. static __forceinline void intersect(const Precalculations& pre,
  164. RayHit& ray,
  165. IntersectContext* context,
  166. const Primitive& Disc)
  167. {
  168. STAT3(normal.trav_prims, 1, 1, 1);
  169. const Points* geom = context->scene->get<Points>(Disc.geomID());
  170. Vec4vf<M> v0; Vec3vf<M> n0;
  171. Disc.gather(v0, n0, geom, ray.time());
  172. const vbool<M> valid = Disc.valid();
  173. DiscIntersector1<M>::intersect(
  174. valid, ray, context, geom, pre, v0, n0, Intersect1EpilogM<M, filter>(ray, context, Disc.geomID(), Disc.primID()));
  175. }
  176. static __forceinline bool occluded(const Precalculations& pre,
  177. Ray& ray,
  178. IntersectContext* context,
  179. const Primitive& Disc)
  180. {
  181. STAT3(shadow.trav_prims, 1, 1, 1);
  182. const Points* geom = context->scene->get<Points>(Disc.geomID());
  183. Vec4vf<M> v0; Vec3vf<M> n0;
  184. Disc.gather(v0, n0, geom, ray.time());
  185. const vbool<M> valid = Disc.valid();
  186. return DiscIntersector1<M>::intersect(
  187. valid, ray, context, geom, pre, v0, n0, Occluded1EpilogM<M, filter>(ray, context, Disc.geomID(), Disc.primID()));
  188. }
  189. };
  190. template<int M, int K, bool filter>
  191. struct OrientedDiscMiIntersectorK
  192. {
  193. typedef PointMi<M> Primitive;
  194. typedef CurvePrecalculationsK<K> Precalculations;
  195. static __forceinline void intersect(
  196. const Precalculations& pre, RayHitK<K>& ray, size_t k, IntersectContext* context, const Primitive& Disc)
  197. {
  198. STAT3(normal.trav_prims, 1, 1, 1);
  199. const Points* geom = context->scene->get<Points>(Disc.geomID());
  200. Vec4vf<M> v0; Vec3vf<M> n0;
  201. Disc.gather(v0, n0, geom);
  202. const vbool<M> valid = Disc.valid();
  203. DiscIntersectorK<M, K>::intersect(
  204. valid, ray, k, context, geom, pre, v0, n0,
  205. Intersect1KEpilogM<M, K, filter>(ray, k, context, Disc.geomID(), Disc.primID()));
  206. }
  207. static __forceinline bool occluded(
  208. const Precalculations& pre, RayK<K>& ray, size_t k, IntersectContext* context, const Primitive& Disc)
  209. {
  210. STAT3(shadow.trav_prims, 1, 1, 1);
  211. const Points* geom = context->scene->get<Points>(Disc.geomID());
  212. Vec4vf<M> v0; Vec3vf<M> n0;
  213. Disc.gather(v0, n0, geom);
  214. const vbool<M> valid = Disc.valid();
  215. return DiscIntersectorK<M, K>::intersect(
  216. valid, ray, k, context, geom, pre, v0, n0,
  217. Occluded1KEpilogM<M, K, filter>(ray, k, context, Disc.geomID(), Disc.primID()));
  218. }
  219. };
  220. template<int M, int K, bool filter>
  221. struct OrientedDiscMiMBIntersectorK
  222. {
  223. typedef PointMi<M> Primitive;
  224. typedef CurvePrecalculationsK<K> Precalculations;
  225. static __forceinline void intersect(
  226. const Precalculations& pre, RayHitK<K>& ray, size_t k, IntersectContext* context, const Primitive& Disc)
  227. {
  228. STAT3(normal.trav_prims, 1, 1, 1);
  229. const Points* geom = context->scene->get<Points>(Disc.geomID());
  230. Vec4vf<M> v0; Vec3vf<M> n0;
  231. Disc.gather(v0, n0, geom, ray.time()[k]);
  232. const vbool<M> valid = Disc.valid();
  233. DiscIntersectorK<M, K>::intersect(
  234. valid, ray, k, context, geom, pre, v0, n0,
  235. Intersect1KEpilogM<M, K, filter>(ray, k, context, Disc.geomID(), Disc.primID()));
  236. }
  237. static __forceinline bool occluded(
  238. const Precalculations& pre, RayK<K>& ray, size_t k, IntersectContext* context, const Primitive& Disc)
  239. {
  240. STAT3(shadow.trav_prims, 1, 1, 1);
  241. const Points* geom = context->scene->get<Points>(Disc.geomID());
  242. Vec4vf<M> v0; Vec3vf<M> n0;
  243. Disc.gather(v0, n0, geom, ray.time()[k]);
  244. const vbool<M> valid = Disc.valid();
  245. return DiscIntersectorK<M, K>::intersect(
  246. valid, ray, k, context, geom, pre, v0, n0,
  247. Occluded1KEpilogM<M, K, filter>(ray, k, context, Disc.geomID(), Disc.primID()));
  248. }
  249. };
  250. } // namespace isa
  251. } // namespace embree