mirror of
https://github.com/godotengine/godot.git
synced 2024-12-27 11:24:59 +08:00
3877ed73d0
Port lawnjelly's dynamic BVH implementation from 3.x to be used in both 2D and 3D broadphases. Removed alternative broadphase implementations which are not meant to be used anymore since they are much slower. Includes changes in Rect2, Vector2, Vector3 that help with the template implementation of the dynamic BVH by uniformizing the interface between 2D and 3D math. Co-authored-by: lawnjelly <lawnjelly@gmail.com>
56 lines
1.1 KiB
C++
56 lines
1.1 KiB
C++
|
|
int _handle_get_tree_id(BVHHandle p_handle) const {
|
|
if (USE_PAIRS) {
|
|
int tree = 0;
|
|
if (_extra[p_handle.id()].pairable) {
|
|
tree = 1;
|
|
}
|
|
return tree;
|
|
}
|
|
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:
|