Commit: f00cb93dbec7bf5dc05302c868f20fcd5aed7db7 Author: Philipp Oeser Date: Thu Sep 3 14:59:34 2020 +0200 Branches: master https://developer.blender.org/rBf00cb93dbec7bf5dc05302c868f20fcd5aed7db7
Fix T63125: Gpencil: bones cannot be selected in weightpaint mode Some underlying functionality was not ready for greasepencil: - BKE_modifiers_get_virtual_modifierlist (now introduce dedicated BKE_gpencil_modifiers_get_virtual_modifierlist) - BKE_modifiers_is_deformed_by_armature - checks in drawing code - checks in (pose) selection code A couple of changes to make this work: - `eGpencilModifierType_Armature` has to be respected (not only `eModifierType_Armature`) - `OB_MODE_WEIGHT_GPENCIL` has to be respected (not only `OB_MODE_WEIGHT_PAINT`) -- (now use new `OB_MODE_ALL_WEIGHT_PAINT`) - `gpencil_weightmode_toggle_exec` now shares functionality from `wpaint_mode_toggle_exec` -- moved to new `ED_object_posemode_set_for_weight_paint` This patch will also set the context member "weight_paint_object" for greasepencil (otherwise some appropriate pose operators wont work when in weightpaint mode) Reviewed By: campbellbarton Maniphest Tasks: T63125 Differential Revision: https://developer.blender.org/D8483 =================================================================== M source/blender/blenkernel/BKE_gpencil_modifier.h M source/blender/blenkernel/intern/gpencil_modifier.c M source/blender/blenkernel/intern/modifier.c M source/blender/draw/engines/overlay/overlay_armature.c M source/blender/draw/intern/draw_manager.c M source/blender/editors/armature/pose_select.c M source/blender/editors/gpencil/gpencil_edit.c M source/blender/editors/include/ED_object.h M source/blender/editors/object/object_modes.c M source/blender/editors/screen/screen_context.c M source/blender/editors/screen/screen_ops.c M source/blender/editors/sculpt_paint/paint_vertex.c M source/blender/editors/space_view3d/view3d_select.c M source/blender/editors/space_view3d/view3d_view.c M source/blender/makesdna/DNA_gpencil_modifier_types.h M source/blender/makesdna/DNA_object_enums.h =================================================================== diff --git a/source/blender/blenkernel/BKE_gpencil_modifier.h b/source/blender/blenkernel/BKE_gpencil_modifier.h index 8eafbe04a14..3ade555b410 100644 --- a/source/blender/blenkernel/BKE_gpencil_modifier.h +++ b/source/blender/blenkernel/BKE_gpencil_modifier.h @@ -292,6 +292,14 @@ void BKE_gpencil_modifiers_foreach_tex_link(struct Object *ob, GreasePencilTexWalkFunc walk, void *userData); +typedef struct GpencilVirtualModifierData { + ArmatureGpencilModifierData amd; + LatticeGpencilModifierData lmd; +} GpencilVirtualModifierData; + +struct GpencilModifierData *BKE_gpencil_modifiers_get_virtual_modifierlist( + const struct Object *ob, struct GpencilVirtualModifierData *data); + bool BKE_gpencil_has_geometry_modifiers(struct Object *ob); bool BKE_gpencil_has_time_modifiers(struct Object *ob); bool BKE_gpencil_has_transform_modifiers(struct Object *ob); diff --git a/source/blender/blenkernel/intern/gpencil_modifier.c b/source/blender/blenkernel/intern/gpencil_modifier.c index c2e330e8f04..bc74693bbb8 100644 --- a/source/blender/blenkernel/intern/gpencil_modifier.c +++ b/source/blender/blenkernel/intern/gpencil_modifier.c @@ -33,6 +33,7 @@ #include "BLT_translation.h" +#include "DNA_armature_types.h" #include "DNA_gpencil_modifier_types.h" #include "DNA_gpencil_types.h" #include "DNA_meshdata_types.h" @@ -57,6 +58,10 @@ static CLG_LogRef LOG = {"bke.gpencil_modifier"}; static GpencilModifierTypeInfo *modifier_gpencil_types[NUM_GREASEPENCIL_MODIFIER_TYPES] = {NULL}; +#if 0 +/* Note that GPencil actually does not support these atm, but might do in the future. */ +static GpencilVirtualModifierData virtualModifierCommonData; +#endif /* Lattice Modifier ---------------------------------- */ /* Usually, evaluation of the lattice modifier is self-contained. @@ -110,6 +115,34 @@ void BKE_gpencil_lattice_clear(Object *ob) /* *************************************************** */ /* Modifier Methods - Evaluation Loops, etc. */ +/* This is to include things that are not modifiers in the evaluation of the modifier stack, for + * example parenting to an armature or lattice without having a real modifier. */ +GpencilModifierData *BKE_gpencil_modifiers_get_virtual_modifierlist( + const Object *ob, GpencilVirtualModifierData *UNUSED(virtualModifierData)) +{ + GpencilModifierData *md = ob->greasepencil_modifiers.first; + +#if 0 + /* Note that GPencil actually does not support these atm, but might do in the future. */ + *virtualModifierData = virtualModifierCommonData; + if (ob->parent) { + if (ob->parent->type == OB_ARMATURE && ob->partype == PARSKEL) { + virtualModifierData->amd.object = ob->parent; + virtualModifierData->amd.modifier.next = md; + virtualModifierData->amd.deformflag = ((bArmature *)(ob->parent->data))->deformflag; + md = &virtualModifierData->amd.modifier; + } + else if (ob->parent->type == OB_LATTICE && ob->partype == PARSKEL) { + virtualModifierData->lmd.object = ob->parent; + virtualModifierData->lmd.modifier.next = md; + md = &virtualModifierData->lmd.modifier; + } + } +#endif + + return md; +} + /** * Check if object has grease pencil Geometry modifiers. * \param ob: Grease pencil object @@ -229,6 +262,22 @@ void BKE_gpencil_modifier_init(void) { /* Initialize modifier types */ gpencil_modifier_type_init(modifier_gpencil_types); /* MOD_gpencil_util.c */ + +#if 0 + /* Note that GPencil actually does not support these atm, but might do in the future. */ + /* Initialize global cmmon storage used for virtual modifier list */ + GpencilModifierData *md; + md = BKE_gpencil_modifier_new(eGpencilModifierType_Armature); + virtualModifierCommonData.amd = *((ArmatureGpencilModifierData *)md); + BKE_gpencil_modifier_free(md); + + md = BKE_gpencil_modifier_new(eGpencilModifierType_Lattice); + virtualModifierCommonData.lmd = *((LatticeGpencilModifierData *)md); + BKE_gpencil_modifier_free(md); + + virtualModifierCommonData.amd.modifier.mode |= eGpencilModifierMode_Virtual; + virtualModifierCommonData.lmd.modifier.mode |= eGpencilModifierMode_Virtual; +#endif } /** diff --git a/source/blender/blenkernel/intern/modifier.c b/source/blender/blenkernel/intern/modifier.c index afd02d7001e..6185644f5a0 100644 --- a/source/blender/blenkernel/intern/modifier.c +++ b/source/blender/blenkernel/intern/modifier.c @@ -34,6 +34,7 @@ #include "MEM_guardedalloc.h" #include "DNA_armature_types.h" +#include "DNA_gpencil_modifier_types.h" #include "DNA_mesh_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" @@ -53,6 +54,7 @@ #include "BKE_editmesh.h" #include "BKE_editmesh_cache.h" #include "BKE_global.h" +#include "BKE_gpencil_modifier.h" #include "BKE_idtype.h" #include "BKE_key.h" #include "BKE_lib_id.h" @@ -653,9 +655,7 @@ ModifierData *BKE_modifier_get_last_preview(struct Scene *scene, ModifierData *BKE_modifiers_get_virtual_modifierlist(const Object *ob, VirtualModifierData *virtualModifierData) { - ModifierData *md; - - md = ob->modifiers.first; + ModifierData *md = ob->modifiers.first; *virtualModifierData = virtualModifierCommonData; @@ -700,22 +700,46 @@ ModifierData *BKE_modifiers_get_virtual_modifierlist(const Object *ob, */ Object *BKE_modifiers_is_deformed_by_armature(Object *ob) { - VirtualModifierData virtualModifierData; - ModifierData *md = BKE_modifiers_get_virtual_modifierlist(ob, &virtualModifierData); - ArmatureModifierData *amd = NULL; - - /* return the first selected armature, this lets us use multiple armatures */ - for (; md; md = md->next) { - if (md->type == eModifierType_Armature) { - amd = (ArmatureModifierData *)md; - if (amd->object && (amd->object->base_flag & BASE_SELECTED)) { - return amd->object; + if (ob->type == OB_GPENCIL) { + GpencilVirtualModifierData gpencilvirtualModifierData; + ArmatureGpencilModifierData *agmd = NULL; + GpencilModifierData *gmd = BKE_gpencil_modifiers_get_virtual_modifierlist( + ob, &gpencilvirtualModifierData); + gmd = ob->greasepencil_modifiers.first; + + /* return the first selected armature, this lets us use multiple armatures */ + for (; gmd; gmd = gmd->next) { + if (gmd->type == eGpencilModifierType_Armature) { + agmd = (ArmatureGpencilModifierData *)gmd; + if (agmd->object && (agmd->object->base_flag & BASE_SELECTED)) { + return agmd->object; + } } } + /* If we're still here then return the last armature. */ + if (agmd) { + return agmd->object; + } } - - if (amd) { /* if we're still here then return the last armature */ - return amd->object; + else { + VirtualModifierData virtualModifierData; + ArmatureModifierData *amd = NULL; + ModifierData *md = BKE_modifiers_get_virtual_modifierlist(ob, &virtualModifierData); + md = ob->modifiers.first; + + /* return the first selected armature, this lets us use multiple armatures */ + for (; md; md = md->next) { + if (md->type == eModifierType_Armature) { + amd = (ArmatureModifierData *)md; + if (amd->object && (amd->object->base_flag & BASE_SELECTED)) { + return amd->object; + } + } + } + /* If we're still here then return the last armature. */ + if (amd) { + return amd->object; + } } return NULL; diff --git a/source/blender/draw/engines/overlay/overlay_armature.c b/source/blender/draw/engines/overlay/overlay_armature.c index 49b8257e0c6..defde8d0827 100644 --- a/source/blender/draw/engines/overlay/overlay_armature.c +++ b/source/blender/draw/engines/overlay/overlay_armature.c @@ -113,7 +113,7 @@ bool OVERLAY_armature_is_pose_mode(Object *ob, const DRWContextState *draw_ctx) } /* Armature parent is also handled by pose mode engine. */ - if ((active_ob != NULL) && ((draw_ctx->object_mode & OB_MODE_WEIGHT_PAINT) != 0)) { + if ((active_ob != NULL) && (draw_ctx->object_mode & OB_MODE_ALL_WEIGHT_PAINT)) { if (ob == draw_ctx->object_pose) { return true; } @@ -2000,7 +2000,7 @@ static void draw_armature_pose(ArmatureDrawContext *ctx) (scene->toolsettings->object_flag & SCE_OBJECT_MODE_LOCK) == 0) || /* Allow selection when in weight-paint mode * (selection code ensures this wont become active). */ - ((draw_ctx->object_mode == OB_MODE_WEIGHT_PAINT) && + ((draw_ctx->object_mode & OB_MODE_ALL_WEIGHT_PAINT) && (draw_ctx->object_pose != NULL))))) && DRW_state_is_select(); @@ -2011,7 +2011,7 @@ static void draw_armature_pose(ArmatureDrawContext *ctx) } /* In weight paint mode retrieve the vertex group lock status. */ - if ((draw_ctx->object_mode == OB_MODE_WEIGHT_PAINT) && (draw_ctx->object_pose == ob) && + if ((draw_ctx->object_mode & OB_MODE_ALL_WEIGHT_PAINT) && (draw_ctx->object_pose == ob) && (draw_ctx->obact != NULL)) { draw_locked_weights = true; diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c index 336a3d61479..6e0ce87b1b8 100644 --- a/source/blender/draw/intern/draw_manager.c +++ b/source/blender/draw/intern/draw_manager.c @@ -451,7 +451,7 @@ static void drw_context_state_init(void) if (DST.draw_ctx.object_mode & OB_MODE_POSE) { DST.draw_ctx.object_pose = DST.draw_ctx.obact; } - else if (DST.draw_ctx.object_mode & OB_MODE_WEIGHT_PAINT) { + else if ((DST.draw_ctx.object_mode & OB_MODE_ALL_WEIGHT_PAINT)) { DST.draw_ctx.object_pose = BKE_object_pose_armature_get(DST.draw_ctx.obact); } else { diff --git a/source/blender/editors/armature/pose_select.c b/source/blender/editors/armature/pose_select.c index 0e766e6a75f..c63f2ff12c5 100644 --- a/source/blender/editors/armature/pose_select.c +++ b/source/blender/editors/armature/pose_select.c @@ -26,6 +26,7 @@ #include "DNA_anim_types.h" #include "DNA_armature_types.h" #include "DNA_constraint_types.h" +#include "DNA_gpencil_modifier_types.h" #include "DNA_object_types.h" #include "DNA_scene_t @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list [email protected] https://lists.blender.org/mailman/listinfo/bf-blender-cvs
