[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