Merge branch 'blender-v3.4-release'

This commit is contained in:
Campbell Barton 2022-11-04 14:00:14 +11:00
commit e36db7018d
4 changed files with 46 additions and 4 deletions

View File

@ -283,7 +283,17 @@ void BKE_object_apply_parent_inverse(struct Object *ob);
void BKE_object_matrix_local_get(struct Object *ob, float r_mat[4][4]);
bool BKE_object_pose_context_check(const struct Object *ob);
struct Object *BKE_object_pose_armature_get(struct Object *ob);
/**
* A version of #BKE_object_pose_armature_get with an additional check.
* When `ob` isn't an armature: only return the referenced pose object
* when the active object is in weight paint mode.
*
* \note Some callers need to check that pose bones are selectable
* which isn't the case when the object using the armature isn't in weight-paint mode.
*/
struct Object *BKE_object_pose_armature_get_with_wpaint_check(struct Object *ob);
struct Object *BKE_object_pose_armature_get_visible(struct Object *ob,
const struct Scene *scene,
struct ViewLayer *view_layer,

View File

@ -2541,6 +2541,28 @@ Object *BKE_object_pose_armature_get(Object *ob)
return nullptr;
}
Object *BKE_object_pose_armature_get_with_wpaint_check(Object *ob)
{
/* When not in weight paint mode. */
if (ob) {
switch (ob->type) {
case OB_MESH: {
if ((ob->mode & OB_MODE_WEIGHT_PAINT) == 0) {
return nullptr;
}
break;
}
case OB_GPENCIL: {
if ((ob->mode & OB_MODE_WEIGHT_GPENCIL) == 0) {
return nullptr;
}
break;
}
}
}
return BKE_object_pose_armature_get(ob);
}
Object *BKE_object_pose_armature_get_visible(Object *ob,
const Scene *scene,
ViewLayer *view_layer,

View File

@ -2616,6 +2616,12 @@ static bool ed_object_select_pick(bContext *C,
Base *basact = nullptr;
const eObjectMode object_mode = oldbasact ? static_cast<eObjectMode>(oldbasact->object->mode) :
OB_MODE_OBJECT;
/* For the most part this is equivalent to `(object_mode & OB_MODE_POSE) != 0`
* however this logic should also run with weight-paint + pose selection.
* Without this, selection in weight-paint mode can de-select armatures which isn't useful,
* see: T101686. */
const bool has_pose_old = (oldbasact &&
BKE_object_pose_armature_get_with_wpaint_check(oldbasact->object));
/* When enabled, don't attempt any further selection. */
bool handled = false;
@ -2654,7 +2660,7 @@ static bool ed_object_select_pick(bContext *C,
*
* This way prioritizing based on pose-mode has a bias to stay in pose-mode
* without having to enforce this through locking the object mode. */
bool do_bones_get_priotity = (object_mode & OB_MODE_POSE) != 0;
bool do_bones_get_priotity = has_pose_old;
basact = (gpu->hits > 0) ? mouse_select_eval_buffer(&vc,
gpu->buffer,
@ -2666,10 +2672,14 @@ static bool ed_object_select_pick(bContext *C,
nullptr;
}
/* See comment for `has_pose_old`, the same rationale applies here. */
const bool has_pose_new = (basact &&
BKE_object_pose_armature_get_with_wpaint_check(basact->object));
/* Select pose-bones or camera-tracks. */
if (((gpu->hits > 0) && gpu->has_bones) ||
/* Special case, even when there are no hits, pose logic may de-select all bones. */
((gpu->hits == 0) && (object_mode & OB_MODE_POSE))) {
((gpu->hits == 0) && has_pose_old)) {
if (basact && (gpu->has_bones && (basact->object->type == OB_CAMERA))) {
MovieClip *clip = BKE_object_movieclip_get(scene, basact->object, false);
@ -2729,7 +2739,7 @@ static bool ed_object_select_pick(bContext *C,
handled = true;
}
else if ((object_mode & OB_MODE_POSE) && (basact->object->mode & OB_MODE_POSE)) {
else if (has_pose_old && has_pose_new) {
/* Within pose-mode, keep the current selection when switching pose bones,
* this is noticeable when in pose mode with multiple objects at once.
* Where selecting the bone of a different object would de-select this one.

View File

@ -710,7 +710,7 @@ void render_copy_renderdata(RenderData *to, RenderData *from)
void RE_InitState(Render *re,
Render *source,
RenderData *rd,
ListBase *render_layers,
ListBase * /*render_layers*/,
ViewLayer *single_layer,
int winx,
int winy,