diff options
author | Martin Poirier <theeth@yahoo.com> | 2009-07-12 06:01:13 +0400 |
---|---|---|
committer | Martin Poirier <theeth@yahoo.com> | 2009-07-12 06:01:13 +0400 |
commit | 8b9bb47a3faf753cb0ca2ec0e9c6a741c7af31c2 (patch) | |
tree | b3057453770db9d237c9b204c192bec07fd91e90 /source/blender/editors/transform/transform_generics.c | |
parent | 42469ba1e51c639c3fd317b812c486913d803fde (diff) |
Cleaning up manipulator code a bit
Made transform confirm or cancel on mouse up. More inline with button clicking and better for tablets.
Add operator params to make sure Rip and Extrude turn off PET and Mirror correctly.
Note: sorry for all the whitespace changes, I need to reconfigure this editor not to do autocleanup.
Diffstat (limited to 'source/blender/editors/transform/transform_generics.c')
-rw-r--r-- | source/blender/editors/transform/transform_generics.c | 316 |
1 files changed, 154 insertions, 162 deletions
diff --git a/source/blender/editors/transform/transform_generics.c b/source/blender/editors/transform/transform_generics.c index 3415c266cf1..af56079727f 100644 --- a/source/blender/editors/transform/transform_generics.c +++ b/source/blender/editors/transform/transform_generics.c @@ -154,8 +154,8 @@ static void clipMirrorModifier(TransInfo *t, Object *ob) for (; md; md=md->next) { if (md->type==eModifierType_Mirror) { - MirrorModifierData *mmd = (MirrorModifierData*) md; - + MirrorModifierData *mmd = (MirrorModifierData*) md; + if(mmd->flag & MOD_MIR_CLIPPING) { axis = 0; if(mmd->flag & MOD_MIR_AXIS_X) { @@ -174,7 +174,7 @@ static void clipMirrorModifier(TransInfo *t, Object *ob) float mtx[4][4], imtx[4][4]; int i; TransData *td = t->data; - + if (mmd->mirror_ob) { float obinv[4][4]; @@ -191,10 +191,10 @@ static void clipMirrorModifier(TransInfo *t, Object *ob) break; if (td->loc==NULL) break; - + if (td->flag & TD_SKIP) continue; - + VecCopyf(loc, td->loc); VecCopyf(iloc, td->iloc); @@ -205,22 +205,22 @@ static void clipMirrorModifier(TransInfo *t, Object *ob) clip = 0; if(axis & 1) { - if(fabs(iloc[0])<=tolerance[0] || + if(fabs(iloc[0])<=tolerance[0] || loc[0]*iloc[0]<0.0f) { loc[0]= 0.0f; clip = 1; } } - + if(axis & 2) { - if(fabs(iloc[1])<=tolerance[1] || + if(fabs(iloc[1])<=tolerance[1] || loc[1]*iloc[1]<0.0f) { loc[1]= 0.0f; clip = 1; } } if(axis & 4) { - if(fabs(iloc[2])<=tolerance[2] || + if(fabs(iloc[2])<=tolerance[2] || loc[2]*iloc[2]<0.0f) { loc[2]= 0.0f; clip = 1; @@ -246,7 +246,7 @@ static void editmesh_apply_to_mirror(TransInfo *t) TransData *td = t->data; EditVert *eve; int i; - + for(i = 0 ; i < t->total; i++, td++) { if (td->flag & TD_NOACTION) break; @@ -254,14 +254,14 @@ static void editmesh_apply_to_mirror(TransInfo *t) break; if (td->flag & TD_SKIP) continue; - + eve = td->extra; if(eve) { eve->co[0]= -td->loc[0]; eve->co[1]= td->loc[1]; eve->co[2]= td->loc[2]; - } - } + } + } } /* called for updating while transform acts, once per redraw */ @@ -269,7 +269,7 @@ void recalcData(TransInfo *t) { Scene *scene = t->scene; Base *base; - + if (t->obedit) { } else if(G.f & G_PARTICLEEDIT) { @@ -284,56 +284,56 @@ void recalcData(TransInfo *t) else if (t->spacetype == SPACE_IPO) { SpaceIpo *sipo= (SpaceIpo *)t->sa->spacedata.first; Scene *scene; - + ListBase anim_data = {NULL, NULL}; bAnimContext ac; int filter; - + bAnimListElem *ale; int dosort = 0; - - + + /* initialise relevant anim-context 'context' data from TransInfo data */ /* NOTE: sync this with the code in ANIM_animdata_get_context() */ memset(&ac, 0, sizeof(bAnimContext)); - + scene= ac.scene= t->scene; ac.obact= OBACT; ac.sa= t->sa; ac.ar= t->ar; ac.spacetype= (t->sa)? t->sa->spacetype : 0; ac.regiontype= (t->ar)? t->ar->regiontype : 0; - + ANIM_animdata_context_getdata(&ac); - + /* do the flush first */ flushTransGraphData(t); - + /* get curves to check if a re-sort is needed */ filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY | ANIMFILTER_CURVEVISIBLE); ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype); - + /* now test if there is a need to re-sort */ for (ale= anim_data.first; ale; ale= ale->next) { FCurve *fcu= (FCurve *)ale->key_data; - + /* watch it: if the time is wrong: do not correct handles yet */ if (test_time_fcurve(fcu)) dosort++; else calchandles_fcurve(fcu); } - + /* do resort and other updates? */ if (dosort) remake_graph_transdata(t, &anim_data); //if (sipo->showkey) update_ipokey_val(); - + /* now free temp channels */ BLI_freelistN(&anim_data); - + /* update realtime - not working? */ if (sipo->lock) { - + } } else if (t->spacetype == SPACE_NLA) { @@ -342,8 +342,8 @@ void recalcData(TransInfo *t) Scene *scene= t->scene; double secf= FPS; int i; - - /* for each strip we've got, perform some additional validation of the values that got set before + + /* for each strip we've got, perform some additional validation of the values that got set before * using RNA to set the value (which does some special operations when setting these values to make * sure that everything works ok) */ @@ -352,43 +352,43 @@ void recalcData(TransInfo *t) PointerRNA strip_ptr; short pExceeded, nExceeded, iter; int delta_y1, delta_y2; - + /* if this tdn has no handles, that means it is just a dummy that should be skipped */ if (tdn->handle == 0) continue; - + /* if cancelling transform, just write the values without validating, then move on */ if (t->state == TRANS_CANCEL) { - /* clear the values by directly overwriting the originals, but also need to restore + /* clear the values by directly overwriting the originals, but also need to restore * endpoints of neighboring transition-strips */ - + /* start */ strip->start= tdn->h1[0]; - + if ((strip->prev) && (strip->prev->type == NLASTRIP_TYPE_TRANSITION)) strip->prev->end= tdn->h1[0]; - + /* end */ strip->end= tdn->h2[0]; - + if ((strip->next) && (strip->next->type == NLASTRIP_TYPE_TRANSITION)) strip->next->start= tdn->h2[0]; - + /* flush transforms to child strips (since this should be a meta) */ BKE_nlameta_flush_transforms(strip); - + /* restore to original track (if needed) */ if (tdn->oldTrack != tdn->nlt) { /* just append to end of list for now, since strips get sorted in special_aftertrans_update() */ BLI_remlink(&tdn->nlt->strips, strip); BLI_addtail(&tdn->oldTrack->strips, strip); } - + continue; } - - /* firstly, check if the proposed transform locations would overlap with any neighbouring strips + + /* firstly, check if the proposed transform locations would overlap with any neighbouring strips * (barring transitions) which are absolute barriers since they are not being moved * * this is done as a iterative procedure (done 5 times max for now) @@ -396,10 +396,10 @@ void recalcData(TransInfo *t) for (iter=0; iter < 5; iter++) { pExceeded= ((strip->prev) && (strip->prev->type != NLASTRIP_TYPE_TRANSITION) && (tdn->h1[0] < strip->prev->end)); nExceeded= ((strip->next) && (strip->next->type != NLASTRIP_TYPE_TRANSITION) && (tdn->h2[0] > strip->next->start)); - + if ((pExceeded && nExceeded) || (iter == 4) ) { - /* both endpoints exceeded (or iteration ping-pong'd meaning that we need a compromise) - * - simply crop strip to fit within the bounds of the strips bounding it + /* both endpoints exceeded (or iteration ping-pong'd meaning that we need a compromise) + * - simply crop strip to fit within the bounds of the strips bounding it * - if there were no neighbours, clear the transforms (make it default to the strip's current values) */ if (strip->prev && strip->next) { @@ -414,21 +414,21 @@ void recalcData(TransInfo *t) else if (nExceeded) { /* move backwards */ float offset= tdn->h2[0] - strip->next->start; - + tdn->h1[0] -= offset; tdn->h2[0] -= offset; } else if (pExceeded) { /* more forwards */ float offset= strip->prev->end - tdn->h1[0]; - + tdn->h1[0] += offset; tdn->h2[0] += offset; } else /* all is fine and well */ break; } - + /* handle auto-snapping */ switch (snla->autosnap) { case SACTSNAP_FRAME: /* snap to nearest frame/time */ @@ -441,36 +441,36 @@ void recalcData(TransInfo *t) tdn->h2[0]= (float)( floor(tdn->h2[0]+0.5f) ); } break; - + case SACTSNAP_MARKER: /* snap to nearest marker */ tdn->h1[0]= (float)ED_markers_find_nearest_marker_time(&t->scene->markers, tdn->h1[0]); tdn->h2[0]= (float)ED_markers_find_nearest_marker_time(&t->scene->markers, tdn->h2[0]); break; } - + /* use RNA to write the values... */ // TODO: do we need to write in 2 passes to make sure that no truncation goes on? RNA_pointer_create(NULL, &RNA_NlaStrip, strip, &strip_ptr); - + RNA_float_set(&strip_ptr, "start_frame", tdn->h1[0]); RNA_float_set(&strip_ptr, "end_frame", tdn->h2[0]); - + /* flush transforms to child strips (since this should be a meta) */ BKE_nlameta_flush_transforms(strip); - - - /* now, check if we need to try and move track + + + /* now, check if we need to try and move track * - we need to calculate both, as only one may have been altered by transform if only 1 handle moved */ delta_y1= ((int)tdn->h1[1] / NLACHANNEL_STEP - tdn->trackIndex); delta_y2= ((int)tdn->h2[1] / NLACHANNEL_STEP - tdn->trackIndex); - + if (delta_y1 || delta_y2) { NlaTrack *track; int delta = (delta_y2) ? delta_y2 : delta_y1; int n; - - /* move in the requested direction, checking at each layer if there's space for strip to pass through, + + /* move in the requested direction, checking at each layer if there's space for strip to pass through, * stopping on the last track available or that we're able to fit in */ if (delta > 0) { @@ -480,7 +480,7 @@ void recalcData(TransInfo *t) /* move strip to this track */ BLI_remlink(&tdn->nlt->strips, strip); BKE_nlatrack_add_strip(track, strip); - + tdn->nlt= track; tdn->trackIndex += (n + 1); /* + 1, since n==0 would mean that we didn't change track */ } @@ -491,14 +491,14 @@ void recalcData(TransInfo *t) else { /* make delta 'positive' before using it, since we now know to go backwards */ delta= -delta; - + for (track=tdn->nlt->prev, n=0; (track) && (n < delta); track=track->prev, n++) { /* check if space in this track for the strip */ if (BKE_nlatrack_has_space(track, strip->start, strip->end)) { /* move strip to this track */ BLI_remlink(&tdn->nlt->strips, strip); BKE_nlatrack_add_strip(track, strip); - + tdn->nlt= track; tdn->trackIndex -= (n - 1); /* - 1, since n==0 would mean that we didn't change track */ } @@ -513,9 +513,9 @@ void recalcData(TransInfo *t) if ELEM(t->obedit->type, OB_CURVE, OB_SURF) { Curve *cu= t->obedit->data; Nurb *nu= cu->editnurb->first; - + DAG_object_flush_update(scene, t->obedit, OB_RECALC_DATA); /* sets recalc flags */ - + if (t->state == TRANS_CANCEL) { while(nu) { calchandlesNurb(nu); /* Cant do testhandlesNurb here, it messes up the h1 and h2 flags */ @@ -535,7 +535,7 @@ void recalcData(TransInfo *t) else if(t->obedit->type==OB_LATTICE) { Lattice *la= t->obedit->data; DAG_object_flush_update(scene, t->obedit, OB_RECALC_DATA); /* sets recalc flags */ - + if(la->editlatt->flag & LT_OUTSIDE) outside_lattice(la->editlatt); } else if (t->obedit->type == OB_MESH) { @@ -545,7 +545,7 @@ void recalcData(TransInfo *t) flushTransUVs(t); if(sima->flag & SI_LIVE_UNWRAP) ED_uvedit_live_unwrap_re_solve(); - + DAG_object_flush_update(scene, t->obedit, OB_RECALC_DATA); } else { EditMesh *em = ((Mesh*)t->obedit->data)->edit_mesh; @@ -560,9 +560,9 @@ void recalcData(TransInfo *t) } if((t->options & CTX_NO_MIRROR) == 0 && (t->flag & T_MIRROR)) editmesh_apply_to_mirror(t); - + DAG_object_flush_update(scene, t->obedit, OB_RECALC_DATA); /* sets recalc flags */ - + recalc_editnormals(em); } } @@ -572,10 +572,10 @@ void recalcData(TransInfo *t) EditBone *ebo; TransData *td = t->data; int i; - + /* Ensure all bones are correctly adjusted */ for (ebo = edbo->first; ebo; ebo = ebo->next){ - + if ((ebo->flag & BONE_CONNECTED) && ebo->parent){ /* If this bone has a parent tip that has been moved */ if (ebo->parent->flag & BONE_TIPSEL){ @@ -588,7 +588,7 @@ void recalcData(TransInfo *t) if(t->mode==TFM_BONE_ENVELOPE) ebo->parent->rad_tail= ebo->rad_head; } } - + /* on extrude bones, oldlength==0.0f, so we scale radius of points */ ebo->length= VecLenf(ebo->head, ebo->tail); if(ebo->oldlength==0.0f) { @@ -608,8 +608,8 @@ void recalcData(TransInfo *t) ebo->oldlength= ebo->length; } } - - + + if (t->mode != TFM_BONE_ROLL) { /* fix roll */ @@ -619,10 +619,10 @@ void recalcData(TransInfo *t) { float vec[3], up_axis[3]; float qrot[4]; - + ebo = td->extra; VECCOPY(up_axis, td->axismtx[2]); - + if (t->mode != TFM_ROTATION) { VecSubf(vec, ebo->tail, ebo->head); @@ -634,15 +634,15 @@ void recalcData(TransInfo *t) { Mat3MulVecfl(t->mat, up_axis); } - + ebo->roll = ED_rollBoneToVector(ebo, up_axis); } } } - - if(arm->flag & ARM_MIRROR_EDIT) + + if(arm->flag & ARM_MIRROR_EDIT) transform_armature_mirror_update(t->obedit); - + } else DAG_object_flush_update(scene, t->obedit, OB_RECALC_DATA); /* sets recalc flags */ @@ -650,7 +650,7 @@ void recalcData(TransInfo *t) else if( (t->flag & T_POSE) && t->poseobj) { Object *ob= t->poseobj; bArmature *arm= ob->data; - + /* if animtimer is running, and the object already has animation data, * check if the auto-record feature means that we should record 'samples' * (i.e. uneditable animation values) @@ -661,7 +661,7 @@ void recalcData(TransInfo *t) short targetless_ik= (t->flag & T_AUTOIK); // XXX this currently doesn't work, since flags aren't set yet! autokeyframe_pose_cb_func(t->scene, (View3D *)t->view, ob, t->mode, targetless_ik); } - + /* old optimize trick... this enforces to bypass the depgraph */ if (!(arm->flag & ARM_DELAYDEFORM)) { DAG_object_flush_update(scene, ob, OB_RECALC_DATA); /* sets recalc flags */ @@ -672,13 +672,13 @@ void recalcData(TransInfo *t) else { for(base= FIRSTBASE; base; base= base->next) { Object *ob= base->object; - + /* this flag is from depgraph, was stored in initialize phase, handled in drawview.c */ if(base->flag & BA_HAS_RECALC_OB) ob->recalc |= OB_RECALC_OB; if(base->flag & BA_HAS_RECALC_DATA) ob->recalc |= OB_RECALC_DATA; - + /* if object/base is selected */ if ((base->flag & SELECT) || (ob->flag & SELECT)) { /* if animtimer is running, and the object already has animation data, @@ -691,13 +691,13 @@ void recalcData(TransInfo *t) autokeyframe_ob_cb_func(t->scene, (View3D *)t->view, ob, t->mode); } } - + /* proxy exception */ if(ob->proxy) ob->proxy->recalc |= ob->recalc; if(ob->proxy_group) group_tag_recalc(ob->proxy_group->dup_group); - } + } } /* update shaded drawmode while transform */ @@ -709,22 +709,22 @@ void drawLine(TransInfo *t, float *center, float *dir, char axis, short options) { float v1[3], v2[3], v3[3]; char col[3], col2[3]; - + if (t->spacetype == SPACE_VIEW3D) { View3D *v3d = t->view; - + glPushMatrix(); - + //if(t->obedit) glLoadMatrixf(t->obedit->obmat); // sets opengl viewing - - + + VecCopyf(v3, dir); VecMulf(v3, v3d->far); - + VecSubf(v2, center, v3); VecAddf(v1, center, v3); - + if (options & DRAWLIGHT) { col[0] = col[1] = col[2] = 220; } @@ -733,13 +733,13 @@ void drawLine(TransInfo *t, float *center, float *dir, char axis, short options) } UI_make_axis_color(col, col2, axis); glColor3ubv((GLubyte *)col2); - + setlinestyle(0); - glBegin(GL_LINE_STRIP); - glVertex3fv(v1); - glVertex3fv(v2); + glBegin(GL_LINE_STRIP); + glVertex3fv(v1); + glVertex3fv(v2); glEnd(); - + glPopMatrix(); } } @@ -756,13 +756,13 @@ int initTransInfo (bContext *C, TransInfo *t, wmOperator *op, wmEvent *event) ARegion *ar = CTX_wm_region(C); ScrArea *sa = CTX_wm_area(C); Object *obedit = CTX_data_edit_object(C); - + /* moving: is shown in drawobject() (transform color) */ -// TRANSFORM_FIX_ME +// TRANSFORM_FIX_ME // if(obedit || (t->flag & T_POSE) ) G.moving= G_TRANSFORM_EDIT; // else if(G.f & G_PARTICLEEDIT) G.moving= G_TRANSFORM_PARTICLE; // else G.moving= G_TRANSFORM_OBJ; - + t->scene = sce; t->sa = sa; t->ar = ar; @@ -775,14 +775,14 @@ int initTransInfo (bContext *C, TransInfo *t, wmOperator *op, wmEvent *event) t->helpline = HLP_NONE; t->flag = 0; - + t->redraw = 1; /* redraw first time */ - + if (event) { t->imval[0] = event->x - t->ar->winrct.xmin; t->imval[1] = event->y - t->ar->winrct.ymin; - + t->event_type = event->type; } else @@ -790,7 +790,7 @@ int initTransInfo (bContext *C, TransInfo *t, wmOperator *op, wmEvent *event) t->imval[0] = 0; t->imval[1] = 0; } - + t->con.imval[0] = t->imval[0]; t->con.imval[1] = t->imval[1]; @@ -807,21 +807,21 @@ int initTransInfo (bContext *C, TransInfo *t, wmOperator *op, wmEvent *event) t->vec[0] = t->vec[1] = t->vec[2] = 0.0f; - + t->center[0] = t->center[1] = t->center[2] = 0.0f; - + Mat3One(t->mat); - + t->spacetype = sa->spacetype; if(t->spacetype == SPACE_VIEW3D) { View3D *v3d = sa->spacedata.first; - + t->view = v3d; t->animtimer= CTX_wm_screen(C)->animtimer; - + if(v3d->flag & V3D_ALIGN) t->flag |= T_V3D_ALIGN; t->around = v3d->around; @@ -850,7 +850,7 @@ int initTransInfo (bContext *C, TransInfo *t, wmOperator *op, wmEvent *event) { // XXX for now, get View2D from the active region t->view = &ar->v2d; - + t->around = V3D_CENTER; } @@ -886,7 +886,7 @@ int initTransInfo (bContext *C, TransInfo *t, wmOperator *op, wmEvent *event) { if ((t->options & CTX_NO_PET) == 0 && (ts->proportional)) { t->flag |= T_PROP_EDIT; - + if(ts->proportional == 2) t->flag |= T_PROP_CONNECTED; // yes i know, has to become define } @@ -900,7 +900,7 @@ int initTransInfo (bContext *C, TransInfo *t, wmOperator *op, wmEvent *event) { t->prop_size = ts->proportional_size; } - + if (op && RNA_struct_find_property(op->ptr, "proportional_editing_falloff") && RNA_property_is_set(op->ptr, "proportional_editing_falloff")) { t->prop_mode = RNA_enum_get(op->ptr, "proportional_editing_falloff"); @@ -919,12 +919,12 @@ int initTransInfo (bContext *C, TransInfo *t, wmOperator *op, wmEvent *event) setTransformViewMatrices(t); initNumInput(&t->num); initNDofInput(&t->ndof); - + return 1; } /* Here I would suggest only TransInfo related issues, like free data & reset vars. Not redraws */ -void postTrans (TransInfo *t) +void postTrans (TransInfo *t) { TransData *td; @@ -932,7 +932,7 @@ void postTrans (TransInfo *t) { ED_region_draw_cb_exit(t->ar->type, t->draw_handle); } - + /* postTrans can be called when nothing is selected, so data is NULL already */ if (t->data) { int a; @@ -940,7 +940,7 @@ void postTrans (TransInfo *t) /* since ipokeys are optional on objects, we mallocced them per trans-data */ for(a=0, td= t->data; a<t->total; a++, td++) { if(td->tdi) MEM_freeN(td->tdi); - if (td->flag & TD_BEZTRIPLE) MEM_freeN(td->hdata); + if (td->flag & TD_BEZTRIPLE) MEM_freeN(td->hdata); } MEM_freeN(t->data); } @@ -965,7 +965,7 @@ void postTrans (TransInfo *t) void applyTransObjects(TransInfo *t) { TransData *td; - + for (td = t->data; td < t->data + t->total; td++) { VECCOPY(td->iloc, td->loc); if (td->ext->rot) { @@ -974,9 +974,9 @@ void applyTransObjects(TransInfo *t) if (td->ext->size) { VECCOPY(td->ext->isize, td->ext->size); } - } + } recalcData(t); -} +} /* helper for below */ static void restore_ipokey(float *poin, float *old) @@ -1009,15 +1009,15 @@ static void restoreElement(TransData *td) { } } } - + if (td->flag & TD_BEZTRIPLE) { *(td->hdata->h1) = td->hdata->ih1; *(td->hdata->h2) = td->hdata->ih2; } - + if(td->tdi) { TransDataIpokey *tdi= td->tdi; - + restore_ipokey(tdi->locx, tdi->oldloc); restore_ipokey(tdi->locy, tdi->oldloc+1); restore_ipokey(tdi->locz, tdi->oldloc+2); @@ -1025,7 +1025,7 @@ static void restoreElement(TransData *td) { restore_ipokey(tdi->rotx, tdi->oldrot); restore_ipokey(tdi->roty, tdi->oldrot+1); restore_ipokey(tdi->rotz, tdi->oldrot+2); - + restore_ipokey(tdi->sizex, tdi->oldsize); restore_ipokey(tdi->sizey, tdi->oldsize+1); restore_ipokey(tdi->sizez, tdi->oldsize+2); @@ -1035,13 +1035,13 @@ static void restoreElement(TransData *td) { void restoreTransObjects(TransInfo *t) { TransData *td; - + for (td = t->data; td < t->data + t->total; td++) { restoreElement(td); } - + Mat3One(t->mat); - + recalcData(t); } @@ -1050,7 +1050,7 @@ void calculateCenter2D(TransInfo *t) if (t->flag & (T_EDIT|T_POSE)) { Object *ob= t->obedit?t->obedit:t->poseobj; float vec[3]; - + VECCOPY(vec, t->center); Mat4MulVecfl(ob->obmat, vec); projectIntView(t, vec, t->center2d); @@ -1071,13 +1071,13 @@ void calculateCenterCursor(TransInfo *t) if (t->flag & (T_EDIT|T_POSE)) { Object *ob = t->obedit?t->obedit:t->poseobj; float mat[3][3], imat[3][3]; - + VecSubf(t->center, t->center, ob->obmat[3]); Mat3CpyMat4(mat, ob->obmat); Mat3Inv(imat, mat); Mat3MulVecfl(imat, t->center); } - + calculateCenter2D(t); } @@ -1085,13 +1085,13 @@ void calculateCenterCursor2D(TransInfo *t) { View2D *v2d= t->view; float aspx=1.0, aspy=1.0; - + if(t->spacetype==SPACE_IMAGE) /* only space supported right now but may change */ ED_space_image_uv_aspect(t->sa->spacedata.first, &aspx, &aspy); if (v2d) { - t->center[0] = v2d->cursor[0] * aspx; - t->center[1] = v2d->cursor[1] * aspy; + t->center[0] = v2d->cursor[0] * aspx; + t->center[1] = v2d->cursor[1] * aspy; } calculateCenter2D(t); @@ -1102,7 +1102,7 @@ void calculateCenterMedian(TransInfo *t) float partial[3] = {0.0f, 0.0f, 0.0f}; int total = 0; int i; - + for(i = 0; i < t->total; i++) { if (t->data[i].flag & TD_SELECTED) { if (!(t->data[i].flag & TD_NOCENTER)) @@ -1112,8 +1112,8 @@ void calculateCenterMedian(TransInfo *t) } } else { - /* - All the selected elements are at the head of the array + /* + All the selected elements are at the head of the array which means we can stop when it finds unselected data */ break; @@ -1138,8 +1138,8 @@ void calculateCenterBound(TransInfo *t) MinMax3(min, max, t->data[i].center); } else { - /* - All the selected elements are at the head of the array + /* + All the selected elements are at the head of the array which means we can stop when it finds unselected data */ break; @@ -1156,7 +1156,7 @@ void calculateCenterBound(TransInfo *t) calculateCenter2D(t); } -void calculateCenter(TransInfo *t) +void calculateCenter(TransInfo *t) { switch(t->around) { case V3D_CENTER: @@ -1188,7 +1188,7 @@ void calculateCenter(TransInfo *t) break; } /* END EDIT MODE ACTIVE ELEMENT */ #endif - + calculateCenterMedian(t); if((t->flag & (T_EDIT|T_POSE))==0) { @@ -1200,7 +1200,7 @@ void calculateCenter(TransInfo *t) projectIntView(t, t->center, t->center2d); } } - + } } @@ -1220,21 +1220,21 @@ void calculateCenter(TransInfo *t) View3D *v3d = t->view; Scene *scene = t->scene; RegionView3D *rv3d = t->ar->regiondata; - + if(v3d->camera == OBACT && rv3d->persp==V3D_CAMOB) { float axis[3]; /* persinv is nasty, use viewinv instead, always right */ VECCOPY(axis, t->viewinv[2]); Normalize(axis); - + /* 6.0 = 6 grid units */ axis[0]= t->center[0]- 6.0f*axis[0]; axis[1]= t->center[1]- 6.0f*axis[1]; axis[2]= t->center[2]- 6.0f*axis[2]; - + projectIntView(t, axis, t->center2d); - + /* rotate only needs correct 2d center, grab needs initgrabz() value */ if(t->mode==TFM_TRANSLATION) { @@ -1243,7 +1243,7 @@ void calculateCenter(TransInfo *t) } } } - } + } if(t->spacetype==SPACE_VIEW3D) { @@ -1251,14 +1251,14 @@ void calculateCenter(TransInfo *t) if(t->flag & (T_EDIT|T_POSE)) { Object *ob= t->obedit?t->obedit:t->poseobj; float vec[3]; - + VECCOPY(vec, t->center); Mat4MulVecfl(ob->obmat, vec); initgrabz(t->ar->regiondata, vec[0], vec[1], vec[2]); } else { initgrabz(t->ar->regiondata, t->center[0], t->center[1], t->center[2]); - } + } } } @@ -1268,18 +1268,18 @@ void calculatePropRatio(TransInfo *t) int i; float dist; short connected = t->flag & T_PROP_CONNECTED; - + if (t->flag & T_PROP_EDIT) { for(i = 0 ; i < t->total; i++, td++) { if (td->flag & TD_SELECTED) { td->factor = 1.0f; } - else if ((connected && + else if ((connected && (td->flag & TD_NOTCONNECTED || td->dist > t->prop_size)) || (connected == 0 && td->rdist > t->prop_size)) { - /* + /* The elements are sorted according to their dist member in the array, that means we can stop when it finds one element outside of the propsize. */ @@ -1291,7 +1291,7 @@ void calculatePropRatio(TransInfo *t) /* Use rdist for falloff calculations, it is the real distance */ td->flag &= ~TD_NOACTION; dist= (t->prop_size-td->rdist)/t->prop_size; - + /* * Clamp to positive numbers. * Certain corner cases with connectivity and individual centers @@ -1299,7 +1299,7 @@ void calculatePropRatio(TransInfo *t) */ if (dist < 0.0f) dist = 0.0f; - + switch(t->prop_mode) { case PROP_SHARP: td->factor= dist*dist; @@ -1362,27 +1362,19 @@ void calculatePropRatio(TransInfo *t) } } -/* XXX only to make manipulators run now */ -TransInfo *BIF_GetTransInfo() -{ - static struct TransInfo trans; - memset(&trans, 0, sizeof(struct TransInfo)); - return &trans; -} - float get_drawsize(ARegion *ar, float *co) { RegionView3D *rv3d= ar->regiondata; float size, vec[3], len1, len2; - + /* size calculus, depending ortho/persp settings, like initgrabz() */ size= rv3d->persmat[0][3]*co[0]+ rv3d->persmat[1][3]*co[1]+ rv3d->persmat[2][3]*co[2]+ rv3d->persmat[3][3]; - + VECCOPY(vec, rv3d->persinv[0]); len1= Normalize(vec); VECCOPY(vec, rv3d->persinv[1]); len2= Normalize(vec); - + size*= 0.01f*(len1>len2?len1:len2); /* correct for window size to make widgets appear fixed size */ |