From 1854cccad7c31a6b8235faf980ffdd6a80163e02 Mon Sep 17 00:00:00 2001 From: Alexander Gavrilov Date: Sun, 5 May 2019 13:25:43 +0300 Subject: Drivers: add an Average Scale option to the Transform Channel driver vars. Unlike location and rotation, there is a meaningful definition of overall/average scaling via the total change in the volume. This adds an option to retrieve that via a single driver variable, instead of having to use three and an expression. Using the determinant to compute the volume scaling also allows detecting flipping due to negative scale - this is impossible to do via the three variable approach. The volume_scale functions are added purely for code readability: 'volume scale factor' is easier to understand than determinant. Differential Revision: https://developer.blender.org/D4803 --- source/blender/blenlib/BLI_math_matrix.h | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'source/blender/blenlib/BLI_math_matrix.h') diff --git a/source/blender/blenlib/BLI_math_matrix.h b/source/blender/blenlib/BLI_math_matrix.h index 652f096f32d..cc3159556bf 100644 --- a/source/blender/blenlib/BLI_math_matrix.h +++ b/source/blender/blenlib/BLI_math_matrix.h @@ -260,6 +260,7 @@ float determinant_m2(float a, float b, float c, float d); float determinant_m3( float a, float b, float c, float d, float e, float f, float g, float h, float i); float determinant_m3_array(const float m[3][3]); +float determinant_m4_mat3_array(const float m[4][4]); float determinant_m4(const float A[4][4]); #define PSEUDOINVERSE_EPSILON 1e-8f @@ -277,6 +278,9 @@ void invert_m4_m4_safe(float Ainv[4][4], const float A[4][4]); void scale_m3_fl(float R[3][3], float scale); void scale_m4_fl(float R[4][4], float scale); +float mat3_to_volume_scale(const float M[3][3]); +float mat4_to_volume_scale(const float M[4][4]); + float mat3_to_scale(const float M[3][3]); float mat4_to_scale(const float M[4][4]); float mat4_to_xy_scale(const float M[4][4]); -- cgit v1.2.3