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);
219 for (i = 0; i <
count; i++) {
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;
264 for (
int i = 0; i <
count; i++) {
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) {
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)) {
321 node->dw.weight = std::min(
node->dw.weight, 1.0f);
342 const float *weights,
350 float no[3] = {0.0f};
353 madd_v3_v3fl(no, (
const float *)sources[i], weights[i]);
363 const float mixfactor)
365 const float *no_src = (
const float *)source;
366 float *no_dst = (
float *)dest;
408 for (
int i = 0; i <
count; i++) {
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;
423 for (
int i = 0; i <
count; i++) {
424 const float interp_weight = weights[i];
425 const MTFace *src =
static_cast<const MTFace *
>(sources[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}}};
462 for (
int i = 0; i <
count; i++) {
484 const float *weights,
490 for (
int i = 0; i <
count; i++) {
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;
559 for (
int i = 0; i <
count; i++) {
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;
574 for (
int i = 0; i <
count; i++) {
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}}};
610 for (
int i = 0; i <
count; i++) {
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);
656 for (
int i = 0; i <
count; i++) {
662 d[i].
disps =
nullptr;
691 for (
int i = 0; i <
count; i++) {
696 if (!
cdf_read_data(cdf,
sizeof(
float[3]) * d[i].totdisp, d[i].disps)) {
697 CLOG_ERROR(&
LOG,
"failed to read multires displacement %d/%d %d", i,
count, d[i].totdisp);
709 for (
int i = 0; i <
count; i++) {
710 if (!
cdf_write_data(cdf,
sizeof(
float[3]) * d[i].totdisp, d[i].disps)) {
711 CLOG_ERROR(&
LOG,
"failed to write multires displacement %d/%d %d", i,
count, d[i].totdisp);
724 for (
int i = 0; i <
count; i++) {
725 size +=
sizeof(
float[3]) * d[i].totdisp;
740 const int size =
sizeof(
void *);
742 for (
int i = 0; i <
count; i++) {
757 for (
int i = 0; i <
count; i++) {
776 for (
int i = 0; i <
count; i++) {
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;
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};
937 for (
int i = 0; i <
count; i++) {
938 mlcol[i] = default_mloopcol;
943 const float *weights,
956 for (
int i = 0; i <
count; i++) {
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,
1042 for (
int i = 0; i <
count; i++) {
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;
1068 for (
int i = 0; i <
count; i++) {
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;
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;
1146 for (
int i = 0; i <
count; i++) {
1147 const float interp_weight = weights[i];
1165 for (
int i = 0; i <
count; i++) {
1177 const float *weights,
1185 for (
int i = 0; i <
count; i++) {
1186 const float interp_weight = weights[i];
1195 vs_dst->
flag &= ~MVERT_SKIN_ROOT;
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}};
1319 for (
int i = 0; i <
count; i++) {
1325 const float *weights,
1331 float col[4] = {0.0f, 0.0f, 0.0f, 0.0f};
1332 for (
int i = 0; i <
count; i++) {
1333 const float interp_weight = weights[i];
1347 const float *weights,
1353 for (
int i = 0; i <
count; i++) {
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,
1406 for (
int i = 0; i <
count; i++) {
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,
1497 for (
int i = 0; i <
count; i++) {
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());
1528 for (
int i = 0; i <
count; i++) {
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;
2394 for (
int i = 0; i < source->
totlayer; i++) {
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;
3104 if (!
name.is_empty()) {
3105 name.copy_utf8_truncated(new_layer.
name);
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++) {
3214 data->layers[i - 1] =
data->layers[i];
3224 const int index_nonzero = n ? n : 1;
3227 for (layer = &
data->layers[i]; i <
data->totlayer && layer->
type == type; i++, layer++) {
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) {
3726 name.copy_utf8_truncated(
data->layers[layer_index].name);
3737 return (layer_index == -1) ?
nullptr :
data->layers[layer_index].name;
3769 if (
data->totlayer) {
3776 eCustomDataMask
mask,
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;
3966 map.trivial_defaults.append({type_info.
size, dst_offset});
3970 if (type_info.
copy) {
3971 map.copies.append({type_info.
copy, src_offset, dst_offset});
3976 map.trivial_copies.append({type_info.
size, 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) {
4380 if (
name.startswith(
".")) {
4386 if (
name.startswith(prefix)) {
4406 if (nlayer->
name[0] ==
'\0') {
4410 const char *defname =
"";
4429 if (!
name.is_empty()) {
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++) {
4484 data->layers[i - 1] =
data->layers[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);
4574 layer->
flag &= ~CD_FLAG_IN_MEMORY;
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);
4749 layer->
flag &= ~CD_FLAG_IN_MEMORY;
4762 const char *filepath)
4767 if (layer_index == -1) {
4794 if (layer_index == -1) {
4809 layer->
flag &= ~CD_FLAG_EXTERNAL;
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) {
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;
4928 for (
int i = 0; i <
count; i++) {
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;
4943 for (
int i = 0; i <
count; i++) {
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,
5135 if (attribute_name_is_anonymous(
name)) {
5138 if (
U.experimental.use_attribute_storage_write) {
5145 if (
const std::optional<AttrType> type = custom_data_type_to_attr_type(data_type)) {
5147 attribute_dna.
name = layer.name;
5148 attribute_dna.data_type =
int16_t(*type);
5149 attribute_dna.domain =
int8_t(domain);
5150 attribute_dna.storage_type =
int8_t(AttrStorageType::Array);
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) {
5188 for (
int i = 0; i <
count; i++) {
5189 const MDisps *md = &mdlist[i];
5209 if (grid_paint_mask) {
5211 for (
int i = 0; i <
count; i++) {
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) {
5295 for (
int i = 0; i <
count; i++) {
5323 if (grid_paint_mask) {
5324 for (
int i = 0; i <
count; i++) {
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.",
5405 while (i < data->totlayer) {
5409 layer->
flag &= ~CD_FLAG_IN_MEMORY;
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;
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
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
void(*)(void *data, int count) cd_free
void(*)(const void *source, void *dest, int count) cd_copy
bool(*)(void *item, uint totitems, bool do_fixes) cd_validate
#define CD_TYPE_AS_MASK(_type)
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.
#define ID_BLEND_PATH_FROM_GLOBAL(_id)
#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 CD_MASK_ORIGSPACE_MLOOP
#define CD_MASK_CLOTH_ORCO
#define CD_MASK_PROP_INT32
#define CD_MASK_GRID_PAINT_MASK
#define CD_MASK_FREESTYLE_EDGE
#define CD_MASK_ORIGSPACE
#define CD_MASK_MLOOPTANGENT
#define MAX_CUSTOMDATA_LAYER_NAME_NO_PREFIX
struct FreestyleEdge FreestyleEdge
struct MVertSkin MVertSkin
struct MStringProperty MStringProperty
struct GridPaintMask GridPaintMask
struct MDeformVert MDeformVert
struct OrigSpaceFace OrigSpaceFace
struct OrigSpaceLoop OrigSpaceLoop
struct MIntProperty MIntProperty
struct MFloatProperty MFloatProperty
struct FreestyleFace FreestyleFace
@ CDT_MIX_REPLACE_BELOW_THRESHOLD
@ CDT_MIX_REPLACE_ABOVE_THRESHOLD
Read Guarded memory(de)allocation.
#define MEM_reallocN(vmemh, len)
#define BM_ITER_ELEM(ele, iter, data, itype)
#define BM_ITER_MESH(ele, iter, bm, itype)
const BMAllocTemplate bm_mesh_chunksize_default
bool BM_attribute_stored_in_bmesh_builtin(const StringRef name)
ATTR_WARN_UNUSED_RESULT const BMLoop * l
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
void append(const T &value)
Span< T > as_span() const
void add(const int64_t bytes)
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)
const CustomData_MeshMasks CD_MASK_EVERYTHING
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)
const CustomData_MeshMasks CD_MASK_BAREMESH_ORIGINDEX
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)
const CustomData_MeshMasks CD_MASK_BAREMESH
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)
const CustomData_MeshMasks CD_MASK_BMESH
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)
const CustomData_MeshMasks CD_MASK_DERIVEDMESH
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)
const CustomData_MeshMasks CD_MASK_MESH
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)
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< VolumeGridType > custom_data_type_to_volume_grid_type(eCustomDataType type)
std::optional< eCustomDataType > volume_grid_type_to_custom_data_type(VolumeGridType type)
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< int32_t, 2 > int2
blender::VecBase< int16_t, 2 > short2
static void update(bNodeTree *ntree)
unsigned __int64 uint64_t
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