Răsfoiți Sursa

Fix immediate mesh modifications that don't call set_mesh

Mesh_instance_2d has no way to know when the mesh had been modified
unless you called set_mesh.  This meant that you could modify the
underlying mesh without it knowing which could result in incorrect
result.

Modified mesh_instance_2d to be more similar to mesh_instance_3d which
connects to the changed signal of the mesh and reacts occordingly.
Trevor Davenport 9 luni în urmă
părinte
comite
47f75547ce
2 a modificat fișierele cu 15 adăugiri și 0 ștergeri
  1. 13 0
      scene/2d/mesh_instance_2d.cpp
  2. 2 0
      scene/resources/immediate_mesh.cpp

+ 13 - 0
scene/2d/mesh_instance_2d.cpp

@@ -54,7 +54,20 @@ void MeshInstance2D::_bind_methods() {
 }
 
 void MeshInstance2D::set_mesh(const Ref<Mesh> &p_mesh) {
+	if (mesh == p_mesh) {
+		return;
+	}
+
+	if (mesh.is_valid()) {
+		mesh->disconnect_changed(callable_mp((CanvasItem *)this, &CanvasItem::queue_redraw));
+	}
+
 	mesh = p_mesh;
+
+	if (mesh.is_valid()) {
+		mesh->connect_changed(callable_mp((CanvasItem *)this, &CanvasItem::queue_redraw));
+	}
+
 	queue_redraw();
 }
 

+ 2 - 0
scene/resources/immediate_mesh.cpp

@@ -312,6 +312,8 @@ void ImmediateMesh::surface_end() {
 	uses_uv2s = false;
 
 	surface_active = false;
+
+	emit_changed();
 }
 
 void ImmediateMesh::clear_surfaces() {