42 void delete_self_with_data()
override
44 if (data_ !=
nullptr) {
51 void delete_data_only()
override
62 for (
const std::unique_ptr<Attribute> &attribute : this->
runtime->attributes) {
68 for (
const std::unique_ptr<Attribute> &attribute : this->
runtime->attributes) {
77 return MEM_new<ArrayDataImplicitSharing>(__func__,
data,
size, type);
82 if (std::get_if<Attribute::ArrayData>(&data_)) {
85 if (std::get_if<Attribute::SingleData>(&data_)) {
94 if (
auto *
data = std::get_if<Attribute::ArrayData>(&data_)) {
95 if (
data->sharing_info->is_mutable()) {
96 data->sharing_info->tag_ensured_mutable();
105 data->data = new_data;
109 else if (std::get_if<Attribute::SingleData>(&data_)) {
120 this->
runtime = MEM_new<AttributeStorageRuntime>(__func__);
127 this->
runtime = MEM_new<AttributeStorageRuntime>(__func__);
128 this->
runtime->attributes.reserve(other.
runtime->attributes.size());
130 this->
runtime->attributes.add_new(std::make_unique<Attribute>(attribute));
136 if (
this == &other) {
139 std::destroy_at(
this);
148 this->
runtime = MEM_new<AttributeStorageRuntime>(__func__, std::move(*other.runtime));
153 if (
this == &other) {
156 std::destroy_at(
this);
168 const std::unique_ptr<blender::bke::Attribute> *attribute =
169 this->
runtime->attributes.lookup_key_ptr_as(name);
173 return attribute->get();
178 const std::unique_ptr<blender::bke::Attribute> *attribute =
179 this->
runtime->attributes.lookup_key_ptr_as(name);
183 return attribute->get();
192 std::unique_ptr<Attribute>
ptr = std::make_unique<Attribute>();
194 attribute.name_ = std::move(name);
195 attribute.domain_ = domain;
196 attribute.type_ = data_type;
197 attribute.data_ = std::move(
data);
198 this->
runtime->attributes.add_new(std::move(
ptr));
204 return this->
runtime->attributes.remove_as(name);
210 [&](
const StringRef check_name) {
return this->
lookup(check_name) !=
nullptr; },
'.', name);
214 const int8_t dna_attr_type,
218 switch (dna_attr_type) {
220 static_assert(
sizeof(bool) ==
sizeof(int8_t));
267 const int8_t dna_attr_type,
272 const char *func = __func__;
275 if (*
data ==
nullptr) {
279 return MEM_new<ArrayDataImplicitSharing>(func, *
data,
size, cpp_type);
284 const int8_t dna_storage_type,
285 const int8_t dna_attr_type,
288 switch (dna_storage_type) {
314 for (
const std::unique_ptr<Attribute> &attr : this->
runtime->attributes) {
316 if (
const auto *
data = std::get_if<Attribute::ArrayData>(&attr->data())) {
318 shared_memory.add(data->size * type.size);
321 else if (
const auto *
data = std::get_if<Attribute::SingleData>(&attr->data())) {
323 [&](
MemoryCounter &shared_memory) { shared_memory.add(type.size); });
330 switch (dna_domain) {
346 this->
runtime = MEM_new<AttributeStorageRuntime>(__func__);
367 std::unique_ptr<Attribute> attribute = std::make_unique<Attribute>();
368 attribute->name_ = dna_attr.
name;
369 attribute->domain_ = *domain;
371 attribute->data_ = std::move(*
data);
373 if (!this->
runtime->attributes.add(std::move(attribute))) {
374 CLOG_ERROR(&
LOG,
"Ignoring attribute with duplicate name: \"%s\"", dna_attr.
name);
390 static_assert(
sizeof(bool) ==
sizeof(int8_t));
441 all_names_written.
add(layer.name);
445 if (!
U.experimental.use_attribute_storage_write) {
454 if (
const auto *array_data = std::get_if<Attribute::ArrayData>(&attr.
data())) {
456 layer.
type = *data_type;
457 layer.
data = array_data->data;
469 all_names_written.
add(layer.
name);
471 layers_to_write.lookup(attr.
domain())->append(layer);
478 all_names_written.
add(attr.
name());
492 if (
const auto *
data = std::get_if<Attribute::ArrayData>(&attr.
data())) {
495 array_dna.sharing_info =
data->sharing_info.get();
496 array_dna.size =
data->size;
497 attribute_dna.
data = &array_dna;
499 else if (
const auto *
data = std::get_if<Attribute::SingleData>(&attr.
data())) {
502 single_dna.sharing_info =
data->sharing_info.get();
503 attribute_dna.
data = &single_dna;
518 write_array_data(writer, data_type, data, size);
533 for (const ::Attribute &attr_dna : write_data.
attributes) {
#define BLI_assert_unreachable()
#define BLI_SCOPED_DEFER(function_to_defer)
size_t void BLI_uniquename_cb(blender::FunctionRef< bool(blender::StringRefNull)> unique_check, const char *defname, char delim, char *name, size_t name_maxncpy) ATTR_NONNULL(2
void BLO_write_float_array(BlendWriter *writer, int64_t num, const float *data_ptr)
void BLO_read_uint8_array(BlendDataReader *reader, int64_t array_size, uint8_t **ptr_p)
void BLO_read_float3_array(BlendDataReader *reader, int64_t array_size, float **ptr_p)
void BLO_write_int32_array(BlendWriter *writer, int64_t num, const int32_t *data_ptr)
void BLO_write_struct_array_by_name(BlendWriter *writer, const char *struct_name, int64_t array_size, const void *data_ptr)
void BLO_read_float_array(BlendDataReader *reader, int64_t array_size, float **ptr_p)
void BLO_read_int32_array(BlendDataReader *reader, int64_t array_size, int32_t **ptr_p)
void BLO_write_uint8_array(BlendWriter *writer, int64_t num, const uint8_t *data_ptr)
#define BLO_write_struct(writer, struct_name, data_ptr)
void BLO_write_float3_array(BlendWriter *writer, int64_t num, const float *data_ptr)
void BLO_read_int16_array(BlendDataReader *reader, const int64_t array_size, int16_t **ptr_p)
void BLO_write_int8_array(BlendWriter *writer, int64_t num, const int8_t *data_ptr)
void BLO_read_string(BlendDataReader *reader, char **ptr_p)
void BLO_write_string(BlendWriter *writer, const char *data_ptr)
#define BLO_write_struct_array(writer, struct_name, array_size, data_ptr)
void BLO_read_int8_array(BlendDataReader *reader, int64_t array_size, int8_t **ptr_p)
#define BLO_read_struct_array(reader, struct_name, array_size, ptr_p)
#define BLO_read_struct(reader, struct_name, ptr_p)
void BLO_write_int16_array(BlendWriter *writer, int64_t num, const int16_t *data_ptr)
void BLO_write_shared(BlendWriter *writer, const void *data, size_t approximate_size_in_bytes, const blender::ImplicitSharingInfo *sharing_info, blender::FunctionRef< void()> write_fn)
const blender::ImplicitSharingInfo * BLO_read_shared(BlendDataReader *reader, T **data_ptr, blender::FunctionRef< const blender::ImplicitSharingInfo *()> read_fn)
#define CLOG_ERROR(clg_ref,...)
BMesh const char void * data
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
void copy_construct_n(const void *src, void *dst, int64_t n) const
void destruct_n(void *ptr, int64_t n) const
T & construct(Args &&...args)
bool contains(const Key &key) const
constexpr const char * c_str() const
ArrayDataImplicitSharing(void *data, const int64_t size, const CPPType &type)
Attribute & add(std::string name, bke::AttrDomain domain, bke::AttrType data_type, Attribute::DataVariant data)
void count_memory(MemoryCounter &memory) const
Attribute * lookup(StringRef name)
void foreach(FunctionRef< void(Attribute &)> fn)
void blend_read(BlendDataReader &reader)
std::string unique_name_calc(StringRef name)
bool remove(StringRef name)
void blend_write(BlendWriter &writer, const BlendWriteData &write_data)
AttributeStorage & operator=(const AttributeStorage &other)
AttrStorageType storage_type() const
const DataVariant & data() const
std::variant< ArrayData, SingleData > DataVariant
DataVariant & data_for_write()
AttrDomain domain() const
StringRefNull name() const
AttrType data_type() const
void add_shared(const ImplicitSharingInfo *sharing_info, const FunctionRef< void(MemoryCounter &shared_memory)> count_fn)
#define MAX_CUSTOMDATA_LAYER_NAME
void MEM_freeN(void *vmemh)
void *(* MEM_malloc_arrayN_aligned)(size_t len, size_t size, size_t alignment, const char *str)
std::optional< eCustomDataType > attr_type_to_custom_data_type(AttrType attr_type)
static std::optional< Attribute::DataVariant > read_attr_data(BlendDataReader &reader, const int8_t dna_storage_type, const int8_t dna_attr_type, ::Attribute &dna_attr)
static ImplicitSharingInfo * create_sharing_info_for_array(void *data, const int64_t size, const CPPType &type)
static std::optional< AttrDomain > read_attr_domain(const int8_t dna_domain)
static void write_array_data(BlendWriter &writer, const AttrType data_type, const void *data, const int64_t size)
static void write_shared_array(BlendWriter &writer, const AttrType data_type, const void *data, const int64_t size, const ImplicitSharingInfo &sharing_info)
static void read_shared_array(BlendDataReader &reader, const int8_t dna_attr_type, const int64_t size, void **data, const ImplicitSharingInfo **sharing_info)
static void read_array_data(BlendDataReader &reader, const int8_t dna_attr_type, const int64_t size, void **data)
const CPPType & attribute_type_to_cpp_type(AttrType type)
void attribute_storage_blend_write_prepare(AttributeStorage &data, const Map< AttrDomain, Vector< CustomDataLayer, 16 > * > &layers_to_write, AttributeStorage::BlendWriteData &write_data)
const ImplicitSharingInfoHandle * sharing_info
const ImplicitSharingInfoHandle * sharing_info
AttributeStorageRuntimeHandle * runtime
struct Attribute * dna_attributes
const ImplicitSharingInfoHandle * sharing_info
Vector<::Attribute, 16 > & attributes
BlendWriteData(ResourceScope &scope)