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
This commit is contained in:
2007-09-02 22:53:59 +00:00
parent b1c30dff88
commit 04a2eb2e4e
4 changed files with 32 additions and 22 deletions

View File

@@ -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]);

View File

@@ -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];
}

View File

@@ -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);

View File

@@ -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++;
}
}