diff options
Diffstat (limited to 'source/blender/blenkernel/intern/data_transfer.c')
-rw-r--r-- | source/blender/blenkernel/intern/data_transfer.c | 43 |
1 files changed, 25 insertions, 18 deletions
diff --git a/source/blender/blenkernel/intern/data_transfer.c b/source/blender/blenkernel/intern/data_transfer.c index 2f011d6a919..4c4d57ddbac 100644 --- a/source/blender/blenkernel/intern/data_transfer.c +++ b/source/blender/blenkernel/intern/data_transfer.c @@ -51,12 +51,9 @@ static CLG_LogRef LOG = {"bke.data_transfer"}; -CustomDataMask BKE_object_data_transfer_dttypes_to_cdmask(const int dtdata_types) +void BKE_object_data_transfer_dttypes_to_cdmask(const int dtdata_types, CustomData_MeshMasks *r_data_masks) { - CustomDataMask cddata_mask = 0; - int i; - - for (i = 0; i < DT_TYPE_MAX; i++) { + for (int i = 0; i < DT_TYPE_MAX; i++) { const int dtdata_type = 1 << i; int cddata_type; @@ -66,20 +63,30 @@ CustomDataMask BKE_object_data_transfer_dttypes_to_cdmask(const int dtdata_types cddata_type = BKE_object_data_transfer_dttype_to_cdtype(dtdata_type); if (!(cddata_type & CD_FAKE)) { - cddata_mask |= 1LL << cddata_type; + if (DT_DATATYPE_IS_VERT(dtdata_type)) { + r_data_masks->vmask |= 1LL << cddata_type; + } + else if (DT_DATATYPE_IS_EDGE(dtdata_type)) { + r_data_masks->emask |= 1LL << cddata_type; + } + else if (DT_DATATYPE_IS_LOOP(dtdata_type)) { + r_data_masks->lmask |= 1LL << cddata_type; + } + else if (DT_DATATYPE_IS_POLY(dtdata_type)) { + r_data_masks->pmask |= 1LL << cddata_type; + } } else if (cddata_type == CD_FAKE_MDEFORMVERT) { - cddata_mask |= CD_MASK_MDEFORMVERT; /* Exception for vgroups :/ */ + r_data_masks->vmask |= CD_MASK_MDEFORMVERT; /* Exception for vgroups :/ */ } else if (cddata_type == CD_FAKE_UV) { - cddata_mask |= CD_MASK_MLOOPUV; + r_data_masks->lmask |= CD_MASK_MLOOPUV; } else if (cddata_type == CD_FAKE_LNOR) { - cddata_mask |= CD_MASK_NORMAL | CD_MASK_CUSTOMLOOPNORMAL; + r_data_masks->vmask |= CD_MASK_NORMAL; + r_data_masks->lmask |= CD_MASK_NORMAL | CD_MASK_CUSTOMLOOPNORMAL; } } - - return cddata_mask; } /* Check what can do each layer type (if it is actually handled by transferdata, if it supports advanced mixing... */ @@ -992,15 +999,15 @@ void BKE_object_data_transfer_layout( const bool use_create = true; /* We always create needed layers here. */ - CustomDataMask me_src_mask = CD_MASK_BAREMESH; + CustomData_MeshMasks me_src_mask = CD_MASK_BAREMESH; BLI_assert((ob_src != ob_dst) && (ob_src->type == OB_MESH) && (ob_dst->type == OB_MESH)); me_dst = ob_dst->data; /* Get source evaluated mesh.*/ - me_src_mask |= BKE_object_data_transfer_dttypes_to_cdmask(data_types); - me_src = mesh_get_eval_final(depsgraph, scene, ob_src, me_src_mask); + BKE_object_data_transfer_dttypes_to_cdmask(data_types, &me_src_mask); + me_src = mesh_get_eval_final(depsgraph, scene, ob_src, &me_src_mask); if (!me_src) { return; } @@ -1090,7 +1097,7 @@ bool BKE_object_data_transfer_ex( const bool use_delete = false; /* We never delete data layers from destination here. */ - CustomDataMask me_src_mask = CD_MASK_BAREMESH; + CustomData_MeshMasks me_src_mask = CD_MASK_BAREMESH; BLI_assert((ob_src != ob_dst) && (ob_src->type == OB_MESH) && (ob_dst->type == OB_MESH)); @@ -1113,17 +1120,17 @@ bool BKE_object_data_transfer_ex( } /* Get source evaluated mesh.*/ - me_src_mask |= BKE_object_data_transfer_dttypes_to_cdmask(data_types); + BKE_object_data_transfer_dttypes_to_cdmask(data_types, &me_src_mask); if (is_modifier) { me_src = BKE_modifier_get_evaluated_mesh_from_evaluated_object(ob_src, false); - if (me_src == NULL || (me_src_mask & ~ob_src->runtime.last_data_mask) != 0) { + if (me_src == NULL || !CustomData_MeshMasks_are_matching(&ob_src->runtime.last_data_mask, &me_src_mask)) { CLOG_WARN(&LOG, "Data Transfer: source mesh data is not ready - dependency cycle?"); return changed; } } else { - me_src = mesh_get_eval_final(depsgraph, scene, ob_src, me_src_mask); + me_src = mesh_get_eval_final(depsgraph, scene, ob_src, &me_src_mask); } if (!me_src) { return changed; |