Răsfoiți Sursa

Fix gizmo redraw performance for PlaneMesh with larger subdiv value

Fixes gizmo redraw performance for PlaneMesh with larger subdiv value.
smix8 1 an în urmă
părinte
comite
b8de7b72c6
1 a modificat fișierele cu 17 adăugiri și 1 ștergeri
  1. 17 1
      editor/plugins/gizmos/mesh_instance_3d_gizmo_plugin.cpp

+ 17 - 1
editor/plugins/gizmos/mesh_instance_3d_gizmo_plugin.cpp

@@ -33,6 +33,7 @@
 #include "editor/plugins/node_3d_editor_plugin.h"
 #include "scene/3d/mesh_instance_3d.h"
 #include "scene/3d/soft_body_3d.h"
+#include "scene/resources/3d/primitive_meshes.h"
 
 MeshInstance3DGizmoPlugin::MeshInstance3DGizmoPlugin() {
 }
@@ -64,7 +65,22 @@ void MeshInstance3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) {
 		return; //none
 	}
 
-	Ref<TriangleMesh> tm = m->generate_triangle_mesh();
+	Ref<TriangleMesh> tm;
+
+	Ref<PlaneMesh> plane_mesh = mesh->get_mesh();
+	if (plane_mesh.is_valid() && (plane_mesh->get_subdivide_depth() > 0 || plane_mesh->get_subdivide_width() > 0)) {
+		// PlaneMesh subdiv makes gizmo redraw very slow due to TriangleMesh BVH calculation for every face.
+		// For gizmo collision this is very much unnecessary since a PlaneMesh is always flat, 2 faces is enough.
+		Ref<PlaneMesh> simple_plane_mesh;
+		simple_plane_mesh.instantiate();
+		simple_plane_mesh->set_orientation(plane_mesh->get_orientation());
+		simple_plane_mesh->set_size(plane_mesh->get_size());
+		simple_plane_mesh->set_center_offset(plane_mesh->get_center_offset());
+		tm = simple_plane_mesh->generate_triangle_mesh();
+	} else {
+		tm = m->generate_triangle_mesh();
+	}
+
 	if (tm.is_valid()) {
 		p_gizmo->add_collision_triangles(tm);
 	}