Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/editors')
-rw-r--r--source/blender/editors/armature/pose_select.c50
-rw-r--r--source/blender/editors/gpencil/gpencil_edit.c9
-rw-r--r--source/blender/editors/include/ED_object.h5
-rw-r--r--source/blender/editors/object/object_modes.c72
-rw-r--r--source/blender/editors/screen/screen_context.c2
-rw-r--r--source/blender/editors/screen/screen_ops.c2
-rw-r--r--source/blender/editors/sculpt_paint/paint_vertex.c46
-rw-r--r--source/blender/editors/space_view3d/view3d_select.c4
-rw-r--r--source/blender/editors/space_view3d/view3d_view.c37
9 files changed, 156 insertions, 71 deletions
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_types.h"
@@ -37,6 +38,7 @@
#include "BKE_armature.h"
#include "BKE_constraint.h"
#include "BKE_context.h"
+#include "BKE_gpencil_modifier.h"
#include "BKE_layer.h"
#include "BKE_modifier.h"
#include "BKE_object.h"
@@ -172,7 +174,7 @@ bool ED_armature_pose_select_pick_with_buffer(ViewLayer *view_layer,
* note, special exception for armature mode so we can do multi-select
* we could check for multi-select explicitly but think its fine to
* always give predictable behavior in weight paint mode - campbell */
- if ((ob_act == NULL) || ((ob_act != ob) && (ob_act->mode & OB_MODE_WEIGHT_PAINT) == 0)) {
+ if ((ob_act == NULL) || ((ob_act != ob) && (ob_act->mode & OB_MODE_ALL_WEIGHT_PAINT) == 0)) {
/* when we are entering into posemode via toggle-select,
* from another active object - always select the bone. */
if (!extend && !deselect && toggle) {
@@ -225,7 +227,7 @@ bool ED_armature_pose_select_pick_with_buffer(ViewLayer *view_layer,
if (ob_act) {
/* in weightpaint we select the associated vertex group too */
- if (ob_act->mode & OB_MODE_WEIGHT_PAINT) {
+ if (ob_act->mode & OB_MODE_ALL_WEIGHT_PAINT) {
if (nearBone == arm->act_bone) {
ED_vgroup_select_by_name(ob_act, nearBone->name);
DEG_id_tag_update(&ob_act->id, ID_RECALC_GEOMETRY);
@@ -261,17 +263,39 @@ void ED_armature_pose_select_in_wpaint_mode(ViewLayer *view_layer, Base *base_se
{
BLI_assert(base_select && (base_select->object->type == OB_ARMATURE));
Object *ob_active = OBACT(view_layer);
- BLI_assert(ob_active && (ob_active->mode & OB_MODE_WEIGHT_PAINT));
- VirtualModifierData virtualModifierData;
- ModifierData *md = BKE_modifiers_get_virtual_modifierlist(ob_active, &virtualModifierData);
- for (; md; md = md->next) {
- if (md->type == eModifierType_Armature) {
- ArmatureModifierData *amd = (ArmatureModifierData *)md;
- Object *ob_arm = amd->object;
- if (ob_arm != NULL) {
- Base *base_arm = BKE_view_layer_base_find(view_layer, ob_arm);
- if ((base_arm != NULL) && (base_arm != base_select) && (base_arm->flag & BASE_SELECTED)) {
- ED_object_base_select(base_arm, BA_DESELECT);
+ BLI_assert(ob_active && (ob_active->mode & OB_MODE_ALL_WEIGHT_PAINT));
+
+ if (ob_active->type == OB_GPENCIL) {
+ GpencilVirtualModifierData virtualModifierData;
+ GpencilModifierData *md = BKE_gpencil_modifiers_get_virtual_modifierlist(ob_active,
+ &virtualModifierData);
+ for (; md; md = md->next) {
+ if (md->type == eGpencilModifierType_Armature) {
+ ArmatureGpencilModifierData *agmd = (ArmatureGpencilModifierData *)md;
+ Object *ob_arm = agmd->object;
+ if (ob_arm != NULL) {
+ Base *base_arm = BKE_view_layer_base_find(view_layer, ob_arm);
+ if ((base_arm != NULL) && (base_arm != base_select) &&
+ (base_arm->flag & BASE_SELECTED)) {
+ ED_object_base_select(base_arm, BA_DESELECT);
+ }
+ }
+ }
+ }
+ }
+ else {
+ VirtualModifierData virtualModifierData;
+ ModifierData *md = BKE_modifiers_get_virtual_modifierlist(ob_active, &virtualModifierData);
+ for (; md; md = md->next) {
+ if (md->type == eModifierType_Armature) {
+ ArmatureModifierData *amd = (ArmatureModifierData *)md;
+ Object *ob_arm = amd->object;
+ if (ob_arm != NULL) {
+ Base *base_arm = BKE_view_layer_base_find(view_layer, ob_arm);
+ if ((base_arm != NULL) && (base_arm != base_select) &&
+ (base_arm->flag & BASE_SELECTED)) {
+ ED_object_base_select(base_arm, BA_DESELECT);
+ }
}
}
}
diff --git a/source/blender/editors/gpencil/gpencil_edit.c b/source/blender/editors/gpencil/gpencil_edit.c
index 1bbba6c4b8a..37338ec4592 100644
--- a/source/blender/editors/gpencil/gpencil_edit.c
+++ b/source/blender/editors/gpencil/gpencil_edit.c
@@ -39,6 +39,7 @@
#include "BLT_translation.h"
+#include "DNA_gpencil_modifier_types.h"
#include "DNA_gpencil_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_object_types.h"
@@ -52,7 +53,9 @@
#include "BKE_global.h"
#include "BKE_gpencil.h"
#include "BKE_gpencil_geom.h"
+#include "BKE_layer.h"
#include "BKE_lib_id.h"
+#include "BKE_library.h"
#include "BKE_main.h"
#include "BKE_material.h"
#include "BKE_object.h"
@@ -75,6 +78,7 @@
#include "UI_view2d.h"
+#include "ED_armature.h"
#include "ED_gpencil.h"
#include "ED_object.h"
#include "ED_outliner.h"
@@ -571,6 +575,8 @@ static int gpencil_weightmode_toggle_exec(bContext *C, wmOperator *op)
gpd = ob->data;
is_object = true;
}
+ const int mode_flag = OB_MODE_WEIGHT_GPENCIL;
+ const bool is_mode_set = (ob->mode & mode_flag) != 0;
if (gpd == NULL) {
return OPERATOR_CANCELLED;
@@ -593,6 +599,9 @@ static int gpencil_weightmode_toggle_exec(bContext *C, wmOperator *op)
}
ob->restore_mode = ob->mode;
ob->mode = mode;
+
+ /* Prepare armature posemode. */
+ ED_object_posemode_set_for_weight_paint(C, bmain, ob, is_mode_set);
}
if (mode == OB_MODE_WEIGHT_GPENCIL) {
diff --git a/source/blender/editors/include/ED_object.h b/source/blender/editors/include/ED_object.h
index dc674aefe2e..d69c1227ee0 100644
--- a/source/blender/editors/include/ED_object.h
+++ b/source/blender/editors/include/ED_object.h
@@ -352,6 +352,11 @@ void ED_object_mode_generic_exit(struct Main *bmain,
struct Object *ob);
bool ED_object_mode_generic_has_data(struct Depsgraph *depsgraph, struct Object *ob);
+void ED_object_posemode_set_for_weight_paint(struct bContext *C,
+ struct Main *bmain,
+ struct Object *ob,
+ const bool is_mode_set);
+
/* object_modifier.c */
enum {
MODIFIER_APPLY_DATA = 1,
diff --git a/source/blender/editors/object/object_modes.c b/source/blender/editors/object/object_modes.c
index 5d4476ecb8c..d4dd6617c53 100644
--- a/source/blender/editors/object/object_modes.c
+++ b/source/blender/editors/object/object_modes.c
@@ -29,7 +29,10 @@
#include "BLI_utildefines.h"
#include "BKE_context.h"
+#include "BKE_gpencil_modifier.h"
#include "BKE_layer.h"
+#include "BKE_main.h"
+#include "BKE_modifier.h"
#include "BKE_object.h"
#include "BKE_paint.h"
#include "BKE_report.h"
@@ -304,6 +307,75 @@ static bool ed_object_mode_generic_exit_ex(struct Main *bmain,
return false;
}
+/* 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.
+ */
+static void ed_object_posemode_set_for_weight_paint_ex(bContext *C,
+ Main *bmain,
+ Object *ob_arm,
+ const bool is_mode_set)
+{
+ View3D *v3d = CTX_wm_view3d(C);
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+
+ 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);
+ }
+ }
+ }
+ }
+ }
+}
+
+void ED_object_posemode_set_for_weight_paint(bContext *C,
+ Main *bmain,
+ Object *ob,
+ const bool is_mode_set)
+{
+ if (ob->type == OB_GPENCIL) {
+ GpencilVirtualModifierData virtualModifierData;
+ GpencilModifierData *md = BKE_gpencil_modifiers_get_virtual_modifierlist(ob,
+ &virtualModifierData);
+ for (; md; md = md->next) {
+ if (md->type == eGpencilModifierType_Armature) {
+ ArmatureGpencilModifierData *amd = (ArmatureGpencilModifierData *)md;
+ Object *ob_arm = amd->object;
+ ed_object_posemode_set_for_weight_paint_ex(C, bmain, ob_arm, is_mode_set);
+ }
+ }
+ }
+ else {
+ VirtualModifierData virtualModifierData;
+ ModifierData *md = BKE_modifiers_get_virtual_modifierlist(ob, &virtualModifierData);
+ for (; md; md = md->next) {
+ if (md->type == eModifierType_Armature) {
+ ArmatureModifierData *amd = (ArmatureModifierData *)md;
+ Object *ob_arm = amd->object;
+ ed_object_posemode_set_for_weight_paint_ex(C, bmain, ob_arm, is_mode_set);
+ }
+ }
+ }
+}
+
void ED_object_mode_generic_exit(struct Main *bmain,
struct Depsgraph *depsgraph,
struct Scene *scene,
diff --git a/source/blender/editors/screen/screen_context.c b/source/blender/editors/screen/screen_context.c
index 3c70bf1bfd8..89d6befbb25 100644
--- a/source/blender/editors/screen/screen_context.c
+++ b/source/blender/editors/screen/screen_context.c
@@ -449,7 +449,7 @@ int ed_screen_context(const bContext *C, const char *member, bContextDataResult
return 1;
}
if (CTX_data_equals(member, "weight_paint_object")) {
- if (obact && (obact->mode & OB_MODE_WEIGHT_PAINT)) {
+ if (obact && (obact->mode & OB_MODE_ALL_WEIGHT_PAINT)) {
CTX_data_id_pointer_set(result, &obact->id);
}
diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c
index 6ed3ed4020c..d9ca008ff81 100644
--- a/source/blender/editors/screen/screen_ops.c
+++ b/source/blender/editors/screen/screen_ops.c
@@ -481,7 +481,7 @@ bool ED_operator_posemode(bContext *C)
if (obact && !(obact->mode & OB_MODE_EDIT)) {
Object *obpose;
if ((obpose = BKE_object_pose_armature_get(obact))) {
- if ((obact == obpose) || (obact->mode & OB_MODE_WEIGHT_PAINT)) {
+ if ((obact == obpose) || (obact->mode & OB_MODE_ALL_WEIGHT_PAINT)) {
return 1;
}
}
diff --git a/source/blender/editors/sculpt_paint/paint_vertex.c b/source/blender/editors/sculpt_paint/paint_vertex.c
index e6b0c2fbd1b..3753709875b 100644
--- a/source/blender/editors/sculpt_paint/paint_vertex.c
+++ b/source/blender/editors/sculpt_paint/paint_vertex.c
@@ -1376,50 +1376,8 @@ 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-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.
- */
- {
- VirtualModifierData virtualModifierData;
- ModifierData *md = BKE_modifiers_get_virtual_modifierlist(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);
- }
- }
- }
- }
- }
- }
- }
- }
- }
+ /* Prepare armature posemode. */
+ ED_object_posemode_set_for_weight_paint(C, bmain, ob, is_mode_set);
/* Weight-paint works by overriding colors in mesh,
* so need to make sure we recalculate on enter and
diff --git a/source/blender/editors/space_view3d/view3d_select.c b/source/blender/editors/space_view3d/view3d_select.c
index f99301371d4..03c1ecae317 100644
--- a/source/blender/editors/space_view3d/view3d_select.c
+++ b/source/blender/editors/space_view3d/view3d_select.c
@@ -2208,7 +2208,7 @@ static bool ed_object_select_pick(bContext *C,
/* In weight-paint, we use selected bone to select vertex-group,
* so don't switch to new active object. */
- if (oldbasact && (oldbasact->object->mode & OB_MODE_WEIGHT_PAINT)) {
+ if (oldbasact && (oldbasact->object->mode & OB_MODE_ALL_WEIGHT_PAINT)) {
/* Prevent activating.
* Selection causes this to be considered the 'active' pose in weight-paint mode.
* Eventually this limitation may be removed.
@@ -2382,7 +2382,7 @@ static int view3d_select_exec(bContext *C, wmOperator *op)
bool object = (RNA_boolean_get(op->ptr, "object") &&
(obedit || BKE_paint_select_elem_test(obact) ||
/* so its possible to select bones in weight-paint mode (LMB select) */
- (obact && (obact->mode & OB_MODE_WEIGHT_PAINT) &&
+ (obact && (obact->mode & OB_MODE_ALL_WEIGHT_PAINT) &&
BKE_object_pose_armature_get(obact))));
bool retval = false;
diff --git a/source/blender/editors/space_view3d/view3d_view.c b/source/blender/editors/space_view3d/view3d_view.c
index 7000a4d89cd..0d350d0e7d4 100644
--- a/source/blender/editors/space_view3d/view3d_view.c
+++ b/source/blender/editors/space_view3d/view3d_view.c
@@ -22,6 +22,7 @@
*/
#include "DNA_camera_types.h"
+#include "DNA_gpencil_modifier_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
@@ -37,6 +38,7 @@
#include "BKE_camera.h"
#include "BKE_context.h"
#include "BKE_global.h"
+#include "BKE_gpencil_modifier.h"
#include "BKE_idprop.h"
#include "BKE_layer.h"
#include "BKE_main.h"
@@ -949,7 +951,7 @@ static bool drw_select_loop_pass(eDRWSelectStage stage, void *user_data)
eV3DSelectObjectFilter ED_view3d_select_filter_from_mode(const Scene *scene, const Object *obact)
{
if (scene->toolsettings->object_flag & SCE_OBJECT_MODE_LOCK) {
- if (obact && (obact->mode & OB_MODE_WEIGHT_PAINT) &&
+ if (obact && (obact->mode & OB_MODE_ALL_WEIGHT_PAINT) &&
BKE_object_pose_armature_get((Object *)obact)) {
return VIEW3D_SELECT_FILTER_WPAINT_POSE_MODE_LOCK;
}
@@ -1053,18 +1055,33 @@ int view3d_opengl_select(ViewContext *vc,
}
case VIEW3D_SELECT_FILTER_WPAINT_POSE_MODE_LOCK: {
Object *obact = vc->obact;
- BLI_assert(obact && (obact->mode & OB_MODE_WEIGHT_PAINT));
-
+ BLI_assert(obact && (obact->mode & OB_MODE_ALL_WEIGHT_PAINT));
/* While this uses 'alloca' in a loop (which we typically avoid),
* the number of items is nearly always 1, maybe 2..3 in rare cases. */
LinkNode *ob_pose_list = NULL;
- VirtualModifierData virtualModifierData;
- const ModifierData *md = BKE_modifiers_get_virtual_modifierlist(obact, &virtualModifierData);
- for (; md; md = md->next) {
- if (md->type == eModifierType_Armature) {
- ArmatureModifierData *amd = (ArmatureModifierData *)md;
- if (amd->object && (amd->object->mode & OB_MODE_POSE)) {
- BLI_linklist_prepend_alloca(&ob_pose_list, amd->object);
+ if (obact->type == OB_GPENCIL) {
+ GpencilVirtualModifierData virtualModifierData;
+ const GpencilModifierData *md = BKE_gpencil_modifiers_get_virtual_modifierlist(
+ obact, &virtualModifierData);
+ for (; md; md = md->next) {
+ if (md->type == eGpencilModifierType_Armature) {
+ ArmatureGpencilModifierData *agmd = (ArmatureGpencilModifierData *)md;
+ if (agmd->object && (agmd->object->mode & OB_MODE_POSE)) {
+ BLI_linklist_prepend_alloca(&ob_pose_list, agmd->object);
+ }
+ }
+ }
+ }
+ else {
+ VirtualModifierData virtualModifierData;
+ const ModifierData *md = BKE_modifiers_get_virtual_modifierlist(obact,
+ &virtualModifierData);
+ for (; md; md = md->next) {
+ if (md->type == eModifierType_Armature) {
+ ArmatureModifierData *amd = (ArmatureModifierData *)md;
+ if (amd->object && (amd->object->mode & OB_MODE_POSE)) {
+ BLI_linklist_prepend_alloca(&ob_pose_list, amd->object);
+ }
}
}
}