diff options
author | Ton Roosendaal <ton@blender.org> | 2013-01-15 19:42:12 +0400 |
---|---|---|
committer | Ton Roosendaal <ton@blender.org> | 2013-01-15 19:42:12 +0400 |
commit | 73c7c10c6e876bb6679fb8ba8ecbb82b4751fb7d (patch) | |
tree | 31f19268cb5752117bbe867ec85cebe0f7d9a814 | |
parent | e20dfbca6da607f6126a8e0a7ef5f35aafec3254 (diff) |
Bug fix #33748
Old fixes, since 2009 and before! Related to Curve object editmode:
- normals are not being drawn for hidden curves anymore
- even worse: Blender also didn't hide the extrusions or bevels for hidden curves
- outside edit mode, it shows all (as for all other modes)
- (de)select-all now works when 1st (or any) handle was hidden.
-rw-r--r-- | source/blender/blenkernel/intern/curve.c | 9 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/displist.c | 3 | ||||
-rw-r--r-- | source/blender/editors/curve/editcurve.c | 43 | ||||
-rw-r--r-- | source/blender/editors/space_view3d/drawobject.c | 16 |
4 files changed, 56 insertions, 15 deletions
diff --git a/source/blender/blenkernel/intern/curve.c b/source/blender/blenkernel/intern/curve.c index a9c4a7dcdc2..a6e68b9b2d5 100644 --- a/source/blender/blenkernel/intern/curve.c +++ b/source/blender/blenkernel/intern/curve.c @@ -2220,6 +2220,7 @@ void BKE_curve_bevelList_make(Object *ob) struct bevelsort *sortdata, *sd, *sd1; int a, b, nr, poly, resolu = 0, len = 0; int do_tilt, do_radius, do_weight; + int is_editmode = 0; /* this function needs an object, because of tflag and upflag */ cu = ob->data; @@ -2233,12 +2234,17 @@ void BKE_curve_bevelList_make(Object *ob) if (cu->editnurb && ob->type != OB_FONT) { ListBase *nurbs = BKE_curve_editNurbs_get(cu); nu = nurbs->first; + is_editmode = 1; } else { nu = cu->nurb.first; } - while (nu) { + for (; nu; nu = nu->next) { + + if (nu->hide && is_editmode) + continue; + /* check if we will calculate tilt data */ do_tilt = CU_DO_TILT(cu, nu); do_radius = CU_DO_RADIUS(cu, nu); /* normal display uses the radius, better just to calculate them */ @@ -2384,7 +2390,6 @@ void BKE_curve_bevelList_make(Object *ob) } } } - nu = nu->next; } /* STEP 2: DOUBLE POINTS AND AUTOMATIC RESOLUTION, REDUCE DATABLOCKS */ diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c index 643c7b1d972..23b0d3e6e22 100644 --- a/source/blender/blenkernel/intern/displist.c +++ b/source/blender/blenkernel/intern/displist.c @@ -309,10 +309,11 @@ static void curve_to_displist(Curve *cu, ListBase *nubase, ListBase *dispbase, i BPoint *bp; float *data; int a, len, resolu; + const int editmode = (!forRender && (cu->editnurb || cu->editfont)); nu = nubase->first; while (nu) { - if (nu->hide == 0) { + if (nu->hide == 0 || editmode == 0) { if (forRender && cu->resolu_ren != 0) resolu = cu->resolu_ren; else diff --git a/source/blender/editors/curve/editcurve.c b/source/blender/editors/curve/editcurve.c index 69c4b387856..ce213db6360 100644 --- a/source/blender/editors/curve/editcurve.c +++ b/source/blender/editors/curve/editcurve.c @@ -1279,8 +1279,24 @@ void CU_deselect_all(Object *obedit) ListBase *editnurb = object_editcurve_get(obedit); if (editnurb) { - selectend_nurb(obedit, FIRST, 0, DESELECT); /* set first control points as unselected */ - select_adjacent_cp(editnurb, 1, 1, DESELECT); /* cascade selection */ + Nurb *nu; + int a; + for (nu = editnurb->first; nu; nu = nu->next) { + if (nu->bezt) { + BezTriple *bezt; + for (bezt = nu->bezt, a = 0; a < nu->pntsu; a++, bezt++) { + bezt->f1 &= ~SELECT; + bezt->f2 &= ~SELECT; + bezt->f3 &= ~SELECT; + } + } + else if (nu->bp) { + BPoint *bp; + for (bp = nu->bp, a = 0; a < nu->pntsu * nu->pntsv; a++, bp++) { + bp->f1 & ~SELECT; + } + } + } } } @@ -1289,8 +1305,27 @@ void CU_select_all(Object *obedit) ListBase *editnurb = object_editcurve_get(obedit); if (editnurb) { - selectend_nurb(obedit, FIRST, 0, SELECT); /* set first control points as unselected */ - select_adjacent_cp(editnurb, 1, 1, SELECT); /* cascade selection */ + Nurb *nu; + int a; + for (nu = editnurb->first; nu; nu = nu->next) { + if (nu->bezt) { + BezTriple *bezt; + for (bezt = nu->bezt, a = 0; a < nu->pntsu; a++, bezt++) { + if (bezt->hide == 0) { + bezt->f1 |= SELECT; + bezt->f2 |= SELECT; + bezt->f3 |= SELECT; + } + } + } + else if (nu->bp) { + BPoint *bp; + for (bp = nu->bp, a = 0; a < nu->pntsu * nu->pntsv; a++, bp++) { + if (bp->hide == 0) + bp->f1 |= SELECT; + } + } + } } } diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c index 76f73e1505c..cd4c4d6b491 100644 --- a/source/blender/editors/space_view3d/drawobject.c +++ b/source/blender/editors/space_view3d/drawobject.c @@ -4911,7 +4911,7 @@ static void ob_draw_RE_motion(float com[3], float rotscale[3][3], float itw, flo /*place to add drawers */ -static void tekenhandlesN(Nurb *nu, short sel, short hide_handles) +static void drawhandlesN(Nurb *nu, short sel, short hide_handles) { BezTriple *bezt; float *fp; @@ -4971,7 +4971,7 @@ static void tekenhandlesN(Nurb *nu, short sel, short hide_handles) glEnd(); } -static void tekenhandlesN_active(Nurb *nu) +static void drawhandlesN_active(Nurb *nu) { BezTriple *bezt; float *fp; @@ -5006,7 +5006,7 @@ static void tekenhandlesN_active(Nurb *nu) glLineWidth(1); } -static void tekenvertsN(Nurb *nu, short sel, short hide_handles, void *lastsel) +static void drawvertsN(Nurb *nu, short sel, short hide_handles, void *lastsel) { BezTriple *bezt; BPoint *bp; @@ -5286,8 +5286,8 @@ static void drawnurb(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, for (nu = nurb; nu; nu = nu->next) { if (nu->type == CU_BEZIER) { if (index == cu->actnu && !hide_handles) - tekenhandlesN_active(nu); - tekenhandlesN(nu, 0, hide_handles); + drawhandlesN_active(nu); + drawhandlesN(nu, 0, hide_handles); } index++; } @@ -5296,8 +5296,8 @@ static void drawnurb(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, /* selected handles */ for (nu = nurb; nu; nu = nu->next) { if (nu->type == CU_BEZIER && (cu->drawflag & CU_HIDE_HANDLES) == 0) - tekenhandlesN(nu, 1, hide_handles); - tekenvertsN(nu, 0, hide_handles, NULL); + drawhandlesN(nu, 1, hide_handles); + drawvertsN(nu, 0, hide_handles, NULL); } if (v3d->zbuf) glEnable(GL_DEPTH_TEST); @@ -5348,7 +5348,7 @@ static void drawnurb(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, if (v3d->zbuf) glDisable(GL_DEPTH_TEST); for (nu = nurb; nu; nu = nu->next) { - tekenvertsN(nu, 1, hide_handles, cu->lastsel); + drawvertsN(nu, 1, hide_handles, cu->lastsel); } if (v3d->zbuf) glEnable(GL_DEPTH_TEST); |