diff options
author | Campbell Barton <ideasman42@gmail.com> | 2017-08-15 06:27:31 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2017-08-15 06:46:09 +0300 |
commit | dfb890947d036bca735abcc56d55bd2572aefcb3 (patch) | |
tree | 01d971c3a8c9bc2014a42a115268ce712f7f6999 /source/blender/windowmanager/manipulators | |
parent | 3ab46f42046854e1f4c036a9b779177136017772 (diff) |
Manipulator: store initial-final matrix for reuse
Also take matrix_space into account when calculating final pixel size.
Diffstat (limited to 'source/blender/windowmanager/manipulators')
-rw-r--r-- | source/blender/windowmanager/manipulators/WM_manipulator_types.h | 2 | ||||
-rw-r--r-- | source/blender/windowmanager/manipulators/intern/wm_manipulator.c | 15 |
2 files changed, 10 insertions, 7 deletions
diff --git a/source/blender/windowmanager/manipulators/WM_manipulator_types.h b/source/blender/windowmanager/manipulators/WM_manipulator_types.h index 7bfc08c7caa..82bf556ce20 100644 --- a/source/blender/windowmanager/manipulators/WM_manipulator_types.h +++ b/source/blender/windowmanager/manipulators/WM_manipulator_types.h @@ -273,7 +273,7 @@ typedef struct wmManipulatorType { * - Scale isn't applied (wmManipulator.scale/user_scale). * - Offset isn't applied (wmManipulator.matrix_offset). */ - wmManipulatorFnMatrixWorldGet matrix_world_get; + wmManipulatorFnMatrixWorldGet matrix_basis_get; /* activate a manipulator state when the user clicks on it */ wmManipulatorFnInvoke invoke; diff --git a/source/blender/windowmanager/manipulators/intern/wm_manipulator.c b/source/blender/windowmanager/manipulators/intern/wm_manipulator.c index ccb6a39350f..fe7dbb56d6e 100644 --- a/source/blender/windowmanager/manipulators/intern/wm_manipulator.c +++ b/source/blender/windowmanager/manipulators/intern/wm_manipulator.c @@ -446,15 +446,18 @@ void wm_manipulator_calculate_scale(wmManipulator *mpr, const bContext *C) scale *= U.manipulator_size; if (rv3d) { /* 'ED_view3d_pixel_size' includes 'U.pixelsize', remove it. */ - if (mpr->type->matrix_world_get) { - float matrix_world[4][4]; - - mpr->type->matrix_world_get(mpr, matrix_world); - scale *= ED_view3d_pixel_size(rv3d, matrix_world[3]) / U.pixelsize; + float matrix_world[4][4]; + if (mpr->type->matrix_basis_get) { + float matrix_basis[4][4]; + mpr->type->matrix_basis_get(mpr, matrix_basis); + mul_m4_m4m4(matrix_world, mpr->matrix_space, matrix_basis); } else { - scale *= ED_view3d_pixel_size(rv3d, mpr->matrix_basis[3]) / U.pixelsize; + mul_m4_m4m4(matrix_world, mpr->matrix_space, mpr->matrix_basis); } + + /* Exclude matrix_offset from scale. */ + scale *= ED_view3d_pixel_size(rv3d, matrix_world[3]) / U.pixelsize; } else { scale *= 0.02f; |