From 91e32bff90866acbfceda3b96a3462a55f7ccb71 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 15 Sep 2020 16:57:56 +1000 Subject: Fix T80796: Frame all ignores geometry from instances Make "Frame All" share functionality with "Frame Selected", accounting for duplis when calculating the bounds. --- source/blender/editors/space_view3d/view3d_edit.c | 42 ++++++++++++----------- 1 file changed, 22 insertions(+), 20 deletions(-) (limited to 'source/blender') diff --git a/source/blender/editors/space_view3d/view3d_edit.c b/source/blender/editors/space_view3d/view3d_edit.c index 76ca4ed55b2..440e486a75a 100644 --- a/source/blender/editors/space_view3d/view3d_edit.c +++ b/source/blender/editors/space_view3d/view3d_edit.c @@ -2788,6 +2788,25 @@ static bool view3d_object_skip_minmax(const View3D *v3d, return false; } +static void view3d_object_calc_minmax(Depsgraph *depsgraph, + Scene *scene, + Object *ob_eval, + const bool only_center, + float min[3], + float max[3]) +{ + /* Account for duplis. */ + if (BKE_object_minmax_dupli(depsgraph, scene, ob_eval, min, max, false) == 0) { + /* Use if duplis aren't found. */ + if (only_center) { + minmax_v3v3_v3(min, max, ob_eval->obmat[3]); + } + else { + BKE_object_minmax(ob_eval, min, max, false); + } + } +} + static void view3d_from_minmax(bContext *C, View3D *v3d, ARegion *region, @@ -2901,7 +2920,7 @@ static int view3d_all_exec(bContext *C, wmOperator *op) View3D *v3d = CTX_wm_view3d(C); RegionView3D *rv3d = CTX_wm_region_view3d(C); Scene *scene = CTX_data_scene(C); - const Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C); + Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C); ViewLayer *view_layer_eval = DEG_get_evaluated_view_layer(depsgraph); Base *base_eval; const bool use_all_regions = RNA_boolean_get(op->ptr, "use_all_regions"); @@ -2935,13 +2954,7 @@ static int view3d_all_exec(bContext *C, wmOperator *op) if (view3d_object_skip_minmax(v3d, rv3d, ob, skip_camera, &only_center)) { continue; } - - if (only_center) { - minmax_v3v3_v3(min, max, base_eval->object->obmat[3]); - } - else { - BKE_object_minmax(base_eval->object, min, max, false); - } + view3d_object_calc_minmax(depsgraph, scene, base_eval->object, only_center, min, max); changed = true; } } @@ -3102,18 +3115,7 @@ static int viewselected_exec(bContext *C, wmOperator *op) if (view3d_object_skip_minmax(v3d, rv3d, ob, skip_camera, &only_center)) { continue; } - - /* account for duplis */ - if (BKE_object_minmax_dupli(depsgraph, scene, base_eval->object, min, max, false) == 0) { - /* use if duplis not found */ - if (only_center) { - minmax_v3v3_v3(min, max, base_eval->object->obmat[3]); - } - else { - BKE_object_minmax(base_eval->object, min, max, false); - } - } - + view3d_object_calc_minmax(depsgraph, scene, base_eval->object, only_center, min, max); ok = 1; } } -- cgit v1.2.3