diff options
-rw-r--r-- | source/blender/blenkernel/BKE_geometry_set.hh | 6 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/attribute_access.cc | 8 | ||||
-rw-r--r-- | source/blender/nodes/geometry/nodes/node_geo_point_scale.cc | 3 |
3 files changed, 13 insertions, 4 deletions
diff --git a/source/blender/blenkernel/BKE_geometry_set.hh b/source/blender/blenkernel/BKE_geometry_set.hh index 57fad6bcdf6..391bd243edf 100644 --- a/source/blender/blenkernel/BKE_geometry_set.hh +++ b/source/blender/blenkernel/BKE_geometry_set.hh @@ -242,7 +242,8 @@ class GeometryComponent { /** * If an attribute with the given params exist, it is returned. - * If no attribute with the given name exists, it is created and returned. + * If no attribute with the given name exists, create it and + * fill it with the default value if it is provided. * If an attribute with the given name but different domain or type exists, a temporary attribute * is created that has to be saved after the output has been computed. This avoids deleting * another attribute, before a computation is finished. @@ -251,7 +252,8 @@ class GeometryComponent { */ OutputAttributePtr attribute_try_get_for_output(const blender::StringRef attribute_name, const AttributeDomain domain, - const CustomDataType data_type); + const CustomDataType data_type, + const void *default_value = nullptr); }; template<typename T> diff --git a/source/blender/blenkernel/intern/attribute_access.cc b/source/blender/blenkernel/intern/attribute_access.cc index 6739294a2c4..a7939beae90 100644 --- a/source/blender/blenkernel/intern/attribute_access.cc +++ b/source/blender/blenkernel/intern/attribute_access.cc @@ -814,7 +814,8 @@ blender::bke::ReadAttributePtr GeometryComponent::attribute_get_constant_for_rea OutputAttributePtr GeometryComponent::attribute_try_get_for_output(const StringRef attribute_name, const AttributeDomain domain, - const CustomDataType data_type) + const CustomDataType data_type, + const void *default_value) { BLI_assert(this->attribute_domain_with_type_supported(domain, data_type)); @@ -827,6 +828,11 @@ OutputAttributePtr GeometryComponent::attribute_try_get_for_output(const StringR if (!attribute) { this->attribute_try_create(attribute_name, domain, data_type); attribute = this->attribute_try_get_for_write(attribute_name); + if (default_value != nullptr) { + void *data = attribute->get_span_for_write_only().data(); + cpp_type->fill_initialized(default_value, data, attribute->size()); + attribute->apply_span(); + } return OutputAttributePtr(std::move(attribute)); } diff --git a/source/blender/nodes/geometry/nodes/node_geo_point_scale.cc b/source/blender/nodes/geometry/nodes/node_geo_point_scale.cc index e5cbe27768d..47fca93d2ab 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_point_scale.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_point_scale.cc @@ -34,8 +34,9 @@ namespace blender::nodes { static void execute_on_component(GeoNodeExecParams params, GeometryComponent &component) { + static const float3 scale_default = float3(1.0f); OutputAttributePtr scale_attribute = component.attribute_try_get_for_output( - "scale", ATTR_DOMAIN_POINT, CD_PROP_FLOAT3); + "scale", ATTR_DOMAIN_POINT, CD_PROP_FLOAT3, &scale_default); ReadAttributePtr attribute = params.get_input_attribute( "Factor", component, ATTR_DOMAIN_POINT, CD_PROP_FLOAT3, nullptr); if (!attribute) { |