Browse Source

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.
lawnjelly 4 years ago
parent
commit
6d687de9b8
2 changed files with 16 additions and 3 deletions
  1. 8 1
      core/math/dynamic_bvh.cpp
  2. 8 2
      servers/rendering/renderer_scene_cull.cpp

+ 8 - 1
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) {
 void DynamicBVH::update(const ID &p_id, const AABB &p_box) {
 	ERR_FAIL_COND(!p_id.is_valid());
 	ERR_FAIL_COND(!p_id.is_valid());
 	Node *leaf = p_id.node;
 	Node *leaf = p_id.node;
-	Node *base = _remove_leaf(leaf);
+
 	Volume volume;
 	Volume volume;
 	volume.min = p_box.position;
 	volume.min = p_box.position;
 	volume.max = p_box.position + p_box.size;
 	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 (base) {
 		if (lkhd >= 0) {
 		if (lkhd >= 0) {
 			for (int i = 0; (i < lkhd) && base->parent; ++i) {
 			for (int i = 0; (i < lkhd) && base->parent; ++i) {

+ 8 - 2
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 (!p_instance->indexer_id.is_valid()) {
 		if ((1 << p_instance->base_type) & RS::INSTANCE_GEOMETRY_MASK) {
 		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 {
 		} 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);
 		}
 		}
 	}
 	}