[Bf-blender-cvs] [ec090a215be] geometry-nodes-curve-support: WIP point attributes
Hans Goudey
noreply at git.blender.org
Sat Apr 10 05:50:52 CEST 2021
Commit: ec090a215beb56e4cfb48e76456a8de2d86f1da2
Author: Hans Goudey
Date: Fri Apr 9 10:53:19 2021 -0500
Branches: geometry-nodes-curve-support
https://developer.blender.org/rBec090a215beb56e4cfb48e76456a8de2d86f1da2
WIP point attributes
===================================================================
M source/blender/blenkernel/intern/geometry_component_curve.cc
===================================================================
diff --git a/source/blender/blenkernel/intern/geometry_component_curve.cc b/source/blender/blenkernel/intern/geometry_component_curve.cc
index ab0a31e6795..f1a2abe0df6 100644
--- a/source/blender/blenkernel/intern/geometry_component_curve.cc
+++ b/source/blender/blenkernel/intern/geometry_component_curve.cc
@@ -14,6 +14,8 @@
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
+#include "FN_generic_virtual_array.hh"
+
#include "BKE_derived_curve.hh"
#include "BKE_attribute_access.hh"
@@ -147,17 +149,15 @@ class BuiltinSplineAttributeProvider final : public BuiltinAttributeProvider {
public:
BuiltinSplineAttributeProvider(std::string attribute_name,
const CustomDataType attribute_type,
- const CreatableEnum creatable,
const WritableEnum writable,
- const DeletableEnum deletable,
const AsReadAttribute as_read_attribute,
const AsWriteAttribute as_write_attribute)
: BuiltinAttributeProvider(std::move(attribute_name),
ATTR_DOMAIN_CURVE,
attribute_type,
- creatable,
+ BuiltinAttributeProvider::NonCreatable,
writable,
- deletable),
+ BuiltinAttributeProvider::NonDeletable),
as_read_attribute_(as_read_attribute),
as_write_attribute_(as_write_attribute)
{
@@ -273,6 +273,71 @@ static WriteAttributePtr make_cyclic_write_attribute(DCurve &curve)
ATTR_DOMAIN_CURVE, curve.splines.as_mutable_span());
}
+class BuiltinPointAttributeProvider final : public BuiltinAttributeProvider {
+ using GetSplineWriteSpan = fn::GVArray (*)(const DCurve &data);
+ using AsWriteAttribute = WriteAttributePtr (*)(DCurve &data);
+ using UpdateOnWrite = void (*)(Spline &spline);
+ const GetSplineWriteSpan as_read_attribute_;
+ const AsWriteAttribute as_write_attribute_;
+
+ public:
+ BuiltinPointAttributeProvider(std::string attribute_name,
+ const CustomDataType attribute_type,
+ const WritableEnum writable,
+ const AsReadAttribute as_read_attribute,
+ const AsWriteAttribute as_write_attribute)
+ : BuiltinAttributeProvider(std::move(attribute_name),
+ ATTR_DOMAIN_POINT,
+ attribute_type,
+ BuiltinAttributeProvider::NonCreatable,
+ writable,
+ BuiltinAttributeProvider::NonDeletable),
+ as_read_attribute_(as_read_attribute),
+ as_write_attribute_(as_write_attribute)
+ {
+ }
+
+ ReadAttributePtr try_get_for_read(const GeometryComponent &component) const final
+ {
+ const CurveComponent &curve_component = static_cast<const CurveComponent &>(component);
+ const DCurve *curve = curve_component.get_for_read();
+ if (curve == nullptr) {
+ return {};
+ }
+
+ return as_read_attribute_(*curve);
+ }
+
+ WriteAttributePtr try_get_for_write(GeometryComponent &component) const final
+ {
+ if (writable_ != Writable) {
+ return {};
+ }
+ CurveComponent &curve_component = static_cast<CurveComponent &>(component);
+ DCurve *curve = curve_component.get_for_write();
+ if (curve == nullptr) {
+ return {};
+ }
+
+ return as_write_attribute_(*curve);
+ }
+
+ bool try_delete(GeometryComponent &UNUSED(component)) const final
+ {
+ return false;
+ }
+
+ bool try_create(GeometryComponent &UNUSED(component)) const final
+ {
+ return false;
+ }
+
+ bool exists(const GeometryComponent &component) const final
+ {
+ return component.attribute_domain_size(ATTR_DOMAIN_POINT) != 0;
+ }
+};
+
/**
* In this function all the attribute providers for a curve component are created. Most data
* in this function is statically allocated, because it does not change over time.
@@ -281,28 +346,25 @@ static ComponentAttributeProviders create_attribute_providers_for_curve()
{
static BuiltinSplineAttributeProvider resolution("resolution",
CD_PROP_INT32,
- BuiltinAttributeProvider::NonCreatable,
BuiltinAttributeProvider::Writable,
- BuiltinAttributeProvider::NonDeletable,
make_resolution_read_attribute,
make_resolution_write_attribute);
- static BuiltinSplineAttributeProvider length("length",
- CD_PROP_FLOAT,
- BuiltinAttributeProvider::NonCreatable,
- BuiltinAttributeProvider::Readonly,
- BuiltinAttributeProvider::NonDeletable,
- make_length_attribute,
- nullptr);
+ static BuiltinSplineAttributeProvider length(
+ "length", CD_PROP_FLOAT, BuiltinAttributeProvider::Readonly, make_length_attribute, nullptr);
static BuiltinSplineAttributeProvider cyclic("cyclic",
CD_PROP_BOOL,
- BuiltinAttributeProvider::NonCreatable,
BuiltinAttributeProvider::Writable,
- BuiltinAttributeProvider::NonDeletable,
make_cyclic_read_attribute,
make_cyclic_write_attribute);
+ static BuiltinPointAttributeProvider radius("radius",
+ CD_PROP_FLOAT,
+ BuiltinAttributeProvider::Writable,
+ get_spline_radius_span,
+ set_spline_radius_span);
+
return ComponentAttributeProviders({&resolution, &length, &cyclic}, {});
}
More information about the Bf-blender-cvs
mailing list