virtualx-engine/core/math/bvh_integrity.inc
lawnjelly 690e07b509 Dynamic BVH for rendering and godot physics
Complete rewrite of spatial partitioning using a bounding volume hierarchy rather than octree.

Switchable in project settings between using octree or BVH for rendering and physics.
2021-01-12 12:12:10 +00:00

42 lines
922 B
C++

void _integrity_check_all() {
#ifdef BVH_INTEGRITY_CHECKS
for (int n = 0; n < NUM_TREES; n++) {
uint32_t root = _root_node_id[n];
if (root != BVHCommon::INVALID) {
_integrity_check_down(root);
}
}
#endif
}
void _integrity_check_up(uint32_t p_node_id) {
TNode &node = _nodes[p_node_id];
BVH_ABB abb = node.aabb;
node_update_aabb(node);
BVH_ABB abb2 = node.aabb;
abb2.expand(-_node_expansion);
CRASH_COND(!abb.is_other_within(abb2));
}
void _integrity_check_down(uint32_t p_node_id) {
const TNode &node = _nodes[p_node_id];
if (node.is_leaf()) {
_integrity_check_up(p_node_id);
} else {
CRASH_COND(node.num_children != 2);
for (int n = 0; n < node.num_children; n++) {
uint32_t child_id = node.children[n];
// check the children parent pointers are correct
TNode &child = _nodes[child_id];
CRASH_COND(child.parent_id != p_node_id);
_integrity_check_down(child_id);
}
}
}