Changeset View
Changeset View
Standalone View
Standalone View
source/blender/editors/object/object_modifier.c
| Show First 20 Lines • Show All 1,608 Lines • ▼ Show 20 Lines | static int multires_higher_levels_delete_exec(bContext *C, wmOperator *op) | ||||
| Object *ob = ED_object_active_context(C); | Object *ob = ED_object_active_context(C); | ||||
| MultiresModifierData *mmd = (MultiresModifierData *)edit_modifier_property_get( | MultiresModifierData *mmd = (MultiresModifierData *)edit_modifier_property_get( | ||||
| op, ob, eModifierType_Multires); | op, ob, eModifierType_Multires); | ||||
| if (!mmd) { | if (!mmd) { | ||||
| return OPERATOR_CANCELLED; | return OPERATOR_CANCELLED; | ||||
| } | } | ||||
| multiresModifier_del_levels(mmd, scene, ob, 1); | multiresModifier_delete_levels_higher(mmd, scene, ob); | ||||
sergey: The fact that depsgraph is not needed is relying to a current implementation. If that ever… | |||||
| ED_object_iter_other( | ED_object_iter_other( | ||||
| CTX_data_main(C), ob, true, ED_object_multires_update_totlevels_cb, &mmd->totlvl); | CTX_data_main(C), ob, true, ED_object_multires_update_totlevels_cb, &mmd->totlvl); | ||||
| WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob); | WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob); | ||||
| return OPERATOR_FINISHED; | return OPERATOR_FINISHED; | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 459 Lines • ▼ Show 20 Lines | void OBJECT_OT_multires_rebuild_subdiv(wmOperatorType *ot) | ||||
| /* flags */ | /* flags */ | ||||
| ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL; | ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL; | ||||
| edit_modifier_properties(ot); | edit_modifier_properties(ot); | ||||
| } | } | ||||
| /** \} */ | /** \} */ | ||||
| /* ------------------------------------------------------------------- */ | /* ------------------------------------------------------------------- */ | ||||
| /** \name Multires Delete Lower Levels | |||||
| * \{ */ | |||||
| static int multires_lower_levels_delete_exec(bContext *C, wmOperator *op) | |||||
| { | |||||
| Depsgraph *depsgraph = CTX_data_depsgraph_pointer(C); | |||||
| Scene *scene = CTX_data_scene(C); | |||||
| Object *ob = ED_object_active_context(C); | |||||
| MultiresModifierData *mmd = (MultiresModifierData *)edit_modifier_property_get( | |||||
| op, ob, eModifierType_Multires); | |||||
| if (!mmd) { | |||||
| return OPERATOR_CANCELLED; | |||||
| } | |||||
| multiresModifier_delete_levels_lower(depsgraph, mmd, scene, ob); | |||||
Done Inline ActionsComment is odd. What's unsubdivide doing here? sergey: Comment is odd. What's unsubdivide doing here? | |||||
| DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY); | |||||
| WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob); | |||||
| return OPERATOR_FINISHED; | |||||
| } | |||||
| static int multires_lower_levels_delete_invoke(bContext *C, | |||||
| wmOperator *op, | |||||
Done Inline ActionsI can't understand this. I would imagine you will be deleting all levels below the current one. Why is it exactly you're deleting top_level - current_level levels? sergey: I can't understand this. I would imagine you will be deleting all levels below the current one. | |||||
| const wmEvent *UNUSED(event)) | |||||
| { | |||||
| if (edit_modifier_invoke_properties(C, op, NULL, NULL)) { | |||||
| return multires_lower_levels_delete_exec(C, op); | |||||
| } | |||||
| else { | |||||
| return OPERATOR_CANCELLED; | |||||
| } | |||||
| } | |||||
Done Inline ActionsComment starts with capital letter and ends with full stop. sergey: Comment starts with capital letter and ends with full stop. | |||||
| void OBJECT_OT_multires_lower_levels_delete(wmOperatorType *ot) | |||||
| { | |||||
| ot->name = "Delete Lower"; | |||||
| ot->description = "Deletes all lower subdivisions and creates a new base mesh"; | |||||
| ot->idname = "OBJECT_OT_multires_lower_levels_delete"; | |||||
| ot->poll = multires_poll; | |||||
| ot->invoke = multires_lower_levels_delete_invoke; | |||||
| ot->exec = multires_lower_levels_delete_exec; | |||||
| /* flags */ | |||||
| ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL; | |||||
| edit_modifier_properties(ot); | |||||
Done Inline Actionsresult is very bad name here. We also have BKE_multires_create_mesh which implements almost the same logic you need here with the difference that it uses deformed mesh as a base for multires. We should have BKE_multires_create_mesh_from_base and BKE_multires_create_mesh_from_deform in multires.c. sergey: `result` is very bad name here.
I guess you've copied it from modifier code, where it is indeed… | |||||
| } | |||||
| /** \} */ | |||||
| /* ------------------------------------------------------------------- */ | |||||
| /** \name Skin Modifier | /** \name Skin Modifier | ||||
| * \{ */ | * \{ */ | ||||
| static void modifier_skin_customdata_delete(Object *ob) | static void modifier_skin_customdata_delete(Object *ob) | ||||
| { | { | ||||
| Mesh *me = ob->data; | Mesh *me = ob->data; | ||||
| BMEditMesh *em = me->edit_mesh; | BMEditMesh *em = me->edit_mesh; | ||||
| ▲ Show 20 Lines • Show All 924 Lines • Show Last 20 Lines | |||||
The fact that depsgraph is not needed is relying to a current implementation. If that ever changes, you will have a hard time (a) remembering that depsgraph is not always passed (b) finding all codepaths where is it not passed.
Check the code paths which accesses depsgraph in the deletion operator. If they do not require depsgraph to be fully evaluated pass CTX_data_depsgraph(C) here.
If for the delete lower depsgraph must be evaluated: