summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/math/dynamic_bvh.cpp9
-rw-r--r--servers/rendering/renderer_scene_cull.cpp10
2 files changed, 16 insertions, 3 deletions
diff --git a/core/math/dynamic_bvh.cpp b/core/math/dynamic_bvh.cpp
index 5f87f75b61..a53f8d1eb8 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 1db678a441..8bb9e6b8b0 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);
}
}