[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