| 1 | // Copyright 2009-2021 Intel Corporation | 
| 2 | // SPDX-License-Identifier: Apache-2.0 | 
| 3 |  | 
| 4 | #include "../common/isa.h" // to define EMBREE_TARGET_SIMD8 | 
| 5 |  | 
| 6 | #if defined (EMBREE_TARGET_SIMD8) | 
| 7 |  | 
| 8 | #include "bvh8_factory.h" | 
| 9 | #include "../bvh/bvh.h" | 
| 10 |  | 
| 11 | #include "../geometry/curveNv.h" | 
| 12 | #include "../geometry/curveNi.h" | 
| 13 | #include "../geometry/curveNi_mb.h" | 
| 14 | #include "../geometry/linei.h" | 
| 15 | #include "../geometry/triangle.h" | 
| 16 | #include "../geometry/trianglev.h" | 
| 17 | #include "../geometry/trianglev_mb.h" | 
| 18 | #include "../geometry/trianglei.h" | 
| 19 | #include "../geometry/quadv.h" | 
| 20 | #include "../geometry/quadi.h" | 
| 21 | #include "../geometry/subdivpatch1.h" | 
| 22 | #include "../geometry/object.h" | 
| 23 | #include "../geometry/instance.h" | 
| 24 | #include "../geometry/subgrid.h" | 
| 25 | #include "../common/accelinstance.h" | 
| 26 |  | 
| 27 | namespace embree | 
| 28 | { | 
| 29 |   DECLARE_SYMBOL2(Accel::Collider,BVH8ColliderUserGeom); | 
| 30 |    | 
| 31 |   DECLARE_ISA_FUNCTION(VirtualCurveIntersector*,VirtualCurveIntersector8v,void); | 
| 32 |   DECLARE_ISA_FUNCTION(VirtualCurveIntersector*,VirtualCurveIntersector8iMB,void); | 
| 33 |    | 
| 34 |   DECLARE_SYMBOL2(Accel::Intersector1,BVH8OBBVirtualCurveIntersector1); | 
| 35 |   DECLARE_SYMBOL2(Accel::Intersector1,BVH8OBBVirtualCurveIntersector1MB); | 
| 36 |   DECLARE_SYMBOL2(Accel::Intersector1,BVH8OBBVirtualCurveIntersectorRobust1); | 
| 37 |   DECLARE_SYMBOL2(Accel::Intersector1,BVH8OBBVirtualCurveIntersectorRobust1MB); | 
| 38 |  | 
| 39 |   DECLARE_SYMBOL2(Accel::Intersector1,BVH8Triangle4Intersector1Moeller); | 
| 40 |   DECLARE_SYMBOL2(Accel::Intersector1,BVH8Triangle4iIntersector1Moeller); | 
| 41 |   DECLARE_SYMBOL2(Accel::Intersector1,BVH8Triangle4vIntersector1Pluecker); | 
| 42 |   DECLARE_SYMBOL2(Accel::Intersector1,BVH8Triangle4iIntersector1Pluecker); | 
| 43 |  | 
| 44 |   DECLARE_SYMBOL2(Accel::Intersector1,BVH8Triangle4vIntersector1Woop); | 
| 45 |  | 
| 46 |   DECLARE_SYMBOL2(Accel::Intersector1,BVH8Triangle4vMBIntersector1Moeller); | 
| 47 |   DECLARE_SYMBOL2(Accel::Intersector1,BVH8Triangle4iMBIntersector1Moeller); | 
| 48 |   DECLARE_SYMBOL2(Accel::Intersector1,BVH8Triangle4vMBIntersector1Pluecker); | 
| 49 |   DECLARE_SYMBOL2(Accel::Intersector1,BVH8Triangle4iMBIntersector1Pluecker); | 
| 50 |  | 
| 51 |   DECLARE_SYMBOL2(Accel::Intersector1,BVH8Quad4vIntersector1Moeller); | 
| 52 |   DECLARE_SYMBOL2(Accel::Intersector1,BVH8Quad4iIntersector1Moeller); | 
| 53 |   DECLARE_SYMBOL2(Accel::Intersector1,BVH8Quad4vIntersector1Pluecker); | 
| 54 |   DECLARE_SYMBOL2(Accel::Intersector1,BVH8Quad4iIntersector1Pluecker); | 
| 55 |  | 
| 56 |   DECLARE_SYMBOL2(Accel::Intersector1,BVH8Quad4iMBIntersector1Moeller); | 
| 57 |   DECLARE_SYMBOL2(Accel::Intersector1,BVH8Quad4iMBIntersector1Pluecker); | 
| 58 |  | 
| 59 |   DECLARE_SYMBOL2(Accel::Intersector1,QBVH8Triangle4iIntersector1Pluecker); | 
| 60 |   DECLARE_SYMBOL2(Accel::Intersector1,QBVH8Triangle4Intersector1Moeller); | 
| 61 |   DECLARE_SYMBOL2(Accel::Intersector1,QBVH8Quad4iIntersector1Pluecker); | 
| 62 |  | 
| 63 |   DECLARE_SYMBOL2(Accel::Intersector1,BVH8VirtualIntersector1); | 
| 64 |   DECLARE_SYMBOL2(Accel::Intersector1,BVH8VirtualMBIntersector1); | 
| 65 |  | 
| 66 |   DECLARE_SYMBOL2(Accel::Intersector1,BVH8InstanceIntersector1); | 
| 67 |   DECLARE_SYMBOL2(Accel::Intersector1,BVH8InstanceMBIntersector1); | 
| 68 |  | 
| 69 |   DECLARE_SYMBOL2(Accel::Intersector1,BVH8GridIntersector1Moeller); | 
| 70 |   DECLARE_SYMBOL2(Accel::Intersector1,BVH8GridMBIntersector1Moeller); | 
| 71 |   DECLARE_SYMBOL2(Accel::Intersector1,BVH8GridIntersector1Pluecker); | 
| 72 |  | 
| 73 |   DECLARE_SYMBOL2(Accel::Intersector4,BVH8OBBVirtualCurveIntersector4Hybrid); | 
| 74 |   DECLARE_SYMBOL2(Accel::Intersector4,BVH8OBBVirtualCurveIntersector4HybridMB); | 
| 75 |   DECLARE_SYMBOL2(Accel::Intersector4,BVH8OBBVirtualCurveIntersectorRobust4Hybrid); | 
| 76 |   DECLARE_SYMBOL2(Accel::Intersector4,BVH8OBBVirtualCurveIntersectorRobust4HybridMB); | 
| 77 |  | 
| 78 |   DECLARE_SYMBOL2(Accel::Intersector4,BVH8Triangle4Intersector4HybridMoeller); | 
| 79 |   DECLARE_SYMBOL2(Accel::Intersector4,BVH8Triangle4Intersector4HybridMoellerNoFilter); | 
| 80 |   DECLARE_SYMBOL2(Accel::Intersector4,BVH8Triangle4iIntersector4HybridMoeller); | 
| 81 |   DECLARE_SYMBOL2(Accel::Intersector4,BVH8Triangle4vIntersector4HybridPluecker); | 
| 82 |   DECLARE_SYMBOL2(Accel::Intersector4,BVH8Triangle4iIntersector4HybridPluecker); | 
| 83 |  | 
| 84 |   DECLARE_SYMBOL2(Accel::Intersector4,BVH8Triangle4vMBIntersector4HybridMoeller); | 
| 85 |   DECLARE_SYMBOL2(Accel::Intersector4,BVH8Triangle4iMBIntersector4HybridMoeller); | 
| 86 |   DECLARE_SYMBOL2(Accel::Intersector4,BVH8Triangle4vMBIntersector4HybridPluecker); | 
| 87 |   DECLARE_SYMBOL2(Accel::Intersector4,BVH8Triangle4iMBIntersector4HybridPluecker); | 
| 88 |  | 
| 89 |   DECLARE_SYMBOL2(Accel::Intersector4,BVH8Quad4vIntersector4HybridMoeller); | 
| 90 |   DECLARE_SYMBOL2(Accel::Intersector4,BVH8Quad4vIntersector4HybridMoellerNoFilter); | 
| 91 |   DECLARE_SYMBOL2(Accel::Intersector4,BVH8Quad4iIntersector4HybridMoeller); | 
| 92 |   DECLARE_SYMBOL2(Accel::Intersector4,BVH8Quad4vIntersector4HybridPluecker); | 
| 93 |   DECLARE_SYMBOL2(Accel::Intersector4,BVH8Quad4iIntersector4HybridPluecker); | 
| 94 |  | 
| 95 |   DECLARE_SYMBOL2(Accel::Intersector4,BVH8Quad4iMBIntersector4HybridMoeller); | 
| 96 |   DECLARE_SYMBOL2(Accel::Intersector4,BVH8Quad4iMBIntersector4HybridPluecker); | 
| 97 |  | 
| 98 |   DECLARE_SYMBOL2(Accel::Intersector4,BVH8VirtualIntersector4Chunk); | 
| 99 |   DECLARE_SYMBOL2(Accel::Intersector4,BVH8VirtualMBIntersector4Chunk); | 
| 100 |  | 
| 101 |   DECLARE_SYMBOL2(Accel::Intersector4,BVH8InstanceIntersector4Chunk); | 
| 102 |   DECLARE_SYMBOL2(Accel::Intersector4,BVH8InstanceMBIntersector4Chunk); | 
| 103 |  | 
| 104 |   DECLARE_SYMBOL2(Accel::Intersector4,BVH8GridIntersector4HybridMoeller); | 
| 105 |   DECLARE_SYMBOL2(Accel::Intersector4,BVH8GridIntersector4HybridPluecker); | 
| 106 |  | 
| 107 |   DECLARE_SYMBOL2(Accel::Intersector8,BVH8OBBVirtualCurveIntersector8Hybrid); | 
| 108 |   DECLARE_SYMBOL2(Accel::Intersector8,BVH8OBBVirtualCurveIntersector8HybridMB); | 
| 109 |   DECLARE_SYMBOL2(Accel::Intersector8,BVH8OBBVirtualCurveIntersectorRobust8Hybrid); | 
| 110 |   DECLARE_SYMBOL2(Accel::Intersector8,BVH8OBBVirtualCurveIntersectorRobust8HybridMB); | 
| 111 |  | 
| 112 |   DECLARE_SYMBOL2(Accel::Intersector8,BVH8Triangle4Intersector8HybridMoeller); | 
| 113 |   DECLARE_SYMBOL2(Accel::Intersector8,BVH8Triangle4Intersector8HybridMoellerNoFilter); | 
| 114 |   DECLARE_SYMBOL2(Accel::Intersector8,BVH8Triangle4iIntersector8HybridMoeller); | 
| 115 |   DECLARE_SYMBOL2(Accel::Intersector8,BVH8Triangle4vIntersector8HybridPluecker); | 
| 116 |   DECLARE_SYMBOL2(Accel::Intersector8,BVH8Triangle4iIntersector8HybridPluecker); | 
| 117 |  | 
| 118 |   DECLARE_SYMBOL2(Accel::Intersector8,BVH8Triangle4vMBIntersector8HybridMoeller); | 
| 119 |   DECLARE_SYMBOL2(Accel::Intersector8,BVH8Triangle4iMBIntersector8HybridMoeller); | 
| 120 |   DECLARE_SYMBOL2(Accel::Intersector8,BVH8Triangle4vMBIntersector8HybridPluecker); | 
| 121 |   DECLARE_SYMBOL2(Accel::Intersector8,BVH8Triangle4iMBIntersector8HybridPluecker); | 
| 122 |  | 
| 123 |   DECLARE_SYMBOL2(Accel::Intersector8,BVH8Quad4vIntersector8HybridMoeller); | 
| 124 |   DECLARE_SYMBOL2(Accel::Intersector8,BVH8Quad4vIntersector8HybridMoellerNoFilter); | 
| 125 |   DECLARE_SYMBOL2(Accel::Intersector8,BVH8Quad4iIntersector8HybridMoeller); | 
| 126 |   DECLARE_SYMBOL2(Accel::Intersector8,BVH8Quad4vIntersector8HybridPluecker); | 
| 127 |   DECLARE_SYMBOL2(Accel::Intersector8,BVH8Quad4iIntersector8HybridPluecker); | 
| 128 |  | 
| 129 |   DECLARE_SYMBOL2(Accel::Intersector8,BVH8Quad4iMBIntersector8HybridMoeller); | 
| 130 |   DECLARE_SYMBOL2(Accel::Intersector8,BVH8Quad4iMBIntersector8HybridPluecker); | 
| 131 |  | 
| 132 |   DECLARE_SYMBOL2(Accel::Intersector8,BVH8VirtualIntersector8Chunk); | 
| 133 |   DECLARE_SYMBOL2(Accel::Intersector8,BVH8VirtualMBIntersector8Chunk); | 
| 134 |  | 
| 135 |   DECLARE_SYMBOL2(Accel::Intersector8,BVH8InstanceIntersector8Chunk); | 
| 136 |   DECLARE_SYMBOL2(Accel::Intersector8,BVH8InstanceMBIntersector8Chunk); | 
| 137 |  | 
| 138 |   DECLARE_SYMBOL2(Accel::Intersector8,BVH8GridIntersector8HybridMoeller); | 
| 139 |   DECLARE_SYMBOL2(Accel::Intersector8,BVH8GridIntersector8HybridPluecker); | 
| 140 |  | 
| 141 |   DECLARE_SYMBOL2(Accel::Intersector16,BVH8OBBVirtualCurveIntersector16Hybrid); | 
| 142 |   DECLARE_SYMBOL2(Accel::Intersector16,BVH8OBBVirtualCurveIntersector16HybridMB); | 
| 143 |   DECLARE_SYMBOL2(Accel::Intersector16,BVH8OBBVirtualCurveIntersectorRobust16Hybrid); | 
| 144 |   DECLARE_SYMBOL2(Accel::Intersector16,BVH8OBBVirtualCurveIntersectorRobust16HybridMB); | 
| 145 |  | 
| 146 |   DECLARE_SYMBOL2(Accel::Intersector16,BVH8Triangle4Intersector16HybridMoeller); | 
| 147 |   DECLARE_SYMBOL2(Accel::Intersector16,BVH8Triangle4Intersector16HybridMoellerNoFilter); | 
| 148 |   DECLARE_SYMBOL2(Accel::Intersector16,BVH8Triangle4iIntersector16HybridMoeller); | 
| 149 |   DECLARE_SYMBOL2(Accel::Intersector16,BVH8Triangle4vIntersector16HybridPluecker); | 
| 150 |   DECLARE_SYMBOL2(Accel::Intersector16,BVH8Triangle4iIntersector16HybridPluecker); | 
| 151 |  | 
| 152 |   DECLARE_SYMBOL2(Accel::Intersector16,BVH8Triangle4vMBIntersector16HybridMoeller); | 
| 153 |   DECLARE_SYMBOL2(Accel::Intersector16,BVH8Triangle4iMBIntersector16HybridMoeller); | 
| 154 |   DECLARE_SYMBOL2(Accel::Intersector16,BVH8Triangle4vMBIntersector16HybridPluecker); | 
| 155 |   DECLARE_SYMBOL2(Accel::Intersector16,BVH8Triangle4iMBIntersector16HybridPluecker); | 
| 156 |  | 
| 157 |   DECLARE_SYMBOL2(Accel::Intersector16,BVH8Quad4vIntersector16HybridMoeller); | 
| 158 |   DECLARE_SYMBOL2(Accel::Intersector16,BVH8Quad4vIntersector16HybridMoellerNoFilter); | 
| 159 |   DECLARE_SYMBOL2(Accel::Intersector16,BVH8Quad4iIntersector16HybridMoeller); | 
| 160 |   DECLARE_SYMBOL2(Accel::Intersector16,BVH8Quad4vIntersector16HybridPluecker); | 
| 161 |   DECLARE_SYMBOL2(Accel::Intersector16,BVH8Quad4iIntersector16HybridPluecker); | 
| 162 |  | 
| 163 |   DECLARE_SYMBOL2(Accel::Intersector16,BVH8Quad4iMBIntersector16HybridMoeller); | 
| 164 |   DECLARE_SYMBOL2(Accel::Intersector16,BVH8Quad4iMBIntersector16HybridPluecker); | 
| 165 |  | 
| 166 |   DECLARE_SYMBOL2(Accel::Intersector16,BVH8VirtualIntersector16Chunk); | 
| 167 |   DECLARE_SYMBOL2(Accel::Intersector16,BVH8VirtualMBIntersector16Chunk); | 
| 168 |  | 
| 169 |   DECLARE_SYMBOL2(Accel::Intersector16,BVH8InstanceIntersector16Chunk); | 
| 170 |   DECLARE_SYMBOL2(Accel::Intersector16,BVH8InstanceMBIntersector16Chunk); | 
| 171 |  | 
| 172 |   DECLARE_SYMBOL2(Accel::Intersector16,BVH8GridIntersector16HybridMoeller); | 
| 173 |   DECLARE_SYMBOL2(Accel::Intersector16,BVH8GridIntersector16HybridPluecker); | 
| 174 |  | 
| 175 |   DECLARE_SYMBOL2(Accel::IntersectorN,BVH8IntersectorStreamPacketFallback); | 
| 176 |  | 
| 177 |   DECLARE_SYMBOL2(Accel::IntersectorN,BVH8Triangle4IntersectorStreamMoeller); | 
| 178 |   DECLARE_SYMBOL2(Accel::IntersectorN,BVH8Triangle4IntersectorStreamMoellerNoFilter); | 
| 179 |   DECLARE_SYMBOL2(Accel::IntersectorN,BVH8Triangle4iIntersectorStreamMoeller); | 
| 180 |   DECLARE_SYMBOL2(Accel::IntersectorN,BVH8Triangle4vIntersectorStreamPluecker); | 
| 181 |   DECLARE_SYMBOL2(Accel::IntersectorN,BVH8Triangle4iIntersectorStreamPluecker); | 
| 182 |  | 
| 183 |   DECLARE_SYMBOL2(Accel::IntersectorN,BVH8Quad4vIntersectorStreamMoeller); | 
| 184 |   DECLARE_SYMBOL2(Accel::IntersectorN,BVH8Quad4vIntersectorStreamMoellerNoFilter); | 
| 185 |   DECLARE_SYMBOL2(Accel::IntersectorN,BVH8Quad4iIntersectorStreamMoeller); | 
| 186 |   DECLARE_SYMBOL2(Accel::IntersectorN,BVH8Quad4vIntersectorStreamPluecker); | 
| 187 |   DECLARE_SYMBOL2(Accel::IntersectorN,BVH8Quad4iIntersectorStreamPluecker); | 
| 188 |  | 
| 189 |   DECLARE_SYMBOL2(Accel::IntersectorN,BVH8VirtualIntersectorStream); | 
| 190 |  | 
| 191 |   DECLARE_SYMBOL2(Accel::IntersectorN,BVH8InstanceIntersectorStream); | 
| 192 |  | 
| 193 |   DECLARE_ISA_FUNCTION(Builder*,BVH8Curve8vBuilder_OBB_New,void* COMMA Scene* COMMA size_t); | 
| 194 |   DECLARE_ISA_FUNCTION(Builder*,BVH8OBBCurve8iMBBuilder_OBB,void* COMMA Scene* COMMA size_t); | 
| 195 |  | 
| 196 |   DECLARE_ISA_FUNCTION(Builder*,BVH8Triangle4SceneBuilderSAH,void* COMMA Scene* COMMA size_t); | 
| 197 |   DECLARE_ISA_FUNCTION(Builder*,BVH8Triangle4vSceneBuilderSAH,void* COMMA Scene* COMMA size_t); | 
| 198 |   DECLARE_ISA_FUNCTION(Builder*,BVH8Triangle4iSceneBuilderSAH,void* COMMA Scene* COMMA size_t); | 
| 199 |   DECLARE_ISA_FUNCTION(Builder*,BVH8Triangle4iMBSceneBuilderSAH,void* COMMA Scene* COMMA size_t); | 
| 200 |   DECLARE_ISA_FUNCTION(Builder*,BVH8Triangle4vMBSceneBuilderSAH,void* COMMA Scene* COMMA size_t); | 
| 201 |   DECLARE_ISA_FUNCTION(Builder*,BVH8QuantizedTriangle4iSceneBuilderSAH,void* COMMA Scene* COMMA size_t); | 
| 202 |   DECLARE_ISA_FUNCTION(Builder*,BVH8QuantizedTriangle4SceneBuilderSAH,void* COMMA Scene* COMMA size_t); | 
| 203 |  | 
| 204 |   DECLARE_ISA_FUNCTION(Builder*,BVH8Quad4vSceneBuilderSAH,void* COMMA Scene* COMMA size_t); | 
| 205 |   DECLARE_ISA_FUNCTION(Builder*,BVH8Quad4iSceneBuilderSAH,void* COMMA Scene* COMMA size_t); | 
| 206 |   DECLARE_ISA_FUNCTION(Builder*,BVH8Quad4iMBSceneBuilderSAH,void* COMMA Scene* COMMA size_t); | 
| 207 |   DECLARE_ISA_FUNCTION(Builder*,BVH8QuantizedQuad4iSceneBuilderSAH,void* COMMA Scene* COMMA size_t); | 
| 208 |  | 
| 209 |   DECLARE_ISA_FUNCTION(Builder*,BVH8VirtualSceneBuilderSAH,void* COMMA Scene* COMMA size_t); | 
| 210 |   DECLARE_ISA_FUNCTION(Builder*,BVH8VirtualMBSceneBuilderSAH,void* COMMA Scene* COMMA size_t); | 
| 211 |    | 
| 212 |   DECLARE_ISA_FUNCTION(Builder*,BVH8InstanceSceneBuilderSAH,void* COMMA Scene* COMMA Geometry::GTypeMask); | 
| 213 |   DECLARE_ISA_FUNCTION(Builder*,BVH8InstanceMBSceneBuilderSAH,void* COMMA Scene* COMMA Geometry::GTypeMask); | 
| 214 |  | 
| 215 |   DECLARE_ISA_FUNCTION(Builder*,BVH8Triangle4SceneBuilderFastSpatialSAH,void* COMMA Scene* COMMA size_t); | 
| 216 |   DECLARE_ISA_FUNCTION(Builder*,BVH8Triangle4vSceneBuilderFastSpatialSAH,void* COMMA Scene* COMMA size_t); | 
| 217 |   DECLARE_ISA_FUNCTION(Builder*,BVH8Quad4vSceneBuilderFastSpatialSAH,void* COMMA Scene* COMMA size_t); | 
| 218 |   DECLARE_ISA_FUNCTION(Builder*,BVH8GridSceneBuilderSAH,void* COMMA Scene* COMMA size_t); | 
| 219 |   DECLARE_ISA_FUNCTION(Builder*,BVH8GridMBSceneBuilderSAH,void* COMMA Scene* COMMA size_t); | 
| 220 |  | 
| 221 |   DECLARE_ISA_FUNCTION(Builder*,BVH8BuilderTwoLevelTriangle4MeshSAH,void* COMMA Scene* COMMA bool); | 
| 222 |   DECLARE_ISA_FUNCTION(Builder*,BVH8BuilderTwoLevelTriangle4vMeshSAH,void* COMMA Scene* COMMA bool); | 
| 223 |   DECLARE_ISA_FUNCTION(Builder*,BVH8BuilderTwoLevelTriangle4iMeshSAH,void* COMMA Scene* COMMA bool); | 
| 224 |   DECLARE_ISA_FUNCTION(Builder*,BVH8BuilderTwoLevelQuadMeshSAH,void* COMMA Scene* COMMA bool); | 
| 225 |   DECLARE_ISA_FUNCTION(Builder*,BVH8BuilderTwoLevelVirtualSAH,void* COMMA Scene* COMMA bool); | 
| 226 |   DECLARE_ISA_FUNCTION(Builder*,BVH8BuilderTwoLevelInstanceSAH,void* COMMA Scene* COMMA Geometry::GTypeMask COMMA bool); | 
| 227 |  | 
| 228 |   BVH8Factory::BVH8Factory(int bfeatures, int ifeatures) | 
| 229 |   { | 
| 230 |     SELECT_SYMBOL_INIT_AVX(ifeatures,BVH8ColliderUserGeom); | 
| 231 |      | 
| 232 |     selectBuilders(bfeatures); | 
| 233 |     selectIntersectors(ifeatures); | 
| 234 |   } | 
| 235 |  | 
| 236 |   void BVH8Factory::selectBuilders(int features) | 
| 237 |   { | 
| 238 |     IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX(features,BVH8Curve8vBuilder_OBB_New)); | 
| 239 |     IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX(features,BVH8OBBCurve8iMBBuilder_OBB)); | 
| 240 |  | 
| 241 |     IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX(features,BVH8Triangle4SceneBuilderSAH)); | 
| 242 |     IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX(features,BVH8Triangle4vSceneBuilderSAH)); | 
| 243 |     IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX(features,BVH8Triangle4iSceneBuilderSAH)); | 
| 244 |     IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX(features,BVH8Triangle4iMBSceneBuilderSAH)); | 
| 245 |     IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX(features,BVH8Triangle4vMBSceneBuilderSAH)); | 
| 246 |     IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX(features,BVH8QuantizedTriangle4iSceneBuilderSAH)); | 
| 247 |     IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX(features,BVH8QuantizedTriangle4SceneBuilderSAH)); | 
| 248 |  | 
| 249 |     IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX(features,BVH8Quad4vSceneBuilderSAH)); | 
| 250 |     IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX(features,BVH8Quad4iSceneBuilderSAH)); | 
| 251 |     IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX(features,BVH8Quad4iMBSceneBuilderSAH)); | 
| 252 |     IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX(features,BVH8QuantizedQuad4iSceneBuilderSAH)); | 
| 253 |  | 
| 254 |     IF_ENABLED_USER(SELECT_SYMBOL_INIT_AVX(features,BVH8VirtualSceneBuilderSAH)); | 
| 255 |     IF_ENABLED_USER(SELECT_SYMBOL_INIT_AVX(features,BVH8VirtualMBSceneBuilderSAH)); | 
| 256 |  | 
| 257 |     IF_ENABLED_INSTANCE(SELECT_SYMBOL_INIT_AVX(features,BVH8InstanceSceneBuilderSAH)); | 
| 258 |     IF_ENABLED_INSTANCE(SELECT_SYMBOL_INIT_AVX(features,BVH8InstanceMBSceneBuilderSAH)); | 
| 259 |      | 
| 260 |     IF_ENABLED_GRIDS(SELECT_SYMBOL_INIT_AVX(features,BVH8GridSceneBuilderSAH)); | 
| 261 |     IF_ENABLED_GRIDS(SELECT_SYMBOL_INIT_AVX(features,BVH8GridMBSceneBuilderSAH)); | 
| 262 |  | 
| 263 |     IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX(features,BVH8Triangle4SceneBuilderFastSpatialSAH)); | 
| 264 |     IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX(features,BVH8Triangle4vSceneBuilderFastSpatialSAH)); | 
| 265 |     IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX(features,BVH8Quad4vSceneBuilderFastSpatialSAH)); | 
| 266 |  | 
| 267 |     IF_ENABLED_TRIS  (SELECT_SYMBOL_INIT_AVX(features,BVH8BuilderTwoLevelTriangle4MeshSAH)); | 
| 268 |     IF_ENABLED_TRIS  (SELECT_SYMBOL_INIT_AVX(features,BVH8BuilderTwoLevelTriangle4vMeshSAH)); | 
| 269 |     IF_ENABLED_TRIS  (SELECT_SYMBOL_INIT_AVX(features,BVH8BuilderTwoLevelTriangle4iMeshSAH)); | 
| 270 |     IF_ENABLED_QUADS (SELECT_SYMBOL_INIT_AVX(features,BVH8BuilderTwoLevelQuadMeshSAH)); | 
| 271 |     IF_ENABLED_USER  (SELECT_SYMBOL_INIT_AVX(features,BVH8BuilderTwoLevelVirtualSAH)); | 
| 272 |     IF_ENABLED_INSTANCE (SELECT_SYMBOL_INIT_AVX(features,BVH8BuilderTwoLevelInstanceSAH)); | 
| 273 |   } | 
| 274 |  | 
| 275 |   void BVH8Factory::selectIntersectors(int features) | 
| 276 |   { | 
| 277 |     IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,VirtualCurveIntersector8v)); | 
| 278 |     IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,VirtualCurveIntersector8iMB)); | 
| 279 |      | 
| 280 |     /* select intersectors1 */ | 
| 281 |     IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8OBBVirtualCurveIntersector1)); | 
| 282 |     IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8OBBVirtualCurveIntersector1MB)); | 
| 283 |     IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8OBBVirtualCurveIntersectorRobust1)); | 
| 284 |     IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8OBBVirtualCurveIntersectorRobust1MB)); | 
| 285 |  | 
| 286 |     IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4Intersector1Moeller)); | 
| 287 |     IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4iIntersector1Moeller)); | 
| 288 |     IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4vIntersector1Pluecker)); | 
| 289 |     IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4iIntersector1Pluecker)); | 
| 290 |  | 
| 291 |     IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4vIntersector1Woop)); | 
| 292 |  | 
| 293 |     IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4vMBIntersector1Moeller)); | 
| 294 |     IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4iMBIntersector1Moeller)); | 
| 295 |     IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4vMBIntersector1Pluecker)); | 
| 296 |     IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4iMBIntersector1Pluecker)); | 
| 297 |  | 
| 298 |     IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Quad4vIntersector1Moeller)); | 
| 299 |     IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Quad4iIntersector1Moeller)); | 
| 300 |     IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Quad4vIntersector1Pluecker)); | 
| 301 |     IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Quad4iIntersector1Pluecker)); | 
| 302 |  | 
| 303 |     IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Quad4iMBIntersector1Moeller)); | 
| 304 |     IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Quad4iMBIntersector1Pluecker)); | 
| 305 |  | 
| 306 |     IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,QBVH8Triangle4iIntersector1Pluecker)); | 
| 307 |     IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,QBVH8Triangle4Intersector1Moeller)); | 
| 308 |     IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,QBVH8Quad4iIntersector1Pluecker)); | 
| 309 |  | 
| 310 |     IF_ENABLED_USER(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8VirtualIntersector1)); | 
| 311 |     IF_ENABLED_USER(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8VirtualMBIntersector1)); | 
| 312 |  | 
| 313 |     IF_ENABLED_INSTANCE(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8InstanceIntersector1)); | 
| 314 |     IF_ENABLED_INSTANCE(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8InstanceMBIntersector1)); | 
| 315 |  | 
| 316 |     IF_ENABLED_GRIDS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8GridIntersector1Moeller)); | 
| 317 |     IF_ENABLED_GRIDS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8GridMBIntersector1Moeller)) | 
| 318 |     IF_ENABLED_GRIDS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8GridIntersector1Pluecker)); | 
| 319 |  | 
| 320 | #if defined (EMBREE_RAY_PACKETS) | 
| 321 |  | 
| 322 |     /* select intersectors4 */ | 
| 323 |     IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8OBBVirtualCurveIntersector4Hybrid)); | 
| 324 |     IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8OBBVirtualCurveIntersector4HybridMB)); | 
| 325 |     IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8OBBVirtualCurveIntersectorRobust4Hybrid)); | 
| 326 |     IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8OBBVirtualCurveIntersectorRobust4HybridMB)); | 
| 327 |  | 
| 328 |     IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4Intersector4HybridMoeller)); | 
| 329 |     IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4Intersector4HybridMoellerNoFilter)); | 
| 330 |     IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4iIntersector4HybridMoeller)); | 
| 331 |     IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4vIntersector4HybridPluecker)); | 
| 332 |     IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4iIntersector4HybridPluecker)); | 
| 333 |  | 
| 334 |     IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4vMBIntersector4HybridMoeller)); | 
| 335 |     IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4iMBIntersector4HybridMoeller)); | 
| 336 |     IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4vMBIntersector4HybridPluecker)); | 
| 337 |     IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4iMBIntersector4HybridPluecker)); | 
| 338 |  | 
| 339 |     IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Quad4vIntersector4HybridMoeller)); | 
| 340 |     IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Quad4vIntersector4HybridMoellerNoFilter)); | 
| 341 |     IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Quad4iIntersector4HybridMoeller)); | 
| 342 |     IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Quad4vIntersector4HybridPluecker)); | 
| 343 |     IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Quad4iIntersector4HybridPluecker)); | 
| 344 |  | 
| 345 |     IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2(features,BVH8Quad4iMBIntersector4HybridMoeller)); | 
| 346 |     IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2(features,BVH8Quad4iMBIntersector4HybridPluecker)); | 
| 347 |  | 
| 348 |     IF_ENABLED_USER(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8VirtualIntersector4Chunk)); | 
| 349 |     IF_ENABLED_USER(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8VirtualMBIntersector4Chunk)); | 
| 350 |  | 
| 351 |     IF_ENABLED_INSTANCE(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8InstanceIntersector4Chunk)); | 
| 352 |     IF_ENABLED_INSTANCE(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8InstanceMBIntersector4Chunk)); | 
| 353 |  | 
| 354 |     IF_ENABLED_GRIDS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8GridIntersector4HybridMoeller)); | 
| 355 |     IF_ENABLED_GRIDS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8GridIntersector4HybridPluecker)); | 
| 356 |  | 
| 357 |     /* select intersectors8 */ | 
| 358 |     IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8OBBVirtualCurveIntersector8Hybrid)); | 
| 359 |     IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8OBBVirtualCurveIntersector8HybridMB)); | 
| 360 |     IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8OBBVirtualCurveIntersectorRobust8Hybrid)); | 
| 361 |     IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8OBBVirtualCurveIntersectorRobust8HybridMB)); | 
| 362 |  | 
| 363 |     IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4Intersector8HybridMoeller)); | 
| 364 |     IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4Intersector8HybridMoellerNoFilter)); | 
| 365 |     IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4iIntersector8HybridMoeller)); | 
| 366 |     IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4vIntersector8HybridPluecker)); | 
| 367 |     IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4iIntersector8HybridPluecker)); | 
| 368 |  | 
| 369 |     IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4vMBIntersector8HybridMoeller)); | 
| 370 |     IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4iMBIntersector8HybridMoeller)); | 
| 371 |     IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4vMBIntersector8HybridPluecker)); | 
| 372 |     IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4iMBIntersector8HybridPluecker)); | 
| 373 |  | 
| 374 |     IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Quad4vIntersector8HybridMoeller)); | 
| 375 |     IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Quad4vIntersector8HybridMoellerNoFilter)); | 
| 376 |     IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Quad4iIntersector8HybridMoeller)); | 
| 377 |     IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Quad4vIntersector8HybridPluecker)); | 
| 378 |     IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Quad4iIntersector8HybridPluecker)); | 
| 379 |  | 
| 380 |     IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2(features,BVH8Quad4iMBIntersector8HybridMoeller)); | 
| 381 |     IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2(features,BVH8Quad4iMBIntersector8HybridPluecker)); | 
| 382 |  | 
| 383 |     IF_ENABLED_USER(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8VirtualIntersector8Chunk)); | 
| 384 |     IF_ENABLED_USER(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8VirtualMBIntersector8Chunk)); | 
| 385 |  | 
| 386 |     IF_ENABLED_INSTANCE(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8InstanceIntersector8Chunk)); | 
| 387 |     IF_ENABLED_INSTANCE(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8InstanceMBIntersector8Chunk)); | 
| 388 |  | 
| 389 |     IF_ENABLED_GRIDS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8GridIntersector8HybridMoeller)); | 
| 390 |     IF_ENABLED_GRIDS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8GridIntersector8HybridPluecker)); | 
| 391 |  | 
| 392 |     /* select intersectors16 */ | 
| 393 |     IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX512(features,BVH8OBBVirtualCurveIntersector16Hybrid)); | 
| 394 |     IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX512(features,BVH8OBBVirtualCurveIntersector16HybridMB)); | 
| 395 |     IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX512(features,BVH8OBBVirtualCurveIntersectorRobust16Hybrid)); | 
| 396 |     IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX512(features,BVH8OBBVirtualCurveIntersectorRobust16HybridMB)); | 
| 397 |  | 
| 398 |     IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX512(features,BVH8Triangle4Intersector16HybridMoeller)); | 
| 399 |     IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX512(features,BVH8Triangle4Intersector16HybridMoellerNoFilter)); | 
| 400 |     IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX512(features,BVH8Triangle4iIntersector16HybridMoeller)); | 
| 401 |     IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX512(features,BVH8Triangle4vIntersector16HybridPluecker)); | 
| 402 |     IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX512(features,BVH8Triangle4iIntersector16HybridPluecker)); | 
| 403 |  | 
| 404 |     IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX512(features,BVH8Triangle4vMBIntersector16HybridMoeller)); | 
| 405 |     IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX512(features,BVH8Triangle4iMBIntersector16HybridMoeller)); | 
| 406 |     IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX512(features,BVH8Triangle4vMBIntersector16HybridPluecker)); | 
| 407 |     IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX512(features,BVH8Triangle4iMBIntersector16HybridPluecker)); | 
| 408 |  | 
| 409 |     IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX512(features,BVH8Quad4vIntersector16HybridMoeller)); | 
| 410 |     IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX512(features,BVH8Quad4vIntersector16HybridMoellerNoFilter)); | 
| 411 |     IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX512(features,BVH8Quad4iIntersector16HybridMoeller)); | 
| 412 |     IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX512(features,BVH8Quad4vIntersector16HybridPluecker)); | 
| 413 |     IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX512(features,BVH8Quad4iIntersector16HybridPluecker)); | 
| 414 |  | 
| 415 |     IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX512(features,BVH8Quad4iMBIntersector16HybridMoeller)); | 
| 416 |     IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX512(features,BVH8Quad4iMBIntersector16HybridPluecker)); | 
| 417 |  | 
| 418 |     IF_ENABLED_USER(SELECT_SYMBOL_INIT_AVX512(features,BVH8VirtualIntersector16Chunk)); | 
| 419 |     IF_ENABLED_USER(SELECT_SYMBOL_INIT_AVX512(features,BVH8VirtualMBIntersector16Chunk)); | 
| 420 |  | 
| 421 |     IF_ENABLED_INSTANCE(SELECT_SYMBOL_INIT_AVX512(features,BVH8InstanceIntersector16Chunk)); | 
| 422 |     IF_ENABLED_INSTANCE(SELECT_SYMBOL_INIT_AVX512(features,BVH8InstanceMBIntersector16Chunk)); | 
| 423 |  | 
| 424 |     IF_ENABLED_GRIDS(SELECT_SYMBOL_INIT_AVX512(features,BVH8GridIntersector16HybridMoeller)); | 
| 425 |     IF_ENABLED_GRIDS(SELECT_SYMBOL_INIT_AVX512(features,BVH8GridIntersector16HybridPluecker)); | 
| 426 |  | 
| 427 |     /* select stream intersectors */ | 
| 428 |  | 
| 429 |     SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8IntersectorStreamPacketFallback); | 
| 430 |  | 
| 431 |     IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4IntersectorStreamMoeller)); | 
| 432 |     IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4IntersectorStreamMoellerNoFilter)); | 
| 433 |     IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4iIntersectorStreamMoeller)); | 
| 434 |     IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4vIntersectorStreamPluecker)); | 
| 435 |     IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4iIntersectorStreamPluecker)); | 
| 436 |  | 
| 437 |     IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Quad4vIntersectorStreamMoeller)); | 
| 438 |     IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Quad4vIntersectorStreamMoellerNoFilter)); | 
| 439 |     IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Quad4iIntersectorStreamMoeller)); | 
| 440 |     IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Quad4vIntersectorStreamPluecker)); | 
| 441 |     IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Quad4iIntersectorStreamPluecker)); | 
| 442 |  | 
| 443 |     IF_ENABLED_USER(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8VirtualIntersectorStream)); | 
| 444 |  | 
| 445 |     IF_ENABLED_INSTANCE(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8InstanceIntersectorStream)); | 
| 446 |  | 
| 447 | #endif | 
| 448 |   } | 
| 449 |  | 
| 450 |   Accel::Intersectors BVH8Factory::BVH8OBBVirtualCurveIntersectors(BVH8* bvh, VirtualCurveIntersector* leafIntersector, IntersectVariant ivariant) | 
| 451 |   { | 
| 452 |     switch (ivariant) { | 
| 453 |     case IntersectVariant::FAST: | 
| 454 |     { | 
| 455 |       Accel::Intersectors intersectors; | 
| 456 |       intersectors.ptr = bvh; | 
| 457 |       intersectors.leafIntersector = leafIntersector; | 
| 458 |       intersectors.intersector1  = BVH8OBBVirtualCurveIntersector1(); | 
| 459 | #if defined (EMBREE_RAY_PACKETS) | 
| 460 |       intersectors.intersector4  = BVH8OBBVirtualCurveIntersector4Hybrid(); | 
| 461 |       intersectors.intersector8  = BVH8OBBVirtualCurveIntersector8Hybrid(); | 
| 462 |       intersectors.intersector16 = BVH8OBBVirtualCurveIntersector16Hybrid(); | 
| 463 |       intersectors.intersectorN  = BVH8IntersectorStreamPacketFallback(); | 
| 464 | #endif | 
| 465 |       return intersectors; | 
| 466 |     } | 
| 467 |     case IntersectVariant::ROBUST: | 
| 468 |     { | 
| 469 |       Accel::Intersectors intersectors; | 
| 470 |       intersectors.ptr = bvh; | 
| 471 |       intersectors.leafIntersector = leafIntersector; | 
| 472 |       intersectors.intersector1  = BVH8OBBVirtualCurveIntersectorRobust1(); | 
| 473 | #if defined (EMBREE_RAY_PACKETS) | 
| 474 |       intersectors.intersector4  = BVH8OBBVirtualCurveIntersectorRobust4Hybrid(); | 
| 475 |       intersectors.intersector8  = BVH8OBBVirtualCurveIntersectorRobust8Hybrid(); | 
| 476 |       intersectors.intersector16 = BVH8OBBVirtualCurveIntersectorRobust16Hybrid(); | 
| 477 |       intersectors.intersectorN  = BVH8IntersectorStreamPacketFallback(); | 
| 478 | #endif | 
| 479 |       return intersectors; | 
| 480 |     } | 
| 481 |     default: assert(false); | 
| 482 |     } | 
| 483 |     return Accel::Intersectors(); | 
| 484 |   } | 
| 485 |  | 
| 486 |   Accel::Intersectors BVH8Factory::BVH8OBBVirtualCurveIntersectorsMB(BVH8* bvh, VirtualCurveIntersector* leafIntersector, IntersectVariant ivariant) | 
| 487 |   { | 
| 488 |     switch (ivariant) { | 
| 489 |     case IntersectVariant::FAST: | 
| 490 |     { | 
| 491 |       Accel::Intersectors intersectors; | 
| 492 |       intersectors.ptr = bvh; | 
| 493 |       intersectors.leafIntersector = leafIntersector; | 
| 494 |       intersectors.intersector1  = BVH8OBBVirtualCurveIntersector1MB(); | 
| 495 | #if defined (EMBREE_RAY_PACKETS) | 
| 496 |       intersectors.intersector4  = BVH8OBBVirtualCurveIntersector4HybridMB(); | 
| 497 |       intersectors.intersector8  = BVH8OBBVirtualCurveIntersector8HybridMB(); | 
| 498 |       intersectors.intersector16 = BVH8OBBVirtualCurveIntersector16HybridMB(); | 
| 499 |       intersectors.intersectorN  = BVH8IntersectorStreamPacketFallback(); | 
| 500 | #endif | 
| 501 |       return intersectors; | 
| 502 |     } | 
| 503 |     case IntersectVariant::ROBUST: | 
| 504 |     { | 
| 505 |       Accel::Intersectors intersectors; | 
| 506 |       intersectors.ptr = bvh; | 
| 507 |       intersectors.leafIntersector = leafIntersector; | 
| 508 |       intersectors.intersector1  = BVH8OBBVirtualCurveIntersectorRobust1MB(); | 
| 509 | #if defined (EMBREE_RAY_PACKETS) | 
| 510 |       intersectors.intersector4  = BVH8OBBVirtualCurveIntersectorRobust4HybridMB(); | 
| 511 |       intersectors.intersector8  = BVH8OBBVirtualCurveIntersectorRobust8HybridMB(); | 
| 512 |       intersectors.intersector16 = BVH8OBBVirtualCurveIntersectorRobust16HybridMB(); | 
| 513 |       intersectors.intersectorN  = BVH8IntersectorStreamPacketFallback(); | 
| 514 | #endif | 
| 515 |       return intersectors; | 
| 516 |     } | 
| 517 |     default: assert(false); | 
| 518 |     } | 
| 519 |     return Accel::Intersectors(); | 
| 520 |   } | 
| 521 |  | 
| 522 |   Accel::Intersectors BVH8Factory::BVH8Triangle4Intersectors(BVH8* bvh, IntersectVariant ivariant) | 
| 523 |   { | 
| 524 |     assert(ivariant == IntersectVariant::FAST); | 
| 525 |     Accel::Intersectors intersectors; | 
| 526 |     intersectors.ptr = bvh; | 
| 527 |     intersectors.intersector1           = BVH8Triangle4Intersector1Moeller(); | 
| 528 | #if defined (EMBREE_RAY_PACKETS) | 
| 529 |     intersectors.intersector4_filter    = BVH8Triangle4Intersector4HybridMoeller(); | 
| 530 |     intersectors.intersector4_nofilter  = BVH8Triangle4Intersector4HybridMoellerNoFilter(); | 
| 531 |     intersectors.intersector8_filter    = BVH8Triangle4Intersector8HybridMoeller(); | 
| 532 |     intersectors.intersector8_nofilter  = BVH8Triangle4Intersector8HybridMoellerNoFilter(); | 
| 533 |     intersectors.intersector16_filter   = BVH8Triangle4Intersector16HybridMoeller(); | 
| 534 |     intersectors.intersector16_nofilter = BVH8Triangle4Intersector16HybridMoellerNoFilter(); | 
| 535 |     intersectors.intersectorN_filter    = BVH8Triangle4IntersectorStreamMoeller(); | 
| 536 |     intersectors.intersectorN_nofilter  = BVH8Triangle4IntersectorStreamMoellerNoFilter(); | 
| 537 | #endif | 
| 538 |     return intersectors; | 
| 539 |   } | 
| 540 |  | 
| 541 |   Accel::Intersectors BVH8Factory::BVH8Triangle4vIntersectors(BVH8* bvh, IntersectVariant ivariant) | 
| 542 |   { | 
| 543 |     Accel::Intersectors intersectors; | 
| 544 |     intersectors.ptr = bvh; | 
| 545 | #define ENABLE_WOOP_TEST 0 | 
| 546 | #if ENABLE_WOOP_TEST == 0 | 
| 547 |     //assert(ivariant == IntersectVariant::ROBUST); | 
| 548 |     intersectors.intersector1    = BVH8Triangle4vIntersector1Pluecker(); | 
| 549 | #else | 
| 550 |     intersectors.intersector1    = BVH8Triangle4vIntersector1Woop(); | 
| 551 | #endif | 
| 552 |  | 
| 553 | #if defined (EMBREE_RAY_PACKETS) | 
| 554 |     intersectors.intersector4    = BVH8Triangle4vIntersector4HybridPluecker(); | 
| 555 |     intersectors.intersector8    = BVH8Triangle4vIntersector8HybridPluecker(); | 
| 556 |     intersectors.intersector16   = BVH8Triangle4vIntersector16HybridPluecker(); | 
| 557 |     intersectors.intersectorN    = BVH8Triangle4vIntersectorStreamPluecker(); | 
| 558 | #endif | 
| 559 |     return intersectors; | 
| 560 |   } | 
| 561 |  | 
| 562 |   Accel::Intersectors BVH8Factory::BVH8Triangle4iIntersectors(BVH8* bvh, IntersectVariant ivariant) | 
| 563 |   { | 
| 564 |     switch (ivariant) { | 
| 565 |     case IntersectVariant::FAST: | 
| 566 |     { | 
| 567 |       Accel::Intersectors intersectors; | 
| 568 |       intersectors.ptr = bvh; | 
| 569 |       intersectors.intersector1  = BVH8Triangle4iIntersector1Moeller(); | 
| 570 | #if defined (EMBREE_RAY_PACKETS) | 
| 571 |       intersectors.intersector4  = BVH8Triangle4iIntersector4HybridMoeller(); | 
| 572 |       intersectors.intersector8  = BVH8Triangle4iIntersector8HybridMoeller(); | 
| 573 |       intersectors.intersector16 = BVH8Triangle4iIntersector16HybridMoeller(); | 
| 574 |       intersectors.intersectorN  = BVH8Triangle4iIntersectorStreamMoeller(); | 
| 575 | #endif | 
| 576 |       return intersectors; | 
| 577 |     } | 
| 578 |     case IntersectVariant::ROBUST: | 
| 579 |     { | 
| 580 |       Accel::Intersectors intersectors; | 
| 581 |       intersectors.ptr = bvh; | 
| 582 |       intersectors.intersector1  = BVH8Triangle4iIntersector1Pluecker(); | 
| 583 | #if defined (EMBREE_RAY_PACKETS) | 
| 584 |       intersectors.intersector4  = BVH8Triangle4iIntersector4HybridPluecker(); | 
| 585 |       intersectors.intersector8  = BVH8Triangle4iIntersector8HybridPluecker(); | 
| 586 |       intersectors.intersector16 = BVH8Triangle4iIntersector16HybridPluecker(); | 
| 587 |       intersectors.intersectorN  = BVH8Triangle4iIntersectorStreamPluecker(); | 
| 588 | #endif | 
| 589 |       return intersectors; | 
| 590 |     } | 
| 591 |     } | 
| 592 |     return Accel::Intersectors(); | 
| 593 |   } | 
| 594 |  | 
| 595 |   Accel::Intersectors BVH8Factory::BVH8Triangle4vMBIntersectors(BVH8* bvh, IntersectVariant ivariant) | 
| 596 |   { | 
| 597 |     switch (ivariant) { | 
| 598 |     case IntersectVariant::FAST: | 
| 599 |     { | 
| 600 |       Accel::Intersectors intersectors; | 
| 601 |       intersectors.ptr = bvh; | 
| 602 |       intersectors.intersector1  = BVH8Triangle4vMBIntersector1Moeller(); | 
| 603 | #if defined (EMBREE_RAY_PACKETS) | 
| 604 |       intersectors.intersector4  = BVH8Triangle4vMBIntersector4HybridMoeller(); | 
| 605 |       intersectors.intersector8  = BVH8Triangle4vMBIntersector8HybridMoeller(); | 
| 606 |       intersectors.intersector16 = BVH8Triangle4vMBIntersector16HybridMoeller(); | 
| 607 |       intersectors.intersectorN  = BVH8IntersectorStreamPacketFallback(); | 
| 608 | #endif | 
| 609 |       return intersectors; | 
| 610 |     } | 
| 611 |     case IntersectVariant::ROBUST: | 
| 612 |     { | 
| 613 |       Accel::Intersectors intersectors; | 
| 614 |       intersectors.ptr = bvh; | 
| 615 |       intersectors.intersector1  = BVH8Triangle4vMBIntersector1Pluecker(); | 
| 616 | #if defined (EMBREE_RAY_PACKETS) | 
| 617 |       intersectors.intersector4  = BVH8Triangle4vMBIntersector4HybridPluecker(); | 
| 618 |       intersectors.intersector8  = BVH8Triangle4vMBIntersector8HybridPluecker(); | 
| 619 |       intersectors.intersector16 = BVH8Triangle4vMBIntersector16HybridPluecker(); | 
| 620 |       intersectors.intersectorN  = BVH8IntersectorStreamPacketFallback(); | 
| 621 | #endif | 
| 622 |       return intersectors; | 
| 623 |     } | 
| 624 |     } | 
| 625 |     return Accel::Intersectors(); | 
| 626 |   } | 
| 627 |  | 
| 628 |   Accel::Intersectors BVH8Factory::BVH8Triangle4iMBIntersectors(BVH8* bvh, IntersectVariant ivariant) | 
| 629 |   { | 
| 630 |     switch (ivariant) { | 
| 631 |     case IntersectVariant::FAST: | 
| 632 |     { | 
| 633 |       Accel::Intersectors intersectors; | 
| 634 |       intersectors.ptr = bvh; | 
| 635 |       intersectors.intersector1  = BVH8Triangle4iMBIntersector1Moeller(); | 
| 636 | #if defined (EMBREE_RAY_PACKETS) | 
| 637 |       intersectors.intersector4  = BVH8Triangle4iMBIntersector4HybridMoeller(); | 
| 638 |       intersectors.intersector8  = BVH8Triangle4iMBIntersector8HybridMoeller(); | 
| 639 |       intersectors.intersector16 = BVH8Triangle4iMBIntersector16HybridMoeller(); | 
| 640 |       intersectors.intersectorN  = BVH8IntersectorStreamPacketFallback(); | 
| 641 | #endif | 
| 642 |       return intersectors; | 
| 643 |     } | 
| 644 |     case IntersectVariant::ROBUST: | 
| 645 |     { | 
| 646 |       Accel::Intersectors intersectors; | 
| 647 |       intersectors.ptr = bvh; | 
| 648 |       intersectors.intersector1  = BVH8Triangle4iMBIntersector1Pluecker(); | 
| 649 | #if defined (EMBREE_RAY_PACKETS) | 
| 650 |       intersectors.intersector4  = BVH8Triangle4iMBIntersector4HybridPluecker(); | 
| 651 |       intersectors.intersector8  = BVH8Triangle4iMBIntersector8HybridPluecker(); | 
| 652 |       intersectors.intersector16 = BVH8Triangle4iMBIntersector16HybridPluecker(); | 
| 653 |       intersectors.intersectorN  = BVH8IntersectorStreamPacketFallback(); | 
| 654 | #endif | 
| 655 |       return intersectors; | 
| 656 |     } | 
| 657 |     } | 
| 658 |     return Accel::Intersectors(); | 
| 659 |   } | 
| 660 |  | 
| 661 |   Accel::Intersectors BVH8Factory::BVH8Quad4vIntersectors(BVH8* bvh, IntersectVariant ivariant) | 
| 662 |   { | 
| 663 |     switch (ivariant) { | 
| 664 |     case IntersectVariant::FAST: | 
| 665 |     { | 
| 666 |       Accel::Intersectors intersectors; | 
| 667 |       intersectors.ptr = bvh; | 
| 668 |       intersectors.intersector1           = BVH8Quad4vIntersector1Moeller(); | 
| 669 | #if defined (EMBREE_RAY_PACKETS) | 
| 670 |       intersectors.intersector4_filter    = BVH8Quad4vIntersector4HybridMoeller(); | 
| 671 |       intersectors.intersector4_nofilter  = BVH8Quad4vIntersector4HybridMoellerNoFilter(); | 
| 672 |       intersectors.intersector8_filter    = BVH8Quad4vIntersector8HybridMoeller(); | 
| 673 |       intersectors.intersector8_nofilter  = BVH8Quad4vIntersector8HybridMoellerNoFilter(); | 
| 674 |       intersectors.intersector16_filter   = BVH8Quad4vIntersector16HybridMoeller(); | 
| 675 |       intersectors.intersector16_nofilter = BVH8Quad4vIntersector16HybridMoellerNoFilter(); | 
| 676 |       intersectors.intersectorN_filter    = BVH8Quad4vIntersectorStreamMoeller(); | 
| 677 |       intersectors.intersectorN_nofilter  = BVH8Quad4vIntersectorStreamMoellerNoFilter(); | 
| 678 | #endif | 
| 679 |       return intersectors; | 
| 680 |     } | 
| 681 |     case IntersectVariant::ROBUST: | 
| 682 |     { | 
| 683 |       Accel::Intersectors intersectors; | 
| 684 |       intersectors.ptr = bvh; | 
| 685 |       intersectors.intersector1  = BVH8Quad4vIntersector1Pluecker(); | 
| 686 | #if defined (EMBREE_RAY_PACKETS) | 
| 687 |       intersectors.intersector4  = BVH8Quad4vIntersector4HybridPluecker(); | 
| 688 |       intersectors.intersector8  = BVH8Quad4vIntersector8HybridPluecker(); | 
| 689 |       intersectors.intersector16 = BVH8Quad4vIntersector16HybridPluecker(); | 
| 690 |       intersectors.intersectorN  = BVH8Quad4vIntersectorStreamPluecker(); | 
| 691 | #endif | 
| 692 |       return intersectors; | 
| 693 |     } | 
| 694 |     } | 
| 695 |     return Accel::Intersectors(); | 
| 696 |   } | 
| 697 |  | 
| 698 |   Accel::Intersectors BVH8Factory::BVH8Quad4iIntersectors(BVH8* bvh, IntersectVariant ivariant) | 
| 699 |   { | 
| 700 |     switch (ivariant) { | 
| 701 |     case IntersectVariant::FAST: | 
| 702 |     { | 
| 703 |       Accel::Intersectors intersectors; | 
| 704 |       intersectors.ptr = bvh; | 
| 705 |       intersectors.intersector1  = BVH8Quad4iIntersector1Moeller(); | 
| 706 | #if defined (EMBREE_RAY_PACKETS) | 
| 707 |       intersectors.intersector4  = BVH8Quad4iIntersector4HybridMoeller(); | 
| 708 |       intersectors.intersector8  = BVH8Quad4iIntersector8HybridMoeller(); | 
| 709 |       intersectors.intersector16 = BVH8Quad4iIntersector16HybridMoeller(); | 
| 710 |       intersectors.intersectorN  = BVH8Quad4iIntersectorStreamMoeller(); | 
| 711 | #endif | 
| 712 |       return intersectors; | 
| 713 |     } | 
| 714 |     case IntersectVariant::ROBUST: | 
| 715 |     { | 
| 716 |       Accel::Intersectors intersectors; | 
| 717 |       intersectors.ptr = bvh; | 
| 718 |       intersectors.intersector1  = BVH8Quad4iIntersector1Pluecker(); | 
| 719 | #if defined (EMBREE_RAY_PACKETS) | 
| 720 |       intersectors.intersector4  = BVH8Quad4iIntersector4HybridPluecker(); | 
| 721 |       intersectors.intersector8  = BVH8Quad4iIntersector8HybridPluecker(); | 
| 722 |       intersectors.intersector16 = BVH8Quad4iIntersector16HybridPluecker(); | 
| 723 |       intersectors.intersectorN  = BVH8Quad4iIntersectorStreamPluecker(); | 
| 724 | #endif | 
| 725 |       return intersectors; | 
| 726 |     } | 
| 727 |     } | 
| 728 |     return Accel::Intersectors(); | 
| 729 |   } | 
| 730 |  | 
| 731 |   Accel::Intersectors BVH8Factory::BVH8Quad4iMBIntersectors(BVH8* bvh, IntersectVariant ivariant) | 
| 732 |   { | 
| 733 |     switch (ivariant) { | 
| 734 |     case IntersectVariant::FAST: | 
| 735 |     { | 
| 736 |       Accel::Intersectors intersectors; | 
| 737 |       intersectors.ptr = bvh; | 
| 738 |       intersectors.intersector1  = BVH8Quad4iMBIntersector1Moeller(); | 
| 739 | #if defined (EMBREE_RAY_PACKETS) | 
| 740 |       intersectors.intersector4  = BVH8Quad4iMBIntersector4HybridMoeller(); | 
| 741 |       intersectors.intersector8  = BVH8Quad4iMBIntersector8HybridMoeller(); | 
| 742 |       intersectors.intersector16 = BVH8Quad4iMBIntersector16HybridMoeller(); | 
| 743 |       intersectors.intersectorN  = BVH8IntersectorStreamPacketFallback(); | 
| 744 | #endif | 
| 745 |       return intersectors; | 
| 746 |     } | 
| 747 |     case IntersectVariant::ROBUST: | 
| 748 |     { | 
| 749 |       Accel::Intersectors intersectors; | 
| 750 |       intersectors.ptr = bvh; | 
| 751 |       intersectors.intersector1  = BVH8Quad4iMBIntersector1Pluecker(); | 
| 752 | #if defined (EMBREE_RAY_PACKETS) | 
| 753 |       intersectors.intersector4  = BVH8Quad4iMBIntersector4HybridPluecker(); | 
| 754 |       intersectors.intersector8  = BVH8Quad4iMBIntersector8HybridPluecker(); | 
| 755 |       intersectors.intersector16 = BVH8Quad4iMBIntersector16HybridPluecker(); | 
| 756 |       intersectors.intersectorN  = BVH8IntersectorStreamPacketFallback(); | 
| 757 | #endif | 
| 758 |       return intersectors; | 
| 759 |     } | 
| 760 |     } | 
| 761 |     return Accel::Intersectors(); | 
| 762 |   } | 
| 763 |  | 
| 764 |   Accel::Intersectors BVH8Factory::QBVH8Triangle4iIntersectors(BVH8* bvh) | 
| 765 |   { | 
| 766 |     Accel::Intersectors intersectors; | 
| 767 |     intersectors.ptr = bvh; | 
| 768 |     intersectors.intersector1 = QBVH8Triangle4iIntersector1Pluecker(); | 
| 769 |     return intersectors; | 
| 770 |   } | 
| 771 |  | 
| 772 |   Accel::Intersectors BVH8Factory::QBVH8Triangle4Intersectors(BVH8* bvh) | 
| 773 |   { | 
| 774 |     Accel::Intersectors intersectors; | 
| 775 |     intersectors.ptr = bvh; | 
| 776 |     intersectors.intersector1 = QBVH8Triangle4Intersector1Moeller(); | 
| 777 |     return intersectors; | 
| 778 |   } | 
| 779 |  | 
| 780 |   Accel::Intersectors BVH8Factory::QBVH8Quad4iIntersectors(BVH8* bvh) | 
| 781 |   { | 
| 782 |     Accel::Intersectors intersectors; | 
| 783 |     intersectors.ptr = bvh; | 
| 784 |     intersectors.intersector1 = QBVH8Quad4iIntersector1Pluecker(); | 
| 785 |     return intersectors; | 
| 786 |   } | 
| 787 |  | 
| 788 |   Accel::Intersectors BVH8Factory::BVH8UserGeometryIntersectors(BVH8* bvh) | 
| 789 |   { | 
| 790 |     Accel::Intersectors intersectors; | 
| 791 |     intersectors.ptr = bvh; | 
| 792 |     intersectors.intersector1  = BVH8VirtualIntersector1(); | 
| 793 | #if defined (EMBREE_RAY_PACKETS) | 
| 794 |     intersectors.intersector4  = BVH8VirtualIntersector4Chunk(); | 
| 795 |     intersectors.intersector8  = BVH8VirtualIntersector8Chunk(); | 
| 796 |     intersectors.intersector16 = BVH8VirtualIntersector16Chunk(); | 
| 797 |     intersectors.intersectorN  = BVH8VirtualIntersectorStream(); | 
| 798 | #endif | 
| 799 |     intersectors.collider      = BVH8ColliderUserGeom(); | 
| 800 |     return intersectors; | 
| 801 |   } | 
| 802 |  | 
| 803 |   Accel::Intersectors BVH8Factory::BVH8UserGeometryMBIntersectors(BVH8* bvh) | 
| 804 |   { | 
| 805 |     Accel::Intersectors intersectors; | 
| 806 |     intersectors.ptr = bvh; | 
| 807 |     intersectors.intersector1  = BVH8VirtualMBIntersector1(); | 
| 808 | #if defined (EMBREE_RAY_PACKETS) | 
| 809 |     intersectors.intersector4  = BVH8VirtualMBIntersector4Chunk(); | 
| 810 |     intersectors.intersector8  = BVH8VirtualMBIntersector8Chunk(); | 
| 811 |     intersectors.intersector16 = BVH8VirtualMBIntersector16Chunk(); | 
| 812 |     intersectors.intersectorN  = BVH8IntersectorStreamPacketFallback(); | 
| 813 | #endif | 
| 814 |     return intersectors; | 
| 815 |   } | 
| 816 |  | 
| 817 |   Accel::Intersectors BVH8Factory::BVH8InstanceIntersectors(BVH8* bvh) | 
| 818 |   { | 
| 819 |     Accel::Intersectors intersectors; | 
| 820 |     intersectors.ptr = bvh; | 
| 821 |     intersectors.intersector1  = BVH8InstanceIntersector1(); | 
| 822 | #if defined (EMBREE_RAY_PACKETS) | 
| 823 |     intersectors.intersector4  = BVH8InstanceIntersector4Chunk(); | 
| 824 |     intersectors.intersector8  = BVH8InstanceIntersector8Chunk(); | 
| 825 |     intersectors.intersector16 = BVH8InstanceIntersector16Chunk(); | 
| 826 |     intersectors.intersectorN  = BVH8InstanceIntersectorStream(); | 
| 827 | #endif | 
| 828 |     return intersectors; | 
| 829 |   } | 
| 830 |  | 
| 831 |   Accel::Intersectors BVH8Factory::BVH8InstanceMBIntersectors(BVH8* bvh) | 
| 832 |   { | 
| 833 |     Accel::Intersectors intersectors; | 
| 834 |     intersectors.ptr = bvh; | 
| 835 |     intersectors.intersector1  = BVH8InstanceMBIntersector1(); | 
| 836 | #if defined (EMBREE_RAY_PACKETS) | 
| 837 |     intersectors.intersector4  = BVH8InstanceMBIntersector4Chunk(); | 
| 838 |     intersectors.intersector8  = BVH8InstanceMBIntersector8Chunk(); | 
| 839 |     intersectors.intersector16 = BVH8InstanceMBIntersector16Chunk(); | 
| 840 |     intersectors.intersectorN  = BVH8IntersectorStreamPacketFallback(); | 
| 841 | #endif | 
| 842 |     return intersectors; | 
| 843 |   } | 
| 844 |  | 
| 845 |   Accel* BVH8Factory::BVH8OBBVirtualCurve8v(Scene* scene, IntersectVariant ivariant) | 
| 846 |   { | 
| 847 |     BVH8* accel = new BVH8(Curve8v::type,scene); | 
| 848 |     Accel::Intersectors intersectors = BVH8OBBVirtualCurveIntersectors(accel,VirtualCurveIntersector8v(),ivariant); | 
| 849 |     Builder* builder = BVH8Curve8vBuilder_OBB_New(accel,scene,0); | 
| 850 |     return new AccelInstance(accel,builder,intersectors); | 
| 851 |   } | 
| 852 |  | 
| 853 |   Accel* BVH8Factory::BVH8OBBVirtualCurve8iMB(Scene* scene, IntersectVariant ivariant) | 
| 854 |   { | 
| 855 |     BVH8* accel = new BVH8(Curve8iMB::type,scene); | 
| 856 |     Accel::Intersectors intersectors = BVH8OBBVirtualCurveIntersectorsMB(accel,VirtualCurveIntersector8iMB(),ivariant); | 
| 857 |     Builder* builder = BVH8OBBCurve8iMBBuilder_OBB(accel,scene,0); | 
| 858 |     return new AccelInstance(accel,builder,intersectors); | 
| 859 |   } | 
| 860 |  | 
| 861 |   Accel* BVH8Factory::BVH8Triangle4(Scene* scene, BuildVariant bvariant, IntersectVariant ivariant) | 
| 862 |   { | 
| 863 |     BVH8* accel = new BVH8(Triangle4::type,scene); | 
| 864 |     Accel::Intersectors intersectors= BVH8Triangle4Intersectors(accel,ivariant); | 
| 865 |     Builder* builder = nullptr; | 
| 866 |     if (scene->device->tri_builder == "default" )  { | 
| 867 |       switch (bvariant) { | 
| 868 |       case BuildVariant::STATIC      : builder = BVH8Triangle4SceneBuilderSAH(accel,scene,0); break; | 
| 869 |       case BuildVariant::DYNAMIC     : builder = BVH8BuilderTwoLevelTriangle4MeshSAH(accel,scene,false); break; | 
| 870 |       case BuildVariant::HIGH_QUALITY: builder = BVH8Triangle4SceneBuilderFastSpatialSAH(accel,scene,0); break; | 
| 871 |       } | 
| 872 |     } | 
| 873 |     else if (scene->device->tri_builder == "sah"          )  builder = BVH8Triangle4SceneBuilderSAH(accel,scene,0); | 
| 874 |     else if (scene->device->tri_builder == "sah_fast_spatial" )  builder = BVH8Triangle4SceneBuilderFastSpatialSAH(accel,scene,0); | 
| 875 |     else if (scene->device->tri_builder == "sah_presplit" )     builder = BVH8Triangle4SceneBuilderSAH(accel,scene,MODE_HIGH_QUALITY); | 
| 876 |     else if (scene->device->tri_builder == "dynamic"      ) builder = BVH8BuilderTwoLevelTriangle4MeshSAH(accel,scene,false); | 
| 877 |     else if (scene->device->tri_builder == "morton"      ) builder = BVH8BuilderTwoLevelTriangle4MeshSAH(accel,scene,true); | 
| 878 |     else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder " +scene->device->tri_builder+" for BVH8<Triangle4>" ); | 
| 879 |  | 
| 880 |     return new AccelInstance(accel,builder,intersectors); | 
| 881 |   } | 
| 882 |  | 
| 883 |   Accel* BVH8Factory::BVH8Triangle4v(Scene* scene, BuildVariant bvariant, IntersectVariant ivariant) | 
| 884 |   { | 
| 885 |     BVH8* accel = new BVH8(Triangle4v::type,scene); | 
| 886 |     Accel::Intersectors intersectors= BVH8Triangle4vIntersectors(accel,ivariant); | 
| 887 |     Builder* builder = nullptr; | 
| 888 |     if (scene->device->tri_builder == "default" )  { | 
| 889 |       switch (bvariant) { | 
| 890 |       case BuildVariant::STATIC      : builder = BVH8Triangle4vSceneBuilderSAH(accel,scene,0); break; | 
| 891 |       case BuildVariant::DYNAMIC     : builder = BVH8BuilderTwoLevelTriangle4vMeshSAH(accel,scene,false); break; | 
| 892 |       case BuildVariant::HIGH_QUALITY: builder = BVH8Triangle4vSceneBuilderFastSpatialSAH(accel,scene,0); break; | 
| 893 |       } | 
| 894 |     } | 
| 895 |     else if (scene->device->tri_builder == "sah_fast_spatial" )  builder = BVH8Triangle4SceneBuilderFastSpatialSAH(accel,scene,0); | 
| 896 |     else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder " +scene->device->tri_builder+" for BVH8<Triangle4v>" ); | 
| 897 |     return new AccelInstance(accel,builder,intersectors); | 
| 898 |   } | 
| 899 |  | 
| 900 |   Accel* BVH8Factory::BVH8Triangle4i(Scene* scene, BuildVariant bvariant, IntersectVariant ivariant) | 
| 901 |   { | 
| 902 |     BVH8* accel = new BVH8(Triangle4i::type,scene); | 
| 903 |     Accel::Intersectors intersectors = BVH8Triangle4iIntersectors(accel,ivariant); | 
| 904 |  | 
| 905 |     Builder* builder = nullptr; | 
| 906 |     if (scene->device->tri_builder == "default" ) { | 
| 907 |       switch (bvariant) { | 
| 908 |       case BuildVariant::STATIC      : builder = BVH8Triangle4iSceneBuilderSAH(accel,scene,0); break; | 
| 909 |       case BuildVariant::DYNAMIC     : builder = BVH8BuilderTwoLevelTriangle4iMeshSAH(accel,scene,false); break; | 
| 910 |       case BuildVariant::HIGH_QUALITY: assert(false); break; // FIXME: implement | 
| 911 |       } | 
| 912 |     } | 
| 913 |     else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder " +scene->device->tri_builder+" for BVH8<Triangle4i>" ); | 
| 914 |  | 
| 915 |     return new AccelInstance(accel,builder,intersectors); | 
| 916 |   } | 
| 917 |  | 
| 918 |   Accel* BVH8Factory::BVH8Triangle4iMB(Scene* scene, BuildVariant bvariant, IntersectVariant ivariant) | 
| 919 |   { | 
| 920 |     BVH8* accel = new BVH8(Triangle4i::type,scene); | 
| 921 |     Accel::Intersectors intersectors = BVH8Triangle4iMBIntersectors(accel,ivariant); | 
| 922 |  | 
| 923 |     Builder* builder = nullptr; | 
| 924 |     if (scene->device->tri_builder_mb == "default" ) { // FIXME: implement | 
| 925 |       switch (bvariant) { | 
| 926 |       case BuildVariant::STATIC      : builder = BVH8Triangle4iMBSceneBuilderSAH(accel,scene,0); break; | 
| 927 |       case BuildVariant::DYNAMIC     : assert(false); break; // FIXME: implement | 
| 928 |       case BuildVariant::HIGH_QUALITY: assert(false); break; | 
| 929 |       } | 
| 930 |     } | 
| 931 |     else if (scene->device->tri_builder_mb == "internal_time_splits" )  builder = BVH8Triangle4iMBSceneBuilderSAH(accel,scene,0); | 
| 932 |     else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder " +scene->device->tri_builder_mb+" for BVH8<Triangle4iMB>" ); | 
| 933 |  | 
| 934 |     return new AccelInstance(accel,builder,intersectors); | 
| 935 |   } | 
| 936 |  | 
| 937 |   Accel* BVH8Factory::BVH8Triangle4vMB(Scene* scene, BuildVariant bvariant, IntersectVariant ivariant) | 
| 938 |   { | 
| 939 |     BVH8* accel = new BVH8(Triangle4vMB::type,scene); | 
| 940 |     Accel::Intersectors intersectors= BVH8Triangle4vMBIntersectors(accel,ivariant); | 
| 941 |  | 
| 942 |     Builder* builder = nullptr; | 
| 943 |     if (scene->device->tri_builder_mb == "default" ) { | 
| 944 |       switch (bvariant) { | 
| 945 |       case BuildVariant::STATIC      : builder = BVH8Triangle4vMBSceneBuilderSAH(accel,scene,0); break; | 
| 946 |       case BuildVariant::DYNAMIC     : assert(false); break; // FIXME: implement | 
| 947 |       case BuildVariant::HIGH_QUALITY: assert(false); break; | 
| 948 |       } | 
| 949 |     } | 
| 950 |     else if (scene->device->tri_builder_mb == "internal_time_splits" )  builder = BVH8Triangle4vMBSceneBuilderSAH(accel,scene,0); | 
| 951 |     else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder " +scene->device->tri_builder_mb+" for BVH8<Triangle4vMB>" ); | 
| 952 |  | 
| 953 |     return new AccelInstance(accel,builder,intersectors); | 
| 954 |   } | 
| 955 |  | 
| 956 |   Accel* BVH8Factory::BVH8QuantizedTriangle4i(Scene* scene) | 
| 957 |   { | 
| 958 |     BVH8* accel = new BVH8(Triangle4i::type,scene); | 
| 959 |     Accel::Intersectors intersectors = QBVH8Triangle4iIntersectors(accel); | 
| 960 |     Builder* builder = BVH8QuantizedTriangle4iSceneBuilderSAH(accel,scene,0); | 
| 961 |     return new AccelInstance(accel,builder,intersectors); | 
| 962 |   } | 
| 963 |  | 
| 964 |   Accel* BVH8Factory::BVH8QuantizedTriangle4(Scene* scene) | 
| 965 |   { | 
| 966 |     BVH8* accel = new BVH8(Triangle4::type,scene); | 
| 967 |     Accel::Intersectors intersectors = QBVH8Triangle4Intersectors(accel); | 
| 968 |     Builder* builder = BVH8QuantizedTriangle4SceneBuilderSAH(accel,scene,0); | 
| 969 |     return new AccelInstance(accel,builder,intersectors); | 
| 970 |   } | 
| 971 |  | 
| 972 |   Accel* BVH8Factory::BVH8Quad4v(Scene* scene, BuildVariant bvariant, IntersectVariant ivariant) | 
| 973 |   { | 
| 974 |     BVH8* accel = new BVH8(Quad4v::type,scene); | 
| 975 |     Accel::Intersectors intersectors = BVH8Quad4vIntersectors(accel,ivariant); | 
| 976 |  | 
| 977 |     Builder* builder = nullptr; | 
| 978 |     if (scene->device->quad_builder == "default" ) { | 
| 979 |       switch (bvariant) { | 
| 980 |       case BuildVariant::STATIC      : builder = BVH8Quad4vSceneBuilderSAH(accel,scene,0); break; | 
| 981 |       case BuildVariant::DYNAMIC     : builder = BVH8BuilderTwoLevelQuadMeshSAH(accel,scene,false); break; | 
| 982 |       case BuildVariant::HIGH_QUALITY: builder = BVH8Quad4vSceneBuilderFastSpatialSAH(accel,scene,0); break; | 
| 983 |       } | 
| 984 |     } | 
| 985 |     else if (scene->device->quad_builder == "dynamic"       ) builder = BVH8BuilderTwoLevelQuadMeshSAH(accel,scene,false); | 
| 986 |     else if (scene->device->quad_builder == "morton"        ) builder = BVH8BuilderTwoLevelQuadMeshSAH(accel,scene,true); | 
| 987 |     else if (scene->device->quad_builder == "sah_fast_spatial"  ) builder = BVH8Quad4vSceneBuilderFastSpatialSAH(accel,scene,0); | 
| 988 |     else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder " +scene->device->quad_builder+" for BVH8<Quad4v>" ); | 
| 989 |  | 
| 990 |     return new AccelInstance(accel,builder,intersectors); | 
| 991 |   } | 
| 992 |  | 
| 993 |   Accel* BVH8Factory::BVH8Quad4i(Scene* scene, BuildVariant bvariant, IntersectVariant ivariant) | 
| 994 |   { | 
| 995 |     BVH8* accel = new BVH8(Quad4i::type,scene); | 
| 996 |     Accel::Intersectors intersectors = BVH8Quad4iIntersectors(accel,ivariant); | 
| 997 |  | 
| 998 |     Builder* builder = nullptr; | 
| 999 |     if (scene->device->quad_builder == "default" ) { | 
| 1000 |       switch (bvariant) { | 
| 1001 |       case BuildVariant::STATIC      : builder = BVH8Quad4iSceneBuilderSAH(accel,scene,0); break; | 
| 1002 |       case BuildVariant::DYNAMIC     : assert(false); break; // FIXME: implement | 
| 1003 |       case BuildVariant::HIGH_QUALITY: assert(false); break; // FIXME: implement | 
| 1004 |       } | 
| 1005 |     } | 
| 1006 |     else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder " +scene->device->quad_builder+" for BVH8<Quad4i>" ); | 
| 1007 |  | 
| 1008 |     return new AccelInstance(accel,builder,intersectors); | 
| 1009 |   } | 
| 1010 |  | 
| 1011 |   Accel* BVH8Factory::BVH8Quad4iMB(Scene* scene, BuildVariant bvariant, IntersectVariant ivariant) | 
| 1012 |   { | 
| 1013 |     BVH8* accel = new BVH8(Quad4i::type,scene); | 
| 1014 |     Accel::Intersectors intersectors = BVH8Quad4iMBIntersectors(accel,ivariant); | 
| 1015 |  | 
| 1016 |     Builder* builder = nullptr; | 
| 1017 |     if (scene->device->quad_builder_mb == "default" ) { | 
| 1018 |       switch (bvariant) { | 
| 1019 |       case BuildVariant::STATIC      : builder = BVH8Quad4iMBSceneBuilderSAH(accel,scene,0); break; | 
| 1020 |       case BuildVariant::DYNAMIC     : assert(false); break; // FIXME: implement | 
| 1021 |       case BuildVariant::HIGH_QUALITY: assert(false); break; | 
| 1022 |       } | 
| 1023 |     } | 
| 1024 |     else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder " +scene->device->quad_builder_mb+" for BVH8<Quad4i>" ); | 
| 1025 |  | 
| 1026 |     return new AccelInstance(accel,builder,intersectors); | 
| 1027 |   } | 
| 1028 |  | 
| 1029 |   Accel* BVH8Factory::BVH8QuantizedQuad4i(Scene* scene) | 
| 1030 |   { | 
| 1031 |     BVH8* accel = new BVH8(Quad4i::type,scene); | 
| 1032 |     Accel::Intersectors intersectors = QBVH8Quad4iIntersectors(accel); | 
| 1033 |     Builder* builder = nullptr; | 
| 1034 |     if      (scene->device->quad_builder == "default"      ) builder = BVH8QuantizedQuad4iSceneBuilderSAH(accel,scene,0); | 
| 1035 |     else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder " +scene->device->quad_builder+" for QBVH8<Quad4i>" ); | 
| 1036 |     return new AccelInstance(accel,builder,intersectors); | 
| 1037 |   } | 
| 1038 |  | 
| 1039 |   Accel* BVH8Factory::BVH8UserGeometry(Scene* scene, BuildVariant bvariant) | 
| 1040 |   { | 
| 1041 |     BVH8* accel = new BVH8(Object::type,scene); | 
| 1042 |     Accel::Intersectors intersectors = BVH8UserGeometryIntersectors(accel); | 
| 1043 |  | 
| 1044 |     Builder* builder = nullptr; | 
| 1045 |     if (scene->device->object_builder == "default" ) { | 
| 1046 |       switch (bvariant) { | 
| 1047 |       case BuildVariant::STATIC      : builder = BVH8VirtualSceneBuilderSAH(accel,scene,0); break; | 
| 1048 |       case BuildVariant::DYNAMIC     : builder = BVH8BuilderTwoLevelVirtualSAH(accel,scene,false); break; | 
| 1049 |       case BuildVariant::HIGH_QUALITY: assert(false); break; | 
| 1050 |       } | 
| 1051 |     } | 
| 1052 |     else if (scene->device->object_builder == "sah" ) builder = BVH8VirtualSceneBuilderSAH(accel,scene,0); | 
| 1053 |     else if (scene->device->object_builder == "dynamic" ) builder = BVH8BuilderTwoLevelVirtualSAH(accel,scene,false); | 
| 1054 |     else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder " +scene->device->object_builder+" for BVH8<Object>" ); | 
| 1055 |  | 
| 1056 |     return new AccelInstance(accel,builder,intersectors); | 
| 1057 |   } | 
| 1058 |  | 
| 1059 |   Accel* BVH8Factory::BVH8UserGeometryMB(Scene* scene) | 
| 1060 |   { | 
| 1061 |     BVH8* accel = new BVH8(Object::type,scene); | 
| 1062 |     Accel::Intersectors intersectors = BVH8UserGeometryMBIntersectors(accel); | 
| 1063 |     Builder* builder = BVH8VirtualMBSceneBuilderSAH(accel,scene,0); | 
| 1064 |     return new AccelInstance(accel,builder,intersectors); | 
| 1065 |   } | 
| 1066 |  | 
| 1067 |   Accel* BVH8Factory::BVH8Instance(Scene* scene, bool isExpensive, BuildVariant bvariant) | 
| 1068 |   { | 
| 1069 |     BVH8* accel = new BVH8(InstancePrimitive::type,scene); | 
| 1070 |     Accel::Intersectors intersectors = BVH8InstanceIntersectors(accel); | 
| 1071 |     auto gtype = isExpensive ? Geometry::MTY_INSTANCE_EXPENSIVE : Geometry::MTY_INSTANCE;  | 
| 1072 |     // Builder* builder = BVH8InstanceSceneBuilderSAH(accel,scene,gtype); | 
| 1073 |  | 
| 1074 |     Builder* builder = nullptr; | 
| 1075 |     if (scene->device->object_builder == "default" ) { | 
| 1076 |       switch (bvariant) { | 
| 1077 |       case BuildVariant::STATIC      : builder = BVH8InstanceSceneBuilderSAH(accel,scene,gtype);; break; | 
| 1078 |       case BuildVariant::DYNAMIC     : builder = BVH8BuilderTwoLevelInstanceSAH(accel,scene,gtype,false); break; | 
| 1079 |       case BuildVariant::HIGH_QUALITY: assert(false); break; | 
| 1080 |       } | 
| 1081 |     } | 
| 1082 |     else if (scene->device->object_builder == "sah" ) builder = BVH8InstanceSceneBuilderSAH(accel,scene,gtype); | 
| 1083 |     else if (scene->device->object_builder == "dynamic" ) builder = BVH8BuilderTwoLevelInstanceSAH(accel,scene,gtype,false); | 
| 1084 |     else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder " +scene->device->object_builder+" for BVH8<Object>" ); | 
| 1085 |  | 
| 1086 |     return new AccelInstance(accel,builder,intersectors); | 
| 1087 |   } | 
| 1088 |  | 
| 1089 |   Accel* BVH8Factory::BVH8InstanceMB(Scene* scene, bool isExpensive) | 
| 1090 |   { | 
| 1091 |     BVH8* accel = new BVH8(InstancePrimitive::type,scene); | 
| 1092 |     Accel::Intersectors intersectors = BVH8InstanceMBIntersectors(accel); | 
| 1093 |     auto gtype = isExpensive ? Geometry::MTY_INSTANCE_EXPENSIVE : Geometry::MTY_INSTANCE;  | 
| 1094 |     Builder* builder = BVH8InstanceMBSceneBuilderSAH(accel,scene,gtype); | 
| 1095 |     return new AccelInstance(accel,builder,intersectors); | 
| 1096 |   } | 
| 1097 |  | 
| 1098 |   Accel::Intersectors BVH8Factory::BVH8GridIntersectors(BVH8* bvh, IntersectVariant ivariant) | 
| 1099 |   { | 
| 1100 |     Accel::Intersectors intersectors; | 
| 1101 |     intersectors.ptr = bvh; | 
| 1102 |     if (ivariant == IntersectVariant::FAST) | 
| 1103 |     { | 
| 1104 |       intersectors.intersector1  = BVH8GridIntersector1Moeller(); | 
| 1105 | #if defined (EMBREE_RAY_PACKETS) | 
| 1106 |       intersectors.intersector4  = BVH8GridIntersector4HybridMoeller(); | 
| 1107 |       intersectors.intersector8  = BVH8GridIntersector8HybridMoeller(); | 
| 1108 |       intersectors.intersector16 = BVH8GridIntersector16HybridMoeller(); | 
| 1109 |       intersectors.intersectorN  = BVH8IntersectorStreamPacketFallback(); | 
| 1110 | #endif | 
| 1111 |     } | 
| 1112 |     else /* if (ivariant == IntersectVariant::ROBUST) */ | 
| 1113 |     { | 
| 1114 |       intersectors.intersector1  = BVH8GridIntersector1Pluecker(); | 
| 1115 | #if defined (EMBREE_RAY_PACKETS) | 
| 1116 |       intersectors.intersector4  = BVH8GridIntersector4HybridPluecker(); | 
| 1117 |       intersectors.intersector8  = BVH8GridIntersector8HybridPluecker(); | 
| 1118 |       intersectors.intersector16 = BVH8GridIntersector16HybridPluecker(); | 
| 1119 |       intersectors.intersectorN  = BVH8IntersectorStreamPacketFallback(); | 
| 1120 | #endif             | 
| 1121 |     } | 
| 1122 |     return intersectors; | 
| 1123 |   } | 
| 1124 |  | 
| 1125 |   Accel::Intersectors BVH8Factory::BVH8GridMBIntersectors(BVH8* bvh, IntersectVariant ivariant) | 
| 1126 |   { | 
| 1127 |     Accel::Intersectors intersectors; | 
| 1128 |     intersectors.ptr = bvh; | 
| 1129 |     intersectors.intersector1  = BVH8GridMBIntersector1Moeller(); | 
| 1130 | #if defined (EMBREE_RAY_PACKETS) | 
| 1131 |     intersectors.intersector4  = nullptr; | 
| 1132 |     intersectors.intersector8  = nullptr; | 
| 1133 |     intersectors.intersector16 = nullptr; | 
| 1134 |     intersectors.intersectorN  = nullptr; | 
| 1135 | #endif | 
| 1136 |     return intersectors; | 
| 1137 |   } | 
| 1138 |  | 
| 1139 |   Accel* BVH8Factory::BVH8Grid(Scene* scene, BuildVariant bvariant, IntersectVariant ivariant) | 
| 1140 |   { | 
| 1141 |     BVH8* accel = new BVH8(SubGridQBVH8::type,scene); | 
| 1142 |     Accel::Intersectors intersectors = BVH8GridIntersectors(accel,ivariant); | 
| 1143 |     Builder* builder = nullptr; | 
| 1144 |     if (scene->device->grid_builder == "default" ) { | 
| 1145 |       builder = BVH8GridSceneBuilderSAH(accel,scene,0); | 
| 1146 |     } | 
| 1147 |     else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder " +scene->device->object_builder+" for BVH4<GridMesh>" ); | 
| 1148 |  | 
| 1149 |     return new AccelInstance(accel,builder,intersectors);     | 
| 1150 |   } | 
| 1151 |  | 
| 1152 |   Accel* BVH8Factory::BVH8GridMB(Scene* scene, BuildVariant bvariant, IntersectVariant ivariant) | 
| 1153 |   { | 
| 1154 |     BVH8* accel = new BVH8(SubGridQBVH8::type,scene); | 
| 1155 |     Accel::Intersectors intersectors = BVH8GridMBIntersectors(accel,ivariant); | 
| 1156 |     Builder* builder = nullptr; | 
| 1157 |     if (scene->device->grid_builder_mb == "default" ) { | 
| 1158 |       builder = BVH8GridMBSceneBuilderSAH(accel,scene,0); | 
| 1159 |     } | 
| 1160 |     else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder " +scene->device->object_builder+" for BVH8MB<GridMesh>" ); | 
| 1161 |     return new AccelInstance(accel,builder,intersectors);         | 
| 1162 |   } | 
| 1163 | } | 
| 1164 |  | 
| 1165 | #endif | 
| 1166 |  |