Made warp use TransData members instead of G.obedit. Made it work with PET and Objects at the same time.

This commit is contained in:
2005-03-13 02:15:32 +00:00
parent 597cbb1b4f
commit 7d520a16c4
2 changed files with 33 additions and 28 deletions

View File

@@ -1614,7 +1614,7 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
case WKEY: case WKEY:
if((G.qual==LR_SHIFTKEY)) { if((G.qual==LR_SHIFTKEY)) {
#ifdef NEWTRANSFORM #ifdef NEWTRANSFORM
if(G.obedit) Transform(TFM_WARP); Transform(TFM_WARP);
#else #else
transform('w'); transform('w');
#endif #endif

View File

@@ -1500,9 +1500,12 @@ void initWarp(TransInfo *t)
VECCOPY(min, t->data[i].center); VECCOPY(min, t->data[i].center);
} }
} }
Mat4MulVecfl(G.obedit->obmat, min);
if (t->flag & T_EDIT) {
Mat3MulVecfl(G.obedit->obmat, min);
Mat3MulVecfl(G.obedit->obmat, max);
}
Mat4MulVecfl(G.vd->viewmat, min); Mat4MulVecfl(G.vd->viewmat, min);
Mat4MulVecfl(G.obedit->obmat, max);
Mat4MulVecfl(G.vd->viewmat, max); Mat4MulVecfl(G.vd->viewmat, max);
t->center[0]= (min[0]+max[0])/2.0f; t->center[0]= (min[0]+max[0])/2.0f;
@@ -1511,7 +1514,6 @@ void initWarp(TransInfo *t)
t->val= (max[0]-min[0])/2.0f; // t->val is free variable t->val= (max[0]-min[0])/2.0f; // t->val is free variable
Mat4Invert(G.obedit->imat, G.obedit->obmat);
} }
@@ -1549,32 +1551,35 @@ int Warp(TransInfo *t, short mval[2])
circumfac*= (float)(-M_PI/360.0); circumfac*= (float)(-M_PI/360.0);
for(i = 0 ; i < t->total; i++, td++) { for(i = 0 ; i < t->total; i++, td++) {
float loc[3];
if (td->flag & TD_NOACTION) if (td->flag & TD_NOACTION)
continue; continue;
else {
/* translate point to centre, rotate in such a way that outline==distance */ /* translate point to centre, rotate in such a way that outline==distance */
VECCOPY(vec, td->iloc); VECCOPY(vec, td->iloc);
Mat4MulVecfl(G.obedit->obmat, vec); Mat3MulVecfl(td->smtx, vec);
Mat4MulVecfl(G.vd->viewmat, vec); Mat4MulVecfl(G.vd->viewmat, vec);
dist= vec[0]-cursor[0]; dist= vec[0]-cursor[0];
phi0= (circumfac*dist/t->val); // t->val is X dimension projected boundbox phi0= (circumfac*dist/t->val); // t->val is X dimension projected boundbox
vec[0]= (-cursor[0]); vec[0]= (-cursor[0]);
vec[1]= (vec[1]-cursor[1]); vec[1]= (vec[1]-cursor[1]);
co= (float)cos(phi0); co= (float)cos(phi0);
si= (float)sin(phi0); si= (float)sin(phi0);
td->loc[0]= co*vec[0]-si*vec[1]+cursor[0]; loc[0]= co*vec[0]-si*vec[1]+cursor[0];
td->loc[1]= si*vec[0]+co*vec[1]+cursor[1]; loc[1]= si*vec[0]+co*vec[1]+cursor[1];
td->loc[2]= vec[2]; loc[2]= vec[2];
Mat4MulVecfl(G.vd->viewinv, td->loc); Mat4MulVecfl(G.vd->viewinv, loc);
Mat4MulVecfl(G.obedit->imat, td->loc); Mat3MulVecfl(td->mtx, loc);
} VecSubf(loc, loc, td->iloc);
VecMulf(loc, td->factor);
VecAddf(td->loc, td->iloc, loc);
} }
recalcData(t); recalcData(t);