diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2010-12-19 22:22:17 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2010-12-19 22:22:17 +0300 |
commit | 7899765836d42037f685ee9c506d959997559cde (patch) | |
tree | 362ed053bdb3a102dbd72c3ce5b78d49f622f64d /source/blender/editors/curve | |
parent | 410c807338f916600b61bcb2251837b335758036 (diff) |
Made ctrl-point curve extruding more consistent with mesh edit mode:
when nothing is selected but active spline is set or when "middle"
control point is selected new spline would be created.
Nothing wull happen when there is no selection and no active spline
due to it's unclear which kind of spline should be added.
Diffstat (limited to 'source/blender/editors/curve')
-rw-r--r-- | source/blender/editors/curve/editcurve.c | 174 |
1 files changed, 142 insertions, 32 deletions
diff --git a/source/blender/editors/curve/editcurve.c b/source/blender/editors/curve/editcurve.c index 24ad1ba7e48..18f0e1e35ed 100644 --- a/source/blender/editors/curve/editcurve.c +++ b/source/blender/editors/curve/editcurve.c @@ -4325,10 +4325,11 @@ static int addvert_Nurb(bContext *C, short mode, float location[3]) Object *obedit= CTX_data_edit_object(C); Curve *cu= (Curve*)obedit->data; EditNurb *editnurb= cu->editnurb; - Nurb *nu; + Nurb *nu, *newnu= NULL; BezTriple *bezt, *newbezt = NULL; BPoint *bp, *newbp = NULL; float mat[3][3],imat[3][3], temp[3]; + int ok= 0; copy_m3_m4(mat, obedit->obmat); invert_m3_m3(imat,mat); @@ -4336,46 +4337,122 @@ static int addvert_Nurb(bContext *C, short mode, float location[3]) findselectedNurbvert(&editnurb->nurbs, &nu, &bezt, &bp); if ((nu == NULL) || (nu->type==CU_BEZIER && bezt==NULL) || (nu->type!=CU_BEZIER && bp==NULL)) { - /* FIXME: this is inconsistent with mesh ctrl-click, where clicking anywhere will add a vert, - * even without existing data to extrude - */ - return OPERATOR_CANCELLED; + if(cu->actnu >= 0) { + nu= BLI_findlink(&editnurb->nurbs, cu->actnu); + + if(nu->type==CU_BEZIER) { + newbezt= (BezTriple*)MEM_callocN(sizeof(BezTriple), "addvert_Nurb"); + newbezt->radius= 1; + newbezt->alfa= 0; + BEZ_SEL(newbezt); + newbezt->h2= newbezt->h1= HD_AUTO; + + newnu= (Nurb*)MEM_mallocN(sizeof(Nurb), "addvert_Nurb newnu"); + memcpy(newnu, nu, sizeof(Nurb)); + BLI_addtail(&editnurb->nurbs, newnu); + set_actNurb(obedit, newnu); + newnu->bezt= newbezt; + newnu->pntsu= 1; + + temp[0] = 1; + temp[1] = 0; + temp[2] = 0; + copy_v3_v3(newbezt->vec[1], location); + sub_v3_v3(newbezt->vec[1], obedit->obmat[3]); + sub_v3_v3v3(newbezt->vec[0], newbezt->vec[1],temp); + add_v3_v3v3(newbezt->vec[2], newbezt->vec[1],temp); + + ok= 1; + } else if(nu->pntsv == 1) { + newbp= (BPoint*)MEM_callocN(sizeof(BPoint), "addvert_Nurb5"); + newbp->radius= 1; + newbp->alfa= 0; + newbp->f1|= SELECT; + cu->lastsel= newbp; + + newnu= (Nurb*)MEM_mallocN(sizeof(Nurb), "addvert_Nurb newnu"); + memcpy(newnu, nu, sizeof(Nurb)); + BLI_addtail(&editnurb->nurbs, newnu); + set_actNurb(obedit, newnu); + newnu->bp= newbp; + newnu->orderu= 2; + newnu->pntsu= 1; + + copy_v3_v3(newbp->vec, location); + sub_v3_v3(newbp->vec, obedit->obmat[3]); + mul_m3_v3(imat,newbp->vec); + newbp->vec[3]= 1.0; + + newnu->knotsu= newnu->knotsv= 0; + nurbs_knot_calc_u(newnu); + + ok= 1; + } + + } + + if(!ok) + return OPERATOR_CANCELLED; } - if(nu->type == CU_BEZIER) { + if(!ok && nu->type == CU_BEZIER) { /* which bezpoint? */ - if(bezt== nu->bezt) { /* first */ + if(bezt== (nu->bezt+nu->pntsu-1)) { /* last */ BEZ_DESEL(bezt); newbezt = (BezTriple*)MEM_callocN((nu->pntsu+1) * sizeof(BezTriple), "addvert_Nurb"); - ED_curve_beztcpy(editnurb, newbezt+1, bezt, nu->pntsu); - *newbezt= *bezt; - BEZ_SEL(newbezt); - newbezt->h2= newbezt->h1; + ED_curve_beztcpy(editnurb, newbezt, nu->bezt, nu->pntsu); + *(newbezt+nu->pntsu)= *bezt; VECCOPY(temp, bezt->vec[1]); MEM_freeN(nu->bezt); nu->bezt= newbezt; - bezt= newbezt+1; + newbezt+= nu->pntsu; + BEZ_SEL(newbezt); + cu->lastsel= newbezt; + newbezt->h2= newbezt->h1; + bezt= nu->bezt+nu->pntsu-1; + ok= 1; } - else if(bezt== (nu->bezt+nu->pntsu-1)) { /* last */ + else if(bezt== nu->bezt) { /* first */ BEZ_DESEL(bezt); newbezt = (BezTriple*)MEM_callocN((nu->pntsu+1) * sizeof(BezTriple), "addvert_Nurb"); - ED_curve_beztcpy(editnurb, newbezt, nu->bezt, nu->pntsu); - *(newbezt+nu->pntsu)= *bezt; + ED_curve_beztcpy(editnurb, newbezt+1, bezt, nu->pntsu); + *newbezt= *bezt; + BEZ_SEL(newbezt); + cu->lastsel= newbezt; + newbezt->h2= newbezt->h1; VECCOPY(temp, bezt->vec[1]); MEM_freeN(nu->bezt); nu->bezt= newbezt; - newbezt+= nu->pntsu; + bezt= newbezt+1; + ok= 1; + } + else if(mode!='e') { + BEZ_DESEL(bezt); + newbezt= (BezTriple*)MEM_callocN(sizeof(BezTriple), "addvert_Nurb"); + *newbezt= *bezt; BEZ_SEL(newbezt); newbezt->h2= newbezt->h1; - bezt= nu->bezt+nu->pntsu-1; + VECCOPY(temp, bezt->vec[1]); + + newnu= (Nurb*)MEM_mallocN(sizeof(Nurb), "addvert_Nurb newnu"); + memcpy(newnu, nu, sizeof(Nurb)); + BLI_addtail(&editnurb->nurbs, newnu); + set_actNurb(obedit, newnu); + newnu->bezt= newbezt; + newnu->pntsu= 1; + + cu->lastsel= newbezt; + + bezt= newbezt; + ok= 1; } else bezt= 0; if(bezt) { - nu->pntsu++; - + if(!newnu) nu->pntsu++; + if(mode=='e') { copy_v3_v3(newbezt->vec[0], bezt->vec[0]); copy_v3_v3(newbezt->vec[1], bezt->vec[1]); @@ -4388,11 +4465,13 @@ static int addvert_Nurb(bContext *C, short mode, float location[3]) sub_v3_v3v3(temp, newbezt->vec[1],temp); add_v3_v3v3(newbezt->vec[0], bezt->vec[0],temp); add_v3_v3v3(newbezt->vec[2], bezt->vec[2],temp); - calchandlesNurb(nu); + + if(newnu) calchandlesNurb(newnu); + else calchandlesNurb(nu); } } } - else if(nu->pntsv==1) { + else if(!ok && nu->pntsv==1) { /* which b-point? */ if(bp== nu->bp) { /* first */ bp->f1= 0; @@ -4400,10 +4479,12 @@ static int addvert_Nurb(bContext *C, short mode, float location[3]) (BPoint*)MEM_callocN((nu->pntsu+1) * sizeof(BPoint), "addvert_Nurb3"); ED_curve_bpcpy(editnurb, newbp+1, bp, nu->pntsu); *newbp= *bp; - newbp->f1= 1; + newbp->f1|= SELECT; + cu->lastsel= newbp; MEM_freeN(nu->bp); nu->bp= newbp; bp= newbp + 1; + ok= 1; } else if(bp== (nu->bp+nu->pntsu-1)) { /* last */ bp->f1= 0; @@ -4414,16 +4495,33 @@ static int addvert_Nurb(bContext *C, short mode, float location[3]) MEM_freeN(nu->bp); nu->bp= newbp; newbp+= nu->pntsu; - newbp->f1= 1; + newbp->f1|= SELECT; + cu->lastsel= newbp; bp= newbp - 1; + ok= 1; + } + else if(mode!='e') { + bp->f1= 0; + newbp= (BPoint*)MEM_callocN(sizeof(BPoint), "addvert_Nurb5"); + *newbp= *bp; + newbp->f1|= SELECT; + cu->lastsel= newbp; + + newnu= (Nurb*)MEM_mallocN(sizeof(Nurb), "addvert_Nurb newnu"); + memcpy(newnu, nu, sizeof(Nurb)); + BLI_addtail(&editnurb->nurbs, newnu); + set_actNurb(obedit, newnu); + newnu->bp= newbp; + newnu->orderu= 2; + newnu->pntsu= 1; + newnu->knotsu= newnu->knotsv= NULL; + + bp= newbp; + ok= 1; } else bp= 0; if(bp) { - nu->pntsu++; - - nurbs_knot_calc_u(nu); - if(mode=='e') { copy_v3_v3(newbp->vec, bp->vec); } @@ -4432,20 +4530,32 @@ static int addvert_Nurb(bContext *C, short mode, float location[3]) sub_v3_v3(newbp->vec, obedit->obmat[3]); mul_m3_v3(imat,newbp->vec); newbp->vec[3]= 1.0; + + if(!newnu && nu->orderu<4 && nu->orderu<=nu->pntsu) + nu->orderu++; } + + if(!newnu) { + nu->pntsu++; + nurbs_knot_calc_u(nu); + } else nurbs_knot_calc_u(newnu); } } // XXX retopo_do_all(); - test2DNurb(nu); + if(ok) { + test2DNurb(nu); - ED_curve_updateAnimPaths(obedit); + ED_curve_updateAnimPaths(obedit); - WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data); - DAG_id_tag_update(obedit->data, OB_RECALC_DATA); + WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data); + DAG_id_tag_update(obedit->data, OB_RECALC_DATA); - return OPERATOR_FINISHED; + return OPERATOR_FINISHED; + } + + return OPERATOR_CANCELLED; } static int add_vertex_exec(bContext *C, wmOperator *op) |