initial commit, 4.5 stable
Some checks failed
🔗 GHA / 📊 Static checks (push) Has been cancelled
🔗 GHA / 🤖 Android (push) Has been cancelled
🔗 GHA / 🍏 iOS (push) Has been cancelled
🔗 GHA / 🐧 Linux (push) Has been cancelled
🔗 GHA / 🍎 macOS (push) Has been cancelled
🔗 GHA / 🏁 Windows (push) Has been cancelled
🔗 GHA / 🌐 Web (push) Has been cancelled
Some checks failed
🔗 GHA / 📊 Static checks (push) Has been cancelled
🔗 GHA / 🤖 Android (push) Has been cancelled
🔗 GHA / 🍏 iOS (push) Has been cancelled
🔗 GHA / 🐧 Linux (push) Has been cancelled
🔗 GHA / 🍎 macOS (push) Has been cancelled
🔗 GHA / 🏁 Windows (push) Has been cancelled
🔗 GHA / 🌐 Web (push) Has been cancelled
This commit is contained in:
95
thirdparty/embree/kernels/bvh/bvh_refit.h
vendored
Normal file
95
thirdparty/embree/kernels/bvh/bvh_refit.h
vendored
Normal file
@@ -0,0 +1,95 @@
|
||||
// Copyright 2009-2021 Intel Corporation
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "../bvh/bvh.h"
|
||||
|
||||
namespace embree
|
||||
{
|
||||
namespace isa
|
||||
{
|
||||
template<int N>
|
||||
class BVHNRefitter
|
||||
{
|
||||
public:
|
||||
|
||||
/*! Type shortcuts */
|
||||
typedef BVHN<N> BVH;
|
||||
typedef typename BVH::AABBNode AABBNode;
|
||||
typedef typename BVH::NodeRef NodeRef;
|
||||
|
||||
struct LeafBoundsInterface {
|
||||
virtual const BBox3fa leafBounds(NodeRef& ref) const = 0;
|
||||
};
|
||||
|
||||
public:
|
||||
|
||||
/*! Constructor. */
|
||||
BVHNRefitter (BVH* bvh, const LeafBoundsInterface& leafBounds);
|
||||
|
||||
/*! refits the BVH */
|
||||
void refit();
|
||||
|
||||
private:
|
||||
/* single-threaded subtree extraction based on BVH depth */
|
||||
void gather_subtree_refs(NodeRef& ref,
|
||||
size_t &subtrees,
|
||||
const size_t depth = 0);
|
||||
|
||||
/* single-threaded top-level refit */
|
||||
BBox3fa refit_toplevel(NodeRef& ref,
|
||||
size_t &subtrees,
|
||||
const BBox3fa *const subTreeBounds,
|
||||
const size_t depth = 0);
|
||||
|
||||
/* single-threaded subtree refit */
|
||||
BBox3fa recurse_bottom(NodeRef& ref);
|
||||
|
||||
public:
|
||||
BVH* bvh; //!< BVH to refit
|
||||
const LeafBoundsInterface& leafBounds; //!< calculates bounds of leaves
|
||||
|
||||
static const size_t MAX_SUB_TREE_EXTRACTION_DEPTH = (N==4) ? 4 : (N==8) ? 3 : 3;
|
||||
static const size_t MAX_NUM_SUB_TREES = (N==4) ? 256 : (N==8) ? 512 : N*N*N; // N ^ MAX_SUB_TREE_EXTRACTION_DEPTH
|
||||
size_t numSubTrees;
|
||||
NodeRef subTrees[MAX_NUM_SUB_TREES];
|
||||
};
|
||||
|
||||
template<int N, typename Mesh, typename Primitive>
|
||||
class BVHNRefitT : public Builder, public BVHNRefitter<N>::LeafBoundsInterface
|
||||
{
|
||||
public:
|
||||
|
||||
/*! Type shortcuts */
|
||||
typedef BVHN<N> BVH;
|
||||
typedef typename BVH::AABBNode AABBNode;
|
||||
typedef typename BVH::NodeRef NodeRef;
|
||||
|
||||
public:
|
||||
BVHNRefitT (BVH* bvh, Builder* builder, Mesh* mesh, size_t mode);
|
||||
|
||||
virtual void build();
|
||||
|
||||
virtual void clear();
|
||||
|
||||
virtual const BBox3fa leafBounds (NodeRef& ref) const
|
||||
{
|
||||
size_t num; char* prim = ref.leaf(num);
|
||||
if (unlikely(ref == BVH::emptyNode)) return empty;
|
||||
|
||||
BBox3fa bounds = empty;
|
||||
for (size_t i=0; i<num; i++)
|
||||
bounds.extend(((Primitive*)prim)[i].update(mesh));
|
||||
return bounds;
|
||||
}
|
||||
|
||||
private:
|
||||
BVH* bvh;
|
||||
std::unique_ptr<Builder> builder;
|
||||
std::unique_ptr<BVHNRefitter<N>> refitter;
|
||||
Mesh* mesh;
|
||||
unsigned int topologyVersion;
|
||||
};
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user