Made active point and active spline behaviour more predictable on curves/surfaces:

* deselect all no longer leaves an active point
* the most recently added spline becomes the active one
* on successful duplicate/delete the active point and active spline are reset
This commit is contained in:
Kevin Mackay
2013-11-05 23:37:09 +00:00
parent 7874447e4a
commit 299812f28d
3 changed files with 32 additions and 27 deletions

View File

@@ -230,6 +230,7 @@ Curve *BKE_curve_copy(Curve *cu)
cun->editnurb = NULL;
cun->editfont = NULL;
cun->selboxes = NULL;
cun->lastsel = NULL;
#if 0 // XXX old animation system
/* single user ipo too */

View File

@@ -1279,6 +1279,8 @@ void CU_deselect_all(Object *obedit)
if (editnurb) {
Nurb *nu;
int a;
((Curve *)obedit->data)->lastsel = NULL;
for (nu = editnurb->first; nu; nu = nu->next) {
if (nu->bezt) {
BezTriple *bezt;
@@ -1902,7 +1904,6 @@ static void adduplicateflagNurb(Object *obedit, ListBase *newnurb,
int a, b, c, starta, enda, diffa, cyclicu, cyclicv, newu, newv;
char *usel;
cu->lastsel = NULL;
while (nu) {
cyclicu = cyclicv = 0;
if (nu->type == CU_BEZIER) {
@@ -1927,7 +1928,6 @@ static void adduplicateflagNurb(Object *obedit, ListBase *newnurb,
newnu = BKE_nurb_copy(nu, newu, 1);
BLI_addtail(newnurb, newnu);
set_actNurb(obedit, newnu);
memcpy(newnu->bezt, &nu->bezt[starta], diffa * sizeof(BezTriple));
if (newu != diffa) {
memcpy(&newnu->bezt[diffa], nu->bezt, cyclicu * sizeof(BezTriple));
@@ -1976,7 +1976,6 @@ static void adduplicateflagNurb(Object *obedit, ListBase *newnurb,
newnu = BKE_nurb_copy(nu, newu, 1);
BLI_addtail(newnurb, newnu);
set_actNurb(obedit, newnu);
memcpy(newnu->bp, &nu->bp[starta], diffa * sizeof(BPoint));
if (newu != diffa) {
memcpy(&newnu->bp[diffa], nu->bp, cyclicu * sizeof(BPoint));
@@ -1995,8 +1994,6 @@ static void adduplicateflagNurb(Object *obedit, ListBase *newnurb,
if (cyclicu != 0) {
newnu = BKE_nurb_copy(nu, cyclicu, 1);
BLI_addtail(newnurb, newnu);
set_actNurb(obedit, newnu);
memcpy(newnu->bp, nu->bp, cyclicu * sizeof(BPoint));
newnu->flagu &= ~CU_NURB_CYCLIC;
@@ -2093,7 +2090,6 @@ static void adduplicateflagNurb(Object *obedit, ListBase *newnurb,
memcpy(&newnu->bp[b * newu], &nu->bp[b * nu->pntsu + a], newu * sizeof(BPoint));
}
}
set_actNurb(obedit, newnu);
BLI_addtail(newnurb, newnu);
if (newu != nu->pntsu) newnu->flagu &= ~CU_NURB_CYCLIC;
@@ -2110,7 +2106,6 @@ static void adduplicateflagNurb(Object *obedit, ListBase *newnurb,
for (b = 0; b < newv; b++) {
memcpy(&newnu->bp[b * newu], &nu->bp[b * nu->pntsu], newu * sizeof(BPoint));
}
set_actNurb(obedit, newnu);
BLI_addtail(newnurb, newnu);
if (newu != nu->pntsu) newnu->flagu &= ~CU_NURB_CYCLIC;
@@ -2127,32 +2122,35 @@ static void adduplicateflagNurb(Object *obedit, ListBase *newnurb,
nu = nu->prev;
}
for (nu = newnurb->first; nu; nu = nu->next) {
if (nu->type == CU_BEZIER) {
if (split) {
/* recalc first and last */
BKE_nurb_handle_calc_simple(nu, &nu->bezt[0]);
BKE_nurb_handle_calc_simple(nu, &nu->bezt[nu->pntsu - 1]);
}
}
else {
/* knots done after duplicate as pntsu may change */
nu->knotsu = nu->knotsv = NULL;
BKE_nurb_order_clamp_u(nu);
BKE_nurb_knot_calc_u(nu);
if (newnurb->first != NULL) {
cu->lastsel = NULL;
cu->actnu = -1;
if (obedit->type == OB_SURF) {
for (a = 0, bp = nu->bp; a < nu->pntsu * nu->pntsv; a++, bp++) {
bp->f1 &= ~SURF_SEEN;
for (nu = newnurb->first; nu; nu = nu->next) {
if (nu->type == CU_BEZIER) {
if (split) {
/* recalc first and last */
BKE_nurb_handle_calc_simple(nu, &nu->bezt[0]);
BKE_nurb_handle_calc_simple(nu, &nu->bezt[nu->pntsu - 1]);
}
}
else {
/* knots done after duplicate as pntsu may change */
nu->knotsu = nu->knotsv = NULL;
BKE_nurb_order_clamp_u(nu);
BKE_nurb_knot_calc_u(nu);
BKE_nurb_order_clamp_v(nu);
BKE_nurb_knot_calc_v(nu);
if (obedit->type == OB_SURF) {
for (a = 0, bp = nu->bp; a < nu->pntsu * nu->pntsv; a++, bp++) {
bp->f1 &= ~SURF_SEEN;
}
BKE_nurb_order_clamp_v(nu);
BKE_nurb_knot_calc_v(nu);
}
}
}
}
/* actnu changed */
}
/**************** switch direction operator ***************/
@@ -6367,6 +6365,7 @@ static int curve_delete_segments(Object *obedit, const bool split)
static int curve_delete_exec(bContext *C, wmOperator *op)
{
Object *obedit = CTX_data_edit_object(C);
Curve *cu = (Curve *)obedit->data;
eCurveElem_Types type = RNA_enum_get(op->ptr, "type");
int retval;
@@ -6375,6 +6374,9 @@ static int curve_delete_exec(bContext *C, wmOperator *op)
else BLI_assert(0);
if (retval == OPERATOR_FINISHED) {
cu->lastsel = NULL;
cu->actnu = -1;
if (ED_curve_updateAnimPaths(obedit->data)) WM_event_add_notifier(C, NC_OBJECT | ND_KEYS, obedit);
WM_event_add_notifier(C, NC_GEOM | ND_DATA, obedit->data);

View File

@@ -458,6 +458,8 @@ Nurb *add_nurbs_primitive(bContext *C, Object *obedit, float mat[4][4], int type
if (nu) { /* should always be set */
nu->flag |= CU_SMOOTH;
cu->actnu = BLI_countlist(editnurb);
cu->lastsel = NULL;
BKE_nurb_test2D(nu);
}