accel.h 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556
  1. // Copyright 2009-2021 Intel Corporation
  2. // SPDX-License-Identifier: Apache-2.0
  3. #pragma once
  4. #include "default.h"
  5. #include "ray.h"
  6. #include "point_query.h"
  7. #include "context.h"
  8. namespace embree
  9. {
  10. class Scene;
  11. /*! Base class for the acceleration structure data. */
  12. class AccelData : public RefCount
  13. {
  14. ALIGNED_CLASS_(16);
  15. public:
  16. enum Type { TY_UNKNOWN = 0, TY_ACCELN = 1, TY_ACCEL_INSTANCE = 2, TY_BVH4 = 3, TY_BVH8 = 4 };
  17. public:
  18. AccelData (const Type type)
  19. : bounds(empty), type(type) {}
  20. /*! notifies the acceleration structure about the deletion of some geometry */
  21. virtual void deleteGeometry(size_t geomID) {};
  22. /*! clears the acceleration structure data */
  23. virtual void clear() = 0;
  24. /*! returns normal bounds */
  25. __forceinline BBox3fa getBounds() const {
  26. return bounds.bounds();
  27. }
  28. /*! returns bounds for some time */
  29. __forceinline BBox3fa getBounds(float t) const {
  30. return bounds.interpolate(t);
  31. }
  32. /*! returns linear bounds */
  33. __forceinline LBBox3fa getLinearBounds() const {
  34. return bounds;
  35. }
  36. /*! checks if acceleration structure is empty */
  37. __forceinline bool isEmpty() const {
  38. return bounds.bounds0.lower.x == float(pos_inf);
  39. }
  40. public:
  41. LBBox3fa bounds; // linear bounds
  42. Type type;
  43. };
  44. /*! Base class for all intersectable and buildable acceleration structures. */
  45. class Accel : public AccelData
  46. {
  47. ALIGNED_CLASS_(16);
  48. public:
  49. struct Intersectors;
  50. /*! Type of collide function */
  51. typedef void (*CollideFunc)(void* bvh0, void* bvh1, RTCCollideFunc callback, void* userPtr);
  52. /*! Type of point query function */
  53. typedef bool(*PointQueryFunc)(Intersectors* This, /*!< this pointer to accel */
  54. PointQuery* query, /*!< point query for lookup */
  55. PointQueryContext* context); /*!< point query context */
  56. /*! Type of intersect function pointer for single rays. */
  57. typedef void (*IntersectFunc)(Intersectors* This, /*!< this pointer to accel */
  58. RTCRayHit& ray, /*!< ray to intersect */
  59. IntersectContext* context);
  60. /*! Type of intersect function pointer for ray packets of size 4. */
  61. typedef void (*IntersectFunc4)(const void* valid, /*!< pointer to valid mask */
  62. Intersectors* This, /*!< this pointer to accel */
  63. RTCRayHit4& ray, /*!< ray packet to intersect */
  64. IntersectContext* context);
  65. /*! Type of intersect function pointer for ray packets of size 8. */
  66. typedef void (*IntersectFunc8)(const void* valid, /*!< pointer to valid mask */
  67. Intersectors* This, /*!< this pointer to accel */
  68. RTCRayHit8& ray, /*!< ray packet to intersect */
  69. IntersectContext* context);
  70. /*! Type of intersect function pointer for ray packets of size 16. */
  71. typedef void (*IntersectFunc16)(const void* valid, /*!< pointer to valid mask */
  72. Intersectors* This, /*!< this pointer to accel */
  73. RTCRayHit16& ray, /*!< ray packet to intersect */
  74. IntersectContext* context);
  75. /*! Type of intersect function pointer for ray packets of size N. */
  76. typedef void (*IntersectFuncN)(Intersectors* This, /*!< this pointer to accel */
  77. RTCRayHitN** ray, /*!< ray stream to intersect */
  78. const size_t N, /*!< number of rays in stream */
  79. IntersectContext* context /*!< layout flags */);
  80. /*! Type of occlusion function pointer for single rays. */
  81. typedef void (*OccludedFunc) (Intersectors* This, /*!< this pointer to accel */
  82. RTCRay& ray, /*!< ray to test occlusion */
  83. IntersectContext* context);
  84. /*! Type of occlusion function pointer for ray packets of size 4. */
  85. typedef void (*OccludedFunc4) (const void* valid, /*!< pointer to valid mask */
  86. Intersectors* This, /*!< this pointer to accel */
  87. RTCRay4& ray, /*!< ray packet to test occlusion. */
  88. IntersectContext* context);
  89. /*! Type of occlusion function pointer for ray packets of size 8. */
  90. typedef void (*OccludedFunc8) (const void* valid, /*!< pointer to valid mask */
  91. Intersectors* This, /*!< this pointer to accel */
  92. RTCRay8& ray, /*!< ray packet to test occlusion. */
  93. IntersectContext* context);
  94. /*! Type of occlusion function pointer for ray packets of size 16. */
  95. typedef void (*OccludedFunc16) (const void* valid, /*!< pointer to valid mask */
  96. Intersectors* This, /*!< this pointer to accel */
  97. RTCRay16& ray, /*!< ray packet to test occlusion. */
  98. IntersectContext* context);
  99. /*! Type of intersect function pointer for ray packets of size N. */
  100. typedef void (*OccludedFuncN)(Intersectors* This, /*!< this pointer to accel */
  101. RTCRayN** ray, /*!< ray stream to test occlusion */
  102. const size_t N, /*!< number of rays in stream */
  103. IntersectContext* context /*!< layout flags */);
  104. typedef void (*ErrorFunc) ();
  105. struct Collider
  106. {
  107. Collider (ErrorFunc error = nullptr)
  108. : collide((CollideFunc)error), name(nullptr) {}
  109. Collider (CollideFunc collide, const char* name)
  110. : collide(collide), name(name) {}
  111. operator bool() const { return name; }
  112. public:
  113. CollideFunc collide;
  114. const char* name;
  115. };
  116. struct Intersector1
  117. {
  118. Intersector1 (ErrorFunc error = nullptr)
  119. : intersect((IntersectFunc)error), occluded((OccludedFunc)error), name(nullptr) {}
  120. Intersector1 (IntersectFunc intersect, OccludedFunc occluded, const char* name)
  121. : intersect(intersect), occluded(occluded), pointQuery(nullptr), name(name) {}
  122. Intersector1 (IntersectFunc intersect, OccludedFunc occluded, PointQueryFunc pointQuery, const char* name)
  123. : intersect(intersect), occluded(occluded), pointQuery(pointQuery), name(name) {}
  124. operator bool() const { return name; }
  125. public:
  126. static const char* type;
  127. IntersectFunc intersect;
  128. OccludedFunc occluded;
  129. PointQueryFunc pointQuery;
  130. const char* name;
  131. };
  132. struct Intersector4
  133. {
  134. Intersector4 (ErrorFunc error = nullptr)
  135. : intersect((IntersectFunc4)error), occluded((OccludedFunc4)error), name(nullptr) {}
  136. Intersector4 (IntersectFunc4 intersect, OccludedFunc4 occluded, const char* name)
  137. : intersect(intersect), occluded(occluded), name(name) {}
  138. operator bool() const { return name; }
  139. public:
  140. static const char* type;
  141. IntersectFunc4 intersect;
  142. OccludedFunc4 occluded;
  143. const char* name;
  144. };
  145. struct Intersector8
  146. {
  147. Intersector8 (ErrorFunc error = nullptr)
  148. : intersect((IntersectFunc8)error), occluded((OccludedFunc8)error), name(nullptr) {}
  149. Intersector8 (IntersectFunc8 intersect, OccludedFunc8 occluded, const char* name)
  150. : intersect(intersect), occluded(occluded), name(name) {}
  151. operator bool() const { return name; }
  152. public:
  153. static const char* type;
  154. IntersectFunc8 intersect;
  155. OccludedFunc8 occluded;
  156. const char* name;
  157. };
  158. struct Intersector16
  159. {
  160. Intersector16 (ErrorFunc error = nullptr)
  161. : intersect((IntersectFunc16)error), occluded((OccludedFunc16)error), name(nullptr) {}
  162. Intersector16 (IntersectFunc16 intersect, OccludedFunc16 occluded, const char* name)
  163. : intersect(intersect), occluded(occluded), name(name) {}
  164. operator bool() const { return name; }
  165. public:
  166. static const char* type;
  167. IntersectFunc16 intersect;
  168. OccludedFunc16 occluded;
  169. const char* name;
  170. };
  171. struct IntersectorN
  172. {
  173. IntersectorN (ErrorFunc error = nullptr)
  174. : intersect((IntersectFuncN)error), occluded((OccludedFuncN)error), name(nullptr) {}
  175. IntersectorN (IntersectFuncN intersect, OccludedFuncN occluded, const char* name)
  176. : intersect(intersect), occluded(occluded), name(name) {}
  177. operator bool() const { return name; }
  178. public:
  179. static const char* type;
  180. IntersectFuncN intersect;
  181. OccludedFuncN occluded;
  182. const char* name;
  183. };
  184. struct Intersectors
  185. {
  186. Intersectors()
  187. : ptr(nullptr), leafIntersector(nullptr), collider(nullptr), intersector1(nullptr), intersector4(nullptr), intersector8(nullptr), intersector16(nullptr), intersectorN(nullptr) {}
  188. Intersectors (ErrorFunc error)
  189. : ptr(nullptr), leafIntersector(nullptr), collider(error), intersector1(error), intersector4(error), intersector8(error), intersector16(error), intersectorN(error) {}
  190. void print(size_t ident)
  191. {
  192. if (collider.name) {
  193. for (size_t i=0; i<ident; i++) std::cout << " ";
  194. std::cout << "collider = " << collider.name << std::endl;
  195. }
  196. if (intersector1.name) {
  197. for (size_t i=0; i<ident; i++) std::cout << " ";
  198. std::cout << "intersector1 = " << intersector1.name << std::endl;
  199. }
  200. if (intersector4.name) {
  201. for (size_t i=0; i<ident; i++) std::cout << " ";
  202. std::cout << "intersector4 = " << intersector4.name << std::endl;
  203. }
  204. if (intersector8.name) {
  205. for (size_t i=0; i<ident; i++) std::cout << " ";
  206. std::cout << "intersector8 = " << intersector8.name << std::endl;
  207. }
  208. if (intersector16.name) {
  209. for (size_t i=0; i<ident; i++) std::cout << " ";
  210. std::cout << "intersector16 = " << intersector16.name << std::endl;
  211. }
  212. if (intersectorN.name) {
  213. for (size_t i=0; i<ident; i++) std::cout << " ";
  214. std::cout << "intersectorN = " << intersectorN.name << std::endl;
  215. }
  216. }
  217. void select(bool filter)
  218. {
  219. if (intersector4_filter) {
  220. if (filter) intersector4 = intersector4_filter;
  221. else intersector4 = intersector4_nofilter;
  222. }
  223. if (intersector8_filter) {
  224. if (filter) intersector8 = intersector8_filter;
  225. else intersector8 = intersector8_nofilter;
  226. }
  227. if (intersector16_filter) {
  228. if (filter) intersector16 = intersector16_filter;
  229. else intersector16 = intersector16_nofilter;
  230. }
  231. if (intersectorN_filter) {
  232. if (filter) intersectorN = intersectorN_filter;
  233. else intersectorN = intersectorN_nofilter;
  234. }
  235. }
  236. __forceinline bool pointQuery (PointQuery* query, PointQueryContext* context) {
  237. assert(intersector1.pointQuery);
  238. return intersector1.pointQuery(this,query,context);
  239. }
  240. /*! collides two scenes */
  241. __forceinline void collide (Accel* scene0, Accel* scene1, RTCCollideFunc callback, void* userPtr) {
  242. assert(collider.collide);
  243. collider.collide(scene0->intersectors.ptr,scene1->intersectors.ptr,callback,userPtr);
  244. }
  245. /*! Intersects a single ray with the scene. */
  246. __forceinline void intersect (RTCRayHit& ray, IntersectContext* context) {
  247. assert(intersector1.intersect);
  248. intersector1.intersect(this,ray,context);
  249. }
  250. /*! Intersects a packet of 4 rays with the scene. */
  251. __forceinline void intersect4 (const void* valid, RTCRayHit4& ray, IntersectContext* context) {
  252. assert(intersector4.intersect);
  253. intersector4.intersect(valid,this,ray,context);
  254. }
  255. /*! Intersects a packet of 8 rays with the scene. */
  256. __forceinline void intersect8 (const void* valid, RTCRayHit8& ray, IntersectContext* context) {
  257. assert(intersector8.intersect);
  258. intersector8.intersect(valid,this,ray,context);
  259. }
  260. /*! Intersects a packet of 16 rays with the scene. */
  261. __forceinline void intersect16 (const void* valid, RTCRayHit16& ray, IntersectContext* context) {
  262. assert(intersector16.intersect);
  263. intersector16.intersect(valid,this,ray,context);
  264. }
  265. /*! Intersects a stream of N rays in SOA layout with the scene. */
  266. __forceinline void intersectN (RTCRayHitN** rayN, const size_t N, IntersectContext* context)
  267. {
  268. assert(intersectorN.intersect);
  269. intersectorN.intersect(this,rayN,N,context);
  270. }
  271. #if defined(__SSE__) || defined(__ARM_NEON)
  272. __forceinline void intersect(const vbool4& valid, RayHitK<4>& ray, IntersectContext* context) {
  273. const vint<4> mask = valid.mask32();
  274. intersect4(&mask,(RTCRayHit4&)ray,context);
  275. }
  276. #endif
  277. #if defined(__AVX__)
  278. __forceinline void intersect(const vbool8& valid, RayHitK<8>& ray, IntersectContext* context) {
  279. const vint<8> mask = valid.mask32();
  280. intersect8(&mask,(RTCRayHit8&)ray,context);
  281. }
  282. #endif
  283. #if defined(__AVX512F__)
  284. __forceinline void intersect(const vbool16& valid, RayHitK<16>& ray, IntersectContext* context) {
  285. const vint<16> mask = valid.mask32();
  286. intersect16(&mask,(RTCRayHit16&)ray,context);
  287. }
  288. #endif
  289. template<int K>
  290. __forceinline void intersectN (RayHitK<K>** rayN, const size_t N, IntersectContext* context)
  291. {
  292. intersectN((RTCRayHitN**)rayN,N,context);
  293. }
  294. /*! Tests if single ray is occluded by the scene. */
  295. __forceinline void occluded (RTCRay& ray, IntersectContext* context) {
  296. assert(intersector1.occluded);
  297. intersector1.occluded(this,ray,context);
  298. }
  299. /*! Tests if a packet of 4 rays is occluded by the scene. */
  300. __forceinline void occluded4 (const void* valid, RTCRay4& ray, IntersectContext* context) {
  301. assert(intersector4.occluded);
  302. intersector4.occluded(valid,this,ray,context);
  303. }
  304. /*! Tests if a packet of 8 rays is occluded by the scene. */
  305. __forceinline void occluded8 (const void* valid, RTCRay8& ray, IntersectContext* context) {
  306. assert(intersector8.occluded);
  307. intersector8.occluded(valid,this,ray,context);
  308. }
  309. /*! Tests if a packet of 16 rays is occluded by the scene. */
  310. __forceinline void occluded16 (const void* valid, RTCRay16& ray, IntersectContext* context) {
  311. assert(intersector16.occluded);
  312. intersector16.occluded(valid,this,ray,context);
  313. }
  314. /*! Tests if a stream of N rays in SOA layout is occluded by the scene. */
  315. __forceinline void occludedN (RTCRayN** rayN, const size_t N, IntersectContext* context)
  316. {
  317. assert(intersectorN.occluded);
  318. intersectorN.occluded(this,rayN,N,context);
  319. }
  320. #if defined(__SSE__) || defined(__ARM_NEON)
  321. __forceinline void occluded(const vbool4& valid, RayK<4>& ray, IntersectContext* context) {
  322. const vint<4> mask = valid.mask32();
  323. occluded4(&mask,(RTCRay4&)ray,context);
  324. }
  325. #endif
  326. #if defined(__AVX__)
  327. __forceinline void occluded(const vbool8& valid, RayK<8>& ray, IntersectContext* context) {
  328. const vint<8> mask = valid.mask32();
  329. occluded8(&mask,(RTCRay8&)ray,context);
  330. }
  331. #endif
  332. #if defined(__AVX512F__)
  333. __forceinline void occluded(const vbool16& valid, RayK<16>& ray, IntersectContext* context) {
  334. const vint<16> mask = valid.mask32();
  335. occluded16(&mask,(RTCRay16&)ray,context);
  336. }
  337. #endif
  338. template<int K>
  339. __forceinline void occludedN (RayK<K>** rayN, const size_t N, IntersectContext* context)
  340. {
  341. occludedN((RTCRayN**)rayN,N,context);
  342. }
  343. /*! Tests if single ray is occluded by the scene. */
  344. __forceinline void intersect(RTCRay& ray, IntersectContext* context) {
  345. occluded(ray, context);
  346. }
  347. /*! Tests if a packet of K rays is occluded by the scene. */
  348. template<int K>
  349. __forceinline void intersect(const vbool<K>& valid, RayK<K>& ray, IntersectContext* context) {
  350. occluded(valid, ray, context);
  351. }
  352. /*! Tests if a packet of N rays in SOA layout is occluded by the scene. */
  353. template<int K>
  354. __forceinline void intersectN(RayK<K>** rayN, const size_t N, IntersectContext* context) {
  355. occludedN(rayN, N, context);
  356. }
  357. public:
  358. AccelData* ptr;
  359. void* leafIntersector;
  360. Collider collider;
  361. Intersector1 intersector1;
  362. Intersector4 intersector4;
  363. Intersector4 intersector4_filter;
  364. Intersector4 intersector4_nofilter;
  365. Intersector8 intersector8;
  366. Intersector8 intersector8_filter;
  367. Intersector8 intersector8_nofilter;
  368. Intersector16 intersector16;
  369. Intersector16 intersector16_filter;
  370. Intersector16 intersector16_nofilter;
  371. IntersectorN intersectorN;
  372. IntersectorN intersectorN_filter;
  373. IntersectorN intersectorN_nofilter;
  374. };
  375. public:
  376. /*! Construction */
  377. Accel (const AccelData::Type type)
  378. : AccelData(type) {}
  379. /*! Construction */
  380. Accel (const AccelData::Type type, const Intersectors& intersectors)
  381. : AccelData(type), intersectors(intersectors) {}
  382. /*! Virtual destructor */
  383. virtual ~Accel() {}
  384. /*! makes the acceleration structure immutable */
  385. virtual void immutable () {}
  386. /*! build acceleration structure */
  387. virtual void build () = 0;
  388. public:
  389. Intersectors intersectors;
  390. };
  391. #define DEFINE_COLLIDER(symbol,collider) \
  392. Accel::Collider symbol() { \
  393. return Accel::Collider((Accel::CollideFunc)collider::collide, \
  394. TOSTRING(isa) "::" TOSTRING(symbol)); \
  395. }
  396. #define DEFINE_INTERSECTOR1(symbol,intersector) \
  397. Accel::Intersector1 symbol() { \
  398. return Accel::Intersector1((Accel::IntersectFunc )intersector::intersect, \
  399. (Accel::OccludedFunc )intersector::occluded, \
  400. (Accel::PointQueryFunc)intersector::pointQuery,\
  401. TOSTRING(isa) "::" TOSTRING(symbol)); \
  402. }
  403. #define DEFINE_INTERSECTOR4(symbol,intersector) \
  404. Accel::Intersector4 symbol() { \
  405. return Accel::Intersector4((Accel::IntersectFunc4)intersector::intersect, \
  406. (Accel::OccludedFunc4)intersector::occluded, \
  407. TOSTRING(isa) "::" TOSTRING(symbol)); \
  408. }
  409. #define DEFINE_INTERSECTOR8(symbol,intersector) \
  410. Accel::Intersector8 symbol() { \
  411. return Accel::Intersector8((Accel::IntersectFunc8)intersector::intersect, \
  412. (Accel::OccludedFunc8)intersector::occluded, \
  413. TOSTRING(isa) "::" TOSTRING(symbol)); \
  414. }
  415. #define DEFINE_INTERSECTOR16(symbol,intersector) \
  416. Accel::Intersector16 symbol() { \
  417. return Accel::Intersector16((Accel::IntersectFunc16)intersector::intersect, \
  418. (Accel::OccludedFunc16)intersector::occluded, \
  419. TOSTRING(isa) "::" TOSTRING(symbol)); \
  420. }
  421. #define DEFINE_INTERSECTORN(symbol,intersector) \
  422. Accel::IntersectorN symbol() { \
  423. return Accel::IntersectorN((Accel::IntersectFuncN)intersector::intersect, \
  424. (Accel::OccludedFuncN)intersector::occluded, \
  425. TOSTRING(isa) "::" TOSTRING(symbol)); \
  426. }
  427. /* ray stream filter interface */
  428. typedef void (*intersectStreamAOS_func)(Scene* scene, RTCRayHit* _rayN, const size_t N, const size_t stride, IntersectContext* context);
  429. typedef void (*intersectStreamAOP_func)(Scene* scene, RTCRayHit** _rayN, const size_t N, IntersectContext* context);
  430. typedef void (*intersectStreamSOA_func)(Scene* scene, char* rayN, const size_t N, const size_t streams, const size_t stream_offset, IntersectContext* context);
  431. typedef void (*intersectStreamSOP_func)(Scene* scene, const RTCRayHitNp* rayN, const size_t N, IntersectContext* context);
  432. typedef void (*occludedStreamAOS_func)(Scene* scene, RTCRay* _rayN, const size_t N, const size_t stride, IntersectContext* context);
  433. typedef void (*occludedStreamAOP_func)(Scene* scene, RTCRay** _rayN, const size_t N, IntersectContext* context);
  434. typedef void (*occludedStreamSOA_func)(Scene* scene, char* rayN, const size_t N, const size_t streams, const size_t stream_offset, IntersectContext* context);
  435. typedef void (*occludedStreamSOP_func)(Scene* scene, const RTCRayNp* rayN, const size_t N, IntersectContext* context);
  436. struct RayStreamFilterFuncs
  437. {
  438. RayStreamFilterFuncs()
  439. : intersectAOS(nullptr), intersectAOP(nullptr), intersectSOA(nullptr), intersectSOP(nullptr),
  440. occludedAOS(nullptr), occludedAOP(nullptr), occludedSOA(nullptr), occludedSOP(nullptr) {}
  441. RayStreamFilterFuncs(void (*ptr) ())
  442. : intersectAOS((intersectStreamAOS_func) ptr), intersectAOP((intersectStreamAOP_func) ptr), intersectSOA((intersectStreamSOA_func) ptr), intersectSOP((intersectStreamSOP_func) ptr),
  443. occludedAOS((occludedStreamAOS_func) ptr), occludedAOP((occludedStreamAOP_func) ptr), occludedSOA((occludedStreamSOA_func) ptr), occludedSOP((occludedStreamSOP_func) ptr) {}
  444. RayStreamFilterFuncs(intersectStreamAOS_func intersectAOS, intersectStreamAOP_func intersectAOP, intersectStreamSOA_func intersectSOA, intersectStreamSOP_func intersectSOP,
  445. occludedStreamAOS_func occludedAOS, occludedStreamAOP_func occludedAOP, occludedStreamSOA_func occludedSOA, occludedStreamSOP_func occludedSOP)
  446. : intersectAOS(intersectAOS), intersectAOP(intersectAOP), intersectSOA(intersectSOA), intersectSOP(intersectSOP),
  447. occludedAOS(occludedAOS), occludedAOP(occludedAOP), occludedSOA(occludedSOA), occludedSOP(occludedSOP) {}
  448. public:
  449. intersectStreamAOS_func intersectAOS;
  450. intersectStreamAOP_func intersectAOP;
  451. intersectStreamSOA_func intersectSOA;
  452. intersectStreamSOP_func intersectSOP;
  453. occludedStreamAOS_func occludedAOS;
  454. occludedStreamAOP_func occludedAOP;
  455. occludedStreamSOA_func occludedSOA;
  456. occludedStreamSOP_func occludedSOP;
  457. };
  458. typedef RayStreamFilterFuncs (*RayStreamFilterFuncsType)();
  459. }