75 virtual bool exists(
const void *owner)
const = 0;
118 UNUSED_VARS(owner, attribute_id, domain, data_type, initializer);
143 : domain_(domain), custom_data_access_(custom_data_access)
170 return ((1ULL << data_type) & supported_types_mask) != 0;
182 using UpdateOnChange = void (*)(
void *owner);
184 const UpdateOnChange update_on_change_;
192 const UpdateOnChange update_on_change,
197 custom_data_access_(custom_data_access),
198 update_on_change_(update_on_change)
205 bool try_create(
void *owner,
const AttributeInit &initializer)
const final;
206 bool exists(
const void *owner)
const final;
209 bool layer_exists(
const CustomData &custom_data)
const;
242 builtin_attribute_providers_.add_new(provider->name(), provider);
243 supported_domains_.add(provider->domain());
246 provider->foreach_domain([&](
AttrDomain domain) { supported_domains_.add(domain); });
252 return builtin_attribute_providers_;
257 return dynamic_attribute_providers_;
262 return supported_domains_;
268template<const GeometryAttributeProv
iders &prov
iders>
273 providers.builtin_attribute_providers().lookup_default_as(name,
nullptr))
280template<const GeometryAttributeProv
iders &prov
iders>
284 providers.builtin_attribute_providers().lookup_default_as(attribute_id,
nullptr))
286 return provider->default_value();
291template<const GeometryAttributeProv
iders &prov
iders>
295 providers.builtin_attribute_providers().lookup_default_as(name,
nullptr))
297 return provider->try_get_for_read(owner);
308template<const GeometryAttributeProv
iders &prov
iders>
316 if (provider->exists(owner)) {
317 const auto get_fn = [&]() {
return provider->try_get_for_read(owner); };
318 AttributeIter iter{provider->name(), provider->domain(), provider->data_type(), get_fn};
325 handled_attribute_ids.
add(iter.
name);
329 const bool continue_loop = provider->foreach_attribute(owner, [&](
const AttributeIter &iter) {
330 if (handled_attribute_ids.
add(iter.
name)) {
335 if (!continue_loop) {
341template<const GeometryAttributeProv
iders &prov
iders>
345 providers.builtin_attribute_providers().lookup_default_as(name,
nullptr);
352template<const GeometryAttributeProv
iders &prov
iders>
356 providers.builtin_attribute_providers().lookup_default_as(name,
nullptr))
358 return provider->try_get_for_write(owner);
369template<const GeometryAttributeProv
iders &prov
iders>
373 providers.builtin_attribute_providers().lookup_default_as(name,
nullptr))
375 return provider->try_delete(owner);
378 if (provider->try_delete(owner, name)) {
385template<const GeometryAttributeProv
iders &prov
iders>
386inline bool add(
void *owner,
393 providers.builtin_attribute_providers().lookup_default_as(name,
nullptr))
395 if (provider->domain() != domain) {
398 if (provider->data_type() != data_type) {
401 return provider->try_create(owner, initializer);
404 if (provider->try_create(owner, name, domain, data_type, initializer)) {
411template<const GeometryAttributeProv
iders &prov
iders>
unsigned long long int uint64_t
const AttributeAccessor * accessor
virtual bool try_delete(void *owner) const =0
GPointer default_value() const
virtual bool try_create(void *owner, const AttributeInit &initializer) const =0
AttrDomain domain() const
virtual GAttributeReader try_get_for_read(const void *owner) const =0
const AttributeValidator validator_
const eCustomDataType data_type_
virtual GAttributeWriter try_get_for_write(void *owner) const =0
virtual bool exists(const void *owner) const =0
eCustomDataType data_type() const
const GPointer default_value_
AttributeValidator validator() const
StringRefNull name() const
const DeletableEnum deletable_
BuiltinAttributeProvider(std::string name, const AttrDomain domain, const eCustomDataType data_type, const DeletableEnum deletable, AttributeValidator validator={}, const GPointer default_value={})
GAttributeWriter try_get_for_write(void *owner) const final
bool try_create(void *owner, const AttributeInit &initializer) const final
bool try_delete(void *owner) const final
BuiltinCustomDataLayerProvider(std::string attribute_name, const AttrDomain domain, const eCustomDataType data_type, const DeletableEnum deletable, const CustomDataAccessInfo custom_data_access, const UpdateOnChange update_on_change, const AttributeValidator validator={}, const GPointer default_value={})
bool exists(const void *owner) const final
GAttributeReader try_get_for_read(const void *owner) const final
GAttributeWriter try_get_for_write(void *owner, StringRef attribute_id) const final
CustomDataAttributeProvider(const AttrDomain domain, const CustomDataAccessInfo custom_data_access)
bool try_delete(void *owner, StringRef attribute_id) const final
GAttributeReader try_get_for_read(const void *owner, StringRef attribute_id) const final
bool foreach_attribute(const void *owner, FunctionRef< void(const AttributeIter &)> fn) const final
bool try_create(void *owner, StringRef attribute_id, AttrDomain domain, const eCustomDataType data_type, const AttributeInit &initializer) const final
void foreach_domain(const FunctionRef< void(AttrDomain)> callback) const final
virtual bool try_create(void *owner, const StringRef attribute_id, const AttrDomain domain, const eCustomDataType data_type, const AttributeInit &initializer) const
virtual GAttributeReader try_get_for_read(const void *owner, StringRef attribute_id) const =0
virtual GAttributeWriter try_get_for_write(void *owner, StringRef attribute_id) const =0
virtual bool try_delete(void *owner, StringRef attribute_id) const =0
virtual void foreach_domain(const FunctionRef< void(AttrDomain)> callback) const =0
virtual bool foreach_attribute(const void *owner, FunctionRef< void(const AttributeIter &)> fn) const =0
Span< AttrDomain > supported_domains() const
const Map< std::string, const BuiltinAttributeProvider * > & builtin_attribute_providers() const
Span< const DynamicAttributesProvider * > dynamic_attribute_providers() const
GeometryAttributeProviders(Span< const BuiltinAttributeProvider * > builtin_attribute_providers, Span< const DynamicAttributesProvider * > dynamic_attribute_providers)
AttributeAccessorFunctions accessor_functions_for_providers()
bool add(void *owner, const StringRef name, AttrDomain domain, eCustomDataType data_type, const AttributeInit &initializer)
GAttributeWriter lookup_for_write(void *owner, const StringRef name)
GPointer builtin_default_value(const void *, const StringRef attribute_id)
bool remove(void *owner, const StringRef name)
void foreach_attribute(const void *owner, const FunctionRef< void(const AttributeIter &)> fn, const AttributeAccessor &accessor)
std::optional< AttributeDomainAndType > builtin_domain_and_type(const void *, const StringRef name)
AttributeValidator lookup_validator(const void *, const blender::StringRef name)
GAttributeReader lookup(const void *owner, const StringRef name)
CustomData *(*)(void *owner) CustomDataGetter
GetTagModifiedFunction get_tag_modified_function
GetElementNum get_element_num
std::function< void()>(*)(void *owner, StringRef name) GetTagModifiedFunction
ConstCustomDataGetter get_const_custom_data
const CustomData *(*)(const void *owner) ConstCustomDataGetter
CustomDataGetter get_custom_data
int(*)(const void *owner) GetElementNum