diff options
author | Campbell Barton <ideasman42@gmail.com> | 2017-08-09 15:24:05 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2017-08-09 15:34:08 +0300 |
commit | 8403ec51608cd82752ae0dc8efb11670fe428b0b (patch) | |
tree | 693bade20f88596c49059cd6d2ecc5db6191a2ed /source/blender/windowmanager | |
parent | b5e6a21f1dbd76f3ea72932c4e764338f926f79f (diff) |
Manipulator: Add function to calculate matrix
Each manipulator was doing this slightly differently,
use shared function which can optionally override each matrix.
Diffstat (limited to 'source/blender/windowmanager')
-rw-r--r-- | source/blender/windowmanager/manipulators/WM_manipulator_api.h | 16 | ||||
-rw-r--r-- | source/blender/windowmanager/manipulators/intern/wm_manipulator.c | 38 |
2 files changed, 54 insertions, 0 deletions
diff --git a/source/blender/windowmanager/manipulators/WM_manipulator_api.h b/source/blender/windowmanager/manipulators/WM_manipulator_api.h index a29e31985a0..93ba8f4f762 100644 --- a/source/blender/windowmanager/manipulators/WM_manipulator_api.h +++ b/source/blender/windowmanager/manipulators/WM_manipulator_api.h @@ -102,6 +102,22 @@ void WM_manipulator_set_color(struct wmManipulator *mpr, const float col[4]); void WM_manipulator_get_color_highlight(const struct wmManipulator *mpr, float col_hi[4]); void WM_manipulator_set_color_highlight(struct wmManipulator *mpr, const float col[4]); +/** + * Leaving values NULL use values from #wmManipulator. + */ +struct WM_ManipulatorMatrixParams { + const float(*matrix_space)[4]; + const float(*matrix_basis)[4]; + const float(*matrix_offset)[4]; + const float *scale_final; +}; + +void WM_manipulator_calc_matrix_final_params( + const struct wmManipulator *mpr, const struct WM_ManipulatorMatrixParams *params, + float r_mat[4][4]); + +void WM_manipulator_calc_matrix_final(const struct wmManipulator *mpr, float r_mat[4][4]); + /* properties */ void WM_manipulator_properties_create_ptr(struct PointerRNA *ptr, struct wmManipulatorType *wt); void WM_manipulator_properties_create(struct PointerRNA *ptr, const char *opstring); diff --git a/source/blender/windowmanager/manipulators/intern/wm_manipulator.c b/source/blender/windowmanager/manipulators/intern/wm_manipulator.c index 3f10864995f..3e6e851c6e0 100644 --- a/source/blender/windowmanager/manipulators/intern/wm_manipulator.c +++ b/source/blender/windowmanager/manipulators/intern/wm_manipulator.c @@ -508,6 +508,44 @@ int wm_manipulator_is_visible(wmManipulator *mpr) return WM_MANIPULATOR_IS_VISIBLE_UPDATE | WM_MANIPULATOR_IS_VISIBLE_DRAW; } +void WM_manipulator_calc_matrix_final_params( + const wmManipulator *mpr, + const struct WM_ManipulatorMatrixParams *params, + float r_mat[4][4]) +{ + const float (* const matrix_space)[4] = params->matrix_space ? params->matrix_space : mpr->matrix_space; + const float (* const matrix_basis)[4] = params->matrix_basis ? params->matrix_basis : mpr->matrix_basis; + const float (* const matrix_offset)[4] = params->matrix_offset ? params->matrix_offset : mpr->matrix_offset; + const float *scale_final = params->scale_final ? params->scale_final : &mpr->scale_final; + + float final_matrix[4][4]; + + copy_m4_m4(final_matrix, matrix_basis); + + if (mpr->flag & WM_MANIPULATOR_DRAW_OFFSET_SCALE) { + mul_mat3_m4_fl(final_matrix, *scale_final); + mul_m4_m4m4(final_matrix, final_matrix, matrix_offset); + } + else { + mul_m4_m4m4(final_matrix, final_matrix, matrix_offset); + mul_mat3_m4_fl(final_matrix, *scale_final); + } + + mul_m4_m4m4(r_mat, final_matrix, matrix_space); +} + +void WM_manipulator_calc_matrix_final(const wmManipulator *mpr, float r_mat[4][4]) +{ + WM_manipulator_calc_matrix_final_params( + mpr, + &((struct WM_ManipulatorMatrixParams) { + .matrix_space = mpr->matrix_space, + .matrix_basis = mpr->matrix_basis, + .matrix_offset = mpr->matrix_offset, + .scale_final = &mpr->scale_final, + }), r_mat + ); +} /** \name Manipulator Propery Access * |