17#define DNA_DEPRECATED_ALLOW
84#define CUSTOMDATA_GROW 5
109 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,
252 struct MDeformWeight_Link {
253 MDeformWeight_Link *
next;
258 MDeformWeight_Link *dest_dwlink =
nullptr;
259 MDeformWeight_Link *node;
265 float interp_weight = weights[
i];
267 for (
int j = 0; j < source->
totweight; j++) {
269 float weight = dw->
weight * interp_weight;
271 if (weight == 0.0f) {
275 for (node = dest_dwlink; node; node = node->next) {
286 MDeformWeight_Link *tmp_dwlink =
static_cast<MDeformWeight_Link *
>(
287 alloca(
sizeof(*tmp_dwlink)));
288 tmp_dwlink->dw.def_nr = dw->
def_nr;
289 tmp_dwlink->dw.weight = weight;
292 tmp_dwlink->next = dest_dwlink;
293 dest_dwlink = tmp_dwlink;
303 if (dvert->
dw && (dvert->
totweight == totweight)) {
319 for (node = dest_dwlink; node; node = node->next,
i++) {
320 node->dw.weight = std::min(node->dw.weight, 1.0f);
321 dvert->
dw[
i] = node->dw;
341 const float *weights,
348 float no[3] = {0.0f};
361 const float mixfactor)
363 const float *no_src = (
const float *)source;
364 float *no_dst = (
float *)dest;
407 dest_tf[
i] = source_tf[
i];
412 const float *weights,
417 float uv[4][2] = {{0.0f}};
420 const float interp_weight = weights[
i];
423 for (
int j = 0; j < 4; j++) {
429 *tf = *(
MTFace *)(*sources);
430 memcpy(tf->
uv, uv,
sizeof(tf->
uv));
438 for (
int j = 0; j < 4; j++) {
439 const int source_index = corner_indices[j];
443 memcpy(tf->
uv, uv,
sizeof(tf->
uv));
448 static MTFace default_tf = {{{0, 0}, {1, 0}, {1, 1}, {0, 1}}};
473 const float *weights,
479 const float interp_weight = weights[
i];
480 const float src = *(
const float *)sources[
i];
481 result += src * interp_weight;
489 bool has_errors =
false;
491 for (
int i = 0;
i < totitems;
i++, fp++) {
492 if (!isfinite(fp->
f)) {
510 const float *weights,
516 const float weight = weights[
i];
517 const float src = *
static_cast<const int *
>(sources[
i]);
521 *
static_cast<int *
>(dest) = rounded_result;
547 dest_tf[
i] = source_tf[
i];
552 const float *weights,
557 float uv[4][2] = {{0.0f}};
560 const float interp_weight = weights[
i];
563 for (
int j = 0; j < 4; j++) {
569 memcpy(osf->
uv, uv,
sizeof(osf->
uv));
577 for (
int j = 0; j < 4; j++) {
580 memcpy(osf->
uv, uv,
sizeof(osf->
uv));
585 static OrigSpaceFace default_osf = {{{0, 0}, {1, 0}, {1, 1}, {0, 1}}};
589 osf[
i] = default_osf;
604 int nverts = (ci[1] == 3) ? 4 : 3;
606 int cornersize = s->
totdisp / corners;
608 if (corners != nverts) {
620 for (
int S = 0; S < corners; S++) {
621 memcpy(d + cornersize * S, s->
disps + cornersize * ci[S],
sizeof(
float[3]) * cornersize);
674 if (!
cdf_read_data(cdf,
sizeof(
float[3]) * d[
i].totdisp, d[
i].disps)) {
703 size +=
sizeof(
float[3]) * d[
i].totdisp;
718 const int size =
sizeof(
void *);
788 const float mixfactor)
816 uchar src[4] = {m1->
r, m1->
g, m1->
b, m1->
a};
817 uchar dst[4] = {m2->
r, m2->
g, m2->
b, m2->
a};
832 memcpy(tmp_col, src,
sizeof(tmp_col));
837 m2->
r = char(dst[0]);
838 m2->
g = char(dst[1]);
839 m2->
b = char(dst[2]);
840 m2->
a = char(dst[3]);
855 return r * r + g * g +
b *
b + a * a < 0.001f;
885 min->r = std::min(m->
r,
min->r);
886 min->g = std::min(m->
g,
min->g);
887 min->b = std::min(m->
b,
min->b);
888 min->a = std::min(m->
a,
min->a);
889 max->r = std::max(m->
r,
max->r);
890 max->g = std::max(m->
g,
max->g);
891 max->b = std::max(m->
b,
max->b);
892 max->a = std::max(m->
a,
max->a);
913 MLoopCol default_mloopcol = {255, 255, 255, 255};
916 mlcol[
i] = default_mloopcol;
931 const float interp_weight = weights[
i];
933 col.r += src->
r * interp_weight;
934 col.g += src->
g * interp_weight;
935 col.b += src->
b * interp_weight;
936 col.a += src->
a * interp_weight;
1008 const float *weights,
1016 const float interp_weight = weights[
i];
1027 const float *weights,
1031 MCol *mc =
static_cast<MCol *
>(dest);
1037 }
col[4] = {{0.0f}};
1040 const float interp_weight = weights[
i];
1042 for (
int j = 0; j < 4; j++) {
1043 const MCol *src =
static_cast<const MCol *
>(sources[
i]);
1044 col[j].a += src[j].
a * interp_weight;
1045 col[j].r += src[j].
r * interp_weight;
1046 col[j].g += src[j].
g * interp_weight;
1047 col[j].b += src[j].
b * interp_weight;
1052 for (
int j = 0; j < 4; j++) {
1068 for (
int j = 0; j < 4; j++) {
1069 col[j] = mcol[corner_indices[j]];
1072 memcpy(mcol,
col,
sizeof(
col));
1077 static MCol default_mcol = {255, 255, 255, 255};
1080 for (
int i = 0;
i < 4 *
count;
i++) {
1081 mcol[
i] = default_mcol;
1092 float **
in = (
float **)sources;
1102 const float interp_weight = weights[
i];
1132 const float *weights,
1140 const float interp_weight = weights[
i];
1160 short (*flnors)[4][3] =
static_cast<short (*)[4][3]
>(
data);
1168 memcpy(flnors, nors,
sizeof(nors));
1180 const float mixfactor)
1218 memcpy(tmp_col, m1->
color,
sizeof(tmp_col));
1230 for (
int i = 0;
i < 4;
i++) {
1235 return tot < 0.001f;
1271 MPropCol default_propcol = {{1.0f, 1.0f, 1.0f, 1.0f}};
1281 float col[4] = {0.0f, 0.0f, 0.0f, 0.0f};
1283 const float interp_weight = weights[
i];
1297 const float *weights,
1303 const float interp_weight = weights[
i];
1304 const vec3f *src =
static_cast<const vec3f *
>(sources[
i]);
1321 const vec3f *vec2 =
static_cast<const vec3f *
>(data2);
1329 float *values =
static_cast<float *
>(
data);
1330 bool has_errors =
false;
1331 for (
int i = 0;
i < totitems * 3;
i++) {
1332 if (!isfinite(values[
i])) {
1349 const float *weights,
1355 const float interp_weight = weights[
i];
1356 const vec2f *src =
static_cast<const vec2f *
>(sources[
i]);
1372 const vec2f *vec2 =
static_cast<const vec2f *
>(data2);
1379 float *values =
static_cast<float *
>(
data);
1380 bool has_errors =
false;
1381 for (
int i = 0;
i < totitems * 2;
i++) {
1382 if (!isfinite(values[
i])) {
1417 const float mixfactor)
1419 const float2 &a = *
static_cast<const float2 *
>(source);
1442 const float interp_weight = weights[
i];
1443 const bool src = *(
const bool *)sources[
i];
1444 result |= src && (interp_weight > 0.0f);
1462 const float *weights,
1469 Quaternion::identity());
1472 const float interp_weight = weights[
i];
1473 const Quaternion *src =
static_cast<const Quaternion *
>(sources[
i]);
1474 mixer.mix_in(0, *src, interp_weight);
1477 *
static_cast<Quaternion *
>(dest) =
result;
1620 {
sizeof(int),
alignof(
int),
""},
1679 {
sizeof(int),
alignof(
int),
"", 0,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr},
1681 {
sizeof(MLoopUV),
alignof(MLoopUV),
"MLoopUV", 1,
N_(
"UVMap")},
1706 {
sizeof(
float[4]),
alignof(
float[4]),
"", 0,
N_(
"Tangent")},
1734 N_(
"4 by 4 Float Matrix"),
1756 N_(
"2D 16-Bit Integer"),
1799 N_(
"NGon Face-Vertex"),
1806 {
sizeof(int),
alignof(
int),
"", 0,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr},
1819 {
sizeof(
float),
alignof(
float),
""},
1853 {
sizeof(
float),
alignof(
float),
"", 0,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr},
1878 {
sizeof(FreestyleEdge),
alignof(FreestyleEdge),
"FreestyleEdge", 1},
1880 {
sizeof(FreestyleFace),
alignof(FreestyleFace),
"FreestyleFace", 1},
1893 {
sizeof(
short[4][3]),
1894 alignof(
short[4][3]),
1904 {
sizeof(
short[2]),
alignof(
short[2]),
"vec2s", 1},
1906 {
sizeof(int),
alignof(
int),
""},
2065 "CDMStringProperty",
2096 "CDCustomLoopNormal",
2097 "CDSculptFaceGroups",
2238 std::optional<eCDAllocType> alloctype,
2239 void *layer_data_to_assign,
2249 data->typemap[
i] = -1;
2252 for (
int i = 0;
i <
data->totlayer;
i++) {
2254 if (type != lasttype) {
2255 data->typemap[type] =
i;
2267 return (memcmp(
data->typemap, data_copy.
typemap,
sizeof(
data->typemap)) == 0);
2276 if (type_info.
copy) {
2277 type_info.
copy(
data, new_data, totelem);
2280 memcpy(new_data,
data, size_in_bytes);
2288 if (type_info.
free) {
2289 type_info.
free(
const_cast<void *
>(
data), totelem);
2296 const eCustomDataMask
mask,
2297 const std::optional<eCDAllocType> alloctype,
2300 bool changed =
false;
2303 int last_active = 0;
2304 int last_render = 0;
2307 int current_type_layer_count = 0;
2308 int max_current_type_layer_count = -1;
2313 const int src_layer_flag = src_layer.
flag;
2315 if (type != last_type) {
2318 current_type_layer_count = layernum_dst;
2320 last_active = src_layer.
active;
2327 current_type_layer_count++;
2338 if ((max_current_type_layer_count != -1) &&
2339 (current_type_layer_count >= max_current_type_layer_count))
2349 void *layer_data_to_assign =
nullptr;
2351 if (!alloctype.has_value()) {
2352 if (src_layer.
data !=
nullptr) {
2359 layer_data_to_assign = src_layer.
data;
2368 layer_data_to_assign,
2369 sharing_info_to_assign,
2373 new_layer->
uid = src_layer.
uid;
2375 new_layer->
active = last_active;
2388 eCustomDataMask
mask,
2396 const eCustomDataMask
mask,
2404 const eCustomDataMask
mask)
2414 dst_layers.
append(layer);
2444 void delete_self_with_data()
override
2446 if (data_ !=
nullptr) {
2452 void delete_data_only()
override
2465 return MEM_new<CustomDataLayerImplicitSharing>(__func__,
data, totelem, type);
2473 if (layer.
data ==
nullptr) {
2482 const void *old_data = layer.
data;
2517 for (
int i = 0;
i <
data->totlayer;
i++) {
2524 new_size_in_bytes, typeInfo->
alignment, __func__) :
2526 if (old_size_in_bytes > 0) {
2527 if (new_layer_data !=
nullptr) {
2529 if (typeInfo->
copy) {
2530 typeInfo->
copy(layer->
data, new_layer_data, std::min(old_size, new_size));
2534 memcpy(new_layer_data, layer->
data, std::min(old_size_in_bytes, new_size_in_bytes));
2542 layer->
data = new_layer_data;
2548 if (new_size > old_size) {
2549 const int new_elements_num = new_size - old_size;
2551 switch (alloctype) {
2555 typeInfo->
construct(new_elements_begin, new_elements_num);
2564 memset(new_elements_begin, 0, typeInfo->
size * new_elements_num);
2575 eCustomDataMask
mask,
2589 eCustomDataMask
mask,
2614 if (
data->external) {
2616 data->external =
nullptr;
2628 for (
int i = 0;
i <
data->totlayer;
i++) {
2645 for (
int i = 0;
i <
data->totlayer;
i++) {
2648 data->layers[
i].offset = offset;
2649 offset += typeInfo->
size;
2652 data->totsize = offset;
2660 for (
int i = 0;
i <
data->totlayer;
i++) {
2661 if (
data->layers[
i].type == type) {
2675 return data->typemap[type];
2685 i = (
i + n <
data->totlayer &&
data->layers[
i + n].type == type) ? (
i + n) : (-1);
2695 for (
int i = 0;
i <
data->totlayer;
i++) {
2696 if (
data->layers[
i].type == type) {
2708 for (
int i = 0;
i <
data->totlayer;
i++) {
2719 const int layer_index =
data->typemap[type];
2721 return (layer_index != -1) ? layer_index +
data->layers[layer_index].active : -1;
2726 const int layer_index =
data->typemap[type];
2728 return (layer_index != -1) ? layer_index +
data->layers[layer_index].active_rnd : -1;
2733 const int layer_index =
data->typemap[type];
2735 return (layer_index != -1) ? layer_index +
data->layers[layer_index].active_clone : -1;
2740 const int layer_index =
data->typemap[type];
2742 return (layer_index != -1) ? layer_index +
data->layers[layer_index].active_mask : -1;
2753 const int layer_index =
data->typemap[type];
2755 return (named_index != -1) ? named_index - layer_index : -1;
2760 const int layer_index =
data->typemap[type];
2762 return (layer_index != -1) ?
data->layers[layer_index].active : -1;
2767 const int layer_index =
data->typemap[type];
2769 return (layer_index != -1) ?
data->layers[layer_index].active_rnd : -1;
2774 const int layer_index =
data->typemap[type];
2776 return (layer_index != -1) ?
data->layers[layer_index].active_clone : -1;
2781 const int layer_index =
data->typemap[type];
2783 return (layer_index != -1) ?
data->layers[layer_index].active_mask : -1;
2790 return layer_index < 0 ?
nullptr :
data->layers[layer_index].name;
2796 return layer_index < 0 ?
nullptr :
data->layers[layer_index].name;
2804 for (
int i = 0;
i <
data->totlayer;
i++) {
2805 if (
data->layers[
i].type == type) {
2807 data->layers[
i].active = n;
2817 for (
int i = 0;
i <
data->totlayer;
i++) {
2818 if (
data->layers[
i].type == type) {
2820 data->layers[
i].active_rnd = n;
2830 for (
int i = 0;
i <
data->totlayer;
i++) {
2831 if (
data->layers[
i].type == type) {
2833 data->layers[
i].active_clone = n;
2843 for (
int i = 0;
i <
data->totlayer;
i++) {
2844 if (
data->layers[
i].type == type) {
2846 data->layers[
i].active_mask = n;
2856 const int layer_index = n -
data->typemap[type];
2859 for (
int i = 0;
i <
data->totlayer;
i++) {
2860 if (
data->layers[
i].type == type) {
2862 data->layers[
i].active = layer_index;
2872 const int layer_index = n -
data->typemap[type];
2875 for (
int i = 0;
i <
data->totlayer;
i++) {
2876 if (
data->layers[
i].type == type) {
2878 data->layers[
i].active_rnd = layer_index;
2888 const int layer_index = n -
data->typemap[type];
2891 for (
int i = 0;
i <
data->totlayer;
i++) {
2892 if (
data->layers[
i].type == type) {
2894 data->layers[
i].active_clone = layer_index;
2901 for (
int i = 0;
i <
data->totlayer;
i++) {
2902 if (
data->layers[
i].type == type) {
2921 data->maxlayer += grow_amount;
2927 const std::optional<eCDAllocType> alloctype,
2928 void *layer_data_to_assign,
2944 int index =
data->totlayer;
2945 if (index >=
data->maxlayer) {
2952 for (; index > 0 &&
data->layers[index - 1].type > type; index--) {
2953 data->layers[index] =
data->layers[index - 1];
2966 if (alloctype.has_value()) {
2967 switch (*alloctype) {
2976 memset(new_layer.
data, 0, size_in_bytes);
2993 if (totelem == 0 && sharing_info_to_assign ==
nullptr) {
2997 new_layer.
data = layer_data_to_assign;
3010 new_layer.
type = type;
3020 if (!
name.is_empty()) {
3021 name.copy_utf8_truncated(new_layer.
name);
3025 new_layer.
name[0] =
'\0';
3028 if (index > 0 &&
data->layers[index - 1].type == type) {
3029 new_layer.
active =
data->layers[index - 1].active;
3043 return &
data->layers[index];
3054 data, type, alloctype,
nullptr,
nullptr, totelem, typeInfo->
defaultname);
3073 data, type, std::nullopt, layer_data, sharing_info, totelem, typeInfo->
defaultname);
3090 data, type, alloctype,
nullptr,
nullptr, totelem,
name);
3107 data, type, std::nullopt, layer_data, sharing_info, totelem,
name);
3119 const int n = index - index_first;
3122 if ((index_first == -1) || (n < 0)) {
3129 for (
int i = index + 1;
i <
data->totlayer;
i++) {
3140 const int index_nonzero = n ? n : 1;
3144 if (layer->
active >= index_nonzero) {
3213 for (
int i = 0;
i <
data->totlayer;
i++) {
3214 if (
data->layers[
i].type == type) {
3226 for (
int i = 0;
i <
data->totlayer;
i++) {
3227 if (
data->layers[
i].type == type &&
3241 for (
int i = 0;
i <
data->totlayer;
i++) {
3252 for (
int i = 0;
i <
data->totlayer;
i++) {
3260 const void *src_data,
3266 if (typeInfo->
copy) {
3267 typeInfo->
copy(src_data, dst_data,
count);
3270 memcpy(dst_data, src_data,
size_t(
count) * typeInfo->
size);
3276 const int src_layer_index,
3277 const int dst_layer_index,
3278 const int src_index,
3279 const int dst_index,
3286 const void *src_data = source->
layers[src_layer_index].
data;
3287 void *dst_data = dest->
layers[dst_layer_index].
data;
3291 const size_t src_offset = size_t(src_index) * typeInfo->
size;
3292 const size_t dst_offset = size_t(dst_index) * typeInfo->
size;
3294 if (!
count || !src_data || !dst_data) {
3295 if (
count && !(src_data ==
nullptr && dst_data ==
nullptr)) {
3297 "null data for %s type (%p --> %p), skipping",
3305 if (typeInfo->
copy) {
3318 const int source_index,
3319 const int dest_index,
3324 for (
int src_i = 0; src_i < source->
totlayer; src_i++) {
3355 int destination_index,
3359 if (source_layer_index == -1) {
3363 if (destinaiton_layer_index == -1) {
3369 destinaiton_layer_index,
3377 for (
int i = 0;
i <
data->totlayer;
i++) {
3380 if (typeInfo->
free) {
3381 size_t offset = size_t(index) * typeInfo->
size;
3389#define SOURCE_BUF_SIZE 100
3393 const int *src_indices,
3394 const float *weights,
3403 const void **sources = source_buf;
3412 float *default_weights =
nullptr;
3413 if (weights ==
nullptr) {
3416 default_weights_buf;
3418 weights = default_weights;
3423 for (
int src_i = 0; src_i < source->
totlayer; src_i++) {
3445 for (
int j = 0; j <
count; j++) {
3466 if (!
ELEM(default_weights,
nullptr, default_weights_buf)) {
3473 for (
int i = 0;
i <
data->totlayer;
i++) {
3476 if (typeInfo->
swap) {
3477 const size_t offset = size_t(index) * typeInfo->
size;
3512 if (layer_index == -1) {
3516 return data->layers[layer_index].data;
3524 if (layer_index == -1) {
3535 if (layer_index == -1) {
3538 return data->layers[layer_index].data;
3547 if (layer_index == -1) {
3560 if (layer_index == -1) {
3563 return data->layers[layer_index].data;
3572 if (layer_index == -1) {
3583 if (layer_index == -1) {
3586 return data->layers[layer_index].offset;
3592 if (layer_index == -1) {
3596 return data->layers[layer_index].offset;
3604 if (layer_index == -1) {
3608 return data->layers[layer_index].offset;
3617 if (layer_index == -1) {
3621 name.copy_utf8_truncated(
data->layers[layer_index].name);
3632 return (layer_index == -1) ?
nullptr :
data->layers[layer_index].name;
3664 if (
data->totlayer) {
3671 eCustomDataMask
mask,
3702 totelem =
bm->totvert;
3706 totelem =
bm->totedge;
3710 totelem =
bm->totloop;
3714 totelem =
bm->totface;
3719 totelem =
bm->totvert;
3723 dest->
pool =
nullptr;
3731 void *tmp =
nullptr;
3746 void *tmp =
nullptr;
3765 if (*block ==
nullptr) {
3769 for (
int i = 0;
i <
data->totlayer;
i++) {
3772 if (typeInfo->
free) {
3773 int offset =
data->layers[
i].offset;
3778 if (
data->totsize) {
3787 if (block ==
nullptr) {
3790 for (
int i = 0;
i <
data->totlayer;
i++) {
3792 if (typeInfo->
free) {
3793 const size_t offset =
data->layers[
i].offset;
3797 if (
data->totsize) {
3798 memset(block, 0,
data->totsize);
3808 if (
data->totsize > 0) {
3823 memset(elem, 0, typeInfo->
size);
3829 const int offset =
data->layers[n].offset;
3836 if (*block ==
nullptr) {
3840 for (
int i = 0;
i <
data->totlayer;
i++) {
3847 const eCustomDataMask mask_exclude)
3851 const int dst_offset = layer_dst.offset;
3865 if (type_info.
copy) {
3866 map.
copies.append({type_info.
copy, src_offset, dst_offset});
3875 if (type_info.
free) {
3876 map.
free.append({type_info.
free, dst_offset});
3884 const void *src_block,
3928 if (
data.totsize == 0) {
3935 const int offset = layer.offset;
3949 if (layer_index == -1) {
3962 if (layer_index == -1) {
3971 if (n < 0 || n >=
data->totlayer) {
4005 for (
int i = 0;
i <
data->totlayer;
i++) {
4016 for (
int i = 0;
i <
data->totlayer;
i++) {
4018 if (typeInfo->
free) {
4028 for (
int i = 0;
i <
data->totlayer;
i++) {
4045 if (typeInfo->
copy) {
4046 typeInfo->
copy(source, dest, 1);
4049 memcpy(dest, source, typeInfo->
size);
4057 const float mixfactor)
4066 typeInfo->
copyvalue(source, dest, mixmode, mixfactor);
4070 memcpy(dest, source, typeInfo->
size);
4078 if (typeInfo->
equal) {
4079 return typeInfo->
equal(data1, data2);
4082 return !memcmp(data1, data2, typeInfo->
size);
4116 if (typeInfo->
add) {
4117 typeInfo->
add(data1, data2);
4131 if (typeInfo->
copy) {
4132 typeInfo->
copy(source, dest, 1);
4135 memcpy(dest, source, typeInfo->
size);
4140 const void **src_blocks_ofs,
4141 const float *weights,
4143 void *dst_block_ofs,
4152 typeInfo->
interp(src_blocks_ofs, weights,
count, dst_block_ofs);
4156 CustomData *
data,
const void **src_blocks,
const float *weights,
int count,
void *dst_block)
4163 const void **sources = (
const void **)source_buf;
4172 float *default_weights =
nullptr;
4173 if (weights ==
nullptr) {
4176 default_weights_buf;
4178 weights = default_weights;
4182 for (
int i = 0;
i <
data->totlayer;
i++) {
4186 for (
int j = 0; j <
count; j++) {
4197 if (!
ELEM(default_weights,
nullptr, default_weights_buf)) {
4206 return typeInfo->
size;
4224 return (typeInfo->
free !=
nullptr);
4248 for (
int i = 0;
i <
data->totlayer;
i++) {
4260 if (
i != index && layer->
type == type && layer->
name ==
name) {
4272 if (
name.startswith(
".")) {
4276 if (
name.startswith(prefix)) {
4296 if (nlayer->
name[0] ==
'\0') {
4300 const char *defname =
"";
4319 if (!
name.is_empty()) {
4339 bool keeplayer =
true;
4347 if (!typeInfo->
defaultname && (index > 0) &&
data->layers[index - 1].type == layer->
type) {
4364 CD_SCULPT_FACE_SETS,
4368 CLOG_WARN(&
LOG,
".blend file read: removing a data layer that should not have been written");
4373 for (
int i = index + 1;
i <
data->totlayer;
i++) {
4392 switch (layer->
type) {
4412 CLOG_WARN(&
LOG,
"CustomDataLayer->data is null for type %d.", layer->
type);
4430 if (typeInfo->
validate !=
nullptr) {
4431 return typeInfo->
validate(layer->
data, totitems, do_fixes);
4453 for (
int i = 0;
i <
data->totlayer;
i++) {
4461 if (typeInfo->
free) {
4462 typeInfo->
free(layer->
data, totelem);
4480 for (
int i = 0;
i <
data->totlayer;
i++) {
4481 layer = &
data->layers[
i];
4505 "Failed to read %s layer from %s.",
4511 for (
int i = 0;
i <
data->totlayer;
i++) {
4512 layer = &
data->layers[
i];
4526 if (typeInfo->
read(cdf, layer->
data, totelem)) {
4557 for (
int i = 0;
i <
data->totlayer;
i++) {
4579 for (
int i = 0;
i <
data->totlayer;
i++) {
4596 CLOG_ERROR(&
LOG,
"Failed to open %s for writing.", filepath);
4602 for (
i = 0;
i <
data->totlayer;
i++) {
4610 if (typeInfo->
write(cdf, layer->
data, totelem)) {
4623 if (
i !=
data->totlayer) {
4630 for (
i = 0;
i <
data->totlayer;
i++) {
4636 if (typeInfo->
free) {
4637 typeInfo->
free(layer->
data, totelem);
4652 const char *filepath)
4657 if (layer_index == -1) {
4684 if (layer_index == -1) {
4706 if (layer_index == -1) {
4722#define COPY_BIT_FLAG(_type, _dst, _src, _f) \
4724 const _type _val = *((_type *)(_src)) & (_type)(_f); \
4725 *((_type *)(_dst)) &= ~(_type)(_f); \
4726 *((_type *)(_dst)) |= _val; \
4730 switch (data_size) {
4753 switch (data_size) {
4755 return ((*((uint8_t *)
data) & uint8_t(
flag)) != 0);
4757 return ((*((uint16_t *)
data) & uint16_t(
flag)) != 0);
4759 return ((*((uint32_t *)
data) & uint32_t(
flag)) != 0);
4770 const void **sources,
4771 const float *weights,
4773 const float mix_factor)
4782 int best_src_idx = 0;
4784 const int data_type = laymap->
data_type;
4785 const int mix_mode = laymap->
mix_mode;
4798 if (
int(data_type) &
CD_FAKE) {
4804 data_size = size_t(type_info->
size);
4805 interp_cd = type_info->
interp;
4806 copy_cd = type_info->
copy;
4811 if (
count > 1 && !interp_cd) {
4815 float tot_weight_true = 0.0f;
4816 int item_true_idx = -1, item_false_idx = -1;
4820 tot_weight_true += weights[
i];
4827 best_src_idx = (tot_weight_true >= 0.5f) ? item_true_idx : item_false_idx;
4831 float max_weight = 0.0f;
4834 if (weights[
i] > max_weight) {
4835 max_weight = weights[
i];
4845 interp_cd(sources, weights,
count, tmp_dst);
4847 else if (data_flag) {
4848 copy_bit_flag(tmp_dst, sources[best_src_idx], data_size, data_flag);
4852 copy_cd(sources[best_src_idx], tmp_dst, 1);
4855 memcpy(tmp_dst, sources[best_src_idx], data_size);
4870 else if (!(
int(data_type) &
CD_FAKE)) {
4876 if (mix_factor >= 0.5f) {
4877 memcpy(data_dst, tmp_dst, data_size);
4886 const void **sources,
4887 const float *weights,
4889 const float mix_factor)
4896 const int mix_mode = laymap->
mix_mode;
4910 interp_cd(sources, weights,
count, tmp_dst);
4911 if (space_transform) {
4923 const int totelem = me_remap->
items_num;
4925 const int data_type = laymap->
data_type;
4926 const void *data_src = laymap->
data_src;
4935 size_t tmp_buff_size = 32;
4936 const void **tmp_data_src =
nullptr;
4947 if (
int(data_type) &
CD_FAKE) {
4956 data_size = size_t(type_info->
size);
4963 for (
int i = 0;
i < totelem;
i++, data_dst =
POINTER_OFFSET(data_dst, data_step), mapit++) {
4965 const float mix_factor = laymap->
mix_factor *
4974 if (
UNLIKELY(sources_num > tmp_buff_size)) {
4975 tmp_buff_size = size_t(sources_num);
4976 tmp_data_src = (
const void **)
MEM_reallocN((
void *)tmp_data_src,
4977 sizeof(*tmp_data_src) * tmp_buff_size);
4980 for (
int j = 0; j < sources_num; j++) {
4981 const size_t src_idx = size_t(mapit->
indices_src[j]);
4982 tmp_data_src[j] =
POINTER_OFFSET(data_src, (data_step * src_idx) + data_offset);
5004 const char **r_struct_name,
5015 const int domain_size,
5034 attribute_dna.
name = layer.name;
5035 attribute_dna.
data_type = int16_t(*type);
5036 attribute_dna.
domain = int8_t(domain);
5044 array_dna.
data = layer.data;
5045 array_dna.sharing_info = layer.sharing_info;
5046 array_dna.size = domain_size;
5047 attribute_dna.
data = &array_dna;
5053 layers_to_write.
append(layer);
5055 data.totlayer = layers_to_write.
size();
5060 data.layers =
nullptr;
5067 if (!
data.layers && layers_to_write.
size() > 0) {
5081 const MDisps *md = &mdlist[
i];
5091 reinterpret_cast<const int8_t *
>(md->
hidden));
5101 if (grid_paint_mask) {
5117 switch (layer.
type) {
5133 "bool type is expected to have the same size as uint8_t")
5137 const char *structname;
5140 if (structnum > 0) {
5141 int datasize = structnum *
count;
5145 printf(
"%s error: layer '%s':%d - can't be written to file\n",
5158 eCustomDataMask cddata_mask,
5168 BLO_write_shared(writer, layer.data, size_in_bytes, layer.sharing_info, [&]() {
5169 blend_write_layer_data(writer, layer, count);
5176 if (
data->external) {
5193 reinterpret_cast<int8_t **
>(&md.
hidden));
5215 if (grid_paint_mask) {
5228 switch (layer.
type) {
5247 "bool type is expected to have the same size as uint8_t")
5251 const char *structname;
5254 if (structnum > 0) {
5255 const int data_num = structnum *
count;
5271 "Allocated custom data layer that was not saved correctly for layer.type = %d.",
5308 blend_read_layer_data(reader, *layer, count);
5309 if (layer->data == nullptr) {
5346 const char *structname;
5351 "%sdict(name='%s', struct='%s', type=%d, ptr='%p', elem=%d, length=%d),\n",
5385 return std::nullopt;
5401 return std::nullopt;
5421 const int64_t elem_size = CustomData_get_elem_size(&layer);
5422 shared_memory.add(totelem * elem_size);
int CCG_grid_size(const int level)
CustomData interface, see also DNA_customdata_types.h.
const CustomData_MeshMasks CD_MASK_EVERYTHING
void(*)(const void **sources, const float *weights, int count, void *dest) cd_interp
const CustomData_MeshMasks CD_MASK_BAREMESH_ORIGINDEX
eCustomDataMask CD_TYPE_AS_MASK(eCustomDataType type)
void(*)(void *data, int count) cd_set_default_value
void(*)(const CustomDataTransferLayerMap *laymap, void *dest, const void **sources, const float *weights, int count, float mix_factor) cd_datatransfer_interp
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
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)
@ 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_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_ORIGSPACE
#define CD_MASK_MLOOPTANGENT
#define MAX_CUSTOMDATA_LAYER_NAME_NO_PREFIX
@ 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)
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)
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_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 layerInterp_origspace_face(const void **sources, const float *weights, const int count, void *dest)
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 layerInterp_mloop_origspace(const void **sources, const float *weights, int count, void *dest)
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_bmesh_interp_n(CustomData *data, const void **src_blocks_ofs, const float *weights, int count, void *dst_block_ofs, int n)
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 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)
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 layerInterp_propfloat3(const void **sources, const float *weights, int count, void *dest)
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 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 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)
void CustomData_copy_elements(const eCustomDataType type, const void *src_data, void *dst_data, const int count)
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)
const void * CustomData_add_layer_with_data(CustomData *data, const eCustomDataType type, void *layer_data, const int totelem, const ImplicitSharingInfo *sharing_info)
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 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)
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 layerInterp_propcol(const void **sources, const float *weights, int count, void *dest)
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)
static void layerInterp_normal(const void **sources, const float *weights, const int count, void *dest)
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 layerInitMinMax_propcol(void *vmin, void *vmax)
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 layerInterp_tface(const void **sources, const float *weights, const int count, void *dest)
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)
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)
void CustomData_bmesh_init_pool(CustomData *data, const int totelem, const char htype)
static void layerInterp_shapekey(const void **sources, const float *weights, 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 void layerInterp_propquaternion(const void **sources, const float *weights, int count, void *dest)
static bool customdata_typemap_is_valid(const CustomData *data)
static void layerDefault_mcol(void *data, const int count)
bool CustomData_layertype_is_singleton(const eCustomDataType type)
static void layerInterp_mdeformvert(const void **sources, const float *weights, const int count, void *dest)
bool CustomData_layer_has_interp(const CustomData *data, const int layer_n)
static void layerFree_mdeformvert(void *data, const int count)
void CustomData_interp(const CustomData *source, CustomData *dest, const int *src_indices, const float *weights, int count, int dest_index)
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 layerInterp_mvert_skin(const void **sources, const float *weights, int count, void *dest)
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)
static void layerInterp_mloopcol(const void **sources, const float *weights, int count, void *dest)
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 layerDefault_propfloat4x4(void *data, const int count)
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 layerInterp_propFloat(const void **sources, const float *weights, const int count, void *dest)
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)
static void layerInterp_propbool(const void **sources, const float *weights, int count, void *dest)
int CustomData_sizeof(const eCustomDataType type)
static void layerCopyValue_normal(const void *source, void *dest, const int mixmode, const float mixfactor)
bool CustomData_external_test(CustomData *data, const eCustomDataType type)
static void layerInterp_propInt(const void **sources, const float *weights, const int count, void *dest)
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)
static void layerInterp_mcol(const void **sources, const float *weights, const int count, void *dest)
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)
bool CustomData_has_math(const CustomData *data)
void CustomData_bmesh_alloc_block(CustomData *data, void **block)
static void layerInterp_propfloat2(const void **sources, const float *weights, int count, void *dest)
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)
void CustomData_bmesh_free_block_data(CustomData *data, void *block)
#define COPY_BIT_FLAG(_type, _dst, _src, _f)
void CustomData_bmesh_interp(CustomData *data, const void **src_blocks, const float *weights, int count, void *dst_block)
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)
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()