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:
@@ -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]);
|
||||
|
||||
|
||||
@@ -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];
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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++;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user