diff options
Diffstat (limited to 'source/blender/src/transform.c')
-rwxr-xr-x | source/blender/src/transform.c | 401 |
1 files changed, 258 insertions, 143 deletions
diff --git a/source/blender/src/transform.c b/source/blender/src/transform.c index e6ee597db29..0d5868d9032 100755 --- a/source/blender/src/transform.c +++ b/source/blender/src/transform.c @@ -541,7 +541,6 @@ static void transformEvent(unsigned short event, short val) { setLocalConstraint(&Trans, (CON_AXIS2), "along local Z"); else if (Trans.mode==TFM_ROTATION) { restoreTransObjects(&Trans); - initTransModeFlags(&Trans, TFM_TRACKBALL); initTrackball(&Trans); } } @@ -578,7 +577,6 @@ static void transformEvent(unsigned short event, short val) { /* only switch when... */ if( ELEM3(Trans.mode, TFM_ROTATION, TFM_RESIZE, TFM_TRACKBALL) ) { restoreTransObjects(&Trans); - initTransModeFlags(&Trans, TFM_TRANSLATION); initTranslation(&Trans); Trans.redraw = 1; } @@ -587,7 +585,6 @@ static void transformEvent(unsigned short event, short val) { /* only switch when... */ if( ELEM3(Trans.mode, TFM_ROTATION, TFM_TRANSLATION, TFM_TRACKBALL) ) { restoreTransObjects(&Trans); - initTransModeFlags(&Trans, TFM_RESIZE); initResize(&Trans); Trans.redraw = 1; } @@ -598,12 +595,10 @@ static void transformEvent(unsigned short event, short val) { if (Trans.mode == TFM_ROTATION) { restoreTransObjects(&Trans); - initTransModeFlags(&Trans, TFM_TRACKBALL); initTrackball(&Trans); } else { restoreTransObjects(&Trans); - initTransModeFlags(&Trans, TFM_ROTATION); initRotation(&Trans); } Trans.redraw = 1; @@ -730,8 +725,48 @@ static void transformEvent(unsigned short event, short val) { // viewmoveNDOF(1); // break; } + + // Numerical input events Trans.redraw |= handleNumInput(&(Trans.num), event); + + // NDof input events + switch(handleNDofInput(&(Trans.ndof), event, val)) + { + case NDOF_CONFIRM: + if ((Trans.context & CTX_NDOF) == 0) + { + /* Confirm on normal transform only */ + Trans.state = TRANS_CONFIRM; + } + break; + case NDOF_CANCEL: + if (Trans.context & CTX_NDOF) + { + /* Cancel on pure NDOF transform */ + Trans.state = TRANS_CANCEL; + } + else + { + /* Otherwise, just redraw, NDof input was cancelled */ + Trans.redraw = 1; + } + break; + case NDOF_NOMOVE: + if (Trans.context & CTX_NDOF) + { + /* Confirm on pure NDOF transform */ + Trans.state = TRANS_CONFIRM; + } + break; + case NDOF_REFRESH: + Trans.redraw = 1; + break; + + } + + // Snapping events Trans.redraw |= handleSnapping(&Trans, event); + arrows_move_cursor(event); } else { @@ -757,6 +792,10 @@ static void transformEvent(unsigned short event, short val) { break; } } + + // Per transform event, if present + if (Trans.handleEvent) + Trans.redraw |= Trans.handleEvent(&Trans, event, val); } int calculateTransformCenter(int centerMode, float *vec) @@ -767,13 +806,13 @@ int calculateTransformCenter(int centerMode, float *vec) Trans.state = TRANS_RUNNING; Trans.context = CTX_NONE; + + Trans.mode = TFM_DUMMY; initTrans(&Trans); // internal data, mouse, vectors createTransData(&Trans); // make TransData structs from selection - initTransModeFlags(&Trans, TFM_DUMMY); // modal settings in struct Trans - Trans.around = centerMode; // override userdefined mode if (Trans.total == 0) { @@ -803,6 +842,8 @@ void initTransform(int mode, int context) { Trans.state = TRANS_RUNNING; Trans.context = context; + + Trans.mode = mode; initTrans(&Trans); // internal data, mouse, vectors @@ -813,8 +854,6 @@ void initTransform(int mode, int context) { else Mat3One(Trans.spacemtx); - initTransModeFlags(&Trans, mode); // modal settings in struct Trans - createTransData(&Trans); // make TransData structs from selection initSnapping(&Trans); // Initialize snapping data AFTER mode flags @@ -826,7 +865,7 @@ void initTransform(int mode, int context) { /* EVIL! posemode code can switch translation to rotate when 1 bone is selected. will be removed (ton) */ /* EVIL2: we gave as argument also texture space context bit... was cleared */ - mode= Trans.mode; + mode = Trans.mode; calculatePropRatio(&Trans); calculateCenter(&Trans); @@ -963,6 +1002,8 @@ void initManipulator(int mode) Trans.context = CTX_NONE; + Trans.mode = mode; + /* automatic switch to scaling bone envelopes */ if(mode==TFM_RESIZE && G.obedit && G.obedit->type==OB_ARMATURE) { bArmature *arm= G.obedit->data; @@ -972,8 +1013,6 @@ void initManipulator(int mode) initTrans(&Trans); // internal data, mouse, vectors - initTransModeFlags(&Trans, mode); // modal settings in struct Trans - G.moving |= G_TRANSFORM_MANIP; // signal to draw manipuls while transform createTransData(&Trans); // make TransData structs from selection @@ -984,7 +1023,7 @@ void initManipulator(int mode) /* EVIL! posemode code can switch translation to rotate when 1 bone is selected. will be removed (ton) */ /* EVIL2: we gave as argument also texture space context bit... was cleared */ - mode= Trans.mode; + mode = Trans.mode; calculatePropRatio(&Trans); calculateCenter(&Trans); @@ -1182,20 +1221,24 @@ static void protectedQuaternionBits(short protectflag, float *quat, float *oldqu /* ************************** WARP *************************** */ -/* warp is done fully in view space */ void initWarp(TransInfo *t) { float max[3], min[3]; int i; - calculateCenterCursor(t); + t->mode = TFM_WARP; + t->transform = Warp; + t->idx_max = 0; t->num.idx_max = 0; - t->transform = Warp; t->snap[0] = 0.0f; t->snap[1] = 5.0f; t->snap[2] = 1.0f; + t->flag |= T_NO_CONSTRAINT; + +/* warp is done fully in view space */ + calculateCenterCursor(t); t->fac = (float)(t->center2d[0] - t->imval[0]); /* we need min/max in view space */ @@ -1220,7 +1263,6 @@ void initWarp(TransInfo *t) t->val= (max[0]-min[0])/2.0f; // t->val is free variable } - int Warp(TransInfo *t, short mval[2]) { TransData *td = t->data; @@ -1318,14 +1360,38 @@ int Warp(TransInfo *t, short mval[2]) void initShear(TransInfo *t) { + t->mode = TFM_SHEAR; + t->transform = Shear; + t->handleEvent = handleEventShear; + t->idx_max = 0; t->num.idx_max = 0; t->snap[0] = 0.0f; t->snap[1] = 0.1f; t->snap[2] = t->snap[1] * 0.1f; - t->transform = Shear; + + t->flag |= T_NO_CONSTRAINT; } +int handleEventShear(TransInfo *t, unsigned short event, short val) +{ + int status = 0; + + if (event == MIDDLEMOUSE && val) + { + // Use customData pointer to signal Shear direction + if (t->customData == 0) + t->customData = (void*)1; + else + t->customData = 0; + + status = 1; + } + + return status; +} + + int Shear(TransInfo *t, short mval[2]) { TransData *td = t->data; @@ -1338,7 +1404,11 @@ int Shear(TransInfo *t, short mval[2]) Mat3CpyMat4(persmat, t->viewmat); Mat3Inv(persinv, persmat); - value = 0.05f * InputHorizontalAbsolute(t, mval); + // Custom data signals shear direction + if (t->customData == 0) + value = 0.05f * InputHorizontalAbsolute(t, mval); + else + value = 0.05f * InputVerticalAbsolute(t, mval); snapGrid(t, &value); @@ -1358,7 +1428,13 @@ int Shear(TransInfo *t, short mval[2]) } Mat3One(smat); - smat[1][0] = value; + + // Custom data signals shear direction + if (t->customData == 0) + smat[1][0] = value; + else + smat[0][1] = value; + Mat3MulMat3(tmat, smat, persmat); Mat3MulMat3(totmat, persinv, tmat); @@ -1401,6 +1477,23 @@ int Shear(TransInfo *t, short mval[2]) void initResize(TransInfo *t) { + t->mode = TFM_RESIZE; + t->transform = Resize; + + t->flag |= T_NULL_ONE; + t->num.flag |= NUM_NULL_ONE; + t->num.flag |= NUM_AFFECT_ALL; + if (!G.obedit) { + t->flag |= T_NO_ZERO; + t->num.flag |= NUM_NO_ZERO; + } + + t->idx_max = 2; + t->num.idx_max = 2; + t->snap[0] = 0.0f; + t->snap[1] = 0.1f; + t->snap[2] = t->snap[1] * 0.1f; + t->fac = (float)sqrt( ( ((float)(t->center2d[1] - t->imval[1]))*((float)(t->center2d[1] - t->imval[1])) @@ -1409,13 +1502,6 @@ void initResize(TransInfo *t) ) ); if(t->fac==0.0f) t->fac= 1.0f; // prevent Inf - - t->idx_max = 2; - t->num.idx_max = 2; - t->snap[0] = 0.0f; - t->snap[1] = 0.1f; - t->snap[2] = t->snap[1] * 0.1f; - t->transform = Resize; } static void headerResize(TransInfo *t, float vec[3], char *str) { @@ -1667,22 +1753,25 @@ void initToSphere(TransInfo *t) TransData *td = t->data; int i; - // Calculate average radius - for(i = 0 ; i < t->total; i++, td++) { - t->val += VecLenf(t->center, td->iloc); - } - - t->val /= (float)t->total; + t->mode = TFM_TOSPHERE; + t->transform = ToSphere; t->idx_max = 0; t->num.idx_max = 0; t->snap[0] = 0.0f; t->snap[1] = 0.1f; t->snap[2] = t->snap[1] * 0.1f; - t->transform = ToSphere; -} + + t->num.flag |= NUM_NULL_ONE | NUM_NO_NEGATIVE; + t->flag |= T_NO_CONSTRAINT; + // Calculate average radius + for(i = 0 ; i < t->total; i++, td++) { + t->val += VecLenf(t->center, td->iloc); + } + t->val /= (float)t->total; +} int ToSphere(TransInfo *t, short mval[2]) { @@ -1747,13 +1836,19 @@ int ToSphere(TransInfo *t, short mval[2]) void initRotation(TransInfo *t) { + t->mode = TFM_ROTATION; + t->transform = Rotation; + + t->ndof.axis = 16; + /* Scale down and flip input for rotation */ + t->ndof.factor[0] = -0.2f; + t->idx_max = 0; t->num.idx_max = 0; t->snap[0] = 0.0f; t->snap[1] = (float)((5.0/180)*M_PI); t->snap[2] = t->snap[1] * 0.2f; t->fac = 0; - t->transform = Rotation; } static void ElementRotation(TransInfo *t, TransData *td, float mat[3][3]) { @@ -2004,6 +2099,8 @@ int Rotation(TransInfo *t, short mval[2]) final = t->fac; + applyNDofInput(&t->ndof, &final); + snapGrid(t, &final); t->imval[0] = mval[0]; @@ -2060,15 +2157,22 @@ int Rotation(TransInfo *t, short mval[2]) void initTrackball(TransInfo *t) { + t->mode = TFM_TRACKBALL; + t->transform = Trackball; + + t->ndof.axis = 40; + /* Scale down input for rotation */ + t->ndof.factor[0] = 0.2f; + t->ndof.factor[1] = 0.2f; + t->idx_max = 1; t->num.idx_max = 1; t->snap[0] = 0.0f; t->snap[1] = (float)((5.0/180)*M_PI); t->snap[2] = t->snap[1] * 0.2f; t->fac = 0; - t->transform = Trackball; - t->flag |= T_NO_CONSTRAINT; /* making sure the flag is always set */ + t->flag |= T_NO_CONSTRAINT; } static void applyTrackball(TransInfo *t, float axis1[3], float axis2[3], float angles[2]) @@ -2121,6 +2225,8 @@ int Trackball(TransInfo *t, short mval[2]) //if(G.qual & LR_SHIFTKEY) t->fac += dphi/30.0f; //else t->fac += dphi; + applyNDofInput(&t->ndof, phi); + snapGrid(t, phi); if (hasNumInput(&t->num)) { @@ -2163,10 +2269,15 @@ int Trackball(TransInfo *t, short mval[2]) void initTranslation(TransInfo *t) { + t->mode = TFM_TRANSLATION; + t->transform = Translation; + t->idx_max = (t->flag & T_2D_EDIT)? 1: 2; + t->num.flag = 0; t->num.idx_max = t->idx_max; - t->transform = Translation; + t->ndof.axis = 7; + if(t->spacetype == SPACE_VIEW3D) { /* initgrabz() defines a factor for perspective depth correction, used in window_to_3d() */ if(t->flag & (T_EDIT|T_POSE)) { @@ -2177,7 +2288,9 @@ void initTranslation(TransInfo *t) Mat4MulVecfl(ob->obmat, vec); initgrabz(vec[0], vec[1], vec[2]); } - else initgrabz(t->center[0], t->center[1], t->center[2]); + else { + initgrabz(t->center[0], t->center[1], t->center[2]); + } t->snap[0] = 0.0f; t->snap[1] = G.vd->gridview * 1.0f; @@ -2295,6 +2408,7 @@ int Translation(TransInfo *t, short mval[2]) headerTranslation(t, pvec, str); } else { + applyNDofInput(&t->ndof, t->vec); snapGrid(t, t->vec); applyNumInput(&t->num, t->vec); applySnapping(t, t->vec); @@ -2322,18 +2436,22 @@ int Translation(TransInfo *t, short mval[2]) void initShrinkFatten(TransInfo *t) { + // If not in mesh edit mode, fallback to Resize if (G.obedit==NULL || G.obedit->type != OB_MESH) { - initTransModeFlags(t, TFM_RESIZE); initResize(t); - return; } - - t->idx_max = 0; - t->num.idx_max = 0; - t->snap[0] = 0.0f; - t->snap[1] = 1.0f; - t->snap[2] = t->snap[1] * 0.1f; - t->transform = ShrinkFatten; + else { + t->mode = TFM_SHRINKFATTEN; + t->transform = ShrinkFatten; + + t->idx_max = 0; + t->num.idx_max = 0; + t->snap[0] = 0.0f; + t->snap[1] = 1.0f; + t->snap[2] = t->snap[1] * 0.1f; + + t->flag |= T_NO_CONSTRAINT; + } } @@ -2390,13 +2508,21 @@ int ShrinkFatten(TransInfo *t, short mval[2]) void initTilt(TransInfo *t) { + t->mode = TFM_TILT; + t->transform = Tilt; + + t->ndof.axis = 16; + /* Scale down and flip input for rotation */ + t->ndof.factor[0] = -0.2f; + t->idx_max = 0; t->num.idx_max = 0; t->snap[0] = 0.0f; t->snap[1] = (float)((5.0/180)*M_PI); t->snap[2] = t->snap[1] * 0.2f; t->fac = 0; - t->transform = Tilt; + + t->flag |= T_NO_CONSTRAINT; } @@ -2432,6 +2558,8 @@ int Tilt(TransInfo *t, short mval[2]) else t->fac += dphi; final = t->fac; + + applyNDofInput(&t->ndof, &final); snapGrid(t, &final); @@ -2539,12 +2667,17 @@ int CurveShrinkFatten(TransInfo *t, short mval[2]) void initCurveShrinkFatten(TransInfo *t) { + t->mode = TFM_CURVE_SHRINKFATTEN; + t->transform = CurveShrinkFatten; + t->idx_max = 0; t->num.idx_max = 0; t->snap[0] = 0.0f; t->snap[1] = 0.1f; t->snap[2] = t->snap[1] * 0.1f; - t->transform = CurveShrinkFatten; + + t->flag |= T_NO_CONSTRAINT; + t->fac = (float)sqrt( ( ((float)(t->center2d[1] - t->imval[1]))*((float)(t->center2d[1] - t->imval[1])) + @@ -2556,16 +2689,21 @@ void initCurveShrinkFatten(TransInfo *t) void initPushPull(TransInfo *t) { + t->mode = TFM_PUSHPULL; + t->transform = PushPull; + + t->ndof.axis = 4; + /* Flip direction */ + t->ndof.factor[0] = -1.0f; + t->idx_max = 0; t->num.idx_max = 0; t->snap[0] = 0.0f; t->snap[1] = 1.0f; t->snap[2] = t->snap[1] * 0.1f; - t->transform = PushPull; } - int PushPull(TransInfo *t, short mval[2]) { float vec[3], axis[3]; @@ -2575,6 +2713,8 @@ int PushPull(TransInfo *t, short mval[2]) TransData *td = t->data; distance = InputVerticalAbsolute(t, mval); + + applyNDofInput(&t->ndof, &distance); snapGrid(t, &distance); @@ -2633,12 +2773,17 @@ int PushPull(TransInfo *t, short mval[2]) void initCrease(TransInfo *t) { + t->mode = TFM_CREASE; + t->transform = Crease; + t->idx_max = 0; t->num.idx_max = 0; t->snap[0] = 0.0f; t->snap[1] = 0.1f; t->snap[2] = t->snap[1] * 0.1f; - t->transform = Crease; + + t->flag |= T_NO_CONSTRAINT; + t->fac = (float)sqrt( ( ((float)(t->center2d[1] - t->imval[1]))*((float)(t->center2d[1] - t->imval[1])) @@ -2726,12 +2871,17 @@ int Crease(TransInfo *t, short mval[2]) void initBoneSize(TransInfo *t) { + t->mode = TFM_BONESIZE; + t->transform = BoneSize; + t->idx_max = 0; t->num.idx_max = 0; t->snap[0] = 0.0f; t->snap[1] = 0.1f; t->snap[2] = t->snap[1] * 0.1f; - t->transform = BoneSize; + + t->flag |= T_NO_CONSTRAINT; + t->fac = (float)sqrt( ( ((float)(t->center2d[1] - t->imval[1]))*((float)(t->center2d[1] - t->imval[1])) + @@ -2840,12 +2990,17 @@ int BoneSize(TransInfo *t, short mval[2]) void initBoneEnvelope(TransInfo *t) { + t->mode = TFM_BONE_ENVELOPE; + t->transform = BoneEnvelope; + t->idx_max = 0; t->num.idx_max = 0; t->snap[0] = 0.0f; t->snap[1] = 0.1f; t->snap[2] = t->snap[1] * 0.1f; - t->transform = BoneEnvelope; + + t->flag |= T_NO_CONSTRAINT; + t->fac = (float)sqrt( ( ((float)(t->center2d[1] - t->imval[1]))*((float)(t->center2d[1] - t->imval[1])) + @@ -2917,6 +3072,9 @@ int BoneEnvelope(TransInfo *t, short mval[2]) void initBoneRoll(TransInfo *t) { + t->mode = TFM_BONE_ROLL; + t->transform = BoneRoll; + t->idx_max = 0; t->num.idx_max = 0; t->snap[0] = 0.0f; @@ -2925,7 +3083,7 @@ void initBoneRoll(TransInfo *t) t->fac = 0.0f; - t->transform = BoneRoll; + t->flag |= T_NO_CONSTRAINT; } int BoneRoll(TransInfo *t, short mval[2]) @@ -3017,8 +3175,6 @@ void Mirror(short mode) Mat3CpyMat4(matview, Trans.viewinv); // t->viewinv was set in initTrans Mat3Ortho(matview); - initTransModeFlags(&Trans, TFM_MIRROR); // modal settings in struct Trans - createTransData(&Trans); // make TransData structs from selection calculatePropRatio(&Trans); @@ -3106,92 +3262,51 @@ void BIF_TransformSetUndo(char *str) Trans.undostr= str; } -void ndof_do_transform(float *fval) -{ - char str[200]; - float fvec[3] = {0.0,0.0,0.0}; - char change = 0; - -// fprintf(stderr,"passing here %f %f %f \n",fval[3],fval[4],fval[5]); - - if (fval[3] != 0.0 ) { - fvec[0] = 1.0; - initTransform(TFM_ROTATION, CTX_NONE); - applyRotation(&Trans, fval[3], fvec); - recalcData(&Trans); - change =1; - fvec[0] = 0.0; - drawSnapping(&Trans); - /* free data */ - postTrans(&Trans); - - /* aftertrans does insert ipos and action channels, and clears base flags, doesnt read transdata */ - special_aftertrans_update(&Trans); - - } - if (fval[4] != 0.0 ) { - fvec[1] = 1.0; - initTransform(TFM_ROTATION, CTX_NONE); - applyRotation(&Trans, fval[4], fvec); - recalcData(&Trans); - change =1; - fvec[1] = 0.0; - drawSnapping(&Trans); - /* free data */ - postTrans(&Trans); - - /* aftertrans does insert ipos and action channels, and clears base flags, doesnt read transdata */ - special_aftertrans_update(&Trans); - - } - if (fval[5] != 0.0 ) { - fvec[2] = 1.0; - initTransform(TFM_ROTATION, CTX_NONE); - applyRotation(&Trans, fval[5], fvec); - recalcData(&Trans); - change =1; - fvec[2] = 0.0; - drawSnapping(&Trans); - /* free data */ - postTrans(&Trans); - - /* aftertrans does insert ipos and action channels, and clears base flags, doesnt read transdata */ - special_aftertrans_update(&Trans); - +void NDofTransform() +{ + float fval[7]; + float maxval = 50.0f; // also serves as threshold + int axis = -1; + int mode = 0; + int i; + + getndof(fval); + + for(i = 0; i < 7; i++) + { + float val = fabs(fval[i]); + if (val > maxval) + { + axis = i; + maxval = val; + } } + switch(axis) + { + case -1: + /* No proper axis found */ + break; + case 0: + case 1: + case 2: + mode = TFM_TRANSLATION; + break; + case 4: + mode = TFM_ROTATION; + break; + case 3: + case 5: + mode = TFM_TRACKBALL; + break; + default: + printf("ndof transform mode not impremented yet"); + } - if ((fval[0] != 0.0 )|( fval[1] != 0.0 )| (fval[2] != 0.0)) { - initTransform(TFM_TRANSLATION, CTX_NONE); - Trans.vec[0] = fval[0]; - Trans.vec[1] = fval[1]; - Trans.vec[2] = fval[2]; - - applyTranslation(&Trans, Trans.vec); - - /* evil hack - redo translation if cliiping needeed */ - if (Trans.flag & T_CLIP_UV && clipUVTransform(&Trans, Trans.vec, 0)) - applyTranslation(&Trans, Trans.vec); - - recalcData(&Trans); - change =1; - drawSnapping(&Trans); - /* free data */ - postTrans(&Trans); - - /* aftertrans does insert ipos and action channels, and clears base flags, doesnt read transdata */ - special_aftertrans_update(&Trans); - + if (mode != 0) + { + initTransform(mode, CTX_NDOF); + Transform(); } - - /* send events out for redraws */ - viewRedrawPost(&Trans); - - if(Trans.undostr) BIF_undo_push(Trans.undostr); - else BIF_undo_push(transform_to_undostr(&Trans)); - - Trans.undostr= NULL; - - -}
\ No newline at end of file +} |