76 virtual bool exists(
const void *owner)
const = 0;
119 UNUSED_VARS(owner, attribute_id, domain, data_type, initializer);
144 : domain_(domain), custom_data_access_(custom_data_access)
171 return ((1ULL << data_type) & supported_types_mask) != 0;
183 using AttrUpdateOnChange = void (*)(
void *owner);
185 const AttrUpdateOnChange update_on_change_;
193 const AttrUpdateOnChange update_on_change,
198 custom_data_access_(custom_data_access),
199 update_on_change_(update_on_change)
206 bool try_create(
void *owner,
const AttributeInit &initializer)
const final;
207 bool exists(
const void *owner)
const final;
210 bool layer_exists(
const CustomData &custom_data)
const;
243 builtin_attribute_providers_.add_new(provider->name(), provider);
244 supported_domains_.add(provider->domain());
247 provider->foreach_domain([&](
AttrDomain domain) { supported_domains_.add(domain); });
253 return builtin_attribute_providers_;
258 return dynamic_attribute_providers_;
263 return supported_domains_;
269template<const GeometryAttributeProv
iders &prov
iders>
274 providers.builtin_attribute_providers().lookup_default_as(
name,
nullptr))
282template<const GeometryAttributeProv
iders &prov
iders>
286 providers.builtin_attribute_providers().lookup_default_as(attribute_id,
nullptr))
288 return provider->default_value();
293template<const GeometryAttributeProv
iders &prov
iders>
297 providers.builtin_attribute_providers().lookup_default_as(
name,
nullptr))
299 return provider->try_get_for_read(owner);
310template<const GeometryAttributeProv
iders &prov
iders>
318 if (provider->exists(owner)) {
319 const auto get_fn = [&]() {
return provider->try_get_for_read(owner); };
330 handled_attribute_ids.
add(iter.
name);
334 const bool continue_loop = provider->foreach_attribute(owner, [&](
const AttributeIter &iter) {
335 if (handled_attribute_ids.
add(iter.
name)) {
340 if (!continue_loop) {
346template<const GeometryAttributeProv
iders &prov
iders>
350 providers.builtin_attribute_providers().lookup_default_as(
name,
nullptr);
357template<const GeometryAttributeProv
iders &prov
iders>
361 providers.builtin_attribute_providers().lookup_default_as(
name,
nullptr))
363 return provider->try_get_for_write(owner);
374template<const GeometryAttributeProv
iders &prov
iders>
378 providers.builtin_attribute_providers().lookup_default_as(
name,
nullptr))
380 return provider->try_delete(owner);
383 if (provider->try_delete(owner,
name)) {
390template<const GeometryAttributeProv
iders &prov
iders>
391inline bool add(
void *owner,
399 providers.builtin_attribute_providers().lookup_default_as(
name,
nullptr))
401 if (provider->domain() != domain) {
404 if (provider->data_type() != custom_data_type) {
407 return provider->try_create(owner, initializer);
410 if (provider->try_create(owner,
name, domain, custom_data_type, initializer)) {
417template<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
BuiltinCustomDataLayerProvider(std::string attribute_name, const AttrDomain domain, const eCustomDataType data_type, const DeletableEnum deletable, const CustomDataAccessInfo custom_data_access, const AttrUpdateOnChange update_on_change, const AttributeValidator validator={}, const GPointer default_value={})
bool try_delete(void *owner) const final
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()
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)
bool add(void *owner, const StringRef name, const AttrDomain domain, const AttrType data_type, const AttributeInit &initializer)
GAttributeReader lookup(const void *owner, const StringRef name)
std::optional< eCustomDataType > attr_type_to_custom_data_type(AttrType attr_type)
std::optional< AttrType > custom_data_type_to_attr_type(eCustomDataType data_type)
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