diff options
5 files changed, 32 insertions, 33 deletions
diff --git a/release/scripts/startup/bl_operators/geometry_nodes.py b/release/scripts/startup/bl_operators/geometry_nodes.py index c3892e988c5..f62fed79438 100644 --- a/release/scripts/startup/bl_operators/geometry_nodes.py +++ b/release/scripts/startup/bl_operators/geometry_nodes.py @@ -26,8 +26,9 @@ def geometry_node_group_empty_new(): def geometry_modifier_poll(context): ob = context.object - # Test object support for geometry node modifier (No curves object support yet) - if not ob or ob.type not in {'MESH', 'POINTCLOUD', 'VOLUME', 'CURVE', 'FONT'}: + + # Test object support for geometry node modifier + if not ob or ob.type not in {'MESH', 'POINTCLOUD', 'VOLUME', 'CURVE', 'FONT', 'CURVES'}: return False return True diff --git a/source/blender/blenkernel/intern/curve_eval.cc b/source/blender/blenkernel/intern/curve_eval.cc index a893359b911..d1ec9499298 100644 --- a/source/blender/blenkernel/intern/curve_eval.cc +++ b/source/blender/blenkernel/intern/curve_eval.cc @@ -402,7 +402,8 @@ std::unique_ptr<CurveEval> curves_to_curve_eval(const Curves &curves) const IndexRange point_range = geometry.points_for_curve(curve_index); std::unique_ptr<Spline> spline; - switch (curve_types[curve_index]) { + /* #CurveEval does not support catmull rom curves, so convert those to poly splines. */ + switch (std::max<int8_t>(1, curve_types[curve_index])) { case CURVE_TYPE_POLY: { spline = std::make_unique<PolySpline>(); spline->resize(point_range.size()); diff --git a/source/blender/blenkernel/intern/curves.cc b/source/blender/blenkernel/intern/curves.cc index ebbdff55a55..5b51fb8af31 100644 --- a/source/blender/blenkernel/intern/curves.cc +++ b/source/blender/blenkernel/intern/curves.cc @@ -27,6 +27,7 @@ #include "BKE_anim_data.h" #include "BKE_curves.hh" #include "BKE_customdata.h" +#include "BKE_geometry_set.hh" #include "BKE_global.h" #include "BKE_idtype.h" #include "BKE_lib_id.h" @@ -282,13 +283,11 @@ Curves *BKE_curves_copy_for_eval(Curves *curves_src, bool reference) return result; } -static Curves *curves_evaluate_modifiers(struct Depsgraph *depsgraph, - struct Scene *scene, - Object *object, - Curves *curves_input) +static void curves_evaluate_modifiers(struct Depsgraph *depsgraph, + struct Scene *scene, + Object *object, + GeometrySet &geometry_set) { - Curves *curves = curves_input; - /* Modifier evaluation modes. */ const bool use_render = (DEG_get_mode(depsgraph) == DAG_EVAL_RENDER); const int required_mode = use_render ? eModifierMode_Render : eModifierMode_Realtime; @@ -308,27 +307,10 @@ static Curves *curves_evaluate_modifiers(struct Depsgraph *depsgraph, continue; } - if ((mti->type == eModifierTypeType_OnlyDeform) && - (mti->flags & eModifierTypeFlag_AcceptsVertexCosOnly)) { - /* Ensure we are not modifying the input. */ - if (curves == curves_input) { - curves = BKE_curves_copy_for_eval(curves, true); - } - - /* Created deformed coordinates array on demand. */ - blender::bke::CurvesGeometry &geometry = blender::bke::CurvesGeometry::wrap( - curves->geometry); - MutableSpan<float3> positions = geometry.positions_for_write(); - - mti->deformVerts(md, - &mectx, - nullptr, - reinterpret_cast<float(*)[3]>(positions.data()), - curves->geometry.point_size); + if (mti->modifyGeometrySet != nullptr) { + mti->modifyGeometrySet(md, &mectx, &geometry_set); } } - - return curves; } void BKE_curves_data_update(struct Depsgraph *depsgraph, struct Scene *scene, Object *object) @@ -338,11 +320,20 @@ void BKE_curves_data_update(struct Depsgraph *depsgraph, struct Scene *scene, Ob /* Evaluate modifiers. */ Curves *curves = static_cast<Curves *>(object->data); - Curves *curves_eval = curves_evaluate_modifiers(depsgraph, scene, object, curves); + GeometrySet geometry_set = GeometrySet::create_with_curves(curves, + GeometryOwnershipType::ReadOnly); + curves_evaluate_modifiers(depsgraph, scene, object, geometry_set); /* Assign evaluated object. */ - const bool is_owned = (curves != curves_eval); - BKE_object_eval_assign_data(object, &curves_eval->id, is_owned); + Curves *curves_eval = const_cast<Curves *>(geometry_set.get_curves_for_read()); + if (curves_eval == nullptr) { + curves_eval = blender::bke::curves_new_nomain(0, 0); + BKE_object_eval_assign_data(object, &curves_eval->id, true); + } + else { + BKE_object_eval_assign_data(object, &curves_eval->id, false); + } + object->runtime.geometry_set_eval = new GeometrySet(std::move(geometry_set)); } /* Draw Cache */ diff --git a/source/blender/blenkernel/intern/object_dupli.cc b/source/blender/blenkernel/intern/object_dupli.cc index 0ae8f144583..407a2c8955c 100644 --- a/source/blender/blenkernel/intern/object_dupli.cc +++ b/source/blender/blenkernel/intern/object_dupli.cc @@ -787,7 +787,7 @@ static void make_duplis_geometry_set_impl(const DupliContext *ctx, dupli->ob_data = (ID *)volume; } } - if (!ELEM(ctx->object->type, OB_CURVES_LEGACY, OB_FONT) || geometry_set_is_instance) { + if (!ELEM(ctx->object->type, OB_CURVES_LEGACY, OB_FONT, OB_CURVES) || geometry_set_is_instance) { if (const CurveComponent *component = geometry_set.get_component_for_read<CurveComponent>()) { if (const Curve *curve = component->get_curve_for_render()) { DupliObject *dupli = make_dupli(ctx, ctx->object, parent_transform, component_index++); diff --git a/source/blender/editors/space_spreadsheet/space_spreadsheet.cc b/source/blender/editors/space_spreadsheet/space_spreadsheet.cc index fbdc451cf06..14b9dbe4b44 100644 --- a/source/blender/editors/space_spreadsheet/space_spreadsheet.cc +++ b/source/blender/editors/space_spreadsheet/space_spreadsheet.cc @@ -264,7 +264,13 @@ Object *spreadsheet_get_object_eval(const SpaceSpreadsheet *sspreadsheet, return nullptr; } Object *object_orig = (Object *)used_id; - if (!ELEM(object_orig->type, OB_MESH, OB_POINTCLOUD, OB_VOLUME, OB_CURVES_LEGACY, OB_FONT)) { + if (!ELEM(object_orig->type, + OB_MESH, + OB_POINTCLOUD, + OB_VOLUME, + OB_CURVES_LEGACY, + OB_FONT, + OB_CURVES)) { return nullptr; } |