[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