2021-05-20 12:49:33 +02:00
|
|
|
// Copyright 2009-2021 Intel Corporation
|
2020-12-19 14:50:20 +01:00
|
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
|
|
|
|
#include "bvh.h"
|
|
|
|
#include "../builders/bvh_builder_sah.h"
|
2021-05-20 12:49:33 +02:00
|
|
|
#include "../builders/bvh_builder_msmblur.h"
|
2020-12-19 14:50:20 +01:00
|
|
|
|
|
|
|
namespace embree
|
|
|
|
{
|
|
|
|
namespace isa
|
|
|
|
{
|
|
|
|
/************************************************************************************/
|
|
|
|
/************************************************************************************/
|
|
|
|
/************************************************************************************/
|
|
|
|
/************************************************************************************/
|
|
|
|
|
|
|
|
template<int N>
|
|
|
|
struct BVHNBuilderVirtual
|
|
|
|
{
|
|
|
|
typedef BVHN<N> BVH;
|
|
|
|
typedef typename BVH::NodeRef NodeRef;
|
|
|
|
typedef FastAllocator::CachedAllocator Allocator;
|
|
|
|
|
|
|
|
struct BVHNBuilderV {
|
|
|
|
NodeRef build(FastAllocator* allocator, BuildProgressMonitor& progress, PrimRef* prims, const PrimInfo& pinfo, GeneralBVHBuilder::Settings settings);
|
|
|
|
virtual NodeRef createLeaf (const PrimRef* prims, const range<size_t>& set, const Allocator& alloc) = 0;
|
|
|
|
};
|
|
|
|
|
|
|
|
template<typename CreateLeafFunc>
|
|
|
|
struct BVHNBuilderT : public BVHNBuilderV
|
|
|
|
{
|
|
|
|
BVHNBuilderT (CreateLeafFunc createLeafFunc)
|
|
|
|
: createLeafFunc(createLeafFunc) {}
|
|
|
|
|
|
|
|
NodeRef createLeaf (const PrimRef* prims, const range<size_t>& set, const Allocator& alloc) {
|
|
|
|
return createLeafFunc(prims,set,alloc);
|
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
|
|
|
CreateLeafFunc createLeafFunc;
|
|
|
|
};
|
|
|
|
|
|
|
|
template<typename CreateLeafFunc>
|
|
|
|
static NodeRef build(FastAllocator* allocator, CreateLeafFunc createLeaf, BuildProgressMonitor& progress, PrimRef* prims, const PrimInfo& pinfo, GeneralBVHBuilder::Settings settings) {
|
|
|
|
return BVHNBuilderT<CreateLeafFunc>(createLeaf).build(allocator,progress,prims,pinfo,settings);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
template<int N>
|
|
|
|
struct BVHNBuilderQuantizedVirtual
|
|
|
|
{
|
|
|
|
typedef BVHN<N> BVH;
|
|
|
|
typedef typename BVH::NodeRef NodeRef;
|
|
|
|
typedef FastAllocator::CachedAllocator Allocator;
|
|
|
|
|
|
|
|
struct BVHNBuilderV {
|
|
|
|
NodeRef build(FastAllocator* allocator, BuildProgressMonitor& progress, PrimRef* prims, const PrimInfo& pinfo, GeneralBVHBuilder::Settings settings);
|
|
|
|
virtual NodeRef createLeaf (const PrimRef* prims, const range<size_t>& set, const Allocator& alloc) = 0;
|
|
|
|
};
|
|
|
|
|
|
|
|
template<typename CreateLeafFunc>
|
|
|
|
struct BVHNBuilderT : public BVHNBuilderV
|
|
|
|
{
|
|
|
|
BVHNBuilderT (CreateLeafFunc createLeafFunc)
|
|
|
|
: createLeafFunc(createLeafFunc) {}
|
|
|
|
|
|
|
|
NodeRef createLeaf (const PrimRef* prims, const range<size_t>& set, const Allocator& alloc) {
|
|
|
|
return createLeafFunc(prims,set,alloc);
|
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
|
|
|
CreateLeafFunc createLeafFunc;
|
|
|
|
};
|
|
|
|
|
|
|
|
template<typename CreateLeafFunc>
|
|
|
|
static NodeRef build(FastAllocator* allocator, CreateLeafFunc createLeaf, BuildProgressMonitor& progress, PrimRef* prims, const PrimInfo& pinfo, GeneralBVHBuilder::Settings settings) {
|
|
|
|
return BVHNBuilderT<CreateLeafFunc>(createLeaf).build(allocator,progress,prims,pinfo,settings);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
template<int N>
|
|
|
|
struct BVHNBuilderMblurVirtual
|
|
|
|
{
|
|
|
|
typedef BVHN<N> BVH;
|
|
|
|
typedef typename BVH::AABBNodeMB AABBNodeMB;
|
|
|
|
typedef typename BVH::NodeRef NodeRef;
|
|
|
|
typedef typename BVH::NodeRecordMB NodeRecordMB;
|
|
|
|
typedef FastAllocator::CachedAllocator Allocator;
|
|
|
|
|
|
|
|
struct BVHNBuilderV {
|
|
|
|
NodeRecordMB build(FastAllocator* allocator, BuildProgressMonitor& progress, PrimRef* prims, const PrimInfo& pinfo, GeneralBVHBuilder::Settings settings, const BBox1f& timeRange);
|
|
|
|
virtual NodeRecordMB createLeaf (const PrimRef* prims, const range<size_t>& set, const Allocator& alloc) = 0;
|
|
|
|
};
|
|
|
|
|
|
|
|
template<typename CreateLeafFunc>
|
|
|
|
struct BVHNBuilderT : public BVHNBuilderV
|
|
|
|
{
|
|
|
|
BVHNBuilderT (CreateLeafFunc createLeafFunc)
|
|
|
|
: createLeafFunc(createLeafFunc) {}
|
|
|
|
|
|
|
|
NodeRecordMB createLeaf (const PrimRef* prims, const range<size_t>& set, const Allocator& alloc) {
|
|
|
|
return createLeafFunc(prims,set,alloc);
|
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
|
|
|
CreateLeafFunc createLeafFunc;
|
|
|
|
};
|
|
|
|
|
|
|
|
template<typename CreateLeafFunc>
|
|
|
|
static NodeRecordMB build(FastAllocator* allocator, CreateLeafFunc createLeaf, BuildProgressMonitor& progress, PrimRef* prims, const PrimInfo& pinfo, GeneralBVHBuilder::Settings settings, const BBox1f& timeRange) {
|
|
|
|
return BVHNBuilderT<CreateLeafFunc>(createLeaf).build(allocator,progress,prims,pinfo,settings,timeRange);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|
|
|
|
}
|