[Bf-blender-cvs] [f00cb93dbec] master: Fix T63125: Gpencil: bones cannot be selected in weightpaint mode

Philipp Oeser noreply at git.blender.org
Thu Sep 3 15:09:08 CEST 2020


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. @@



More information about the Bf-blender-cvs mailing list