Changeset View
Changeset View
Standalone View
Standalone View
source/blender/editors/object/object_data_transfer.c
| Show First 20 Lines • Show All 105 Lines • ▼ Show 20 Lines | static const EnumPropertyItem *dt_layers_select_src_itemf(bContext *C, | ||||
| if (!C) { /* needed for docs and i18n tools */ | if (!C) { /* needed for docs and i18n tools */ | ||||
| return rna_enum_dt_layers_select_src_items; | return rna_enum_dt_layers_select_src_items; | ||||
| } | } | ||||
| EnumPropertyItem *item = NULL, tmp_item = {0}; | EnumPropertyItem *item = NULL, tmp_item = {0}; | ||||
| int totitem = 0; | int totitem = 0; | ||||
| const int data_type = RNA_enum_get(ptr, "data_type"); | const int data_type = RNA_enum_get(ptr, "data_type"); | ||||
| Depsgraph *depsgraph = CTX_data_depsgraph(C); | |||||
| PropertyRNA *prop = RNA_struct_find_property(ptr, "use_reverse_transfer"); | PropertyRNA *prop = RNA_struct_find_property(ptr, "use_reverse_transfer"); | ||||
| const bool reverse_transfer = prop != NULL && RNA_property_boolean_get(ptr, prop); | const bool reverse_transfer = prop != NULL && RNA_property_boolean_get(ptr, prop); | ||||
| const int layers_select_dst = reverse_transfer ? RNA_enum_get(ptr, "layers_select_src") : | const int layers_select_dst = reverse_transfer ? RNA_enum_get(ptr, "layers_select_src") : | ||||
| RNA_enum_get(ptr, "layers_select_dst"); | RNA_enum_get(ptr, "layers_select_dst"); | ||||
| if (!reverse_transfer || layers_select_dst == DT_LAYERS_ACTIVE_DST || layers_select_dst >= 0) { | if (!reverse_transfer || layers_select_dst == DT_LAYERS_ACTIVE_DST || layers_select_dst >= 0) { | ||||
| RNA_enum_items_add_value( | RNA_enum_items_add_value( | ||||
| &item, &totitem, rna_enum_dt_layers_select_src_items, DT_LAYERS_ACTIVE_SRC); | &item, &totitem, rna_enum_dt_layers_select_src_items, DT_LAYERS_ACTIVE_SRC); | ||||
| Show All 29 Lines | static const EnumPropertyItem *dt_layers_select_src_itemf(bContext *C, | ||||
| } | } | ||||
| else if (data_type == DT_TYPE_UV) { | else if (data_type == DT_TYPE_UV) { | ||||
| Object *ob_src = CTX_data_active_object(C); | Object *ob_src = CTX_data_active_object(C); | ||||
| if (ob_src) { | if (ob_src) { | ||||
| Mesh *me_eval; | Mesh *me_eval; | ||||
| int num_data, i; | int num_data, i; | ||||
| Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C); | |||||
brecht: I don't think we should ever have depsgraph evaluation in an `_itemf` function, though I guess… | |||||
Done Inline ActionsAs long as this specific function relies on mesh_get_eval_final there is no other way. sergey: As long as this specific function relies on `mesh_get_eval_final` there is no other way. | |||||
| Scene *scene_eval = DEG_get_evaluated_scene(depsgraph); | Scene *scene_eval = DEG_get_evaluated_scene(depsgraph); | ||||
| Object *ob_src_eval = DEG_get_evaluated_object(depsgraph, ob_src); | Object *ob_src_eval = DEG_get_evaluated_object(depsgraph, ob_src); | ||||
| CustomData_MeshMasks cddata_masks = CD_MASK_BAREMESH; | CustomData_MeshMasks cddata_masks = CD_MASK_BAREMESH; | ||||
| cddata_masks.lmask |= CD_MASK_MLOOPUV; | cddata_masks.lmask |= CD_MASK_MLOOPUV; | ||||
| me_eval = mesh_get_eval_final(depsgraph, scene_eval, ob_src_eval, &cddata_masks); | me_eval = mesh_get_eval_final(depsgraph, scene_eval, ob_src_eval, &cddata_masks); | ||||
| num_data = CustomData_number_of_layers(&me_eval->ldata, CD_MLOOPUV); | num_data = CustomData_number_of_layers(&me_eval->ldata, CD_MLOOPUV); | ||||
| Show All 9 Lines | static const EnumPropertyItem *dt_layers_select_src_itemf(bContext *C, | ||||
| } | } | ||||
| else if (data_type == DT_TYPE_VCOL) { | else if (data_type == DT_TYPE_VCOL) { | ||||
| Object *ob_src = CTX_data_active_object(C); | Object *ob_src = CTX_data_active_object(C); | ||||
| if (ob_src) { | if (ob_src) { | ||||
| Mesh *me_eval; | Mesh *me_eval; | ||||
| int num_data, i; | int num_data, i; | ||||
| Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C); | |||||
| Scene *scene_eval = DEG_get_evaluated_scene(depsgraph); | Scene *scene_eval = DEG_get_evaluated_scene(depsgraph); | ||||
| Object *ob_src_eval = DEG_get_evaluated_object(depsgraph, ob_src); | Object *ob_src_eval = DEG_get_evaluated_object(depsgraph, ob_src); | ||||
| CustomData_MeshMasks cddata_masks = CD_MASK_BAREMESH; | CustomData_MeshMasks cddata_masks = CD_MASK_BAREMESH; | ||||
| cddata_masks.lmask |= CD_MASK_MLOOPCOL; | cddata_masks.lmask |= CD_MASK_MLOOPCOL; | ||||
| me_eval = mesh_get_eval_final(depsgraph, scene_eval, ob_src_eval, &cddata_masks); | me_eval = mesh_get_eval_final(depsgraph, scene_eval, ob_src_eval, &cddata_masks); | ||||
| num_data = CustomData_number_of_layers(&me_eval->ldata, CD_MLOOPCOL); | num_data = CustomData_number_of_layers(&me_eval->ldata, CD_MLOOPCOL); | ||||
| ▲ Show 20 Lines • Show All 198 Lines • ▼ Show 20 Lines | BKE_reportf( | ||||
| me->id.name + 2); | me->id.name + 2); | ||||
| } | } | ||||
| return false; | return false; | ||||
| } | } | ||||
| static int data_transfer_exec(bContext *C, wmOperator *op) | static int data_transfer_exec(bContext *C, wmOperator *op) | ||||
| { | { | ||||
| Object *ob_src = ED_object_active_context(C); | Object *ob_src = ED_object_active_context(C); | ||||
| Depsgraph *depsgraph = CTX_data_depsgraph(C); | Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C); | ||||
| Scene *scene_eval = DEG_get_evaluated_scene(depsgraph); | Scene *scene_eval = DEG_get_evaluated_scene(depsgraph); | ||||
| ListBase ctx_objects; | ListBase ctx_objects; | ||||
| CollectionPointerLink *ctx_ob_dst; | CollectionPointerLink *ctx_ob_dst; | ||||
| bool changed = false; | bool changed = false; | ||||
| const bool is_frozen = RNA_boolean_get(op->ptr, "use_freeze"); | const bool is_frozen = RNA_boolean_get(op->ptr, "use_freeze"); | ||||
| ▲ Show 20 Lines • Show All 199 Lines • ▼ Show 20 Lines | void OBJECT_OT_data_transfer(wmOperatorType *ot) | ||||
| /* API callbacks.*/ | /* API callbacks.*/ | ||||
| ot->poll = data_transfer_poll; | ot->poll = data_transfer_poll; | ||||
| ot->poll_property = data_transfer_poll_property; | ot->poll_property = data_transfer_poll_property; | ||||
| ot->invoke = WM_menu_invoke; | ot->invoke = WM_menu_invoke; | ||||
| ot->exec = data_transfer_exec; | ot->exec = data_transfer_exec; | ||||
| ot->check = data_transfer_check; | ot->check = data_transfer_check; | ||||
| /* Flags.*/ | /* Flags.*/ | ||||
| ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_USE_EVAL_DATA; | ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; | ||||
| /* Properties.*/ | /* Properties.*/ | ||||
| prop = RNA_def_boolean(ot->srna, | prop = RNA_def_boolean(ot->srna, | ||||
| "use_reverse_transfer", | "use_reverse_transfer", | ||||
| false, | false, | ||||
| "Reverse Transfer", | "Reverse Transfer", | ||||
| "Transfer from selected objects to active one"); | "Transfer from selected objects to active one"); | ||||
| RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE); | RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE); | ||||
| ▲ Show 20 Lines • Show All 137 Lines • ▼ Show 20 Lines | |||||
| { | { | ||||
| return (edit_modifier_poll_generic(C, &RNA_DataTransferModifier, (1 << OB_MESH), true) || | return (edit_modifier_poll_generic(C, &RNA_DataTransferModifier, (1 << OB_MESH), true) || | ||||
| data_transfer_poll(C)); | data_transfer_poll(C)); | ||||
| } | } | ||||
| static int datalayout_transfer_exec(bContext *C, wmOperator *op) | static int datalayout_transfer_exec(bContext *C, wmOperator *op) | ||||
| { | { | ||||
| Object *ob_act = ED_object_active_context(C); | Object *ob_act = ED_object_active_context(C); | ||||
| Depsgraph *depsgraph = CTX_data_depsgraph(C); | Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C); | ||||
| Scene *scene_eval = DEG_get_evaluated_scene(depsgraph); | Scene *scene_eval = DEG_get_evaluated_scene(depsgraph); | ||||
| DataTransferModifierData *dtmd; | DataTransferModifierData *dtmd; | ||||
| dtmd = (DataTransferModifierData *)edit_modifier_property_get( | dtmd = (DataTransferModifierData *)edit_modifier_property_get( | ||||
| op, ob_act, eModifierType_DataTransfer); | op, ob_act, eModifierType_DataTransfer); | ||||
| /* If we have a modifier, we transfer data layout from this modifier's source object to | /* If we have a modifier, we transfer data layout from this modifier's source object to | ||||
| * active one. Else, we transfer data layout from active object to all selected ones. */ | * active one. Else, we transfer data layout from active object to all selected ones. */ | ||||
| ▲ Show 20 Lines • Show All 89 Lines • ▼ Show 20 Lines | void OBJECT_OT_datalayout_transfer(wmOperatorType *ot) | ||||
| ot->poll = datalayout_transfer_poll; | ot->poll = datalayout_transfer_poll; | ||||
| ot->poll_property = data_transfer_poll_property; | ot->poll_property = data_transfer_poll_property; | ||||
| ot->invoke = datalayout_transfer_invoke; | ot->invoke = datalayout_transfer_invoke; | ||||
| ot->exec = datalayout_transfer_exec; | ot->exec = datalayout_transfer_exec; | ||||
| ot->check = data_transfer_check; | ot->check = data_transfer_check; | ||||
| /* flags */ | /* flags */ | ||||
| ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_USE_EVAL_DATA; | ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; | ||||
| /* Properties.*/ | /* Properties.*/ | ||||
| edit_modifier_properties(ot); | edit_modifier_properties(ot); | ||||
| /* Data type to transfer. */ | /* Data type to transfer. */ | ||||
| ot->prop = RNA_def_enum( | ot->prop = RNA_def_enum( | ||||
| ot->srna, "data_type", DT_layer_items, 0, "Data Type", "Which data to transfer"); | ot->srna, "data_type", DT_layer_items, 0, "Data Type", "Which data to transfer"); | ||||
| RNA_def_boolean(ot->srna, | RNA_def_boolean(ot->srna, | ||||
| Show All 23 Lines | |||||
I don't think we should ever have depsgraph evaluation in an _itemf function, though I guess it won't be a problem in this case.