1
1

Curves: Support applying geometry nodes modifier

This commit adds support for the curves object to the apply modifier
operator. A warning is added when the evaluated result of the modifier
doesn't contain any curves data.

Differential Revision: https://developer.blender.org/D14730
This commit is contained in:
2022-04-26 08:07:54 -05:00
parent db45292d8e
commit 96bdd65e74

View File

@@ -38,6 +38,7 @@
#include "BKE_context.h"
#include "BKE_curve.h"
#include "BKE_curves.h"
#include "BKE_curves.hh"
#include "BKE_displist.h"
#include "BKE_editmesh.h"
#include "BKE_effect.h"
@@ -701,7 +702,6 @@ static bool modifier_apply_shape(Main *bmain,
BKE_id_free(nullptr, mesh_applied);
}
else {
/* TODO: implement for curves, point clouds and volumes. */
BKE_report(reports, RPT_ERROR, "Cannot apply modifier for this object type");
return false;
}
@@ -804,8 +804,41 @@ static bool modifier_apply_obdata(
DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY);
}
else if (ob->type == OB_CURVES) {
Curves &curves = *static_cast<Curves *>(ob->data);
if (mti->modifyGeometrySet == nullptr) {
BLI_assert_unreachable();
return false;
}
/* Create a temporary geometry set and component. */
GeometrySet geometry_set;
geometry_set.get_component_for_write<CurveComponent>().replace(
&curves, GeometryOwnershipType::Editable);
ModifierEvalContext mectx = {depsgraph, ob, (ModifierApplyFlag)0};
mti->modifyGeometrySet(md_eval, &mectx, &geometry_set);
if (!geometry_set.has_curves()) {
BKE_report(reports, RPT_ERROR, "Evaluated geometry from modifier does not contain curves");
return false;
}
CurveComponent &component = geometry_set.get_component_for_write<CurveComponent>();
Curves &curves_eval = *geometry_set.get_curves_for_write();
/* Anonymous attributes shouldn't be available on the applied geometry. */
component.attributes_remove_anonymous();
/* If the modifier's output is a different curves data-block, copy the relevant information to
* the original. */
if (&curves_eval != &curves) {
blender::bke::CurvesGeometry::wrap(curves.geometry) = std::move(
blender::bke::CurvesGeometry::wrap(curves_eval.geometry));
Main *bmain = DEG_get_bmain(depsgraph);
BKE_object_material_from_eval_data(bmain, ob, &curves_eval.id);
}
}
else {
/* TODO: implement for curves, point clouds and volumes. */
/* TODO: implement for point clouds and volumes. */
BKE_report(reports, RPT_ERROR, "Cannot apply modifier for this object type");
return false;
}