Path: blob/master/thirdparty/embree/kernels/bvh/bvh4_factory.cpp
9906 views
// Copyright 2009-2021 Intel Corporation1// SPDX-License-Identifier: Apache-2.023#include "bvh4_factory.h"4#include "../bvh/bvh.h"56#include "../geometry/curveNv.h"7#include "../geometry/curveNi.h"8#include "../geometry/curveNi_mb.h"9#include "../geometry/linei.h"10#include "../geometry/triangle.h"11#include "../geometry/trianglev.h"12#include "../geometry/trianglev_mb.h"13#include "../geometry/trianglei.h"14#include "../geometry/quadv.h"15#include "../geometry/quadi.h"16#include "../geometry/subdivpatch1.h"17#include "../geometry/object.h"18#include "../geometry/instance.h"19#include "../geometry/instance_array.h"20#include "../geometry/subgrid.h"21#include "../common/accelinstance.h"2223namespace embree24{25DECLARE_SYMBOL2(Accel::Collider,BVH4ColliderUserGeom);2627DECLARE_ISA_FUNCTION(VirtualCurveIntersector*,VirtualCurveIntersector4i,void);28DECLARE_ISA_FUNCTION(VirtualCurveIntersector*,VirtualCurveIntersector8i,void);29DECLARE_ISA_FUNCTION(VirtualCurveIntersector*,VirtualCurveIntersector4v,void);30DECLARE_ISA_FUNCTION(VirtualCurveIntersector*,VirtualCurveIntersector8v,void);31DECLARE_ISA_FUNCTION(VirtualCurveIntersector*,VirtualCurveIntersector4iMB,void);32DECLARE_ISA_FUNCTION(VirtualCurveIntersector*,VirtualCurveIntersector8iMB,void);3334DECLARE_SYMBOL2(Accel::Intersector1,BVH4OBBVirtualCurveIntersector1);35DECLARE_SYMBOL2(Accel::Intersector1,BVH4OBBVirtualCurveIntersector1MB);36DECLARE_SYMBOL2(Accel::Intersector1,BVH4OBBVirtualCurveIntersectorRobust1);37DECLARE_SYMBOL2(Accel::Intersector1,BVH4OBBVirtualCurveIntersectorRobust1MB);3839DECLARE_SYMBOL2(Accel::Intersector1,BVH4Triangle4Intersector1Moeller);40DECLARE_SYMBOL2(Accel::Intersector1,BVH4Triangle4iIntersector1Moeller);41DECLARE_SYMBOL2(Accel::Intersector1,BVH4Triangle4vIntersector1Pluecker);42DECLARE_SYMBOL2(Accel::Intersector1,BVH4Triangle4iIntersector1Pluecker);4344DECLARE_SYMBOL2(Accel::Intersector1,BVH4Triangle4vMBIntersector1Moeller);45DECLARE_SYMBOL2(Accel::Intersector1,BVH4Triangle4iMBIntersector1Moeller);46DECLARE_SYMBOL2(Accel::Intersector1,BVH4Triangle4vMBIntersector1Pluecker);47DECLARE_SYMBOL2(Accel::Intersector1,BVH4Triangle4iMBIntersector1Pluecker);4849DECLARE_SYMBOL2(Accel::Intersector1,BVH4Quad4vIntersector1Moeller);50DECLARE_SYMBOL2(Accel::Intersector1,BVH4Quad4iIntersector1Moeller);51DECLARE_SYMBOL2(Accel::Intersector1,BVH4Quad4vIntersector1Pluecker);52DECLARE_SYMBOL2(Accel::Intersector1,BVH4Quad4iIntersector1Pluecker);5354DECLARE_SYMBOL2(Accel::Intersector1,BVH4Quad4iMBIntersector1Moeller);55DECLARE_SYMBOL2(Accel::Intersector1,BVH4Quad4iMBIntersector1Pluecker);5657DECLARE_SYMBOL2(Accel::Intersector1,QBVH4Triangle4iIntersector1Pluecker);58DECLARE_SYMBOL2(Accel::Intersector1,QBVH4Quad4iIntersector1Pluecker);5960DECLARE_SYMBOL2(Accel::Intersector1,BVH4SubdivPatch1Intersector1);61DECLARE_SYMBOL2(Accel::Intersector1,BVH4SubdivPatch1MBIntersector1);6263DECLARE_SYMBOL2(Accel::Intersector1,BVH4VirtualIntersector1);64DECLARE_SYMBOL2(Accel::Intersector1,BVH4VirtualMBIntersector1);6566DECLARE_SYMBOL2(Accel::Intersector1,BVH4InstanceIntersector1);67DECLARE_SYMBOL2(Accel::Intersector1,BVH4InstanceMBIntersector1);6869DECLARE_SYMBOL2(Accel::Intersector1,BVH4InstanceArrayIntersector1);70DECLARE_SYMBOL2(Accel::Intersector1,BVH4InstanceArrayMBIntersector1);7172DECLARE_SYMBOL2(Accel::Intersector1,BVH4GridIntersector1Moeller);73DECLARE_SYMBOL2(Accel::Intersector1,BVH4GridMBIntersector1Moeller);74DECLARE_SYMBOL2(Accel::Intersector1,BVH4GridIntersector1Pluecker);7576DECLARE_SYMBOL2(Accel::Intersector4,BVH4OBBVirtualCurveIntersector4Hybrid);77DECLARE_SYMBOL2(Accel::Intersector4,BVH4OBBVirtualCurveIntersector4HybridMB);78DECLARE_SYMBOL2(Accel::Intersector4,BVH4OBBVirtualCurveIntersectorRobust4Hybrid);79DECLARE_SYMBOL2(Accel::Intersector4,BVH4OBBVirtualCurveIntersectorRobust4HybridMB);8081DECLARE_SYMBOL2(Accel::Intersector4,BVH4Triangle4Intersector4HybridMoeller);82DECLARE_SYMBOL2(Accel::Intersector4,BVH4Triangle4Intersector4HybridMoellerNoFilter);83DECLARE_SYMBOL2(Accel::Intersector4,BVH4Triangle4iIntersector4HybridMoeller);84DECLARE_SYMBOL2(Accel::Intersector4,BVH4Triangle4vIntersector4HybridPluecker);85DECLARE_SYMBOL2(Accel::Intersector4,BVH4Triangle4iIntersector4HybridPluecker);8687DECLARE_SYMBOL2(Accel::Intersector4,BVH4Triangle4vMBIntersector4HybridMoeller);88DECLARE_SYMBOL2(Accel::Intersector4,BVH4Triangle4iMBIntersector4HybridMoeller);89DECLARE_SYMBOL2(Accel::Intersector4,BVH4Triangle4vMBIntersector4HybridPluecker);90DECLARE_SYMBOL2(Accel::Intersector4,BVH4Triangle4iMBIntersector4HybridPluecker);9192DECLARE_SYMBOL2(Accel::Intersector4,BVH4Quad4vIntersector4HybridMoeller);93DECLARE_SYMBOL2(Accel::Intersector4,BVH4Quad4vIntersector4HybridMoellerNoFilter);94DECLARE_SYMBOL2(Accel::Intersector4,BVH4Quad4iIntersector4HybridMoeller);95DECLARE_SYMBOL2(Accel::Intersector4,BVH4Quad4vIntersector4HybridPluecker);96DECLARE_SYMBOL2(Accel::Intersector4,BVH4Quad4iIntersector4HybridPluecker);9798DECLARE_SYMBOL2(Accel::Intersector4,BVH4Quad4iMBIntersector4HybridMoeller);99DECLARE_SYMBOL2(Accel::Intersector4,BVH4Quad4iMBIntersector4HybridPluecker);100101DECLARE_SYMBOL2(Accel::Intersector4,BVH4SubdivPatch1Intersector4);102DECLARE_SYMBOL2(Accel::Intersector4,BVH4SubdivPatch1MBIntersector4);103104DECLARE_SYMBOL2(Accel::Intersector4,BVH4VirtualIntersector4Chunk);105DECLARE_SYMBOL2(Accel::Intersector4,BVH4VirtualMBIntersector4Chunk);106107DECLARE_SYMBOL2(Accel::Intersector4,BVH4InstanceIntersector4Chunk);108DECLARE_SYMBOL2(Accel::Intersector4,BVH4InstanceMBIntersector4Chunk);109110DECLARE_SYMBOL2(Accel::Intersector4,BVH4InstanceArrayIntersector4Chunk);111DECLARE_SYMBOL2(Accel::Intersector4,BVH4InstanceArrayMBIntersector4Chunk);112113DECLARE_SYMBOL2(Accel::Intersector4,BVH4GridIntersector4HybridMoeller);114DECLARE_SYMBOL2(Accel::Intersector4,BVH4GridMBIntersector4HybridMoeller);115DECLARE_SYMBOL2(Accel::Intersector4,BVH4GridIntersector4HybridPluecker);116117DECLARE_SYMBOL2(Accel::Intersector8,BVH4OBBVirtualCurveIntersector8Hybrid);118DECLARE_SYMBOL2(Accel::Intersector8,BVH4OBBVirtualCurveIntersector8HybridMB);119DECLARE_SYMBOL2(Accel::Intersector8,BVH4OBBVirtualCurveIntersectorRobust8Hybrid);120DECLARE_SYMBOL2(Accel::Intersector8,BVH4OBBVirtualCurveIntersectorRobust8HybridMB);121122DECLARE_SYMBOL2(Accel::Intersector8,BVH4Triangle4Intersector8HybridMoeller);123DECLARE_SYMBOL2(Accel::Intersector8,BVH4Triangle4Intersector8HybridMoellerNoFilter);124DECLARE_SYMBOL2(Accel::Intersector8,BVH4Triangle4iIntersector8HybridMoeller);125DECLARE_SYMBOL2(Accel::Intersector8,BVH4Triangle4vIntersector8HybridPluecker);126DECLARE_SYMBOL2(Accel::Intersector8,BVH4Triangle4iIntersector8HybridPluecker);127128DECLARE_SYMBOL2(Accel::Intersector8,BVH4Triangle4vMBIntersector8HybridMoeller);129DECLARE_SYMBOL2(Accel::Intersector8,BVH4Triangle4iMBIntersector8HybridMoeller);130DECLARE_SYMBOL2(Accel::Intersector8,BVH4Triangle4vMBIntersector8HybridPluecker);131DECLARE_SYMBOL2(Accel::Intersector8,BVH4Triangle4iMBIntersector8HybridPluecker);132133DECLARE_SYMBOL2(Accel::Intersector8,BVH4Quad4vIntersector8HybridMoeller);134DECLARE_SYMBOL2(Accel::Intersector8,BVH4Quad4vIntersector8HybridMoellerNoFilter);135DECLARE_SYMBOL2(Accel::Intersector8,BVH4Quad4iIntersector8HybridMoeller);136DECLARE_SYMBOL2(Accel::Intersector8,BVH4Quad4vIntersector8HybridPluecker);137DECLARE_SYMBOL2(Accel::Intersector8,BVH4Quad4iIntersector8HybridPluecker);138139DECLARE_SYMBOL2(Accel::Intersector8,BVH4Quad4iMBIntersector8HybridMoeller);140DECLARE_SYMBOL2(Accel::Intersector8,BVH4Quad4iMBIntersector8HybridPluecker);141142DECLARE_SYMBOL2(Accel::Intersector8,BVH4SubdivPatch1Intersector8);143DECLARE_SYMBOL2(Accel::Intersector8,BVH4SubdivPatch1MBIntersector8);144145DECLARE_SYMBOL2(Accel::Intersector8,BVH4VirtualIntersector8Chunk);146DECLARE_SYMBOL2(Accel::Intersector8,BVH4VirtualMBIntersector8Chunk);147148DECLARE_SYMBOL2(Accel::Intersector8,BVH4InstanceIntersector8Chunk);149DECLARE_SYMBOL2(Accel::Intersector8,BVH4InstanceMBIntersector8Chunk);150151DECLARE_SYMBOL2(Accel::Intersector8,BVH4InstanceArrayIntersector8Chunk);152DECLARE_SYMBOL2(Accel::Intersector8,BVH4InstanceArrayMBIntersector8Chunk);153154DECLARE_SYMBOL2(Accel::Intersector8,BVH4GridIntersector8HybridMoeller);155DECLARE_SYMBOL2(Accel::Intersector8,BVH4GridMBIntersector8HybridMoeller);156DECLARE_SYMBOL2(Accel::Intersector8,BVH4GridIntersector8HybridPluecker);157158DECLARE_SYMBOL2(Accel::Intersector16,BVH4OBBVirtualCurveIntersector16Hybrid);159DECLARE_SYMBOL2(Accel::Intersector16,BVH4OBBVirtualCurveIntersector16HybridMB);160DECLARE_SYMBOL2(Accel::Intersector16,BVH4OBBVirtualCurveIntersectorRobust16Hybrid);161DECLARE_SYMBOL2(Accel::Intersector16,BVH4OBBVirtualCurveIntersectorRobust16HybridMB);162163DECLARE_SYMBOL2(Accel::Intersector16,BVH4Triangle4Intersector16HybridMoeller);164DECLARE_SYMBOL2(Accel::Intersector16,BVH4Triangle4Intersector16HybridMoellerNoFilter);165DECLARE_SYMBOL2(Accel::Intersector16,BVH4Triangle4iIntersector16HybridMoeller);166DECLARE_SYMBOL2(Accel::Intersector16,BVH4Triangle4vIntersector16HybridPluecker);167DECLARE_SYMBOL2(Accel::Intersector16,BVH4Triangle4iIntersector16HybridPluecker);168169DECLARE_SYMBOL2(Accel::Intersector16,BVH4Triangle4vMBIntersector16HybridMoeller);170DECLARE_SYMBOL2(Accel::Intersector16,BVH4Triangle4iMBIntersector16HybridMoeller);171DECLARE_SYMBOL2(Accel::Intersector16,BVH4Triangle4vMBIntersector16HybridPluecker);172DECLARE_SYMBOL2(Accel::Intersector16,BVH4Triangle4iMBIntersector16HybridPluecker);173174DECLARE_SYMBOL2(Accel::Intersector16,BVH4Quad4vIntersector16HybridMoeller);175DECLARE_SYMBOL2(Accel::Intersector16,BVH4Quad4vIntersector16HybridMoellerNoFilter);176DECLARE_SYMBOL2(Accel::Intersector16,BVH4Quad4iIntersector16HybridMoeller);177DECLARE_SYMBOL2(Accel::Intersector16,BVH4Quad4vIntersector16HybridPluecker);178DECLARE_SYMBOL2(Accel::Intersector16,BVH4Quad4iIntersector16HybridPluecker);179180DECLARE_SYMBOL2(Accel::Intersector16,BVH4Quad4iMBIntersector16HybridMoeller);181DECLARE_SYMBOL2(Accel::Intersector16,BVH4Quad4iMBIntersector16HybridPluecker);182183DECLARE_SYMBOL2(Accel::Intersector16,BVH4SubdivPatch1Intersector16);184DECLARE_SYMBOL2(Accel::Intersector16,BVH4SubdivPatch1MBIntersector16);185186DECLARE_SYMBOL2(Accel::Intersector16,BVH4VirtualIntersector16Chunk);187DECLARE_SYMBOL2(Accel::Intersector16,BVH4VirtualMBIntersector16Chunk);188189DECLARE_SYMBOL2(Accel::Intersector16,BVH4InstanceIntersector16Chunk);190DECLARE_SYMBOL2(Accel::Intersector16,BVH4InstanceMBIntersector16Chunk);191192DECLARE_SYMBOL2(Accel::Intersector16,BVH4InstanceArrayIntersector16Chunk);193DECLARE_SYMBOL2(Accel::Intersector16,BVH4InstanceArrayMBIntersector16Chunk);194195DECLARE_SYMBOL2(Accel::Intersector16,BVH4GridIntersector16HybridMoeller);196DECLARE_SYMBOL2(Accel::Intersector16,BVH4GridMBIntersector16HybridMoeller);197DECLARE_SYMBOL2(Accel::Intersector16,BVH4GridIntersector16HybridPluecker);198199DECLARE_ISA_FUNCTION(Builder*,BVH4BuilderTwoLevelTriangle4MeshSAH,void* COMMA Scene* COMMA bool);200DECLARE_ISA_FUNCTION(Builder*,BVH4BuilderTwoLevelTriangle4vMeshSAH,void* COMMA Scene* COMMA bool);201DECLARE_ISA_FUNCTION(Builder*,BVH4BuilderTwoLevelTriangle4iMeshSAH,void* COMMA Scene* COMMA bool);202DECLARE_ISA_FUNCTION(Builder*,BVH4BuilderTwoLevelQuadMeshSAH,void* COMMA Scene* COMMA bool);203DECLARE_ISA_FUNCTION(Builder*,BVH4BuilderTwoLevelVirtualSAH,void* COMMA Scene* COMMA bool);204DECLARE_ISA_FUNCTION(Builder*,BVH4BuilderTwoLevelInstanceSAH,void* COMMA Scene* COMMA Geometry::GTypeMask COMMA bool);205DECLARE_ISA_FUNCTION(Builder*,BVH4BuilderTwoLevelInstanceArraySAH,void* COMMA Scene* COMMA Geometry::GTypeMask COMMA bool);206207DECLARE_ISA_FUNCTION(Builder*,BVH4Curve4vBuilder_OBB_New,void* COMMA Scene* COMMA size_t);208DECLARE_ISA_FUNCTION(Builder*,BVH4Curve4iBuilder_OBB_New,void* COMMA Scene* COMMA size_t);209DECLARE_ISA_FUNCTION(Builder*,BVH4OBBCurve4iMBBuilder_OBB,void* COMMA Scene* COMMA size_t);210DECLARE_ISA_FUNCTION(Builder*,BVH4Curve8iBuilder_OBB_New,void* COMMA Scene* COMMA size_t);211DECLARE_ISA_FUNCTION(Builder*,BVH4OBBCurve8iMBBuilder_OBB,void* COMMA Scene* COMMA size_t);212213DECLARE_ISA_FUNCTION(Builder*,BVH4Triangle4SceneBuilderSAH,void* COMMA Scene* COMMA size_t);214DECLARE_ISA_FUNCTION(Builder*,BVH4Triangle4vSceneBuilderSAH,void* COMMA Scene* COMMA size_t);215DECLARE_ISA_FUNCTION(Builder*,BVH4Triangle4iSceneBuilderSAH,void* COMMA Scene* COMMA size_t);216DECLARE_ISA_FUNCTION(Builder*,BVH4Triangle4iMBSceneBuilderSAH,void* COMMA Scene* COMMA size_t);217DECLARE_ISA_FUNCTION(Builder*,BVH4Triangle4vMBSceneBuilderSAH,void* COMMA Scene* COMMA size_t);218DECLARE_ISA_FUNCTION(Builder*,BVH4QuantizedTriangle4iSceneBuilderSAH,void* COMMA Scene* COMMA size_t);219220DECLARE_ISA_FUNCTION(Builder*,BVH4Quad4vSceneBuilderSAH,void* COMMA Scene* COMMA size_t);221DECLARE_ISA_FUNCTION(Builder*,BVH4Quad4iSceneBuilderSAH,void* COMMA Scene* COMMA size_t);222DECLARE_ISA_FUNCTION(Builder*,BVH4Quad4iMBSceneBuilderSAH,void* COMMA Scene* COMMA size_t);223DECLARE_ISA_FUNCTION(Builder*,BVH4QuantizedQuad4iSceneBuilderSAH,void* COMMA Scene* COMMA size_t);224225DECLARE_ISA_FUNCTION(Builder*,BVH4Triangle4SceneBuilderFastSpatialSAH,void* COMMA Scene* COMMA size_t);226DECLARE_ISA_FUNCTION(Builder*,BVH4Triangle4vSceneBuilderFastSpatialSAH,void* COMMA Scene* COMMA size_t);227DECLARE_ISA_FUNCTION(Builder*,BVH4Triangle4iSceneBuilderFastSpatialSAH,void* COMMA Scene* COMMA size_t);228229DECLARE_ISA_FUNCTION(Builder*,BVH4Quad4vSceneBuilderFastSpatialSAH,void* COMMA Scene* COMMA size_t);230231DECLARE_ISA_FUNCTION(Builder*,BVH4VirtualSceneBuilderSAH,void* COMMA Scene* COMMA size_t);232DECLARE_ISA_FUNCTION(Builder*,BVH4VirtualMBSceneBuilderSAH,void* COMMA Scene* COMMA size_t);233234DECLARE_ISA_FUNCTION(Builder*,BVH4InstanceSceneBuilderSAH,void* COMMA Scene* COMMA Geometry::GTypeMask);235DECLARE_ISA_FUNCTION(Builder*,BVH4InstanceMBSceneBuilderSAH,void* COMMA Scene* COMMA Geometry::GTypeMask);236237DECLARE_ISA_FUNCTION(Builder*,BVH4InstanceArraySceneBuilderSAH,void* COMMA Scene* COMMA Geometry::GTypeMask);238DECLARE_ISA_FUNCTION(Builder*,BVH4InstanceArrayMBSceneBuilderSAH,void* COMMA Scene* COMMA Geometry::GTypeMask);239240DECLARE_ISA_FUNCTION(Builder*,BVH4GridSceneBuilderSAH,void* COMMA Scene* COMMA size_t);241DECLARE_ISA_FUNCTION(Builder*,BVH4GridMBSceneBuilderSAH,void* COMMA Scene* COMMA size_t);242243DECLARE_ISA_FUNCTION(Builder*,BVH4SubdivPatch1BuilderSAH,void* COMMA Scene* COMMA size_t);244DECLARE_ISA_FUNCTION(Builder*,BVH4SubdivPatch1MBBuilderSAH,void* COMMA Scene* COMMA size_t);245246DECLARE_ISA_FUNCTION(Builder*,BVH4Triangle4MeshRefitSAH,void* COMMA TriangleMesh* COMMA unsigned int COMMA size_t);247DECLARE_ISA_FUNCTION(Builder*,BVH4Triangle4vMeshRefitSAH,void* COMMA TriangleMesh* COMMA unsigned int COMMA size_t);248DECLARE_ISA_FUNCTION(Builder*,BVH4Triangle4iMeshRefitSAH,void* COMMA TriangleMesh* COMMA unsigned int COMMA size_t);249DECLARE_ISA_FUNCTION(Builder*,BVH4Quad4vMeshRefitSAH,void* COMMA QuadMesh* COMMA unsigned int COMMA size_t);250DECLARE_ISA_FUNCTION(Builder*,BVH4VirtualMeshRefitSAH,void* COMMA UserGeometry* COMMA unsigned int COMMA size_t);251252BVH4Factory::BVH4Factory(int bfeatures, int ifeatures)253{254SELECT_SYMBOL_DEFAULT_AVX_AVX2(ifeatures,BVH4ColliderUserGeom);255256selectBuilders(bfeatures);257selectIntersectors(ifeatures);258}259260void BVH4Factory::selectBuilders(int features)261{262IF_ENABLED_TRIS (SELECT_SYMBOL_DEFAULT_AVX(features,BVH4BuilderTwoLevelTriangle4MeshSAH));263IF_ENABLED_TRIS (SELECT_SYMBOL_DEFAULT_AVX(features,BVH4BuilderTwoLevelTriangle4iMeshSAH));264IF_ENABLED_TRIS (SELECT_SYMBOL_DEFAULT_AVX(features,BVH4BuilderTwoLevelTriangle4vMeshSAH));265IF_ENABLED_QUADS (SELECT_SYMBOL_DEFAULT_AVX(features,BVH4BuilderTwoLevelQuadMeshSAH));266IF_ENABLED_USER (SELECT_SYMBOL_DEFAULT_AVX(features,BVH4BuilderTwoLevelVirtualSAH));267IF_ENABLED_INSTANCE (SELECT_SYMBOL_DEFAULT_AVX(features,BVH4BuilderTwoLevelInstanceSAH));268IF_ENABLED_INSTANCE_ARRAY (SELECT_SYMBOL_DEFAULT_AVX(features,BVH4BuilderTwoLevelInstanceArraySAH));269270IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_DEFAULT_AVX(features,BVH4Curve4vBuilder_OBB_New));271IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_DEFAULT_AVX(features,BVH4Curve4iBuilder_OBB_New));272IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_DEFAULT_AVX(features,BVH4OBBCurve4iMBBuilder_OBB));273IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX(features,BVH4Curve8iBuilder_OBB_New));274IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX(features,BVH4OBBCurve8iMBBuilder_OBB));275276IF_ENABLED_TRIS(SELECT_SYMBOL_DEFAULT_AVX(features,BVH4Triangle4SceneBuilderSAH));277IF_ENABLED_TRIS(SELECT_SYMBOL_DEFAULT_AVX(features,BVH4Triangle4vSceneBuilderSAH));278IF_ENABLED_TRIS(SELECT_SYMBOL_DEFAULT_AVX(features,BVH4Triangle4iSceneBuilderSAH));279IF_ENABLED_TRIS(SELECT_SYMBOL_DEFAULT_AVX(features,BVH4Triangle4iMBSceneBuilderSAH));280IF_ENABLED_TRIS(SELECT_SYMBOL_DEFAULT_AVX(features,BVH4Triangle4vMBSceneBuilderSAH));281IF_ENABLED_TRIS(SELECT_SYMBOL_DEFAULT_AVX(features,BVH4QuantizedTriangle4iSceneBuilderSAH));282283IF_ENABLED_QUADS(SELECT_SYMBOL_DEFAULT_AVX(features,BVH4Quad4vSceneBuilderSAH));284IF_ENABLED_QUADS(SELECT_SYMBOL_DEFAULT_AVX(features,BVH4Quad4iSceneBuilderSAH));285IF_ENABLED_QUADS(SELECT_SYMBOL_DEFAULT_AVX(features,BVH4Quad4iMBSceneBuilderSAH));286IF_ENABLED_QUADS(SELECT_SYMBOL_DEFAULT_AVX(features,BVH4QuantizedQuad4iSceneBuilderSAH));287288IF_ENABLED_TRIS(SELECT_SYMBOL_DEFAULT_AVX(features,BVH4Triangle4SceneBuilderFastSpatialSAH));289IF_ENABLED_TRIS(SELECT_SYMBOL_DEFAULT_AVX(features,BVH4Triangle4vSceneBuilderFastSpatialSAH));290IF_ENABLED_TRIS(SELECT_SYMBOL_DEFAULT_AVX(features,BVH4Triangle4iSceneBuilderFastSpatialSAH));291292IF_ENABLED_QUADS(SELECT_SYMBOL_DEFAULT_AVX(features,BVH4Quad4vSceneBuilderFastSpatialSAH));293294IF_ENABLED_USER(SELECT_SYMBOL_DEFAULT_AVX(features,BVH4VirtualSceneBuilderSAH));295IF_ENABLED_USER(SELECT_SYMBOL_DEFAULT_AVX(features,BVH4VirtualMBSceneBuilderSAH));296297IF_ENABLED_INSTANCE(SELECT_SYMBOL_DEFAULT_AVX(features,BVH4InstanceSceneBuilderSAH));298IF_ENABLED_INSTANCE(SELECT_SYMBOL_DEFAULT_AVX(features,BVH4InstanceMBSceneBuilderSAH));299300IF_ENABLED_INSTANCE_ARRAY(SELECT_SYMBOL_DEFAULT_AVX(features,BVH4InstanceArraySceneBuilderSAH));301IF_ENABLED_INSTANCE_ARRAY(SELECT_SYMBOL_DEFAULT_AVX(features,BVH4InstanceArrayMBSceneBuilderSAH));302303IF_ENABLED_GRIDS(SELECT_SYMBOL_DEFAULT_AVX(features,BVH4GridSceneBuilderSAH));304IF_ENABLED_GRIDS(SELECT_SYMBOL_DEFAULT_AVX(features,BVH4GridMBSceneBuilderSAH));305306IF_ENABLED_SUBDIV(SELECT_SYMBOL_DEFAULT_AVX(features,BVH4SubdivPatch1BuilderSAH));307IF_ENABLED_SUBDIV(SELECT_SYMBOL_DEFAULT_AVX(features,BVH4SubdivPatch1MBBuilderSAH));308}309310void BVH4Factory::selectIntersectors(int features)311{312IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_DEFAULT_AVX_AVX2_AVX512(features,VirtualCurveIntersector4i));313IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,VirtualCurveIntersector8i));314IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_DEFAULT_AVX_AVX2_AVX512(features,VirtualCurveIntersector4v));315IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,VirtualCurveIntersector8v));316IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_DEFAULT_AVX_AVX2_AVX512(features,VirtualCurveIntersector4iMB));317IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,VirtualCurveIntersector8iMB));318319/* select intersectors1 */320IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_DEFAULT_AVX_AVX2_AVX512(features,BVH4OBBVirtualCurveIntersector1));321IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_DEFAULT_AVX_AVX2_AVX512(features,BVH4OBBVirtualCurveIntersector1MB));322IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_DEFAULT_AVX_AVX2_AVX512(features,BVH4OBBVirtualCurveIntersectorRobust1));323IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_DEFAULT_AVX_AVX2_AVX512(features,BVH4OBBVirtualCurveIntersectorRobust1MB));324325IF_ENABLED_TRIS(SELECT_SYMBOL_DEFAULT_AVX_AVX2_AVX512(features,BVH4Triangle4Intersector1Moeller));326IF_ENABLED_TRIS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX512(features,BVH4Triangle4iIntersector1Moeller));327IF_ENABLED_TRIS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX512(features,BVH4Triangle4vIntersector1Pluecker));328IF_ENABLED_TRIS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX512(features,BVH4Triangle4iIntersector1Pluecker));329330IF_ENABLED_TRIS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4Triangle4vMBIntersector1Moeller));331IF_ENABLED_TRIS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4Triangle4iMBIntersector1Moeller));332IF_ENABLED_TRIS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4Triangle4vMBIntersector1Pluecker));333IF_ENABLED_TRIS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4Triangle4iMBIntersector1Pluecker));334335IF_ENABLED_QUADS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4Quad4vIntersector1Moeller));336IF_ENABLED_QUADS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4Quad4iIntersector1Moeller));337IF_ENABLED_QUADS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4Quad4vIntersector1Pluecker));338IF_ENABLED_QUADS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4Quad4iIntersector1Pluecker));339340IF_ENABLED_QUADS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4Quad4iMBIntersector1Pluecker));341IF_ENABLED_QUADS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4Quad4iMBIntersector1Moeller));342343IF_ENABLED_TRIS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX512(features,QBVH4Triangle4iIntersector1Pluecker));344IF_ENABLED_QUADS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX512(features,QBVH4Quad4iIntersector1Pluecker));345346IF_ENABLED_SUBDIV(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4SubdivPatch1Intersector1));347IF_ENABLED_SUBDIV(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4SubdivPatch1MBIntersector1));348349IF_ENABLED_USER(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4VirtualIntersector1));350IF_ENABLED_USER(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4VirtualMBIntersector1));351352IF_ENABLED_INSTANCE(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4InstanceIntersector1));353IF_ENABLED_INSTANCE(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4InstanceMBIntersector1));354355IF_ENABLED_INSTANCE_ARRAY(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4InstanceArrayIntersector1));356IF_ENABLED_INSTANCE_ARRAY(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4InstanceArrayMBIntersector1));357358IF_ENABLED_GRIDS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4GridIntersector1Moeller));359IF_ENABLED_GRIDS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4GridMBIntersector1Moeller))360IF_ENABLED_GRIDS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4GridIntersector1Pluecker));361362#if defined (EMBREE_RAY_PACKETS)363364/* select intersectors4 */365IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_DEFAULT_AVX_AVX2_AVX512(features,BVH4OBBVirtualCurveIntersector4Hybrid));366IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_DEFAULT_AVX_AVX2_AVX512(features,BVH4OBBVirtualCurveIntersector4HybridMB));367IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_DEFAULT_AVX_AVX2_AVX512(features,BVH4OBBVirtualCurveIntersectorRobust4Hybrid));368IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_DEFAULT_AVX_AVX2_AVX512(features,BVH4OBBVirtualCurveIntersectorRobust4HybridMB));369370IF_ENABLED_TRIS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4Triangle4Intersector4HybridMoeller));371IF_ENABLED_TRIS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4Triangle4Intersector4HybridMoellerNoFilter));372IF_ENABLED_TRIS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4Triangle4iIntersector4HybridMoeller));373IF_ENABLED_TRIS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4Triangle4vIntersector4HybridPluecker));374IF_ENABLED_TRIS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4Triangle4iIntersector4HybridPluecker));375376IF_ENABLED_TRIS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4Triangle4vMBIntersector4HybridMoeller));377IF_ENABLED_TRIS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4Triangle4iMBIntersector4HybridMoeller));378IF_ENABLED_TRIS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4Triangle4vMBIntersector4HybridPluecker));379IF_ENABLED_TRIS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4Triangle4iMBIntersector4HybridPluecker));380381IF_ENABLED_QUADS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4Quad4vIntersector4HybridMoeller));382IF_ENABLED_QUADS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4Quad4vIntersector4HybridMoellerNoFilter));383IF_ENABLED_QUADS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4Quad4iIntersector4HybridMoeller));384IF_ENABLED_QUADS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4Quad4vIntersector4HybridPluecker));385IF_ENABLED_QUADS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4Quad4iIntersector4HybridPluecker));386387IF_ENABLED_QUADS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4Quad4iMBIntersector4HybridMoeller));388IF_ENABLED_QUADS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4Quad4iMBIntersector4HybridPluecker));389390IF_ENABLED_SUBDIV(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4SubdivPatch1Intersector4));391IF_ENABLED_SUBDIV(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4SubdivPatch1MBIntersector4));392393IF_ENABLED_USER(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4VirtualIntersector4Chunk));394IF_ENABLED_USER(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4VirtualMBIntersector4Chunk));395396IF_ENABLED_INSTANCE(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4InstanceIntersector4Chunk));397IF_ENABLED_INSTANCE(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4InstanceMBIntersector4Chunk));398399IF_ENABLED_INSTANCE_ARRAY(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4InstanceArrayIntersector4Chunk));400IF_ENABLED_INSTANCE_ARRAY(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4InstanceArrayMBIntersector4Chunk));401402IF_ENABLED_QUADS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4Quad4vIntersector4HybridMoeller));403404IF_ENABLED_GRIDS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4GridIntersector4HybridMoeller));405IF_ENABLED_GRIDS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4GridMBIntersector4HybridMoeller));406IF_ENABLED_GRIDS(SELECT_SYMBOL_DEFAULT_SSE42_AVX_AVX2_AVX512(features,BVH4GridIntersector4HybridPluecker));407408/* select intersectors8 */409IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH4OBBVirtualCurveIntersector8Hybrid));410IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH4OBBVirtualCurveIntersector8HybridMB));411IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH4OBBVirtualCurveIntersectorRobust8Hybrid));412IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH4OBBVirtualCurveIntersectorRobust8HybridMB));413414IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH4Triangle4Intersector8HybridMoeller));415IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH4Triangle4Intersector8HybridMoellerNoFilter));416IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH4Triangle4iIntersector8HybridMoeller));417IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH4Triangle4vIntersector8HybridPluecker));418IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH4Triangle4iIntersector8HybridPluecker));419420IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH4Triangle4vMBIntersector8HybridMoeller));421IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH4Triangle4iMBIntersector8HybridMoeller));422IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH4Triangle4vMBIntersector8HybridPluecker));423IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH4Triangle4iMBIntersector8HybridPluecker));424425IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH4Quad4vIntersector8HybridMoeller));426IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH4Quad4vIntersector8HybridMoellerNoFilter));427IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH4Quad4iIntersector8HybridMoeller));428IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH4Quad4vIntersector8HybridPluecker));429IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH4Quad4iIntersector8HybridPluecker));430431IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH4Quad4iMBIntersector8HybridMoeller));432IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH4Quad4iMBIntersector8HybridPluecker));433434IF_ENABLED_SUBDIV(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH4SubdivPatch1Intersector8));435IF_ENABLED_SUBDIV(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH4SubdivPatch1MBIntersector8));436437IF_ENABLED_USER(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH4VirtualIntersector8Chunk));438IF_ENABLED_USER(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH4VirtualMBIntersector8Chunk));439440IF_ENABLED_INSTANCE(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH4InstanceIntersector8Chunk));441IF_ENABLED_INSTANCE(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH4InstanceMBIntersector8Chunk));442443IF_ENABLED_INSTANCE_ARRAY(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH4InstanceArrayIntersector8Chunk));444IF_ENABLED_INSTANCE_ARRAY(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH4InstanceArrayMBIntersector8Chunk));445446IF_ENABLED_GRIDS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH4GridIntersector8HybridMoeller));447IF_ENABLED_GRIDS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH4GridMBIntersector8HybridMoeller));448IF_ENABLED_GRIDS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH4GridIntersector8HybridPluecker));449450/* select intersectors16 */451IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX512(features,BVH4OBBVirtualCurveIntersector16Hybrid));452IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX512(features,BVH4OBBVirtualCurveIntersector16HybridMB));453IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX512(features,BVH4OBBVirtualCurveIntersectorRobust16Hybrid));454IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX512(features,BVH4OBBVirtualCurveIntersectorRobust16HybridMB));455456IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX512(features,BVH4Triangle4Intersector16HybridMoeller));457IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX512(features,BVH4Triangle4Intersector16HybridMoellerNoFilter));458IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX512(features,BVH4Triangle4iIntersector16HybridMoeller));459IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX512(features,BVH4Triangle4vIntersector16HybridPluecker));460IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX512(features,BVH4Triangle4iIntersector16HybridPluecker));461462IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX512(features,BVH4Triangle4vMBIntersector16HybridMoeller));463IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX512(features,BVH4Triangle4iMBIntersector16HybridMoeller));464IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX512(features,BVH4Triangle4vMBIntersector16HybridPluecker));465IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX512(features,BVH4Triangle4iMBIntersector16HybridPluecker));466467IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX512(features,BVH4Quad4vIntersector16HybridMoeller));468IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX512(features,BVH4Quad4vIntersector16HybridMoellerNoFilter));469IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX512(features,BVH4Quad4iIntersector16HybridMoeller));470IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX512(features,BVH4Quad4vIntersector16HybridPluecker));471IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX512(features,BVH4Quad4iIntersector16HybridPluecker));472473IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX512(features,BVH4Quad4iMBIntersector16HybridMoeller));474IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX512(features,BVH4Quad4iMBIntersector16HybridPluecker));475476IF_ENABLED_SUBDIV(SELECT_SYMBOL_INIT_AVX512(features,BVH4SubdivPatch1Intersector16));477IF_ENABLED_SUBDIV(SELECT_SYMBOL_INIT_AVX512(features,BVH4SubdivPatch1MBIntersector16));478479IF_ENABLED_USER(SELECT_SYMBOL_INIT_AVX512(features,BVH4VirtualIntersector16Chunk));480IF_ENABLED_USER(SELECT_SYMBOL_INIT_AVX512(features,BVH4VirtualMBIntersector16Chunk));481482IF_ENABLED_INSTANCE(SELECT_SYMBOL_INIT_AVX512(features,BVH4InstanceIntersector16Chunk));483IF_ENABLED_INSTANCE(SELECT_SYMBOL_INIT_AVX512(features,BVH4InstanceMBIntersector16Chunk));484485IF_ENABLED_INSTANCE_ARRAY(SELECT_SYMBOL_INIT_AVX512(features,BVH4InstanceArrayIntersector16Chunk));486IF_ENABLED_INSTANCE_ARRAY(SELECT_SYMBOL_INIT_AVX512(features,BVH4InstanceArrayMBIntersector16Chunk));487488IF_ENABLED_GRIDS(SELECT_SYMBOL_INIT_AVX512(features,BVH4GridIntersector16HybridMoeller));489IF_ENABLED_GRIDS(SELECT_SYMBOL_INIT_AVX512(features,BVH4GridMBIntersector16HybridMoeller));490IF_ENABLED_GRIDS(SELECT_SYMBOL_INIT_AVX512(features,BVH4GridIntersector16HybridPluecker));491492#endif493}494495Accel::Intersectors BVH4Factory::BVH4OBBVirtualCurveIntersectors(BVH4* bvh, VirtualCurveIntersector* leafIntersector, IntersectVariant ivariant)496{497switch (ivariant) {498case IntersectVariant::FAST:499{500Accel::Intersectors intersectors;501intersectors.ptr = bvh;502intersectors.leafIntersector = leafIntersector;503intersectors.intersector1 = BVH4OBBVirtualCurveIntersector1();504#if defined (EMBREE_RAY_PACKETS)505intersectors.intersector4 = BVH4OBBVirtualCurveIntersector4Hybrid();506intersectors.intersector8 = BVH4OBBVirtualCurveIntersector8Hybrid();507intersectors.intersector16 = BVH4OBBVirtualCurveIntersector16Hybrid();508#endif509return intersectors;510}511case IntersectVariant::ROBUST:512{513Accel::Intersectors intersectors;514intersectors.ptr = bvh;515intersectors.leafIntersector = leafIntersector;516intersectors.intersector1 = BVH4OBBVirtualCurveIntersectorRobust1();517#if defined (EMBREE_RAY_PACKETS)518intersectors.intersector4 = BVH4OBBVirtualCurveIntersectorRobust4Hybrid();519intersectors.intersector8 = BVH4OBBVirtualCurveIntersectorRobust8Hybrid();520intersectors.intersector16 = BVH4OBBVirtualCurveIntersectorRobust16Hybrid();521#endif522return intersectors;523}524default: assert(false);525}526return Accel::Intersectors();527}528529Accel::Intersectors BVH4Factory::BVH4OBBVirtualCurveIntersectorsMB(BVH4* bvh, VirtualCurveIntersector* leafIntersector, IntersectVariant ivariant)530{531switch (ivariant) {532case IntersectVariant::FAST:533{534Accel::Intersectors intersectors;535intersectors.ptr = bvh;536intersectors.leafIntersector = leafIntersector;537intersectors.intersector1 = BVH4OBBVirtualCurveIntersector1MB();538#if defined (EMBREE_RAY_PACKETS)539intersectors.intersector4 = BVH4OBBVirtualCurveIntersector4HybridMB();540intersectors.intersector8 = BVH4OBBVirtualCurveIntersector8HybridMB();541intersectors.intersector16 = BVH4OBBVirtualCurveIntersector16HybridMB();542#endif543return intersectors;544}545case IntersectVariant::ROBUST:546{547Accel::Intersectors intersectors;548intersectors.ptr = bvh;549intersectors.leafIntersector = leafIntersector;550intersectors.intersector1 = BVH4OBBVirtualCurveIntersectorRobust1MB();551#if defined (EMBREE_RAY_PACKETS)552intersectors.intersector4 = BVH4OBBVirtualCurveIntersectorRobust4HybridMB();553intersectors.intersector8 = BVH4OBBVirtualCurveIntersectorRobust8HybridMB();554intersectors.intersector16 = BVH4OBBVirtualCurveIntersectorRobust16HybridMB();555#endif556return intersectors;557}558default: assert(false);559}560return Accel::Intersectors();561}562563Accel::Intersectors BVH4Factory::BVH4Triangle4Intersectors(BVH4* bvh, IntersectVariant ivariant)564{565assert(ivariant == IntersectVariant::FAST);566Accel::Intersectors intersectors;567intersectors.ptr = bvh;568intersectors.intersector1 = BVH4Triangle4Intersector1Moeller();569#if defined (EMBREE_RAY_PACKETS)570intersectors.intersector4_filter = BVH4Triangle4Intersector4HybridMoeller();571intersectors.intersector4_nofilter = BVH4Triangle4Intersector4HybridMoellerNoFilter();572intersectors.intersector8_filter = BVH4Triangle4Intersector8HybridMoeller();573intersectors.intersector8_nofilter = BVH4Triangle4Intersector8HybridMoellerNoFilter();574intersectors.intersector16_filter = BVH4Triangle4Intersector16HybridMoeller();575intersectors.intersector16_nofilter = BVH4Triangle4Intersector16HybridMoellerNoFilter();576#endif577return intersectors;578}579580Accel::Intersectors BVH4Factory::BVH4Triangle4vIntersectors(BVH4* bvh, IntersectVariant ivariant)581{582assert(ivariant == IntersectVariant::ROBUST);583Accel::Intersectors intersectors;584intersectors.ptr = bvh;585intersectors.intersector1 = BVH4Triangle4vIntersector1Pluecker();586#if defined (EMBREE_RAY_PACKETS)587intersectors.intersector4 = BVH4Triangle4vIntersector4HybridPluecker();588intersectors.intersector8 = BVH4Triangle4vIntersector8HybridPluecker();589intersectors.intersector16 = BVH4Triangle4vIntersector16HybridPluecker();590#endif591return intersectors;592}593594Accel::Intersectors BVH4Factory::BVH4Triangle4iIntersectors(BVH4* bvh, IntersectVariant ivariant)595{596switch (ivariant) {597case IntersectVariant::FAST:598{599Accel::Intersectors intersectors;600intersectors.ptr = bvh;601intersectors.intersector1 = BVH4Triangle4iIntersector1Moeller();602#if defined (EMBREE_RAY_PACKETS)603intersectors.intersector4 = BVH4Triangle4iIntersector4HybridMoeller();604intersectors.intersector8 = BVH4Triangle4iIntersector8HybridMoeller();605intersectors.intersector16 = BVH4Triangle4iIntersector16HybridMoeller();606#endif607return intersectors;608}609case IntersectVariant::ROBUST:610{611Accel::Intersectors intersectors;612intersectors.ptr = bvh;613intersectors.intersector1 = BVH4Triangle4iIntersector1Pluecker();614#if defined (EMBREE_RAY_PACKETS)615intersectors.intersector4 = BVH4Triangle4iIntersector4HybridPluecker();616intersectors.intersector8 = BVH4Triangle4iIntersector8HybridPluecker();617intersectors.intersector16 = BVH4Triangle4iIntersector16HybridPluecker();618#endif619return intersectors;620}621}622return Accel::Intersectors();623}624625Accel::Intersectors BVH4Factory::BVH4Triangle4vMBIntersectors(BVH4* bvh, IntersectVariant ivariant)626{627switch (ivariant) {628case IntersectVariant::FAST:629{630Accel::Intersectors intersectors;631intersectors.ptr = bvh;632intersectors.intersector1 = BVH4Triangle4vMBIntersector1Moeller();633#if defined (EMBREE_RAY_PACKETS)634intersectors.intersector4 = BVH4Triangle4vMBIntersector4HybridMoeller();635intersectors.intersector8 = BVH4Triangle4vMBIntersector8HybridMoeller();636intersectors.intersector16 = BVH4Triangle4vMBIntersector16HybridMoeller();637#endif638return intersectors;639}640case IntersectVariant::ROBUST:641{642Accel::Intersectors intersectors;643intersectors.ptr = bvh;644intersectors.intersector1 = BVH4Triangle4vMBIntersector1Pluecker();645#if defined (EMBREE_RAY_PACKETS)646intersectors.intersector4 = BVH4Triangle4vMBIntersector4HybridPluecker();647intersectors.intersector8 = BVH4Triangle4vMBIntersector8HybridPluecker();648intersectors.intersector16 = BVH4Triangle4vMBIntersector16HybridPluecker();649#endif650return intersectors;651}652}653return Accel::Intersectors();654}655656Accel::Intersectors BVH4Factory::BVH4Triangle4iMBIntersectors(BVH4* bvh, IntersectVariant ivariant)657{658switch (ivariant) {659case IntersectVariant::FAST:660{661Accel::Intersectors intersectors;662intersectors.ptr = bvh;663intersectors.intersector1 = BVH4Triangle4iMBIntersector1Moeller();664#if defined (EMBREE_RAY_PACKETS)665intersectors.intersector4 = BVH4Triangle4iMBIntersector4HybridMoeller();666intersectors.intersector8 = BVH4Triangle4iMBIntersector8HybridMoeller();667intersectors.intersector16 = BVH4Triangle4iMBIntersector16HybridMoeller();668#endif669return intersectors;670}671case IntersectVariant::ROBUST:672{673Accel::Intersectors intersectors;674intersectors.ptr = bvh;675intersectors.intersector1 = BVH4Triangle4iMBIntersector1Pluecker();676#if defined (EMBREE_RAY_PACKETS)677intersectors.intersector4 = BVH4Triangle4iMBIntersector4HybridPluecker();678intersectors.intersector8 = BVH4Triangle4iMBIntersector8HybridPluecker();679intersectors.intersector16 = BVH4Triangle4iMBIntersector16HybridPluecker();680#endif681return intersectors;682}683}684return Accel::Intersectors();685}686687Accel::Intersectors BVH4Factory::BVH4Quad4vIntersectors(BVH4* bvh, IntersectVariant ivariant)688{689switch (ivariant) {690case IntersectVariant::FAST:691{692Accel::Intersectors intersectors;693intersectors.ptr = bvh;694intersectors.intersector1 = BVH4Quad4vIntersector1Moeller();695#if defined (EMBREE_RAY_PACKETS)696intersectors.intersector4_filter = BVH4Quad4vIntersector4HybridMoeller();697intersectors.intersector4_nofilter = BVH4Quad4vIntersector4HybridMoellerNoFilter();698intersectors.intersector8_filter = BVH4Quad4vIntersector8HybridMoeller();699intersectors.intersector8_nofilter = BVH4Quad4vIntersector8HybridMoellerNoFilter();700intersectors.intersector16_filter = BVH4Quad4vIntersector16HybridMoeller();701intersectors.intersector16_nofilter = BVH4Quad4vIntersector16HybridMoellerNoFilter();702#endif703return intersectors;704}705case IntersectVariant::ROBUST:706{707Accel::Intersectors intersectors;708intersectors.ptr = bvh;709intersectors.intersector1 = BVH4Quad4vIntersector1Pluecker();710#if defined (EMBREE_RAY_PACKETS)711intersectors.intersector4 = BVH4Quad4vIntersector4HybridPluecker();712intersectors.intersector8 = BVH4Quad4vIntersector8HybridPluecker();713intersectors.intersector16 = BVH4Quad4vIntersector16HybridPluecker();714#endif715return intersectors;716}717}718return Accel::Intersectors();719}720721Accel::Intersectors BVH4Factory::BVH4Quad4iIntersectors(BVH4* bvh, IntersectVariant ivariant)722{723switch (ivariant) {724case IntersectVariant::FAST:725{726Accel::Intersectors intersectors;727intersectors.ptr = bvh;728intersectors.intersector1 = BVH4Quad4iIntersector1Moeller();729#if defined (EMBREE_RAY_PACKETS)730intersectors.intersector4 = BVH4Quad4iIntersector4HybridMoeller();731intersectors.intersector8 = BVH4Quad4iIntersector8HybridMoeller();732intersectors.intersector16= BVH4Quad4iIntersector16HybridMoeller();733#endif734return intersectors;735}736case IntersectVariant::ROBUST:737{738Accel::Intersectors intersectors;739intersectors.ptr = bvh;740intersectors.intersector1 = BVH4Quad4iIntersector1Pluecker();741#if defined (EMBREE_RAY_PACKETS)742intersectors.intersector4 = BVH4Quad4iIntersector4HybridPluecker();743intersectors.intersector8 = BVH4Quad4iIntersector8HybridPluecker();744intersectors.intersector16= BVH4Quad4iIntersector16HybridPluecker();745#endif746return intersectors;747}748}749return Accel::Intersectors();750}751752Accel::Intersectors BVH4Factory::BVH4Quad4iMBIntersectors(BVH4* bvh, IntersectVariant ivariant)753{754switch (ivariant) {755case IntersectVariant::FAST:756{757Accel::Intersectors intersectors;758intersectors.ptr = bvh;759intersectors.intersector1 = BVH4Quad4iMBIntersector1Moeller();760#if defined (EMBREE_RAY_PACKETS)761intersectors.intersector4 = BVH4Quad4iMBIntersector4HybridMoeller();762intersectors.intersector8 = BVH4Quad4iMBIntersector8HybridMoeller();763intersectors.intersector16= BVH4Quad4iMBIntersector16HybridMoeller();764#endif765return intersectors;766}767case IntersectVariant::ROBUST:768{769Accel::Intersectors intersectors;770intersectors.ptr = bvh;771intersectors.intersector1 = BVH4Quad4iMBIntersector1Pluecker();772#if defined (EMBREE_RAY_PACKETS)773intersectors.intersector4 = BVH4Quad4iMBIntersector4HybridPluecker();774intersectors.intersector8 = BVH4Quad4iMBIntersector8HybridPluecker();775intersectors.intersector16= BVH4Quad4iMBIntersector16HybridPluecker();776#endif777return intersectors;778}779}780return Accel::Intersectors();781}782783Accel::Intersectors BVH4Factory::QBVH4Triangle4iIntersectors(BVH4* bvh)784{785Accel::Intersectors intersectors;786intersectors.ptr = bvh;787intersectors.intersector1 = QBVH4Triangle4iIntersector1Pluecker();788return intersectors;789}790791Accel::Intersectors BVH4Factory::QBVH4Quad4iIntersectors(BVH4* bvh)792{793Accel::Intersectors intersectors;794intersectors.ptr = bvh;795intersectors.intersector1 = QBVH4Quad4iIntersector1Pluecker();796return intersectors;797}798799Accel::Intersectors BVH4Factory::BVH4UserGeometryIntersectors(BVH4* bvh)800{801Accel::Intersectors intersectors;802intersectors.ptr = bvh;803intersectors.intersector1 = BVH4VirtualIntersector1();804#if defined (EMBREE_RAY_PACKETS)805intersectors.intersector4 = BVH4VirtualIntersector4Chunk();806intersectors.intersector8 = BVH4VirtualIntersector8Chunk();807intersectors.intersector16 = BVH4VirtualIntersector16Chunk();808#endif809intersectors.collider = BVH4ColliderUserGeom();810return intersectors;811}812813Accel::Intersectors BVH4Factory::BVH4UserGeometryMBIntersectors(BVH4* bvh)814{815Accel::Intersectors intersectors;816intersectors.ptr = bvh;817intersectors.intersector1 = BVH4VirtualMBIntersector1();818#if defined (EMBREE_RAY_PACKETS)819intersectors.intersector4 = BVH4VirtualMBIntersector4Chunk();820intersectors.intersector8 = BVH4VirtualMBIntersector8Chunk();821intersectors.intersector16 = BVH4VirtualMBIntersector16Chunk();822#endif823return intersectors;824}825826Accel::Intersectors BVH4Factory::BVH4InstanceIntersectors(BVH4* bvh)827{828Accel::Intersectors intersectors;829intersectors.ptr = bvh;830intersectors.intersector1 = BVH4InstanceIntersector1();831#if defined (EMBREE_RAY_PACKETS)832intersectors.intersector4 = BVH4InstanceIntersector4Chunk();833intersectors.intersector8 = BVH4InstanceIntersector8Chunk();834intersectors.intersector16 = BVH4InstanceIntersector16Chunk();835#endif836return intersectors;837}838839Accel::Intersectors BVH4Factory::BVH4InstanceMBIntersectors(BVH4* bvh)840{841Accel::Intersectors intersectors;842intersectors.ptr = bvh;843intersectors.intersector1 = BVH4InstanceMBIntersector1();844#if defined (EMBREE_RAY_PACKETS)845intersectors.intersector4 = BVH4InstanceMBIntersector4Chunk();846intersectors.intersector8 = BVH4InstanceMBIntersector8Chunk();847intersectors.intersector16 = BVH4InstanceMBIntersector16Chunk();848#endif849return intersectors;850}851852Accel::Intersectors BVH4Factory::BVH4InstanceArrayIntersectors(BVH4* bvh)853{854Accel::Intersectors intersectors;855intersectors.ptr = bvh;856intersectors.intersector1 = BVH4InstanceArrayIntersector1();857#if defined (EMBREE_RAY_PACKETS)858intersectors.intersector4 = BVH4InstanceArrayIntersector4Chunk();859intersectors.intersector8 = BVH4InstanceArrayIntersector8Chunk();860intersectors.intersector16 = BVH4InstanceArrayIntersector16Chunk();861#endif862return intersectors;863}864865Accel::Intersectors BVH4Factory::BVH4InstanceArrayMBIntersectors(BVH4* bvh)866{867Accel::Intersectors intersectors;868intersectors.ptr = bvh;869intersectors.intersector1 = BVH4InstanceArrayMBIntersector1();870#if defined (EMBREE_RAY_PACKETS)871intersectors.intersector4 = BVH4InstanceArrayMBIntersector4Chunk();872intersectors.intersector8 = BVH4InstanceArrayMBIntersector8Chunk();873intersectors.intersector16 = BVH4InstanceArrayMBIntersector16Chunk();874#endif875return intersectors;876}877878Accel::Intersectors BVH4Factory::BVH4SubdivPatch1Intersectors(BVH4* bvh)879{880Accel::Intersectors intersectors;881intersectors.ptr = bvh;882intersectors.intersector1 = BVH4SubdivPatch1Intersector1();883#if defined (EMBREE_RAY_PACKETS)884intersectors.intersector4 = BVH4SubdivPatch1Intersector4();885intersectors.intersector8 = BVH4SubdivPatch1Intersector8();886intersectors.intersector16 = BVH4SubdivPatch1Intersector16();887#endif888return intersectors;889}890891Accel::Intersectors BVH4Factory::BVH4SubdivPatch1MBIntersectors(BVH4* bvh)892{893Accel::Intersectors intersectors;894intersectors.ptr = bvh;895intersectors.intersector1 = BVH4SubdivPatch1MBIntersector1();896#if defined (EMBREE_RAY_PACKETS)897intersectors.intersector4 = BVH4SubdivPatch1MBIntersector4();898intersectors.intersector8 = BVH4SubdivPatch1MBIntersector8();899intersectors.intersector16 = BVH4SubdivPatch1MBIntersector16();900#endif901return intersectors;902}903904Accel* BVH4Factory::BVH4OBBVirtualCurve4i(Scene* scene, IntersectVariant ivariant)905{906BVH4* accel = new BVH4(Curve4i::type,scene);907Accel::Intersectors intersectors = BVH4OBBVirtualCurveIntersectors(accel,VirtualCurveIntersector4i(),ivariant);908909Builder* builder = nullptr;910if (scene->device->hair_builder == "default" ) builder = BVH4Curve4iBuilder_OBB_New(accel,scene,0);911else if (scene->device->hair_builder == "sah" ) builder = BVH4Curve4iBuilder_OBB_New(accel,scene,0);912else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder "+scene->device->hair_builder+" for BVH4OBB<VirtualCurve4i>");913914return new AccelInstance(accel,builder,intersectors);915}916917#if defined(EMBREE_TARGET_SIMD8)918Accel* BVH4Factory::BVH4OBBVirtualCurve8i(Scene* scene, IntersectVariant ivariant)919{920BVH4* accel = new BVH4(Curve8i::type,scene);921Accel::Intersectors intersectors = BVH4OBBVirtualCurveIntersectors(accel,VirtualCurveIntersector8i(),ivariant);922923Builder* builder = nullptr;924if (scene->device->hair_builder == "default" ) builder = BVH4Curve8iBuilder_OBB_New(accel,scene,0);925else if (scene->device->hair_builder == "sah" ) builder = BVH4Curve8iBuilder_OBB_New(accel,scene,0);926else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder "+scene->device->hair_builder+" for BVH4OBB<VirtualCurve8i>");927928return new AccelInstance(accel,builder,intersectors);929}930#endif931932Accel* BVH4Factory::BVH4OBBVirtualCurve4v(Scene* scene, IntersectVariant ivariant)933{934BVH4* accel = new BVH4(Curve4v::type,scene);935Accel::Intersectors intersectors = BVH4OBBVirtualCurveIntersectors(accel,VirtualCurveIntersector4v(),ivariant);936937Builder* builder = nullptr;938if (scene->device->hair_builder == "default" ) builder = BVH4Curve4vBuilder_OBB_New(accel,scene,0);939else if (scene->device->hair_builder == "sah" ) builder = BVH4Curve4vBuilder_OBB_New(accel,scene,0);940else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder "+scene->device->hair_builder+" for BVH4OBB<VirtualCurve4v>");941942return new AccelInstance(accel,builder,intersectors);943}944945Accel* BVH4Factory::BVH4OBBVirtualCurve4iMB(Scene* scene, IntersectVariant ivariant)946{947BVH4* accel = new BVH4(Curve4iMB::type,scene);948Accel::Intersectors intersectors = BVH4OBBVirtualCurveIntersectorsMB(accel,VirtualCurveIntersector4iMB(),ivariant);949950Builder* builder = nullptr;951if (scene->device->hair_builder == "default" ) builder = BVH4OBBCurve4iMBBuilder_OBB(accel,scene,0);952else if (scene->device->hair_builder == "sah" ) builder = BVH4OBBCurve4iMBBuilder_OBB(accel,scene,0);953else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder "+scene->device->hair_builder+" for BVH4OBB<VirtualCurve4iMB>");954955return new AccelInstance(accel,builder,intersectors);956}957958#if defined(EMBREE_TARGET_SIMD8)959Accel* BVH4Factory::BVH4OBBVirtualCurve8iMB(Scene* scene, IntersectVariant ivariant)960{961BVH4* accel = new BVH4(Curve8iMB::type,scene);962Accel::Intersectors intersectors = BVH4OBBVirtualCurveIntersectorsMB(accel,VirtualCurveIntersector8iMB(), ivariant);963964Builder* builder = nullptr;965if (scene->device->hair_builder == "default" ) builder = BVH4OBBCurve8iMBBuilder_OBB(accel,scene,0);966else if (scene->device->hair_builder == "sah" ) builder = BVH4OBBCurve8iMBBuilder_OBB(accel,scene,0);967else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder "+scene->device->hair_builder+" for BVH4OBB<VirtualCurve8iMB>");968969return new AccelInstance(accel,builder,intersectors);970}971#endif972973Accel* BVH4Factory::BVH4Triangle4(Scene* scene, BuildVariant bvariant, IntersectVariant ivariant)974{975BVH4* accel = new BVH4(Triangle4::type,scene);976977Accel::Intersectors intersectors;978if (scene->device->tri_traverser == "default") intersectors = BVH4Triangle4Intersectors(accel,ivariant);979else if (scene->device->tri_traverser == "fast" ) intersectors = BVH4Triangle4Intersectors(accel,IntersectVariant::FAST);980else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown traverser "+scene->device->tri_traverser+" for BVH4<Triangle4>");981982Builder* builder = nullptr;983if (scene->device->tri_builder == "default") {984switch (bvariant) {985case BuildVariant::STATIC : builder = BVH4Triangle4SceneBuilderSAH(accel,scene,0); break;986case BuildVariant::DYNAMIC : builder = BVH4BuilderTwoLevelTriangle4MeshSAH(accel,scene,false); break;987case BuildVariant::HIGH_QUALITY: builder = BVH4Triangle4SceneBuilderFastSpatialSAH(accel,scene,0); break;988}989}990else if (scene->device->tri_builder == "sah" ) builder = BVH4Triangle4SceneBuilderSAH(accel,scene,0);991else if (scene->device->tri_builder == "sah_fast_spatial" ) builder = BVH4Triangle4SceneBuilderFastSpatialSAH(accel,scene,0);992else if (scene->device->tri_builder == "sah_presplit") builder = BVH4Triangle4SceneBuilderSAH(accel,scene,MODE_HIGH_QUALITY);993else if (scene->device->tri_builder == "dynamic" ) builder = BVH4BuilderTwoLevelTriangle4MeshSAH(accel,scene,false);994else if (scene->device->tri_builder == "morton" ) builder = BVH4BuilderTwoLevelTriangle4MeshSAH(accel,scene,true);995else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder "+scene->device->tri_builder+" for BVH4<Triangle4>");996997return new AccelInstance(accel,builder,intersectors);998}9991000Accel* BVH4Factory::BVH4Triangle4v(Scene* scene, BuildVariant bvariant, IntersectVariant ivariant)1001{1002BVH4* accel = new BVH4(Triangle4v::type,scene);10031004Accel::Intersectors intersectors;1005if (scene->device->tri_traverser == "default") intersectors = BVH4Triangle4vIntersectors(accel,ivariant);1006else if (scene->device->tri_traverser == "fast" ) intersectors = BVH4Triangle4vIntersectors(accel,IntersectVariant::FAST);1007else if (scene->device->tri_traverser == "robust" ) intersectors = BVH4Triangle4vIntersectors(accel,IntersectVariant::ROBUST);1008else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown traverser "+scene->device->tri_traverser+" for BVH4<Triangle4>");10091010Builder* builder = nullptr;1011if (scene->device->tri_builder == "default") {1012switch (bvariant) {1013case BuildVariant::STATIC : builder = BVH4Triangle4vSceneBuilderSAH(accel,scene,0); break;1014case BuildVariant::DYNAMIC : builder = BVH4BuilderTwoLevelTriangle4vMeshSAH(accel,scene,false); break;1015case BuildVariant::HIGH_QUALITY: builder = BVH4Triangle4vSceneBuilderFastSpatialSAH(accel,scene,0); break;1016}1017}1018else if (scene->device->tri_builder == "sah" ) builder = BVH4Triangle4vSceneBuilderSAH(accel,scene,0);1019else if (scene->device->tri_builder == "sah_fast_spatial" ) builder = BVH4Triangle4vSceneBuilderFastSpatialSAH(accel,scene,0);1020else if (scene->device->tri_builder == "sah_presplit") builder = BVH4Triangle4vSceneBuilderSAH(accel,scene,MODE_HIGH_QUALITY);1021else if (scene->device->tri_builder == "dynamic" ) builder = BVH4BuilderTwoLevelTriangle4vMeshSAH(accel,scene,false);1022else if (scene->device->tri_builder == "morton" ) builder = BVH4BuilderTwoLevelTriangle4vMeshSAH(accel,scene,true);1023else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder "+scene->device->tri_builder+" for BVH4<Triangle4v>");10241025return new AccelInstance(accel,builder,intersectors);1026}10271028Accel* BVH4Factory::BVH4Triangle4i(Scene* scene, BuildVariant bvariant, IntersectVariant ivariant)1029{1030BVH4* accel = new BVH4(Triangle4i::type,scene);10311032Accel::Intersectors intersectors;1033if (scene->device->tri_traverser == "default") intersectors = BVH4Triangle4iIntersectors(accel,ivariant);1034else if (scene->device->tri_traverser == "fast" ) intersectors = BVH4Triangle4iIntersectors(accel,IntersectVariant::FAST);1035else if (scene->device->tri_traverser == "robust" ) intersectors = BVH4Triangle4iIntersectors(accel,IntersectVariant::ROBUST);1036else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown traverser "+scene->device->tri_traverser+" for BVH4<Triangle4i>");10371038Builder* builder = nullptr;1039if (scene->device->tri_builder == "default" ) {1040switch (bvariant) {1041case BuildVariant::STATIC : builder = BVH4Triangle4iSceneBuilderSAH(accel,scene,0); break;1042case BuildVariant::DYNAMIC : builder = BVH4BuilderTwoLevelTriangle4iMeshSAH(accel,scene,false); break;1043case BuildVariant::HIGH_QUALITY: builder = BVH4Triangle4iSceneBuilderFastSpatialSAH(accel,scene,0); break;1044}1045}1046else if (scene->device->tri_builder == "sah" ) builder = BVH4Triangle4iSceneBuilderSAH(accel,scene,0);1047else if (scene->device->tri_builder == "sah_fast_spatial" ) builder = BVH4Triangle4iSceneBuilderFastSpatialSAH(accel,scene,0);1048else if (scene->device->tri_builder == "sah_presplit") builder = BVH4Triangle4iSceneBuilderSAH(accel,scene,MODE_HIGH_QUALITY);1049else if (scene->device->tri_builder == "dynamic" ) builder = BVH4BuilderTwoLevelTriangle4iMeshSAH(accel,scene,false);1050else if (scene->device->tri_builder == "morton" ) builder = BVH4BuilderTwoLevelTriangle4iMeshSAH(accel,scene,true);1051else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder "+scene->device->tri_builder+" for BVH4<Triangle4i>");10521053return new AccelInstance(accel,builder,intersectors);1054}10551056Accel* BVH4Factory::BVH4Triangle4iMB(Scene* scene, BuildVariant bvariant, IntersectVariant ivariant)1057{1058BVH4* accel = new BVH4(Triangle4i::type,scene);10591060Accel::Intersectors intersectors;1061if (scene->device->tri_traverser_mb == "default") intersectors = BVH4Triangle4iMBIntersectors(accel,ivariant);1062else if (scene->device->tri_traverser_mb == "fast" ) intersectors = BVH4Triangle4iMBIntersectors(accel,IntersectVariant::FAST);1063else if (scene->device->tri_traverser_mb == "robust" ) intersectors = BVH4Triangle4iMBIntersectors(accel,IntersectVariant::ROBUST);1064else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown traverser "+scene->device->tri_traverser_mb+" for BVH4<Triangle4iMB>");10651066Builder* builder = nullptr;1067if (scene->device->tri_builder_mb == "default") {1068switch (bvariant) {1069case BuildVariant::STATIC : builder = BVH4Triangle4iMBSceneBuilderSAH(accel,scene,0); break;1070case BuildVariant::DYNAMIC : assert(false); break; // FIXME: implement1071case BuildVariant::HIGH_QUALITY: assert(false); break;1072}1073}1074else if (scene->device->tri_builder_mb == "internal_time_splits") builder = BVH4Triangle4iMBSceneBuilderSAH(accel,scene,0);1075else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder "+scene->device->tri_builder_mb+" for BVH4<Triangle4iMB>");10761077return new AccelInstance(accel,builder,intersectors);1078}10791080Accel* BVH4Factory::BVH4Triangle4vMB(Scene* scene, BuildVariant bvariant, IntersectVariant ivariant)1081{1082BVH4* accel = new BVH4(Triangle4vMB::type,scene);10831084Accel::Intersectors intersectors;1085if (scene->device->tri_traverser_mb == "default") intersectors = BVH4Triangle4vMBIntersectors(accel,ivariant);1086else if (scene->device->tri_traverser_mb == "fast" ) intersectors = BVH4Triangle4vMBIntersectors(accel,IntersectVariant::FAST);1087else if (scene->device->tri_traverser_mb == "robust" ) intersectors = BVH4Triangle4vMBIntersectors(accel,IntersectVariant::ROBUST);1088else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown traverser "+scene->device->tri_traverser_mb+" for BVH4<Triangle4vMB>");10891090Builder* builder = nullptr;1091if (scene->device->tri_builder_mb == "default") {1092switch (bvariant) {1093case BuildVariant::STATIC : builder = BVH4Triangle4vMBSceneBuilderSAH(accel,scene,0); break;1094case BuildVariant::DYNAMIC : assert(false); break; // FIXME: implement1095case BuildVariant::HIGH_QUALITY: assert(false); break;1096}1097}1098else if (scene->device->tri_builder_mb == "internal_time_splits") builder = BVH4Triangle4vMBSceneBuilderSAH(accel,scene,0);1099else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder "+scene->device->tri_builder_mb+" for BVH4<Triangle4vMB>");11001101return new AccelInstance(accel,builder,intersectors);1102}11031104Accel* BVH4Factory::BVH4Quad4v(Scene* scene, BuildVariant bvariant, IntersectVariant ivariant)1105{1106BVH4* accel = new BVH4(Quad4v::type,scene);1107Accel::Intersectors intersectors = BVH4Quad4vIntersectors(accel,ivariant);11081109Builder* builder = nullptr;1110if (scene->device->quad_builder == "default") {1111switch (bvariant) {1112case BuildVariant::STATIC : builder = BVH4Quad4vSceneBuilderSAH(accel,scene,0); break;1113case BuildVariant::DYNAMIC : builder = BVH4BuilderTwoLevelQuadMeshSAH(accel,scene,false); break;1114case BuildVariant::HIGH_QUALITY: builder = BVH4Quad4vSceneBuilderFastSpatialSAH(accel,scene,0); break;1115}1116}1117else if (scene->device->quad_builder == "sah" ) builder = BVH4Quad4vSceneBuilderSAH(accel,scene,0);1118else if (scene->device->quad_builder == "sah_fast_spatial" ) builder = BVH4Quad4vSceneBuilderFastSpatialSAH(accel,scene,0);1119else if (scene->device->quad_builder == "dynamic" ) builder = BVH4BuilderTwoLevelQuadMeshSAH(accel,scene,false);1120else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder "+scene->device->quad_builder+" for BVH4<Quad4v>");11211122return new AccelInstance(accel,builder,intersectors);1123}11241125Accel* BVH4Factory::BVH4Quad4i(Scene* scene, BuildVariant bvariant, IntersectVariant ivariant)1126{1127BVH4* accel = new BVH4(Quad4i::type,scene);1128Accel::Intersectors intersectors = BVH4Quad4iIntersectors(accel,ivariant);11291130Builder* builder = nullptr;1131if (scene->device->quad_builder == "default") {1132switch (bvariant) {1133case BuildVariant::STATIC : builder = BVH4Quad4iSceneBuilderSAH(accel,scene,0); break;1134case BuildVariant::DYNAMIC : assert(false); break; // FIXME: implement1135case BuildVariant::HIGH_QUALITY: assert(false); break; // FIXME: implement1136}1137}1138else if (scene->device->quad_builder == "sah") builder = BVH4Quad4iSceneBuilderSAH(accel,scene,0);1139else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder "+scene->device->quad_builder+" for BVH4<Quad4i>");11401141return new AccelInstance(accel,builder,intersectors);1142}11431144Accel* BVH4Factory::BVH4Quad4iMB(Scene* scene, BuildVariant bvariant, IntersectVariant ivariant)1145{1146BVH4* accel = new BVH4(Quad4i::type,scene);1147Accel::Intersectors intersectors = BVH4Quad4iMBIntersectors(accel,ivariant);11481149Builder* builder = nullptr;1150if (scene->device->quad_builder_mb == "default") {1151switch (bvariant) {1152case BuildVariant::STATIC : builder = BVH4Quad4iMBSceneBuilderSAH(accel,scene,0); break;1153case BuildVariant::DYNAMIC : assert(false); break; // FIXME: implement1154case BuildVariant::HIGH_QUALITY: assert(false); break;1155}1156}1157else if (scene->device->quad_builder_mb == "sah") builder = BVH4Quad4iMBSceneBuilderSAH(accel,scene,0);1158else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder "+scene->device->quad_builder_mb+" for BVH4<Quad4iMB>");11591160return new AccelInstance(accel,builder,intersectors);1161}11621163Accel* BVH4Factory::BVH4QuantizedQuad4i(Scene* scene)1164{1165BVH4* accel = new BVH4(Quad4i::type,scene);1166Builder* builder = BVH4QuantizedQuad4iSceneBuilderSAH(accel,scene,0);1167Accel::Intersectors intersectors = QBVH4Quad4iIntersectors(accel);1168return new AccelInstance(accel,builder,intersectors);1169}11701171Accel* BVH4Factory::BVH4QuantizedTriangle4i(Scene* scene)1172{1173BVH4* accel = new BVH4(Triangle4i::type,scene);1174Builder* builder = BVH4QuantizedTriangle4iSceneBuilderSAH(accel,scene,0);1175Accel::Intersectors intersectors = QBVH4Triangle4iIntersectors(accel);1176return new AccelInstance(accel,builder,intersectors);1177}11781179Accel* BVH4Factory::BVH4SubdivPatch1(Scene* scene)1180{1181BVH4* accel = new BVH4(SubdivPatch1::type,scene);1182Accel::Intersectors intersectors = BVH4SubdivPatch1Intersectors(accel);1183Builder* builder = BVH4SubdivPatch1BuilderSAH(accel,scene,0);1184return new AccelInstance(accel,builder,intersectors);1185}11861187Accel* BVH4Factory::BVH4SubdivPatch1MB(Scene* scene)1188{1189BVH4* accel = new BVH4(SubdivPatch1::type,scene);1190Accel::Intersectors intersectors = BVH4SubdivPatch1MBIntersectors(accel);1191Builder* builder = BVH4SubdivPatch1MBBuilderSAH(accel,scene,0);1192return new AccelInstance(accel,builder,intersectors);1193}11941195Accel* BVH4Factory::BVH4UserGeometry(Scene* scene, BuildVariant bvariant)1196{1197BVH4* accel = new BVH4(Object::type,scene);1198Accel::Intersectors intersectors = BVH4UserGeometryIntersectors(accel);11991200Builder* builder = nullptr;1201if (scene->device->object_builder == "default") {1202switch (bvariant) {1203case BuildVariant::STATIC : builder = BVH4VirtualSceneBuilderSAH(accel,scene,0); break;1204case BuildVariant::DYNAMIC : builder = BVH4BuilderTwoLevelVirtualSAH(accel,scene,false); break;1205case BuildVariant::HIGH_QUALITY: assert(false); break;1206}1207}1208else if (scene->device->object_builder == "sah") builder = BVH4VirtualSceneBuilderSAH(accel,scene,0);1209else if (scene->device->object_builder == "dynamic") builder = BVH4BuilderTwoLevelVirtualSAH(accel,scene,false);1210else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder "+scene->device->object_builder+" for BVH4<Object>");12111212return new AccelInstance(accel,builder,intersectors);1213}12141215Accel* BVH4Factory::BVH4UserGeometryMB(Scene* scene)1216{1217BVH4* accel = new BVH4(Object::type,scene);1218Accel::Intersectors intersectors = BVH4UserGeometryMBIntersectors(accel);1219Builder* builder = BVH4VirtualMBSceneBuilderSAH(accel,scene,0);1220return new AccelInstance(accel,builder,intersectors);1221}12221223Accel* BVH4Factory::BVH4Instance(Scene* scene, bool isExpensive, BuildVariant bvariant)1224{1225BVH4* accel = new BVH4(InstancePrimitive::type,scene);1226Accel::Intersectors intersectors = BVH4InstanceIntersectors(accel);1227auto gtype = isExpensive ? Geometry::MTY_INSTANCE_EXPENSIVE : Geometry::MTY_INSTANCE_CHEAP;1228// Builder* builder = BVH4InstanceSceneBuilderSAH(accel,scene,gtype);12291230Builder* builder = nullptr;1231if (scene->device->object_builder == "default") {1232switch (bvariant) {1233case BuildVariant::STATIC : builder = BVH4InstanceSceneBuilderSAH(accel,scene,gtype); break;1234case BuildVariant::DYNAMIC : builder = BVH4BuilderTwoLevelInstanceSAH(accel,scene,gtype,false); break;1235case BuildVariant::HIGH_QUALITY: assert(false); break;1236}1237}1238else if (scene->device->object_builder == "sah") builder = BVH4InstanceSceneBuilderSAH(accel,scene,gtype);1239else if (scene->device->object_builder == "dynamic") builder = BVH4BuilderTwoLevelInstanceSAH(accel,scene,gtype,false);1240else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder "+scene->device->object_builder+" for BVH4<Object>");12411242return new AccelInstance(accel,builder,intersectors);1243}12441245Accel* BVH4Factory::BVH4InstanceMB(Scene* scene, bool isExpensive)1246{1247BVH4* accel = new BVH4(InstancePrimitive::type,scene);1248Accel::Intersectors intersectors = BVH4InstanceMBIntersectors(accel);1249auto gtype = isExpensive ? Geometry::MTY_INSTANCE_EXPENSIVE : Geometry::MTY_INSTANCE_CHEAP;1250Builder* builder = BVH4InstanceMBSceneBuilderSAH(accel,scene,gtype);1251return new AccelInstance(accel,builder,intersectors);1252}12531254Accel* BVH4Factory::BVH4InstanceArray(Scene* scene, BuildVariant bvariant)1255{1256BVH4* accel = new BVH4(InstanceArrayPrimitive::type,scene);1257Accel::Intersectors intersectors = BVH4InstanceArrayIntersectors(accel);1258auto gtype = Geometry::MTY_INSTANCE_ARRAY;12591260Builder* builder = nullptr;1261if (scene->device->object_builder == "default") {1262switch (bvariant) {1263case BuildVariant::STATIC : builder = BVH4InstanceArraySceneBuilderSAH(accel,scene,gtype); break;1264case BuildVariant::DYNAMIC : builder = BVH4BuilderTwoLevelInstanceArraySAH(accel,scene,gtype,false); break;1265case BuildVariant::HIGH_QUALITY: assert(false); break;1266}1267}1268else if (scene->device->object_builder == "sah") { builder = BVH4InstanceArraySceneBuilderSAH(accel,scene,gtype); }1269else if (scene->device->object_builder == "dynamic") { builder = BVH4BuilderTwoLevelInstanceArraySAH(accel,scene,gtype,false); }1270else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder "+scene->device->object_builder+" for BVH4<Object>");12711272return new AccelInstance(accel,builder,intersectors);1273}12741275Accel* BVH4Factory::BVH4InstanceArrayMB(Scene* scene)1276{1277BVH4* accel = new BVH4(InstanceArrayPrimitive::type,scene);1278Accel::Intersectors intersectors = BVH4InstanceArrayMBIntersectors(accel);1279Builder* builder = BVH4InstanceArrayMBSceneBuilderSAH(accel,scene,Geometry::MTY_INSTANCE_ARRAY);1280return new AccelInstance(accel,builder,intersectors);1281}12821283Accel::Intersectors BVH4Factory::BVH4GridIntersectors(BVH4* bvh, IntersectVariant ivariant)1284{1285Accel::Intersectors intersectors;1286intersectors.ptr = bvh;1287if (ivariant == IntersectVariant::FAST)1288{1289intersectors.intersector1 = BVH4GridIntersector1Moeller();1290#if defined (EMBREE_RAY_PACKETS)1291intersectors.intersector4 = BVH4GridIntersector4HybridMoeller();1292intersectors.intersector8 = BVH4GridIntersector8HybridMoeller();1293intersectors.intersector16 = BVH4GridIntersector16HybridMoeller();1294#endif1295}1296else /* if (ivariant == IntersectVariant::ROBUST) */1297{1298intersectors.intersector1 = BVH4GridIntersector1Pluecker();1299#if defined (EMBREE_RAY_PACKETS)1300intersectors.intersector4 = BVH4GridIntersector4HybridPluecker();1301intersectors.intersector8 = BVH4GridIntersector8HybridPluecker();1302intersectors.intersector16 = BVH4GridIntersector16HybridPluecker();1303#endif1304}1305return intersectors;1306}13071308Accel::Intersectors BVH4Factory::BVH4GridMBIntersectors(BVH4* bvh, IntersectVariant ivariant)1309{1310Accel::Intersectors intersectors;1311intersectors.ptr = bvh;1312intersectors.intersector1 = BVH4GridMBIntersector1Moeller();1313#if defined (EMBREE_RAY_PACKETS)1314intersectors.intersector4 = BVH4GridMBIntersector4HybridMoeller();1315intersectors.intersector8 = BVH4GridMBIntersector8HybridMoeller();1316intersectors.intersector16 = BVH4GridMBIntersector16HybridMoeller();1317#endif1318return intersectors;1319}13201321Accel* BVH4Factory::BVH4Grid(Scene* scene, BuildVariant bvariant, IntersectVariant ivariant)1322{1323BVH4* accel = new BVH4(SubGridQBVH4::type,scene);1324Accel::Intersectors intersectors = BVH4GridIntersectors(accel,ivariant);13251326Builder* builder = nullptr;1327if (scene->device->object_builder == "default") {1328builder = BVH4GridSceneBuilderSAH(accel,scene,0);1329}1330else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder "+scene->device->grid_builder+" for BVH4<GridMesh>");13311332return new AccelInstance(accel,builder,intersectors);1333}13341335Accel* BVH4Factory::BVH4GridMB(Scene* scene, BuildVariant bvariant, IntersectVariant ivariant)1336{1337BVH4* accel = new BVH4(SubGridQBVH4::type,scene);1338Accel::Intersectors intersectors = BVH4GridMBIntersectors(accel,ivariant);1339Builder* builder = nullptr;1340if (scene->device->object_builder == "default") {1341builder = BVH4GridMBSceneBuilderSAH(accel,scene,0);1342}1343else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder "+scene->device->grid_builder+" for BVH4MB<GridMesh>");1344return new AccelInstance(accel,builder,intersectors);1345}13461347}134813491350