Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2007-09-03 02:53:59 +0400
committerCampbell Barton <ideasman42@gmail.com>2007-09-03 02:53:59 +0400
commit04a2eb2e4e95c1d87c384e69f4c3ed3a6b3552f3 (patch)
tree1312fdd3394cbac2b39b290fdd2840b0ff74b7de /source
parentb1c30dff885aa31417ec0389c479570ad0394967 (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.h3
-rw-r--r--source/blender/blenlib/intern/arithb.c20
-rw-r--r--source/blender/src/editarmature.c28
-rw-r--r--source/blender/src/editobject.c3
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++;
}
}