From 9e9fbb39d7f9e0a63c71fbc96237ace62fae0db6 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 17 Jul 2019 18:28:32 +1000 Subject: Fix T66949: Can't select bones from multiple objects in wpaint mode --- source/blender/blenkernel/BKE_modifier.h | 1 + source/blender/blenkernel/intern/modifier.c | 17 +++++++++++++++++ source/blender/editors/space_view3d/view3d_select.c | 18 ++++++++++++++++++ 3 files changed, 36 insertions(+) (limited to 'source/blender') diff --git a/source/blender/blenkernel/BKE_modifier.h b/source/blender/blenkernel/BKE_modifier.h index 4aab2a346e7..8958f7c73aa 100644 --- a/source/blender/blenkernel/BKE_modifier.h +++ b/source/blender/blenkernel/BKE_modifier.h @@ -382,6 +382,7 @@ struct Object *modifiers_isDeformedByMeshDeform(struct Object *ob); struct Object *modifiers_isDeformedByLattice(struct Object *ob); struct Object *modifiers_isDeformedByCurve(struct Object *ob); bool modifiers_usesArmature(struct Object *ob, struct bArmature *arm); +bool modifiers_usesArmatureObject(struct Object *ob, struct Object *ob_armature); bool modifiers_usesSubsurfFacedots(struct Scene *scene, struct Object *ob); bool modifiers_isCorrectableDeformed(struct Scene *scene, struct Object *ob); void modifier_freeTemporaryData(struct ModifierData *md); diff --git a/source/blender/blenkernel/intern/modifier.c b/source/blender/blenkernel/intern/modifier.c index c23fe30d311..144fedb4c8a 100644 --- a/source/blender/blenkernel/intern/modifier.c +++ b/source/blender/blenkernel/intern/modifier.c @@ -778,6 +778,23 @@ bool modifiers_usesArmature(Object *ob, bArmature *arm) return false; } +bool modifiers_usesArmatureObject(Object *ob, Object *ob_armature) +{ + VirtualModifierData virtualModifierData; + ModifierData *md = modifiers_getVirtualModifierList(ob, &virtualModifierData); + + for (; md; md = md->next) { + if (md->type == eModifierType_Armature) { + ArmatureModifierData *amd = (ArmatureModifierData *)md; + if (amd->object && amd->object == ob_armature) { + return true; + } + } + } + + return false; +} + bool modifiers_usesSubsurfFacedots(struct Scene *scene, Object *ob) { /* Search (backward) in the modifier stack to find if we have a subsurf modifier (enabled) before diff --git a/source/blender/editors/space_view3d/view3d_select.c b/source/blender/editors/space_view3d/view3d_select.c index e39bd3f945f..1d8d0f61150 100644 --- a/source/blender/editors/space_view3d/view3d_select.c +++ b/source/blender/editors/space_view3d/view3d_select.c @@ -72,6 +72,7 @@ #include "BKE_scene.h" #include "BKE_tracking.h" #include "BKE_workspace.h" +#include "BKE_modifier.h" #include "DEG_depsgraph.h" @@ -2149,6 +2150,12 @@ static bool ed_object_select_pick(bContext *C, /* In pose mode we don't want to mess with object selection. */ const bool is_pose_mode = (vc.obact && vc.obact->mode & OB_MODE_POSE); + /* Support changing pose objects when the a mesh uses multiple armatures. */ + Object *old_obpose = NULL; + if (vc.obact && vc.obact->mode & OB_MODE_WEIGHT_PAINT) { + old_obpose = BKE_object_pose_armature_get(vc.obact); + } + /* always start list from basact in wire mode */ startbase = FIRSTBASE(view_layer); if (oldbasact && oldbasact->next) { @@ -2375,6 +2382,17 @@ static bool ed_object_select_pick(bContext *C, object_deselect_all_except(view_layer, basact); ED_object_base_select(basact, BA_SELECT); } + else if (old_obpose && modifiers_usesArmatureObject(oldbasact->object, basact->object)) { + /* The user is in weight-paint mode with an armature selected, + * in this case the user is selecting a new armature which is + * also used by the mesh. In this case use selection to switch + * the pose object, keeping the weight paint object active. */ + Base *old_basepose = BKE_view_layer_base_find(view_layer, old_obpose); + if (old_basepose != NULL) { + ED_object_base_select(old_basepose, BA_DESELECT); + } + ED_object_base_select(basact, BA_SELECT); + } /* also prevent making it active on mouse selection */ else if (BASE_SELECTABLE(v3d, basact)) { if (extend) { -- cgit v1.2.3