diff --git a/core/math/dynamic_bvh.cpp b/core/math/dynamic_bvh.cpp index 5f87f75b61e8..a53f8d1eb8e3 100644 --- a/core/math/dynamic_bvh.cpp +++ b/core/math/dynamic_bvh.cpp @@ -354,10 +354,17 @@ void DynamicBVH::_update(Node *leaf, int lookahead) { void DynamicBVH::update(const ID &p_id, const AABB &p_box) { ERR_FAIL_COND(!p_id.is_valid()); Node *leaf = p_id.node; - Node *base = _remove_leaf(leaf); + Volume volume; volume.min = p_box.position; volume.max = p_box.position + p_box.size; + + if ((leaf->volume.min == volume.min) && (leaf->volume.max == volume.max)) { + // noop + return; + } + + Node *base = _remove_leaf(leaf); if (base) { if (lkhd >= 0) { for (int i = 0; (i < lkhd) && base->parent; ++i) { diff --git a/servers/rendering/renderer_scene_cull.cpp b/servers/rendering/renderer_scene_cull.cpp index 1db678a441f3..8bb9e6b8b07f 100644 --- a/servers/rendering/renderer_scene_cull.cpp +++ b/servers/rendering/renderer_scene_cull.cpp @@ -1070,9 +1070,15 @@ void RendererSceneCull::_update_instance(Instance *p_instance) { if (!p_instance->indexer_id.is_valid()) { if ((1 << p_instance->base_type) & RS::INSTANCE_GEOMETRY_MASK) { - p_instance->indexer_id = p_instance->scenario->indexers[Scenario::INDEXER_GEOMETRY].insert(p_instance->aabb, p_instance); + p_instance->indexer_id = p_instance->scenario->indexers[Scenario::INDEXER_GEOMETRY].insert(p_instance->transformed_aabb, p_instance); } else { - p_instance->indexer_id = p_instance->scenario->indexers[Scenario::INDEXER_VOLUMES].insert(p_instance->aabb, p_instance); + p_instance->indexer_id = p_instance->scenario->indexers[Scenario::INDEXER_VOLUMES].insert(p_instance->transformed_aabb, p_instance); + } + } else { + if ((1 << p_instance->base_type) & RS::INSTANCE_GEOMETRY_MASK) { + p_instance->scenario->indexers[Scenario::INDEXER_GEOMETRY].update(p_instance->indexer_id, p_instance->transformed_aabb); + } else { + p_instance->scenario->indexers[Scenario::INDEXER_VOLUMES].update(p_instance->indexer_id, p_instance->transformed_aabb); } }