Changeset View
Changeset View
Standalone View
Standalone View
source/blender/blenkernel/intern/data_transfer.c
| Show First 20 Lines • Show All 45 Lines • ▼ Show 20 Lines | |||||
| #include "BKE_object.h" | #include "BKE_object.h" | ||||
| #include "BKE_object_deform.h" | #include "BKE_object_deform.h" | ||||
| #include "BKE_report.h" | #include "BKE_report.h" | ||||
| #include "data_transfer_intern.h" | #include "data_transfer_intern.h" | ||||
| static CLG_LogRef LOG = {"bke.data_transfer"}; | 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_Masks *data_masks) | ||||
| { | { | ||||
| CustomDataMask cddata_mask = 0; | for (int i = 0; i < DT_TYPE_MAX; i++) { | ||||
| int i; | |||||
| for (i = 0; i < DT_TYPE_MAX; i++) { | |||||
| const int dtdata_type = 1 << i; | const int dtdata_type = 1 << i; | ||||
| int cddata_type; | int cddata_type; | ||||
| if (!(dtdata_types & dtdata_type)) { | if (!(dtdata_types & dtdata_type)) { | ||||
| continue; | continue; | ||||
| } | } | ||||
| cddata_type = BKE_object_data_transfer_dttype_to_cdtype(dtdata_type); | cddata_type = BKE_object_data_transfer_dttype_to_cdtype(dtdata_type); | ||||
| if (!(cddata_type & CD_FAKE)) { | if (!(cddata_type & CD_FAKE)) { | ||||
| cddata_mask |= 1LL << cddata_type; | if (DT_DATATYPE_IS_VERT(dtdata_type)) { | ||||
| data_masks->vmask |= 1LL << cddata_type; | |||||
| } | |||||
| else if (DT_DATATYPE_IS_EDGE(dtdata_type)) { | |||||
| data_masks->emask |= 1LL << cddata_type; | |||||
| } | |||||
| else if (DT_DATATYPE_IS_LOOP(dtdata_type)) { | |||||
| data_masks->lmask |= 1LL << cddata_type; | |||||
| } | |||||
| else if (DT_DATATYPE_IS_POLY(dtdata_type)) { | |||||
| data_masks->pmask |= 1LL << cddata_type; | |||||
| } | |||||
| } | } | ||||
| else if (cddata_type == CD_FAKE_MDEFORMVERT) { | else if (cddata_type == CD_FAKE_MDEFORMVERT) { | ||||
| cddata_mask |= CD_MASK_MDEFORMVERT; /* Exception for vgroups :/ */ | data_masks->vmask |= CD_MASK_MDEFORMVERT; /* Exception for vgroups :/ */ | ||||
| } | } | ||||
| else if (cddata_type == CD_FAKE_UV) { | else if (cddata_type == CD_FAKE_UV) { | ||||
| cddata_mask |= CD_MASK_MLOOPUV; | data_masks->lmask |= CD_MASK_MLOOPUV; | ||||
| } | } | ||||
| else if (cddata_type == CD_FAKE_LNOR) { | else if (cddata_type == CD_FAKE_LNOR) { | ||||
| cddata_mask |= CD_MASK_NORMAL | CD_MASK_CUSTOMLOOPNORMAL; | data_masks->vmask |= CD_MASK_NORMAL; | ||||
| 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... */ | /* Check what can do each layer type (if it is actually handled by transferdata, if it supports advanced mixing... */ | ||||
| bool BKE_object_data_transfer_get_dttypes_capacity( | bool BKE_object_data_transfer_get_dttypes_capacity( | ||||
| const int dtdata_types, bool *r_advanced_mixing, bool *r_threshold) | const int dtdata_types, bool *r_advanced_mixing, bool *r_threshold) | ||||
| { | { | ||||
| int i; | int i; | ||||
| bool ret = false; | bool ret = false; | ||||
| ▲ Show 20 Lines • Show All 896 Lines • ▼ Show 20 Lines | void BKE_object_data_transfer_layout( | ||||
| const int fromlayers_select[DT_MULTILAYER_INDEX_MAX], const int tolayers_select[DT_MULTILAYER_INDEX_MAX]) | const int fromlayers_select[DT_MULTILAYER_INDEX_MAX], const int tolayers_select[DT_MULTILAYER_INDEX_MAX]) | ||||
| { | { | ||||
| Mesh *me_src; | Mesh *me_src; | ||||
| Mesh *me_dst; | Mesh *me_dst; | ||||
| int i; | int i; | ||||
| const bool use_create = true; /* We always create needed layers here. */ | const bool use_create = true; /* We always create needed layers here. */ | ||||
| CustomDataMask me_src_mask = CD_MASK_BAREMESH; | CustomData_Masks me_src_mask = CD_MASK_BAREMESH; | ||||
| BLI_assert((ob_src != ob_dst) && (ob_src->type == OB_MESH) && (ob_dst->type == OB_MESH)); | BLI_assert((ob_src != ob_dst) && (ob_src->type == OB_MESH) && (ob_dst->type == OB_MESH)); | ||||
| me_dst = ob_dst->data; | me_dst = ob_dst->data; | ||||
| /* Get source evaluated mesh.*/ | /* 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); | ||||
| 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) { | if (!me_src) { | ||||
| return; | return; | ||||
| } | } | ||||
| /* Check all possible data types. */ | /* Check all possible data types. */ | ||||
| for (i = 0; i < DT_TYPE_MAX; i++) { | for (i = 0; i < DT_TYPE_MAX; i++) { | ||||
| const int dtdata_type = 1 << i; | const int dtdata_type = 1 << i; | ||||
| ▲ Show 20 Lines • Show All 74 Lines • ▼ Show 20 Lines | #define DATAMAX 4 | ||||
| MeshPairRemap geom_map[DATAMAX] = {{0}}; | MeshPairRemap geom_map[DATAMAX] = {{0}}; | ||||
| bool geom_map_init[DATAMAX] = {0}; | bool geom_map_init[DATAMAX] = {0}; | ||||
| ListBase lay_map = {NULL}; | ListBase lay_map = {NULL}; | ||||
| bool changed = false; | bool changed = false; | ||||
| bool is_modifier = false; | bool is_modifier = false; | ||||
| const bool use_delete = false; /* We never delete data layers from destination here. */ | const bool use_delete = false; /* We never delete data layers from destination here. */ | ||||
| CustomDataMask me_src_mask = CD_MASK_BAREMESH; | CustomData_Masks me_src_mask = CD_MASK_BAREMESH; | ||||
| BLI_assert((ob_src != ob_dst) && (ob_src->type == OB_MESH) && (ob_dst->type == OB_MESH)); | BLI_assert((ob_src != ob_dst) && (ob_src->type == OB_MESH) && (ob_dst->type == OB_MESH)); | ||||
| if (me_dst) { | if (me_dst) { | ||||
| dirty_nors_dst = (me_dst->runtime.cd_dirty_vert & CD_NORMAL) != 0; | dirty_nors_dst = (me_dst->runtime.cd_dirty_vert & CD_NORMAL) != 0; | ||||
| /* Never create needed custom layers on passed destination mesh | /* Never create needed custom layers on passed destination mesh | ||||
| * (assumed to *not* be ob_dst->data, aka modifier case). */ | * (assumed to *not* be ob_dst->data, aka modifier case). */ | ||||
| use_create = false; | use_create = false; | ||||
| is_modifier = true; | is_modifier = true; | ||||
| } | } | ||||
| else { | else { | ||||
| me_dst = ob_dst->data; | me_dst = ob_dst->data; | ||||
| } | } | ||||
| if (vgroup_name) { | if (vgroup_name) { | ||||
| mdef = CustomData_get_layer(&me_dst->vdata, CD_MDEFORMVERT); | mdef = CustomData_get_layer(&me_dst->vdata, CD_MDEFORMVERT); | ||||
| if (mdef) { | if (mdef) { | ||||
| vg_idx = defgroup_name_index(ob_dst, vgroup_name); | vg_idx = defgroup_name_index(ob_dst, vgroup_name); | ||||
| } | } | ||||
| } | } | ||||
| /* Get source evaluated mesh.*/ | /* 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) { | if (is_modifier) { | ||||
| me_src = BKE_modifier_get_evaluated_mesh_from_evaluated_object(ob_src, false); | 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_Masks_are_matching(&ob_src->runtime.last_data_mask, &me_src_mask)) { | ||||
| CLOG_WARN(&LOG, "Data Transfer: source mesh data is not ready - dependency cycle?"); | CLOG_WARN(&LOG, "Data Transfer: source mesh data is not ready - dependency cycle?"); | ||||
| return changed; | return changed; | ||||
| } | } | ||||
| } | } | ||||
| else { | 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) { | if (!me_src) { | ||||
| ▲ Show 20 Lines • Show All 315 Lines • Show Last 20 Lines | |||||