[Bf-committers] [Bf-blender-cvs] SVN commit: /data/svn/bf-blender [15050] trunk/blender/source/blender: Transform Orientations
Diego Hernan Borghetti
bdiego at gmail.com
Fri May 30 04:40:03 CEST 2008
On Thu, 29 May 2008, Martin Poirier wrote:
Hi Martin:
> Revision: 15050
> http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15050
> Author: theeth
> Date: 2008-05-29 21:10:09 +0200 (Thu, 29 May 2008)
>
> Log Message:
> -----------
> Transform Orientations
>
> Edit Bone and Pose Bone can now be used as transform orientations
>
> Also fix a bug with CTO comming from non-uniformally scaled meshes.
I want to pick-up this for the 2.47, but I don't want break anything, so I
assume that only need the transpose change, right ?
>
> Modified Paths:
> --------------
> trunk/blender/source/blender/include/transform.h
> trunk/blender/source/blender/src/transform_manipulator.c
> trunk/blender/source/blender/src/transform_orientations.c
>
> Modified: trunk/blender/source/blender/include/transform.h
> ===================================================================
> --- trunk/blender/source/blender/include/transform.h 2008-05-29 14:23:08 UTC (rev 15049)
> +++ trunk/blender/source/blender/include/transform.h 2008-05-29 19:10:09 UTC (rev 15050)
> @@ -515,6 +515,7 @@
>
> int manageObjectSpace(int confirm, int set);
> int manageMeshSpace(int confirm, int set);
> +int manageBoneSpace(int confirm, int set);
>
> /* Those two fill in mat and return non-zero on success */
> int createSpaceNormal(float mat[3][3], float normal[3]);
>
> Modified: trunk/blender/source/blender/src/transform_manipulator.c
> ===================================================================
> --- trunk/blender/source/blender/src/transform_manipulator.c 2008-05-29 14:23:08 UTC (rev 15049)
> +++ trunk/blender/source/blender/src/transform_manipulator.c 2008-05-29 19:10:09 UTC (rev 15050)
> @@ -158,7 +158,7 @@
> }
>
> /* for pose mode */
> -static void stats_pose(View3D *v3d, bPoseChannel *pchan, float *normal, float *plane)
> +static void stats_pose(View3D *v3d, bPoseChannel *pchan)
> {
> Bone *bone= pchan->bone;
>
> @@ -166,9 +166,6 @@
> if (bone->flag & BONE_TRANSFORM) {
> calc_tw_center(pchan->pose_head);
> protectflag_to_drawflags(pchan->protectflag, &v3d->twdrawflag);
> -
> - VecAddf(normal, normal, pchan->pose_mat[2]);
> - VecAddf(plane, plane, pchan->pose_mat[1]);
> }
> }
> }
> @@ -349,26 +346,24 @@
> }
> }
> else if(ob && (ob->flag & OB_POSEMODE)) {
> - bArmature *arm= ob->data;
> + bArmature *arm = ob->data;
> bPoseChannel *pchan;
> int mode;
>
> if((ob->lay & G.vd->lay)==0) return 0;
>
> - mode= Trans.mode;
> - Trans.mode= TFM_ROTATION; // mislead counting bones... bah
> + mode = Trans.mode;
> + Trans.mode = TFM_ROTATION; // mislead counting bones... bah
>
> /* count total, we use same method as transform will do */
> Trans.total= 0;
> count_bone_select(&Trans, arm, &arm->bonebase, 1);
> - totsel= Trans.total;
> + totsel = Trans.total;
> if(totsel) {
> /* use channels to get stats */
> for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
> - stats_pose(v3d, pchan, normal, plane);
> + stats_pose(v3d, pchan);
> }
> - //VecMulf(normal, -1.0);
> - VecMulf(plane, -1.0);
>
> VecMulf(G.scene->twcent, 1.0f/(float)totsel); // centroid!
> Mat4MulVecfl(ob->obmat, G.scene->twcent);
> @@ -376,7 +371,7 @@
> Mat4MulVecfl(ob->obmat, G.scene->twmax);
> }
> /* restore, mode can be TFM_INIT */
> - Trans.mode= mode;
> + Trans.mode = mode;
> }
> else if(G.f & (G_VERTEXPAINT + G_TEXTUREPAINT + G_WEIGHTPAINT + G_SCULPTMODE)) {
> ;
> @@ -433,7 +428,7 @@
> break;
>
> case V3D_MANIP_NORMAL:
> - if(G.obedit) {
> + if(G.obedit || ob->flag & OB_POSEMODE) {
> float mat[3][3];
> int type;
>
> @@ -479,34 +474,6 @@
> }
> break;
> }
> - /* pose mode is a bit weird, so keep it separated */
> - else if (ob->flag & OB_POSEMODE)
> - {
> - strcpy(t->spacename, "normal");
> - if(normal[0]!=0.0 || normal[1]!=0.0 || normal[2]!=0.0) {
> - float imat[3][3], mat[3][3];
> -
> - /* we need the transpose of the inverse for a normal... */
> - Mat3CpyMat4(imat, ob->obmat);
> -
> - Mat3Inv(mat, imat);
> - Mat3Transp(mat);
> - Mat3MulVecfl(mat, normal);
> - Mat3MulVecfl(mat, plane);
> -
> - Normalize(normal);
> - if(0.0==Normalize(plane)) VECCOPY(plane, mat[1]);
> -
> - VECCOPY(mat[2], normal);
> - Crossf(mat[0], normal, plane);
> - Crossf(mat[1], mat[2], mat[0]);
> -
> - Mat4CpyMat3(v3d->twmat, mat);
> - Mat4Ortho(v3d->twmat);
> -
> - break;
> - }
> - }
> /* no break we define 'normal' as 'local' in Object mode */
> case V3D_MANIP_LOCAL:
> strcpy(t->spacename, "local");
>
> Modified: trunk/blender/source/blender/src/transform_orientations.c
> ===================================================================
> --- trunk/blender/source/blender/src/transform_orientations.c 2008-05-29 14:23:08 UTC (rev 15049)
> +++ trunk/blender/source/blender/src/transform_orientations.c 2008-05-29 19:10:09 UTC (rev 15050)
> @@ -27,6 +27,7 @@
> #include "MEM_guardedalloc.h"
>
> #include "DNA_armature_types.h"
> +#include "DNA_action_types.h"
> #include "DNA_curve_types.h"
> #include "DNA_listBase.h"
> #include "DNA_object_types.h"
> @@ -68,12 +69,18 @@
> }
>
> void BIF_manageTransformOrientation(int confirm, int set) {
> + Object *ob = OBACT;
> int index = -1;
>
> if (G.obedit) {
> if (G.obedit->type == OB_MESH)
> index = manageMeshSpace(confirm, set);
> + else if (G.obedit->type == OB_ARMATURE)
> + index = manageBoneSpace(confirm, set);
> }
> + else if (ob && (ob->flag & OB_POSEMODE)) {
> + index = manageBoneSpace(confirm, set);
> + }
> else {
> index = manageObjectSpace(confirm, set);
> }
> @@ -122,7 +129,32 @@
> }
> }
>
> +int manageBoneSpace(int confirm, int set) {
> + float mat[3][3];
> + float normal[3], plane[3];
> + char name[36] = "";
> + int index;
>
> + getTransformOrientation(normal, plane, 0);
> +
> + if (confirm == 0 && confirmSpace(set, "Bone") == 0) {
> + return -1;
> + }
> +
> + if (createSpaceNormalTangent(mat, normal, plane) == 0) {
> + error("Cannot use zero-length bone");
> + return -1;
> + }
> +
> + strcpy(name, "Bone");
> +
> + /* Input name */
> + sbutton(name, 1, 35, "name: ");
> +
> + index = addMatrixSpace(mat, name);
> + return index;
> +}
> +
> int manageMeshSpace(int confirm, int set) {
> float mat[3][3];
> float normal[3], plane[3];
> @@ -363,6 +395,29 @@
> }
> }
>
> +static int count_bone_select(bArmature *arm, ListBase *lb, int do_it)
> +{
> + Bone *bone;
> + int do_next;
> + int total = 0;
> +
> + for(bone= lb->first; bone; bone= bone->next) {
> + bone->flag &= ~BONE_TRANSFORM;
> + do_next = do_it;
> + if(do_it) {
> + if(bone->layer & arm->layer) {
> + if (bone->flag & BONE_SELECTED) {
> + bone->flag |= BONE_TRANSFORM;
> + total++;
> + do_next= 0; // no transform on children if one parent bone is selected
> + }
> + }
> + }
> + total += count_bone_select(arm, &bone->childbase, do_next);
> + }
> +
> + return total;
> +}
>
> int getTransformOrientation(float normal[3], float plane[3], int activeOnly)
> {
> @@ -375,6 +430,14 @@
>
---
> if(G.obedit)
> {
> + float imat[3][3], mat[3][3];
> +
> + /* we need the transpose of the inverse for a normal... */
> + Mat3CpyMat4(imat, ob->obmat);
> +
> + Mat3Inv(mat, imat);
> + Mat3Transp(mat);
> +
> ob= G.obedit;
>
> if(G.obedit->type==OB_MESH)
> @@ -639,12 +702,48 @@
> }
>
> }
> -
> - Mat4Mul3Vecfl(G.obedit->obmat, plane);
> - Mat4Mul3Vecfl(G.obedit->obmat, normal);
> +
> + /* Vectors from edges don't need the special transpose inverse multiplication */
> + if (result == ORIENTATION_EDGE)
> + {
> + Mat4Mul3Vecfl(ob->obmat, normal);
> + Mat4Mul3Vecfl(ob->obmat, plane);
> + }
> + else
> + {
> + Mat3MulVecfl(mat, normal);
> + Mat3MulVecfl(mat, plane);
> + }
---
> }
> else if(ob && (ob->flag & OB_POSEMODE))
> {
> + bArmature *arm= ob->data;
> + bPoseChannel *pchan;
> + int totsel;
> +
> + totsel = count_bone_select(arm, &arm->bonebase, 1);
> + if(totsel) {
> + float imat[3][3], mat[3][3];
> +
> + /* use channels to get stats */
> + for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
> + if (pchan->bone && pchan->bone->flag & BONE_TRANSFORM) {
> + VecAddf(normal, normal, pchan->pose_mat[2]);
> + VecAddf(plane, plane, pchan->pose_mat[1]);
> + }
> + }
> + VecMulf(plane, -1.0);
> +
> + /* we need the transpose of the inverse for a normal... */
> + Mat3CpyMat4(imat, ob->obmat);
> +
> + Mat3Inv(mat, imat);
> + Mat3Transp(mat);
> + Mat3MulVecfl(mat, normal);
> + Mat3MulVecfl(mat, plane);
> +
> + result = ORIENTATION_EDGE;
> + }
> }
> else if(G.f & (G_VERTEXPAINT + G_TEXTUREPAINT + G_WEIGHTPAINT + G_SCULPTMODE))
> {
>
>
> _______________________________________________
> Bf-blender-cvs mailing list
> Bf-blender-cvs at blender.org
> http://lists.blender.org/mailman/listinfo/bf-blender-cvs
>
--
Diego
More information about the Bf-committers
mailing list