45 const int dtdata_type = 1 <<
i;
48 if (!(dtdata_types & dtdata_type)) {
55 r_data_masks->
vmask |= 1LL << cddata_type;
58 r_data_masks->
emask |= 1LL << cddata_type;
61 r_data_masks->
lmask |= 1LL << cddata_type;
64 r_data_masks->
pmask |= 1LL << cddata_type;
77 bool *r_advanced_mixing,
82 *r_advanced_mixing =
false;
85 for (
int i = 0; (
i <
DT_TYPE_MAX) && !(
ret && *r_advanced_mixing && *r_threshold);
i++) {
86 const int dtdata_type = 1 <<
i;
88 if (!(dtdata_types & dtdata_type)) {
92 switch (dtdata_type) {
95 *r_advanced_mixing =
true;
133 *r_advanced_mixing =
true;
138 *r_advanced_mixing =
true;
160 const int dtdata_type = 1 <<
i;
162 if (!(dtdata_types & dtdata_type)) {
185 switch (dtdata_type) {
228 switch (dtdata_type) {
286 active_color_src.
size());
293 active_color_src.
size());
298 if (first_color_layer !=
nullptr) {
340 default_color_src.
size());
347 default_color_src.
size());
352 if (first_color_layer !=
nullptr) {
361 const int dtdata_type,
378 if (!custom_nors_dst) {
387 me_dst->corner_verts(),
388 me_dst->corner_edges(),
389 me_dst->vert_to_face_map(),
390 me_dst->vert_normals(),
391 me_dst->face_normals_true(),
394 {loop_nors_dst, me_dst->corners_num},
395 custom_nors_dst.
span);
406 switch (cddata_type) {
418 const float mix_factor)
433 val_ret = (val_dst + val_src) * 0.5f;
436 val_ret = val_dst + val_src;
439 val_ret = val_dst - val_src;
442 val_ret = val_dst * val_src;
449 return interpf(val_ret, val_dst, mix_factor);
456 const int cddata_type,
458 const float mix_factor,
459 const float *mix_weights,
460 const void *data_src,
462 const int data_src_n,
463 const int data_dst_n,
464 const size_t elem_size,
465 const size_t data_size,
466 const size_t data_offset,
497 const int cddata_type,
499 const float mix_factor,
500 const float *mix_weights,
501 const void *data_src,
542 const float mix_factor,
543 const float *mix_weights,
544 const int num_elem_dst,
545 const bool use_create,
546 const bool use_delete,
550 const bool *use_layers_src,
551 const int num_layers_src,
555 const void *data_src;
556 void *data_dst =
nullptr;
557 int idx_src = num_layers_src;
559 bool *data_dst_to_delete =
nullptr;
561 if (!use_layers_src) {
577 while (idx_src-- && !use_layers_src[idx_src]) {
582 if (idx_dst < idx_src) {
585 for (; idx_dst < idx_src; idx_dst++) {
595 else if (use_delete && idx_dst > idx_src) {
596 while (idx_dst-- > idx_src) {
602 if (!use_layers_src[idx_src]) {
623 memset(data_dst_to_delete,
true,
sizeof(*data_dst_to_delete) *
size_t(tot_dst));
630 if (!use_layers_src[idx_src]) {
649 else if (data_dst_to_delete) {
650 data_dst_to_delete[idx_dst] =
false;
666 if (data_dst_to_delete) {
671 for (idx_dst = tot_dst; idx_dst--;) {
672 if (data_dst_to_delete[idx_dst]) {
690 const float mix_factor,
691 const float *mix_weights,
692 const int num_elem_dst,
693 const bool use_create,
694 const bool use_delete,
697 const int fromlayers,
702 void *data_dst =
nullptr;
738 if (fromlayers >= 0) {
739 idx_src = fromlayers;
773 if (
num <= idx_dst) {
778 for (;
num <= idx_dst;
num++) {
822 if (use_layers_src) {
823 memset(use_layers_src,
true,
sizeof(*use_layers_src) * num_src);
842 if (use_layers_src) {
863 const float *mix_weights,
864 const int num_elem_dst,
865 const bool use_create,
866 const bool use_delete,
867 const int fromlayers,
876 void *interp_data =
nullptr;
879 if (!(cddata_type &
CD_FAKE)) {
920 me_dst != ob_dst->
data,
936 "bevel_weight_vert");
952 else if (elem_type ==
ME_EDGE) {
953 if (!(cddata_type &
CD_FAKE)) {
1019 "bevel_weight_edge");
1055 else if (elem_type ==
ME_LOOP) {
1069 if (mix_factor != 1.0f || mix_weights) {
1078 me_src->corner_normals().data(),
1086 if (!(cddata_type &
CD_FAKE)) {
1113 else if (elem_type ==
ME_POLY) {
1118 if (!(cddata_type &
CD_FAKE)) {
1170 const int data_types,
1171 const bool use_delete,
1177 const bool use_create =
true;
1181 me_dst =
static_cast<Mesh *
>(ob_dst->
data);
1192 const int dtdata_type = 1 <<
i;
1194 int fromlayers, tolayers, fromto_idx;
1196 if (!(data_types & dtdata_type)) {
1205 fromlayers = fromlayers_select[fromto_idx];
1206 tolayers = tolayers_select[fromto_idx];
1209 fromlayers = tolayers = 0;
1213 const int num_elem_dst = me_dst->
verts_num;
1241 const int num_elem_dst = me_dst->
edges_num;
1289 const int num_elem_dst = me_dst->
faces_num;
1315 const int data_types,
1317 const int map_vert_mode,
1318 const int map_edge_mode,
1319 const int map_loop_mode,
1320 const int map_face_mode,
1322 const bool auto_transform,
1323 const float max_distance,
1324 const float ray_radius,
1325 const float islands_handling_precision,
1329 const float mix_factor,
1330 const char *vgroup_name,
1331 const bool invert_vgroup,
1346 float *weights[
DATAMAX] = {
nullptr};
1349 bool geom_map_init[
DATAMAX] = {
false};
1351 bool changed =
false;
1352 bool is_modifier =
false;
1354 const bool use_delete =
false;
1365 me_dst =
static_cast<Mesh *
>(ob_dst->
data);
1389 if (auto_transform) {
1390 if (space_transform ==
nullptr) {
1391 space_transform = &auto_space_transform;
1395 reinterpret_cast<const float(*)[3]
>(me_dst->vert_positions().data()),
1404 const int dtdata_type = 1 <<
i;
1406 int fromlayers, tolayers, fromto_idx;
1408 if (!(data_types & dtdata_type)) {
1416 fromlayers = fromlayers_select[fromto_idx];
1417 tolayers = tolayers_select[fromto_idx];
1420 fromlayers = tolayers = 0;
1425 const int num_verts_dst = me_dst->
verts_num;
1427 if (!geom_map_init[
VDATA]) {
1428 const int num_verts_src = me_src->
verts_num;
1433 "Source and destination meshes do not have the same number of vertices, "
1434 "'Topology' mapping cannot be used in this case");
1440 "Source mesh does not have any edges, "
1441 "none of the 'Edge' mappings can be used in this case");
1447 "Source mesh does not have any faces, "
1448 "none of the 'Face' mappings can be used in this case");
1451 if (
ELEM(0, num_verts_dst, num_verts_src)) {
1454 "Source or destination meshes do not have any vertices, cannot transfer "
1464 reinterpret_cast<const float(*)[3]
>(positions_dst.
data()),
1469 geom_map_init[
VDATA] =
true;
1472 if (mdef && vg_idx != -1 && !weights[
VDATA]) {
1475 mdef, vg_idx, num_verts_dst, invert_vgroup, weights[
VDATA]);
1495 changed |= (lay_map.
first !=
nullptr);
1507 const int num_verts_dst = me_dst->
verts_num;
1510 if (!geom_map_init[
EDATA]) {
1511 const int num_edges_src = me_src->
edges_num;
1516 "Source and destination meshes do not have the same number of edges, "
1517 "'Topology' mapping cannot be used in this case");
1523 "Source mesh does not have any faces, "
1524 "none of the 'Face' mappings can be used in this case");
1527 if (
ELEM(0, edges_dst.
size(), num_edges_src)) {
1531 "Source or destination meshes do not have any edges, cannot transfer edge data");
1540 reinterpret_cast<const float(*)[3]
>(positions_dst.
data()),
1547 geom_map_init[
EDATA] =
true;
1550 if (mdef && vg_idx != -1 && !weights[
EDATA]) {
1578 changed |= (lay_map.
first !=
nullptr);
1589 const int num_verts_dst = me_dst->
verts_num;
1595 if (!geom_map_init[
LDATA]) {
1602 "Source and destination meshes do not have the same number of face corners, "
1603 "'Topology' mapping cannot be used in this case");
1609 "Source mesh does not have any edges, "
1610 "none of the 'Edge' mappings can be used in this case");
1613 if (
ELEM(0, corner_verts_dst.
size(), num_loops_src)) {
1617 "Source or destination meshes do not have any faces, cannot transfer corner data");
1627 reinterpret_cast<const float(*)[3]
>(positions_dst.
data()),
1629 corner_verts_dst.
data(),
1630 corner_verts_dst.
size(),
1634 islands_handling_precision,
1636 geom_map_init[
LDATA] =
true;
1639 if (mdef && vg_idx != -1 && !weights[
LDATA]) {
1644 corner_verts_dst.
data(),
1645 corner_verts_dst.
size(),
1660 corner_verts_dst.
size(),
1667 changed |= (lay_map.
first !=
nullptr);
1678 const int num_verts_dst = me_dst->
verts_num;
1682 if (!geom_map_init[
PDATA]) {
1683 const int num_faces_src = me_src->
faces_num;
1688 "Source and destination meshes do not have the same number of faces, "
1689 "'Topology' mapping cannot be used in this case");
1695 "Source mesh does not have any edges, "
1696 "none of the 'Edge' mappings can be used in this case");
1699 if (
ELEM(0, faces_dst.
size(), num_faces_src)) {
1703 "Source or destination meshes do not have any faces, cannot transfer face data");
1713 reinterpret_cast<const float(*)[3]
>(positions_dst.
data()),
1715 corner_verts_dst.
data(),
1719 geom_map_init[
PDATA] =
true;
1722 if (mdef && vg_idx != -1 && !weights[
PDATA]) {
1727 corner_verts_dst.
data(),
1728 corner_verts_dst.
size(),
1751 changed |= (lay_map.
first !=
nullptr);
1781 const int data_types,
1782 const bool use_create,
1783 const int map_vert_mode,
1784 const int map_edge_mode,
1785 const int map_loop_mode,
1786 const int map_face_mode,
1788 const bool auto_transform,
1789 const float max_distance,
1790 const float ray_radius,
1791 const float islands_handling_precision,
1795 const float mix_factor,
1796 const char *vgroup_name,
1797 const bool invert_vgroup,
1814 islands_handling_precision,
std::optional< blender::StringRef > BKE_id_attributes_default_color_name(const struct ID *id)
CustomDataLayer * BKE_attribute_from_index(AttributeOwner &owner, int lookup_index, AttrDomainMask domain_mask, eCustomDataMask layer_mask)
@ ATTR_DOMAIN_MASK_CORNER
const struct CustomDataLayer * BKE_attribute_search(const AttributeOwner &owner, blender::StringRef name, eCustomDataMask type, AttrDomainMask domain_mask)
std::optional< blender::StringRef > BKE_id_attributes_active_color_name(const struct ID *id)
#define ATTR_DOMAIN_MASK_COLOR
CustomData interface, see also DNA_customdata_types.h.
void * CustomData_get_layer_named_for_write(CustomData *data, eCustomDataType type, blender::StringRef name, int totelem)
const void * CustomData_get_layer_n(const CustomData *data, eCustomDataType type, int n)
int CustomData_get_named_layer(const CustomData *data, eCustomDataType type, blender::StringRef name)
const void * CustomData_get_layer(const CustomData *data, eCustomDataType type)
void(*)(const CustomDataTransferLayerMap *laymap, void *dest, const void **sources, const float *weights, int count, float mix_factor) cd_datatransfer_interp
const void * CustomData_get_layer_named(const CustomData *data, eCustomDataType type, blender::StringRef name)
void * CustomData_add_layer_named(CustomData *data, eCustomDataType type, eCDAllocType alloctype, int totelem, blender::StringRef name)
bool CustomData_free_layer(CustomData *data, eCustomDataType type, int index)
bool CustomData_has_layer_named(const CustomData *data, eCustomDataType type, blender::StringRef name)
const char * CustomData_get_layer_name(const CustomData *data, eCustomDataType type, int n)
void CustomData_free_layers(CustomData *data, eCustomDataType type)
void CustomData_data_transfer(const MeshPairRemap *me_remap, const CustomDataTransferLayerMap *laymap)
int CustomData_get_active_layer(const CustomData *data, eCustomDataType type)
void * CustomData_get_layer_for_write(CustomData *data, eCustomDataType type, int totelem)
void * CustomData_add_layer(CustomData *data, eCustomDataType type, eCDAllocType alloctype, int totelem)
bool CustomData_layertype_is_singleton(eCustomDataType type)
int CustomData_number_of_layers(const CustomData *data, eCustomDataType type)
void * CustomData_get_layer_n_for_write(CustomData *data, eCustomDataType type, int n, int totelem)
bool(*)(const float(*vert_positions)[3], int totvert, const blender::int2 *edges, int totedge, const bool *uv_seams, blender::OffsetIndices< int > faces, const int *corner_verts, const int *corner_edges, int corners_num, MeshIslandStore *r_island_store) MeshRemapIslandsCalc
bool BKE_mesh_calc_islands_loop_face_edgeseam(const float(*vert_positions)[3], int totvert, const blender::int2 *edges, int totedge, const bool *uv_seams, blender::OffsetIndices< int > faces, const int *corner_verts, const int *corner_edges, int corners_num, MeshIslandStore *r_island_store)
void BKE_mesh_remap_calc_loops_from_mesh(int mode, const SpaceTransform *space_transform, float max_dist, float ray_radius, const Mesh *mesh_dst, const float(*vert_positions_dst)[3], int numverts_dst, const int *corner_verts_dst, int numloops_dst, const blender::OffsetIndices< int > faces_dst, const Mesh *me_src, MeshRemapIslandsCalc gen_islands_src, float islands_precision_src, MeshPairRemap *r_map)
void BKE_mesh_remap_calc_edges_from_mesh(int mode, const SpaceTransform *space_transform, float max_dist, float ray_radius, const float(*vert_positions_dst)[3], int numverts_dst, const blender::int2 *edges_dst, int numedges_dst, const Mesh *me_src, Mesh *me_dst, MeshPairRemap *r_map)
void BKE_mesh_remap_free(MeshPairRemap *map)
void BKE_mesh_remap_calc_verts_from_mesh(int mode, const SpaceTransform *space_transform, float max_dist, float ray_radius, const float(*vert_positions_dst)[3], int numverts_dst, const Mesh *me_src, Mesh *me_dst, MeshPairRemap *r_map)
void BKE_mesh_remap_calc_faces_from_mesh(int mode, const SpaceTransform *space_transform, float max_dist, float ray_radius, const Mesh *mesh_dst, const float(*vert_positions_dst)[3], int numverts_dst, const int *corner_verts, const blender::OffsetIndices< int > faces_dst, const Mesh *me_src, MeshPairRemap *r_map)
void BKE_mesh_remap_find_best_match_from_mesh(const float(*vert_positions_dst)[3], int numverts_dst, const Mesh *me_src, SpaceTransform *r_space_transform)
void BKE_mesh_wrapper_ensure_mdata(Mesh *mesh)
Mesh * BKE_modifier_get_evaluated_mesh_from_evaluated_object(Object *ob_eval)
General operations, lookup, etc. for blender objects.
Mesh * BKE_object_get_evaluated_mesh(const Object *object_eval)
void BKE_report(ReportList *reports, eReportType type, const char *message)
#define BLI_assert_unreachable()
#define LISTBASE_FOREACH(type, var, list)
void void BLI_freelistN(ListBase *listbase) ATTR_NONNULL(1)
void BLI_addtail(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
MINLINE float interpf(float target, float origin, float t)
ATTR_WARN_UNUSED_RESULT const size_t num
char * BLI_strdup(const char *str) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1) ATTR_MALLOC
char * BLI_strdupn(const char *str, size_t len) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
T * DEG_get_evaluated(const Depsgraph *depsgraph, T *id)
@ DT_MULTILAYER_INDEX_MAX
@ DT_MULTILAYER_INDEX_MDEFORMVERT
@ DT_MULTILAYER_INDEX_INVALID
@ DT_MULTILAYER_INDEX_SHAPEKEY
@ DT_MULTILAYER_INDEX_VCOL_VERT
@ DT_MULTILAYER_INDEX_VCOL_LOOP
#define DT_DATATYPE_IS_LOOP(_dt)
#define DT_DATATYPE_IS_EDGE(_dt)
@ CDT_MIX_REPLACE_BELOW_THRESHOLD
@ CDT_MIX_REPLACE_ABOVE_THRESHOLD
#define DT_DATATYPE_IS_FACE(_dt)
#define DT_DATATYPE_IS_VERT(_dt)
Object is a sort of wrapper for general info.
Read Guarded memory(de)allocation.
BPy_StructRNA * depsgraph
unsigned long long int uint64_t
static AttributeOwner from_id(ID *id)
constexpr void copy_from(Span< T > values) const
constexpr T * data() const
constexpr const T * data() const
constexpr int64_t size() const
constexpr int64_t size() const
constexpr const char * data() const
GAttributeReader lookup(const StringRef attribute_id) const
GSpanAttributeWriter lookup_or_add_for_write_span(StringRef attribute_id, AttrDomain domain, eCustomDataType data_type, const AttributeInit &initializer=AttributeInitDefaultValue())
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)
void data_transfer_layersmapping_add_item(ListBase *r_map, const int cddata_type, const int mix_mode, const float mix_factor, const float *mix_weights, const void *data_src, void *data_dst, const int data_src_n, const int data_dst_n, const size_t elem_size, const size_t data_size, const size_t data_offset, const uint64_t data_flag, cd_datatransfer_interp interp, void *interp_data)
static bool data_transfer_layersmapping_cdlayers(ListBase *r_map, const eCustomDataType cddata_type, const int mix_mode, const float mix_factor, const float *mix_weights, const int num_elem_dst, const bool use_create, const bool use_delete, const CustomData *cd_src, CustomData *cd_dst, const int fromlayers, const int tolayers, cd_datatransfer_interp interp, void *interp_data)
static MeshRemapIslandsCalc data_transfer_get_loop_islands_generator(const int cddata_type)
bool BKE_object_data_transfer_ex(Depsgraph *depsgraph, Object *ob_src, Object *ob_dst, Mesh *me_dst, const int data_types, bool use_create, const int map_vert_mode, const int map_edge_mode, const int map_loop_mode, const int map_face_mode, SpaceTransform *space_transform, const bool auto_transform, const float max_distance, const float ray_radius, const float islands_handling_precision, const int fromlayers_select[DT_MULTILAYER_INDEX_MAX], const int tolayers_select[DT_MULTILAYER_INDEX_MAX], const int mix_mode, const float mix_factor, const char *vgroup_name, const bool invert_vgroup, ReportList *reports)
bool BKE_object_data_transfer_mesh(Depsgraph *depsgraph, Object *ob_src, Object *ob_dst, const int data_types, const bool use_create, const int map_vert_mode, const int map_edge_mode, const int map_loop_mode, const int map_face_mode, SpaceTransform *space_transform, const bool auto_transform, const float max_distance, const float ray_radius, const float islands_handling_precision, const int fromlayers_select[DT_MULTILAYER_INDEX_MAX], const int tolayers_select[DT_MULTILAYER_INDEX_MAX], const int mix_mode, const float mix_factor, const char *vgroup_name, const bool invert_vgroup, ReportList *reports)
void BKE_object_data_transfer_layout(Depsgraph *depsgraph, Object *ob_src, Object *ob_dst, const int data_types, const bool use_delete, const int fromlayers_select[DT_MULTILAYER_INDEX_MAX], const int tolayers_select[DT_MULTILAYER_INDEX_MAX])
int BKE_object_data_transfer_dttype_to_srcdst_index(const int dtdata_type)
int BKE_object_data_transfer_get_dttypes_item_types(const int dtdata_types)
static void data_transfer_mesh_attributes_transfer_active_color_string(Mesh *mesh_dst, const Mesh *mesh_src, const AttrDomainMask mask_domain, const int data_type)
bool BKE_object_data_transfer_get_dttypes_capacity(const int dtdata_types, bool *r_advanced_mixing, bool *r_threshold)
int BKE_object_data_transfer_dttype_to_cdtype(const int dtdata_type)
float data_transfer_interp_float_do(const int mix_mode, const float val_dst, const float val_src, const float mix_factor)
static void data_transfer_dtdata_type_postprocess(Mesh *me_dst, const int dtdata_type, const bool changed)
void BKE_object_data_transfer_dttypes_to_cdmask(const int dtdata_types, CustomData_MeshMasks *r_data_masks)
static bool data_transfer_layersmapping_cdlayers_multisrc_to_dst(ListBase *r_map, const eCustomDataType cddata_type, const int mix_mode, const float mix_factor, const float *mix_weights, const int num_elem_dst, const bool use_create, const bool use_delete, const CustomData *cd_src, CustomData *cd_dst, const int tolayers, const bool *use_layers_src, const int num_layers_src, cd_datatransfer_interp interp, void *interp_data)
static void data_transfer_mesh_attributes_transfer_default_color_string(Mesh *mesh_dst, const Mesh *mesh_src, const AttrDomainMask mask_domain, const int data_type)
static void data_transfer_layersmapping_add_item_cd(ListBase *r_map, const int cddata_type, const int mix_mode, const float mix_factor, const float *mix_weights, const void *data_src, void *data_dst, cd_datatransfer_interp interp, void *interp_data)
static bool data_transfer_layersmapping_generate(ListBase *r_map, Object *ob_src, Object *ob_dst, const Mesh *me_src, Mesh *me_dst, const int elem_type, int cddata_type, int mix_mode, float mix_factor, const float *mix_weights, const int num_elem_dst, const bool use_create, const bool use_delete, const int fromlayers, const int tolayers, SpaceTransform *space_transform)
bool data_transfer_layersmapping_vgroups(ListBase *r_map, int mix_mode, float mix_factor, const float *mix_weights, int num_elem_dst, bool use_create, bool use_delete, Object *ob_src, Object *ob_dst, const CustomData *cd_src, CustomData *cd_dst, bool use_dupref_dst, int fromlayers, int tolayers)
VecBase< short, 2 > short2
#define CD_MASK_PROP_BYTE_COLOR
#define CD_MASK_PROP_COLOR
#define CD_MASK_MDEFORMVERT
#define CD_MASK_PROP_FLOAT2
#define CD_MASK_COLOR_ALL
void * MEM_callocN(size_t len, const char *str)
void * MEM_malloc_arrayN(size_t len, size_t size, const char *str)
void MEM_freeN(void *vmemh)
ccl_device_inline float interp(const float a, const float b, const float t)
void normals_corner_custom_set(Span< float3 > vert_positions, OffsetIndices< int > faces, Span< int > corner_verts, Span< int > corner_edges, GroupedSpan< int > vert_to_face_map, Span< float3 > vert_normals, Span< float3 > face_normals, Span< bool > sharp_faces, MutableSpan< bool > sharp_edges, MutableSpan< float3 > r_custom_corner_normals, MutableSpan< short2 > r_clnors_data)
VecBase< float, 3 > float3
const float * mix_weights
cd_datatransfer_interp interp
char * default_color_attribute
char * active_color_attribute
MutableVArraySpan< T > span