瀏覽代碼

Merge pull request #53190 from nekomatata/software-skinning-aabb-optimization

Rémi Verschelde 4 年之前
父節點
當前提交
60bcc91dd5
共有 1 個文件被更改,包括 9 次插入9 次删除
  1. 9 9
      scene/3d/mesh_instance.cpp

+ 9 - 9
scene/3d/mesh_instance.cpp

@@ -390,8 +390,8 @@ void MeshInstance::_update_skinning() {
 	RID skeleton = skin_ref->get_skeleton();
 	ERR_FAIL_COND(!skeleton.is_valid());
 
-	AABB aabb;
-	bool first_vertex = true;
+	Vector3 aabb_min = Vector3(FLT_MAX, FLT_MAX, FLT_MAX);
+	Vector3 aabb_max = Vector3(-FLT_MAX, -FLT_MAX, -FLT_MAX);
 
 	VisualServer *visual_server = VisualServer::get_singleton();
 
@@ -503,18 +503,18 @@ void MeshInstance::_update_skinning() {
 				}
 			}
 
-			if (first_vertex) {
-				aabb.position = vertex;
-				first_vertex = false;
-			} else {
-				aabb.expand_to(vertex);
-			}
+			aabb_min.x = MIN(aabb_min.x, vertex.x);
+			aabb_min.y = MIN(aabb_min.y, vertex.y);
+			aabb_min.z = MIN(aabb_min.z, vertex.z);
+			aabb_max.x = MAX(aabb_max.x, vertex.x);
+			aabb_max.y = MAX(aabb_max.y, vertex.y);
+			aabb_max.z = MAX(aabb_max.z, vertex.z);
 		}
 
 		visual_server->mesh_surface_update_region(mesh_rid, surface_index, 0, buffer);
 	}
 
-	visual_server->mesh_set_custom_aabb(mesh_rid, aabb);
+	visual_server->mesh_set_custom_aabb(mesh_rid, AABB(aabb_min, aabb_max - aabb_min));
 
 	software_skinning_flags |= SoftwareSkinning::FLAG_BONES_READY;
 }