Path: blob/master/thirdparty/embree/kernels/bvh/bvh8_factory.cpp
9906 views
// Copyright 2009-2021 Intel Corporation1// SPDX-License-Identifier: Apache-2.023#include "../common/isa.h" // to define EMBREE_TARGET_SIMD845#if defined (EMBREE_TARGET_SIMD8)67#include "bvh8_factory.h"8#include "../bvh/bvh.h"910#include "../geometry/curveNv.h"11#include "../geometry/curveNi.h"12#include "../geometry/curveNi_mb.h"13#include "../geometry/linei.h"14#include "../geometry/triangle.h"15#include "../geometry/trianglev.h"16#include "../geometry/trianglev_mb.h"17#include "../geometry/trianglei.h"18#include "../geometry/quadv.h"19#include "../geometry/quadi.h"20#include "../geometry/subdivpatch1.h"21#include "../geometry/object.h"22#include "../geometry/instance.h"23#include "../geometry/instance_array.h"24#include "../geometry/subgrid.h"25#include "../common/accelinstance.h"2627namespace embree28{29DECLARE_SYMBOL2(Accel::Collider,BVH8ColliderUserGeom);3031DECLARE_ISA_FUNCTION(VirtualCurveIntersector*,VirtualCurveIntersector8v,void);32DECLARE_ISA_FUNCTION(VirtualCurveIntersector*,VirtualCurveIntersector8iMB,void);3334DECLARE_SYMBOL2(Accel::Intersector1,BVH8OBBVirtualCurveIntersector1);35DECLARE_SYMBOL2(Accel::Intersector1,BVH8OBBVirtualCurveIntersector1MB);36DECLARE_SYMBOL2(Accel::Intersector1,BVH8OBBVirtualCurveIntersectorRobust1);37DECLARE_SYMBOL2(Accel::Intersector1,BVH8OBBVirtualCurveIntersectorRobust1MB);3839DECLARE_SYMBOL2(Accel::Intersector1,BVH8Triangle4Intersector1Moeller);40DECLARE_SYMBOL2(Accel::Intersector1,BVH8Triangle4iIntersector1Moeller);41DECLARE_SYMBOL2(Accel::Intersector1,BVH8Triangle4vIntersector1Pluecker);42DECLARE_SYMBOL2(Accel::Intersector1,BVH8Triangle4iIntersector1Pluecker);4344DECLARE_SYMBOL2(Accel::Intersector1,BVH8Triangle4vIntersector1Woop);4546DECLARE_SYMBOL2(Accel::Intersector1,BVH8Triangle4vMBIntersector1Moeller);47DECLARE_SYMBOL2(Accel::Intersector1,BVH8Triangle4iMBIntersector1Moeller);48DECLARE_SYMBOL2(Accel::Intersector1,BVH8Triangle4vMBIntersector1Pluecker);49DECLARE_SYMBOL2(Accel::Intersector1,BVH8Triangle4iMBIntersector1Pluecker);5051DECLARE_SYMBOL2(Accel::Intersector1,BVH8Quad4vIntersector1Moeller);52DECLARE_SYMBOL2(Accel::Intersector1,BVH8Quad4iIntersector1Moeller);53DECLARE_SYMBOL2(Accel::Intersector1,BVH8Quad4vIntersector1Pluecker);54DECLARE_SYMBOL2(Accel::Intersector1,BVH8Quad4iIntersector1Pluecker);5556DECLARE_SYMBOL2(Accel::Intersector1,BVH8Quad4iMBIntersector1Moeller);57DECLARE_SYMBOL2(Accel::Intersector1,BVH8Quad4iMBIntersector1Pluecker);5859DECLARE_SYMBOL2(Accel::Intersector1,QBVH8Triangle4iIntersector1Pluecker);60DECLARE_SYMBOL2(Accel::Intersector1,QBVH8Triangle4Intersector1Moeller);61DECLARE_SYMBOL2(Accel::Intersector1,QBVH8Quad4iIntersector1Pluecker);6263DECLARE_SYMBOL2(Accel::Intersector1,BVH8VirtualIntersector1);64DECLARE_SYMBOL2(Accel::Intersector1,BVH8VirtualMBIntersector1);6566DECLARE_SYMBOL2(Accel::Intersector1,BVH8InstanceIntersector1);67DECLARE_SYMBOL2(Accel::Intersector1,BVH8InstanceMBIntersector1);6869DECLARE_SYMBOL2(Accel::Intersector1,BVH8InstanceArrayIntersector1);70DECLARE_SYMBOL2(Accel::Intersector1,BVH8InstanceArrayMBIntersector1);7172DECLARE_SYMBOL2(Accel::Intersector1,BVH8GridIntersector1Moeller);73DECLARE_SYMBOL2(Accel::Intersector1,BVH8GridMBIntersector1Moeller);74DECLARE_SYMBOL2(Accel::Intersector1,BVH8GridIntersector1Pluecker);7576DECLARE_SYMBOL2(Accel::Intersector4,BVH8OBBVirtualCurveIntersector4Hybrid);77DECLARE_SYMBOL2(Accel::Intersector4,BVH8OBBVirtualCurveIntersector4HybridMB);78DECLARE_SYMBOL2(Accel::Intersector4,BVH8OBBVirtualCurveIntersectorRobust4Hybrid);79DECLARE_SYMBOL2(Accel::Intersector4,BVH8OBBVirtualCurveIntersectorRobust4HybridMB);8081DECLARE_SYMBOL2(Accel::Intersector4,BVH8Triangle4Intersector4HybridMoeller);82DECLARE_SYMBOL2(Accel::Intersector4,BVH8Triangle4Intersector4HybridMoellerNoFilter);83DECLARE_SYMBOL2(Accel::Intersector4,BVH8Triangle4iIntersector4HybridMoeller);84DECLARE_SYMBOL2(Accel::Intersector4,BVH8Triangle4vIntersector4HybridPluecker);85DECLARE_SYMBOL2(Accel::Intersector4,BVH8Triangle4iIntersector4HybridPluecker);8687DECLARE_SYMBOL2(Accel::Intersector4,BVH8Triangle4vMBIntersector4HybridMoeller);88DECLARE_SYMBOL2(Accel::Intersector4,BVH8Triangle4iMBIntersector4HybridMoeller);89DECLARE_SYMBOL2(Accel::Intersector4,BVH8Triangle4vMBIntersector4HybridPluecker);90DECLARE_SYMBOL2(Accel::Intersector4,BVH8Triangle4iMBIntersector4HybridPluecker);9192DECLARE_SYMBOL2(Accel::Intersector4,BVH8Quad4vIntersector4HybridMoeller);93DECLARE_SYMBOL2(Accel::Intersector4,BVH8Quad4vIntersector4HybridMoellerNoFilter);94DECLARE_SYMBOL2(Accel::Intersector4,BVH8Quad4iIntersector4HybridMoeller);95DECLARE_SYMBOL2(Accel::Intersector4,BVH8Quad4vIntersector4HybridPluecker);96DECLARE_SYMBOL2(Accel::Intersector4,BVH8Quad4iIntersector4HybridPluecker);9798DECLARE_SYMBOL2(Accel::Intersector4,BVH8Quad4iMBIntersector4HybridMoeller);99DECLARE_SYMBOL2(Accel::Intersector4,BVH8Quad4iMBIntersector4HybridPluecker);100101DECLARE_SYMBOL2(Accel::Intersector4,BVH8VirtualIntersector4Chunk);102DECLARE_SYMBOL2(Accel::Intersector4,BVH8VirtualMBIntersector4Chunk);103104DECLARE_SYMBOL2(Accel::Intersector4,BVH8InstanceIntersector4Chunk);105DECLARE_SYMBOL2(Accel::Intersector4,BVH8InstanceMBIntersector4Chunk);106107DECLARE_SYMBOL2(Accel::Intersector4,BVH8InstanceArrayIntersector4Chunk);108DECLARE_SYMBOL2(Accel::Intersector4,BVH8InstanceArrayMBIntersector4Chunk);109110DECLARE_SYMBOL2(Accel::Intersector4,BVH8GridIntersector4HybridMoeller);111DECLARE_SYMBOL2(Accel::Intersector4,BVH8GridIntersector4HybridPluecker);112113DECLARE_SYMBOL2(Accel::Intersector8,BVH8OBBVirtualCurveIntersector8Hybrid);114DECLARE_SYMBOL2(Accel::Intersector8,BVH8OBBVirtualCurveIntersector8HybridMB);115DECLARE_SYMBOL2(Accel::Intersector8,BVH8OBBVirtualCurveIntersectorRobust8Hybrid);116DECLARE_SYMBOL2(Accel::Intersector8,BVH8OBBVirtualCurveIntersectorRobust8HybridMB);117118DECLARE_SYMBOL2(Accel::Intersector8,BVH8Triangle4Intersector8HybridMoeller);119DECLARE_SYMBOL2(Accel::Intersector8,BVH8Triangle4Intersector8HybridMoellerNoFilter);120DECLARE_SYMBOL2(Accel::Intersector8,BVH8Triangle4iIntersector8HybridMoeller);121DECLARE_SYMBOL2(Accel::Intersector8,BVH8Triangle4vIntersector8HybridPluecker);122DECLARE_SYMBOL2(Accel::Intersector8,BVH8Triangle4iIntersector8HybridPluecker);123124DECLARE_SYMBOL2(Accel::Intersector8,BVH8Triangle4vMBIntersector8HybridMoeller);125DECLARE_SYMBOL2(Accel::Intersector8,BVH8Triangle4iMBIntersector8HybridMoeller);126DECLARE_SYMBOL2(Accel::Intersector8,BVH8Triangle4vMBIntersector8HybridPluecker);127DECLARE_SYMBOL2(Accel::Intersector8,BVH8Triangle4iMBIntersector8HybridPluecker);128129DECLARE_SYMBOL2(Accel::Intersector8,BVH8Quad4vIntersector8HybridMoeller);130DECLARE_SYMBOL2(Accel::Intersector8,BVH8Quad4vIntersector8HybridMoellerNoFilter);131DECLARE_SYMBOL2(Accel::Intersector8,BVH8Quad4iIntersector8HybridMoeller);132DECLARE_SYMBOL2(Accel::Intersector8,BVH8Quad4vIntersector8HybridPluecker);133DECLARE_SYMBOL2(Accel::Intersector8,BVH8Quad4iIntersector8HybridPluecker);134135DECLARE_SYMBOL2(Accel::Intersector8,BVH8Quad4iMBIntersector8HybridMoeller);136DECLARE_SYMBOL2(Accel::Intersector8,BVH8Quad4iMBIntersector8HybridPluecker);137138DECLARE_SYMBOL2(Accel::Intersector8,BVH8VirtualIntersector8Chunk);139DECLARE_SYMBOL2(Accel::Intersector8,BVH8VirtualMBIntersector8Chunk);140141DECLARE_SYMBOL2(Accel::Intersector8,BVH8InstanceIntersector8Chunk);142DECLARE_SYMBOL2(Accel::Intersector8,BVH8InstanceMBIntersector8Chunk);143144DECLARE_SYMBOL2(Accel::Intersector8,BVH8InstanceArrayIntersector8Chunk);145DECLARE_SYMBOL2(Accel::Intersector8,BVH8InstanceArrayMBIntersector8Chunk);146147DECLARE_SYMBOL2(Accel::Intersector8,BVH8GridIntersector8HybridMoeller);148DECLARE_SYMBOL2(Accel::Intersector8,BVH8GridIntersector8HybridPluecker);149150DECLARE_SYMBOL2(Accel::Intersector16,BVH8OBBVirtualCurveIntersector16Hybrid);151DECLARE_SYMBOL2(Accel::Intersector16,BVH8OBBVirtualCurveIntersector16HybridMB);152DECLARE_SYMBOL2(Accel::Intersector16,BVH8OBBVirtualCurveIntersectorRobust16Hybrid);153DECLARE_SYMBOL2(Accel::Intersector16,BVH8OBBVirtualCurveIntersectorRobust16HybridMB);154155DECLARE_SYMBOL2(Accel::Intersector16,BVH8Triangle4Intersector16HybridMoeller);156DECLARE_SYMBOL2(Accel::Intersector16,BVH8Triangle4Intersector16HybridMoellerNoFilter);157DECLARE_SYMBOL2(Accel::Intersector16,BVH8Triangle4iIntersector16HybridMoeller);158DECLARE_SYMBOL2(Accel::Intersector16,BVH8Triangle4vIntersector16HybridPluecker);159DECLARE_SYMBOL2(Accel::Intersector16,BVH8Triangle4iIntersector16HybridPluecker);160161DECLARE_SYMBOL2(Accel::Intersector16,BVH8Triangle4vMBIntersector16HybridMoeller);162DECLARE_SYMBOL2(Accel::Intersector16,BVH8Triangle4iMBIntersector16HybridMoeller);163DECLARE_SYMBOL2(Accel::Intersector16,BVH8Triangle4vMBIntersector16HybridPluecker);164DECLARE_SYMBOL2(Accel::Intersector16,BVH8Triangle4iMBIntersector16HybridPluecker);165166DECLARE_SYMBOL2(Accel::Intersector16,BVH8Quad4vIntersector16HybridMoeller);167DECLARE_SYMBOL2(Accel::Intersector16,BVH8Quad4vIntersector16HybridMoellerNoFilter);168DECLARE_SYMBOL2(Accel::Intersector16,BVH8Quad4iIntersector16HybridMoeller);169DECLARE_SYMBOL2(Accel::Intersector16,BVH8Quad4vIntersector16HybridPluecker);170DECLARE_SYMBOL2(Accel::Intersector16,BVH8Quad4iIntersector16HybridPluecker);171172DECLARE_SYMBOL2(Accel::Intersector16,BVH8Quad4iMBIntersector16HybridMoeller);173DECLARE_SYMBOL2(Accel::Intersector16,BVH8Quad4iMBIntersector16HybridPluecker);174175DECLARE_SYMBOL2(Accel::Intersector16,BVH8VirtualIntersector16Chunk);176DECLARE_SYMBOL2(Accel::Intersector16,BVH8VirtualMBIntersector16Chunk);177178DECLARE_SYMBOL2(Accel::Intersector16,BVH8InstanceIntersector16Chunk);179DECLARE_SYMBOL2(Accel::Intersector16,BVH8InstanceMBIntersector16Chunk);180181DECLARE_SYMBOL2(Accel::Intersector16,BVH8InstanceArrayIntersector16Chunk);182DECLARE_SYMBOL2(Accel::Intersector16,BVH8InstanceArrayMBIntersector16Chunk);183184DECLARE_SYMBOL2(Accel::Intersector16,BVH8GridIntersector16HybridMoeller);185DECLARE_SYMBOL2(Accel::Intersector16,BVH8GridIntersector16HybridPluecker);186187DECLARE_ISA_FUNCTION(Builder*,BVH8Curve8vBuilder_OBB_New,void* COMMA Scene* COMMA size_t);188DECLARE_ISA_FUNCTION(Builder*,BVH8OBBCurve8iMBBuilder_OBB,void* COMMA Scene* COMMA size_t);189190DECLARE_ISA_FUNCTION(Builder*,BVH8Triangle4SceneBuilderSAH,void* COMMA Scene* COMMA size_t);191DECLARE_ISA_FUNCTION(Builder*,BVH8Triangle4vSceneBuilderSAH,void* COMMA Scene* COMMA size_t);192DECLARE_ISA_FUNCTION(Builder*,BVH8Triangle4iSceneBuilderSAH,void* COMMA Scene* COMMA size_t);193DECLARE_ISA_FUNCTION(Builder*,BVH8Triangle4iMBSceneBuilderSAH,void* COMMA Scene* COMMA size_t);194DECLARE_ISA_FUNCTION(Builder*,BVH8Triangle4vMBSceneBuilderSAH,void* COMMA Scene* COMMA size_t);195DECLARE_ISA_FUNCTION(Builder*,BVH8QuantizedTriangle4iSceneBuilderSAH,void* COMMA Scene* COMMA size_t);196DECLARE_ISA_FUNCTION(Builder*,BVH8QuantizedTriangle4SceneBuilderSAH,void* COMMA Scene* COMMA size_t);197198DECLARE_ISA_FUNCTION(Builder*,BVH8Quad4vSceneBuilderSAH,void* COMMA Scene* COMMA size_t);199DECLARE_ISA_FUNCTION(Builder*,BVH8Quad4iSceneBuilderSAH,void* COMMA Scene* COMMA size_t);200DECLARE_ISA_FUNCTION(Builder*,BVH8Quad4iMBSceneBuilderSAH,void* COMMA Scene* COMMA size_t);201DECLARE_ISA_FUNCTION(Builder*,BVH8QuantizedQuad4iSceneBuilderSAH,void* COMMA Scene* COMMA size_t);202203DECLARE_ISA_FUNCTION(Builder*,BVH8VirtualSceneBuilderSAH,void* COMMA Scene* COMMA size_t);204DECLARE_ISA_FUNCTION(Builder*,BVH8VirtualMBSceneBuilderSAH,void* COMMA Scene* COMMA size_t);205206DECLARE_ISA_FUNCTION(Builder*,BVH8InstanceSceneBuilderSAH,void* COMMA Scene* COMMA Geometry::GTypeMask);207DECLARE_ISA_FUNCTION(Builder*,BVH8InstanceMBSceneBuilderSAH,void* COMMA Scene* COMMA Geometry::GTypeMask);208209DECLARE_ISA_FUNCTION(Builder*,BVH8InstanceArraySceneBuilderSAH,void* COMMA Scene* COMMA Geometry::GTypeMask);210DECLARE_ISA_FUNCTION(Builder*,BVH8InstanceArrayMBSceneBuilderSAH,void* COMMA Scene* COMMA Geometry::GTypeMask);211212DECLARE_ISA_FUNCTION(Builder*,BVH8Triangle4SceneBuilderFastSpatialSAH,void* COMMA Scene* COMMA size_t);213DECLARE_ISA_FUNCTION(Builder*,BVH8Triangle4vSceneBuilderFastSpatialSAH,void* COMMA Scene* COMMA size_t);214DECLARE_ISA_FUNCTION(Builder*,BVH8Quad4vSceneBuilderFastSpatialSAH,void* COMMA Scene* COMMA size_t);215DECLARE_ISA_FUNCTION(Builder*,BVH8GridSceneBuilderSAH,void* COMMA Scene* COMMA size_t);216DECLARE_ISA_FUNCTION(Builder*,BVH8GridMBSceneBuilderSAH,void* COMMA Scene* COMMA size_t);217218DECLARE_ISA_FUNCTION(Builder*,BVH8BuilderTwoLevelTriangle4MeshSAH,void* COMMA Scene* COMMA bool);219DECLARE_ISA_FUNCTION(Builder*,BVH8BuilderTwoLevelTriangle4vMeshSAH,void* COMMA Scene* COMMA bool);220DECLARE_ISA_FUNCTION(Builder*,BVH8BuilderTwoLevelTriangle4iMeshSAH,void* COMMA Scene* COMMA bool);221DECLARE_ISA_FUNCTION(Builder*,BVH8BuilderTwoLevelQuadMeshSAH,void* COMMA Scene* COMMA bool);222DECLARE_ISA_FUNCTION(Builder*,BVH8BuilderTwoLevelVirtualSAH,void* COMMA Scene* COMMA bool);223DECLARE_ISA_FUNCTION(Builder*,BVH8BuilderTwoLevelInstanceSAH,void* COMMA Scene* COMMA Geometry::GTypeMask COMMA bool);224DECLARE_ISA_FUNCTION(Builder*,BVH8BuilderTwoLevelInstanceArraySAH,void* COMMA Scene* COMMA Geometry::GTypeMask COMMA bool);225226BVH8Factory::BVH8Factory(int bfeatures, int ifeatures)227{228SELECT_SYMBOL_INIT_AVX(ifeatures,BVH8ColliderUserGeom);229230selectBuilders(bfeatures);231selectIntersectors(ifeatures);232}233234void BVH8Factory::selectBuilders(int features)235{236IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX(features,BVH8Curve8vBuilder_OBB_New));237IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX(features,BVH8OBBCurve8iMBBuilder_OBB));238239IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX(features,BVH8Triangle4SceneBuilderSAH));240IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX(features,BVH8Triangle4vSceneBuilderSAH));241IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX(features,BVH8Triangle4iSceneBuilderSAH));242IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX(features,BVH8Triangle4iMBSceneBuilderSAH));243IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX(features,BVH8Triangle4vMBSceneBuilderSAH));244IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX(features,BVH8QuantizedTriangle4iSceneBuilderSAH));245IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX(features,BVH8QuantizedTriangle4SceneBuilderSAH));246247IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX(features,BVH8Quad4vSceneBuilderSAH));248IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX(features,BVH8Quad4iSceneBuilderSAH));249IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX(features,BVH8Quad4iMBSceneBuilderSAH));250IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX(features,BVH8QuantizedQuad4iSceneBuilderSAH));251252IF_ENABLED_USER(SELECT_SYMBOL_INIT_AVX(features,BVH8VirtualSceneBuilderSAH));253IF_ENABLED_USER(SELECT_SYMBOL_INIT_AVX(features,BVH8VirtualMBSceneBuilderSAH));254255IF_ENABLED_INSTANCE(SELECT_SYMBOL_INIT_AVX(features,BVH8InstanceSceneBuilderSAH));256IF_ENABLED_INSTANCE(SELECT_SYMBOL_INIT_AVX(features,BVH8InstanceMBSceneBuilderSAH));257258IF_ENABLED_INSTANCE_ARRAY(SELECT_SYMBOL_INIT_AVX(features,BVH8InstanceArraySceneBuilderSAH));259IF_ENABLED_INSTANCE_ARRAY(SELECT_SYMBOL_INIT_AVX(features,BVH8InstanceArrayMBSceneBuilderSAH));260261IF_ENABLED_GRIDS(SELECT_SYMBOL_INIT_AVX(features,BVH8GridSceneBuilderSAH));262IF_ENABLED_GRIDS(SELECT_SYMBOL_INIT_AVX(features,BVH8GridMBSceneBuilderSAH));263264IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX(features,BVH8Triangle4SceneBuilderFastSpatialSAH));265IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX(features,BVH8Triangle4vSceneBuilderFastSpatialSAH));266IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX(features,BVH8Quad4vSceneBuilderFastSpatialSAH));267268IF_ENABLED_TRIS (SELECT_SYMBOL_INIT_AVX(features,BVH8BuilderTwoLevelTriangle4MeshSAH));269IF_ENABLED_TRIS (SELECT_SYMBOL_INIT_AVX(features,BVH8BuilderTwoLevelTriangle4vMeshSAH));270IF_ENABLED_TRIS (SELECT_SYMBOL_INIT_AVX(features,BVH8BuilderTwoLevelTriangle4iMeshSAH));271IF_ENABLED_QUADS (SELECT_SYMBOL_INIT_AVX(features,BVH8BuilderTwoLevelQuadMeshSAH));272IF_ENABLED_USER (SELECT_SYMBOL_INIT_AVX(features,BVH8BuilderTwoLevelVirtualSAH));273IF_ENABLED_INSTANCE (SELECT_SYMBOL_INIT_AVX(features,BVH8BuilderTwoLevelInstanceSAH));274IF_ENABLED_INSTANCE_ARRAY (SELECT_SYMBOL_INIT_AVX(features,BVH8BuilderTwoLevelInstanceArraySAH));275}276277void BVH8Factory::selectIntersectors(int features)278{279IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,VirtualCurveIntersector8v));280IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,VirtualCurveIntersector8iMB));281282/* select intersectors1 */283IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8OBBVirtualCurveIntersector1));284IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8OBBVirtualCurveIntersector1MB));285IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8OBBVirtualCurveIntersectorRobust1));286IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8OBBVirtualCurveIntersectorRobust1MB));287288IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4Intersector1Moeller));289IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4iIntersector1Moeller));290IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4vIntersector1Pluecker));291IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4iIntersector1Pluecker));292293IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4vIntersector1Woop));294295IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4vMBIntersector1Moeller));296IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4iMBIntersector1Moeller));297IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4vMBIntersector1Pluecker));298IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4iMBIntersector1Pluecker));299300IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Quad4vIntersector1Moeller));301IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Quad4iIntersector1Moeller));302IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Quad4vIntersector1Pluecker));303IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Quad4iIntersector1Pluecker));304305IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Quad4iMBIntersector1Moeller));306IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Quad4iMBIntersector1Pluecker));307308IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,QBVH8Triangle4iIntersector1Pluecker));309IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,QBVH8Triangle4Intersector1Moeller));310IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,QBVH8Quad4iIntersector1Pluecker));311312IF_ENABLED_USER(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8VirtualIntersector1));313IF_ENABLED_USER(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8VirtualMBIntersector1));314315IF_ENABLED_INSTANCE(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8InstanceIntersector1));316IF_ENABLED_INSTANCE(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8InstanceMBIntersector1));317318IF_ENABLED_INSTANCE_ARRAY(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8InstanceArrayIntersector1));319IF_ENABLED_INSTANCE_ARRAY(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8InstanceArrayMBIntersector1));320321IF_ENABLED_GRIDS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8GridIntersector1Moeller));322IF_ENABLED_GRIDS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8GridMBIntersector1Moeller))323IF_ENABLED_GRIDS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8GridIntersector1Pluecker));324325#if defined (EMBREE_RAY_PACKETS)326327/* select intersectors4 */328IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8OBBVirtualCurveIntersector4Hybrid));329IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8OBBVirtualCurveIntersector4HybridMB));330IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8OBBVirtualCurveIntersectorRobust4Hybrid));331IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8OBBVirtualCurveIntersectorRobust4HybridMB));332333IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4Intersector4HybridMoeller));334IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4Intersector4HybridMoellerNoFilter));335IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4iIntersector4HybridMoeller));336IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4vIntersector4HybridPluecker));337IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4iIntersector4HybridPluecker));338339IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4vMBIntersector4HybridMoeller));340IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4iMBIntersector4HybridMoeller));341IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4vMBIntersector4HybridPluecker));342IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4iMBIntersector4HybridPluecker));343344IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Quad4vIntersector4HybridMoeller));345IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Quad4vIntersector4HybridMoellerNoFilter));346IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Quad4iIntersector4HybridMoeller));347IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Quad4vIntersector4HybridPluecker));348IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Quad4iIntersector4HybridPluecker));349350IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2(features,BVH8Quad4iMBIntersector4HybridMoeller));351IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2(features,BVH8Quad4iMBIntersector4HybridPluecker));352353IF_ENABLED_USER(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8VirtualIntersector4Chunk));354IF_ENABLED_USER(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8VirtualMBIntersector4Chunk));355356IF_ENABLED_INSTANCE(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8InstanceIntersector4Chunk));357IF_ENABLED_INSTANCE(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8InstanceMBIntersector4Chunk));358359IF_ENABLED_INSTANCE_ARRAY(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8InstanceArrayIntersector4Chunk));360IF_ENABLED_INSTANCE_ARRAY(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8InstanceArrayMBIntersector4Chunk));361362IF_ENABLED_GRIDS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8GridIntersector4HybridMoeller));363IF_ENABLED_GRIDS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8GridIntersector4HybridPluecker));364365/* select intersectors8 */366IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8OBBVirtualCurveIntersector8Hybrid));367IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8OBBVirtualCurveIntersector8HybridMB));368IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8OBBVirtualCurveIntersectorRobust8Hybrid));369IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8OBBVirtualCurveIntersectorRobust8HybridMB));370371IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4Intersector8HybridMoeller));372IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4Intersector8HybridMoellerNoFilter));373IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4iIntersector8HybridMoeller));374IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4vIntersector8HybridPluecker));375IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4iIntersector8HybridPluecker));376377IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4vMBIntersector8HybridMoeller));378IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4iMBIntersector8HybridMoeller));379IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4vMBIntersector8HybridPluecker));380IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4iMBIntersector8HybridPluecker));381382IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Quad4vIntersector8HybridMoeller));383IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Quad4vIntersector8HybridMoellerNoFilter));384IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Quad4iIntersector8HybridMoeller));385IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Quad4vIntersector8HybridPluecker));386IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Quad4iIntersector8HybridPluecker));387388IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2(features,BVH8Quad4iMBIntersector8HybridMoeller));389IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2(features,BVH8Quad4iMBIntersector8HybridPluecker));390391IF_ENABLED_USER(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8VirtualIntersector8Chunk));392IF_ENABLED_USER(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8VirtualMBIntersector8Chunk));393394IF_ENABLED_INSTANCE(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8InstanceIntersector8Chunk));395IF_ENABLED_INSTANCE(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8InstanceMBIntersector8Chunk));396397IF_ENABLED_INSTANCE_ARRAY(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8InstanceArrayIntersector8Chunk));398IF_ENABLED_INSTANCE_ARRAY(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8InstanceArrayMBIntersector8Chunk));399400IF_ENABLED_GRIDS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8GridIntersector8HybridMoeller));401IF_ENABLED_GRIDS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8GridIntersector8HybridPluecker));402403/* select intersectors16 */404IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX512(features,BVH8OBBVirtualCurveIntersector16Hybrid));405IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX512(features,BVH8OBBVirtualCurveIntersector16HybridMB));406IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX512(features,BVH8OBBVirtualCurveIntersectorRobust16Hybrid));407IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX512(features,BVH8OBBVirtualCurveIntersectorRobust16HybridMB));408409IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX512(features,BVH8Triangle4Intersector16HybridMoeller));410IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX512(features,BVH8Triangle4Intersector16HybridMoellerNoFilter));411IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX512(features,BVH8Triangle4iIntersector16HybridMoeller));412IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX512(features,BVH8Triangle4vIntersector16HybridPluecker));413IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX512(features,BVH8Triangle4iIntersector16HybridPluecker));414415IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX512(features,BVH8Triangle4vMBIntersector16HybridMoeller));416IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX512(features,BVH8Triangle4iMBIntersector16HybridMoeller));417IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX512(features,BVH8Triangle4vMBIntersector16HybridPluecker));418IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX512(features,BVH8Triangle4iMBIntersector16HybridPluecker));419420IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX512(features,BVH8Quad4vIntersector16HybridMoeller));421IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX512(features,BVH8Quad4vIntersector16HybridMoellerNoFilter));422IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX512(features,BVH8Quad4iIntersector16HybridMoeller));423IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX512(features,BVH8Quad4vIntersector16HybridPluecker));424IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX512(features,BVH8Quad4iIntersector16HybridPluecker));425426IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX512(features,BVH8Quad4iMBIntersector16HybridMoeller));427IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX512(features,BVH8Quad4iMBIntersector16HybridPluecker));428429IF_ENABLED_USER(SELECT_SYMBOL_INIT_AVX512(features,BVH8VirtualIntersector16Chunk));430IF_ENABLED_USER(SELECT_SYMBOL_INIT_AVX512(features,BVH8VirtualMBIntersector16Chunk));431432IF_ENABLED_INSTANCE(SELECT_SYMBOL_INIT_AVX512(features,BVH8InstanceIntersector16Chunk));433IF_ENABLED_INSTANCE(SELECT_SYMBOL_INIT_AVX512(features,BVH8InstanceMBIntersector16Chunk));434435IF_ENABLED_INSTANCE_ARRAY(SELECT_SYMBOL_INIT_AVX512(features,BVH8InstanceArrayIntersector16Chunk));436IF_ENABLED_INSTANCE_ARRAY(SELECT_SYMBOL_INIT_AVX512(features,BVH8InstanceArrayMBIntersector16Chunk));437438IF_ENABLED_GRIDS(SELECT_SYMBOL_INIT_AVX512(features,BVH8GridIntersector16HybridMoeller));439IF_ENABLED_GRIDS(SELECT_SYMBOL_INIT_AVX512(features,BVH8GridIntersector16HybridPluecker));440441#endif442}443444Accel::Intersectors BVH8Factory::BVH8OBBVirtualCurveIntersectors(BVH8* bvh, VirtualCurveIntersector* leafIntersector, IntersectVariant ivariant)445{446switch (ivariant) {447case IntersectVariant::FAST:448{449Accel::Intersectors intersectors;450intersectors.ptr = bvh;451intersectors.leafIntersector = leafIntersector;452intersectors.intersector1 = BVH8OBBVirtualCurveIntersector1();453#if defined (EMBREE_RAY_PACKETS)454intersectors.intersector4 = BVH8OBBVirtualCurveIntersector4Hybrid();455intersectors.intersector8 = BVH8OBBVirtualCurveIntersector8Hybrid();456intersectors.intersector16 = BVH8OBBVirtualCurveIntersector16Hybrid();457#endif458return intersectors;459}460case IntersectVariant::ROBUST:461{462Accel::Intersectors intersectors;463intersectors.ptr = bvh;464intersectors.leafIntersector = leafIntersector;465intersectors.intersector1 = BVH8OBBVirtualCurveIntersectorRobust1();466#if defined (EMBREE_RAY_PACKETS)467intersectors.intersector4 = BVH8OBBVirtualCurveIntersectorRobust4Hybrid();468intersectors.intersector8 = BVH8OBBVirtualCurveIntersectorRobust8Hybrid();469intersectors.intersector16 = BVH8OBBVirtualCurveIntersectorRobust16Hybrid();470#endif471return intersectors;472}473default: assert(false);474}475return Accel::Intersectors();476}477478Accel::Intersectors BVH8Factory::BVH8OBBVirtualCurveIntersectorsMB(BVH8* bvh, VirtualCurveIntersector* leafIntersector, IntersectVariant ivariant)479{480switch (ivariant) {481case IntersectVariant::FAST:482{483Accel::Intersectors intersectors;484intersectors.ptr = bvh;485intersectors.leafIntersector = leafIntersector;486intersectors.intersector1 = BVH8OBBVirtualCurveIntersector1MB();487#if defined (EMBREE_RAY_PACKETS)488intersectors.intersector4 = BVH8OBBVirtualCurveIntersector4HybridMB();489intersectors.intersector8 = BVH8OBBVirtualCurveIntersector8HybridMB();490intersectors.intersector16 = BVH8OBBVirtualCurveIntersector16HybridMB();491#endif492return intersectors;493}494case IntersectVariant::ROBUST:495{496Accel::Intersectors intersectors;497intersectors.ptr = bvh;498intersectors.leafIntersector = leafIntersector;499intersectors.intersector1 = BVH8OBBVirtualCurveIntersectorRobust1MB();500#if defined (EMBREE_RAY_PACKETS)501intersectors.intersector4 = BVH8OBBVirtualCurveIntersectorRobust4HybridMB();502intersectors.intersector8 = BVH8OBBVirtualCurveIntersectorRobust8HybridMB();503intersectors.intersector16 = BVH8OBBVirtualCurveIntersectorRobust16HybridMB();504#endif505return intersectors;506}507default: assert(false);508}509return Accel::Intersectors();510}511512Accel::Intersectors BVH8Factory::BVH8Triangle4Intersectors(BVH8* bvh, IntersectVariant ivariant)513{514assert(ivariant == IntersectVariant::FAST);515Accel::Intersectors intersectors;516intersectors.ptr = bvh;517intersectors.intersector1 = BVH8Triangle4Intersector1Moeller();518#if defined (EMBREE_RAY_PACKETS)519intersectors.intersector4_filter = BVH8Triangle4Intersector4HybridMoeller();520intersectors.intersector4_nofilter = BVH8Triangle4Intersector4HybridMoellerNoFilter();521intersectors.intersector8_filter = BVH8Triangle4Intersector8HybridMoeller();522intersectors.intersector8_nofilter = BVH8Triangle4Intersector8HybridMoellerNoFilter();523intersectors.intersector16_filter = BVH8Triangle4Intersector16HybridMoeller();524intersectors.intersector16_nofilter = BVH8Triangle4Intersector16HybridMoellerNoFilter();525#endif526return intersectors;527}528529Accel::Intersectors BVH8Factory::BVH8Triangle4vIntersectors(BVH8* bvh, IntersectVariant ivariant)530{531Accel::Intersectors intersectors;532intersectors.ptr = bvh;533#define ENABLE_WOOP_TEST 0534#if ENABLE_WOOP_TEST == 0535//assert(ivariant == IntersectVariant::ROBUST);536intersectors.intersector1 = BVH8Triangle4vIntersector1Pluecker();537#else538intersectors.intersector1 = BVH8Triangle4vIntersector1Woop();539#endif540541#if defined (EMBREE_RAY_PACKETS)542intersectors.intersector4 = BVH8Triangle4vIntersector4HybridPluecker();543intersectors.intersector8 = BVH8Triangle4vIntersector8HybridPluecker();544intersectors.intersector16 = BVH8Triangle4vIntersector16HybridPluecker();545#endif546return intersectors;547}548549Accel::Intersectors BVH8Factory::BVH8Triangle4iIntersectors(BVH8* bvh, IntersectVariant ivariant)550{551switch (ivariant) {552case IntersectVariant::FAST:553{554Accel::Intersectors intersectors;555intersectors.ptr = bvh;556intersectors.intersector1 = BVH8Triangle4iIntersector1Moeller();557#if defined (EMBREE_RAY_PACKETS)558intersectors.intersector4 = BVH8Triangle4iIntersector4HybridMoeller();559intersectors.intersector8 = BVH8Triangle4iIntersector8HybridMoeller();560intersectors.intersector16 = BVH8Triangle4iIntersector16HybridMoeller();561#endif562return intersectors;563}564case IntersectVariant::ROBUST:565{566Accel::Intersectors intersectors;567intersectors.ptr = bvh;568intersectors.intersector1 = BVH8Triangle4iIntersector1Pluecker();569#if defined (EMBREE_RAY_PACKETS)570intersectors.intersector4 = BVH8Triangle4iIntersector4HybridPluecker();571intersectors.intersector8 = BVH8Triangle4iIntersector8HybridPluecker();572intersectors.intersector16 = BVH8Triangle4iIntersector16HybridPluecker();573#endif574return intersectors;575}576}577return Accel::Intersectors();578}579580Accel::Intersectors BVH8Factory::BVH8Triangle4vMBIntersectors(BVH8* bvh, IntersectVariant ivariant)581{582switch (ivariant) {583case IntersectVariant::FAST:584{585Accel::Intersectors intersectors;586intersectors.ptr = bvh;587intersectors.intersector1 = BVH8Triangle4vMBIntersector1Moeller();588#if defined (EMBREE_RAY_PACKETS)589intersectors.intersector4 = BVH8Triangle4vMBIntersector4HybridMoeller();590intersectors.intersector8 = BVH8Triangle4vMBIntersector8HybridMoeller();591intersectors.intersector16 = BVH8Triangle4vMBIntersector16HybridMoeller();592#endif593return intersectors;594}595case IntersectVariant::ROBUST:596{597Accel::Intersectors intersectors;598intersectors.ptr = bvh;599intersectors.intersector1 = BVH8Triangle4vMBIntersector1Pluecker();600#if defined (EMBREE_RAY_PACKETS)601intersectors.intersector4 = BVH8Triangle4vMBIntersector4HybridPluecker();602intersectors.intersector8 = BVH8Triangle4vMBIntersector8HybridPluecker();603intersectors.intersector16 = BVH8Triangle4vMBIntersector16HybridPluecker();604#endif605return intersectors;606}607}608return Accel::Intersectors();609}610611Accel::Intersectors BVH8Factory::BVH8Triangle4iMBIntersectors(BVH8* bvh, IntersectVariant ivariant)612{613switch (ivariant) {614case IntersectVariant::FAST:615{616Accel::Intersectors intersectors;617intersectors.ptr = bvh;618intersectors.intersector1 = BVH8Triangle4iMBIntersector1Moeller();619#if defined (EMBREE_RAY_PACKETS)620intersectors.intersector4 = BVH8Triangle4iMBIntersector4HybridMoeller();621intersectors.intersector8 = BVH8Triangle4iMBIntersector8HybridMoeller();622intersectors.intersector16 = BVH8Triangle4iMBIntersector16HybridMoeller();623#endif624return intersectors;625}626case IntersectVariant::ROBUST:627{628Accel::Intersectors intersectors;629intersectors.ptr = bvh;630intersectors.intersector1 = BVH8Triangle4iMBIntersector1Pluecker();631#if defined (EMBREE_RAY_PACKETS)632intersectors.intersector4 = BVH8Triangle4iMBIntersector4HybridPluecker();633intersectors.intersector8 = BVH8Triangle4iMBIntersector8HybridPluecker();634intersectors.intersector16 = BVH8Triangle4iMBIntersector16HybridPluecker();635#endif636return intersectors;637}638}639return Accel::Intersectors();640}641642Accel::Intersectors BVH8Factory::BVH8Quad4vIntersectors(BVH8* bvh, IntersectVariant ivariant)643{644switch (ivariant) {645case IntersectVariant::FAST:646{647Accel::Intersectors intersectors;648intersectors.ptr = bvh;649intersectors.intersector1 = BVH8Quad4vIntersector1Moeller();650#if defined (EMBREE_RAY_PACKETS)651intersectors.intersector4_filter = BVH8Quad4vIntersector4HybridMoeller();652intersectors.intersector4_nofilter = BVH8Quad4vIntersector4HybridMoellerNoFilter();653intersectors.intersector8_filter = BVH8Quad4vIntersector8HybridMoeller();654intersectors.intersector8_nofilter = BVH8Quad4vIntersector8HybridMoellerNoFilter();655intersectors.intersector16_filter = BVH8Quad4vIntersector16HybridMoeller();656intersectors.intersector16_nofilter = BVH8Quad4vIntersector16HybridMoellerNoFilter();657#endif658return intersectors;659}660case IntersectVariant::ROBUST:661{662Accel::Intersectors intersectors;663intersectors.ptr = bvh;664intersectors.intersector1 = BVH8Quad4vIntersector1Pluecker();665#if defined (EMBREE_RAY_PACKETS)666intersectors.intersector4 = BVH8Quad4vIntersector4HybridPluecker();667intersectors.intersector8 = BVH8Quad4vIntersector8HybridPluecker();668intersectors.intersector16 = BVH8Quad4vIntersector16HybridPluecker();669#endif670return intersectors;671}672}673return Accel::Intersectors();674}675676Accel::Intersectors BVH8Factory::BVH8Quad4iIntersectors(BVH8* bvh, IntersectVariant ivariant)677{678switch (ivariant) {679case IntersectVariant::FAST:680{681Accel::Intersectors intersectors;682intersectors.ptr = bvh;683intersectors.intersector1 = BVH8Quad4iIntersector1Moeller();684#if defined (EMBREE_RAY_PACKETS)685intersectors.intersector4 = BVH8Quad4iIntersector4HybridMoeller();686intersectors.intersector8 = BVH8Quad4iIntersector8HybridMoeller();687intersectors.intersector16 = BVH8Quad4iIntersector16HybridMoeller();688#endif689return intersectors;690}691case IntersectVariant::ROBUST:692{693Accel::Intersectors intersectors;694intersectors.ptr = bvh;695intersectors.intersector1 = BVH8Quad4iIntersector1Pluecker();696#if defined (EMBREE_RAY_PACKETS)697intersectors.intersector4 = BVH8Quad4iIntersector4HybridPluecker();698intersectors.intersector8 = BVH8Quad4iIntersector8HybridPluecker();699intersectors.intersector16 = BVH8Quad4iIntersector16HybridPluecker();700#endif701return intersectors;702}703}704return Accel::Intersectors();705}706707Accel::Intersectors BVH8Factory::BVH8Quad4iMBIntersectors(BVH8* bvh, IntersectVariant ivariant)708{709switch (ivariant) {710case IntersectVariant::FAST:711{712Accel::Intersectors intersectors;713intersectors.ptr = bvh;714intersectors.intersector1 = BVH8Quad4iMBIntersector1Moeller();715#if defined (EMBREE_RAY_PACKETS)716intersectors.intersector4 = BVH8Quad4iMBIntersector4HybridMoeller();717intersectors.intersector8 = BVH8Quad4iMBIntersector8HybridMoeller();718intersectors.intersector16 = BVH8Quad4iMBIntersector16HybridMoeller();719#endif720return intersectors;721}722case IntersectVariant::ROBUST:723{724Accel::Intersectors intersectors;725intersectors.ptr = bvh;726intersectors.intersector1 = BVH8Quad4iMBIntersector1Pluecker();727#if defined (EMBREE_RAY_PACKETS)728intersectors.intersector4 = BVH8Quad4iMBIntersector4HybridPluecker();729intersectors.intersector8 = BVH8Quad4iMBIntersector8HybridPluecker();730intersectors.intersector16 = BVH8Quad4iMBIntersector16HybridPluecker();731#endif732return intersectors;733}734}735return Accel::Intersectors();736}737738Accel::Intersectors BVH8Factory::QBVH8Triangle4iIntersectors(BVH8* bvh)739{740Accel::Intersectors intersectors;741intersectors.ptr = bvh;742intersectors.intersector1 = QBVH8Triangle4iIntersector1Pluecker();743return intersectors;744}745746Accel::Intersectors BVH8Factory::QBVH8Triangle4Intersectors(BVH8* bvh)747{748Accel::Intersectors intersectors;749intersectors.ptr = bvh;750intersectors.intersector1 = QBVH8Triangle4Intersector1Moeller();751return intersectors;752}753754Accel::Intersectors BVH8Factory::QBVH8Quad4iIntersectors(BVH8* bvh)755{756Accel::Intersectors intersectors;757intersectors.ptr = bvh;758intersectors.intersector1 = QBVH8Quad4iIntersector1Pluecker();759return intersectors;760}761762Accel::Intersectors BVH8Factory::BVH8UserGeometryIntersectors(BVH8* bvh)763{764Accel::Intersectors intersectors;765intersectors.ptr = bvh;766intersectors.intersector1 = BVH8VirtualIntersector1();767#if defined (EMBREE_RAY_PACKETS)768intersectors.intersector4 = BVH8VirtualIntersector4Chunk();769intersectors.intersector8 = BVH8VirtualIntersector8Chunk();770intersectors.intersector16 = BVH8VirtualIntersector16Chunk();771#endif772intersectors.collider = BVH8ColliderUserGeom();773return intersectors;774}775776Accel::Intersectors BVH8Factory::BVH8UserGeometryMBIntersectors(BVH8* bvh)777{778Accel::Intersectors intersectors;779intersectors.ptr = bvh;780intersectors.intersector1 = BVH8VirtualMBIntersector1();781#if defined (EMBREE_RAY_PACKETS)782intersectors.intersector4 = BVH8VirtualMBIntersector4Chunk();783intersectors.intersector8 = BVH8VirtualMBIntersector8Chunk();784intersectors.intersector16 = BVH8VirtualMBIntersector16Chunk();785#endif786return intersectors;787}788789Accel::Intersectors BVH8Factory::BVH8InstanceIntersectors(BVH8* bvh)790{791Accel::Intersectors intersectors;792intersectors.ptr = bvh;793intersectors.intersector1 = BVH8InstanceIntersector1();794#if defined (EMBREE_RAY_PACKETS)795intersectors.intersector4 = BVH8InstanceIntersector4Chunk();796intersectors.intersector8 = BVH8InstanceIntersector8Chunk();797intersectors.intersector16 = BVH8InstanceIntersector16Chunk();798#endif799return intersectors;800}801802Accel::Intersectors BVH8Factory::BVH8InstanceArrayIntersectors(BVH8* bvh)803{804Accel::Intersectors intersectors;805intersectors.ptr = bvh;806intersectors.intersector1 = BVH8InstanceArrayIntersector1();807#if defined (EMBREE_RAY_PACKETS)808intersectors.intersector4 = BVH8InstanceArrayIntersector4Chunk();809intersectors.intersector8 = BVH8InstanceArrayIntersector8Chunk();810intersectors.intersector16 = BVH8InstanceArrayIntersector16Chunk();811#endif812return intersectors;813}814815Accel::Intersectors BVH8Factory::BVH8InstanceMBIntersectors(BVH8* bvh)816{817Accel::Intersectors intersectors;818intersectors.ptr = bvh;819intersectors.intersector1 = BVH8InstanceMBIntersector1();820#if defined (EMBREE_RAY_PACKETS)821intersectors.intersector4 = BVH8InstanceMBIntersector4Chunk();822intersectors.intersector8 = BVH8InstanceMBIntersector8Chunk();823intersectors.intersector16 = BVH8InstanceMBIntersector16Chunk();824#endif825return intersectors;826}827828Accel::Intersectors BVH8Factory::BVH8InstanceArrayMBIntersectors(BVH8* bvh)829{830Accel::Intersectors intersectors;831intersectors.ptr = bvh;832intersectors.intersector1 = BVH8InstanceArrayMBIntersector1();833#if defined (EMBREE_RAY_PACKETS)834intersectors.intersector4 = BVH8InstanceArrayMBIntersector4Chunk();835intersectors.intersector8 = BVH8InstanceArrayMBIntersector8Chunk();836intersectors.intersector16 = BVH8InstanceArrayMBIntersector16Chunk();837#endif838return intersectors;839}840841Accel* BVH8Factory::BVH8OBBVirtualCurve8v(Scene* scene, IntersectVariant ivariant)842{843BVH8* accel = new BVH8(Curve8v::type,scene);844Accel::Intersectors intersectors = BVH8OBBVirtualCurveIntersectors(accel,VirtualCurveIntersector8v(),ivariant);845Builder* builder = BVH8Curve8vBuilder_OBB_New(accel,scene,0);846return new AccelInstance(accel,builder,intersectors);847}848849Accel* BVH8Factory::BVH8OBBVirtualCurve8iMB(Scene* scene, IntersectVariant ivariant)850{851BVH8* accel = new BVH8(Curve8iMB::type,scene);852Accel::Intersectors intersectors = BVH8OBBVirtualCurveIntersectorsMB(accel,VirtualCurveIntersector8iMB(),ivariant);853Builder* builder = BVH8OBBCurve8iMBBuilder_OBB(accel,scene,0);854return new AccelInstance(accel,builder,intersectors);855}856857Accel* BVH8Factory::BVH8Triangle4(Scene* scene, BuildVariant bvariant, IntersectVariant ivariant)858{859BVH8* accel = new BVH8(Triangle4::type,scene);860Accel::Intersectors intersectors= BVH8Triangle4Intersectors(accel,ivariant);861Builder* builder = nullptr;862if (scene->device->tri_builder == "default") {863switch (bvariant) {864case BuildVariant::STATIC : builder = BVH8Triangle4SceneBuilderSAH(accel,scene,0); break;865case BuildVariant::DYNAMIC : builder = BVH8BuilderTwoLevelTriangle4MeshSAH(accel,scene,false); break;866case BuildVariant::HIGH_QUALITY: builder = BVH8Triangle4SceneBuilderFastSpatialSAH(accel,scene,0); break;867}868}869else if (scene->device->tri_builder == "sah" ) builder = BVH8Triangle4SceneBuilderSAH(accel,scene,0);870else if (scene->device->tri_builder == "sah_fast_spatial") builder = BVH8Triangle4SceneBuilderFastSpatialSAH(accel,scene,0);871else if (scene->device->tri_builder == "sah_presplit") builder = BVH8Triangle4SceneBuilderSAH(accel,scene,MODE_HIGH_QUALITY);872else if (scene->device->tri_builder == "dynamic" ) builder = BVH8BuilderTwoLevelTriangle4MeshSAH(accel,scene,false);873else if (scene->device->tri_builder == "morton" ) builder = BVH8BuilderTwoLevelTriangle4MeshSAH(accel,scene,true);874else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder "+scene->device->tri_builder+" for BVH8<Triangle4>");875876return new AccelInstance(accel,builder,intersectors);877}878879Accel* BVH8Factory::BVH8Triangle4v(Scene* scene, BuildVariant bvariant, IntersectVariant ivariant)880{881BVH8* accel = new BVH8(Triangle4v::type,scene);882Accel::Intersectors intersectors= BVH8Triangle4vIntersectors(accel,ivariant);883Builder* builder = nullptr;884if (scene->device->tri_builder == "default") {885switch (bvariant) {886case BuildVariant::STATIC : builder = BVH8Triangle4vSceneBuilderSAH(accel,scene,0); break;887case BuildVariant::DYNAMIC : builder = BVH8BuilderTwoLevelTriangle4vMeshSAH(accel,scene,false); break;888case BuildVariant::HIGH_QUALITY: builder = BVH8Triangle4vSceneBuilderFastSpatialSAH(accel,scene,0); break;889}890}891else if (scene->device->tri_builder == "sah_fast_spatial") builder = BVH8Triangle4SceneBuilderFastSpatialSAH(accel,scene,0);892else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder "+scene->device->tri_builder+" for BVH8<Triangle4v>");893return new AccelInstance(accel,builder,intersectors);894}895896Accel* BVH8Factory::BVH8Triangle4i(Scene* scene, BuildVariant bvariant, IntersectVariant ivariant)897{898BVH8* accel = new BVH8(Triangle4i::type,scene);899Accel::Intersectors intersectors = BVH8Triangle4iIntersectors(accel,ivariant);900901Builder* builder = nullptr;902if (scene->device->tri_builder == "default") {903switch (bvariant) {904case BuildVariant::STATIC : builder = BVH8Triangle4iSceneBuilderSAH(accel,scene,0); break;905case BuildVariant::DYNAMIC : builder = BVH8BuilderTwoLevelTriangle4iMeshSAH(accel,scene,false); break;906case BuildVariant::HIGH_QUALITY: assert(false); break; // FIXME: implement907}908}909else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder "+scene->device->tri_builder+" for BVH8<Triangle4i>");910911return new AccelInstance(accel,builder,intersectors);912}913914Accel* BVH8Factory::BVH8Triangle4iMB(Scene* scene, BuildVariant bvariant, IntersectVariant ivariant)915{916BVH8* accel = new BVH8(Triangle4i::type,scene);917Accel::Intersectors intersectors = BVH8Triangle4iMBIntersectors(accel,ivariant);918919Builder* builder = nullptr;920if (scene->device->tri_builder_mb == "default") { // FIXME: implement921switch (bvariant) {922case BuildVariant::STATIC : builder = BVH8Triangle4iMBSceneBuilderSAH(accel,scene,0); break;923case BuildVariant::DYNAMIC : assert(false); break; // FIXME: implement924case BuildVariant::HIGH_QUALITY: assert(false); break;925}926}927else if (scene->device->tri_builder_mb == "internal_time_splits") builder = BVH8Triangle4iMBSceneBuilderSAH(accel,scene,0);928else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder "+scene->device->tri_builder_mb+" for BVH8<Triangle4iMB>");929930return new AccelInstance(accel,builder,intersectors);931}932933Accel* BVH8Factory::BVH8Triangle4vMB(Scene* scene, BuildVariant bvariant, IntersectVariant ivariant)934{935BVH8* accel = new BVH8(Triangle4vMB::type,scene);936Accel::Intersectors intersectors= BVH8Triangle4vMBIntersectors(accel,ivariant);937938Builder* builder = nullptr;939if (scene->device->tri_builder_mb == "default") {940switch (bvariant) {941case BuildVariant::STATIC : builder = BVH8Triangle4vMBSceneBuilderSAH(accel,scene,0); break;942case BuildVariant::DYNAMIC : assert(false); break; // FIXME: implement943case BuildVariant::HIGH_QUALITY: assert(false); break;944}945}946else if (scene->device->tri_builder_mb == "internal_time_splits") builder = BVH8Triangle4vMBSceneBuilderSAH(accel,scene,0);947else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder "+scene->device->tri_builder_mb+" for BVH8<Triangle4vMB>");948949return new AccelInstance(accel,builder,intersectors);950}951952Accel* BVH8Factory::BVH8QuantizedTriangle4i(Scene* scene)953{954BVH8* accel = new BVH8(Triangle4i::type,scene);955Accel::Intersectors intersectors = QBVH8Triangle4iIntersectors(accel);956Builder* builder = BVH8QuantizedTriangle4iSceneBuilderSAH(accel,scene,0);957return new AccelInstance(accel,builder,intersectors);958}959960Accel* BVH8Factory::BVH8QuantizedTriangle4(Scene* scene)961{962BVH8* accel = new BVH8(Triangle4::type,scene);963Accel::Intersectors intersectors = QBVH8Triangle4Intersectors(accel);964Builder* builder = BVH8QuantizedTriangle4SceneBuilderSAH(accel,scene,0);965return new AccelInstance(accel,builder,intersectors);966}967968Accel* BVH8Factory::BVH8Quad4v(Scene* scene, BuildVariant bvariant, IntersectVariant ivariant)969{970BVH8* accel = new BVH8(Quad4v::type,scene);971Accel::Intersectors intersectors = BVH8Quad4vIntersectors(accel,ivariant);972973Builder* builder = nullptr;974if (scene->device->quad_builder == "default") {975switch (bvariant) {976case BuildVariant::STATIC : builder = BVH8Quad4vSceneBuilderSAH(accel,scene,0); break;977case BuildVariant::DYNAMIC : builder = BVH8BuilderTwoLevelQuadMeshSAH(accel,scene,false); break;978case BuildVariant::HIGH_QUALITY: builder = BVH8Quad4vSceneBuilderFastSpatialSAH(accel,scene,0); break;979}980}981else if (scene->device->quad_builder == "dynamic" ) builder = BVH8BuilderTwoLevelQuadMeshSAH(accel,scene,false);982else if (scene->device->quad_builder == "morton" ) builder = BVH8BuilderTwoLevelQuadMeshSAH(accel,scene,true);983else if (scene->device->quad_builder == "sah_fast_spatial" ) builder = BVH8Quad4vSceneBuilderFastSpatialSAH(accel,scene,0);984else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder "+scene->device->quad_builder+" for BVH8<Quad4v>");985986return new AccelInstance(accel,builder,intersectors);987}988989Accel* BVH8Factory::BVH8Quad4i(Scene* scene, BuildVariant bvariant, IntersectVariant ivariant)990{991BVH8* accel = new BVH8(Quad4i::type,scene);992Accel::Intersectors intersectors = BVH8Quad4iIntersectors(accel,ivariant);993994Builder* builder = nullptr;995if (scene->device->quad_builder == "default") {996switch (bvariant) {997case BuildVariant::STATIC : builder = BVH8Quad4iSceneBuilderSAH(accel,scene,0); break;998case BuildVariant::DYNAMIC : assert(false); break; // FIXME: implement999case BuildVariant::HIGH_QUALITY: assert(false); break; // FIXME: implement1000}1001}1002else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder "+scene->device->quad_builder+" for BVH8<Quad4i>");10031004return new AccelInstance(accel,builder,intersectors);1005}10061007Accel* BVH8Factory::BVH8Quad4iMB(Scene* scene, BuildVariant bvariant, IntersectVariant ivariant)1008{1009BVH8* accel = new BVH8(Quad4i::type,scene);1010Accel::Intersectors intersectors = BVH8Quad4iMBIntersectors(accel,ivariant);10111012Builder* builder = nullptr;1013if (scene->device->quad_builder_mb == "default") {1014switch (bvariant) {1015case BuildVariant::STATIC : builder = BVH8Quad4iMBSceneBuilderSAH(accel,scene,0); break;1016case BuildVariant::DYNAMIC : assert(false); break; // FIXME: implement1017case BuildVariant::HIGH_QUALITY: assert(false); break;1018}1019}1020else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder "+scene->device->quad_builder_mb+" for BVH8<Quad4i>");10211022return new AccelInstance(accel,builder,intersectors);1023}10241025Accel* BVH8Factory::BVH8QuantizedQuad4i(Scene* scene)1026{1027BVH8* accel = new BVH8(Quad4i::type,scene);1028Accel::Intersectors intersectors = QBVH8Quad4iIntersectors(accel);1029Builder* builder = nullptr;1030if (scene->device->quad_builder == "default" ) builder = BVH8QuantizedQuad4iSceneBuilderSAH(accel,scene,0);1031else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder "+scene->device->quad_builder+" for QBVH8<Quad4i>");1032return new AccelInstance(accel,builder,intersectors);1033}10341035Accel* BVH8Factory::BVH8UserGeometry(Scene* scene, BuildVariant bvariant)1036{1037BVH8* accel = new BVH8(Object::type,scene);1038Accel::Intersectors intersectors = BVH8UserGeometryIntersectors(accel);10391040Builder* builder = nullptr;1041if (scene->device->object_builder == "default") {1042switch (bvariant) {1043case BuildVariant::STATIC : builder = BVH8VirtualSceneBuilderSAH(accel,scene,0); break;1044case BuildVariant::DYNAMIC : builder = BVH8BuilderTwoLevelVirtualSAH(accel,scene,false); break;1045case BuildVariant::HIGH_QUALITY: assert(false); break;1046}1047}1048else if (scene->device->object_builder == "sah") builder = BVH8VirtualSceneBuilderSAH(accel,scene,0);1049else if (scene->device->object_builder == "dynamic") builder = BVH8BuilderTwoLevelVirtualSAH(accel,scene,false);1050else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder "+scene->device->object_builder+" for BVH8<Object>");10511052return new AccelInstance(accel,builder,intersectors);1053}10541055Accel* BVH8Factory::BVH8UserGeometryMB(Scene* scene)1056{1057BVH8* accel = new BVH8(Object::type,scene);1058Accel::Intersectors intersectors = BVH8UserGeometryMBIntersectors(accel);1059Builder* builder = BVH8VirtualMBSceneBuilderSAH(accel,scene,0);1060return new AccelInstance(accel,builder,intersectors);1061}10621063Accel* BVH8Factory::BVH8Instance(Scene* scene, bool isExpensive, BuildVariant bvariant)1064{1065BVH8* accel = new BVH8(InstancePrimitive::type,scene);1066Accel::Intersectors intersectors = BVH8InstanceIntersectors(accel);1067auto gtype = isExpensive ? Geometry::MTY_INSTANCE_EXPENSIVE : Geometry::MTY_INSTANCE;1068// Builder* builder = BVH8InstanceSceneBuilderSAH(accel,scene,gtype);10691070Builder* builder = nullptr;1071if (scene->device->object_builder == "default") {1072switch (bvariant) {1073case BuildVariant::STATIC : builder = BVH8InstanceSceneBuilderSAH(accel,scene,gtype);; break;1074case BuildVariant::DYNAMIC : builder = BVH8BuilderTwoLevelInstanceSAH(accel,scene,gtype,false); break;1075case BuildVariant::HIGH_QUALITY: assert(false); break;1076}1077}1078else if (scene->device->object_builder == "sah") builder = BVH8InstanceSceneBuilderSAH(accel,scene,gtype);1079else if (scene->device->object_builder == "dynamic") builder = BVH8BuilderTwoLevelInstanceSAH(accel,scene,gtype,false);1080else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder "+scene->device->object_builder+" for BVH8<Object>");10811082return new AccelInstance(accel,builder,intersectors);1083}10841085Accel* BVH8Factory::BVH8InstanceArray(Scene* scene, BuildVariant bvariant)1086{1087BVH8* accel = new BVH8(InstanceArrayPrimitive::type,scene);1088Accel::Intersectors intersectors = BVH8InstanceArrayIntersectors(accel);1089auto gtype = Geometry::MTY_INSTANCE_ARRAY;1090// Builder* builder = BVH8InstanceSceneBuilderSAH(accel,scene,gtype);10911092Builder* builder = nullptr;1093if (scene->device->object_builder == "default") {1094switch (bvariant) {1095case BuildVariant::STATIC : builder = BVH8InstanceArraySceneBuilderSAH(accel,scene,gtype); break;1096case BuildVariant::DYNAMIC : builder = BVH8BuilderTwoLevelInstanceArraySAH(accel,scene,gtype,false); break;1097case BuildVariant::HIGH_QUALITY: assert(false); break;1098}1099}1100else if (scene->device->object_builder == "sah") builder = BVH8InstanceArraySceneBuilderSAH(accel,scene,gtype);1101else if (scene->device->object_builder == "dynamic") builder = BVH8BuilderTwoLevelInstanceArraySAH(accel,scene,gtype,false);1102else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder "+scene->device->object_builder+" for BVH8<Object>");11031104return new AccelInstance(accel,builder,intersectors);1105}11061107Accel* BVH8Factory::BVH8InstanceMB(Scene* scene, bool isExpensive)1108{1109BVH8* accel = new BVH8(InstancePrimitive::type,scene);1110Accel::Intersectors intersectors = BVH8InstanceMBIntersectors(accel);1111auto gtype = isExpensive ? Geometry::MTY_INSTANCE_EXPENSIVE : Geometry::MTY_INSTANCE;1112Builder* builder = BVH8InstanceMBSceneBuilderSAH(accel,scene,gtype);1113return new AccelInstance(accel,builder,intersectors);1114}11151116Accel* BVH8Factory::BVH8InstanceArrayMB(Scene* scene)1117{1118BVH8* accel = new BVH8(InstanceArrayPrimitive::type,scene);1119Accel::Intersectors intersectors = BVH8InstanceArrayMBIntersectors(accel);1120auto gtype = Geometry::MTY_INSTANCE_ARRAY;1121Builder* builder = BVH8InstanceArrayMBSceneBuilderSAH(accel,scene,gtype);1122return new AccelInstance(accel,builder,intersectors);1123}11241125Accel::Intersectors BVH8Factory::BVH8GridIntersectors(BVH8* bvh, IntersectVariant ivariant)1126{1127Accel::Intersectors intersectors;1128intersectors.ptr = bvh;1129if (ivariant == IntersectVariant::FAST)1130{1131intersectors.intersector1 = BVH8GridIntersector1Moeller();1132#if defined (EMBREE_RAY_PACKETS)1133intersectors.intersector4 = BVH8GridIntersector4HybridMoeller();1134intersectors.intersector8 = BVH8GridIntersector8HybridMoeller();1135intersectors.intersector16 = BVH8GridIntersector16HybridMoeller();1136#endif1137}1138else /* if (ivariant == IntersectVariant::ROBUST) */1139{1140intersectors.intersector1 = BVH8GridIntersector1Pluecker();1141#if defined (EMBREE_RAY_PACKETS)1142intersectors.intersector4 = BVH8GridIntersector4HybridPluecker();1143intersectors.intersector8 = BVH8GridIntersector8HybridPluecker();1144intersectors.intersector16 = BVH8GridIntersector16HybridPluecker();1145#endif1146}1147return intersectors;1148}11491150Accel::Intersectors BVH8Factory::BVH8GridMBIntersectors(BVH8* bvh, IntersectVariant ivariant)1151{1152Accel::Intersectors intersectors;1153intersectors.ptr = bvh;1154intersectors.intersector1 = BVH8GridMBIntersector1Moeller();1155#if defined (EMBREE_RAY_PACKETS)1156intersectors.intersector4 = nullptr;1157intersectors.intersector8 = nullptr;1158intersectors.intersector16 = nullptr;1159#endif1160return intersectors;1161}11621163Accel* BVH8Factory::BVH8Grid(Scene* scene, BuildVariant bvariant, IntersectVariant ivariant)1164{1165BVH8* accel = new BVH8(SubGridQBVH8::type,scene);1166Accel::Intersectors intersectors = BVH8GridIntersectors(accel,ivariant);1167Builder* builder = nullptr;1168if (scene->device->grid_builder == "default") {1169builder = BVH8GridSceneBuilderSAH(accel,scene,0);1170}1171else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder "+scene->device->object_builder+" for BVH4<GridMesh>");11721173return new AccelInstance(accel,builder,intersectors);1174}11751176Accel* BVH8Factory::BVH8GridMB(Scene* scene, BuildVariant bvariant, IntersectVariant ivariant)1177{1178BVH8* accel = new BVH8(SubGridQBVH8::type,scene);1179Accel::Intersectors intersectors = BVH8GridMBIntersectors(accel,ivariant);1180Builder* builder = nullptr;1181if (scene->device->grid_builder_mb == "default") {1182builder = BVH8GridMBSceneBuilderSAH(accel,scene,0);1183}1184else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder "+scene->device->object_builder+" for BVH8MB<GridMesh>");1185return new AccelInstance(accel,builder,intersectors);1186}1187}11881189#endif119011911192