123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- // 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;
- };
- }
- }
|