subdivpatch1_intersector.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. // Copyright 2009-2021 Intel Corporation
  2. // SPDX-License-Identifier: Apache-2.0
  3. #pragma once
  4. #include "subdivpatch1.h"
  5. #include "grid_soa.h"
  6. #include "grid_soa_intersector1.h"
  7. #include "grid_soa_intersector_packet.h"
  8. #include "../common/ray.h"
  9. namespace embree
  10. {
  11. namespace isa
  12. {
  13. template<typename T>
  14. class SubdivPatch1Precalculations : public T
  15. {
  16. public:
  17. __forceinline SubdivPatch1Precalculations (const Ray& ray, const void* ptr)
  18. : T(ray,ptr) {}
  19. };
  20. template<int K, typename T>
  21. class SubdivPatch1PrecalculationsK : public T
  22. {
  23. public:
  24. __forceinline SubdivPatch1PrecalculationsK (const vbool<K>& valid, RayK<K>& ray)
  25. : T(valid,ray) {}
  26. };
  27. class SubdivPatch1Intersector1
  28. {
  29. public:
  30. typedef GridSOA Primitive;
  31. typedef SubdivPatch1Precalculations<GridSOAIntersector1::Precalculations> Precalculations;
  32. static __forceinline bool processLazyNode(Precalculations& pre, RayQueryContext* context, const Primitive* prim, size_t& lazy_node)
  33. {
  34. lazy_node = prim->root(0);
  35. pre.grid = (Primitive*)prim;
  36. return false;
  37. }
  38. /*! Intersect a ray with the primitive. */
  39. template<int N, bool robust>
  40. static __forceinline void intersect(const Accel::Intersectors* This, Precalculations& pre, RayHit& ray, RayQueryContext* context, const Primitive* prim, size_t ty, const TravRay<N,robust> &tray, size_t& lazy_node)
  41. {
  42. if (likely(ty == 0)) GridSOAIntersector1::intersect(pre,ray,context,prim,lazy_node);
  43. else processLazyNode(pre,context,prim,lazy_node);
  44. }
  45. template<int N, bool robust>
  46. static __forceinline void intersect(const Accel::Intersectors* This, Precalculations& pre, RayHit& ray, RayQueryContext* context, size_t ty0, const Primitive* prim, size_t ty, const TravRay<N,robust> &tray, size_t& lazy_node) {
  47. intersect(This,pre,ray,context,prim,ty,tray,lazy_node);
  48. }
  49. /*! Test if the ray is occluded by the primitive */
  50. template<int N, bool robust>
  51. static __forceinline bool occluded(const Accel::Intersectors* This, Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive* prim, size_t ty, const TravRay<N,robust> &tray, size_t& lazy_node)
  52. {
  53. if (likely(ty == 0)) return GridSOAIntersector1::occluded(pre,ray,context,prim,lazy_node);
  54. else return processLazyNode(pre,context,prim,lazy_node);
  55. }
  56. template<int N, bool robust>
  57. static __forceinline bool occluded(const Accel::Intersectors* This, Precalculations& pre, Ray& ray, RayQueryContext* context, size_t ty0, const Primitive* prim, size_t ty, const TravRay<N,robust> &tray, size_t& lazy_node) {
  58. return occluded(This,pre,ray,context,prim,ty,tray,lazy_node);
  59. }
  60. template<int N>
  61. static __forceinline bool pointQuery(const Accel::Intersectors* This, PointQuery* query, PointQueryContext* context, const Primitive* prim, size_t ty, const TravPointQuery<N> &tquery, size_t& lazy_node)
  62. {
  63. // TODO: PointQuery implement
  64. assert(false && "not implemented");
  65. return false;
  66. }
  67. template<int N>
  68. static __forceinline bool pointQuery(const Accel::Intersectors* This, PointQuery* query, PointQueryContext* context, size_t ty0, const Primitive* prim, size_t ty, const TravPointQuery<N> &tquery, size_t& lazy_node) {
  69. return pointQuery(This,query,context,prim,ty,tquery,lazy_node);
  70. }
  71. };
  72. class SubdivPatch1MBIntersector1
  73. {
  74. public:
  75. typedef SubdivPatch1 Primitive;
  76. typedef GridSOAMBIntersector1::Precalculations Precalculations;
  77. static __forceinline bool processLazyNode(Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive* prim_i, size_t& lazy_node)
  78. {
  79. Primitive* prim = (Primitive*) prim_i;
  80. GridSOA* grid = nullptr;
  81. grid = (GridSOA*) prim->root_ref.get();
  82. pre.itime = getTimeSegment(ray.time(), float(grid->time_steps-1), pre.ftime);
  83. lazy_node = grid->root(pre.itime);
  84. pre.grid = grid;
  85. return false;
  86. }
  87. /*! Intersect a ray with the primitive. */
  88. template<int N, bool robust>
  89. static __forceinline void intersect(const Accel::Intersectors* This, Precalculations& pre, RayHit& ray, RayQueryContext* context, const Primitive* prim, size_t ty, const TravRay<N,robust> &tray, size_t& lazy_node)
  90. {
  91. if (likely(ty == 0)) GridSOAMBIntersector1::intersect(pre,ray,context,prim,lazy_node);
  92. else processLazyNode(pre,ray,context,prim,lazy_node);
  93. }
  94. template<int N, bool robust>
  95. static __forceinline void intersect(const Accel::Intersectors* This, Precalculations& pre, RayHit& ray, RayQueryContext* context, size_t ty0, const Primitive* prim, size_t ty, const TravRay<N,robust> &tray, size_t& lazy_node) {
  96. intersect(This,pre,ray,context,prim,ty,tray,lazy_node);
  97. }
  98. /*! Test if the ray is occluded by the primitive */
  99. template<int N, bool robust>
  100. static __forceinline bool occluded(const Accel::Intersectors* This, Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive* prim, size_t ty, const TravRay<N,robust> &tray, size_t& lazy_node)
  101. {
  102. if (likely(ty == 0)) return GridSOAMBIntersector1::occluded(pre,ray,context,prim,lazy_node);
  103. else return processLazyNode(pre,ray,context,prim,lazy_node);
  104. }
  105. template<int N, bool robust>
  106. static __forceinline bool occluded(const Accel::Intersectors* This, Precalculations& pre, Ray& ray, RayQueryContext* context, size_t ty0, const Primitive* prim, size_t ty, const TravRay<N,robust> &tray, size_t& lazy_node) {
  107. return occluded(This,pre,ray,context,prim,ty,tray,lazy_node);
  108. }
  109. template<int N>
  110. static __forceinline bool pointQuery(const Accel::Intersectors* This, PointQuery* query, PointQueryContext* context, const Primitive* prim, size_t ty, const TravPointQuery<N> &tquery, size_t& lazy_node)
  111. {
  112. // TODO: PointQuery implement
  113. assert(false && "not implemented");
  114. return false;
  115. }
  116. template<int N, bool robust>
  117. static __forceinline bool pointQuery(const Accel::Intersectors* This, PointQuery* query, PointQueryContext* context, size_t ty0, const Primitive* prim, size_t ty, const TravPointQuery<N> &tquery, size_t& lazy_node) {
  118. return pointQuery(This,query,context,prim,ty,tquery,lazy_node);
  119. }
  120. };
  121. template <int K>
  122. struct SubdivPatch1IntersectorK
  123. {
  124. typedef GridSOA Primitive;
  125. typedef SubdivPatch1PrecalculationsK<K,typename GridSOAIntersectorK<K>::Precalculations> Precalculations;
  126. static __forceinline bool processLazyNode(Precalculations& pre, RayQueryContext* context, const Primitive* prim, size_t& lazy_node)
  127. {
  128. lazy_node = prim->root(0);
  129. pre.grid = (Primitive*)prim;
  130. return false;
  131. }
  132. template<bool robust>
  133. static __forceinline void intersect(const vbool<K>& valid, const Accel::Intersectors* This, Precalculations& pre, RayHitK<K>& ray, RayQueryContext* context, const Primitive* prim, size_t ty, const TravRayK<K, robust> &tray, size_t& lazy_node)
  134. {
  135. if (likely(ty == 0)) GridSOAIntersectorK<K>::intersect(valid,pre,ray,context,prim,lazy_node);
  136. else processLazyNode(pre,context,prim,lazy_node);
  137. }
  138. template<bool robust>
  139. static __forceinline vbool<K> occluded(const vbool<K>& valid, const Accel::Intersectors* This, Precalculations& pre, RayK<K>& ray, RayQueryContext* context, const Primitive* prim, size_t ty, const TravRayK<K, robust> &tray, size_t& lazy_node)
  140. {
  141. if (likely(ty == 0)) return GridSOAIntersectorK<K>::occluded(valid,pre,ray,context,prim,lazy_node);
  142. else return processLazyNode(pre,context,prim,lazy_node);
  143. }
  144. template<int N, bool robust>
  145. static __forceinline void intersect(const Accel::Intersectors* This, Precalculations& pre, RayHitK<K>& ray, size_t k, RayQueryContext* context, const Primitive* prim, size_t ty, const TravRay<N,robust> &tray, size_t& lazy_node)
  146. {
  147. if (likely(ty == 0)) GridSOAIntersectorK<K>::intersect(pre,ray,k,context,prim,lazy_node);
  148. else processLazyNode(pre,context,prim,lazy_node);
  149. }
  150. template<int N, bool robust>
  151. static __forceinline bool occluded(const Accel::Intersectors* This, Precalculations& pre, RayK<K>& ray, size_t k, RayQueryContext* context, const Primitive* prim, size_t ty, const TravRay<N,robust> &tray, size_t& lazy_node)
  152. {
  153. if (likely(ty == 0)) return GridSOAIntersectorK<K>::occluded(pre,ray,k,context,prim,lazy_node);
  154. else return processLazyNode(pre,context,prim,lazy_node);
  155. }
  156. };
  157. typedef SubdivPatch1IntersectorK<4> SubdivPatch1Intersector4;
  158. typedef SubdivPatch1IntersectorK<8> SubdivPatch1Intersector8;
  159. typedef SubdivPatch1IntersectorK<16> SubdivPatch1Intersector16;
  160. template <int K>
  161. struct SubdivPatch1MBIntersectorK
  162. {
  163. typedef SubdivPatch1 Primitive;
  164. //typedef GridSOAMBIntersectorK<K>::Precalculations Precalculations;
  165. typedef SubdivPatch1PrecalculationsK<K,typename GridSOAMBIntersectorK<K>::Precalculations> Precalculations;
  166. static __forceinline bool processLazyNode(Precalculations& pre, RayQueryContext* context, const Primitive* prim_i, size_t& lazy_node)
  167. {
  168. Primitive* prim = (Primitive*) prim_i;
  169. GridSOA* grid = (GridSOA*) prim->root_ref.get();
  170. lazy_node = grid->troot;
  171. pre.grid = grid;
  172. return false;
  173. }
  174. template<bool robust>
  175. static __forceinline void intersect(const vbool<K>& valid, const Accel::Intersectors* This, Precalculations& pre, RayHitK<K>& ray, RayQueryContext* context, const Primitive* prim, size_t ty, const TravRayK<K, robust> &tray, size_t& lazy_node)
  176. {
  177. if (likely(ty == 0)) GridSOAMBIntersectorK<K>::intersect(valid,pre,ray,context,prim,lazy_node);
  178. else processLazyNode(pre,context,prim,lazy_node);
  179. }
  180. template<bool robust>
  181. static __forceinline vbool<K> occluded(const vbool<K>& valid, const Accel::Intersectors* This, Precalculations& pre, RayK<K>& ray, RayQueryContext* context, const Primitive* prim, size_t ty, const TravRayK<K, robust> &tray, size_t& lazy_node)
  182. {
  183. if (likely(ty == 0)) return GridSOAMBIntersectorK<K>::occluded(valid,pre,ray,context,prim,lazy_node);
  184. else return processLazyNode(pre,context,prim,lazy_node);
  185. }
  186. template<int N, bool robust>
  187. static __forceinline void intersect(const Accel::Intersectors* This, Precalculations& pre, RayHitK<K>& ray, size_t k, RayQueryContext* context, const Primitive* prim, size_t ty, const TravRay<N,robust> &tray, size_t& lazy_node)
  188. {
  189. if (likely(ty == 0)) GridSOAMBIntersectorK<K>::intersect(pre,ray,k,context,prim,lazy_node);
  190. else processLazyNode(pre,context,prim,lazy_node);
  191. }
  192. template<int N, bool robust>
  193. static __forceinline bool occluded(const Accel::Intersectors* This, Precalculations& pre, RayK<K>& ray, size_t k, RayQueryContext* context, const Primitive* prim, size_t ty, const TravRay<N,robust> &tray, size_t& lazy_node)
  194. {
  195. if (likely(ty == 0)) return GridSOAMBIntersectorK<K>::occluded(pre,ray,k,context,prim,lazy_node);
  196. else return processLazyNode(pre,context,prim,lazy_node);
  197. }
  198. };
  199. typedef SubdivPatch1MBIntersectorK<4> SubdivPatch1MBIntersector4;
  200. typedef SubdivPatch1MBIntersectorK<8> SubdivPatch1MBIntersector8;
  201. typedef SubdivPatch1MBIntersectorK<16> SubdivPatch1MBIntersector16;
  202. }
  203. }