dc14636e68
Refactors the BVH to make it more generic and customizable. Instead of hard coding the system of pairable_mask and pairable_type into the BVH, this information is no longer stored internally, and instead the BVH uses callbacks both for determining whether pairs of objects can pair with each other, and for filtering cull / intersection tests. In addition, instead of hard coding the number of trees, the BVH now supports up to 32 trees, and each object can supply a tree collision mask to determine which trees it can collide against. This enables the BVH to scale to either the two or 3 trees needed in physics, and the single tree used without pairing in Godot 4 render tree.
51 lines
1.1 KiB
C++
51 lines
1.1 KiB
C++
|
|
int _handle_get_tree_id(BVHHandle p_handle) const {
|
|
if (USE_PAIRS) {
|
|
return _extra[p_handle.id()].tree_id;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
public:
|
|
void _handle_sort(BVHHandle &p_ha, BVHHandle &p_hb) const {
|
|
if (p_ha.id() > p_hb.id()) {
|
|
BVHHandle temp = p_hb;
|
|
p_hb = p_ha;
|
|
p_ha = temp;
|
|
}
|
|
}
|
|
|
|
private:
|
|
void create_root_node(int p_tree) {
|
|
// if there is no root node, create one
|
|
if (_root_node_id[p_tree] == BVHCommon::INVALID) {
|
|
uint32_t root_node_id;
|
|
TNode *node = _nodes.request(root_node_id);
|
|
node->clear();
|
|
_root_node_id[p_tree] = root_node_id;
|
|
|
|
// make the root node a leaf
|
|
uint32_t leaf_id;
|
|
TLeaf *leaf = _leaves.request(leaf_id);
|
|
leaf->clear();
|
|
node->neg_leaf_id = -(int)leaf_id;
|
|
}
|
|
}
|
|
|
|
bool node_is_leaf_full(TNode &tnode) const {
|
|
const TLeaf &leaf = _node_get_leaf(tnode);
|
|
return leaf.is_full();
|
|
}
|
|
|
|
public:
|
|
TLeaf &_node_get_leaf(TNode &tnode) {
|
|
BVH_ASSERT(tnode.is_leaf());
|
|
return _leaves[tnode.get_leaf_id()];
|
|
}
|
|
|
|
const TLeaf &_node_get_leaf(const TNode &tnode) const {
|
|
BVH_ASSERT(tnode.is_leaf());
|
|
return _leaves[tnode.get_leaf_id()];
|
|
}
|
|
|
|
private:
|