[Bf-blender-cvs] [2752a88478a] master: Object: Support converting curves object to mesh

Hans Goudey noreply at git.blender.org
Fri Jan 6 15:42:15 CET 2023


Commit: 2752a88478a8dedf2ca7a80d7021ec3347517ab5
Author: Hans Goudey
Date:   Fri Jan 6 09:29:39 2023 -0500
Branches: master
https://developer.blender.org/rB2752a88478a8dedf2ca7a80d7021ec3347517ab5

Object: Support converting curves object to mesh

Previously you had to use a workaround with the Object info node to get
evaluated data from the new curves object to an original editable mesh.
This commit makes it so that a curves object can be converted directly
to a mesh object if it has evaluated curves or an evaluated mesh.

Differential Revision: https://developer.blender.org/D16930

===================================================================

M	source/blender/blenkernel/BKE_curve_to_mesh.hh
M	source/blender/editors/object/object_add.cc

===================================================================

diff --git a/source/blender/blenkernel/BKE_curve_to_mesh.hh b/source/blender/blenkernel/BKE_curve_to_mesh.hh
index 0f67da2d8a5..fb96fe4792b 100644
--- a/source/blender/blenkernel/BKE_curve_to_mesh.hh
+++ b/source/blender/blenkernel/BKE_curve_to_mesh.hh
@@ -2,7 +2,6 @@
 
 #pragma once
 
-struct CurvesGeometry;
 struct Mesh;
 
 /** \file
@@ -11,6 +10,7 @@ struct Mesh;
 
 namespace blender::bke {
 
+struct CurvesGeometry;
 class AnonymousAttributePropagationInfo;
 
 /**
diff --git a/source/blender/editors/object/object_add.cc b/source/blender/editors/object/object_add.cc
index 72d9195cbb3..a6081d3733e 100644
--- a/source/blender/editors/object/object_add.cc
+++ b/source/blender/editors/object/object_add.cc
@@ -49,6 +49,7 @@
 #include "BKE_constraint.h"
 #include "BKE_context.h"
 #include "BKE_curve.h"
+#include "BKE_curve_to_mesh.hh"
 #include "BKE_curves.h"
 #include "BKE_displist.h"
 #include "BKE_duplilist.h"
@@ -2877,6 +2878,7 @@ static Base *duplibase_for_convert(
 
 static int object_convert_exec(bContext *C, wmOperator *op)
 {
+  using namespace blender;
   Main *bmain = CTX_data_main(C);
   Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C);
   Scene *scene = CTX_data_scene(C);
@@ -3359,6 +3361,55 @@ static int object_convert_exec(bContext *C, wmOperator *op)
         ED_rigidbody_object_remove(bmain, scene, newob);
       }
     }
+    else if (ob->type == OB_CURVES && target == OB_MESH) {
+      ob->flag |= OB_DONE;
+
+      Object *ob_eval = DEG_get_evaluated_object(depsgraph, ob);
+      GeometrySet geometry;
+      if (ob_eval->runtime.geometry_set_eval != nullptr) {
+        geometry = *ob_eval->runtime.geometry_set_eval;
+      }
+
+      if (keep_original) {
+        basen = duplibase_for_convert(bmain, depsgraph, scene, view_layer, base, nullptr);
+        newob = basen->object;
+
+        Curves *curves = static_cast<Curves *>(newob->data);
+        id_us_min(&curves->id);
+
+        newob->data = BKE_id_copy(bmain, &curves->id);
+      }
+      else {
+        newob = ob;
+      }
+
+      Mesh *new_mesh = static_cast<Mesh *>(BKE_id_new(bmain, ID_ME, newob->id.name + 2));
+      if (const Mesh *mesh_eval = geometry.get_mesh_for_read()) {
+        BKE_mesh_nomain_to_mesh(BKE_mesh_copy_for_eval(mesh_eval, false), new_mesh, newob);
+        BKE_object_material_from_eval_data(bmain, newob, &mesh_eval->id);
+        new_mesh->attributes_for_write().remove_anonymous();
+      }
+      else if (const Curves *curves_eval = geometry.get_curves_for_read()) {
+        bke::AnonymousAttributePropagationInfo propagation_info;
+        propagation_info.propagate_all = false;
+        Mesh *mesh = bke::curve_to_wire_mesh(bke::CurvesGeometry::wrap(curves_eval->geometry),
+                                             propagation_info);
+        BKE_mesh_nomain_to_mesh(mesh, new_mesh, newob);
+        BKE_object_material_from_eval_data(bmain, newob, &curves_eval->id);
+      }
+      else {
+        BKE_reportf(op->reports,
+                    RPT_WARNING,
+                    "Object '%s' has no evaluated mesh or curves data",
+                    ob->id.name + 2);
+      }
+
+      newob->data = new_mesh;
+      newob->type = OB_MESH;
+
+      BKE_object_free_derived_caches(newob);
+      BKE_object_free_modifiers(newob, 0);
+    }
     else {
       continue;
     }



More information about the Bf-blender-cvs mailing list