Push/Pull (aka: non proportionnal resize, original idea by Robert Tiess) slipped in my last commit a bit, so might as well finish it.
Accesible with Shift-P (was free), the behavior is much like Shrink/Fatten. Pull mouse toward you to pull toward center, push away to push away. Constraint and PET works with it too, of course.
This commit is contained in:
@@ -45,9 +45,9 @@
|
|||||||
#define TFM_WARP 7
|
#define TFM_WARP 7
|
||||||
#define TFM_SHRINKFATTEN 8
|
#define TFM_SHRINKFATTEN 8
|
||||||
#define TFM_TILT 9
|
#define TFM_TILT 9
|
||||||
|
|
||||||
#define TFM_LAMP_ENERGY 10
|
#define TFM_LAMP_ENERGY 10
|
||||||
#define TFM_TRACKBALL 11
|
#define TFM_TRACKBALL 11
|
||||||
|
#define TFM_PUSHPULL 12
|
||||||
|
|
||||||
/* TRANSFORM CONTEXTS */
|
/* TRANSFORM CONTEXTS */
|
||||||
#define CTX_NONE 0
|
#define CTX_NONE 0
|
||||||
|
|||||||
@@ -1447,7 +1447,6 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case PKEY:
|
case PKEY:
|
||||||
|
|
||||||
if(G.obedit) {
|
if(G.obedit) {
|
||||||
if(G.qual==LR_CTRLKEY || G.qual==(LR_SHIFTKEY|LR_CTRLKEY))
|
if(G.qual==LR_CTRLKEY || G.qual==(LR_SHIFTKEY|LR_CTRLKEY))
|
||||||
make_parent();
|
make_parent();
|
||||||
@@ -1455,9 +1454,13 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
|
|||||||
separatemenu();
|
separatemenu();
|
||||||
else if ((G.qual==0) && ELEM(G.obedit->type, OB_CURVE, OB_SURF))
|
else if ((G.qual==0) && ELEM(G.obedit->type, OB_CURVE, OB_SURF))
|
||||||
separate_nurb();
|
separate_nurb();
|
||||||
|
else if (G.qual==LR_SHIFTKEY)
|
||||||
|
Transform(TFM_PUSHPULL, CTX_NONE);
|
||||||
}
|
}
|
||||||
else if(G.qual==LR_CTRLKEY || G.qual==(LR_SHIFTKEY|LR_CTRLKEY))
|
else if(G.qual==LR_CTRLKEY || G.qual==(LR_SHIFTKEY|LR_CTRLKEY))
|
||||||
make_parent();
|
make_parent();
|
||||||
|
else if(G.qual==LR_SHIFTKEY)
|
||||||
|
Transform(TFM_PUSHPULL, CTX_NONE);
|
||||||
else if(G.qual==LR_ALTKEY)
|
else if(G.qual==LR_ALTKEY)
|
||||||
clear_parent();
|
clear_parent();
|
||||||
else if((G.qual==0)) {
|
else if((G.qual==0)) {
|
||||||
|
|||||||
@@ -1556,6 +1556,9 @@ void Transform(int mode, int context)
|
|||||||
case TFM_TRACKBALL:
|
case TFM_TRACKBALL:
|
||||||
initTrackball(&Trans);
|
initTrackball(&Trans);
|
||||||
break;
|
break;
|
||||||
|
case TFM_PUSHPULL:
|
||||||
|
initPushPull(&Trans);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
initConstraint(&Trans);
|
initConstraint(&Trans);
|
||||||
@@ -3091,14 +3094,14 @@ void initPushPull(TransInfo *t)
|
|||||||
t->snap[0] = 0.0f;
|
t->snap[0] = 0.0f;
|
||||||
t->snap[1] = 1.0f;
|
t->snap[1] = 1.0f;
|
||||||
t->snap[2] = t->snap[1] * 0.1f;
|
t->snap[2] = t->snap[1] * 0.1f;
|
||||||
t->transform = ShrinkFatten;
|
t->transform = PushPull;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int PushPull(TransInfo *t, short mval[2])
|
int PushPull(TransInfo *t, short mval[2])
|
||||||
{
|
{
|
||||||
float vec[3];
|
float vec[3], axis[3];
|
||||||
float distance;
|
float distance;
|
||||||
int i;
|
int i;
|
||||||
char str[50];
|
char str[50];
|
||||||
@@ -3125,6 +3128,9 @@ int PushPull(TransInfo *t, short mval[2])
|
|||||||
sprintf(str, "Push/Pull: %.4f%s %s", distance, t->con.text, t->proptext);
|
sprintf(str, "Push/Pull: %.4f%s %s", distance, t->con.text, t->proptext);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (t->con.applyRot) {
|
||||||
|
t->con.applyRot(t, NULL, axis);
|
||||||
|
}
|
||||||
|
|
||||||
for(i = 0 ; i < t->total; i++, td++) {
|
for(i = 0 ; i < t->total; i++, td++) {
|
||||||
if (td->flag & TD_NOACTION)
|
if (td->flag & TD_NOACTION)
|
||||||
@@ -3132,7 +3138,6 @@ int PushPull(TransInfo *t, short mval[2])
|
|||||||
|
|
||||||
VecSubf(vec, t->center, td->center);
|
VecSubf(vec, t->center, td->center);
|
||||||
if (t->con.applyRot) {
|
if (t->con.applyRot) {
|
||||||
float axis[3];
|
|
||||||
t->con.applyRot(t, td, axis);
|
t->con.applyRot(t, td, axis);
|
||||||
Projf(vec, vec, axis);
|
Projf(vec, vec, axis);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -206,6 +206,9 @@ int Tilt(TransInfo *t, short mval[2]);
|
|||||||
void initTrackball(TransInfo *t);
|
void initTrackball(TransInfo *t);
|
||||||
int Trackball(TransInfo *t, short mval[2]);
|
int Trackball(TransInfo *t, short mval[2]);
|
||||||
|
|
||||||
|
void initPushPull(TransInfo *t);
|
||||||
|
int PushPull(TransInfo *t, short mval[2]);
|
||||||
|
|
||||||
/* exported from transform.c */
|
/* exported from transform.c */
|
||||||
struct ListBase;
|
struct ListBase;
|
||||||
void count_bone_select(struct ListBase *lb, int *counter);
|
void count_bone_select(struct ListBase *lb, int *counter);
|
||||||
|
|||||||
Reference in New Issue
Block a user