[Bf-blender-cvs] [58cdb78ea09] geometry-nodes-curve-support: Disfunctional support for geometry nodes on curve

Hans Goudey noreply at git.blender.org
Thu Apr 1 00:49:58 CEST 2021


Commit: 58cdb78ea09c232109607e29cc086c941dc9760a
Author: Hans Goudey
Date:   Wed Mar 31 17:49:51 2021 -0500
Branches: geometry-nodes-curve-support
https://developer.blender.org/rB58cdb78ea09c232109607e29cc086c941dc9760a

Disfunctional support for geometry nodes on curve

Very hacky, doesn't work, but it's a base, and some components work.
I have a feeling that the curve modifier stack is just fundamentally broken.

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

M	source/blender/blenkernel/BKE_derived_curve.hh
M	source/blender/blenkernel/intern/derived_curve.cc
M	source/blender/blenkernel/intern/displist.cc
M	source/blender/blenkernel/intern/geometry_component_curve.cc
M	source/blender/blenkernel/intern/mesh_validate.c
M	source/blender/editors/space_spreadsheet/spreadsheet_from_geometry.cc
M	source/blender/modifiers/intern/MOD_nodes.cc
M	source/blender/nodes/geometry/nodes/node_geo_curve_to_mesh.cc
M	source/blender/nodes/geometry/nodes/node_geo_transform.cc

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

diff --git a/source/blender/blenkernel/BKE_derived_curve.hh b/source/blender/blenkernel/BKE_derived_curve.hh
index 35f9a6417c8..6d4af43920f 100644
--- a/source/blender/blenkernel/BKE_derived_curve.hh
+++ b/source/blender/blenkernel/BKE_derived_curve.hh
@@ -86,6 +86,8 @@ struct SplineBezier : Spline {
   {
     return control_points.size();
   }
+
+  ~SplineBezier() = default;
 };
 
 struct SplineNURBS : Spline {
@@ -117,5 +119,15 @@ struct DCurve {
 
   void ensure_evaluation_cache();
 
-  DCurve from_dna_curve(const Curve &curve);
+  ~DCurve()
+  {
+    for (Spline *spline : splines) {
+      if (spline->type == SplineType::Bezier) {
+        SplineBezier *spline_bezier = reinterpret_cast<SplineBezier *>(spline);
+        delete spline_bezier;
+      }
+    }
+  }
 };
+
+DCurve *dcurve_from_dna_curve(const Curve &curve);
\ No newline at end of file
diff --git a/source/blender/blenkernel/intern/derived_curve.cc b/source/blender/blenkernel/intern/derived_curve.cc
index 7e888ba7dc0..9196c4f68e6 100644
--- a/source/blender/blenkernel/intern/derived_curve.cc
+++ b/source/blender/blenkernel/intern/derived_curve.cc
@@ -25,6 +25,8 @@
 
 using blender::Array;
 using blender::float3;
+using blender::IndexRange;
+using blender::MutableSpan;
 using blender::Span;
 
 static BezierHandleType handle_type_from_dna_bezt(const eBezTriple_Handle dna_handle_type)
@@ -47,15 +49,15 @@ static BezierHandleType handle_type_from_dna_bezt(const eBezTriple_Handle dna_ha
   return BezierHandleType::Free;
 }
 
-DCurve DCurve::from_dna_curve(const Curve &dna_curve)
+DCurve *dcurve_from_dna_curve(const Curve &dna_curve)
 {
-  DCurve curve;
+  DCurve *curve = new DCurve();
 
-  curve.splines.reserve(BLI_listbase_count(&dna_curve.nurb));
+  curve->splines.reserve(BLI_listbase_count(&dna_curve.nurb));
 
   LISTBASE_FOREACH (const Nurb *, nurb, &dna_curve.nurb) {
     if (nurb->type == CU_BEZIER) {
-      SplineBezier spline;
+      SplineBezier *spline = new SplineBezier();
       for (const BezTriple &bezt : Span(nurb->bezt, nurb->pntsu)) {
         ControlPointBezier point;
         point.handle_position_a = bezt.vec[0];
@@ -65,14 +67,14 @@ DCurve DCurve::from_dna_curve(const Curve &dna_curve)
         point.tilt = bezt.tilt;
         point.handle_type_a = handle_type_from_dna_bezt((eBezTriple_Handle)bezt.h1);
         point.handle_type_b = handle_type_from_dna_bezt((eBezTriple_Handle)bezt.h2);
-        spline.control_points.append(std::move(point));
+        spline->control_points.append(std::move(point));
       }
 
-      spline.resolution_u = nurb->resolu;
-      spline.resolution_v = nurb->resolv;
-      spline.type = SplineType::Bezier;
+      spline->resolution_u = nurb->resolu;
+      spline->resolution_v = nurb->resolv;
+      spline->type = SplineType::Bezier;
 
-      curve.splines.append(spline);
+      curve->splines.append(spline);
     }
     else if (nurb->type == CU_NURBS) {
     }
@@ -83,26 +85,70 @@ DCurve DCurve::from_dna_curve(const Curve &dna_curve)
   return curve;
 }
 
+static void evaluate_bezier_part_3d(const float3 point_0,
+                                    const float3 point_1,
+                                    const float3 point_2,
+                                    const float3 point_3,
+                                    MutableSpan<float3> result)
+{
+  float *data = (float *)result.data();
+  for (const int axis : {0, 1, 2}) {
+    BKE_curve_forward_diff_bezier(point_0[axis],
+                                  point_1[axis],
+                                  point_2[axis],
+                                  point_3[axis],
+                                  data + axis,
+                                  result.size(),
+                                  sizeof(float3));
+  }
+}
+
 void DCurve::ensure_evaluation_cache()
 {
   this->evaluated_spline_cache.clear();
 
-  for (Spline &spline : this->splines) {
-    if (spline.type == SplineType::Bezier) {
-      SplineBezier &spline_bezier = reinterpret_cast<SplineBezier &>(spline);
-      for (ControlPointBezier &point : spline_bezier.control_points) {
-        float3 *data = this->evaluated_spline_cache.end();
-        float *data_axis = (float *)data;
-        this->evaluated_spline_cache.reserve(this->evaluated_spline_cache.size() +
-                                             spline_bezier.resolution_u);
-        for (const int axis : {0, 1, 2}) {
-          BKE_curve_forward_diff_bezier(point.position[axis],
-                                        point.handle_position_b[axis],
-                                        point.handle_position_a[axis],
-                                        point.position[axis],
-                                        data_axis + axis,
-                                        spline_bezier.resolution_u,
-                                        sizeof(float3));
+  int total_len = 1;
+  for (Spline *spline : this->splines) {
+    if (spline->type == SplineType::Bezier) {
+      SplineBezier &spline_bezier = *reinterpret_cast<SplineBezier *>(spline);
+      for (const int i : IndexRange(1, spline_bezier.control_points.size() - 1)) {
+        const ControlPointBezier &point_prev = spline_bezier.control_points[i - 1];
+        const ControlPointBezier &point = spline_bezier.control_points[i];
+        if (point_prev.handle_type_b == BezierHandleType::Vector &&
+            point.handle_type_a == BezierHandleType::Vector) {
+          total_len += 1;
+        }
+        else {
+          total_len += spline_bezier.resolution_u;
+        }
+      }
+    }
+  }
+
+  this->evaluated_spline_cache.resize(total_len);
+
+  MutableSpan<float3> positions(this->evaluated_spline_cache);
+
+  int offset = 0;
+  for (Spline *spline : this->splines) {
+    if (spline->type == SplineType::Bezier) {
+      SplineBezier &spline_bezier = *reinterpret_cast<SplineBezier *>(spline);
+      for (const int i : IndexRange(1, spline_bezier.control_points.size() - 1)) {
+        const ControlPointBezier &point_prev = spline_bezier.control_points[i - 1];
+        const ControlPointBezier &point = spline_bezier.control_points[i];
+
+        if (point_prev.handle_type_b == BezierHandleType::Vector &&
+            point.handle_type_a == BezierHandleType::Vector) {
+          offset++;
+        }
+        else {
+          const int resolution = spline_bezier.resolution_u;
+          evaluate_bezier_part_3d(point_prev.position,
+                                  point_prev.handle_position_b,
+                                  point.handle_position_a,
+                                  point.position,
+                                  positions.slice(offset, resolution));
+          offset += resolution;
         }
       }
     }
diff --git a/source/blender/blenkernel/intern/displist.cc b/source/blender/blenkernel/intern/displist.cc
index dc7523bc0de..e5f3fad7318 100644
--- a/source/blender/blenkernel/intern/displist.cc
+++ b/source/blender/blenkernel/intern/displist.cc
@@ -44,8 +44,10 @@
 
 #include "BKE_anim_path.h"
 #include "BKE_curve.h"
+#include "BKE_derived_curve.hh"
 #include "BKE_displist.h"
 #include "BKE_font.h"
+#include "BKE_geometry_set.hh"
 #include "BKE_key.h"
 #include "BKE_lattice.h"
 #include "BKE_lib_id.h"
@@ -889,6 +891,48 @@ static void displist_vert_coords_apply(ListBase *dispbase, float (*allverts)[3])
   }
 }
 
+static Mesh *modifier_modify_mesh_and_geometry_set(ModifierData *md,
+                                                   const ModifierEvalContext &mectx,
+                                                   Curve *curve,
+                                                   Object *ob,
+                                                   Mesh *input_mesh,
+                                                   GeometrySet &geometry_set)
+{
+  Mesh *mesh_output = nullptr;
+  const ModifierTypeInfo *mti = BKE_modifier_get_info((ModifierType)md->type);
+  if (mti->modifyGeometrySet == nullptr) {
+    mesh_output = BKE_modifier_modify_mesh(md, &mectx, input_mesh);
+  }
+  else {
+    /* Adds a new mesh component to the geometry set based on the #input_mesh. */
+    BLI_assert(!geometry_set.has<MeshComponent>());
+    MeshComponent &mesh_component = geometry_set.get_component_for_write<MeshComponent>();
+    mesh_component.replace(input_mesh, GeometryOwnershipType::Editable);
+    mesh_component.copy_vertex_group_names_from_object(*ob);
+
+    CurveComponent &curve_component = geometry_set.get_component_for_write<CurveComponent>();
+    curve_component.replace(dcurve_from_dna_curve(*curve));
+
+    /* Let the modifier change the geometry set. */
+    mti->modifyGeometrySet(md, &mectx, &geometry_set);
+
+    /* Release the mesh from the geometry set again. */
+    if (geometry_set.has<MeshComponent>()) {
+      MeshComponent &mesh_component = geometry_set.get_component_for_write<MeshComponent>();
+      mesh_output = mesh_component.release();
+      geometry_set.remove<MeshComponent>();
+    }
+
+    /* Return an empty mesh instead of null.  */
+    if (mesh_output == nullptr) {
+      mesh_output = BKE_mesh_new_nomain(0, 0, 0, 0, 0);
+      BKE_mesh_copy_settings(mesh_output, input_mesh);
+    }
+  }
+
+  return mesh_output;
+}
+
 static void curve_calc_modifiers_post(Depsgraph *depsgraph,
                                       Scene *scene,
                                       Object *ob,
@@ -896,8 +940,11 @@ static void curve_calc_modifiers_post(Depsgraph *depsgraph,
                                       ListBase *dispbase,
                                       Mesh **r_final,
                                       const bool for_render,
-                                      const bool force_mesh_conversion)
+                                      const bool force_mesh_conversion,
+                                      GeometrySet **r_geometry_set)
 {
+  GeometrySet geometry_set_final;
+
   VirtualModifierData virtualModifierData;
   ModifierData *md = BKE_modifiers_get_virtual_modifierlist(ob, &virtualModifierData);
   ModifierData *pretessellatePoint;
@@ -1017,7 +1064,9 @@ static void curve_calc_modifiers_post(Depsgraph *depsgraph,
       if (need_normal) {
         BKE_mesh_ensure_normals(modified);
       }
-      mesh_applied = mti->modifyMesh(md, &mect

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list