43 const int dtdata_type = 1 << i;
46 if (!(dtdata_types & dtdata_type)) {
53 r_data_masks->
vmask |= 1LL << cddata_type;
56 r_data_masks->
emask |= 1LL << cddata_type;
59 r_data_masks->
lmask |= 1LL << cddata_type;
62 r_data_masks->
pmask |= 1LL << cddata_type;
78 bool *r_advanced_mixing,
83 *r_advanced_mixing =
false;
86 for (
int i = 0; (i <
DT_TYPE_MAX) && !(
ret && *r_advanced_mixing && *r_threshold); i++) {
87 const int dtdata_type = 1 << i;
89 if (!(dtdata_types & dtdata_type)) {
93 switch (dtdata_type) {
96 *r_advanced_mixing =
true;
134 *r_advanced_mixing =
true;
139 *r_advanced_mixing =
true;
161 const int dtdata_type = 1 << i;
163 if (!(dtdata_types & dtdata_type)) {
186 switch (dtdata_type) {
229 switch (dtdata_type) {
296 if (first_color_layer !=
nullptr) {
347 if (first_color_layer !=
nullptr) {
356 const int dtdata_type,
372 if (!custom_nors_dst) {
379 "sharp_edge", bke::AttrDomain::Edge);
380 const VArraySpan sharp_faces = *attributes.lookup<
bool>(
"sharp_face", bke::AttrDomain::Face);
385 me_dst->corner_verts(),
386 me_dst->corner_edges(),
387 me_dst->vert_normals(),
388 me_dst->face_normals(),
391 {loop_nors_dst, me_dst->corners_num},
392 {custom_nors_dst, me_dst->corners_num});
402 switch (cddata_type) {
414 const float mix_factor)
429 val_ret = (val_dst + val_src) * 0.5f;
432 val_ret = val_dst + val_src;
435 val_ret = val_dst - val_src;
438 val_ret = val_dst * val_src;
445 return interpf(val_ret, val_dst, mix_factor);
452 const int cddata_type,
454 const float mix_factor,
455 const float *mix_weights,
456 const void *data_src,
458 const int data_src_n,
459 const int data_dst_n,
460 const size_t elem_size,
461 const size_t data_size,
462 const size_t data_offset,
493 const int cddata_type,
495 const float mix_factor,
496 const float *mix_weights,
497 const void *data_src,
538 const float mix_factor,
539 const float *mix_weights,
540 const int num_elem_dst,
541 const bool use_create,
542 const bool use_delete,
546 const bool *use_layers_src,
547 const int num_layers_src,
551 const void *data_src;
552 void *data_dst =
nullptr;
553 int idx_src = num_layers_src;
555 bool *data_dst_to_delete =
nullptr;
557 if (!use_layers_src) {
573 while (idx_src-- && !use_layers_src[idx_src]) {
578 if (idx_dst < idx_src) {
581 for (; idx_dst < idx_src; idx_dst++) {
591 else if (use_delete && idx_dst > idx_src) {
592 while (idx_dst-- > idx_src) {
598 if (!use_layers_src[idx_src]) {
618 data_dst_to_delete =
static_cast<bool *
>(
619 MEM_mallocN(
sizeof(*data_dst_to_delete) *
size_t(tot_dst), __func__));
620 memset(data_dst_to_delete,
true,
sizeof(*data_dst_to_delete) *
size_t(tot_dst));
627 if (!use_layers_src[idx_src]) {
646 else if (data_dst_to_delete) {
647 data_dst_to_delete[idx_dst] =
false;
663 if (data_dst_to_delete) {
668 for (idx_dst = tot_dst; idx_dst--;) {
669 if (data_dst_to_delete[idx_dst]) {
687 const float mix_factor,
688 const float *mix_weights,
689 const int num_elem_dst,
690 const bool use_create,
691 const bool use_delete,
694 const int fromlayers,
699 int idx_src, idx_dst;
700 const void *data_src;
701 void *data_dst =
nullptr;
735 if (fromlayers >= 0) {
736 idx_src = fromlayers;
767 if (num <= idx_dst) {
772 for (; num <= idx_dst; num++) {
812 bool *use_layers_src = num_src ?
static_cast<bool *
>(
MEM_mallocN(
813 sizeof(*use_layers_src) *
size_t(num_src), __func__)) :
817 if (use_layers_src) {
818 memset(use_layers_src,
true,
sizeof(*use_layers_src) * num_src);
837 if (use_layers_src) {
858 const float *mix_weights,
859 const int num_elem_dst,
860 const bool use_create,
861 const bool use_delete,
862 const int fromlayers,
871 void *interp_data =
nullptr;
874 if (!(cddata_type &
CD_FAKE)) {
915 me_dst != ob_dst->
data,
931 "bevel_weight_vert");
947 else if (elem_type ==
ME_EDGE) {
948 if (!(cddata_type &
CD_FAKE)) {
1014 "bevel_weight_edge");
1050 else if (elem_type ==
ME_LOOP) {
1064 if (mix_factor != 1.0f || mix_weights) {
1073 me_src->corner_normals().data(),
1081 if (!(cddata_type &
CD_FAKE)) {
1108 else if (elem_type ==
ME_POLY) {
1113 if (!(cddata_type &
CD_FAKE)) {
1165 const int data_types,
1166 const bool use_delete,
1172 const bool use_create =
true;
1176 me_dst =
static_cast<Mesh *
>(ob_dst->
data);
1187 const int dtdata_type = 1 << i;
1189 int fromlayers, tolayers, fromto_idx;
1191 if (!(data_types & dtdata_type)) {
1200 fromlayers = fromlayers_select[fromto_idx];
1201 tolayers = tolayers_select[fromto_idx];
1204 fromlayers = tolayers = 0;
1208 const int num_elem_dst = me_dst->
verts_num;
1236 const int num_elem_dst = me_dst->
edges_num;
1284 const int num_elem_dst = me_dst->
faces_num;
1310 const int data_types,
1312 const int map_vert_mode,
1313 const int map_edge_mode,
1314 const int map_loop_mode,
1315 const int map_face_mode,
1317 const bool auto_transform,
1318 const float max_distance,
1319 const float ray_radius,
1320 const float islands_handling_precision,
1324 const float mix_factor,
1325 const char *vgroup_name,
1326 const bool invert_vgroup,
1341 float *weights[
DATAMAX] = {
nullptr};
1344 bool geom_map_init[
DATAMAX] = {
false};
1346 bool changed =
false;
1347 bool is_modifier =
false;
1349 const bool use_delete =
false;
1360 me_dst =
static_cast<Mesh *
>(ob_dst->
data);
1384 if (auto_transform) {
1385 if (space_transform ==
nullptr) {
1386 space_transform = &auto_space_transform;
1390 reinterpret_cast<const float(*)[3]
>(me_dst->vert_positions().data()),
1399 const int dtdata_type = 1 << i;
1401 int fromlayers, tolayers, fromto_idx;
1403 if (!(data_types & dtdata_type)) {
1411 fromlayers = fromlayers_select[fromto_idx];
1412 tolayers = tolayers_select[fromto_idx];
1415 fromlayers = tolayers = 0;
1420 const int num_verts_dst = me_dst->
verts_num;
1422 if (!geom_map_init[
VDATA]) {
1423 const int num_verts_src = me_src->
verts_num;
1428 "Source and destination meshes do not have the same number of vertices, "
1429 "'Topology' mapping cannot be used in this case");
1435 "Source mesh does not have any edges, "
1436 "none of the 'Edge' mappings can be used in this case");
1442 "Source mesh does not have any faces, "
1443 "none of the 'Face' mappings can be used in this case");
1446 if (
ELEM(0, num_verts_dst, num_verts_src)) {
1449 "Source or destination meshes do not have any vertices, cannot transfer "
1459 reinterpret_cast<const float(*)[3]
>(positions_dst.
data()),
1464 geom_map_init[
VDATA] =
true;
1467 if (mdef && vg_idx != -1 && !weights[
VDATA]) {
1468 weights[
VDATA] =
static_cast<float *
>(
1471 mdef, vg_idx, num_verts_dst, invert_vgroup, weights[
VDATA]);
1491 changed |= (lay_map.
first !=
nullptr);
1503 const int num_verts_dst = me_dst->
verts_num;
1506 if (!geom_map_init[
EDATA]) {
1507 const int num_edges_src = me_src->
edges_num;
1512 "Source and destination meshes do not have the same number of edges, "
1513 "'Topology' mapping cannot be used in this case");
1519 "Source mesh does not have any faces, "
1520 "none of the 'Face' mappings can be used in this case");
1523 if (
ELEM(0, edges_dst.
size(), num_edges_src)) {
1527 "Source or destination meshes do not have any edges, cannot transfer edge data");
1536 reinterpret_cast<const float(*)[3]
>(positions_dst.
data()),
1543 geom_map_init[
EDATA] =
true;
1546 if (mdef && vg_idx != -1 && !weights[
EDATA]) {
1547 weights[
EDATA] =
static_cast<float *
>(
1575 changed |= (lay_map.
first !=
nullptr);
1586 const int num_verts_dst = me_dst->
verts_num;
1592 if (!geom_map_init[
LDATA]) {
1599 "Source and destination meshes do not have the same number of face corners, "
1600 "'Topology' mapping cannot be used in this case");
1606 "Source mesh does not have any edges, "
1607 "none of the 'Edge' mappings can be used in this case");
1610 if (
ELEM(0, corner_verts_dst.
size(), num_loops_src)) {
1614 "Source or destination meshes do not have any faces, cannot transfer corner data");
1624 reinterpret_cast<const float(*)[3]
>(positions_dst.
data()),
1626 corner_verts_dst.
data(),
1627 corner_verts_dst.
size(),
1631 islands_handling_precision,
1633 geom_map_init[
LDATA] =
true;
1636 if (mdef && vg_idx != -1 && !weights[
LDATA]) {
1637 weights[
LDATA] =
static_cast<float *
>(
1642 corner_verts_dst.
data(),
1643 corner_verts_dst.
size(),
1658 corner_verts_dst.
size(),
1665 changed |= (lay_map.
first !=
nullptr);
1676 const int num_verts_dst = me_dst->
verts_num;
1680 if (!geom_map_init[
PDATA]) {
1681 const int num_faces_src = me_src->
faces_num;
1686 "Source and destination meshes do not have the same number of faces, "
1687 "'Topology' mapping cannot be used in this case");
1693 "Source mesh does not have any edges, "
1694 "none of the 'Edge' mappings can be used in this case");
1697 if (
ELEM(0, faces_dst.
size(), num_faces_src)) {
1701 "Source or destination meshes do not have any faces, cannot transfer face data");
1711 reinterpret_cast<const float(*)[3]
>(positions_dst.
data()),
1713 corner_verts_dst.
data(),
1717 geom_map_init[
PDATA] =
true;
1720 if (mdef && vg_idx != -1 && !weights[
PDATA]) {
1721 weights[
PDATA] =
static_cast<float *
>(
1726 corner_verts_dst.
data(),
1727 corner_verts_dst.
size(),
1750 changed |= (lay_map.
first !=
nullptr);
1763 for (
int i = 0; i <
DATAMAX; i++) {
1780 const int data_types,
1781 const bool use_create,
1782 const int map_vert_mode,
1783 const int map_edge_mode,
1784 const int map_loop_mode,
1785 const int map_face_mode,
1787 const bool auto_transform,
1788 const float max_distance,
1789 const float ray_radius,
1790 const float islands_handling_precision,
1794 const float mix_factor,
1795 const char *vgroup_name,
1796 const bool invert_vgroup,
1813 islands_handling_precision,
const char * BKE_id_attributes_default_color_name(const struct ID *id)
const char * BKE_id_attributes_active_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
#define ATTR_DOMAIN_MASK_COLOR
const struct CustomDataLayer * BKE_attribute_search(const AttributeOwner &owner, const char *name, eCustomDataMask type, AttrDomainMask domain_mask)
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)
@ CDT_MIX_REPLACE_BELOW_THRESHOLD
@ CDT_MIX_REPLACE_ABOVE_THRESHOLD
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_has_layer_named(const CustomData *data, eCustomDataType type, blender::StringRef name)
const char * CustomData_get_layer_name(const CustomData *data, eCustomDataType type, int n)
bool CustomData_free_layer(CustomData *data, eCustomDataType type, int totelem, int index)
void CustomData_free_layers(CustomData *data, eCustomDataType type, int totelem)
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)
#define DT_DATATYPE_IS_LOOP(_dt)
#define DT_DATATYPE_IS_EDGE(_dt)
@ 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_FACE(_dt)
#define DT_DATATYPE_IS_VERT(_dt)
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(struct ListBase *listbase) ATTR_NONNULL(1)
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
MINLINE float interpf(float target, float origin, float t)
char * BLI_strdup(const char *str) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1) ATTR_MALLOC
Object * DEG_get_evaluated_object(const Depsgraph *depsgraph, Object *object)
#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
#define CD_MASK_CUSTOMLOOPNORMAL
Object is a sort of wrapper for general info.
Read Guarded memory(de)allocation.
static AttributeOwner from_id(ID *id)
constexpr T * data() const
constexpr void copy_from(Span< T > values) const
constexpr const T * data() const
constexpr int64_t size() const
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(struct ListBase *r_map, int mix_mode, float mix_factor, const float *mix_weights, int num_elem_dst, bool use_create, bool use_delete, struct Object *ob_src, struct Object *ob_dst, const struct CustomData *cd_src, struct CustomData *cd_dst, bool use_dupref_dst, int fromlayers, int tolayers)
const Depsgraph * depsgraph
void *(* MEM_mallocN)(size_t len, const char *str)
void MEM_freeN(void *vmemh)
ccl_device_inline float2 interp(const float2 a, const float2 b, float t)
void normals_corner_custom_set(Span< float3 > vert_positions, Span< int2 > edges, OffsetIndices< int > faces, Span< int > corner_verts, Span< int > corner_edges, 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)
unsigned __int64 uint64_t
const float * mix_weights
cd_datatransfer_interp interp
char * default_color_attribute
char * active_color_attribute
MutableVArraySpan< T > span