17#define DNA_DEPRECATED_ALLOW
82#define CUSTOMDATA_GROW 5
107 return (((mask_required->
vmask & mask_ref->
vmask) == mask_required->
vmask) &&
167 void (*
swap)(
void *
data,
const int *corner_indices);
184 bool (*
equal)(
const void *data1,
const void *data2);
187 void (*
add)(
void *data1,
const void *data2);
189 void (*
copyvalue)(
const void *source,
void *dest,
int mixmode,
const float mixfactor);
225 memcpy(dw, dvert->
dw, dvert->
totweight *
sizeof(*dw));
246 const float *weights,
253 struct MDeformWeight_Link {
254 MDeformWeight_Link *
next;
259 MDeformWeight_Link *dest_dwlink =
nullptr;
260 MDeformWeight_Link *node;
266 float interp_weight = weights[
i];
268 for (
int j = 0; j < source->
totweight; j++) {
270 float weight = dw->
weight * interp_weight;
272 if (weight == 0.0f) {
276 for (node = dest_dwlink; node; node = node->next) {
287 MDeformWeight_Link *tmp_dwlink =
static_cast<MDeformWeight_Link *
>(
288 alloca(
sizeof(*tmp_dwlink)));
289 tmp_dwlink->dw.def_nr = dw->
def_nr;
290 tmp_dwlink->dw.weight = weight;
293 tmp_dwlink->next = dest_dwlink;
294 dest_dwlink = tmp_dwlink;
304 if (dvert->
dw && (dvert->
totweight == totweight)) {
320 for (node = dest_dwlink; node; node = node->next,
i++) {
321 node->dw.weight = std::min(node->dw.weight, 1.0f);
322 dvert->
dw[
i] = node->dw;
342 const float *weights,
350 float no[3] = {0.0f};
363 const float mixfactor)
365 const float *no_src = (
const float *)source;
366 float *no_dst = (
float *)dest;
409 dest_tf[
i] = source_tf[
i];
414 const float *weights,
415 const float *sub_weights,
420 float uv[4][2] = {{0.0f}};
422 const float *sub_weight = sub_weights;
424 const float interp_weight = weights[
i];
427 for (
int j = 0; j < 4; j++) {
429 for (
int k = 0; k < 4; k++, sub_weight++) {
440 *tf = *(
MTFace *)(*sources);
441 memcpy(tf->
uv, uv,
sizeof(tf->
uv));
449 for (
int j = 0; j < 4; j++) {
450 const int source_index = corner_indices[j];
454 memcpy(tf->
uv, uv,
sizeof(tf->
uv));
459 static MTFace default_tf = {{{0, 0}, {1, 0}, {1, 1}, {0, 1}}};
484 const float *weights,
491 const float interp_weight = weights[
i];
492 const float src = *(
const float *)sources[
i];
493 result += src * interp_weight;
501 bool has_errors =
false;
503 for (
int i = 0;
i < totitems;
i++, fp++) {
504 if (!isfinite(fp->
f)) {
522 const float *weights,
529 const float weight = weights[
i];
530 const float src = *
static_cast<const int *
>(sources[
i]);
534 *
static_cast<int *
>(dest) = rounded_result;
560 dest_tf[
i] = source_tf[
i];
565 const float *weights,
566 const float *sub_weights,
571 float uv[4][2] = {{0.0f}};
573 const float *sub_weight = sub_weights;
575 const float interp_weight = weights[
i];
578 for (
int j = 0; j < 4; j++) {
580 for (
int k = 0; k < 4; k++, sub_weight++) {
591 memcpy(osf->
uv, uv,
sizeof(osf->
uv));
599 for (
int j = 0; j < 4; j++) {
602 memcpy(osf->
uv, uv,
sizeof(osf->
uv));
607 static OrigSpaceFace default_osf = {{{0, 0}, {1, 0}, {1, 1}, {0, 1}}};
611 osf[
i] = default_osf;
626 int nverts = (ci[1] == 3) ? 4 : 3;
628 int cornersize = s->
totdisp / corners;
630 if (corners != nverts) {
642 for (
int S = 0; S < corners; S++) {
643 memcpy(d + cornersize * S, s->
disps + cornersize * ci[S],
sizeof(
float[3]) * cornersize);
696 if (!
cdf_read_data(cdf,
sizeof(
float[3]) * d[
i].totdisp, d[
i].disps)) {
725 size +=
sizeof(
float[3]) * d[
i].totdisp;
740 const int size =
sizeof(
void *);
810 const float mixfactor)
824 const float f = (float(m2->
r) + float(m2->
g) + float(m2->
b)) / 3.0f;
838 uchar src[4] = {m1->
r, m1->
g, m1->
b, m1->
a};
839 uchar dst[4] = {m2->
r, m2->
g, m2->
b, m2->
a};
854 memcpy(tmp_col, src,
sizeof(tmp_col));
859 m2->
r = char(dst[0]);
860 m2->
g = char(dst[1]);
861 m2->
b = char(dst[2]);
862 m2->
a = char(dst[3]);
877 return r * r + g * g +
b *
b + a * a < 0.001f;
884 m->
r = float(m->
r) * fac;
885 m->
g = float(m->
g) * fac;
886 m->
b = float(m->
b) * fac;
887 m->
a = float(m->
a) * fac;
907 min->r = std::min(m->
r,
min->r);
908 min->g = std::min(m->
g,
min->g);
909 min->b = std::min(m->
b,
min->b);
910 min->a = std::min(m->
a,
min->a);
911 max->r = std::max(m->
r,
max->r);
912 max->g = std::max(m->
g,
max->g);
913 max->b = std::max(m->
b,
max->b);
914 max->a = std::max(m->
a,
max->a);
935 MLoopCol default_mloopcol = {255, 255, 255, 255};
938 mlcol[
i] = default_mloopcol;
943 const float *weights,
957 const float interp_weight = weights[
i];
959 col.r += src->
r * interp_weight;
960 col.g += src->
g * interp_weight;
961 col.b += src->
b * interp_weight;
962 col.a += src->
a * interp_weight;
1034 const float *weights,
1043 const float interp_weight = weights[
i];
1054 const float *weights,
1055 const float *sub_weights,
1059 MCol *mc =
static_cast<MCol *
>(dest);
1065 }
col[4] = {{0.0f}};
1067 const float *sub_weight = sub_weights;
1069 const float interp_weight = weights[
i];
1071 for (
int j = 0; j < 4; j++) {
1073 const MCol *src =
static_cast<const MCol *
>(sources[
i]);
1074 for (
int k = 0; k < 4; k++, sub_weight++, src++) {
1075 const float w = (*sub_weight) * interp_weight;
1076 col[j].a += src->
a *
w;
1077 col[j].r += src->
r *
w;
1078 col[j].g += src->
g *
w;
1079 col[j].b += src->
b *
w;
1083 const MCol *src =
static_cast<const MCol *
>(sources[
i]);
1084 col[j].a += src[j].
a * interp_weight;
1085 col[j].r += src[j].
r * interp_weight;
1086 col[j].g += src[j].
g * interp_weight;
1087 col[j].b += src[j].
b * interp_weight;
1093 for (
int j = 0; j < 4; j++) {
1109 for (
int j = 0; j < 4; j++) {
1110 col[j] = mcol[corner_indices[j]];
1113 memcpy(mcol,
col,
sizeof(
col));
1118 static MCol default_mcol = {255, 255, 255, 255};
1121 for (
int i = 0;
i < 4 *
count;
i++) {
1122 mcol[
i] = default_mcol;
1132 const float *weights,
1137 float **
in = (
float **)sources;
1147 const float interp_weight = weights[
i];
1177 const float *weights,
1186 const float interp_weight = weights[
i];
1206 short(*flnors)[4][3] =
static_cast<short(*)[4][3]
>(
data);
1214 memcpy(flnors, nors,
sizeof(nors));
1226 const float mixfactor)
1264 memcpy(tmp_col, m1->
color,
sizeof(tmp_col));
1276 for (
int i = 0;
i < 4;
i++) {
1281 return tot < 0.001f;
1317 MPropCol default_propcol = {{1.0f, 1.0f, 1.0f, 1.0f}};
1325 const float *weights,
1331 float col[4] = {0.0f, 0.0f, 0.0f, 0.0f};
1333 const float interp_weight = weights[
i];
1347 const float *weights,
1354 const float interp_weight = weights[
i];
1355 const vec3f *src =
static_cast<const vec3f *
>(sources[
i]);
1372 const vec3f *vec2 =
static_cast<const vec3f *
>(data2);
1380 float *values =
static_cast<float *
>(
data);
1381 bool has_errors =
false;
1382 for (
int i = 0;
i < totitems * 3;
i++) {
1383 if (!isfinite(values[
i])) {
1400 const float *weights,
1407 const float interp_weight = weights[
i];
1408 const vec2f *src =
static_cast<const vec2f *
>(sources[
i]);
1424 const vec2f *vec2 =
static_cast<const vec2f *
>(data2);
1431 float *values =
static_cast<float *
>(
data);
1432 bool has_errors =
false;
1433 for (
int i = 0;
i < totitems * 2;
i++) {
1434 if (!isfinite(values[
i])) {
1469 const float mixfactor)
1471 const float2 &a = *
static_cast<const float2 *
>(source);
1491 const float *weights,
1498 const float interp_weight = weights[
i];
1499 const bool src = *(
const bool *)sources[
i];
1500 result |= src && (interp_weight > 0.0f);
1518 const float *weights,
1526 Quaternion::identity());
1529 const float interp_weight = weights[
i];
1530 const Quaternion *src =
static_cast<const Quaternion *
>(sources[
i]);
1531 mixer.mix_in(0, *src, interp_weight);
1534 *
static_cast<Quaternion *
>(dest) =
result;
1677 {
sizeof(int),
alignof(
int),
""},
1736 {
sizeof(int),
alignof(
int),
"", 0,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr},
1738 {
sizeof(MLoopUV),
alignof(MLoopUV),
"MLoopUV", 1,
N_(
"UVMap")},
1800 N_(
"4 by 4 Float Matrix"),
1822 N_(
"2D 16-Bit Integer"),
1865 N_(
"NGon Face-Vertex"),
1872 {
sizeof(int),
alignof(
int),
"", 0,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr},
1885 {
sizeof(float),
alignof(
float),
""},
1919 {
sizeof(float),
alignof(
float),
"", 0,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr},
1977 {
sizeof(
short[4][3]),
1978 alignof(
short[4][3]),
1988 {
sizeof(
short[2]),
alignof(
short[2]),
"vec2s", 1},
1990 {
sizeof(int),
alignof(
int),
""},
2149 "CDMStringProperty",
2180 "CDCustomLoopNormal",
2181 "CDSculptFaceGroups",
2322 std::optional<eCDAllocType> alloctype,
2323 void *layer_data_to_assign,
2333 data->typemap[
i] = -1;
2336 for (
int i = 0;
i <
data->totlayer;
i++) {
2338 if (type != lasttype) {
2339 data->typemap[type] =
i;
2351 return (memcmp(
data->typemap, data_copy.
typemap,
sizeof(
data->typemap)) == 0);
2360 if (type_info.
copy) {
2361 type_info.
copy(
data, new_data, totelem);
2364 memcpy(new_data,
data, size_in_bytes);
2372 if (type_info.
free) {
2373 type_info.
free(
const_cast<void *
>(
data), totelem);
2380 const eCustomDataMask
mask,
2381 const std::optional<eCDAllocType> alloctype,
2384 bool changed =
false;
2387 int last_active = 0;
2388 int last_render = 0;
2391 int current_type_layer_count = 0;
2392 int max_current_type_layer_count = -1;
2397 const int src_layer_flag = src_layer.
flag;
2399 if (type != last_type) {
2402 current_type_layer_count = layernum_dst;
2404 last_active = src_layer.
active;
2411 current_type_layer_count++;
2422 if ((max_current_type_layer_count != -1) &&
2423 (current_type_layer_count >= max_current_type_layer_count))
2433 void *layer_data_to_assign =
nullptr;
2435 if (!alloctype.has_value()) {
2436 if (src_layer.
data !=
nullptr) {
2443 layer_data_to_assign = src_layer.
data;
2452 layer_data_to_assign,
2453 sharing_info_to_assign,
2457 new_layer->
uid = src_layer.
uid;
2459 new_layer->
active = last_active;
2472 eCustomDataMask
mask,
2480 const eCustomDataMask
mask,
2488 const eCustomDataMask
mask)
2498 dst_layers.
append(layer);
2528 void delete_self_with_data()
override
2530 if (data_ !=
nullptr) {
2536 void delete_data_only()
override
2549 return MEM_new<CustomDataLayerImplicitSharing>(__func__,
data, totelem, type);
2557 if (layer.
data ==
nullptr) {
2566 const void *old_data = layer.
data;
2601 for (
int i = 0;
i <
data->totlayer;
i++) {
2608 new_size_in_bytes, typeInfo->
alignment, __func__) :
2610 if (old_size_in_bytes > 0) {
2611 if (new_layer_data !=
nullptr) {
2613 if (typeInfo->
copy) {
2614 typeInfo->
copy(layer->
data, new_layer_data, std::min(old_size, new_size));
2618 memcpy(new_layer_data, layer->
data, std::min(old_size_in_bytes, new_size_in_bytes));
2626 layer->
data = new_layer_data;
2632 if (new_size > old_size) {
2633 const int new_elements_num = new_size - old_size;
2635 switch (alloctype) {
2639 typeInfo->
construct(new_elements_begin, new_elements_num);
2648 memset(new_elements_begin, 0, typeInfo->
size * new_elements_num);
2659 eCustomDataMask
mask,
2673 eCustomDataMask
mask,
2698 if (
data->external) {
2700 data->external =
nullptr;
2712 for (
int i = 0;
i <
data->totlayer;
i++) {
2729 for (
int i = 0;
i <
data->totlayer;
i++) {
2732 data->layers[
i].offset = offset;
2733 offset += typeInfo->
size;
2736 data->totsize = offset;
2744 for (
int i = 0;
i <
data->totlayer;
i++) {
2745 if (
data->layers[
i].type == type) {
2759 return data->typemap[type];
2769 i = (
i + n <
data->totlayer &&
data->layers[
i + n].type == type) ? (
i + n) : (-1);
2779 for (
int i = 0;
i <
data->totlayer;
i++) {
2780 if (
data->layers[
i].type == type) {
2781 if (
data->layers[
i].name == name) {
2792 for (
int i = 0;
i <
data->totlayer;
i++) {
2793 if (
data->layers[
i].name == name) {
2803 const int layer_index =
data->typemap[type];
2805 return (layer_index != -1) ? layer_index +
data->layers[layer_index].active : -1;
2810 const int layer_index =
data->typemap[type];
2812 return (layer_index != -1) ? layer_index +
data->layers[layer_index].active_rnd : -1;
2817 const int layer_index =
data->typemap[type];
2819 return (layer_index != -1) ? layer_index +
data->layers[layer_index].active_clone : -1;
2824 const int layer_index =
data->typemap[type];
2826 return (layer_index != -1) ? layer_index +
data->layers[layer_index].active_mask : -1;
2837 const int layer_index =
data->typemap[type];
2839 return (named_index != -1) ? named_index - layer_index : -1;
2844 const int layer_index =
data->typemap[type];
2846 return (layer_index != -1) ?
data->layers[layer_index].active : -1;
2851 const int layer_index =
data->typemap[type];
2853 return (layer_index != -1) ?
data->layers[layer_index].active_rnd : -1;
2858 const int layer_index =
data->typemap[type];
2860 return (layer_index != -1) ?
data->layers[layer_index].active_clone : -1;
2865 const int layer_index =
data->typemap[type];
2867 return (layer_index != -1) ?
data->layers[layer_index].active_mask : -1;
2874 return layer_index < 0 ?
nullptr :
data->layers[layer_index].name;
2880 return layer_index < 0 ?
nullptr :
data->layers[layer_index].name;
2888 for (
int i = 0;
i <
data->totlayer;
i++) {
2889 if (
data->layers[
i].type == type) {
2891 data->layers[
i].active = n;
2901 for (
int i = 0;
i <
data->totlayer;
i++) {
2902 if (
data->layers[
i].type == type) {
2904 data->layers[
i].active_rnd = n;
2914 for (
int i = 0;
i <
data->totlayer;
i++) {
2915 if (
data->layers[
i].type == type) {
2917 data->layers[
i].active_clone = n;
2927 for (
int i = 0;
i <
data->totlayer;
i++) {
2928 if (
data->layers[
i].type == type) {
2930 data->layers[
i].active_mask = n;
2940 const int layer_index = n -
data->typemap[type];
2943 for (
int i = 0;
i <
data->totlayer;
i++) {
2944 if (
data->layers[
i].type == type) {
2946 data->layers[
i].active = layer_index;
2956 const int layer_index = n -
data->typemap[type];
2959 for (
int i = 0;
i <
data->totlayer;
i++) {
2960 if (
data->layers[
i].type == type) {
2962 data->layers[
i].active_rnd = layer_index;
2972 const int layer_index = n -
data->typemap[type];
2975 for (
int i = 0;
i <
data->totlayer;
i++) {
2976 if (
data->layers[
i].type == type) {
2978 data->layers[
i].active_clone = layer_index;
2985 for (
int i = 0;
i <
data->totlayer;
i++) {
2986 if (
data->layers[
i].type == type) {
3005 data->maxlayer += grow_amount;
3011 const std::optional<eCDAllocType> alloctype,
3012 void *layer_data_to_assign,
3028 int index =
data->totlayer;
3029 if (index >=
data->maxlayer) {
3036 for (; index > 0 &&
data->layers[index - 1].type > type; index--) {
3037 data->layers[index] =
data->layers[index - 1];
3050 if (alloctype.has_value()) {
3051 switch (*alloctype) {
3060 memset(new_layer.
data, 0, size_in_bytes);
3077 if (totelem == 0 && sharing_info_to_assign ==
nullptr) {
3081 new_layer.
data = layer_data_to_assign;
3094 new_layer.
type = type;
3109 new_layer.
name[0] =
'\0';
3112 if (index > 0 &&
data->layers[index - 1].type == type) {
3113 new_layer.
active =
data->layers[index - 1].active;
3127 return &
data->layers[index];
3138 data, type, alloctype,
nullptr,
nullptr, totelem, typeInfo->
defaultname);
3157 data, type, std::nullopt, layer_data, sharing_info, totelem, typeInfo->
defaultname);
3174 data, type, alloctype,
nullptr,
nullptr, totelem, name);
3191 data, type, std::nullopt, layer_data, sharing_info, totelem, name);
3203 const int n = index - index_first;
3206 if ((index_first == -1) || (n < 0)) {
3213 for (
int i = index + 1;
i <
data->totlayer;
i++) {
3224 const int index_nonzero = n ? n : 1;
3228 if (layer->
active >= index_nonzero) {
3297 for (
int i = 0;
i <
data->totlayer;
i++) {
3298 if (
data->layers[
i].type == type) {
3310 for (
int i = 0;
i <
data->totlayer;
i++) {
3311 if (
data->layers[
i].type == type &&
3325 for (
int i = 0;
i <
data->totlayer;
i++) {
3336 for (
int i = 0;
i <
data->totlayer;
i++) {
3350 if (typeInfo->
copy) {
3351 typeInfo->
copy(src_data_ofs, dst_data_ofs,
count);
3354 memcpy(dst_data_ofs, src_data_ofs,
size_t(
count) * typeInfo->
size);
3360 const int src_layer_index,
3361 const int dst_layer_index,
3362 const int src_index,
3363 const int dst_index,
3370 const void *src_data = source->
layers[src_layer_index].
data;
3371 void *dst_data = dest->
layers[dst_layer_index].
data;
3375 const size_t src_offset = size_t(src_index) * typeInfo->
size;
3376 const size_t dst_offset = size_t(dst_index) * typeInfo->
size;
3378 if (!
count || !src_data || !dst_data) {
3379 if (
count && !(src_data ==
nullptr && dst_data ==
nullptr)) {
3381 "null data for %s type (%p --> %p), skipping",
3389 if (typeInfo->
copy) {
3402 const int source_index,
3403 const int dest_index,
3407 for (
int src_i = 0; src_i < source->
totlayer; src_i++) {
3421 const int source_index,
3422 const int dest_index,
3427 for (
int src_i = 0; src_i < source->
totlayer; src_i++) {
3458 int destination_index,
3462 if (source_layer_index == -1) {
3466 if (destinaiton_layer_index == -1) {
3472 destinaiton_layer_index,
3480 for (
int i = 0;
i <
data->totlayer;
i++) {
3483 if (typeInfo->
free) {
3484 size_t offset = size_t(index) * typeInfo->
size;
3492#define SOURCE_BUF_SIZE 100
3496 const int *src_indices,
3497 const float *weights,
3498 const float *sub_weights,
3507 const void **sources = source_buf;
3516 float *default_weights =
nullptr;
3517 if (weights ==
nullptr) {
3520 default_weights_buf;
3522 weights = default_weights;
3527 for (
int src_i = 0; src_i < source->
totlayer; src_i++) {
3549 for (
int j = 0; j <
count; j++) {
3571 if (!
ELEM(default_weights,
nullptr, default_weights_buf)) {
3578 for (
int i = 0;
i <
data->totlayer;
i++) {
3581 if (typeInfo->
swap) {
3582 const size_t offset = size_t(index) * typeInfo->
size;
3617 if (layer_index == -1) {
3621 return data->layers[layer_index].data;
3629 if (layer_index == -1) {
3640 if (layer_index == -1) {
3643 return data->layers[layer_index].data;
3652 if (layer_index == -1) {
3665 if (layer_index == -1) {
3668 return data->layers[layer_index].data;
3677 if (layer_index == -1) {
3688 if (layer_index == -1) {
3691 return data->layers[layer_index].offset;
3697 if (layer_index == -1) {
3701 return data->layers[layer_index].offset;
3709 if (layer_index == -1) {
3713 return data->layers[layer_index].offset;
3722 if (layer_index == -1) {
3737 return (layer_index == -1) ?
nullptr :
data->layers[layer_index].name;
3769 if (
data->totlayer) {
3776 eCustomDataMask
mask,
3807 totelem =
bm->totvert;
3811 totelem =
bm->totedge;
3815 totelem =
bm->totloop;
3819 totelem =
bm->totface;
3824 totelem =
bm->totvert;
3828 dest->
pool =
nullptr;
3836 void *tmp =
nullptr;
3851 void *tmp =
nullptr;
3870 if (*block ==
nullptr) {
3874 for (
int i = 0;
i <
data->totlayer;
i++) {
3877 if (typeInfo->
free) {
3878 int offset =
data->layers[
i].offset;
3883 if (
data->totsize) {
3892 if (block ==
nullptr) {
3895 for (
int i = 0;
i <
data->totlayer;
i++) {
3897 if (typeInfo->
free) {
3898 const size_t offset =
data->layers[
i].offset;
3902 if (
data->totsize) {
3903 memset(block, 0,
data->totsize);
3913 if (
data->totsize > 0) {
3928 memset(elem, 0, typeInfo->
size);
3934 const int offset =
data->layers[n].offset;
3941 if (*block ==
nullptr) {
3945 for (
int i = 0;
i <
data->totlayer;
i++) {
3952 const eCustomDataMask mask_exclude)
3956 const int dst_offset = layer_dst.offset;
3970 if (type_info.
copy) {
3971 map.
copies.append({type_info.
copy, src_offset, dst_offset});
3980 if (type_info.
free) {
3981 map.
free.append({type_info.
free, dst_offset});
3989 const void *src_block,
4033 if (
data.totsize == 0) {
4040 const int offset = layer.offset;
4054 if (layer_index == -1) {
4067 if (layer_index == -1) {
4076 if (n < 0 || n >=
data->totlayer) {
4110 for (
int i = 0;
i <
data->totlayer;
i++) {
4121 for (
int i = 0;
i <
data->totlayer;
i++) {
4123 if (typeInfo->
free) {
4133 for (
int i = 0;
i <
data->totlayer;
i++) {
4150 if (typeInfo->
copy) {
4151 typeInfo->
copy(source, dest, 1);
4154 memcpy(dest, source, typeInfo->
size);
4162 const float mixfactor)
4171 typeInfo->
copyvalue(source, dest, mixmode, mixfactor);
4175 memcpy(dest, source, typeInfo->
size);
4183 if (typeInfo->
equal) {
4184 return typeInfo->
equal(data1, data2);
4187 return !memcmp(data1, data2, typeInfo->
size);
4221 if (typeInfo->
add) {
4222 typeInfo->
add(data1, data2);
4236 if (typeInfo->
copy) {
4237 typeInfo->
copy(source, dest, 1);
4240 memcpy(dest, source, typeInfo->
size);
4245 const void **src_blocks_ofs,
4246 const float *weights,
4247 const float *sub_weights,
4249 void *dst_block_ofs,
4258 typeInfo->
interp(src_blocks_ofs, weights, sub_weights,
count, dst_block_ofs);
4262 const void **src_blocks,
4263 const float *weights,
4264 const float *sub_weights,
4273 const void **sources = (
const void **)source_buf;
4282 float *default_weights =
nullptr;
4283 if (weights ==
nullptr) {
4286 default_weights_buf;
4288 weights = default_weights;
4292 for (
int i = 0;
i <
data->totlayer;
i++) {
4296 for (
int j = 0; j <
count; j++) {
4307 if (!
ELEM(default_weights,
nullptr, default_weights_buf)) {
4316 return typeInfo->
size;
4334 return (typeInfo->
free !=
nullptr);
4358 for (
int i = 0;
i <
data->totlayer;
i++) {
4368 if (
i != index && layer->
type == type && layer->
name == name) {
4406 if (nlayer->
name[0] ==
'\0') {
4410 const char *defname =
"";
4449 bool keeplayer =
true;
4457 if (!typeInfo->
defaultname && (index > 0) &&
data->layers[index - 1].type == layer->
type) {
4474 CD_SCULPT_FACE_SETS,
4478 CLOG_WARN(&
LOG,
".blend file read: removing a data layer that should not have been written");
4483 for (
int i = index + 1;
i <
data->totlayer;
i++) {
4502 switch (layer->
type) {
4522 CLOG_WARN(&
LOG,
"CustomDataLayer->data is null for type %d.", layer->
type);
4540 if (typeInfo->
validate !=
nullptr) {
4541 return typeInfo->
validate(layer->
data, totitems, do_fixes);
4563 for (
int i = 0;
i <
data->totlayer;
i++) {
4571 if (typeInfo->
free) {
4572 typeInfo->
free(layer->
data, totelem);
4590 for (
int i = 0;
i <
data->totlayer;
i++) {
4591 layer = &
data->layers[
i];
4615 "Failed to read %s layer from %s.",
4621 for (
int i = 0;
i <
data->totlayer;
i++) {
4622 layer = &
data->layers[
i];
4636 if (typeInfo->
read(cdf, layer->
data, totelem)) {
4667 for (
int i = 0;
i <
data->totlayer;
i++) {
4689 for (
int i = 0;
i <
data->totlayer;
i++) {
4706 CLOG_ERROR(&
LOG,
"Failed to open %s for writing.", filepath);
4712 for (
i = 0;
i <
data->totlayer;
i++) {
4720 if (typeInfo->
write(cdf, layer->
data, totelem)) {
4733 if (
i !=
data->totlayer) {
4740 for (
i = 0;
i <
data->totlayer;
i++) {
4746 if (typeInfo->
free) {
4747 typeInfo->
free(layer->
data, totelem);
4762 const char *filepath)
4767 if (layer_index == -1) {
4794 if (layer_index == -1) {
4816 if (layer_index == -1) {
4832#define COPY_BIT_FLAG(_type, _dst, _src, _f) \
4834 const _type _val = *((_type *)(_src)) & (_type)(_f); \
4835 *((_type *)(_dst)) &= ~(_type)(_f); \
4836 *((_type *)(_dst)) |= _val; \
4840 switch (data_size) {
4863 switch (data_size) {
4865 return ((*((uint8_t *)
data) & uint8_t(
flag)) != 0);
4867 return ((*((uint16_t *)
data) & uint16_t(
flag)) != 0);
4869 return ((*((uint32_t *)
data) & uint32_t(
flag)) != 0);
4880 const void **sources,
4881 const float *weights,
4883 const float mix_factor)
4892 int best_src_idx = 0;
4894 const int data_type = laymap->
data_type;
4895 const int mix_mode = laymap->
mix_mode;
4908 if (
int(data_type) &
CD_FAKE) {
4914 data_size = size_t(type_info->
size);
4915 interp_cd = type_info->
interp;
4916 copy_cd = type_info->
copy;
4921 if (
count > 1 && !interp_cd) {
4925 float tot_weight_true = 0.0f;
4926 int item_true_idx = -1, item_false_idx = -1;
4930 tot_weight_true += weights[
i];
4937 best_src_idx = (tot_weight_true >= 0.5f) ? item_true_idx : item_false_idx;
4941 float max_weight = 0.0f;
4944 if (weights[
i] > max_weight) {
4945 max_weight = weights[
i];
4955 interp_cd(sources, weights,
nullptr,
count, tmp_dst);
4957 else if (data_flag) {
4958 copy_bit_flag(tmp_dst, sources[best_src_idx], data_size, data_flag);
4962 copy_cd(sources[best_src_idx], tmp_dst, 1);
4965 memcpy(tmp_dst, sources[best_src_idx], data_size);
4980 else if (!(
int(data_type) &
CD_FAKE)) {
4986 if (mix_factor >= 0.5f) {
4987 memcpy(data_dst, tmp_dst, data_size);
4996 const void **sources,
4997 const float *weights,
4999 const float mix_factor)
5006 const int mix_mode = laymap->
mix_mode;
5020 interp_cd(sources, weights,
nullptr,
count, tmp_dst);
5021 if (space_transform) {
5033 const int totelem = me_remap->
items_num;
5035 const int data_type = laymap->
data_type;
5036 const void *data_src = laymap->
data_src;
5045 size_t tmp_buff_size = 32;
5046 const void **tmp_data_src =
nullptr;
5057 if (
int(data_type) &
CD_FAKE) {
5066 data_size = size_t(type_info->
size);
5073 for (
int i = 0;
i < totelem;
i++, data_dst =
POINTER_OFFSET(data_dst, data_step), mapit++) {
5075 const float mix_factor = laymap->
mix_factor *
5084 if (
UNLIKELY(sources_num > tmp_buff_size)) {
5085 tmp_buff_size = size_t(sources_num);
5086 tmp_data_src = (
const void **)
MEM_reallocN((
void *)tmp_data_src,
5087 sizeof(*tmp_data_src) * tmp_buff_size);
5090 for (
int j = 0; j < sources_num; j++) {
5091 const size_t src_idx = size_t(mapit->
indices_src[j]);
5092 tmp_data_src[j] =
POINTER_OFFSET(data_src, (data_step * src_idx) + data_offset);
5114 const char **r_struct_name,
5125 const int domain_size,
5138 if (
U.experimental.use_attribute_storage_write) {
5147 attribute_dna.
name = layer.name;
5148 attribute_dna.
data_type = int16_t(*type);
5149 attribute_dna.
domain = int8_t(domain);
5157 array_dna.
data = layer.data;
5158 array_dna.sharing_info = layer.sharing_info;
5159 array_dna.size = domain_size;
5160 attribute_dna.
data = &array_dna;
5166 layers_to_write.
append(layer);
5168 data.totlayer = layers_to_write.
size();
5175 if (!
data.layers && layers_to_write.
size() > 0) {
5189 const MDisps *md = &mdlist[
i];
5199 reinterpret_cast<const int8_t *
>(md->
hidden));
5209 if (grid_paint_mask) {
5225 switch (layer.
type) {
5241 "bool type is expected to have the same size as uint8_t")
5245 const char *structname;
5248 if (structnum > 0) {
5249 int datasize = structnum *
count;
5253 printf(
"%s error: layer '%s':%d - can't be written to file\n",
5266 eCustomDataMask cddata_mask,
5279 BLO_write_shared(writer, layer.data, size_in_bytes, layer.sharing_info, [&]() {
5280 blend_write_layer_data(writer, layer, count);
5284 if (
data->external) {
5301 reinterpret_cast<int8_t **
>(&md.
hidden));
5323 if (grid_paint_mask) {
5336 switch (layer.
type) {
5355 "bool type is expected to have the same size as uint8_t")
5359 const char *structname;
5362 if (structnum > 0) {
5363 const int data_num = structnum *
count;
5379 "Allocated custom data layer that was not saved correctly for layer.type = %d.",
5416 blend_read_layer_data(reader, *layer, count);
5417 if (layer->data == nullptr) {
5454 const char *structname;
5459 "%sdict(name='%s', struct='%s', type=%d, ptr='%p', elem=%d, length=%d),\n",
5493 return std::nullopt;
5509 return std::nullopt;
5529 const int64_t elem_size = CustomData_get_elem_size(&layer);
5530 shared_memory.add(totelem * elem_size);
CustomData interface, see also DNA_customdata_types.h.
void(*)( const void **sources, const float *weights, const float *sub_weights, int count, void *dest) cd_interp
const CustomData_MeshMasks CD_MASK_EVERYTHING
const CustomData_MeshMasks CD_MASK_BAREMESH_ORIGINDEX
void(*)(const CustomDataTransferLayerMap *laymap, void *dest, const void **sources, const float *weights, int count, float mix_factor) cd_datatransfer_interp
void(*)(void *data, int count) cd_set_default_value
const CustomData_MeshMasks CD_MASK_BAREMESH
void(*)(void *data, int count) cd_free
const CustomData_MeshMasks CD_MASK_BMESH
void(*)(const void *source, void *dest, int count) cd_copy
bool(*)(void *item, uint totitems, bool do_fixes) cd_validate
bool CustomData_has_layer(const CustomData *data, eCustomDataType type)
const CustomData_MeshMasks CD_MASK_DERIVEDMESH
#define CD_TYPE_AS_MASK(_type)
const CustomData_MeshMasks CD_MASK_MESH
CDataFile * cdf_create(int type)
bool cdf_read_layer(CDataFile *cdf, const CDataFileLayer *blay)
bool cdf_write_open(CDataFile *cdf, const char *filepath)
bool cdf_read_data(CDataFile *cdf, unsigned int size, void *data)
bool cdf_write_data(CDataFile *cdf, unsigned int size, const void *data)
CDataFileLayer * cdf_layer_find(CDataFile *cdf, int type, const char *name)
void cdf_read_close(CDataFile *cdf)
CDataFileLayer * cdf_layer_add(CDataFile *cdf, int type, const char *name, size_t datasize)
void cdf_write_close(CDataFile *cdf)
void cdf_free(CDataFile *cdf)
bool cdf_write_layer(CDataFile *cdf, CDataFileLayer *blay)
bool cdf_read_open(CDataFile *cdf, const char *filepath)
int multires_mdisp_corners(const MDisps *s)
int BKE_ccg_gridsize(int level)
@ VOLUME_GRID_VECTOR_FLOAT
#define BLI_assert_unreachable()
#define BLI_STATIC_ASSERT(a, msg)
#define BLI_assert_msg(a, msg)
#define BLI_BITMAP_SIZE(_num)
A dynamically sized string ADT.
void BLI_dynstr_appendf(DynStr *__restrict ds, const char *__restrict format,...) ATTR_PRINTF_FORMAT(2
void BLI_kdtree_nd_ free(KDTree *tree)
MINLINE unsigned char round_fl_to_uchar_clamp(float a)
MINLINE void blend_color_add_float(float dst[4], const float src1[4], const float src2[4])
MINLINE void blend_color_sub_byte(unsigned char dst[4], const unsigned char src1[4], const unsigned char src2[4])
MINLINE void blend_color_mul_float(float dst[4], const float src1[4], const float src2[4])
MINLINE void blend_color_mul_byte(unsigned char dst[4], const unsigned char src1[4], const unsigned char src2[4])
MINLINE void blend_color_mix_float(float dst[4], const float src1[4], const float src2[4])
MINLINE void blend_color_sub_float(float dst[4], const float src1[4], const float src2[4])
MINLINE void blend_color_add_byte(unsigned char dst[4], const unsigned char src1[4], const unsigned char src2[4])
MINLINE void blend_color_mix_byte(unsigned char dst[4], const unsigned char src1[4], const unsigned char src2[4])
MINLINE void blend_color_interpolate_byte(unsigned char dst[4], const unsigned char src1[4], const unsigned char src2[4], float ft)
MINLINE void blend_color_interpolate_float(float dst[4], const float src1[4], const float src2[4], float t)
void BLI_space_transform_invert_normal(const struct SpaceTransform *data, float no[3])
MINLINE void mul_v4_fl(float r[4], float f)
MINLINE void add_v4_v4(float r[4], const float a[4])
MINLINE void copy_v4_v4(float r[4], const float a[4])
MINLINE void madd_v3_v3fl(float r[3], const float a[3], float f)
MINLINE float len_squared_v2v2(const float a[2], const float b[2]) ATTR_WARN_UNUSED_RESULT
MINLINE void madd_v2_v2fl(float r[2], const float a[2], float f)
MINLINE void sub_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE void mul_v2_fl(float r[2], float f)
MINLINE void copy_v2_v2(float r[2], const float a[2])
MINLINE void copy_v3_v3(float r[3], const float a[3])
void copy_vn_fl(float *array_tar, int size, float val)
void interp_v3_v3v3_slerp_safe(float target[3], const float a[3], const float b[3], float t)
void minmax_v2v2_v2(float min[2], float max[2], const float vec[2])
MINLINE void add_v2_v2(float r[2], const float a[2])
MINLINE void add_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE void copy_v3_v3_short(short r[3], const short a[3])
void minmax_v4v4_v4(float min[4], float max[4], const float vec[4])
MINLINE void mul_v3_v3v3(float r[3], const float v1[3], const float v2[3])
MINLINE float normalize_v3_v3(float r[3], const float a[3])
void copy_vn_i(int *array_tar, int size, int val)
MINLINE void zero_v2(float r[2])
MINLINE void copy_v3_fl(float r[3], float f)
MINLINE void madd_v4_v4fl(float r[4], const float a[4], float f)
MINLINE void zero_v3(float r[3])
MINLINE void copy_v4_fl(float r[4], float f)
MINLINE float normalize_v3(float n[3])
void * BLI_mempool_alloc(BLI_mempool *pool) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT ATTR_RETURNS_NONNULL ATTR_NONNULL(1)
void BLI_mempool_free(BLI_mempool *pool, void *addr) ATTR_NONNULL(1
BLI_mempool * BLI_mempool_create(unsigned int esize, unsigned int elem_num, unsigned int pchunk, unsigned int flag) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT ATTR_RETURNS_NONNULL
void BLI_mempool_destroy(BLI_mempool *pool) ATTR_NONNULL(1)
bool BLI_path_abs(char path[FILE_MAX], const char *basepath) ATTR_NONNULL(1
char * STRNCPY(char(&dst)[N], const char *src)
char * BLI_strncpy(char *__restrict dst, const char *__restrict src, size_t dst_maxncpy) ATTR_NONNULL(1
char * BLI_strncpy_utf8(char *__restrict dst, const char *__restrict src, size_t dst_maxncpy) ATTR_NONNULL(1
#define STRNCPY_UTF8(dst, src)
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
#define INIT_MINMAX2(min, max)
#define POINTER_OFFSET(v, ofs)
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)
#define BLO_write_struct_array_at_address(writer, struct_name, array_size, address, 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_write_uint8_array(BlendWriter *writer, int64_t num, const uint8_t *data_ptr)
#define BLO_write_struct(writer, struct_name, data_ptr)
void * BLO_read_struct_by_name_array(BlendDataReader *reader, const char *struct_name, int64_t items_num, const void *old_address)
void BLO_write_float3_array(BlendWriter *writer, int64_t num, const float *data_ptr)
void BLO_write_int8_array(BlendWriter *writer, int64_t num, const int8_t *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)
bool BLO_write_is_undo(BlendWriter *writer)
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,...)
#define CLOG_WARN(clg_ref,...)
ID and Library types, which are fundamental for SDNA.
@ CDT_MIX_REPLACE_BELOW_THRESHOLD
@ CDT_MIX_REPLACE_ABOVE_THRESHOLD
Read Guarded memory(de)allocation.
#define BM_ITER_ELEM(ele, iter, data, itype)
#define BM_ITER_MESH(ele, iter, bm, itype)
BMesh const char void * data
const BMAllocTemplate bm_mesh_chunksize_default
bool BM_attribute_stored_in_bmesh_builtin(const StringRef name)
ATTR_WARN_UNUSED_RESULT const BMLoop * l
unsigned long long int uint64_t
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
SIMD_FORCE_INLINE const btScalar & w() const
Return the w value.
CustomDataLayerImplicitSharing(const void *data, const int totelem, const eCustomDataType type)
constexpr void fill(const T &value) const
T & construct(Args &&...args)
constexpr const T * data() const
constexpr bool is_empty() const
constexpr bool startswith(StringRef prefix) const
void copy_utf8_truncated(char *dst, int64_t dst_size) const
void append(const T &value)
Span< T > as_span() const
void add_shared(const ImplicitSharingInfo *sharing_info, const FunctionRef< void(MemoryCounter &shared_memory)> count_fn)
void CustomData_debug_info_from_layers(const CustomData *data, const char *indent, DynStr *dynstr)
static int layerMaxNum_tface()
void * CustomData_get_layer_named_for_write(CustomData *data, const eCustomDataType type, const StringRef name, const int totelem)
bool CustomData_verify_versions(CustomData *data, const int index)
static void layerFree_mdisps(void *data, const int count)
void * CustomData_get_for_write(CustomData *data, const int index, const eCustomDataType type, int totelem)
static void layerCopy_propString(const void *source, void *dest, const int count)
static void layerDoMinMax_propcol(const void *data, void *vmin, void *vmax)
static void customData_free_layer__internal(CustomDataLayer *layer)
static void layerMultiply_propfloat2(void *data, const float fac)
void CustomData_data_mix_value(const eCustomDataType type, const void *source, void *dest, const int mixmode, const float mixfactor)
static void layerInitMinMax_mloop_origspace(void *vmin, void *vmax)
int CustomData_get_active_layer(const CustomData *data, const eCustomDataType type)
int CustomData_get_layer_index_n(const CustomData *data, const eCustomDataType type, const int n)
void * CustomData_get_n_for_write(CustomData *data, const eCustomDataType type, const int index, const int n, int totelem)
static const LayerTypeInfo * layerType_getInfo(const eCustomDataType type)
static size_t layerFilesize_mdisps(CDataFile *, const void *data, const int count)
static void layerSwap_flnor(void *data, const int *corner_indices)
static void layerInitMinMax_propfloat2(void *vmin, void *vmax)
static void blend_write_layer_data(BlendWriter *writer, const CustomDataLayer &layer, const int count)
static void layerCopyValue_mloop_origspace(const void *source, void *dest, const int, const float)
bool CustomData_free_layer_named(CustomData *data, const StringRef name)
void CustomData_set_layer_flag(CustomData *data, const eCustomDataType type, const int flag)
int CustomData_layertype_layers_max(const eCustomDataType type)
static void layerInitMinMax_mloopcol(void *vmin, void *vmax)
static bool layerRead_mdisps(CDataFile *cdf, void *data, const int count)
void CustomData_set_layer_active_index(CustomData *data, const eCustomDataType type, const int n)
static void layerInterp_propcol(const void **sources, const float *weights, const float *, int count, void *dest)
static const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES]
int CustomData_get_offset_named(const CustomData *data, const eCustomDataType type, const StringRef name)
void CustomData_validate_layer_name(const CustomData *data, const eCustomDataType type, const StringRef name, char *outname)
void customdata_data_transfer_interp_normal_normals(const CustomDataTransferLayerMap *laymap, void *data_dst, const void **sources, const float *weights, const int count, const float mix_factor)
static void blend_read_mdisps(BlendDataReader *reader, const int count, MDisps *mdisps, const int external)
static bool check_bit_flag(const void *data, const size_t data_size, const uint64_t flag)
bool CustomData_layer_is_anonymous(const CustomData *data, eCustomDataType type, int n)
static void layerConstruct_mdeformvert(void *data, const int count)
void CustomData_blend_write(BlendWriter *writer, CustomData *data, Span< CustomDataLayer > layers_to_write, int count, eCustomDataMask cddata_mask, ID *id)
void CustomData_interp(const CustomData *source, CustomData *dest, const int *src_indices, const float *weights, const float *sub_weights, int count, int dest_index)
static bool layerEqual_mloop_origspace(const void *data1, const void *data2)
static void layerCopy_propFloat(const void *source, void *dest, const int count)
static void layerMultiply_mloopcol(void *data, const float fac)
static void layerDefault_mloopcol(void *data, const int count)
int CustomData_get_stencil_layer(const CustomData *data, const eCustomDataType type)
int CustomData_get_render_layer_index(const CustomData *data, const eCustomDataType type)
const char * CustomData_layertype_name(const eCustomDataType type)
void CustomData_free_layers(CustomData *data, const eCustomDataType type)
void CustomData_set_layer_stencil(CustomData *data, const eCustomDataType type, const int n)
void CustomData_bmesh_free_block(CustomData *data, void **block)
static bool CustomData_layer_ensure_data_exists(CustomDataLayer *layer, size_t count)
void CustomData_data_add(const eCustomDataType type, void *data1, const void *data2)
static void layerCopy_grid_paint_mask(const void *source, void *dest, const int count)
static void customdata_data_transfer_interp_generic(const CustomDataTransferLayerMap *laymap, void *data_dst, const void **sources, const float *weights, const int count, const float mix_factor)
void * CustomData_get_layer_for_write(CustomData *data, const eCustomDataType type, const int totelem)
bool CustomData_layertype_is_dynamic(const eCustomDataType type)
static void layerDefault_propquaternion(void *data, const int count)
const void * CustomData_get_layer_n(const CustomData *data, const eCustomDataType type, const int n)
void CustomData_MeshMasks_update(CustomData_MeshMasks *mask_dst, const CustomData_MeshMasks *mask_src)
void CustomData_set_layer_render_index(CustomData *data, const eCustomDataType type, const int n)
int CustomData_get_named_layer_index_notype(const CustomData *data, const StringRef name)
static void layerCopy_origspace_face(const void *source, void *dest, const int count)
static bool layerEqual_propfloat2(const void *data1, const void *data2)
void CustomData_copy_layer_type_data(const CustomData *source, CustomData *destination, const eCustomDataType type, int source_index, int destination_index, int count)
static void layerMultiply_mloop_origspace(void *data, const float fac)
static void layerInterp_mvert_skin(const void **sources, const float *weights, const float *, int count, void *dest)
static void write_mdisps(BlendWriter *writer, const int count, const MDisps *mdlist, const int external)
static void CustomData_bmesh_set_default_n(CustomData *data, void **block, const int n)
void customData_mask_layers__print(const CustomData_MeshMasks *mask)
void CustomData_blend_read(BlendDataReader *reader, CustomData *data, const int count)
void CustomData_reset(CustomData *data)
static void layerMultiply_propcol(void *data, const float fac)
static void layerFree_grid_paint_mask(void *data, const int count)
static void layerInterp_mcol(const void **sources, const float *weights, const float *sub_weights, const int count, void *dest)
static void layerCopy_bmesh_elem_py_ptr(const void *, void *dest, const int count)
static void * copy_layer_data(const eCustomDataType type, const void *data, const int totelem)
static void write_grid_paint_mask(BlendWriter *writer, int count, const GridPaintMask *grid_paint_mask)
static void layerDefault_origspace_face(void *data, const int count)
static void layerMultiply_propfloat3(void *data, const float fac)
int CustomData_get_layer_index(const CustomData *data, const eCustomDataType type)
static void layerDoMinMax_mloop_origspace(const void *data, void *vmin, void *vmax)
static void layerSwap_tface(void *data, const int *corner_indices)
bool CustomData_MeshMasks_are_matching(const CustomData_MeshMasks *mask_ref, const CustomData_MeshMasks *mask_required)
bool CustomData_free_layer(CustomData *data, const eCustomDataType type, const int index)
int CustomData_get_render_layer(const CustomData *data, const eCustomDataType type)
int CustomData_get_clone_layer_index(const CustomData *data, const eCustomDataType type)
static const ImplicitSharingInfo * make_implicit_sharing_info_for_layer(const eCustomDataType type, const void *data, const int totelem)
void CustomData_copy_data(const CustomData *source, CustomData *dest, const int source_index, const int dest_index, const int count)
bool CustomData_has_interp(const CustomData *data)
bool CustomData_layer_validate(CustomDataLayer *layer, const uint totitems, const bool do_fixes)
void CustomData_copy_elements(const eCustomDataType type, void *src_data_ofs, void *dst_data_ofs, const int count)
const void * CustomData_add_layer_with_data(CustomData *data, const eCustomDataType type, void *layer_data, const int totelem, const ImplicitSharingInfo *sharing_info)
void CustomData_bmesh_interp(CustomData *data, const void **src_blocks, const float *weights, const float *sub_weights, int count, void *dst_block)
int CustomData_get_active_layer_index(const CustomData *data, const eCustomDataType type)
static void customData_update_offsets(CustomData *data)
const char * CustomData_get_render_layer_name(const CustomData *data, const eCustomDataType type)
static void layerAdd_mloopcol(void *data1, const void *data2)
static void copy_bit_flag(void *dst, const void *src, const size_t data_size, const uint64_t flag)
static void layerCopy_mdeformvert(const void *source, void *dest, const int count)
static void layerInterp_tface(const void **sources, const float *weights, const float *sub_weights, const int count, void *dest)
static CustomDataLayer * customData_add_layer__internal(CustomData *data, eCustomDataType type, std::optional< eCDAllocType > alloctype, void *layer_data_to_assign, const ImplicitSharingInfo *sharing_info_to_assign, int totelem, const StringRef name)
void CustomData_data_initminmax(const eCustomDataType type, void *min, void *max)
void CustomData_copy_data_named(const CustomData *source, CustomData *dest, const int source_index, const int dest_index, const int count)
static void layerAdd_mloop_origspace(void *data1, const void *data2)
void CustomData_set_layer_render(CustomData *data, const eCustomDataType type, const int n)
void CustomData_free(CustomData *data)
static void layerSwap_origspace_face(void *data, const int *corner_indices)
static void layerCopy_mvert_skin(const void *source, void *dest, const int count)
int CustomData_name_maxncpy_calc(const blender::StringRef name)
void * CustomData_bmesh_get(const CustomData *data, void *block, const eCustomDataType type)
void CustomData_data_copy_value(const eCustomDataType type, const void *source, void *dest)
void CustomData_init_from(const CustomData *source, CustomData *dest, eCustomDataMask mask, int totelem)
const void * CustomData_add_layer_named_with_data(CustomData *data, eCustomDataType type, void *layer_data, int totelem, const StringRef name, const ImplicitSharingInfo *sharing_info)
static bool layerEqual_propcol(const void *data1, const void *data2)
static void layerInterp_shapekey(const void **sources, const float *weights, const float *, int count, void *dest)
static void layerInitMinMax_propcol(void *vmin, void *vmax)
void CustomData_bmesh_interp_n(CustomData *data, const void **src_blocks_ofs, const float *weights, const float *sub_weights, int count, void *dst_block_ofs, int n)
const void * CustomData_get_layer_named(const CustomData *data, const eCustomDataType type, const StringRef name)
bool CustomData_has_layer(const CustomData *data, const eCustomDataType type)
bool CustomData_merge_layout(const CustomData *source, CustomData *dest, const eCustomDataMask mask, const eCDAllocType alloctype, const int totelem)
static void get_type_file_write_info(const eCustomDataType type, const char **r_struct_name, int *r_struct_num)
bool CustomData_merge(const CustomData *source, CustomData *dest, eCustomDataMask mask, int totelem)
int CustomData_number_of_layers_typemask(const CustomData *data, const eCustomDataMask mask)
static void layerAdd_propfloat3(void *data1, const void *data2)
bool CustomData_data_equals(const eCustomDataType type, const void *data1, const void *data2)
static bool layerValidate_propfloat3(void *data, const uint totitems, const bool do_fixes)
static void layerInterp_propFloat(const void **sources, const float *weights, const float *, const int count, void *dest)
void CustomData_external_reload(CustomData *data, ID *, eCustomDataMask mask, int totelem)
CustomData CustomData_shallow_copy_remove_non_bmesh_attributes(const CustomData *src, const eCustomDataMask mask)
static void layerDefault_tface(void *data, const int count)
void CustomData_set_layer_clone(CustomData *data, const eCustomDataType type, const int n)
void CustomData_free_elem(CustomData *data, const int index, const int count)
static void layerDefault_propcol(void *data, const int count)
static void blend_read_paint_mask(BlendDataReader *reader, int count, GridPaintMask *grid_paint_mask)
void CustomData_data_set_default_value(const eCustomDataType type, void *elem)
static bool layer_is_mutable(CustomDataLayer &layer)
static void layerCopy_tface(const void *source, void *dest, const int count)
static bool layerWrite_mdisps(CDataFile *cdf, const void *data, const int count)
void CustomData_update_typemap(CustomData *data)
void CustomData_bmesh_copy_block(CustomData &dst_data, const BMCustomDataCopyMap ©_map, const void *src_block, void **dst_block)
void CustomData_bmesh_set_default(CustomData *data, void **block)
static void layerAdd_propcol(void *data1, const void *data2)
void CustomData_data_dominmax(const eCustomDataType type, const void *data, void *min, void *max)
static void layerInterp_propfloat2(const void **sources, const float *weights, const float *, int count, void *dest)
void CustomData_bmesh_init_pool(CustomData *data, const int totelem, const char htype)
static void layerInterp_origspace_face(const void **sources, const float *weights, const float *sub_weights, const int count, void *dest)
void CustomData_realloc(CustomData *data, const int old_size, const int new_size, const eCDAllocType alloctype)
void bpy_bm_generic_invalidate(struct BPy_BMGeneric *)
void CustomData_set_layer_clone_index(CustomData *data, const eCustomDataType type, const int n)
static void CustomData_external_free(CustomData *data)
static void layerAdd_propfloat2(void *data1, const void *data2)
const char * CustomData_get_active_layer_name(const CustomData *data, const eCustomDataType type)
static bool customdata_typemap_is_valid(const CustomData *data)
static void layerInterp_normal(const void **sources, const float *weights, const float *, const int count, void *dest)
static void layerDefault_mcol(void *data, const int count)
bool CustomData_layertype_is_singleton(const eCustomDataType type)
bool CustomData_layer_has_interp(const CustomData *data, const int layer_n)
static void layerFree_mdeformvert(void *data, const int count)
static void layerInterp_mloopcol(const void **sources, const float *weights, const float *, int count, void *dest)
static bool layerEqual_mloopcol(const void *data1, const void *data2)
void CustomData_init_layout_from(const CustomData *source, CustomData *dest, eCustomDataMask mask, eCDAllocType alloctype, int totelem)
void CustomData_data_transfer(const MeshPairRemap *me_remap, const CustomDataTransferLayerMap *laymap)
static void free_layer_data(const eCustomDataType type, const void *data, const int totelem)
static void layerDefault_origindex(void *data, const int count)
static void layerDefault_mvert_skin(void *data, const int count)
void * CustomData_add_layer(CustomData *data, const eCustomDataType type, eCDAllocType alloctype, const int totelem)
int CustomData_get_stencil_layer_index(const CustomData *data, const eCustomDataType type)
int CustomData_get_named_layer(const CustomData *data, const eCustomDataType type, const StringRef name)
static void ensure_layer_data_is_mutable(CustomDataLayer &layer, const int totelem)
void CustomData_external_add(CustomData *data, ID *, const eCustomDataType type, const int, const char *filepath)
void CustomData_external_remove(CustomData *data, ID *id, const eCustomDataType type, const int totelem)
static void customdata_external_filename(char filepath[FILE_MAX], ID *id, CustomDataExternal *external)
bool CustomData_bmesh_has_free(const CustomData *data)
static void layerInterp_propInt(const void **sources, const float *weights, const float *, const int count, void *dest)
static void layerDefault_propfloat4x4(void *data, const int count)
static void layerInterp_mdeformvert(const void **sources, const float *weights, const float *, const int count, void *dest)
static bool customdata_merge_internal(const CustomData *source, CustomData *dest, const eCustomDataMask mask, const std::optional< eCDAllocType > alloctype, const int totelem)
void CustomData_external_read(CustomData *data, ID *id, eCustomDataMask mask, const int totelem)
static void layerFree_bmesh_elem_py_ptr(void *data, const int count)
int CustomData_number_of_anonymous_layers(const CustomData *data, const eCustomDataType type)
void CustomData_swap_corners(CustomData *data, const int index, const int *corner_indices)
static void layerCopyValue_propfloat2(const void *source, void *dest, const int mixmode, const float mixfactor)
size_t CustomData_get_elem_size(const CustomDataLayer *layer)
void CustomData_count_memory(const CustomData &data, const int totelem, blender::MemoryCounter &memory)
int CustomData_number_of_layers(const CustomData *data, const eCustomDataType type)
bool CustomData_has_layer_named(const CustomData *data, const eCustomDataType type, const StringRef name)
static void layerCopyValue_propcol(const void *source, void *dest, const int mixmode, const float mixfactor)
BMCustomDataCopyMap CustomData_bmesh_copy_map_calc(const CustomData &src, const CustomData &dst, const eCustomDataMask mask_exclude)
const void * CustomData_get_layer(const CustomData *data, const eCustomDataType type)
static void blend_read_layer_data(BlendDataReader *reader, CustomDataLayer &layer, const int count)
static int CustomData_get_layer_index__notypemap(const CustomData *data, const eCustomDataType type)
void CustomData_set_layer_unique_name(CustomData *data, const int index)
void CustomData_ensure_layers_are_mutable(CustomData *data, int totelem)
static void layerSwap_mcol(void *data, const int *corner_indices)
static void customData_resize(CustomData *data, const int grow_amount)
static bool layerValidate_propFloat(void *data, const uint totitems, const bool do_fixes)
int CustomData_sizeof(const eCustomDataType type)
static void layerInterp_mloop_origspace(const void **sources, const float *weights, const float *, int count, void *dest)
static void layerCopyValue_normal(const void *source, void *dest, const int mixmode, const float mixfactor)
bool CustomData_external_test(CustomData *data, const eCustomDataType type)
void CustomData_bmesh_set_n(CustomData *data, void *block, const eCustomDataType type, const int n, const void *source)
bool CustomData_bmesh_merge_layout(const CustomData *source, CustomData *dest, eCustomDataMask mask, eCDAllocType alloctype, BMesh *bm, const char htype)
bool CustomData_set_layer_name(CustomData *data, const eCustomDataType type, const int n, const StringRef name)
void CustomData_blend_write_prepare(CustomData &data, const blender::bke::AttrDomain domain, const int domain_size, Vector< CustomDataLayer, 16 > &layers_to_write, blender::bke::AttributeStorage::BlendWriteData &write_data)
int CustomData_get_clone_layer(const CustomData *data, const eCustomDataType type)
void CustomData_ensure_data_is_mutable(CustomDataLayer *layer, const int totelem)
static void layerDoMinMax_mloopcol(const void *data, void *vmin, void *vmax)
bool CustomData_free_layer_active(CustomData *data, const eCustomDataType type)
const char * CustomData_get_layer_name(const CustomData *data, const eCustomDataType type, const int n)
int CustomData_get_named_layer_index(const CustomData *data, const eCustomDataType type, const StringRef name)
static void layerConstruct_mdisps(void *data, const int count)
static const char * LAYERTYPENAMES[CD_NUMTYPES]
static void layerCopy_mdisps(const void *source, void *dest, const int count)
int CustomData_get_offset(const CustomData *data, const eCustomDataType type)
void * CustomData_bmesh_get_n(const CustomData *data, void *block, const eCustomDataType type, const int n)
bool CustomData_layer_has_math(const CustomData *data, const int layer_n)
static void layerDoMinMax_propfloat2(const void *data, void *vmin, void *vmax)
static void layerInterp_propbool(const void **sources, const float *weights, const float *, int count, void *dest)
bool CustomData_has_math(const CustomData *data)
void CustomData_bmesh_alloc_block(CustomData *data, void **block)
static bool cd_layer_find_dupe(CustomData *data, const StringRef name, const eCustomDataType type, const int index)
void CustomData_data_multiply(const eCustomDataType type, void *data, const float fac)
void CustomData_set_only_copy(const CustomData *data, const eCustomDataMask mask)
static const char * layerType_getName(const eCustomDataType type)
void * CustomData_bmesh_get_layer_n(const CustomData *data, void *block, const int n)
static bool layerValidate_propfloat2(void *data, const uint totitems, const bool do_fixes)
static void layerInterp_propquaternion(const void **sources, const float *weights, const float *, int count, void *dest)
void CustomData_bmesh_free_block_data(CustomData *data, void *block)
#define COPY_BIT_FLAG(_type, _dst, _src, _f)
void CustomData_external_write(CustomData *data, ID *id, eCustomDataMask mask, const int totelem, const int free)
void * CustomData_get_layer_n_for_write(CustomData *data, const eCustomDataType type, const int n, const int totelem)
static void layerCopyValue_mloopcol(const void *source, void *dest, const int mixmode, const float mixfactor)
static void layerSwap_mdisps(void *data, const int *ci)
void CustomData_set_layer_active(CustomData *data, const eCustomDataType type, const int n)
static void layerConstruct_grid_paint_mask(void *data, const int count)
void * CustomData_add_layer_named(CustomData *data, const eCustomDataType type, const eCDAllocType alloctype, const int totelem, const StringRef name)
void CustomData_copy_data_layer(const CustomData *source, CustomData *dest, const int src_layer_index, const int dst_layer_index, const int src_index, const int dst_index, const int count)
int CustomData_get_n_offset(const CustomData *data, const eCustomDataType type, const int n)
static void layerInterp_propfloat3(const void **sources, const float *weights, const float *, int count, void *dest)
#define CD_MASK_BM_ELEM_PYPTR
#define MAX_CUSTOMDATA_LAYER_NAME
#define CD_MASK_PROP_FLOAT3
#define CD_MASK_ORIGINDEX
#define CD_MASK_MDEFORMVERT
#define CD_MASK_TESSLOOPNORMAL
#define CD_MASK_MVERT_SKIN
#define CD_MASK_PROP_INT32_2D
#define CD_MASK_FREESTYLE_FACE
#define CD_MASK_SHAPE_KEYINDEX
#define ID_BLEND_PATH_FROM_GLOBAL(_id)
#define CD_MASK_ORIGSPACE_MLOOP
#define CD_MASK_CLOTH_ORCO
#define CD_MASK_PROP_INT32
#define CD_MASK_GRID_PAINT_MASK
#define MEM_reallocN(vmemh, len)
#define CD_MASK_FREESTYLE_EDGE
#define CD_MASK_ORIGSPACE
#define CD_MASK_MLOOPTANGENT
#define MAX_CUSTOMDATA_LAYER_NAME_NO_PREFIX
void * MEM_mallocN(size_t len, const char *str)
void * MEM_calloc_arrayN(size_t len, size_t size, const char *str)
void * MEM_mallocN_aligned(size_t len, size_t alignment, const char *str)
void * MEM_callocN(size_t len, const char *str)
void * MEM_malloc_arrayN(size_t len, size_t size, const char *str)
void * MEM_dupallocN(const void *vmemh)
size_t(* MEM_allocN_len)(const void *vmemh)
void MEM_freeN(void *vmemh)
ccl_device_inline float interp(const float a, const float b, const float t)
ccl_device_inline float2 mask(const MaskType mask, const float2 a)
typename DefaultMixerStruct< T >::type DefaultMixer
bool attribute_name_is_anonymous(const StringRef name)
std::optional< AttrType > custom_data_type_to_attr_type(eCustomDataType data_type)
std::optional< VolumeGridType > custom_data_type_to_volume_grid_type(eCustomDataType type)
std::optional< eCustomDataType > volume_grid_type_to_custom_data_type(VolumeGridType type)
QuaternionBase< float > Quaternion
T interpolate(const T &a, const T &b, const FactorT &t)
void min_max(const T &value, T &min, T &max)
T distance_squared(const VecBase< T, Size > &a, const VecBase< T, Size > &b)
MatBase< float, 4, 4 > float4x4
VecBase< float, 4 > float4
VecBase< int32_t, 2 > int2
VecBase< float, 2 > float2
VecBase< float, 3 > float3
blender::VecBase< int16_t, 2 > short2
static void update(bNodeTree *ntree)
blender::Vector< Free > free
blender::Vector< TrivialCopy > trivial_copies
blender::Vector< TrivialDefault > trivial_defaults
blender::Vector< Default > defaults
blender::Vector< Copy > copies
const ImplicitSharingInfoHandle * sharing_info
const float * mix_weights
cd_datatransfer_interp interp
struct BLI_mempool * pool
CustomDataExternal * external
bool(* write)(CDataFile *cdf, const void *data, int count)
void(* dominmax)(const void *data1, void *min, void *max)
void(* copyvalue)(const void *source, void *dest, int mixmode, const float mixfactor)
void(* add)(void *data1, const void *data2)
cd_set_default_value set_default_value
size_t(* filesize)(CDataFile *cdf, const void *data, int count)
bool(* read)(CDataFile *cdf, void *data, int count)
void(* initminmax)(void *min, void *max)
void(* swap)(void *data, const int *corner_indices)
bool(* equal)(const void *data1, const void *data2)
void(* construct)(void *data, int count)
void(* multiply)(void *data, float fac)
MeshPairRemapItem * items
static MatBase identity()
Vector<::Attribute, 16 > & attributes
static QuaternionBase identity()