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; } _______________________________________________ Bf-blender-cvs mailing list [email protected] List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs
