diff options
author | Campbell Barton <campbell@blender.org> | 2022-05-19 07:32:59 +0300 |
---|---|---|
committer | Campbell Barton <campbell@blender.org> | 2022-05-19 07:32:59 +0300 |
commit | 5d0432a2eab6f3af00be57dd1f11720207296f07 (patch) | |
tree | 6c7364252e92c542236601e6fe4c2a3c7b6a33c8 /source/blender/editors/space_view3d | |
parent | a111aae415d0cc3415bb9bc0c56fa9e53e9d00d8 (diff) | |
parent | 3ecc03c3d6b7baeee900a7ffd97fc0c2701adbc5 (diff) |
Merge branch 'blender-v3.2-release'
Diffstat (limited to 'source/blender/editors/space_view3d')
-rw-r--r-- | source/blender/editors/space_view3d/view3d_utils.c | 41 |
1 files changed, 32 insertions, 9 deletions
diff --git a/source/blender/editors/space_view3d/view3d_utils.c b/source/blender/editors/space_view3d/view3d_utils.c index e75567f3201..306394ce53d 100644 --- a/source/blender/editors/space_view3d/view3d_utils.c +++ b/source/blender/editors/space_view3d/view3d_utils.c @@ -1317,17 +1317,40 @@ bool ED_view3d_quat_to_axis_view(const float quat[4], *r_view = RV3D_VIEW_USER; *r_view_axis_roll = RV3D_VIEW_AXIS_ROLL_0; - /* quat values are all unit length */ - for (int view = RV3D_VIEW_FRONT; view <= RV3D_VIEW_BOTTOM; view++) { - for (int view_axis_roll = RV3D_VIEW_AXIS_ROLL_0; view_axis_roll <= RV3D_VIEW_AXIS_ROLL_270; - view_axis_roll++) { - if (fabsf(angle_signed_qtqt( - quat, view3d_quat_axis[view - RV3D_VIEW_FRONT][view_axis_roll])) < epsilon) { - *r_view = view; - *r_view_axis_roll = view_axis_roll; - return true; + /* Quaternion values are all unit length. */ + + if (epsilon < M_PI_4) { + /* Under 45 degrees, just pick the closest value. */ + for (int view = RV3D_VIEW_FRONT; view <= RV3D_VIEW_BOTTOM; view++) { + for (int view_axis_roll = RV3D_VIEW_AXIS_ROLL_0; view_axis_roll <= RV3D_VIEW_AXIS_ROLL_270; + view_axis_roll++) { + if (fabsf(angle_signed_qtqt( + quat, view3d_quat_axis[view - RV3D_VIEW_FRONT][view_axis_roll])) < epsilon) { + *r_view = view; + *r_view_axis_roll = view_axis_roll; + return true; + } + } + } + } + else { + /* Epsilon over 45 degrees, check all & find use the closest. */ + float delta_best = FLT_MAX; + for (int view = RV3D_VIEW_FRONT; view <= RV3D_VIEW_BOTTOM; view++) { + for (int view_axis_roll = RV3D_VIEW_AXIS_ROLL_0; view_axis_roll <= RV3D_VIEW_AXIS_ROLL_270; + view_axis_roll++) { + const float delta_test = fabsf( + angle_signed_qtqt(quat, view3d_quat_axis[view - RV3D_VIEW_FRONT][view_axis_roll])); + if (delta_best > delta_test) { + delta_best = delta_test; + *r_view = view; + *r_view_axis_roll = view_axis_roll; + } } } + if (*r_view != RV3D_VIEW_USER) { + return true; + } } return false; |