forked from bartvdbraak/blender
Make View Selected to be aware of copy-on-write
This commit is contained in:
parent
4376bb6405
commit
eb521b22b2
@ -84,6 +84,8 @@
|
|||||||
|
|
||||||
#include "view3d_intern.h" /* own include */
|
#include "view3d_intern.h" /* own include */
|
||||||
|
|
||||||
|
#include "DEG_depsgraph_query.h"
|
||||||
|
|
||||||
/* -------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------- */
|
||||||
/** \name Generic View Operator Properties
|
/** \name Generic View Operator Properties
|
||||||
* \{ */
|
* \{ */
|
||||||
@ -2793,12 +2795,12 @@ static int viewselected_exec(bContext *C, wmOperator *op)
|
|||||||
View3D *v3d = CTX_wm_view3d(C);
|
View3D *v3d = CTX_wm_view3d(C);
|
||||||
Scene *scene = CTX_data_scene(C);
|
Scene *scene = CTX_data_scene(C);
|
||||||
Depsgraph *depsgraph = CTX_data_depsgraph(C);
|
Depsgraph *depsgraph = CTX_data_depsgraph(C);
|
||||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
ViewLayer *view_layer_eval = DEG_get_evaluated_view_layer(depsgraph);
|
||||||
bGPdata *gpd = CTX_data_gpencil_data(C);
|
bGPdata *gpd = CTX_data_gpencil_data(C);
|
||||||
const bool is_gp_edit = ((gpd) && (gpd->flag & GP_DATA_STROKE_EDITMODE));
|
const bool is_gp_edit = ((gpd) && (gpd->flag & GP_DATA_STROKE_EDITMODE));
|
||||||
const bool is_face_map = ((is_gp_edit == false) && ar->manipulator_map &&
|
const bool is_face_map = ((is_gp_edit == false) && ar->manipulator_map &&
|
||||||
WM_manipulatormap_is_any_selected(ar->manipulator_map));
|
WM_manipulatormap_is_any_selected(ar->manipulator_map));
|
||||||
Object *ob = OBACT(view_layer);
|
Object *ob_eval = OBACT(view_layer_eval);
|
||||||
Object *obedit = CTX_data_edit_object(C);
|
Object *obedit = CTX_data_edit_object(C);
|
||||||
float min[3], max[3];
|
float min[3], max[3];
|
||||||
bool ok = false, ok_dist = true;
|
bool ok = false, ok_dist = true;
|
||||||
@ -2810,25 +2812,26 @@ static int viewselected_exec(bContext *C, wmOperator *op)
|
|||||||
|
|
||||||
INIT_MINMAX(min, max);
|
INIT_MINMAX(min, max);
|
||||||
if (is_gp_edit || is_face_map) {
|
if (is_gp_edit || is_face_map) {
|
||||||
ob = NULL;
|
ob_eval = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ob && (ob->mode & OB_MODE_WEIGHT_PAINT)) {
|
if (ob_eval && (ob_eval->mode & OB_MODE_WEIGHT_PAINT)) {
|
||||||
/* hard-coded exception, we look for the one selected armature */
|
/* hard-coded exception, we look for the one selected armature */
|
||||||
/* this is weak code this way, we should make a generic active/selection callback interface once... */
|
/* this is weak code this way, we should make a generic active/selection callback interface once... */
|
||||||
Base *base;
|
Base *base_eval;
|
||||||
for (base = view_layer->object_bases.first; base; base = base->next) {
|
for (base_eval = view_layer_eval->object_bases.first; base_eval; base_eval = base_eval->next) {
|
||||||
if (TESTBASELIB(base)) {
|
if (TESTBASELIB(base_eval)) {
|
||||||
if (base->object->type == OB_ARMATURE)
|
if (base_eval->object->type == OB_ARMATURE)
|
||||||
if (base->object->mode & OB_MODE_POSE)
|
if (base_eval->object->mode & OB_MODE_POSE)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (base)
|
if (base_eval)
|
||||||
ob = base->object;
|
ob_eval = base_eval->object;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is_gp_edit) {
|
if (is_gp_edit) {
|
||||||
|
/* TODO(sergey): Check on this after gpencil merge. */
|
||||||
CTX_DATA_BEGIN(C, bGPDstroke *, gps, editable_gpencil_strokes)
|
CTX_DATA_BEGIN(C, bGPDstroke *, gps, editable_gpencil_strokes)
|
||||||
{
|
{
|
||||||
/* we're only interested in selected points here... */
|
/* we're only interested in selected points here... */
|
||||||
@ -2845,43 +2848,43 @@ static int viewselected_exec(bContext *C, wmOperator *op)
|
|||||||
}
|
}
|
||||||
else if (obedit) {
|
else if (obedit) {
|
||||||
/* only selected */
|
/* only selected */
|
||||||
FOREACH_OBJECT_IN_MODE_BEGIN (view_layer, obedit->mode, ob_iter) {
|
FOREACH_OBJECT_IN_MODE_BEGIN (view_layer_eval, obedit->mode, ob_eval_iter) {
|
||||||
ok |= ED_view3d_minmax_verts(ob_iter, min, max);
|
ok |= ED_view3d_minmax_verts(ob_eval_iter, min, max);
|
||||||
}
|
}
|
||||||
FOREACH_OBJECT_IN_MODE_END;
|
FOREACH_OBJECT_IN_MODE_END;
|
||||||
}
|
}
|
||||||
else if (ob && (ob->mode & OB_MODE_POSE)) {
|
else if (ob_eval && (ob_eval->mode & OB_MODE_POSE)) {
|
||||||
FOREACH_OBJECT_IN_MODE_BEGIN (view_layer, ob->mode, ob_iter) {
|
FOREACH_OBJECT_IN_MODE_BEGIN (view_layer_eval, ob_eval->mode, ob_eval_iter) {
|
||||||
ok |= BKE_pose_minmax(ob_iter, min, max, true, true);
|
ok |= BKE_pose_minmax(ob_eval_iter, min, max, true, true);
|
||||||
}
|
}
|
||||||
FOREACH_OBJECT_IN_MODE_END;
|
FOREACH_OBJECT_IN_MODE_END;
|
||||||
}
|
}
|
||||||
else if (BKE_paint_select_face_test(ob)) {
|
else if (BKE_paint_select_face_test(ob_eval)) {
|
||||||
ok = paintface_minmax(ob, min, max);
|
ok = paintface_minmax(ob_eval, min, max);
|
||||||
}
|
}
|
||||||
else if (ob && (ob->mode & OB_MODE_PARTICLE_EDIT)) {
|
else if (ob_eval && (ob_eval->mode & OB_MODE_PARTICLE_EDIT)) {
|
||||||
ok = PE_minmax(scene, view_layer, min, max);
|
ok = PE_minmax(scene, view_layer_eval, min, max);
|
||||||
}
|
}
|
||||||
else if (ob &&
|
else if (ob_eval &&
|
||||||
(ob->mode & (OB_MODE_SCULPT | OB_MODE_VERTEX_PAINT | OB_MODE_WEIGHT_PAINT | OB_MODE_TEXTURE_PAINT)))
|
(ob_eval->mode & (OB_MODE_SCULPT | OB_MODE_VERTEX_PAINT | OB_MODE_WEIGHT_PAINT | OB_MODE_TEXTURE_PAINT)))
|
||||||
{
|
{
|
||||||
BKE_paint_stroke_get_average(scene, ob, min);
|
BKE_paint_stroke_get_average(scene, ob_eval, min);
|
||||||
copy_v3_v3(max, min);
|
copy_v3_v3(max, min);
|
||||||
ok = true;
|
ok = true;
|
||||||
ok_dist = 0; /* don't zoom */
|
ok_dist = 0; /* don't zoom */
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Base *base;
|
Base *base_eval;
|
||||||
for (base = FIRSTBASE(view_layer); base; base = base->next) {
|
for (base_eval = FIRSTBASE(view_layer_eval); base_eval; base_eval = base_eval->next) {
|
||||||
if (TESTBASE(base)) {
|
if (TESTBASE(base_eval)) {
|
||||||
|
|
||||||
if (skip_camera && base->object == v3d->camera) {
|
if (skip_camera && base_eval->object == v3d->camera) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* account for duplis */
|
/* account for duplis */
|
||||||
if (BKE_object_minmax_dupli(depsgraph, scene, base->object, min, max, false) == 0)
|
if (BKE_object_minmax_dupli(depsgraph, scene, base_eval->object, min, max, false) == 0)
|
||||||
BKE_object_minmax(base->object, min, max, false); /* use if duplis not found */
|
BKE_object_minmax(base_eval->object, min, max, false); /* use if duplis not found */
|
||||||
|
|
||||||
ok = 1;
|
ok = 1;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user