bvh4_factory.cpp 71 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348
  1. // Copyright 2009-2021 Intel Corporation
  2. // SPDX-License-Identifier: Apache-2.0
  3. #include "bvh4_factory.h"
  4. #include "../bvh/bvh.h"
  5. #include "../geometry/curveNv.h"
  6. #include "../geometry/curveNi.h"
  7. #include "../geometry/curveNi_mb.h"
  8. #include "../geometry/linei.h"
  9. #include "../geometry/triangle.h"
  10. #include "../geometry/trianglev.h"
  11. #include "../geometry/trianglev_mb.h"
  12. #include "../geometry/trianglei.h"
  13. #include "../geometry/quadv.h"
  14. #include "../geometry/quadi.h"
  15. #include "../geometry/subdivpatch1.h"
  16. #include "../geometry/object.h"
  17. #include "../geometry/instance.h"
  18. #include "../geometry/instance_array.h"
  19. #include "../geometry/subgrid.h"
  20. #include "../common/accelinstance.h"
  21. namespace embree
  22. {
  23. DECLARE_SYMBOL2(Accel::Collider,BVH4ColliderUserGeom);
  24. DECLARE_ISA_FUNCTION(VirtualCurveIntersector*,VirtualCurveIntersector4i,void);
  25. DECLARE_ISA_FUNCTION(VirtualCurveIntersector*,VirtualCurveIntersector8i,void);
  26. DECLARE_ISA_FUNCTION(VirtualCurveIntersector*,VirtualCurveIntersector4v,void);
  27. DECLARE_ISA_FUNCTION(VirtualCurveIntersector*,VirtualCurveIntersector8v,void);
  28. DECLARE_ISA_FUNCTION(VirtualCurveIntersector*,VirtualCurveIntersector4iMB,void);
  29. DECLARE_ISA_FUNCTION(VirtualCurveIntersector*,VirtualCurveIntersector8iMB,void);
  30. DECLARE_SYMBOL2(Accel::Intersector1,BVH4OBBVirtualCurveIntersector1);
  31. DECLARE_SYMBOL2(Accel::Intersector1,BVH4OBBVirtualCurveIntersector1MB);
  32. DECLARE_SYMBOL2(Accel::Intersector1,BVH4OBBVirtualCurveIntersectorRobust1);
  33. DECLARE_SYMBOL2(Accel::Intersector1,BVH4OBBVirtualCurveIntersectorRobust1MB);
  34. DECLARE_SYMBOL2(Accel::Intersector1,BVH4Triangle4Intersector1Moeller);
  35. DECLARE_SYMBOL2(Accel::Intersector1,BVH4Triangle4iIntersector1Moeller);
  36. DECLARE_SYMBOL2(Accel::Intersector1,BVH4Triangle4vIntersector1Pluecker);
  37. DECLARE_SYMBOL2(Accel::Intersector1,BVH4Triangle4iIntersector1Pluecker);
  38. DECLARE_SYMBOL2(Accel::Intersector1,BVH4Triangle4vMBIntersector1Moeller);
  39. DECLARE_SYMBOL2(Accel::Intersector1,BVH4Triangle4iMBIntersector1Moeller);
  40. DECLARE_SYMBOL2(Accel::Intersector1,BVH4Triangle4vMBIntersector1Pluecker);
  41. DECLARE_SYMBOL2(Accel::Intersector1,BVH4Triangle4iMBIntersector1Pluecker);
  42. DECLARE_SYMBOL2(Accel::Intersector1,BVH4Quad4vIntersector1Moeller);
  43. DECLARE_SYMBOL2(Accel::Intersector1,BVH4Quad4iIntersector1Moeller);
  44. DECLARE_SYMBOL2(Accel::Intersector1,BVH4Quad4vIntersector1Pluecker);
  45. DECLARE_SYMBOL2(Accel::Intersector1,BVH4Quad4iIntersector1Pluecker);
  46. DECLARE_SYMBOL2(Accel::Intersector1,BVH4Quad4iMBIntersector1Moeller);
  47. DECLARE_SYMBOL2(Accel::Intersector1,BVH4Quad4iMBIntersector1Pluecker);
  48. DECLARE_SYMBOL2(Accel::Intersector1,QBVH4Triangle4iIntersector1Pluecker);
  49. DECLARE_SYMBOL2(Accel::Intersector1,QBVH4Quad4iIntersector1Pluecker);
  50. DECLARE_SYMBOL2(Accel::Intersector1,BVH4SubdivPatch1Intersector1);
  51. DECLARE_SYMBOL2(Accel::Intersector1,BVH4SubdivPatch1MBIntersector1);
  52. DECLARE_SYMBOL2(Accel::Intersector1,BVH4VirtualIntersector1);
  53. DECLARE_SYMBOL2(Accel::Intersector1,BVH4VirtualMBIntersector1);
  54. DECLARE_SYMBOL2(Accel::Intersector1,BVH4InstanceIntersector1);
  55. DECLARE_SYMBOL2(Accel::Intersector1,BVH4InstanceMBIntersector1);
  56. DECLARE_SYMBOL2(Accel::Intersector1,BVH4InstanceArrayIntersector1);
  57. DECLARE_SYMBOL2(Accel::Intersector1,BVH4InstanceArrayMBIntersector1);
  58. DECLARE_SYMBOL2(Accel::Intersector1,BVH4GridIntersector1Moeller);
  59. DECLARE_SYMBOL2(Accel::Intersector1,BVH4GridMBIntersector1Moeller);
  60. DECLARE_SYMBOL2(Accel::Intersector1,BVH4GridIntersector1Pluecker);
  61. DECLARE_SYMBOL2(Accel::Intersector4,BVH4OBBVirtualCurveIntersector4Hybrid);
  62. DECLARE_SYMBOL2(Accel::Intersector4,BVH4OBBVirtualCurveIntersector4HybridMB);
  63. DECLARE_SYMBOL2(Accel::Intersector4,BVH4OBBVirtualCurveIntersectorRobust4Hybrid);
  64. DECLARE_SYMBOL2(Accel::Intersector4,BVH4OBBVirtualCurveIntersectorRobust4HybridMB);
  65. DECLARE_SYMBOL2(Accel::Intersector4,BVH4Triangle4Intersector4HybridMoeller);
  66. DECLARE_SYMBOL2(Accel::Intersector4,BVH4Triangle4Intersector4HybridMoellerNoFilter);
  67. DECLARE_SYMBOL2(Accel::Intersector4,BVH4Triangle4iIntersector4HybridMoeller);
  68. DECLARE_SYMBOL2(Accel::Intersector4,BVH4Triangle4vIntersector4HybridPluecker);
  69. DECLARE_SYMBOL2(Accel::Intersector4,BVH4Triangle4iIntersector4HybridPluecker);
  70. DECLARE_SYMBOL2(Accel::Intersector4,BVH4Triangle4vMBIntersector4HybridMoeller);
  71. DECLARE_SYMBOL2(Accel::Intersector4,BVH4Triangle4iMBIntersector4HybridMoeller);
  72. DECLARE_SYMBOL2(Accel::Intersector4,BVH4Triangle4vMBIntersector4HybridPluecker);
  73. DECLARE_SYMBOL2(Accel::Intersector4,BVH4Triangle4iMBIntersector4HybridPluecker);
  74. DECLARE_SYMBOL2(Accel::Intersector4,BVH4Quad4vIntersector4HybridMoeller);
  75. DECLARE_SYMBOL2(Accel::Intersector4,BVH4Quad4vIntersector4HybridMoellerNoFilter);
  76. DECLARE_SYMBOL2(Accel::Intersector4,BVH4Quad4iIntersector4HybridMoeller);
  77. DECLARE_SYMBOL2(Accel::Intersector4,BVH4Quad4vIntersector4HybridPluecker);
  78. DECLARE_SYMBOL2(Accel::Intersector4,BVH4Quad4iIntersector4HybridPluecker);
  79. DECLARE_SYMBOL2(Accel::Intersector4,BVH4Quad4iMBIntersector4HybridMoeller);
  80. DECLARE_SYMBOL2(Accel::Intersector4,BVH4Quad4iMBIntersector4HybridPluecker);
  81. DECLARE_SYMBOL2(Accel::Intersector4,BVH4SubdivPatch1Intersector4);
  82. DECLARE_SYMBOL2(Accel::Intersector4,BVH4SubdivPatch1MBIntersector4);
  83. DECLARE_SYMBOL2(Accel::Intersector4,BVH4VirtualIntersector4Chunk);
  84. DECLARE_SYMBOL2(Accel::Intersector4,BVH4VirtualMBIntersector4Chunk);
  85. DECLARE_SYMBOL2(Accel::Intersector4,BVH4InstanceIntersector4Chunk);
  86. DECLARE_SYMBOL2(Accel::Intersector4,BVH4InstanceMBIntersector4Chunk);
  87. DECLARE_SYMBOL2(Accel::Intersector4,BVH4InstanceArrayIntersector4Chunk);
  88. DECLARE_SYMBOL2(Accel::Intersector4,BVH4InstanceArrayMBIntersector4Chunk);
  89. DECLARE_SYMBOL2(Accel::Intersector4,BVH4GridIntersector4HybridMoeller);
  90. DECLARE_SYMBOL2(Accel::Intersector4,BVH4GridMBIntersector4HybridMoeller);
  91. DECLARE_SYMBOL2(Accel::Intersector4,BVH4GridIntersector4HybridPluecker);
  92. DECLARE_SYMBOL2(Accel::Intersector8,BVH4OBBVirtualCurveIntersector8Hybrid);
  93. DECLARE_SYMBOL2(Accel::Intersector8,BVH4OBBVirtualCurveIntersector8HybridMB);
  94. DECLARE_SYMBOL2(Accel::Intersector8,BVH4OBBVirtualCurveIntersectorRobust8Hybrid);
  95. DECLARE_SYMBOL2(Accel::Intersector8,BVH4OBBVirtualCurveIntersectorRobust8HybridMB);
  96. DECLARE_SYMBOL2(Accel::Intersector8,BVH4Triangle4Intersector8HybridMoeller);
  97. DECLARE_SYMBOL2(Accel::Intersector8,BVH4Triangle4Intersector8HybridMoellerNoFilter);
  98. DECLARE_SYMBOL2(Accel::Intersector8,BVH4Triangle4iIntersector8HybridMoeller);
  99. DECLARE_SYMBOL2(Accel::Intersector8,BVH4Triangle4vIntersector8HybridPluecker);
  100. DECLARE_SYMBOL2(Accel::Intersector8,BVH4Triangle4iIntersector8HybridPluecker);
  101. DECLARE_SYMBOL2(Accel::Intersector8,BVH4Triangle4vMBIntersector8HybridMoeller);
  102. DECLARE_SYMBOL2(Accel::Intersector8,BVH4Triangle4iMBIntersector8HybridMoeller);
  103. DECLARE_SYMBOL2(Accel::Intersector8,BVH4Triangle4vMBIntersector8HybridPluecker);
  104. DECLARE_SYMBOL2(Accel::Intersector8,BVH4Triangle4iMBIntersector8HybridPluecker);
  105. DECLARE_SYMBOL2(Accel::Intersector8,BVH4Quad4vIntersector8HybridMoeller);
  106. DECLARE_SYMBOL2(Accel::Intersector8,BVH4Quad4vIntersector8HybridMoellerNoFilter);
  107. DECLARE_SYMBOL2(Accel::Intersector8,BVH4Quad4iIntersector8HybridMoeller);
  108. DECLARE_SYMBOL2(Accel::Intersector8,BVH4Quad4vIntersector8HybridPluecker);
  109. DECLARE_SYMBOL2(Accel::Intersector8,BVH4Quad4iIntersector8HybridPluecker);
  110. DECLARE_SYMBOL2(Accel::Intersector8,BVH4Quad4iMBIntersector8HybridMoeller);
  111. DECLARE_SYMBOL2(Accel::Intersector8,BVH4Quad4iMBIntersector8HybridPluecker);
  112. DECLARE_SYMBOL2(Accel::Intersector8,BVH4SubdivPatch1Intersector8);
  113. DECLARE_SYMBOL2(Accel::Intersector8,BVH4SubdivPatch1MBIntersector8);
  114. DECLARE_SYMBOL2(Accel::Intersector8,BVH4VirtualIntersector8Chunk);
  115. DECLARE_SYMBOL2(Accel::Intersector8,BVH4VirtualMBIntersector8Chunk);
  116. DECLARE_SYMBOL2(Accel::Intersector8,BVH4InstanceIntersector8Chunk);
  117. DECLARE_SYMBOL2(Accel::Intersector8,BVH4InstanceMBIntersector8Chunk);
  118. DECLARE_SYMBOL2(Accel::Intersector8,BVH4InstanceArrayIntersector8Chunk);
  119. DECLARE_SYMBOL2(Accel::Intersector8,BVH4InstanceArrayMBIntersector8Chunk);
  120. DECLARE_SYMBOL2(Accel::Intersector8,BVH4GridIntersector8HybridMoeller);
  121. DECLARE_SYMBOL2(Accel::Intersector8,BVH4GridMBIntersector8HybridMoeller);
  122. DECLARE_SYMBOL2(Accel::Intersector8,BVH4GridIntersector8HybridPluecker);
  123. DECLARE_SYMBOL2(Accel::Intersector16,BVH4OBBVirtualCurveIntersector16Hybrid);
  124. DECLARE_SYMBOL2(Accel::Intersector16,BVH4OBBVirtualCurveIntersector16HybridMB);
  125. DECLARE_SYMBOL2(Accel::Intersector16,BVH4OBBVirtualCurveIntersectorRobust16Hybrid);
  126. DECLARE_SYMBOL2(Accel::Intersector16,BVH4OBBVirtualCurveIntersectorRobust16HybridMB);
  127. DECLARE_SYMBOL2(Accel::Intersector16,BVH4Triangle4Intersector16HybridMoeller);
  128. DECLARE_SYMBOL2(Accel::Intersector16,BVH4Triangle4Intersector16HybridMoellerNoFilter);
  129. DECLARE_SYMBOL2(Accel::Intersector16,BVH4Triangle4iIntersector16HybridMoeller);
  130. DECLARE_SYMBOL2(Accel::Intersector16,BVH4Triangle4vIntersector16HybridPluecker);
  131. DECLARE_SYMBOL2(Accel::Intersector16,BVH4Triangle4iIntersector16HybridPluecker);
  132. DECLARE_SYMBOL2(Accel::Intersector16,BVH4Triangle4vMBIntersector16HybridMoeller);
  133. DECLARE_SYMBOL2(Accel::Intersector16,BVH4Triangle4iMBIntersector16HybridMoeller);
  134. DECLARE_SYMBOL2(Accel::Intersector16,BVH4Triangle4vMBIntersector16HybridPluecker);
  135. DECLARE_SYMBOL2(Accel::Intersector16,BVH4Triangle4iMBIntersector16HybridPluecker);
  136. DECLARE_SYMBOL2(Accel::Intersector16,BVH4Quad4vIntersector16HybridMoeller);
  137. DECLARE_SYMBOL2(Accel::Intersector16,BVH4Quad4vIntersector16HybridMoellerNoFilter);
  138. DECLARE_SYMBOL2(Accel::Intersector16,BVH4Quad4iIntersector16HybridMoeller);
  139. DECLARE_SYMBOL2(Accel::Intersector16,BVH4Quad4vIntersector16HybridPluecker);
  140. DECLARE_SYMBOL2(Accel::Intersector16,BVH4Quad4iIntersector16HybridPluecker);
  141. DECLARE_SYMBOL2(Accel::Intersector16,BVH4Quad4iMBIntersector16HybridMoeller);
  142. DECLARE_SYMBOL2(Accel::Intersector16,BVH4Quad4iMBIntersector16HybridPluecker);
  143. DECLARE_SYMBOL2(Accel::Intersector16,BVH4SubdivPatch1Intersector16);
  144. DECLARE_SYMBOL2(Accel::Intersector16,BVH4SubdivPatch1MBIntersector16);
  145. DECLARE_SYMBOL2(Accel::Intersector16,BVH4VirtualIntersector16Chunk);
  146. DECLARE_SYMBOL2(Accel::Intersector16,BVH4VirtualMBIntersector16Chunk);
  147. DECLARE_SYMBOL2(Accel::Intersector16,BVH4InstanceIntersector16Chunk);
  148. DECLARE_SYMBOL2(Accel::Intersector16,BVH4InstanceMBIntersector16Chunk);
  149. DECLARE_SYMBOL2(Accel::Intersector16,BVH4InstanceArrayIntersector16Chunk);
  150. DECLARE_SYMBOL2(Accel::Intersector16,BVH4InstanceArrayMBIntersector16Chunk);
  151. DECLARE_SYMBOL2(Accel::Intersector16,BVH4GridIntersector16HybridMoeller);
  152. DECLARE_SYMBOL2(Accel::Intersector16,BVH4GridMBIntersector16HybridMoeller);
  153. DECLARE_SYMBOL2(Accel::Intersector16,BVH4GridIntersector16HybridPluecker);
  154. DECLARE_ISA_FUNCTION(Builder*,BVH4BuilderTwoLevelTriangle4MeshSAH,void* COMMA Scene* COMMA bool);
  155. DECLARE_ISA_FUNCTION(Builder*,BVH4BuilderTwoLevelTriangle4vMeshSAH,void* COMMA Scene* COMMA bool);
  156. DECLARE_ISA_FUNCTION(Builder*,BVH4BuilderTwoLevelTriangle4iMeshSAH,void* COMMA Scene* COMMA bool);
  157. DECLARE_ISA_FUNCTION(Builder*,BVH4BuilderTwoLevelQuadMeshSAH,void* COMMA Scene* COMMA bool);
  158. DECLARE_ISA_FUNCTION(Builder*,BVH4BuilderTwoLevelVirtualSAH,void* COMMA Scene* COMMA bool);
  159. DECLARE_ISA_FUNCTION(Builder*,BVH4BuilderTwoLevelInstanceSAH,void* COMMA Scene* COMMA Geometry::GTypeMask COMMA bool);
  160. DECLARE_ISA_FUNCTION(Builder*,BVH4BuilderTwoLevelInstanceArraySAH,void* COMMA Scene* COMMA Geometry::GTypeMask COMMA bool);
  161. DECLARE_ISA_FUNCTION(Builder*,BVH4Curve4vBuilder_OBB_New,void* COMMA Scene* COMMA size_t);
  162. DECLARE_ISA_FUNCTION(Builder*,BVH4Curve4iBuilder_OBB_New,void* COMMA Scene* COMMA size_t);
  163. DECLARE_ISA_FUNCTION(Builder*,BVH4OBBCurve4iMBBuilder_OBB,void* COMMA Scene* COMMA size_t);
  164. DECLARE_ISA_FUNCTION(Builder*,BVH4Curve8iBuilder_OBB_New,void* COMMA Scene* COMMA size_t);
  165. DECLARE_ISA_FUNCTION(Builder*,BVH4OBBCurve8iMBBuilder_OBB,void* COMMA Scene* COMMA size_t);
  166. DECLARE_ISA_FUNCTION(Builder*,BVH4Triangle4SceneBuilderSAH,void* COMMA Scene* COMMA size_t);
  167. DECLARE_ISA_FUNCTION(Builder*,BVH4Triangle4vSceneBuilderSAH,void* COMMA Scene* COMMA size_t);
  168. DECLARE_ISA_FUNCTION(Builder*,BVH4Triangle4iSceneBuilderSAH,void* COMMA Scene* COMMA size_t);
  169. DECLARE_ISA_FUNCTION(Builder*,BVH4Triangle4iMBSceneBuilderSAH,void* COMMA Scene* COMMA size_t);
  170. DECLARE_ISA_FUNCTION(Builder*,BVH4Triangle4vMBSceneBuilderSAH,void* COMMA Scene* COMMA size_t);
  171. DECLARE_ISA_FUNCTION(Builder*,BVH4QuantizedTriangle4iSceneBuilderSAH,void* COMMA Scene* COMMA size_t);
  172. DECLARE_ISA_FUNCTION(Builder*,BVH4Quad4vSceneBuilderSAH,void* COMMA Scene* COMMA size_t);
  173. DECLARE_ISA_FUNCTION(Builder*,BVH4Quad4iSceneBuilderSAH,void* COMMA Scene* COMMA size_t);
  174. DECLARE_ISA_FUNCTION(Builder*,BVH4Quad4iMBSceneBuilderSAH,void* COMMA Scene* COMMA size_t);
  175. DECLARE_ISA_FUNCTION(Builder*,BVH4QuantizedQuad4iSceneBuilderSAH,void* COMMA Scene* COMMA size_t);
  176. DECLARE_ISA_FUNCTION(Builder*,BVH4Triangle4SceneBuilderFastSpatialSAH,void* COMMA Scene* COMMA size_t);
  177. DECLARE_ISA_FUNCTION(Builder*,BVH4Triangle4vSceneBuilderFastSpatialSAH,void* COMMA Scene* COMMA size_t);
  178. DECLARE_ISA_FUNCTION(Builder*,BVH4Triangle4iSceneBuilderFastSpatialSAH,void* COMMA Scene* COMMA size_t);
  179. DECLARE_ISA_FUNCTION(Builder*,BVH4Quad4vSceneBuilderFastSpatialSAH,void* COMMA Scene* COMMA size_t);
  180. DECLARE_ISA_FUNCTION(Builder*,BVH4VirtualSceneBuilderSAH,void* COMMA Scene* COMMA size_t);
  181. DECLARE_ISA_FUNCTION(Builder*,BVH4VirtualMBSceneBuilderSAH,void* COMMA Scene* COMMA size_t);
  182. DECLARE_ISA_FUNCTION(Builder*,BVH4InstanceSceneBuilderSAH,void* COMMA Scene* COMMA Geometry::GTypeMask);
  183. DECLARE_ISA_FUNCTION(Builder*,BVH4InstanceMBSceneBuilderSAH,void* COMMA Scene* COMMA Geometry::GTypeMask);
  184. DECLARE_ISA_FUNCTION(Builder*,BVH4InstanceArraySceneBuilderSAH,void* COMMA Scene* COMMA Geometry::GTypeMask);
  185. DECLARE_ISA_FUNCTION(Builder*,BVH4InstanceArrayMBSceneBuilderSAH,void* COMMA Scene* COMMA Geometry::GTypeMask);
  186. DECLARE_ISA_FUNCTION(Builder*,BVH4GridSceneBuilderSAH,void* COMMA Scene* COMMA size_t);
  187. DECLARE_ISA_FUNCTION(Builder*,BVH4GridMBSceneBuilderSAH,void* COMMA Scene* COMMA size_t);
  188. DECLARE_ISA_FUNCTION(Builder*,BVH4SubdivPatch1BuilderSAH,void* COMMA Scene* COMMA size_t);
  189. DECLARE_ISA_FUNCTION(Builder*,BVH4SubdivPatch1MBBuilderSAH,void* COMMA Scene* COMMA size_t);
  190. DECLARE_ISA_FUNCTION(Builder*,BVH4Triangle4MeshRefitSAH,void* COMMA TriangleMesh* COMMA unsigned int COMMA size_t);
  191. DECLARE_ISA_FUNCTION(Builder*,BVH4Triangle4vMeshRefitSAH,void* COMMA TriangleMesh* COMMA unsigned int COMMA size_t);
  192. DECLARE_ISA_FUNCTION(Builder*,BVH4Triangle4iMeshRefitSAH,void* COMMA TriangleMesh* COMMA unsigned int COMMA size_t);
  193. DECLARE_ISA_FUNCTION(Builder*,BVH4Quad4vMeshRefitSAH,void* COMMA QuadMesh* COMMA unsigned int COMMA size_t);
  194. DECLARE_ISA_FUNCTION(Builder*,BVH4VirtualMeshRefitSAH,void* COMMA UserGeometry* COMMA unsigned int COMMA size_t);
  195. BVH4Factory::BVH4Factory(int bfeatures, int ifeatures)
  196. {
  197. SELECT_SYMBOL_DEFAULT_AVX_AVX2(ifeatures,BVH4ColliderUserGeom);
  198. selectBuilders(bfeatures);
  199. selectIntersectors(ifeatures);
  200. }
  201. void BVH4Factory::selectBuilders(int features)
  202. {
  203. IF_ENABLED_TRIS (SELECT_SYMBOL_DEFAULT_AVX(features,BVH4BuilderTwoLevelTriangle4MeshSAH));
  204. IF_ENABLED_TRIS (SELECT_SYMBOL_DEFAULT_AVX(features,BVH4BuilderTwoLevelTriangle4iMeshSAH));
  205. IF_ENABLED_TRIS (SELECT_SYMBOL_DEFAULT_AVX(features,BVH4BuilderTwoLevelTriangle4vMeshSAH));
  206. IF_ENABLED_QUADS (SELECT_SYMBOL_DEFAULT_AVX(features,BVH4BuilderTwoLevelQuadMeshSAH));
  207. IF_ENABLED_USER (SELECT_SYMBOL_DEFAULT_AVX(features,BVH4BuilderTwoLevelVirtualSAH));
  208. IF_ENABLED_INSTANCE (SELECT_SYMBOL_DEFAULT_AVX(features,BVH4BuilderTwoLevelInstanceSAH));
  209. IF_ENABLED_INSTANCE_ARRAY (SELECT_SYMBOL_DEFAULT_AVX(features,BVH4BuilderTwoLevelInstanceArraySAH));
  210. IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_DEFAULT_AVX(features,BVH4Curve4vBuilder_OBB_New));
  211. IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_DEFAULT_AVX(features,BVH4Curve4iBuilder_OBB_New));
  212. IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_DEFAULT_AVX(features,BVH4OBBCurve4iMBBuilder_OBB));
  213. IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX(features,BVH4Curve8iBuilder_OBB_New));
  214. IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX(features,BVH4OBBCurve8iMBBuilder_OBB));
  215. IF_ENABLED_TRIS(SELECT_SYMBOL_DEFAULT_AVX(features,BVH4Triangle4SceneBuilderSAH));
  216. IF_ENABLED_TRIS(SELECT_SYMBOL_DEFAULT_AVX(features,BVH4Triangle4vSceneBuilderSAH));
  217. IF_ENABLED_TRIS(SELECT_SYMBOL_DEFAULT_AVX(features,BVH4Triangle4iSceneBuilderSAH));
  218. IF_ENABLED_TRIS(SELECT_SYMBOL_DEFAULT_AVX(features,BVH4Triangle4iMBSceneBuilderSAH));
  219. IF_ENABLED_TRIS(SELECT_SYMBOL_DEFAULT_AVX(features,BVH4Triangle4vMBSceneBuilderSAH));
  220. IF_ENABLED_TRIS(SELECT_SYMBOL_DEFAULT_AVX(features,BVH4QuantizedTriangle4iSceneBuilderSAH));
  221. IF_ENABLED_QUADS(SELECT_SYMBOL_DEFAULT_AVX(features,BVH4Quad4vSceneBuilderSAH));
  222. IF_ENABLED_QUADS(SELECT_SYMBOL_DEFAULT_AVX(features,BVH4Quad4iSceneBuilderSAH));
  223. IF_ENABLED_QUADS(SELECT_SYMBOL_DEFAULT_AVX(features,BVH4Quad4iMBSceneBuilderSAH));
  224. IF_ENABLED_QUADS(SELECT_SYMBOL_DEFAULT_AVX(features,BVH4QuantizedQuad4iSceneBuilderSAH));
  225. IF_ENABLED_TRIS(SELECT_SYMBOL_DEFAULT_AVX(features,BVH4Triangle4SceneBuilderFastSpatialSAH));
  226. IF_ENABLED_TRIS(SELECT_SYMBOL_DEFAULT_AVX(features,BVH4Triangle4vSceneBuilderFastSpatialSAH));
  227. IF_ENABLED_TRIS(SELECT_SYMBOL_DEFAULT_AVX(features,BVH4Triangle4iSceneBuilderFastSpatialSAH));
  228. IF_ENABLED_QUADS(SELECT_SYMBOL_DEFAULT_AVX(features,BVH4Quad4vSceneBuilderFastSpatialSAH));
  229. IF_ENABLED_USER(SELECT_SYMBOL_DEFAULT_AVX(features,BVH4VirtualSceneBuilderSAH));
  230. IF_ENABLED_USER(SELECT_SYMBOL_DEFAULT_AVX(features,BVH4VirtualMBSceneBuilderSAH));
  231. IF_ENABLED_INSTANCE(SELECT_SYMBOL_DEFAULT_AVX(features,BVH4InstanceSceneBuilderSAH));
  232. IF_ENABLED_INSTANCE(SELECT_SYMBOL_DEFAULT_AVX(features,BVH4InstanceMBSceneBuilderSAH));
  233. IF_ENABLED_INSTANCE_ARRAY(SELECT_SYMBOL_DEFAULT_AVX(features,BVH4InstanceArraySceneBuilderSAH));
  234. IF_ENABLED_INSTANCE_ARRAY(SELECT_SYMBOL_DEFAULT_AVX(features,BVH4InstanceArrayMBSceneBuilderSAH));
  235. IF_ENABLED_GRIDS(SELECT_SYMBOL_DEFAULT_AVX(features,BVH4GridSceneBuilderSAH));
  236. IF_ENABLED_GRIDS(SELECT_SYMBOL_DEFAULT_AVX(features,BVH4GridMBSceneBuilderSAH));
  237. IF_ENABLED_SUBDIV(SELECT_SYMBOL_DEFAULT_AVX(features,BVH4SubdivPatch1BuilderSAH));
  238. IF_ENABLED_SUBDIV(SELECT_SYMBOL_DEFAULT_AVX(features,BVH4SubdivPatch1MBBuilderSAH));
  239. }
  240. void BVH4Factory::selectIntersectors(int features)
  241. {
  242. IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_DEFAULT_AVX_AVX2_AVX512(features,VirtualCurveIntersector4i));
  243. IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,VirtualCurveIntersector8i));
  244. IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_DEFAULT_AVX_AVX2_AVX512(features,VirtualCurveIntersector4v));
  245. IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,VirtualCurveIntersector8v));
  246. IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_DEFAULT_AVX_AVX2_AVX512(features,VirtualCurveIntersector4iMB));
  247. IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,VirtualCurveIntersector8iMB));
  248. /* select intersectors1 */
  249. IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_DEFAULT_AVX_AVX2_AVX512(features,BVH4OBBVirtualCurveIntersector1));
  250. IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_DEFAULT_AVX_AVX2_AVX512(features,BVH4OBBVirtualCurveIntersector1MB));
  251. IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_DEFAULT_AVX_AVX2_AVX512(features,BVH4OBBVirtualCurveIntersectorRobust1));
  252. IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_DEFAULT_AVX_AVX2_AVX512(features,BVH4OBBVirtualCurveIntersectorRobust1MB));
  253. IF_ENABLED_TRIS(SELECT_SYMBOL_DEFAULT_AVX_AVX2_AVX512(features,BVH4Triangle4Intersector1Moeller));
  254. IF_ENABLED_TRIS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX512(features,BVH4Triangle4iIntersector1Moeller));
  255. IF_ENABLED_TRIS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX512(features,BVH4Triangle4vIntersector1Pluecker));
  256. IF_ENABLED_TRIS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX512(features,BVH4Triangle4iIntersector1Pluecker));
  257. IF_ENABLED_TRIS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4Triangle4vMBIntersector1Moeller));
  258. IF_ENABLED_TRIS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4Triangle4iMBIntersector1Moeller));
  259. IF_ENABLED_TRIS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4Triangle4vMBIntersector1Pluecker));
  260. IF_ENABLED_TRIS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4Triangle4iMBIntersector1Pluecker));
  261. IF_ENABLED_QUADS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4Quad4vIntersector1Moeller));
  262. IF_ENABLED_QUADS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4Quad4iIntersector1Moeller));
  263. IF_ENABLED_QUADS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4Quad4vIntersector1Pluecker));
  264. IF_ENABLED_QUADS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4Quad4iIntersector1Pluecker));
  265. IF_ENABLED_QUADS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4Quad4iMBIntersector1Pluecker));
  266. IF_ENABLED_QUADS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4Quad4iMBIntersector1Moeller));
  267. IF_ENABLED_TRIS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX512(features,QBVH4Triangle4iIntersector1Pluecker));
  268. IF_ENABLED_QUADS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX512(features,QBVH4Quad4iIntersector1Pluecker));
  269. IF_ENABLED_SUBDIV(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4SubdivPatch1Intersector1));
  270. IF_ENABLED_SUBDIV(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4SubdivPatch1MBIntersector1));
  271. IF_ENABLED_USER(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4VirtualIntersector1));
  272. IF_ENABLED_USER(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4VirtualMBIntersector1));
  273. IF_ENABLED_INSTANCE(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4InstanceIntersector1));
  274. IF_ENABLED_INSTANCE(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4InstanceMBIntersector1));
  275. IF_ENABLED_INSTANCE_ARRAY(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4InstanceArrayIntersector1));
  276. IF_ENABLED_INSTANCE_ARRAY(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4InstanceArrayMBIntersector1));
  277. IF_ENABLED_GRIDS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4GridIntersector1Moeller));
  278. IF_ENABLED_GRIDS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4GridMBIntersector1Moeller))
  279. IF_ENABLED_GRIDS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4GridIntersector1Pluecker));
  280. #if defined (EMBREE_RAY_PACKETS)
  281. /* select intersectors4 */
  282. IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_DEFAULT_AVX_AVX2_AVX512(features,BVH4OBBVirtualCurveIntersector4Hybrid));
  283. IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_DEFAULT_AVX_AVX2_AVX512(features,BVH4OBBVirtualCurveIntersector4HybridMB));
  284. IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_DEFAULT_AVX_AVX2_AVX512(features,BVH4OBBVirtualCurveIntersectorRobust4Hybrid));
  285. IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_DEFAULT_AVX_AVX2_AVX512(features,BVH4OBBVirtualCurveIntersectorRobust4HybridMB));
  286. IF_ENABLED_TRIS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4Triangle4Intersector4HybridMoeller));
  287. IF_ENABLED_TRIS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4Triangle4Intersector4HybridMoellerNoFilter));
  288. IF_ENABLED_TRIS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4Triangle4iIntersector4HybridMoeller));
  289. IF_ENABLED_TRIS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4Triangle4vIntersector4HybridPluecker));
  290. IF_ENABLED_TRIS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4Triangle4iIntersector4HybridPluecker));
  291. IF_ENABLED_TRIS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4Triangle4vMBIntersector4HybridMoeller));
  292. IF_ENABLED_TRIS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4Triangle4iMBIntersector4HybridMoeller));
  293. IF_ENABLED_TRIS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4Triangle4vMBIntersector4HybridPluecker));
  294. IF_ENABLED_TRIS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4Triangle4iMBIntersector4HybridPluecker));
  295. IF_ENABLED_QUADS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4Quad4vIntersector4HybridMoeller));
  296. IF_ENABLED_QUADS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4Quad4vIntersector4HybridMoellerNoFilter));
  297. IF_ENABLED_QUADS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4Quad4iIntersector4HybridMoeller));
  298. IF_ENABLED_QUADS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4Quad4vIntersector4HybridPluecker));
  299. IF_ENABLED_QUADS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4Quad4iIntersector4HybridPluecker));
  300. IF_ENABLED_QUADS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4Quad4iMBIntersector4HybridMoeller));
  301. IF_ENABLED_QUADS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4Quad4iMBIntersector4HybridPluecker));
  302. IF_ENABLED_SUBDIV(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4SubdivPatch1Intersector4));
  303. IF_ENABLED_SUBDIV(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4SubdivPatch1MBIntersector4));
  304. IF_ENABLED_USER(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4VirtualIntersector4Chunk));
  305. IF_ENABLED_USER(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4VirtualMBIntersector4Chunk));
  306. IF_ENABLED_INSTANCE(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4InstanceIntersector4Chunk));
  307. IF_ENABLED_INSTANCE(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4InstanceMBIntersector4Chunk));
  308. IF_ENABLED_INSTANCE_ARRAY(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4InstanceArrayIntersector4Chunk));
  309. IF_ENABLED_INSTANCE_ARRAY(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4InstanceArrayMBIntersector4Chunk));
  310. IF_ENABLED_QUADS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4Quad4vIntersector4HybridMoeller));
  311. IF_ENABLED_GRIDS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4GridIntersector4HybridMoeller));
  312. IF_ENABLED_GRIDS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4GridMBIntersector4HybridMoeller));
  313. IF_ENABLED_GRIDS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4GridIntersector4HybridPluecker));
  314. /* select intersectors8 */
  315. IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH4OBBVirtualCurveIntersector8Hybrid));
  316. IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH4OBBVirtualCurveIntersector8HybridMB));
  317. IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH4OBBVirtualCurveIntersectorRobust8Hybrid));
  318. IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH4OBBVirtualCurveIntersectorRobust8HybridMB));
  319. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH4Triangle4Intersector8HybridMoeller));
  320. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH4Triangle4Intersector8HybridMoellerNoFilter));
  321. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH4Triangle4iIntersector8HybridMoeller));
  322. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH4Triangle4vIntersector8HybridPluecker));
  323. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH4Triangle4iIntersector8HybridPluecker));
  324. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH4Triangle4vMBIntersector8HybridMoeller));
  325. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH4Triangle4iMBIntersector8HybridMoeller));
  326. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH4Triangle4vMBIntersector8HybridPluecker));
  327. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH4Triangle4iMBIntersector8HybridPluecker));
  328. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH4Quad4vIntersector8HybridMoeller));
  329. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH4Quad4vIntersector8HybridMoellerNoFilter));
  330. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH4Quad4iIntersector8HybridMoeller));
  331. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH4Quad4vIntersector8HybridPluecker));
  332. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH4Quad4iIntersector8HybridPluecker));
  333. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH4Quad4iMBIntersector8HybridMoeller));
  334. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH4Quad4iMBIntersector8HybridPluecker));
  335. IF_ENABLED_SUBDIV(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH4SubdivPatch1Intersector8));
  336. IF_ENABLED_SUBDIV(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH4SubdivPatch1MBIntersector8));
  337. IF_ENABLED_USER(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH4VirtualIntersector8Chunk));
  338. IF_ENABLED_USER(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH4VirtualMBIntersector8Chunk));
  339. IF_ENABLED_INSTANCE(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH4InstanceIntersector8Chunk));
  340. IF_ENABLED_INSTANCE(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH4InstanceMBIntersector8Chunk));
  341. IF_ENABLED_INSTANCE_ARRAY(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH4InstanceArrayIntersector8Chunk));
  342. IF_ENABLED_INSTANCE_ARRAY(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH4InstanceArrayMBIntersector8Chunk));
  343. IF_ENABLED_GRIDS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH4GridIntersector8HybridMoeller));
  344. IF_ENABLED_GRIDS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH4GridMBIntersector8HybridMoeller));
  345. IF_ENABLED_GRIDS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH4GridIntersector8HybridPluecker));
  346. /* select intersectors16 */
  347. IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX512(features,BVH4OBBVirtualCurveIntersector16Hybrid));
  348. IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX512(features,BVH4OBBVirtualCurveIntersector16HybridMB));
  349. IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX512(features,BVH4OBBVirtualCurveIntersectorRobust16Hybrid));
  350. IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX512(features,BVH4OBBVirtualCurveIntersectorRobust16HybridMB));
  351. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX512(features,BVH4Triangle4Intersector16HybridMoeller));
  352. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX512(features,BVH4Triangle4Intersector16HybridMoellerNoFilter));
  353. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX512(features,BVH4Triangle4iIntersector16HybridMoeller));
  354. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX512(features,BVH4Triangle4vIntersector16HybridPluecker));
  355. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX512(features,BVH4Triangle4iIntersector16HybridPluecker));
  356. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX512(features,BVH4Triangle4vMBIntersector16HybridMoeller));
  357. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX512(features,BVH4Triangle4iMBIntersector16HybridMoeller));
  358. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX512(features,BVH4Triangle4vMBIntersector16HybridPluecker));
  359. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX512(features,BVH4Triangle4iMBIntersector16HybridPluecker));
  360. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX512(features,BVH4Quad4vIntersector16HybridMoeller));
  361. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX512(features,BVH4Quad4vIntersector16HybridMoellerNoFilter));
  362. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX512(features,BVH4Quad4iIntersector16HybridMoeller));
  363. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX512(features,BVH4Quad4vIntersector16HybridPluecker));
  364. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX512(features,BVH4Quad4iIntersector16HybridPluecker));
  365. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX512(features,BVH4Quad4iMBIntersector16HybridMoeller));
  366. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX512(features,BVH4Quad4iMBIntersector16HybridPluecker));
  367. IF_ENABLED_SUBDIV(SELECT_SYMBOL_INIT_AVX512(features,BVH4SubdivPatch1Intersector16));
  368. IF_ENABLED_SUBDIV(SELECT_SYMBOL_INIT_AVX512(features,BVH4SubdivPatch1MBIntersector16));
  369. IF_ENABLED_USER(SELECT_SYMBOL_INIT_AVX512(features,BVH4VirtualIntersector16Chunk));
  370. IF_ENABLED_USER(SELECT_SYMBOL_INIT_AVX512(features,BVH4VirtualMBIntersector16Chunk));
  371. IF_ENABLED_INSTANCE(SELECT_SYMBOL_INIT_AVX512(features,BVH4InstanceIntersector16Chunk));
  372. IF_ENABLED_INSTANCE(SELECT_SYMBOL_INIT_AVX512(features,BVH4InstanceMBIntersector16Chunk));
  373. IF_ENABLED_INSTANCE_ARRAY(SELECT_SYMBOL_INIT_AVX512(features,BVH4InstanceArrayIntersector16Chunk));
  374. IF_ENABLED_INSTANCE_ARRAY(SELECT_SYMBOL_INIT_AVX512(features,BVH4InstanceArrayMBIntersector16Chunk));
  375. IF_ENABLED_GRIDS(SELECT_SYMBOL_INIT_AVX512(features,BVH4GridIntersector16HybridMoeller));
  376. IF_ENABLED_GRIDS(SELECT_SYMBOL_INIT_AVX512(features,BVH4GridMBIntersector16HybridMoeller));
  377. IF_ENABLED_GRIDS(SELECT_SYMBOL_INIT_AVX512(features,BVH4GridIntersector16HybridPluecker));
  378. #endif
  379. }
  380. Accel::Intersectors BVH4Factory::BVH4OBBVirtualCurveIntersectors(BVH4* bvh, VirtualCurveIntersector* leafIntersector, IntersectVariant ivariant)
  381. {
  382. switch (ivariant) {
  383. case IntersectVariant::FAST:
  384. {
  385. Accel::Intersectors intersectors;
  386. intersectors.ptr = bvh;
  387. intersectors.leafIntersector = leafIntersector;
  388. intersectors.intersector1 = BVH4OBBVirtualCurveIntersector1();
  389. #if defined (EMBREE_RAY_PACKETS)
  390. intersectors.intersector4 = BVH4OBBVirtualCurveIntersector4Hybrid();
  391. intersectors.intersector8 = BVH4OBBVirtualCurveIntersector8Hybrid();
  392. intersectors.intersector16 = BVH4OBBVirtualCurveIntersector16Hybrid();
  393. #endif
  394. return intersectors;
  395. }
  396. case IntersectVariant::ROBUST:
  397. {
  398. Accel::Intersectors intersectors;
  399. intersectors.ptr = bvh;
  400. intersectors.leafIntersector = leafIntersector;
  401. intersectors.intersector1 = BVH4OBBVirtualCurveIntersectorRobust1();
  402. #if defined (EMBREE_RAY_PACKETS)
  403. intersectors.intersector4 = BVH4OBBVirtualCurveIntersectorRobust4Hybrid();
  404. intersectors.intersector8 = BVH4OBBVirtualCurveIntersectorRobust8Hybrid();
  405. intersectors.intersector16 = BVH4OBBVirtualCurveIntersectorRobust16Hybrid();
  406. #endif
  407. return intersectors;
  408. }
  409. default: assert(false);
  410. }
  411. return Accel::Intersectors();
  412. }
  413. Accel::Intersectors BVH4Factory::BVH4OBBVirtualCurveIntersectorsMB(BVH4* bvh, VirtualCurveIntersector* leafIntersector, IntersectVariant ivariant)
  414. {
  415. switch (ivariant) {
  416. case IntersectVariant::FAST:
  417. {
  418. Accel::Intersectors intersectors;
  419. intersectors.ptr = bvh;
  420. intersectors.leafIntersector = leafIntersector;
  421. intersectors.intersector1 = BVH4OBBVirtualCurveIntersector1MB();
  422. #if defined (EMBREE_RAY_PACKETS)
  423. intersectors.intersector4 = BVH4OBBVirtualCurveIntersector4HybridMB();
  424. intersectors.intersector8 = BVH4OBBVirtualCurveIntersector8HybridMB();
  425. intersectors.intersector16 = BVH4OBBVirtualCurveIntersector16HybridMB();
  426. #endif
  427. return intersectors;
  428. }
  429. case IntersectVariant::ROBUST:
  430. {
  431. Accel::Intersectors intersectors;
  432. intersectors.ptr = bvh;
  433. intersectors.leafIntersector = leafIntersector;
  434. intersectors.intersector1 = BVH4OBBVirtualCurveIntersectorRobust1MB();
  435. #if defined (EMBREE_RAY_PACKETS)
  436. intersectors.intersector4 = BVH4OBBVirtualCurveIntersectorRobust4HybridMB();
  437. intersectors.intersector8 = BVH4OBBVirtualCurveIntersectorRobust8HybridMB();
  438. intersectors.intersector16 = BVH4OBBVirtualCurveIntersectorRobust16HybridMB();
  439. #endif
  440. return intersectors;
  441. }
  442. default: assert(false);
  443. }
  444. return Accel::Intersectors();
  445. }
  446. Accel::Intersectors BVH4Factory::BVH4Triangle4Intersectors(BVH4* bvh, IntersectVariant ivariant)
  447. {
  448. assert(ivariant == IntersectVariant::FAST);
  449. Accel::Intersectors intersectors;
  450. intersectors.ptr = bvh;
  451. intersectors.intersector1 = BVH4Triangle4Intersector1Moeller();
  452. #if defined (EMBREE_RAY_PACKETS)
  453. intersectors.intersector4_filter = BVH4Triangle4Intersector4HybridMoeller();
  454. intersectors.intersector4_nofilter = BVH4Triangle4Intersector4HybridMoellerNoFilter();
  455. intersectors.intersector8_filter = BVH4Triangle4Intersector8HybridMoeller();
  456. intersectors.intersector8_nofilter = BVH4Triangle4Intersector8HybridMoellerNoFilter();
  457. intersectors.intersector16_filter = BVH4Triangle4Intersector16HybridMoeller();
  458. intersectors.intersector16_nofilter = BVH4Triangle4Intersector16HybridMoellerNoFilter();
  459. #endif
  460. return intersectors;
  461. }
  462. Accel::Intersectors BVH4Factory::BVH4Triangle4vIntersectors(BVH4* bvh, IntersectVariant ivariant)
  463. {
  464. assert(ivariant == IntersectVariant::ROBUST);
  465. Accel::Intersectors intersectors;
  466. intersectors.ptr = bvh;
  467. intersectors.intersector1 = BVH4Triangle4vIntersector1Pluecker();
  468. #if defined (EMBREE_RAY_PACKETS)
  469. intersectors.intersector4 = BVH4Triangle4vIntersector4HybridPluecker();
  470. intersectors.intersector8 = BVH4Triangle4vIntersector8HybridPluecker();
  471. intersectors.intersector16 = BVH4Triangle4vIntersector16HybridPluecker();
  472. #endif
  473. return intersectors;
  474. }
  475. Accel::Intersectors BVH4Factory::BVH4Triangle4iIntersectors(BVH4* bvh, IntersectVariant ivariant)
  476. {
  477. switch (ivariant) {
  478. case IntersectVariant::FAST:
  479. {
  480. Accel::Intersectors intersectors;
  481. intersectors.ptr = bvh;
  482. intersectors.intersector1 = BVH4Triangle4iIntersector1Moeller();
  483. #if defined (EMBREE_RAY_PACKETS)
  484. intersectors.intersector4 = BVH4Triangle4iIntersector4HybridMoeller();
  485. intersectors.intersector8 = BVH4Triangle4iIntersector8HybridMoeller();
  486. intersectors.intersector16 = BVH4Triangle4iIntersector16HybridMoeller();
  487. #endif
  488. return intersectors;
  489. }
  490. case IntersectVariant::ROBUST:
  491. {
  492. Accel::Intersectors intersectors;
  493. intersectors.ptr = bvh;
  494. intersectors.intersector1 = BVH4Triangle4iIntersector1Pluecker();
  495. #if defined (EMBREE_RAY_PACKETS)
  496. intersectors.intersector4 = BVH4Triangle4iIntersector4HybridPluecker();
  497. intersectors.intersector8 = BVH4Triangle4iIntersector8HybridPluecker();
  498. intersectors.intersector16 = BVH4Triangle4iIntersector16HybridPluecker();
  499. #endif
  500. return intersectors;
  501. }
  502. }
  503. return Accel::Intersectors();
  504. }
  505. Accel::Intersectors BVH4Factory::BVH4Triangle4vMBIntersectors(BVH4* bvh, IntersectVariant ivariant)
  506. {
  507. switch (ivariant) {
  508. case IntersectVariant::FAST:
  509. {
  510. Accel::Intersectors intersectors;
  511. intersectors.ptr = bvh;
  512. intersectors.intersector1 = BVH4Triangle4vMBIntersector1Moeller();
  513. #if defined (EMBREE_RAY_PACKETS)
  514. intersectors.intersector4 = BVH4Triangle4vMBIntersector4HybridMoeller();
  515. intersectors.intersector8 = BVH4Triangle4vMBIntersector8HybridMoeller();
  516. intersectors.intersector16 = BVH4Triangle4vMBIntersector16HybridMoeller();
  517. #endif
  518. return intersectors;
  519. }
  520. case IntersectVariant::ROBUST:
  521. {
  522. Accel::Intersectors intersectors;
  523. intersectors.ptr = bvh;
  524. intersectors.intersector1 = BVH4Triangle4vMBIntersector1Pluecker();
  525. #if defined (EMBREE_RAY_PACKETS)
  526. intersectors.intersector4 = BVH4Triangle4vMBIntersector4HybridPluecker();
  527. intersectors.intersector8 = BVH4Triangle4vMBIntersector8HybridPluecker();
  528. intersectors.intersector16 = BVH4Triangle4vMBIntersector16HybridPluecker();
  529. #endif
  530. return intersectors;
  531. }
  532. }
  533. return Accel::Intersectors();
  534. }
  535. Accel::Intersectors BVH4Factory::BVH4Triangle4iMBIntersectors(BVH4* bvh, IntersectVariant ivariant)
  536. {
  537. switch (ivariant) {
  538. case IntersectVariant::FAST:
  539. {
  540. Accel::Intersectors intersectors;
  541. intersectors.ptr = bvh;
  542. intersectors.intersector1 = BVH4Triangle4iMBIntersector1Moeller();
  543. #if defined (EMBREE_RAY_PACKETS)
  544. intersectors.intersector4 = BVH4Triangle4iMBIntersector4HybridMoeller();
  545. intersectors.intersector8 = BVH4Triangle4iMBIntersector8HybridMoeller();
  546. intersectors.intersector16 = BVH4Triangle4iMBIntersector16HybridMoeller();
  547. #endif
  548. return intersectors;
  549. }
  550. case IntersectVariant::ROBUST:
  551. {
  552. Accel::Intersectors intersectors;
  553. intersectors.ptr = bvh;
  554. intersectors.intersector1 = BVH4Triangle4iMBIntersector1Pluecker();
  555. #if defined (EMBREE_RAY_PACKETS)
  556. intersectors.intersector4 = BVH4Triangle4iMBIntersector4HybridPluecker();
  557. intersectors.intersector8 = BVH4Triangle4iMBIntersector8HybridPluecker();
  558. intersectors.intersector16 = BVH4Triangle4iMBIntersector16HybridPluecker();
  559. #endif
  560. return intersectors;
  561. }
  562. }
  563. return Accel::Intersectors();
  564. }
  565. Accel::Intersectors BVH4Factory::BVH4Quad4vIntersectors(BVH4* bvh, IntersectVariant ivariant)
  566. {
  567. switch (ivariant) {
  568. case IntersectVariant::FAST:
  569. {
  570. Accel::Intersectors intersectors;
  571. intersectors.ptr = bvh;
  572. intersectors.intersector1 = BVH4Quad4vIntersector1Moeller();
  573. #if defined (EMBREE_RAY_PACKETS)
  574. intersectors.intersector4_filter = BVH4Quad4vIntersector4HybridMoeller();
  575. intersectors.intersector4_nofilter = BVH4Quad4vIntersector4HybridMoellerNoFilter();
  576. intersectors.intersector8_filter = BVH4Quad4vIntersector8HybridMoeller();
  577. intersectors.intersector8_nofilter = BVH4Quad4vIntersector8HybridMoellerNoFilter();
  578. intersectors.intersector16_filter = BVH4Quad4vIntersector16HybridMoeller();
  579. intersectors.intersector16_nofilter = BVH4Quad4vIntersector16HybridMoellerNoFilter();
  580. #endif
  581. return intersectors;
  582. }
  583. case IntersectVariant::ROBUST:
  584. {
  585. Accel::Intersectors intersectors;
  586. intersectors.ptr = bvh;
  587. intersectors.intersector1 = BVH4Quad4vIntersector1Pluecker();
  588. #if defined (EMBREE_RAY_PACKETS)
  589. intersectors.intersector4 = BVH4Quad4vIntersector4HybridPluecker();
  590. intersectors.intersector8 = BVH4Quad4vIntersector8HybridPluecker();
  591. intersectors.intersector16 = BVH4Quad4vIntersector16HybridPluecker();
  592. #endif
  593. return intersectors;
  594. }
  595. }
  596. return Accel::Intersectors();
  597. }
  598. Accel::Intersectors BVH4Factory::BVH4Quad4iIntersectors(BVH4* bvh, IntersectVariant ivariant)
  599. {
  600. switch (ivariant) {
  601. case IntersectVariant::FAST:
  602. {
  603. Accel::Intersectors intersectors;
  604. intersectors.ptr = bvh;
  605. intersectors.intersector1 = BVH4Quad4iIntersector1Moeller();
  606. #if defined (EMBREE_RAY_PACKETS)
  607. intersectors.intersector4 = BVH4Quad4iIntersector4HybridMoeller();
  608. intersectors.intersector8 = BVH4Quad4iIntersector8HybridMoeller();
  609. intersectors.intersector16= BVH4Quad4iIntersector16HybridMoeller();
  610. #endif
  611. return intersectors;
  612. }
  613. case IntersectVariant::ROBUST:
  614. {
  615. Accel::Intersectors intersectors;
  616. intersectors.ptr = bvh;
  617. intersectors.intersector1 = BVH4Quad4iIntersector1Pluecker();
  618. #if defined (EMBREE_RAY_PACKETS)
  619. intersectors.intersector4 = BVH4Quad4iIntersector4HybridPluecker();
  620. intersectors.intersector8 = BVH4Quad4iIntersector8HybridPluecker();
  621. intersectors.intersector16= BVH4Quad4iIntersector16HybridPluecker();
  622. #endif
  623. return intersectors;
  624. }
  625. }
  626. return Accel::Intersectors();
  627. }
  628. Accel::Intersectors BVH4Factory::BVH4Quad4iMBIntersectors(BVH4* bvh, IntersectVariant ivariant)
  629. {
  630. switch (ivariant) {
  631. case IntersectVariant::FAST:
  632. {
  633. Accel::Intersectors intersectors;
  634. intersectors.ptr = bvh;
  635. intersectors.intersector1 = BVH4Quad4iMBIntersector1Moeller();
  636. #if defined (EMBREE_RAY_PACKETS)
  637. intersectors.intersector4 = BVH4Quad4iMBIntersector4HybridMoeller();
  638. intersectors.intersector8 = BVH4Quad4iMBIntersector8HybridMoeller();
  639. intersectors.intersector16= BVH4Quad4iMBIntersector16HybridMoeller();
  640. #endif
  641. return intersectors;
  642. }
  643. case IntersectVariant::ROBUST:
  644. {
  645. Accel::Intersectors intersectors;
  646. intersectors.ptr = bvh;
  647. intersectors.intersector1 = BVH4Quad4iMBIntersector1Pluecker();
  648. #if defined (EMBREE_RAY_PACKETS)
  649. intersectors.intersector4 = BVH4Quad4iMBIntersector4HybridPluecker();
  650. intersectors.intersector8 = BVH4Quad4iMBIntersector8HybridPluecker();
  651. intersectors.intersector16= BVH4Quad4iMBIntersector16HybridPluecker();
  652. #endif
  653. return intersectors;
  654. }
  655. }
  656. return Accel::Intersectors();
  657. }
  658. Accel::Intersectors BVH4Factory::QBVH4Triangle4iIntersectors(BVH4* bvh)
  659. {
  660. Accel::Intersectors intersectors;
  661. intersectors.ptr = bvh;
  662. intersectors.intersector1 = QBVH4Triangle4iIntersector1Pluecker();
  663. return intersectors;
  664. }
  665. Accel::Intersectors BVH4Factory::QBVH4Quad4iIntersectors(BVH4* bvh)
  666. {
  667. Accel::Intersectors intersectors;
  668. intersectors.ptr = bvh;
  669. intersectors.intersector1 = QBVH4Quad4iIntersector1Pluecker();
  670. return intersectors;
  671. }
  672. Accel::Intersectors BVH4Factory::BVH4UserGeometryIntersectors(BVH4* bvh)
  673. {
  674. Accel::Intersectors intersectors;
  675. intersectors.ptr = bvh;
  676. intersectors.intersector1 = BVH4VirtualIntersector1();
  677. #if defined (EMBREE_RAY_PACKETS)
  678. intersectors.intersector4 = BVH4VirtualIntersector4Chunk();
  679. intersectors.intersector8 = BVH4VirtualIntersector8Chunk();
  680. intersectors.intersector16 = BVH4VirtualIntersector16Chunk();
  681. #endif
  682. intersectors.collider = BVH4ColliderUserGeom();
  683. return intersectors;
  684. }
  685. Accel::Intersectors BVH4Factory::BVH4UserGeometryMBIntersectors(BVH4* bvh)
  686. {
  687. Accel::Intersectors intersectors;
  688. intersectors.ptr = bvh;
  689. intersectors.intersector1 = BVH4VirtualMBIntersector1();
  690. #if defined (EMBREE_RAY_PACKETS)
  691. intersectors.intersector4 = BVH4VirtualMBIntersector4Chunk();
  692. intersectors.intersector8 = BVH4VirtualMBIntersector8Chunk();
  693. intersectors.intersector16 = BVH4VirtualMBIntersector16Chunk();
  694. #endif
  695. return intersectors;
  696. }
  697. Accel::Intersectors BVH4Factory::BVH4InstanceIntersectors(BVH4* bvh)
  698. {
  699. Accel::Intersectors intersectors;
  700. intersectors.ptr = bvh;
  701. intersectors.intersector1 = BVH4InstanceIntersector1();
  702. #if defined (EMBREE_RAY_PACKETS)
  703. intersectors.intersector4 = BVH4InstanceIntersector4Chunk();
  704. intersectors.intersector8 = BVH4InstanceIntersector8Chunk();
  705. intersectors.intersector16 = BVH4InstanceIntersector16Chunk();
  706. #endif
  707. return intersectors;
  708. }
  709. Accel::Intersectors BVH4Factory::BVH4InstanceMBIntersectors(BVH4* bvh)
  710. {
  711. Accel::Intersectors intersectors;
  712. intersectors.ptr = bvh;
  713. intersectors.intersector1 = BVH4InstanceMBIntersector1();
  714. #if defined (EMBREE_RAY_PACKETS)
  715. intersectors.intersector4 = BVH4InstanceMBIntersector4Chunk();
  716. intersectors.intersector8 = BVH4InstanceMBIntersector8Chunk();
  717. intersectors.intersector16 = BVH4InstanceMBIntersector16Chunk();
  718. #endif
  719. return intersectors;
  720. }
  721. Accel::Intersectors BVH4Factory::BVH4InstanceArrayIntersectors(BVH4* bvh)
  722. {
  723. Accel::Intersectors intersectors;
  724. intersectors.ptr = bvh;
  725. intersectors.intersector1 = BVH4InstanceArrayIntersector1();
  726. #if defined (EMBREE_RAY_PACKETS)
  727. intersectors.intersector4 = BVH4InstanceArrayIntersector4Chunk();
  728. intersectors.intersector8 = BVH4InstanceArrayIntersector8Chunk();
  729. intersectors.intersector16 = BVH4InstanceArrayIntersector16Chunk();
  730. #endif
  731. return intersectors;
  732. }
  733. Accel::Intersectors BVH4Factory::BVH4InstanceArrayMBIntersectors(BVH4* bvh)
  734. {
  735. Accel::Intersectors intersectors;
  736. intersectors.ptr = bvh;
  737. intersectors.intersector1 = BVH4InstanceArrayMBIntersector1();
  738. #if defined (EMBREE_RAY_PACKETS)
  739. intersectors.intersector4 = BVH4InstanceArrayMBIntersector4Chunk();
  740. intersectors.intersector8 = BVH4InstanceArrayMBIntersector8Chunk();
  741. intersectors.intersector16 = BVH4InstanceArrayMBIntersector16Chunk();
  742. #endif
  743. return intersectors;
  744. }
  745. Accel::Intersectors BVH4Factory::BVH4SubdivPatch1Intersectors(BVH4* bvh)
  746. {
  747. Accel::Intersectors intersectors;
  748. intersectors.ptr = bvh;
  749. intersectors.intersector1 = BVH4SubdivPatch1Intersector1();
  750. #if defined (EMBREE_RAY_PACKETS)
  751. intersectors.intersector4 = BVH4SubdivPatch1Intersector4();
  752. intersectors.intersector8 = BVH4SubdivPatch1Intersector8();
  753. intersectors.intersector16 = BVH4SubdivPatch1Intersector16();
  754. #endif
  755. return intersectors;
  756. }
  757. Accel::Intersectors BVH4Factory::BVH4SubdivPatch1MBIntersectors(BVH4* bvh)
  758. {
  759. Accel::Intersectors intersectors;
  760. intersectors.ptr = bvh;
  761. intersectors.intersector1 = BVH4SubdivPatch1MBIntersector1();
  762. #if defined (EMBREE_RAY_PACKETS)
  763. intersectors.intersector4 = BVH4SubdivPatch1MBIntersector4();
  764. intersectors.intersector8 = BVH4SubdivPatch1MBIntersector8();
  765. intersectors.intersector16 = BVH4SubdivPatch1MBIntersector16();
  766. #endif
  767. return intersectors;
  768. }
  769. Accel* BVH4Factory::BVH4OBBVirtualCurve4i(Scene* scene, IntersectVariant ivariant)
  770. {
  771. BVH4* accel = new BVH4(Curve4i::type,scene);
  772. Accel::Intersectors intersectors = BVH4OBBVirtualCurveIntersectors(accel,VirtualCurveIntersector4i(),ivariant);
  773. Builder* builder = nullptr;
  774. if (scene->device->hair_builder == "default" ) builder = BVH4Curve4iBuilder_OBB_New(accel,scene,0);
  775. else if (scene->device->hair_builder == "sah" ) builder = BVH4Curve4iBuilder_OBB_New(accel,scene,0);
  776. else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder "+scene->device->hair_builder+" for BVH4OBB<VirtualCurve4i>");
  777. return new AccelInstance(accel,builder,intersectors);
  778. }
  779. #if defined(EMBREE_TARGET_SIMD8)
  780. Accel* BVH4Factory::BVH4OBBVirtualCurve8i(Scene* scene, IntersectVariant ivariant)
  781. {
  782. BVH4* accel = new BVH4(Curve8i::type,scene);
  783. Accel::Intersectors intersectors = BVH4OBBVirtualCurveIntersectors(accel,VirtualCurveIntersector8i(),ivariant);
  784. Builder* builder = nullptr;
  785. if (scene->device->hair_builder == "default" ) builder = BVH4Curve8iBuilder_OBB_New(accel,scene,0);
  786. else if (scene->device->hair_builder == "sah" ) builder = BVH4Curve8iBuilder_OBB_New(accel,scene,0);
  787. else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder "+scene->device->hair_builder+" for BVH4OBB<VirtualCurve8i>");
  788. return new AccelInstance(accel,builder,intersectors);
  789. }
  790. #endif
  791. Accel* BVH4Factory::BVH4OBBVirtualCurve4v(Scene* scene, IntersectVariant ivariant)
  792. {
  793. BVH4* accel = new BVH4(Curve4v::type,scene);
  794. Accel::Intersectors intersectors = BVH4OBBVirtualCurveIntersectors(accel,VirtualCurveIntersector4v(),ivariant);
  795. Builder* builder = nullptr;
  796. if (scene->device->hair_builder == "default" ) builder = BVH4Curve4vBuilder_OBB_New(accel,scene,0);
  797. else if (scene->device->hair_builder == "sah" ) builder = BVH4Curve4vBuilder_OBB_New(accel,scene,0);
  798. else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder "+scene->device->hair_builder+" for BVH4OBB<VirtualCurve4v>");
  799. return new AccelInstance(accel,builder,intersectors);
  800. }
  801. Accel* BVH4Factory::BVH4OBBVirtualCurve4iMB(Scene* scene, IntersectVariant ivariant)
  802. {
  803. BVH4* accel = new BVH4(Curve4iMB::type,scene);
  804. Accel::Intersectors intersectors = BVH4OBBVirtualCurveIntersectorsMB(accel,VirtualCurveIntersector4iMB(),ivariant);
  805. Builder* builder = nullptr;
  806. if (scene->device->hair_builder == "default" ) builder = BVH4OBBCurve4iMBBuilder_OBB(accel,scene,0);
  807. else if (scene->device->hair_builder == "sah" ) builder = BVH4OBBCurve4iMBBuilder_OBB(accel,scene,0);
  808. else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder "+scene->device->hair_builder+" for BVH4OBB<VirtualCurve4iMB>");
  809. return new AccelInstance(accel,builder,intersectors);
  810. }
  811. #if defined(EMBREE_TARGET_SIMD8)
  812. Accel* BVH4Factory::BVH4OBBVirtualCurve8iMB(Scene* scene, IntersectVariant ivariant)
  813. {
  814. BVH4* accel = new BVH4(Curve8iMB::type,scene);
  815. Accel::Intersectors intersectors = BVH4OBBVirtualCurveIntersectorsMB(accel,VirtualCurveIntersector8iMB(), ivariant);
  816. Builder* builder = nullptr;
  817. if (scene->device->hair_builder == "default" ) builder = BVH4OBBCurve8iMBBuilder_OBB(accel,scene,0);
  818. else if (scene->device->hair_builder == "sah" ) builder = BVH4OBBCurve8iMBBuilder_OBB(accel,scene,0);
  819. else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder "+scene->device->hair_builder+" for BVH4OBB<VirtualCurve8iMB>");
  820. return new AccelInstance(accel,builder,intersectors);
  821. }
  822. #endif
  823. Accel* BVH4Factory::BVH4Triangle4(Scene* scene, BuildVariant bvariant, IntersectVariant ivariant)
  824. {
  825. BVH4* accel = new BVH4(Triangle4::type,scene);
  826. Accel::Intersectors intersectors;
  827. if (scene->device->tri_traverser == "default") intersectors = BVH4Triangle4Intersectors(accel,ivariant);
  828. else if (scene->device->tri_traverser == "fast" ) intersectors = BVH4Triangle4Intersectors(accel,IntersectVariant::FAST);
  829. else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown traverser "+scene->device->tri_traverser+" for BVH4<Triangle4>");
  830. Builder* builder = nullptr;
  831. if (scene->device->tri_builder == "default") {
  832. switch (bvariant) {
  833. case BuildVariant::STATIC : builder = BVH4Triangle4SceneBuilderSAH(accel,scene,0); break;
  834. case BuildVariant::DYNAMIC : builder = BVH4BuilderTwoLevelTriangle4MeshSAH(accel,scene,false); break;
  835. case BuildVariant::HIGH_QUALITY: builder = BVH4Triangle4SceneBuilderFastSpatialSAH(accel,scene,0); break;
  836. }
  837. }
  838. else if (scene->device->tri_builder == "sah" ) builder = BVH4Triangle4SceneBuilderSAH(accel,scene,0);
  839. else if (scene->device->tri_builder == "sah_fast_spatial" ) builder = BVH4Triangle4SceneBuilderFastSpatialSAH(accel,scene,0);
  840. else if (scene->device->tri_builder == "sah_presplit") builder = BVH4Triangle4SceneBuilderSAH(accel,scene,MODE_HIGH_QUALITY);
  841. else if (scene->device->tri_builder == "dynamic" ) builder = BVH4BuilderTwoLevelTriangle4MeshSAH(accel,scene,false);
  842. else if (scene->device->tri_builder == "morton" ) builder = BVH4BuilderTwoLevelTriangle4MeshSAH(accel,scene,true);
  843. else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder "+scene->device->tri_builder+" for BVH4<Triangle4>");
  844. return new AccelInstance(accel,builder,intersectors);
  845. }
  846. Accel* BVH4Factory::BVH4Triangle4v(Scene* scene, BuildVariant bvariant, IntersectVariant ivariant)
  847. {
  848. BVH4* accel = new BVH4(Triangle4v::type,scene);
  849. Accel::Intersectors intersectors;
  850. if (scene->device->tri_traverser == "default") intersectors = BVH4Triangle4vIntersectors(accel,ivariant);
  851. else if (scene->device->tri_traverser == "fast" ) intersectors = BVH4Triangle4vIntersectors(accel,IntersectVariant::FAST);
  852. else if (scene->device->tri_traverser == "robust" ) intersectors = BVH4Triangle4vIntersectors(accel,IntersectVariant::ROBUST);
  853. else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown traverser "+scene->device->tri_traverser+" for BVH4<Triangle4>");
  854. Builder* builder = nullptr;
  855. if (scene->device->tri_builder == "default") {
  856. switch (bvariant) {
  857. case BuildVariant::STATIC : builder = BVH4Triangle4vSceneBuilderSAH(accel,scene,0); break;
  858. case BuildVariant::DYNAMIC : builder = BVH4BuilderTwoLevelTriangle4vMeshSAH(accel,scene,false); break;
  859. case BuildVariant::HIGH_QUALITY: builder = BVH4Triangle4vSceneBuilderFastSpatialSAH(accel,scene,0); break;
  860. }
  861. }
  862. else if (scene->device->tri_builder == "sah" ) builder = BVH4Triangle4vSceneBuilderSAH(accel,scene,0);
  863. else if (scene->device->tri_builder == "sah_fast_spatial" ) builder = BVH4Triangle4vSceneBuilderFastSpatialSAH(accel,scene,0);
  864. else if (scene->device->tri_builder == "sah_presplit") builder = BVH4Triangle4vSceneBuilderSAH(accel,scene,MODE_HIGH_QUALITY);
  865. else if (scene->device->tri_builder == "dynamic" ) builder = BVH4BuilderTwoLevelTriangle4vMeshSAH(accel,scene,false);
  866. else if (scene->device->tri_builder == "morton" ) builder = BVH4BuilderTwoLevelTriangle4vMeshSAH(accel,scene,true);
  867. else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder "+scene->device->tri_builder+" for BVH4<Triangle4v>");
  868. return new AccelInstance(accel,builder,intersectors);
  869. }
  870. Accel* BVH4Factory::BVH4Triangle4i(Scene* scene, BuildVariant bvariant, IntersectVariant ivariant)
  871. {
  872. BVH4* accel = new BVH4(Triangle4i::type,scene);
  873. Accel::Intersectors intersectors;
  874. if (scene->device->tri_traverser == "default") intersectors = BVH4Triangle4iIntersectors(accel,ivariant);
  875. else if (scene->device->tri_traverser == "fast" ) intersectors = BVH4Triangle4iIntersectors(accel,IntersectVariant::FAST);
  876. else if (scene->device->tri_traverser == "robust" ) intersectors = BVH4Triangle4iIntersectors(accel,IntersectVariant::ROBUST);
  877. else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown traverser "+scene->device->tri_traverser+" for BVH4<Triangle4i>");
  878. Builder* builder = nullptr;
  879. if (scene->device->tri_builder == "default" ) {
  880. switch (bvariant) {
  881. case BuildVariant::STATIC : builder = BVH4Triangle4iSceneBuilderSAH(accel,scene,0); break;
  882. case BuildVariant::DYNAMIC : builder = BVH4BuilderTwoLevelTriangle4iMeshSAH(accel,scene,false); break;
  883. case BuildVariant::HIGH_QUALITY: builder = BVH4Triangle4iSceneBuilderFastSpatialSAH(accel,scene,0); break;
  884. }
  885. }
  886. else if (scene->device->tri_builder == "sah" ) builder = BVH4Triangle4iSceneBuilderSAH(accel,scene,0);
  887. else if (scene->device->tri_builder == "sah_fast_spatial" ) builder = BVH4Triangle4iSceneBuilderFastSpatialSAH(accel,scene,0);
  888. else if (scene->device->tri_builder == "sah_presplit") builder = BVH4Triangle4iSceneBuilderSAH(accel,scene,MODE_HIGH_QUALITY);
  889. else if (scene->device->tri_builder == "dynamic" ) builder = BVH4BuilderTwoLevelTriangle4iMeshSAH(accel,scene,false);
  890. else if (scene->device->tri_builder == "morton" ) builder = BVH4BuilderTwoLevelTriangle4iMeshSAH(accel,scene,true);
  891. else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder "+scene->device->tri_builder+" for BVH4<Triangle4i>");
  892. return new AccelInstance(accel,builder,intersectors);
  893. }
  894. Accel* BVH4Factory::BVH4Triangle4iMB(Scene* scene, BuildVariant bvariant, IntersectVariant ivariant)
  895. {
  896. BVH4* accel = new BVH4(Triangle4i::type,scene);
  897. Accel::Intersectors intersectors;
  898. if (scene->device->tri_traverser_mb == "default") intersectors = BVH4Triangle4iMBIntersectors(accel,ivariant);
  899. else if (scene->device->tri_traverser_mb == "fast" ) intersectors = BVH4Triangle4iMBIntersectors(accel,IntersectVariant::FAST);
  900. else if (scene->device->tri_traverser_mb == "robust" ) intersectors = BVH4Triangle4iMBIntersectors(accel,IntersectVariant::ROBUST);
  901. else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown traverser "+scene->device->tri_traverser_mb+" for BVH4<Triangle4iMB>");
  902. Builder* builder = nullptr;
  903. if (scene->device->tri_builder_mb == "default") {
  904. switch (bvariant) {
  905. case BuildVariant::STATIC : builder = BVH4Triangle4iMBSceneBuilderSAH(accel,scene,0); break;
  906. case BuildVariant::DYNAMIC : assert(false); break; // FIXME: implement
  907. case BuildVariant::HIGH_QUALITY: assert(false); break;
  908. }
  909. }
  910. else if (scene->device->tri_builder_mb == "internal_time_splits") builder = BVH4Triangle4iMBSceneBuilderSAH(accel,scene,0);
  911. else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder "+scene->device->tri_builder_mb+" for BVH4<Triangle4iMB>");
  912. return new AccelInstance(accel,builder,intersectors);
  913. }
  914. Accel* BVH4Factory::BVH4Triangle4vMB(Scene* scene, BuildVariant bvariant, IntersectVariant ivariant)
  915. {
  916. BVH4* accel = new BVH4(Triangle4vMB::type,scene);
  917. Accel::Intersectors intersectors;
  918. if (scene->device->tri_traverser_mb == "default") intersectors = BVH4Triangle4vMBIntersectors(accel,ivariant);
  919. else if (scene->device->tri_traverser_mb == "fast" ) intersectors = BVH4Triangle4vMBIntersectors(accel,IntersectVariant::FAST);
  920. else if (scene->device->tri_traverser_mb == "robust" ) intersectors = BVH4Triangle4vMBIntersectors(accel,IntersectVariant::ROBUST);
  921. else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown traverser "+scene->device->tri_traverser_mb+" for BVH4<Triangle4vMB>");
  922. Builder* builder = nullptr;
  923. if (scene->device->tri_builder_mb == "default") {
  924. switch (bvariant) {
  925. case BuildVariant::STATIC : builder = BVH4Triangle4vMBSceneBuilderSAH(accel,scene,0); break;
  926. case BuildVariant::DYNAMIC : assert(false); break; // FIXME: implement
  927. case BuildVariant::HIGH_QUALITY: assert(false); break;
  928. }
  929. }
  930. else if (scene->device->tri_builder_mb == "internal_time_splits") builder = BVH4Triangle4vMBSceneBuilderSAH(accel,scene,0);
  931. else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder "+scene->device->tri_builder_mb+" for BVH4<Triangle4vMB>");
  932. return new AccelInstance(accel,builder,intersectors);
  933. }
  934. Accel* BVH4Factory::BVH4Quad4v(Scene* scene, BuildVariant bvariant, IntersectVariant ivariant)
  935. {
  936. BVH4* accel = new BVH4(Quad4v::type,scene);
  937. Accel::Intersectors intersectors = BVH4Quad4vIntersectors(accel,ivariant);
  938. Builder* builder = nullptr;
  939. if (scene->device->quad_builder == "default") {
  940. switch (bvariant) {
  941. case BuildVariant::STATIC : builder = BVH4Quad4vSceneBuilderSAH(accel,scene,0); break;
  942. case BuildVariant::DYNAMIC : builder = BVH4BuilderTwoLevelQuadMeshSAH(accel,scene,false); break;
  943. case BuildVariant::HIGH_QUALITY: builder = BVH4Quad4vSceneBuilderFastSpatialSAH(accel,scene,0); break;
  944. }
  945. }
  946. else if (scene->device->quad_builder == "sah" ) builder = BVH4Quad4vSceneBuilderSAH(accel,scene,0);
  947. else if (scene->device->quad_builder == "sah_fast_spatial" ) builder = BVH4Quad4vSceneBuilderFastSpatialSAH(accel,scene,0);
  948. else if (scene->device->quad_builder == "dynamic" ) builder = BVH4BuilderTwoLevelQuadMeshSAH(accel,scene,false);
  949. else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder "+scene->device->quad_builder+" for BVH4<Quad4v>");
  950. return new AccelInstance(accel,builder,intersectors);
  951. }
  952. Accel* BVH4Factory::BVH4Quad4i(Scene* scene, BuildVariant bvariant, IntersectVariant ivariant)
  953. {
  954. BVH4* accel = new BVH4(Quad4i::type,scene);
  955. Accel::Intersectors intersectors = BVH4Quad4iIntersectors(accel,ivariant);
  956. Builder* builder = nullptr;
  957. if (scene->device->quad_builder == "default") {
  958. switch (bvariant) {
  959. case BuildVariant::STATIC : builder = BVH4Quad4iSceneBuilderSAH(accel,scene,0); break;
  960. case BuildVariant::DYNAMIC : assert(false); break; // FIXME: implement
  961. case BuildVariant::HIGH_QUALITY: assert(false); break; // FIXME: implement
  962. }
  963. }
  964. else if (scene->device->quad_builder == "sah") builder = BVH4Quad4iSceneBuilderSAH(accel,scene,0);
  965. else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder "+scene->device->quad_builder+" for BVH4<Quad4i>");
  966. return new AccelInstance(accel,builder,intersectors);
  967. }
  968. Accel* BVH4Factory::BVH4Quad4iMB(Scene* scene, BuildVariant bvariant, IntersectVariant ivariant)
  969. {
  970. BVH4* accel = new BVH4(Quad4i::type,scene);
  971. Accel::Intersectors intersectors = BVH4Quad4iMBIntersectors(accel,ivariant);
  972. Builder* builder = nullptr;
  973. if (scene->device->quad_builder_mb == "default") {
  974. switch (bvariant) {
  975. case BuildVariant::STATIC : builder = BVH4Quad4iMBSceneBuilderSAH(accel,scene,0); break;
  976. case BuildVariant::DYNAMIC : assert(false); break; // FIXME: implement
  977. case BuildVariant::HIGH_QUALITY: assert(false); break;
  978. }
  979. }
  980. else if (scene->device->quad_builder_mb == "sah") builder = BVH4Quad4iMBSceneBuilderSAH(accel,scene,0);
  981. else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder "+scene->device->quad_builder_mb+" for BVH4<Quad4iMB>");
  982. return new AccelInstance(accel,builder,intersectors);
  983. }
  984. Accel* BVH4Factory::BVH4QuantizedQuad4i(Scene* scene)
  985. {
  986. BVH4* accel = new BVH4(Quad4i::type,scene);
  987. Builder* builder = BVH4QuantizedQuad4iSceneBuilderSAH(accel,scene,0);
  988. Accel::Intersectors intersectors = QBVH4Quad4iIntersectors(accel);
  989. return new AccelInstance(accel,builder,intersectors);
  990. }
  991. Accel* BVH4Factory::BVH4QuantizedTriangle4i(Scene* scene)
  992. {
  993. BVH4* accel = new BVH4(Triangle4i::type,scene);
  994. Builder* builder = BVH4QuantizedTriangle4iSceneBuilderSAH(accel,scene,0);
  995. Accel::Intersectors intersectors = QBVH4Triangle4iIntersectors(accel);
  996. return new AccelInstance(accel,builder,intersectors);
  997. }
  998. Accel* BVH4Factory::BVH4SubdivPatch1(Scene* scene)
  999. {
  1000. BVH4* accel = new BVH4(SubdivPatch1::type,scene);
  1001. Accel::Intersectors intersectors = BVH4SubdivPatch1Intersectors(accel);
  1002. Builder* builder = BVH4SubdivPatch1BuilderSAH(accel,scene,0);
  1003. return new AccelInstance(accel,builder,intersectors);
  1004. }
  1005. Accel* BVH4Factory::BVH4SubdivPatch1MB(Scene* scene)
  1006. {
  1007. BVH4* accel = new BVH4(SubdivPatch1::type,scene);
  1008. Accel::Intersectors intersectors = BVH4SubdivPatch1MBIntersectors(accel);
  1009. Builder* builder = BVH4SubdivPatch1MBBuilderSAH(accel,scene,0);
  1010. return new AccelInstance(accel,builder,intersectors);
  1011. }
  1012. Accel* BVH4Factory::BVH4UserGeometry(Scene* scene, BuildVariant bvariant)
  1013. {
  1014. BVH4* accel = new BVH4(Object::type,scene);
  1015. Accel::Intersectors intersectors = BVH4UserGeometryIntersectors(accel);
  1016. Builder* builder = nullptr;
  1017. if (scene->device->object_builder == "default") {
  1018. switch (bvariant) {
  1019. case BuildVariant::STATIC : builder = BVH4VirtualSceneBuilderSAH(accel,scene,0); break;
  1020. case BuildVariant::DYNAMIC : builder = BVH4BuilderTwoLevelVirtualSAH(accel,scene,false); break;
  1021. case BuildVariant::HIGH_QUALITY: assert(false); break;
  1022. }
  1023. }
  1024. else if (scene->device->object_builder == "sah") builder = BVH4VirtualSceneBuilderSAH(accel,scene,0);
  1025. else if (scene->device->object_builder == "dynamic") builder = BVH4BuilderTwoLevelVirtualSAH(accel,scene,false);
  1026. else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder "+scene->device->object_builder+" for BVH4<Object>");
  1027. return new AccelInstance(accel,builder,intersectors);
  1028. }
  1029. Accel* BVH4Factory::BVH4UserGeometryMB(Scene* scene)
  1030. {
  1031. BVH4* accel = new BVH4(Object::type,scene);
  1032. Accel::Intersectors intersectors = BVH4UserGeometryMBIntersectors(accel);
  1033. Builder* builder = BVH4VirtualMBSceneBuilderSAH(accel,scene,0);
  1034. return new AccelInstance(accel,builder,intersectors);
  1035. }
  1036. Accel* BVH4Factory::BVH4Instance(Scene* scene, bool isExpensive, BuildVariant bvariant)
  1037. {
  1038. BVH4* accel = new BVH4(InstancePrimitive::type,scene);
  1039. Accel::Intersectors intersectors = BVH4InstanceIntersectors(accel);
  1040. auto gtype = isExpensive ? Geometry::MTY_INSTANCE_EXPENSIVE : Geometry::MTY_INSTANCE_CHEAP;
  1041. // Builder* builder = BVH4InstanceSceneBuilderSAH(accel,scene,gtype);
  1042. Builder* builder = nullptr;
  1043. if (scene->device->object_builder == "default") {
  1044. switch (bvariant) {
  1045. case BuildVariant::STATIC : builder = BVH4InstanceSceneBuilderSAH(accel,scene,gtype); break;
  1046. case BuildVariant::DYNAMIC : builder = BVH4BuilderTwoLevelInstanceSAH(accel,scene,gtype,false); break;
  1047. case BuildVariant::HIGH_QUALITY: assert(false); break;
  1048. }
  1049. }
  1050. else if (scene->device->object_builder == "sah") builder = BVH4InstanceSceneBuilderSAH(accel,scene,gtype);
  1051. else if (scene->device->object_builder == "dynamic") builder = BVH4BuilderTwoLevelInstanceSAH(accel,scene,gtype,false);
  1052. else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder "+scene->device->object_builder+" for BVH4<Object>");
  1053. return new AccelInstance(accel,builder,intersectors);
  1054. }
  1055. Accel* BVH4Factory::BVH4InstanceMB(Scene* scene, bool isExpensive)
  1056. {
  1057. BVH4* accel = new BVH4(InstancePrimitive::type,scene);
  1058. Accel::Intersectors intersectors = BVH4InstanceMBIntersectors(accel);
  1059. auto gtype = isExpensive ? Geometry::MTY_INSTANCE_EXPENSIVE : Geometry::MTY_INSTANCE_CHEAP;
  1060. Builder* builder = BVH4InstanceMBSceneBuilderSAH(accel,scene,gtype);
  1061. return new AccelInstance(accel,builder,intersectors);
  1062. }
  1063. Accel* BVH4Factory::BVH4InstanceArray(Scene* scene, BuildVariant bvariant)
  1064. {
  1065. BVH4* accel = new BVH4(InstanceArrayPrimitive::type,scene);
  1066. Accel::Intersectors intersectors = BVH4InstanceArrayIntersectors(accel);
  1067. auto gtype = Geometry::MTY_INSTANCE_ARRAY;
  1068. Builder* builder = nullptr;
  1069. if (scene->device->object_builder == "default") {
  1070. switch (bvariant) {
  1071. case BuildVariant::STATIC : builder = BVH4InstanceArraySceneBuilderSAH(accel,scene,gtype); break;
  1072. case BuildVariant::DYNAMIC : builder = BVH4BuilderTwoLevelInstanceArraySAH(accel,scene,gtype,false); break;
  1073. case BuildVariant::HIGH_QUALITY: assert(false); break;
  1074. }
  1075. }
  1076. else if (scene->device->object_builder == "sah") { builder = BVH4InstanceArraySceneBuilderSAH(accel,scene,gtype); }
  1077. else if (scene->device->object_builder == "dynamic") { builder = BVH4BuilderTwoLevelInstanceArraySAH(accel,scene,gtype,false); }
  1078. else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder "+scene->device->object_builder+" for BVH4<Object>");
  1079. return new AccelInstance(accel,builder,intersectors);
  1080. }
  1081. Accel* BVH4Factory::BVH4InstanceArrayMB(Scene* scene)
  1082. {
  1083. BVH4* accel = new BVH4(InstanceArrayPrimitive::type,scene);
  1084. Accel::Intersectors intersectors = BVH4InstanceArrayMBIntersectors(accel);
  1085. Builder* builder = BVH4InstanceArrayMBSceneBuilderSAH(accel,scene,Geometry::MTY_INSTANCE_ARRAY);
  1086. return new AccelInstance(accel,builder,intersectors);
  1087. }
  1088. Accel::Intersectors BVH4Factory::BVH4GridIntersectors(BVH4* bvh, IntersectVariant ivariant)
  1089. {
  1090. Accel::Intersectors intersectors;
  1091. intersectors.ptr = bvh;
  1092. if (ivariant == IntersectVariant::FAST)
  1093. {
  1094. intersectors.intersector1 = BVH4GridIntersector1Moeller();
  1095. #if defined (EMBREE_RAY_PACKETS)
  1096. intersectors.intersector4 = BVH4GridIntersector4HybridMoeller();
  1097. intersectors.intersector8 = BVH4GridIntersector8HybridMoeller();
  1098. intersectors.intersector16 = BVH4GridIntersector16HybridMoeller();
  1099. #endif
  1100. }
  1101. else /* if (ivariant == IntersectVariant::ROBUST) */
  1102. {
  1103. intersectors.intersector1 = BVH4GridIntersector1Pluecker();
  1104. #if defined (EMBREE_RAY_PACKETS)
  1105. intersectors.intersector4 = BVH4GridIntersector4HybridPluecker();
  1106. intersectors.intersector8 = BVH4GridIntersector8HybridPluecker();
  1107. intersectors.intersector16 = BVH4GridIntersector16HybridPluecker();
  1108. #endif
  1109. }
  1110. return intersectors;
  1111. }
  1112. Accel::Intersectors BVH4Factory::BVH4GridMBIntersectors(BVH4* bvh, IntersectVariant ivariant)
  1113. {
  1114. Accel::Intersectors intersectors;
  1115. intersectors.ptr = bvh;
  1116. intersectors.intersector1 = BVH4GridMBIntersector1Moeller();
  1117. #if defined (EMBREE_RAY_PACKETS)
  1118. intersectors.intersector4 = BVH4GridMBIntersector4HybridMoeller();
  1119. intersectors.intersector8 = BVH4GridMBIntersector8HybridMoeller();
  1120. intersectors.intersector16 = BVH4GridMBIntersector16HybridMoeller();
  1121. #endif
  1122. return intersectors;
  1123. }
  1124. Accel* BVH4Factory::BVH4Grid(Scene* scene, BuildVariant bvariant, IntersectVariant ivariant)
  1125. {
  1126. BVH4* accel = new BVH4(SubGridQBVH4::type,scene);
  1127. Accel::Intersectors intersectors = BVH4GridIntersectors(accel,ivariant);
  1128. Builder* builder = nullptr;
  1129. if (scene->device->object_builder == "default") {
  1130. builder = BVH4GridSceneBuilderSAH(accel,scene,0);
  1131. }
  1132. else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder "+scene->device->grid_builder+" for BVH4<GridMesh>");
  1133. return new AccelInstance(accel,builder,intersectors);
  1134. }
  1135. Accel* BVH4Factory::BVH4GridMB(Scene* scene, BuildVariant bvariant, IntersectVariant ivariant)
  1136. {
  1137. BVH4* accel = new BVH4(SubGridQBVH4::type,scene);
  1138. Accel::Intersectors intersectors = BVH4GridMBIntersectors(accel,ivariant);
  1139. Builder* builder = nullptr;
  1140. if (scene->device->object_builder == "default") {
  1141. builder = BVH4GridMBSceneBuilderSAH(accel,scene,0);
  1142. }
  1143. else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder "+scene->device->grid_builder+" for BVH4MB<GridMesh>");
  1144. return new AccelInstance(accel,builder,intersectors);
  1145. }
  1146. }