[Bf-blender-cvs] [8a083ef3b78] master: Fix weight paint mode setting with multiple armatures

Campbell Barton noreply at git.blender.org
Thu Jul 18 07:48:18 CEST 2019


Commit: 8a083ef3b789d31d2f5a5f561ddfb39aac68bffa
Author: Campbell Barton
Date:   Thu Jul 18 15:03:02 2019 +1000
Branches: master
https://developer.blender.org/rB8a083ef3b789d31d2f5a5f561ddfb39aac68bffa

Fix weight paint mode setting with multiple armatures

Selecting multiple armature objects and entering weight paint mode
wasn't working.

Entering weight + pose modes at once was only done when
object mode locking was enabled. Now it's done even when
mode-locking is off - because it's still inconvenient to setup
and useful default behavior.

Resolves issues raised by T66949

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

M	source/blender/editors/sculpt_paint/paint_vertex.c

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

diff --git a/source/blender/editors/sculpt_paint/paint_vertex.c b/source/blender/editors/sculpt_paint/paint_vertex.c
index 0c08af2b020..980b043bf8b 100644
--- a/source/blender/editors/sculpt_paint/paint_vertex.c
+++ b/source/blender/editors/sculpt_paint/paint_vertex.c
@@ -56,6 +56,7 @@
 #include "BKE_paint.h"
 #include "BKE_report.h"
 #include "BKE_subsurf.h"
+#include "BKE_layer.h"
 
 #include "DEG_depsgraph.h"
 
@@ -1305,18 +1306,47 @@ static int wpaint_mode_toggle_exec(bContext *C, wmOperator *op)
     BKE_paint_toolslots_brush_validate(bmain, &ts->wpaint->paint);
   }
 
-  /* When locked, it's almost impossible to select the pose
-   * then the object to enter weight paint mode.
+  /* When locked, it's almost impossible to select the pose-object
+   * then the mesh-object to enter weight paint mode.
+   * Even when the object mode is not locked this is inconvenient - so allow in either case.
+   *
    * In this case move our pose object in/out of pose mode.
-   * This is in fits with the convention of selecting multiple objects and entering a mode. */
-  if (scene->toolsettings->object_flag & SCE_OBJECT_MODE_LOCK) {
-    Object *ob_arm = modifiers_isDeformedByArmature(ob);
-    if (ob_arm && (ob_arm->base_flag & BASE_SELECTED)) {
-      if (ob_arm->mode & OB_MODE_POSE) {
-        ED_object_posemode_exit_ex(bmain, ob_arm);
-      }
-      else {
-        ED_object_posemode_enter_ex(bmain, ob_arm);
+   * This is in fits with the convention of selecting multiple objects and entering a mode.
+   */
+  {
+    VirtualModifierData virtualModifierData;
+    ModifierData *md = modifiers_getVirtualModifierList(ob, &virtualModifierData);
+    if (md != NULL) {
+      /* Can be NULL. */
+      View3D *v3d = CTX_wm_view3d(C);
+      ViewLayer *view_layer = CTX_data_view_layer(C);
+      for (; md; md = md->next) {
+        if (md->type == eModifierType_Armature) {
+          ArmatureModifierData *amd = (ArmatureModifierData *)md;
+          Object *ob_arm = amd->object;
+          if (ob_arm != NULL) {
+            const Base *base_arm = BKE_view_layer_base_find(view_layer, ob_arm);
+            if (base_arm && BASE_VISIBLE(v3d, base_arm)) {
+              if (is_mode_set) {
+                if ((ob_arm->mode & OB_MODE_POSE) != 0) {
+                  ED_object_posemode_exit_ex(bmain, ob_arm);
+                }
+              }
+              else {
+                /* Only check selected status when entering weight-paint mode
+                 * because we may have multiple armature objects.
+                 * Selecting one will de-select the other, which would leave it in pose-mode
+                 * when exiting weight paint mode. While usable, this looks like inconsistent
+                 * behavior from a user perspective. */
+                if (base_arm->flag & BASE_SELECTED) {
+                  if ((ob_arm->mode & OB_MODE_POSE) == 0) {
+                    ED_object_posemode_enter_ex(bmain, ob_arm);
+                  }
+                }
+              }
+            }
+          }
+        }
       }
     }
   }



More information about the Bf-blender-cvs mailing list