summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
author风青山 <idleman@yeah.net>2023-09-28 20:13:56 +0800
committer风青山 <idleman@yeah.net>2023-09-28 20:27:51 +0800
commite705aa4550b433461f670868342b757b864d1013 (patch)
tree3424977d06e704d997a627bd4dbf55d4b3d621fc
parent4c3dc26367518e006f8555c12f5d2df0b8a28192 (diff)
downloadredot-engine-e705aa4550b433461f670868342b757b864d1013.tar.gz
Fix not refitting upward from leaf nodes.
Previously, the wrong node id (root node id) was used. Dirty leaf nodes do not actually recalculate aabb. Additionally, when requesting a new leaf, mark `dirty` as `false` in `clear()`. Make sure to only mark the leaf as **dirty** when shrinking the border of the leaf when removing items. In other cases, the leaf node's aabb will get the correct result immediately. 1. When adding an item, the leaf nodes will be calculated immediately. 2. Removing the item within the border of the leaf node has no effect on the original aabb.
-rw-r--r--core/math/bvh_refit.inc2
-rw-r--r--core/math/bvh_structs.inc2
2 files changed, 2 insertions, 2 deletions
diff --git a/core/math/bvh_refit.inc b/core/math/bvh_refit.inc
index 717a3438c7..b20b805bb0 100644
--- a/core/math/bvh_refit.inc
+++ b/core/math/bvh_refit.inc
@@ -134,7 +134,7 @@ void refit_branch(uint32_t p_node_id) {
TLeaf &leaf = _node_get_leaf(tnode);
if (leaf.is_dirty()) {
leaf.set_dirty(false);
- refit_upward(p_node_id);
+ refit_upward(rp.node_id);
}
}
} // while more nodes to pop
diff --git a/core/math/bvh_structs.inc b/core/math/bvh_structs.inc
index 06f6e5d05d..d40c631ce2 100644
--- a/core/math/bvh_structs.inc
+++ b/core/math/bvh_structs.inc
@@ -83,7 +83,7 @@ public:
void clear() {
num_items = 0;
- set_dirty(true);
+ set_dirty(false);
}
bool is_full() const { return num_items >= MAX_ITEMS; }