[Bf-blender-cvs] [50913d719cc] master: Cleanup: Use attribute API for curves functions

Hans Goudey noreply at git.blender.org
Tue Sep 13 04:47:27 CEST 2022


Commit: 50913d719ccb240d93d01db49c24669a589dbee1
Author: Hans Goudey
Date:   Mon Sep 12 18:09:59 2022 -0500
Branches: master
https://developer.blender.org/rB50913d719ccb240d93d01db49c24669a589dbee1

Cleanup: Use attribute API for curves functions

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

M	source/blender/blenkernel/intern/curves_geometry.cc

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

diff --git a/source/blender/blenkernel/intern/curves_geometry.cc b/source/blender/blenkernel/intern/curves_geometry.cc
index d192c10912f..1b4508d99c1 100644
--- a/source/blender/blenkernel/intern/curves_geometry.cc
+++ b/source/blender/blenkernel/intern/curves_geometry.cc
@@ -1392,57 +1392,47 @@ static bool layer_matches_name_and_type(const CustomDataLayer &layer,
 
 void CurvesGeometry::reverse_curves(const IndexMask curves_to_reverse)
 {
-  CustomData_duplicate_referenced_layers(&this->point_data, this->points_num());
-
-  /* Collect the Bezier handle attributes while iterating through the point custom data layers;
-   * they need special treatment later. */
-  MutableSpan<float3> positions_left;
-  MutableSpan<float3> positions_right;
-  MutableSpan<int8_t> types_left;
-  MutableSpan<int8_t> types_right;
-
-  for (const int layer_i : IndexRange(this->point_data.totlayer)) {
-    CustomDataLayer &layer = this->point_data.layers[layer_i];
-
-    if (positions_left.is_empty() &&
-        layer_matches_name_and_type(layer, ATTR_HANDLE_POSITION_LEFT, CD_PROP_FLOAT3)) {
-      positions_left = {static_cast<float3 *>(layer.data), this->points_num()};
-      continue;
-    }
-    if (positions_right.is_empty() &&
-        layer_matches_name_and_type(layer, ATTR_HANDLE_POSITION_RIGHT, CD_PROP_FLOAT3)) {
-      positions_right = {static_cast<float3 *>(layer.data), this->points_num()};
-      continue;
-    }
-    if (types_left.is_empty() &&
-        layer_matches_name_and_type(layer, ATTR_HANDLE_TYPE_LEFT, CD_PROP_INT8)) {
-      types_left = {static_cast<int8_t *>(layer.data), this->points_num()};
-      continue;
+  Set<StringRef> bezier_handle_names{{ATTR_HANDLE_POSITION_LEFT,
+                                      ATTR_HANDLE_POSITION_RIGHT,
+                                      ATTR_HANDLE_TYPE_LEFT,
+                                      ATTR_HANDLE_TYPE_RIGHT}};
+
+  MutableAttributeAccessor attributes = this->attributes_for_write();
+
+  attributes.for_all([&](const AttributeIDRef &id, AttributeMetaData meta_data) {
+    if (meta_data.domain != ATTR_DOMAIN_POINT) {
+      return true;
     }
-    if (types_right.is_empty() &&
-        layer_matches_name_and_type(layer, ATTR_HANDLE_TYPE_RIGHT, CD_PROP_INT8)) {
-      types_right = {static_cast<int8_t *>(layer.data), this->points_num()};
-      continue;
+    if (id.is_named() && bezier_handle_names.contains(id.name())) {
+      return true;
     }
 
-    const eCustomDataType data_type = static_cast<eCustomDataType>(layer.type);
-    attribute_math::convert_to_static_type(data_type, [&](auto dummy) {
+    GSpanAttributeWriter attribute = attributes.lookup_for_write_span(id);
+    attribute_math::convert_to_static_type(attribute.span.type(), [&](auto dummy) {
       using T = decltype(dummy);
-      reverse_curve_point_data<T>(
-          *this, curves_to_reverse, {static_cast<T *>(layer.data), this->points_num()});
+      reverse_curve_point_data<T>(*this, curves_to_reverse, attribute.span.typed<T>());
     });
-  }
+    attribute.finish();
+    return true;
+  });
 
   /* In order to maintain the shape of Bezier curves, handle attributes must reverse, but also the
    * values for the left and right must swap. Use a utility to swap and reverse at the same time,
    * to avoid loading the attribute twice. Generally we can expect the right layer to exist when
    * the left does, but there's no need to count on it, so check for both attributes. */
 
-  if (!positions_left.is_empty() && !positions_right.is_empty()) {
-    reverse_swap_curve_point_data(*this, curves_to_reverse, positions_left, positions_right);
+  if (attributes.contains(ATTR_HANDLE_POSITION_LEFT) &&
+      attributes.contains(ATTR_HANDLE_POSITION_RIGHT)) {
+    reverse_swap_curve_point_data(*this,
+                                  curves_to_reverse,
+                                  this->handle_positions_left_for_write(),
+                                  this->handle_positions_right_for_write());
   }
-  if (!types_left.is_empty() && !types_right.is_empty()) {
-    reverse_swap_curve_point_data(*this, curves_to_reverse, types_left, types_right);
+  if (attributes.contains(ATTR_HANDLE_TYPE_LEFT) && attributes.contains(ATTR_HANDLE_TYPE_RIGHT)) {
+    reverse_swap_curve_point_data(*this,
+                                  curves_to_reverse,
+                                  this->handle_types_left_for_write(),
+                                  this->handle_types_right_for_write());
   }
 
   this->tag_topology_changed();
@@ -1450,21 +1440,20 @@ void CurvesGeometry::reverse_curves(const IndexMask curves_to_reverse)
 
 void CurvesGeometry::remove_attributes_based_on_types()
 {
-  const int points_num = this->points_num();
-  const int curves_num = this->curves_num();
+  MutableAttributeAccessor attributes = this->attributes_for_write();
   if (!this->has_curve_with_type(CURVE_TYPE_BEZIER)) {
-    CustomData_free_layer_named(&this->point_data, ATTR_HANDLE_TYPE_LEFT.c_str(), points_num);
-    CustomData_free_layer_named(&this->point_data, ATTR_HANDLE_TYPE_RIGHT.c_str(), points_num);
-    CustomData_free_layer_named(&this->point_data, ATTR_HANDLE_POSITION_LEFT.c_str(), points_num);
-    CustomData_free_layer_named(&this->point_data, ATTR_HANDLE_POSITION_RIGHT.c_str(), points_num);
+    attributes.remove(ATTR_HANDLE_TYPE_LEFT);
+    attributes.remove(ATTR_HANDLE_TYPE_RIGHT);
+    attributes.remove(ATTR_HANDLE_POSITION_LEFT);
+    attributes.remove(ATTR_HANDLE_POSITION_RIGHT);
   }
   if (!this->has_curve_with_type(CURVE_TYPE_NURBS)) {
-    CustomData_free_layer_named(&this->point_data, ATTR_NURBS_WEIGHT.c_str(), points_num);
-    CustomData_free_layer_named(&this->curve_data, ATTR_NURBS_ORDER.c_str(), curves_num);
-    CustomData_free_layer_named(&this->curve_data, ATTR_NURBS_KNOTS_MODE.c_str(), curves_num);
+    attributes.remove(ATTR_NURBS_WEIGHT);
+    attributes.remove(ATTR_NURBS_ORDER);
+    attributes.remove(ATTR_NURBS_KNOTS_MODE);
   }
   if (!this->has_curve_with_type({CURVE_TYPE_BEZIER, CURVE_TYPE_CATMULL_ROM, CURVE_TYPE_NURBS})) {
-    CustomData_free_layer_named(&this->curve_data, ATTR_RESOLUTION.c_str(), curves_num);
+    attributes.remove(ATTR_RESOLUTION);
   }
 }



More information about the Bf-blender-cvs mailing list