- Ignore selected handles if control point is selected when

snapping cursor to selection (fixes #23966: Cursor to selected: incorrect behaviour in curves)
- Keep handles' of selected vectors if control point is selected when
  snapping selection to grid/cursor
- Added definitions to hard-coded numeric flags for make_trans_verts
  and removed unused proportional flag
This commit is contained in:
Sergey Sharybin
2010-09-25 06:45:28 +00:00
parent 92954672dc
commit 468e48982b
@@ -99,6 +99,37 @@ static void special_transvert_update(Scene *scene, Object *obedit)
Nurb *nu= nurbs->first;
while(nu) {
/* keep handles' vectors unchanged */
if(nu->bezt) {
int a= nu->pntsu;
TransVert *tv= transvmain;
BezTriple *bezt= nu->bezt;
while(a--) {
if(bezt->f1 & SELECT) tv++;
if(bezt->f2 & SELECT) {
float v[3];
if(bezt->f1 & SELECT) {
sub_v3_v3v3(v, (tv-1)->oldloc, tv->oldloc);
add_v3_v3v3(bezt->vec[0], bezt->vec[1], v);
}
if(bezt->f3 & SELECT) {
sub_v3_v3v3(v, (tv+1)->oldloc, tv->oldloc);
add_v3_v3v3(bezt->vec[2], bezt->vec[1], v);
}
tv++;
}
if(bezt->f3 & SELECT) tv++;
bezt++;
}
}
test2DNurb(nu);
testhandlesNurb(nu); /* test for bezier too */
nu= nu->next;
@@ -152,7 +183,9 @@ static void special_transvert_update(Scene *scene, Object *obedit)
}
/* copied from editobject.c, needs to be replaced with new transform code still */
/* mode: 1 = proportional, 2 = all joints (for bones only) */
/* mode flags: */
#define TM_ALL_JOINTS 1 /* all joints (for bones only) */
#define TM_SKIP_HANDLES 2 /* skip handles when control point is selected (for curves only) */
static void make_trans_verts(Object *obedit, float *min, float *max, int mode)
{
Nurb *nu;
@@ -173,7 +206,6 @@ static void make_trans_verts(Object *obedit, float *min, float *max, int mode)
if(obedit->type==OB_MESH) {
Mesh *me= obedit->data;
EditMesh *em= me->edit_mesh;
int proptrans= 0;
// transform now requires awareness for select mode, so we tag the f1 flags in verts
tottrans= 0;
@@ -206,17 +238,6 @@ static void make_trans_verts(Object *obedit, float *min, float *max, int mode)
for(eve= em->verts.first; eve; eve= eve->next) if(eve->f1) tottrans++;
}
/* proportional edit exception... */
if((mode & 1) && tottrans) {
for(eve= em->verts.first; eve; eve= eve->next) {
if(eve->h==0) {
eve->f1 |= 2;
proptrans++;
}
}
if(proptrans>tottrans) tottrans= proptrans;
}
/* and now make transverts */
if(tottrans) {
tv=transvmain= MEM_callocN(tottrans*sizeof(TransVert), "maketransverts");
@@ -248,7 +269,7 @@ static void make_trans_verts(Object *obedit, float *min, float *max, int mode)
short rootok= (!(ebo->parent && (ebo->flag & BONE_CONNECTED) && ebo->parent->flag & BONE_TIPSEL));
if ((tipsel && rootsel) || (rootsel)) {
/* Don't add the tip (unless mode & 2, for getting all joints),
/* Don't add the tip (unless mode & TM_ALL_JOINTS, for getting all joints),
* otherwise we get zero-length bones as tips will snap to the same
* location as heads.
*/
@@ -261,7 +282,7 @@ static void make_trans_verts(Object *obedit, float *min, float *max, int mode)
tottrans++;
}
if ((mode & 2) && (tipsel)) {
if ((mode & TM_ALL_JOINTS) && (tipsel)) {
VECCOPY (tv->oldloc, ebo->tail);
tv->loc= ebo->tail;
tv->nor= NULL;
@@ -301,14 +322,18 @@ static void make_trans_verts(Object *obedit, float *min, float *max, int mode)
bezt= nu->bezt;
while(a--) {
if(bezt->hide==0) {
if((mode & 1) || (bezt->f1 & SELECT)) {
int skip_handle= 0;
if(bezt->f2 & SELECT)
skip_handle= mode & TM_SKIP_HANDLES;
if((bezt->f1 & SELECT) && !skip_handle) {
VECCOPY(tv->oldloc, bezt->vec[0]);
tv->loc= bezt->vec[0];
tv->flag= bezt->f1 & SELECT;
tv++;
tottrans++;
}
if((mode & 1) || (bezt->f2 & SELECT)) {
if(bezt->f2 & SELECT) {
VECCOPY(tv->oldloc, bezt->vec[1]);
tv->loc= bezt->vec[1];
tv->val= &(bezt->alfa);
@@ -317,7 +342,7 @@ static void make_trans_verts(Object *obedit, float *min, float *max, int mode)
tv++;
tottrans++;
}
if((mode & 1) || (bezt->f3 & SELECT)) {
if((bezt->f3 & SELECT) && !skip_handle) {
VECCOPY(tv->oldloc, bezt->vec[2]);
tv->loc= bezt->vec[2];
tv->flag= bezt->f3 & SELECT;
@@ -333,7 +358,7 @@ static void make_trans_verts(Object *obedit, float *min, float *max, int mode)
bp= nu->bp;
while(a--) {
if(bp->hide==0) {
if((mode & 1) || (bp->f1 & SELECT)) {
if(bp->f1 & SELECT) {
VECCOPY(tv->oldloc, bp->vec);
tv->loc= bp->vec;
tv->val= &(bp->alfa);
@@ -376,10 +401,10 @@ static void make_trans_verts(Object *obedit, float *min, float *max, int mode)
a= lt->editlatt->latt->pntsu*lt->editlatt->latt->pntsv*lt->editlatt->latt->pntsw;
tv=transvmain= MEM_callocN(a*sizeof(TransVert), "maketransverts curve");
tv=transvmain= MEM_callocN(a*sizeof(TransVert), "maketransverts latt");
while(a--) {
if((mode & 1) || (bp->f1 & SELECT)) {
if(bp->f1 & SELECT) {
if(bp->hide==0) {
copy_v3_v3(tv->oldloc, bp->vec);
tv->loc= bp->vec;
@@ -392,6 +417,13 @@ static void make_trans_verts(Object *obedit, float *min, float *max, int mode)
}
}
if(!tottrans && transvmain) {
/* prevent memory leak. happens for curves/latticies due to */
/* difficult condition of adding points to trans data */
MEM_freeN(transvmain);
transvmain= NULL;
}
/* cent etc */
tv= transvmain;
total= 0.0;
@@ -727,7 +759,7 @@ static int snap_curs_to_sel(bContext *C, wmOperator *op)
tottrans=0;
if ELEM6(obedit->type, OB_ARMATURE, OB_LATTICE, OB_MESH, OB_SURF, OB_CURVE, OB_MBALL)
make_trans_verts(obedit, bmat[0], bmat[1], 2);
make_trans_verts(obedit, bmat[0], bmat[1], TM_ALL_JOINTS|TM_SKIP_HANDLES);
if(tottrans==0) return OPERATOR_CANCELLED;
copy_m3_m4(bmat, obedit->obmat);
@@ -909,7 +941,7 @@ int minmax_verts(Object *obedit, float *min, float *max)
tottrans=0;
if ELEM5(obedit->type, OB_ARMATURE, OB_LATTICE, OB_MESH, OB_SURF, OB_CURVE)
make_trans_verts(obedit, bmat[0], bmat[1], 2);
make_trans_verts(obedit, bmat[0], bmat[1], TM_ALL_JOINTS);
if(tottrans==0) return 0;