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) {
226 switch (dtdata_type) {
282 active_color_src.
size());
289 active_color_src.
size());
294 if (first_color_layer !=
nullptr) {
336 default_color_src.
size());
343 default_color_src.
size());
348 if (first_color_layer !=
nullptr) {
357 const int dtdata_type,
374 if (!custom_nors_dst) {
383 me_dst->corner_verts(),
384 me_dst->corner_edges(),
385 me_dst->vert_to_face_map(),
386 me_dst->vert_normals(),
387 me_dst->face_normals_true(),
390 {loop_nors_dst, me_dst->corners_num},
391 custom_nors_dst.
span);
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,
529 const float mix_factor,
530 const float *mix_weights,
531 const int num_elem_dst,
532 const bool use_create,
533 const bool use_delete,
537 const bool *use_layers_src,
538 const int num_layers_src)
540 const void *data_src;
541 void *data_dst =
nullptr;
542 int idx_src = num_layers_src;
544 bool *data_dst_to_delete =
nullptr;
546 if (!use_layers_src) {
562 while (idx_src-- && !use_layers_src[idx_src]) {
567 if (idx_dst < idx_src) {
570 for (; idx_dst < idx_src; idx_dst++) {
580 else if (use_delete && idx_dst > idx_src) {
581 while (idx_dst-- > idx_src) {
587 if (!use_layers_src[idx_src]) {
608 memset(data_dst_to_delete,
true,
sizeof(*data_dst_to_delete) *
size_t(tot_dst));
615 if (!use_layers_src[idx_src]) {
634 else if (data_dst_to_delete) {
635 data_dst_to_delete[idx_dst] =
false;
651 if (data_dst_to_delete) {
656 for (idx_dst = tot_dst; idx_dst--;) {
657 if (data_dst_to_delete[idx_dst]) {
675 const float mix_factor,
676 const float *mix_weights,
677 const int num_elem_dst,
678 const bool use_create,
679 const bool use_delete,
682 const int fromlayers,
685 void *data_dst =
nullptr;
721 if (fromlayers >= 0) {
722 idx_src = fromlayers;
756 if (
num <= idx_dst) {
761 for (;
num <= idx_dst;
num++) {
806 if (use_layers_src) {
807 memset(use_layers_src,
true,
sizeof(*use_layers_src) * num_src);
824 if (use_layers_src) {
845 const float *mix_weights,
846 const int num_elem_dst,
847 const bool use_create,
848 const bool use_delete,
849 const int fromlayers,
856 if (!(cddata_type &
CD_FAKE)) {
886 me_dst != ob_dst->
data,
896 "bevel_weight_vert");
912 else if (elem_type ==
ME_EDGE) {
955 "bevel_weight_edge");
1009 else if (elem_type ==
ME_LOOP) {
1023 if (mix_factor != 1.0f || mix_weights) {
1032 me_src->corner_normals().data(),
1040 if (!(cddata_type &
CD_FAKE)) {
1062 else if (elem_type ==
ME_POLY) {
1109 const int data_types,
1110 const bool use_delete,
1116 const bool use_create =
true;
1120 me_dst =
static_cast<Mesh *
>(ob_dst->
data);
1131 const int dtdata_type = 1 <<
i;
1133 int fromlayers, tolayers, fromto_idx;
1135 if (!(data_types & dtdata_type)) {
1144 fromlayers = fromlayers_select[fromto_idx];
1145 tolayers = tolayers_select[fromto_idx];
1148 fromlayers = tolayers = 0;
1152 const int num_elem_dst = me_dst->
verts_num;
1180 const int num_elem_dst = me_dst->
edges_num;
1228 const int num_elem_dst = me_dst->
faces_num;
1254 const int data_types,
1256 const int map_vert_mode,
1257 const int map_edge_mode,
1258 const int map_loop_mode,
1259 const int map_face_mode,
1261 const bool auto_transform,
1262 const float max_distance,
1263 const float ray_radius,
1264 const float islands_handling_precision,
1268 const float mix_factor,
1269 const char *vgroup_name,
1270 const bool invert_vgroup,
1285 float *weights[
DATAMAX] = {
nullptr};
1288 bool geom_map_init[
DATAMAX] = {
false};
1290 bool changed =
false;
1291 bool is_modifier =
false;
1293 const bool use_delete =
false;
1304 me_dst =
static_cast<Mesh *
>(ob_dst->
data);
1308 mdef = me_dst->deform_verts().data();
1327 if (auto_transform) {
1328 if (space_transform ==
nullptr) {
1329 space_transform = &auto_space_transform;
1338 const int dtdata_type = 1 <<
i;
1340 int fromlayers, tolayers, fromto_idx;
1342 if (!(data_types & dtdata_type)) {
1350 fromlayers = fromlayers_select[fromto_idx];
1351 tolayers = tolayers_select[fromto_idx];
1354 fromlayers = tolayers = 0;
1359 const int num_verts_dst = me_dst->
verts_num;
1361 if (!geom_map_init[
VDATA]) {
1362 const int num_verts_src = me_src->
verts_num;
1367 "Source and destination meshes do not have the same number of vertices, "
1368 "'Topology' mapping cannot be used in this case");
1374 "Source mesh does not have any edges, "
1375 "none of the 'Edge' mappings can be used in this case");
1381 "Source mesh does not have any faces, "
1382 "none of the 'Face' mappings can be used in this case");
1385 if (
ELEM(0, num_verts_dst, num_verts_src)) {
1388 "Source or destination meshes do not have any vertices, cannot transfer "
1401 geom_map_init[
VDATA] =
true;
1404 if (mdef && vg_idx != -1 && !weights[
VDATA]) {
1407 mdef, vg_idx, num_verts_dst, invert_vgroup, weights[
VDATA]);
1427 changed |= (lay_map.
first !=
nullptr);
1439 const int num_verts_dst = me_dst->
verts_num;
1442 if (!geom_map_init[
EDATA]) {
1443 const int num_edges_src = me_src->
edges_num;
1448 "Source and destination meshes do not have the same number of edges, "
1449 "'Topology' mapping cannot be used in this case");
1455 "Source mesh does not have any faces, "
1456 "none of the 'Face' mappings can be used in this case");
1459 if (
ELEM(0, edges_dst.
size(), num_edges_src)) {
1463 "Source or destination meshes do not have any edges, cannot transfer edge data");
1476 geom_map_init[
EDATA] =
true;
1479 if (mdef && vg_idx != -1 && !weights[
EDATA]) {
1482 mdef, vg_idx, num_verts_dst, edges_dst, invert_vgroup, weights[
EDATA]);
1502 changed |= (lay_map.
first !=
nullptr);
1513 const int num_verts_dst = me_dst->
verts_num;
1519 if (!geom_map_init[
LDATA]) {
1526 "Source and destination meshes do not have the same number of face corners, "
1527 "'Topology' mapping cannot be used in this case");
1533 "Source mesh does not have any edges, "
1534 "none of the 'Edge' mappings can be used in this case");
1537 if (
ELEM(0, corner_verts_dst.
size(), num_loops_src)) {
1541 "Source or destination meshes do not have any faces, cannot transfer corner data");
1555 islands_handling_precision,
1557 geom_map_init[
LDATA] =
true;
1560 if (mdef && vg_idx != -1 && !weights[
LDATA]) {
1563 mdef, vg_idx, num_verts_dst, corner_verts_dst, invert_vgroup, weights[
LDATA]);
1576 corner_verts_dst.
size(),
1583 changed |= (lay_map.
first !=
nullptr);
1594 const int num_verts_dst = me_dst->
verts_num;
1598 if (!geom_map_init[
PDATA]) {
1599 const int num_faces_src = me_src->
faces_num;
1604 "Source and destination meshes do not have the same number of faces, "
1605 "'Topology' mapping cannot be used in this case");
1611 "Source mesh does not have any edges, "
1612 "none of the 'Edge' mappings can be used in this case");
1615 if (
ELEM(0, faces_dst.
size(), num_faces_src)) {
1619 "Source or destination meshes do not have any faces, cannot transfer face data");
1633 geom_map_init[
PDATA] =
true;
1636 if (mdef && vg_idx != -1 && !weights[
PDATA]) {
1664 changed |= (lay_map.
first !=
nullptr);
1694 const int data_types,
1695 const bool use_create,
1696 const int map_vert_mode,
1697 const int map_edge_mode,
1698 const int map_loop_mode,
1699 const int map_face_mode,
1701 const bool auto_transform,
1702 const float max_distance,
1703 const float ray_radius,
1704 const float islands_handling_precision,
1708 const float mix_factor,
1709 const char *vgroup_name,
1710 const bool invert_vgroup,
1727 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)
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(*)(const CustomDataTransferLayerMap *laymap, void *dest, const void **sources, const float *weights, int count, float mix_factor) cd_datatransfer_interp
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(*)(blender::Span< blender::float3 > vert_positions, blender::Span< blender::int2 > edges, blender::Span< bool > uv_seams, blender::OffsetIndices< int > faces, blender::Span< int > corner_verts, blender::Span< int > corner_edges, MeshIslandStore *r_island_store) MeshRemapIslandsCalc
bool BKE_mesh_calc_islands_loop_face_edgeseam(blender::Span< blender::float3 > vert_positions, blender::Span< blender::int2 > edges, blender::Span< bool > uv_seams, blender::OffsetIndices< int > faces, blender::Span< int > corner_verts, blender::Span< int > corner_edges, MeshIslandStore *r_island_store)
void BKE_mesh_remap_find_best_match_from_mesh(blender::Span< blender::float3 > vert_positions_dst, const Mesh *me_src, SpaceTransform *r_space_transform)
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, blender::Span< blender::float3 > vert_positions_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, blender::Span< blender::float3 > vert_positions_dst, blender::Span< int > corner_verts, const blender::OffsetIndices< int > faces_dst, const Mesh *me_src, MeshPairRemap *r_map)
void BKE_mesh_remap_calc_edges_from_mesh(int mode, const SpaceTransform *space_transform, float max_dist, float ray_radius, blender::Span< blender::float3 > vert_positions_dst, blender::Span< blender::int2 > edges_dst, const Mesh *me_src, Mesh *me_dst, MeshPairRemap *r_map)
void BKE_mesh_remap_calc_loops_from_mesh(int mode, const SpaceTransform *space_transform, float max_dist, float ray_radius, const Mesh *mesh_dst, blender::Span< blender::float3 > vert_positions_dst, blender::Span< int > corner_verts_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_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)
#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
@ DT_MULTILAYER_INDEX_MAX
@ DT_MULTILAYER_INDEX_MDEFORMVERT
@ DT_MULTILAYER_INDEX_INVALID
@ DT_MULTILAYER_INDEX_VCOL_VERT
@ DT_MULTILAYER_INDEX_VCOL_LOOP
#define DT_DATATYPE_IS_LOOP(_dt)
#define DT_DATATYPE_IS_EDGE(_dt)
#define DT_DATATYPE_IS_FACE(_dt)
@ CDT_MIX_REPLACE_BELOW_THRESHOLD
@ CDT_MIX_REPLACE_ABOVE_THRESHOLD
#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 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, AttrType 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 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)
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)
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 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)
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 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, bool use_create, bool use_delete, Object *ob_src, Object *ob_dst, const Mesh &mesh_src, Mesh &mesh_dst, bool use_dupref_dst, int fromlayers, int tolayers)
VecBase< short, 2 > short2
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