summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlawnjelly <lawnjelly@gmail.com>2020-12-24 10:59:57 +0000
committerlawnjelly <lawnjelly@gmail.com>2020-12-24 11:19:50 +0000
commit6d687de9b84f85c87846e6a48b81b1c495bb926b (patch)
tree67efb0c9b820a3653e06d58022432a2cf2de1339
parentdbd00d932e27088f6f8a8fc88e5dd75796719ada (diff)
Fix BVH to world_aabb, and call update
The calls to the BVH need to use the world space AABB, rather than local space for it to work. Also, update was not being called which is required to update the AABB as objects move.
-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);
}
}