78 virtual bool exists(
const void *owner)
const = 0;
113 UNUSED_VARS(owner, attribute_id, domain, data_type, initializer);
135 : domain_(domain), custom_data_access_(custom_data_access)
162 return ((1ULL << data_type) & supported_types_mask) != 0;
177 const AsReadAttribute as_read_attribute_;
178 const AsWriteAttribute as_write_attribute_;
185 const AsReadAttribute as_read_attribute,
186 const AsWriteAttribute as_write_attribute)
188 attribute_type_(attribute_type),
189 stored_type_(stored_type),
190 custom_data_access_(custom_data_access),
191 as_read_attribute_(as_read_attribute),
192 as_write_attribute_(as_write_attribute)
223 using AsReadAttribute =
GVArray (*)(
const void *
data,
int element_num);
225 using UpdateOnRead =
void (*)(
const void *owner);
226 using UpdateOnChange =
void (*)(
void *owner);
229 const AsReadAttribute as_read_attribute_;
230 const AsWriteAttribute as_write_attribute_;
231 const UpdateOnChange update_on_change_;
232 bool stored_as_named_attribute_;
243 const AsReadAttribute as_read_attribute,
244 const AsWriteAttribute as_write_attribute,
245 const UpdateOnChange update_on_write)
247 std::move(attribute_name),
domain, attribute_type, creatable, writable, deletable),
248 stored_type_(stored_type),
249 custom_data_access_(custom_data_access),
250 as_read_attribute_(as_read_attribute),
251 as_write_attribute_(as_write_attribute),
252 update_on_change_(update_on_write),
253 stored_as_named_attribute_(
data_type_ == stored_type_)
261 bool exists(
const void *owner)
const final;
294 builtin_attribute_providers_.
add_new(provider->name(), provider);
295 supported_domains_.
add(provider->domain());
298 provider->foreach_domain([&](
eAttrDomain domain) { supported_domains_.
add(domain); });
304 return builtin_attribute_providers_;
309 return dynamic_attribute_providers_;
314 return supported_domains_;
318 namespace attribute_accessor_functions {
320 template<const ComponentAttributeProv
iders &prov
iders>
327 return providers.builtin_attribute_providers().contains_as(name);
330 template<const ComponentAttributeProv
iders &prov
iders>
336 providers.builtin_attribute_providers().lookup_default_as(name,
nullptr)) {
337 return {provider->try_get_for_read(owner), provider->domain()};
349 template<const ComponentAttributeProv
iders &prov
iders>
355 providers.builtin_attribute_providers().values()) {
356 if (provider->exists(owner)) {
358 if (!fn(provider->name(), meta_data)) {
361 handled_attribute_ids.
add_new(provider->name());
365 const bool continue_loop = provider->foreach_attribute(
367 if (handled_attribute_ids.
add(attribute_id)) {
368 return fn(attribute_id, meta_data);
372 if (!continue_loop) {
379 template<const ComponentAttributeProv
iders &prov
iders>
386 if (attribute_id == other_attribute_id) {
395 template<const ComponentAttributeProv
iders &prov
iders>
399 std::optional<AttributeMetaData> meta_data;
403 if (attribute_id == other_attribute_id) {
404 meta_data = other_meta_data;
412 template<const ComponentAttributeProv
iders &prov
iders>
418 providers.builtin_attribute_providers().lookup_default_as(name,
nullptr)) {
419 return provider->try_get_for_write(owner);
431 template<const ComponentAttributeProv
iders &prov
iders>
437 providers.builtin_attribute_providers().lookup_default_as(name,
nullptr)) {
438 return provider->try_delete(owner);
441 bool success =
false;
443 success = provider->try_delete(owner, attribute_id) || success;
448 template<const ComponentAttributeProv
iders &prov
iders>
449 inline bool add(
void *owner,
455 if (contains<providers>(owner, attribute_id)) {
461 providers.builtin_attribute_providers().lookup_default_as(name,
nullptr)) {
462 if (provider->domain() != domain) {
465 if (provider->data_type() != data_type) {
468 return provider->try_create(owner, initializer);
472 if (provider->try_create(owner, attribute_id, domain, data_type, initializer)) {
479 template<const ComponentAttributeProv
iders &prov
iders>
483 lookup_meta_data<providers>,
486 is_builtin<providers>,
490 lookup_for_write<providers>,
in reality light always falls off quadratically Particle Retrieve the data of the particle that spawned the object for example to give variation to multiple instances of an object Point Retrieve information about points in a point cloud Retrieve the edges of an object as it appears to Cycles topology will always appear triangulated Convert a blackbody temperature to an RGB value Normal Generate a perturbed normal from an RGB normal map image Typically used for faking highly detailed surfaces Generate an OSL shader from a file or text data block Image Sample an image file as a texture Sky Generate a procedural sky texture Noise Generate fractal Perlin noise Wave Generate procedural bands or rings with noise Voronoi Generate Worley noise based on the distance to random points Typically used to generate textures such as or biological cells Brick Generate a procedural texture producing bricks Texture Retrieve multiple types of texture coordinates nTypically used as inputs for texture nodes Vector Convert a or normal between and object coordinate space Combine Create a color from its and value channels Color Retrieve a color attribute
void add_new(const Key &key, const Value &value)
void add_new(const Key &key)
static VArray ForSpan(Span< T > values)
static VMutableArray ForSpan(MutableSpan< T > values)
const WritableEnum writable_
virtual bool try_delete(void *owner) const =0
const CreatableEnum createable_
BuiltinAttributeProvider(std::string name, const eAttrDomain domain, const eCustomDataType data_type, const CreatableEnum createable, const WritableEnum writable, const DeletableEnum deletable)
virtual bool try_create(void *onwer, const AttributeInit &initializer) const =0
eAttrDomain domain() const
const eCustomDataType data_type_
virtual GAttributeWriter try_get_for_write(void *owner) const =0
const eAttrDomain domain_
virtual bool exists(const void *owner) const =0
virtual GVArray try_get_for_read(const void *owner) const =0
eCustomDataType data_type() const
StringRefNull name() const
const DeletableEnum deletable_
BuiltinCustomDataLayerProvider(std::string attribute_name, const eAttrDomain domain, const eCustomDataType attribute_type, const eCustomDataType stored_type, const CreatableEnum creatable, const WritableEnum writable, const DeletableEnum deletable, const CustomDataAccessInfo custom_data_access, const AsReadAttribute as_read_attribute, const AsWriteAttribute as_write_attribute, const UpdateOnChange update_on_write)
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
bool exists(const void *owner) const final
GVArray try_get_for_read(const void *owner) const final
Span< const DynamicAttributesProvider * > dynamic_attribute_providers() const
const Map< std::string, const BuiltinAttributeProvider * > & builtin_attribute_providers() const
ComponentAttributeProviders(Span< const BuiltinAttributeProvider * > builtin_attribute_providers, Span< const DynamicAttributesProvider * > dynamic_attribute_providers)
Span< eAttrDomain > supported_domains() const
CustomDataAttributeProvider(const eAttrDomain domain, const CustomDataAccessInfo custom_data_access)
bool try_delete(void *owner, const AttributeIDRef &attribute_id) const final
GAttributeWriter try_get_for_write(void *owner, const AttributeIDRef &attribute_id) const final
void foreach_domain(const FunctionRef< void(eAttrDomain)> callback) const final
bool try_create(void *owner, const AttributeIDRef &attribute_id, eAttrDomain domain, const eCustomDataType data_type, const AttributeInit &initializer) const final
bool foreach_attribute(const void *owner, const AttributeForeachCallback callback) const final
GAttributeReader try_get_for_read(const void *owner, const AttributeIDRef &attribute_id) const final
virtual bool try_create(void *owner, const AttributeIDRef &attribute_id, const eAttrDomain domain, const eCustomDataType data_type, const AttributeInit &initializer) const
virtual bool try_delete(void *owner, const AttributeIDRef &attribute_id) const =0
virtual bool foreach_attribute(const void *owner, const AttributeForeachCallback callback) const =0
virtual GAttributeReader try_get_for_read(const void *owner, const AttributeIDRef &attribute_id) const =0
virtual GAttributeWriter try_get_for_write(void *owner, const AttributeIDRef &attribute_id) const =0
virtual void foreach_domain(const FunctionRef< void(eAttrDomain)> callback) const =0
GAttributeWriter try_get_for_write(void *owner, const AttributeIDRef &attribute_id) const final
void foreach_domain(const FunctionRef< void(eAttrDomain)> callback) const final
GAttributeReader try_get_for_read(const void *owner, const AttributeIDRef &attribute_id) const final
bool foreach_attribute(const void *owner, const AttributeForeachCallback callback) const final
bool try_delete(void *owner, const AttributeIDRef &attribute_id) const final
NamedLegacyCustomDataProvider(const eAttrDomain domain, const eCustomDataType attribute_type, const eCustomDataType stored_type, const CustomDataAccessInfo custom_data_access, const AsReadAttribute as_read_attribute, const AsWriteAttribute as_write_attribute)
DEGForeachIDComponentCallback callback
SyclQueue void void size_t num_bytes void
AttributeAccessorFunctions accessor_functions_for_providers()
bool contains(const void *owner, const blender::bke::AttributeIDRef &attribute_id)
bool is_builtin(const void *UNUSED(owner), const AttributeIDRef &attribute_id)
GAttributeWriter lookup_for_write(void *owner, const AttributeIDRef &attribute_id)
bool add(void *owner, const AttributeIDRef &attribute_id, eAttrDomain domain, eCustomDataType data_type, const AttributeInit &initializer)
GAttributeReader lookup(const void *owner, const AttributeIDRef &attribute_id)
std::optional< AttributeMetaData > lookup_meta_data(const void *owner, const AttributeIDRef &attribute_id)
bool remove(void *owner, const AttributeIDRef &attribute_id)
bool for_all(const void *owner, FunctionRef< bool(const AttributeIDRef &, const AttributeMetaData &)> fn)
static int domain_num(const CurvesGeometry &curves, const eAttrDomain domain)
GVArray make_array_read_attribute(const void *data, const int domain_num)
GVMutableArray make_array_write_attribute(void *data, const int domain_num)
unsigned __int64 uint64_t
void(*)(void *owner) UpdateCustomDataPointers
CustomData *(*)(void *owner) CustomDataGetter
GetElementNum get_element_num
ConstCustomDataGetter get_const_custom_data
const CustomData *(*)(const void *owner) ConstCustomDataGetter
CustomDataGetter get_custom_data
UpdateCustomDataPointers update_custom_data_pointers
int(*)(const void *owner) GetElementNum