intersector_iterators.h 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. // ======================================================================== //
  2. // Copyright 2009-2017 Intel Corporation //
  3. // //
  4. // Licensed under the Apache License, Version 2.0 (the "License"); //
  5. // you may not use this file except in compliance with the License. //
  6. // You may obtain a copy of the License at //
  7. // //
  8. // http://www.apache.org/licenses/LICENSE-2.0 //
  9. // //
  10. // Unless required by applicable law or agreed to in writing, software //
  11. // distributed under the License is distributed on an "AS IS" BASIS, //
  12. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //
  13. // See the License for the specific language governing permissions and //
  14. // limitations under the License. //
  15. // ======================================================================== //
  16. #pragma once
  17. #include "../common/scene.h"
  18. #include "../common/ray.h"
  19. namespace embree
  20. {
  21. namespace isa
  22. {
  23. template<typename Intersector>
  24. struct ArrayIntersector1
  25. {
  26. typedef typename Intersector::Primitive Primitive;
  27. typedef typename Intersector::Precalculations Precalculations;
  28. static const bool validIntersectorK = false;
  29. static __forceinline void intersect(Precalculations& pre, Ray& ray, IntersectContext* context, size_t ty, const Primitive* prim, size_t num, size_t& lazy_node)
  30. {
  31. for (size_t i=0; i<num; i++)
  32. Intersector::intersect(pre,ray,context,prim[i]);
  33. }
  34. static __forceinline bool occluded(Precalculations& pre, Ray& ray, IntersectContext* context, size_t ty, const Primitive* prim, size_t num, size_t& lazy_node)
  35. {
  36. for (size_t i=0; i<num; i++) {
  37. if (Intersector::occluded(pre,ray,context,prim[i]))
  38. return true;
  39. }
  40. return false;
  41. }
  42. static __forceinline size_t intersect(Precalculations* pre, size_t valid, Ray** rays, IntersectContext* context, size_t ty, const Primitive* prim, size_t num, size_t& lazy_node)
  43. {
  44. #if 0
  45. size_t valid_isec = 0;
  46. do {
  47. const size_t i = __bscf(valid);
  48. const float old_far = rays[i]->tfar;
  49. for (size_t n=0; n<num; n++)
  50. Intersector::intersect(pre[i],*rays[i],context,prim[n]);
  51. valid_isec |= (rays[i]->tfar < old_far) ? ((size_t)1 << i) : 0;
  52. } while(unlikely(valid));
  53. return valid_isec;
  54. #else
  55. return Intersector::intersect(pre,valid,rays,context,ty,prim,num);
  56. #endif
  57. }
  58. static __forceinline size_t occluded(Precalculations* pre, size_t valid, Ray** rays, IntersectContext* context, size_t ty, const Primitive* prim, size_t num, size_t& lazy_node)
  59. {
  60. size_t hit = 0;
  61. do {
  62. const size_t i = __bscf(valid);
  63. if (occluded(pre[i],*rays[i],context,ty,prim,num,lazy_node))
  64. {
  65. hit |= (size_t)1 << i;
  66. rays[i]->geomID = 0;
  67. }
  68. } while(valid);
  69. return hit;
  70. }
  71. template<int K>
  72. static __forceinline void intersectK(const vbool<K>& valid, /* PrecalculationsK& pre, */ RayK<K>& ray, IntersectContext* context, const Primitive* prim, size_t num, size_t& lazy_node)
  73. {
  74. }
  75. template<int K>
  76. static __forceinline vbool<K> occludedK(const vbool<K>& valid, /* PrecalculationsK& pre, */ RayK<K>& ray, IntersectContext* context, const Primitive* prim, size_t num, size_t& lazy_node)
  77. {
  78. return valid;
  79. }
  80. };
  81. template<typename Intersector1, typename Intersector2>
  82. struct Select2Intersector1
  83. {
  84. typedef void* Primitive;
  85. typedef typename Intersector1::Primitive* Primitive1;
  86. typedef typename Intersector2::Primitive* Primitive2;
  87. typedef typename Intersector1::Precalculations Precalculations1;
  88. typedef typename Intersector2::Precalculations Precalculations2;
  89. struct Precalculations : public Precalculations2
  90. {
  91. __forceinline Precalculations (const Ray& ray, const void* ptr, unsigned numTimeSteps)
  92. : Precalculations2(ray,ptr,numTimeSteps), pre1(ray,ptr,numTimeSteps) {}
  93. Precalculations1 pre1;
  94. };
  95. static __forceinline void intersect(Precalculations& pre, Ray& ray, IntersectContext* context, size_t ty, const Primitive* prim_i, size_t num, size_t& lazy_node)
  96. {
  97. if (likely(ty == 0)) {
  98. Primitive1 prim = (Primitive1) prim_i;
  99. for (size_t i=0; i<num; i++)
  100. Intersector1::intersect(pre.pre1,ray,context,prim[i]);
  101. } else {
  102. Primitive2 prim = (Primitive2) prim_i;
  103. for (size_t i=0; i<num; i++)
  104. Intersector2::intersect(pre,ray,context,prim[i]);
  105. }
  106. }
  107. static __forceinline bool occluded(Precalculations& pre, Ray& ray, IntersectContext* context, size_t ty, const Primitive* prim_i, size_t num, size_t& lazy_node)
  108. {
  109. if (likely(ty == 0)) {
  110. Primitive1 prim = (Primitive1) prim_i;
  111. for (size_t i=0; i<num; i++) {
  112. if (Intersector1::occluded(pre.pre1,ray,context,prim[i]))
  113. return true;
  114. }
  115. } else {
  116. Primitive2 prim = (Primitive2) prim_i;
  117. for (size_t i=0; i<num; i++) {
  118. if (Intersector2::occluded(pre,ray,context,prim[i]))
  119. return true;
  120. }
  121. }
  122. return false;
  123. }
  124. };
  125. template<int K, typename Intersector>
  126. struct ArrayIntersectorK_1
  127. {
  128. typedef typename Intersector::Primitive Primitive;
  129. typedef typename Intersector::Precalculations Precalculations;
  130. static __forceinline void intersect(const vbool<K>& valid, Precalculations& pre, RayK<K>& ray, IntersectContext* context, const Primitive* prim, size_t num, size_t& lazy_node)
  131. {
  132. for (size_t i=0; i<num; i++) {
  133. Intersector::intersect(valid,pre,ray,context,prim[i]);
  134. }
  135. }
  136. static __forceinline vbool<K> occluded(const vbool<K>& valid, Precalculations& pre, RayK<K>& ray, IntersectContext* context, const Primitive* prim, size_t num, size_t& lazy_node)
  137. {
  138. vbool<K> valid0 = valid;
  139. for (size_t i=0; i<num; i++) {
  140. valid0 &= !Intersector::occluded(valid0,pre,ray,context,prim[i]);
  141. if (none(valid0)) break;
  142. }
  143. return !valid0;
  144. }
  145. static __forceinline void intersect(Precalculations& pre, RayK<K>& ray, size_t k, IntersectContext* context, const Primitive* prim, size_t num, size_t& lazy_node)
  146. {
  147. for (size_t i=0; i<num; i++) {
  148. Intersector::intersect(pre,ray,k,context,prim[i]);
  149. }
  150. }
  151. static __forceinline bool occluded(Precalculations& pre, RayK<K>& ray, size_t k, IntersectContext* context, const Primitive* prim, size_t num, size_t& lazy_node)
  152. {
  153. for (size_t i=0; i<num; i++) {
  154. if (Intersector::occluded(pre,ray,k,context,prim[i]))
  155. return true;
  156. }
  157. return false;
  158. }
  159. };
  160. // =============================================================================================
  161. template<int K, typename Intersector1, typename IntersectorK>
  162. struct ArrayIntersectorKStream
  163. {
  164. typedef typename Intersector1::Primitive Primitive;
  165. typedef typename Intersector1::Precalculations Precalculations;
  166. typedef typename IntersectorK::Primitive PrimitiveK;
  167. typedef typename IntersectorK::Precalculations PrecalculationsK;
  168. static const bool validIntersectorK = true;
  169. static __forceinline void intersectK(const vbool<K>& valid, /* PrecalculationsK& pre, */ RayK<K>& ray, IntersectContext* context, const PrimitiveK* prim, size_t num, size_t& lazy_node)
  170. {
  171. PrecalculationsK pre(valid,ray,1); //todo: might cause trouble
  172. for (size_t i=0; i<num; i++) {
  173. IntersectorK::intersect(valid,pre,ray,context,prim[i]);
  174. }
  175. }
  176. static __forceinline vbool<K> occludedK(const vbool<K>& valid, /* PrecalculationsK& pre, */ RayK<K>& ray, IntersectContext* context, const PrimitiveK* prim, size_t num, size_t& lazy_node)
  177. {
  178. PrecalculationsK pre(valid,ray,1); //todo: might cause trouble
  179. vbool<K> valid0 = valid;
  180. for (size_t i=0; i<num; i++) {
  181. valid0 &= !IntersectorK::occluded(valid0,pre,ray,context,prim[i]);
  182. if (none(valid0)) break;
  183. }
  184. return !valid0;
  185. }
  186. static __forceinline void intersect(Precalculations& pre, Ray& ray, IntersectContext* context, size_t ty, const Primitive* prim, size_t num, size_t& lazy_node)
  187. {
  188. for (size_t i=0; i<num; i++)
  189. Intersector1::intersect(pre,ray,context,prim[i]);
  190. }
  191. static __forceinline bool occluded(Precalculations& pre, Ray& ray, IntersectContext* context, size_t ty, const Primitive* prim, size_t num, size_t& lazy_node)
  192. {
  193. for (size_t i=0; i<num; i++) {
  194. if (Intersector1::occluded(pre,ray,context,prim[i]))
  195. return true;
  196. }
  197. return false;
  198. }
  199. static __forceinline size_t intersect(Precalculations* pre, size_t valid, Ray** rays, IntersectContext* context, size_t ty, const Primitive* prim, size_t num, size_t& lazy_node)
  200. {
  201. return Intersector1::intersect(pre,valid,rays,context,ty,prim,num);
  202. }
  203. static __forceinline size_t occluded(Precalculations* pre, size_t valid, Ray** rays, IntersectContext* context, size_t ty, const Primitive* prim, size_t num, size_t& lazy_node)
  204. {
  205. //todo : fix
  206. size_t hit = 0;
  207. do {
  208. const size_t i = __bscf(valid);
  209. if (occluded(pre[i],*rays[i],context,ty,prim,num,lazy_node))
  210. {
  211. hit |= (size_t)1 << i;
  212. rays[i]->geomID = 0;
  213. }
  214. } while(valid);
  215. return hit;
  216. }
  217. };
  218. }
  219. }