[Bf-blender-cvs] [9e9fbb39d7f] master: Fix T66949: Can't select bones from multiple objects in wpaint mode

Campbell Barton noreply at git.blender.org
Wed Jul 17 10:40:24 CEST 2019


Commit: 9e9fbb39d7f9e0a63c71fbc96237ace62fae0db6
Author: Campbell Barton
Date:   Wed Jul 17 18:28:32 2019 +1000
Branches: master
https://developer.blender.org/rB9e9fbb39d7f9e0a63c71fbc96237ace62fae0db6

Fix T66949: Can't select bones from multiple objects in wpaint mode

===================================================================

M	source/blender/blenkernel/BKE_modifier.h
M	source/blender/blenkernel/intern/modifier.c
M	source/blender/editors/space_view3d/view3d_select.c

===================================================================

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) {



More information about the Bf-blender-cvs mailing list