Pose: fix wpaint + pose mode pick & linked select

This commit is contained in:
Campbell Barton 2018-04-17 11:21:27 +02:00
parent ad797ed39a
commit 963b1c8e41
4 changed files with 58 additions and 7 deletions

View File

@ -146,6 +146,10 @@ struct Object **BKE_object_pose_array_get_ex(struct ViewLayer *view_layer, uint
struct Object **BKE_object_pose_array_get_unique(struct ViewLayer *view_layer, uint *r_objects_len);
struct Object **BKE_object_pose_array_get(struct ViewLayer *view_layer, uint *r_objects_len);
struct Base **BKE_object_pose_base_array_get_ex(struct ViewLayer *view_layer, uint *r_bases_len, bool unique);
struct Base **BKE_object_pose_base_array_get_unique(struct ViewLayer *view_layer, uint *r_bases_len);
struct Base **BKE_object_pose_base_array_get(struct ViewLayer *view_layer, uint *r_bases_len);
void BKE_object_get_parent_matrix(
struct Scene *scene, struct Object *ob,
struct Object *par, float parentmat[4][4]);

View File

@ -1259,17 +1259,57 @@ Object **BKE_object_pose_array_get_ex(ViewLayer *view_layer, uint *r_objects_len
}
return objects;
}
Object **BKE_object_pose_array_get_unique(ViewLayer *view_layer, uint *r_objects_len)
{
return BKE_object_pose_array_get_ex(view_layer, r_objects_len, true);
}
Object **BKE_object_pose_array_get(ViewLayer *view_layer, uint *r_objects_len)
{
return BKE_object_pose_array_get_ex(view_layer, r_objects_len, false);
}
Base **BKE_object_pose_base_array_get_ex(ViewLayer *view_layer, uint *r_bases_len, bool unique)
{
Base *base_active = BASACT(view_layer);
Object *ob_pose = base_active ? BKE_object_pose_armature_get(base_active->object) : NULL;
Base *base_pose = NULL;
Base **bases = NULL;
if (base_active) {
if (ob_pose == base_active->object) {
base_pose = base_active;
}
else {
base_pose = BKE_view_layer_base_find(view_layer, ob_pose);
}
}
if (base_active && (base_pose == base_active)) {
bases = BKE_view_layer_array_from_bases_in_mode(
view_layer, r_bases_len, {
.object_mode = OB_MODE_POSE,
.no_dup_data = unique});
}
else if (base_pose != NULL) {
*r_bases_len = 1;
bases = MEM_mallocN(sizeof(*bases), __func__);
bases[0] = base_pose;
}
else {
*r_bases_len = 0;
bases = MEM_mallocN(0, __func__);
}
return bases;
}
Base **BKE_object_pose_base_array_get_unique(ViewLayer *view_layer, uint *r_bases_len)
{
return BKE_object_pose_base_array_get_ex(view_layer, r_bases_len, true);
}
Base **BKE_object_pose_base_array_get(ViewLayer *view_layer, uint *r_bases_len)
{
return BKE_object_pose_base_array_get_ex(view_layer, r_bases_len, false);
}
void BKE_object_transform_copy(Object *ob_tar, const Object *ob_src)
{
copy_v3_v3(ob_tar->loc, ob_src->loc);

View File

@ -41,6 +41,7 @@
#include "BKE_context.h"
#include "BKE_action.h"
#include "BKE_object.h"
#include "BKE_report.h"
#include "BKE_layer.h"
@ -259,10 +260,16 @@ void *get_nearest_bone(
if (hits > 0) {
uint bases_len = 0;
Base **bases = BKE_view_layer_array_from_bases_in_mode(
vc.view_layer, &bases_len, {
.object_mode = vc.obedit ? OB_MODE_EDIT : OB_MODE_POSE,
.no_dup_data = true});
Base **bases;
if (vc.obedit != NULL) {
bases = BKE_view_layer_array_from_bases_in_mode(
vc.view_layer, &bases_len, {
.object_mode = OB_MODE_EDIT});
}
else {
bases = BKE_object_pose_base_array_get(vc.view_layer, &bases_len);
}
void *bone = get_bone_from_selectbuffer(
bases, bases_len, vc.obedit != NULL, buffer, hits, findunsel, true, r_base);

View File

@ -171,7 +171,7 @@ bool ED_armature_pose_select_pick_with_buffer(
if (!extend && !deselect && !toggle) {
{
uint objects_len = 0;
Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
Object **objects = BKE_object_pose_array_get_unique(view_layer, &objects_len);
ED_pose_deselect_all_multi(objects, objects_len, SEL_DESELECT, true);
MEM_SAFE_FREE(objects);
}