[Bf-blender-cvs] [d64e149a4f7] geometry-nodes-curve-support: Geometry Nodes Curves: Store splines a bit differently

Hans Goudey noreply at git.blender.org
Fri Apr 2 20:20:07 CEST 2021


Commit: d64e149a4f7702780f51a606ffbc2f80e3342854
Author: Hans Goudey
Date:   Fri Apr 2 13:04:07 2021 -0500
Branches: geometry-nodes-curve-support
https://developer.blender.org/rBd64e149a4f7702780f51a606ffbc2f80e3342854

Geometry Nodes Curves: Store splines a bit differently

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

M	source/blender/blenkernel/BKE_derived_curve.hh
M	source/blender/blenkernel/intern/derived_curve.cc
M	source/blender/blenkernel/intern/geometry_component_curve.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 6d4af43920f..bde24d0127a 100644
--- a/source/blender/blenkernel/BKE_derived_curve.hh
+++ b/source/blender/blenkernel/BKE_derived_curve.hh
@@ -105,29 +105,19 @@ struct SplineNURBS : Spline {
 
 /* Proposed name to be different from DNA type. */
 struct DCurve {
-  blender::Vector<Spline *> splines;
-  //   AttributeStorage attributes;
+  blender::Vector<SplineBezier> splines_bezier;
   int32_t flag; /* 2D. */
 
   /* Attributes. */
+  //   AttributeStorage attributes;
   //   CustomData *control_point_data;
   //   CustomData *spline_data;
 
   /* Then maybe whatever caches are necessary, etc. */
-  //   std::mutex cache_mutex;
+  std::mutex cache_mutex;
   blender::Vector<blender::float3> evaluated_spline_cache;
 
-  void ensure_evaluation_cache();
-
-  ~DCurve()
-  {
-    for (Spline *spline : splines) {
-      if (spline->type == SplineType::Bezier) {
-        SplineBezier *spline_bezier = reinterpret_cast<SplineBezier *>(spline);
-        delete spline_bezier;
-      }
-    }
-  }
+  void ensure_evaluation_cache() const;
 };
 
 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 9196c4f68e6..a3edf9ade36 100644
--- a/source/blender/blenkernel/intern/derived_curve.cc
+++ b/source/blender/blenkernel/intern/derived_curve.cc
@@ -53,11 +53,11 @@ DCurve *dcurve_from_dna_curve(const Curve &dna_curve)
 {
   DCurve *curve = new DCurve();
 
-  curve->splines.reserve(BLI_listbase_count(&dna_curve.nurb));
+  curve->splines_bezier.reserve(BLI_listbase_count(&dna_curve.nurb));
 
   LISTBASE_FOREACH (const Nurb *, nurb, &dna_curve.nurb) {
     if (nurb->type == CU_BEZIER) {
-      SplineBezier *spline = new SplineBezier();
+      SplineBezier spline;
       for (const BezTriple &bezt : Span(nurb->bezt, nurb->pntsu)) {
         ControlPointBezier point;
         point.handle_position_a = bezt.vec[0];
@@ -67,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_bezier.append(spline);
     }
     else if (nurb->type == CU_NURBS) {
     }
@@ -103,53 +103,51 @@ static void evaluate_bezier_part_3d(const float3 point_0,
   }
 }
 
-void DCurve::ensure_evaluation_cache()
+void DCurve::ensure_evaluation_cache() const
 {
-  this->evaluated_spline_cache.clear();
+  DCurve *mutable_self = const_cast<DCurve *>(this);
+
+  std::lock_guard<std::mutex>(mutable_self->cache_mutex);
+
+  mutable_self->evaluated_spline_cache.clear();
 
   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;
-        }
+  for (const SplineBezier &spline : this->splines_bezier) {
+    for (const int i : IndexRange(1, spline.control_points.size() - 1)) {
+      const ControlPointBezier &point_prev = spline.control_points[i - 1];
+      const ControlPointBezier &point = spline.control_points[i];
+      if (point_prev.handle_type_b == BezierHandleType::Vector &&
+          point.handle_type_a == BezierHandleType::Vector) {
+        total_len += 1;
+      }
+      else {
+        total_len += spline.resolution_u;
       }
     }
   }
 
-  this->evaluated_spline_cache.resize(total_len);
+  mutable_self->evaluated_spline_cache.resize(total_len);
 
-  MutableSpan<float3> positions(this->evaluated_spline_cache);
+  MutableSpan<float3> positions(mutable_self->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;
-        }
+  for (const SplineBezier &spline : this->splines_bezier) {
+    for (const int i : IndexRange(1, spline.control_points.size() - 1)) {
+      const ControlPointBezier &point_prev = spline.control_points[i - 1];
+      const ControlPointBezier &point = spline.control_points[i];
+
+      if (point_prev.handle_type_b == BezierHandleType::Vector &&
+          point.handle_type_a == BezierHandleType::Vector) {
+        offset++;
+      }
+      else {
+        const int resolution = spline.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/geometry_component_curve.cc b/source/blender/blenkernel/intern/geometry_component_curve.cc
index 76bfc16da14..7254935d3df 100644
--- a/source/blender/blenkernel/intern/geometry_component_curve.cc
+++ b/source/blender/blenkernel/intern/geometry_component_curve.cc
@@ -110,13 +110,13 @@ int CurveComponent::attribute_domain_size(const AttributeDomain domain) const
   }
   if (domain == ATTR_DOMAIN_POINT) {
     int total = 0;
-    for (const Spline *spline : curve_->splines) {
-      total += spline->size();
+    for (const SplineBezier &spline : curve_->splines_bezier) {
+      total += spline.size();
     }
     return total;
   }
   if (domain == ATTR_DOMAIN_CURVE) {
-    return curve_->splines.size();
+    return curve_->splines_bezier.size();
   }
   return 0;
 }
diff --git a/source/blender/nodes/geometry/nodes/node_geo_transform.cc b/source/blender/nodes/geometry/nodes/node_geo_transform.cc
index 6cfe9f9cd1d..e9927800efc 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_transform.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_transform.cc
@@ -160,14 +160,11 @@ static void transform_curve(DCurve &curve,
 {
   const float4x4 matrix = float4x4::from_loc_eul_scale(translation, rotation, scale);
 
-  for (Spline *spline : curve.splines) {
-    if (spline->type == SplineType::Bezier) {
-      SplineBezier &spline_bezier = *reinterpret_cast<SplineBezier *>(spline);
-      for (ControlPointBezier &point : spline_bezier.control_points) {
-        point.handle_position_a = matrix * point.handle_position_a;
-        point.position = matrix * point.position;
-        point.handle_position_b = matrix * point.handle_position_b;
-      }
+  for (SplineBezier &spline : curve.splines_bezier) {
+    for (ControlPointBezier &point : spline.control_points) {
+      point.handle_position_a = matrix * point.handle_position_a;
+      point.position = matrix * point.position;
+      point.handle_position_b = matrix * point.handle_position_b;
     }
   }
 }



More information about the Bf-blender-cvs mailing list