[Bf-blender-cvs] [2839fe9a4d3] master: Curves: initial geometry nodes support for curves objects

Jacques Lucke noreply at git.blender.org
Fri Apr 15 09:11:18 CEST 2022


Commit: 2839fe9a4d30c5737ab5075d0610c54568688fcb
Author: Jacques Lucke
Date:   Fri Apr 15 09:07:00 2022 +0200
Branches: master
https://developer.blender.org/rB2839fe9a4d30c5737ab5075d0610c54568688fcb

Curves: initial geometry nodes support for curves objects

* Curves objects now support the geometry nodes modifier.
* It's possible to use the curves object with the Object Info node.
* The spreadsheet shows the curve data.

The main thing holding this back currently is that the drawing code
for the curves object is very incomplete. E.g. it resamples the curves
always in the end, which is not expected for curves in general.

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

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

M	release/scripts/startup/bl_operators/geometry_nodes.py
M	source/blender/blenkernel/intern/curve_eval.cc
M	source/blender/blenkernel/intern/curves.cc
M	source/blender/blenkernel/intern/object_dupli.cc
M	source/blender/editors/space_spreadsheet/space_spreadsheet.cc

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

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;
   }



More information about the Bf-blender-cvs mailing list