diff options
author | Campbell Barton <ideasman42@gmail.com> | 2007-09-03 02:53:59 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2007-09-03 02:53:59 +0400 |
commit | 04a2eb2e4e95c1d87c384e69f4c3ed3a6b3552f3 (patch) | |
tree | 1312fdd3394cbac2b39b290fdd2840b0ff74b7de /source | |
parent | b1c30dff885aa31417ec0389c479570ad0394967 (diff) |
adding 2 new functions
Mat3ToScalef and Mat4ToScalef
These return a floating point scale value which is the average of the 3 axies.
Use this to adjust curve radius when applying scale/rot
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/blenlib/BLI_arithb.h | 3 | ||||
-rw-r--r-- | source/blender/blenlib/intern/arithb.c | 20 | ||||
-rw-r--r-- | source/blender/src/editarmature.c | 28 | ||||
-rw-r--r-- | source/blender/src/editobject.c | 3 |
4 files changed, 32 insertions, 22 deletions
diff --git a/source/blender/blenlib/BLI_arithb.h b/source/blender/blenlib/BLI_arithb.h index 1adc840dfe4..b2043bfcf93 100644 --- a/source/blender/blenlib/BLI_arithb.h +++ b/source/blender/blenlib/BLI_arithb.h @@ -333,6 +333,9 @@ void MinMax3(float *min, float *max, float *vec); void SizeToMat3(float *size, float mat[][3]); void SizeToMat4(float *size, float mat[][4]); +float Mat3ToScalef(float mat[][3]); +float Mat4ToScalef(float mat[][4]); + void printmatrix3(char *str, float m[][3]); void printmatrix4(char *str, float m[][4]); diff --git a/source/blender/blenlib/intern/arithb.c b/source/blender/blenlib/intern/arithb.c index 72e18b3f1da..d93f4b9c009 100644 --- a/source/blender/blenlib/intern/arithb.c +++ b/source/blender/blenlib/intern/arithb.c @@ -2866,6 +2866,25 @@ void Mat4ToSize( float mat[][4], float *size) size[2]= VecLength(mat[2]); } +/* this gets the average scale of a matrix, only use when your scaling + * data that has no idea of scale axis, examples are bone-envelope-radius + * and curve radius */ +float Mat3ToScalef(float mat[][3]) +{ + /* unit length vector */ + float unit_vec[3] = {0.577350269189626, 0.577350269189626, 0.577350269189626}; + Mat3MulVecfl(mat, unit_vec); + return VecLength(unit_vec); +} + +float Mat4ToScalef(float mat[][4]) +{ + float tmat[3][3]; + Mat3CpyMat4(tmat, mat); + return Mat3ToScalef(tmat); +} + + /* ************* SPECIALS ******************* */ void triatoquat( float *v1, float *v2, float *v3, float *quat) @@ -3581,4 +3600,3 @@ void LocQuatSizeToMat4(float mat[][4], float loc[3], float quat[4], float size[3 mat[3][1] = loc[1]; mat[3][2] = loc[2]; } - diff --git a/source/blender/src/editarmature.c b/source/blender/src/editarmature.c index 7ff6e4039a5..a5b94faf9ae 100644 --- a/source/blender/src/editarmature.c +++ b/source/blender/src/editarmature.c @@ -346,16 +346,11 @@ void apply_rot_armature (Object *ob, float mat[3][3]) ListBase list; EditBone *ebone; bArmature *arm; - float scale; /* store the scale of the matrix here to use on envelopes */ + float scale = Mat3ToScalef(mat); /* store the scale of the matrix here to use on envelopes */ arm = get_armature(ob); - if (!arm) { - return; - } else { - float tmp[3] = {1.0, 1.0, 1.0}; - Mat3MulVecfl(mat, tmp); - scale = (fabs(tmp[0]) + fabs(tmp[1]) + fabs(tmp[2])) / 3.0f; - } + if (!arm) + return; /* Put the armature into editmode */ list.first= list.last = NULL; @@ -2653,22 +2648,13 @@ void add_verts_to_dgroups(Object *ob, Object *par, int heat, int mirror) } /* compute the weights based on gathered vertices and bones */ - if (heat) { + if (heat) heat_bone_weighting(ob, mesh, verts, numbones, dgrouplist, dgroupflip, root, tip, selected); - } else { - float scale; - float tmp[3] = {1.0, 1.0, 1.0}; - float mat[3][3]; - - /* scale value from matrix, wont account for non uniform scale but ok */ - Mat3CpyMat4(mat, par->obmat); - Mat3MulVecfl(mat, tmp); - scale = (fabs(tmp[0]) + fabs(tmp[1]) + fabs(tmp[2])) / 3.0f; - + else envelope_bone_weighting(ob, mesh, verts, numbones, bonelist, dgrouplist, - dgroupflip, root, tip, selected, scale); - } + dgroupflip, root, tip, selected, Mat4ToScalef(par->obmat)); + /* free the memory allocated */ MEM_freeN(bonelist); MEM_freeN(dgrouplist); diff --git a/source/blender/src/editobject.c b/source/blender/src/editobject.c index 757ca322bdd..42cec673219 100644 --- a/source/blender/src/editobject.c +++ b/source/blender/src/editobject.c @@ -3728,7 +3728,9 @@ void apply_object() where_is_object(ob); } else if ELEM(ob->type, OB_CURVE, OB_SURF) { + float scale; object_to_mat3(ob, mat); + scale = Mat3ToScalef(mat); cu= ob->data; if(cu->id.us>1) { @@ -3749,6 +3751,7 @@ void apply_object() Mat3MulVecfl(mat, bezt->vec[0]); Mat3MulVecfl(mat, bezt->vec[1]); Mat3MulVecfl(mat, bezt->vec[2]); + bezt->radius *= scale; bezt++; } } |