summaryrefslogtreecommitdiff
path: root/core/math/bvh_integrity.inc
blob: 02e9d30097d1a672fe0749c312e7550e0e59dee1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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];

	BVHABB_CLASS abb = node.aabb;
	node_update_aabb(node);

	BVHABB_CLASS 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);
		}
	}
}