diff options
author | Ton Roosendaal <ton@blender.org> | 2004-07-23 18:31:22 +0400 |
---|---|---|
committer | Ton Roosendaal <ton@blender.org> | 2004-07-23 18:31:22 +0400 |
commit | 38d2a7148c359aa8c68b9bb49ed81030b73eb8ba (patch) | |
tree | c5b93189d52349f2d19a8910959d212c8e3008ca /source/blender/src/editcurve.c | |
parent | 3b242ab2eae317e898b006634359138f11e72b35 (diff) |
Report 1456; bezier subdivide was far too simple. The reporter provided
the correct math for it, works like a charm
Diffstat (limited to 'source/blender/src/editcurve.c')
-rw-r--r-- | source/blender/src/editcurve.c | 50 |
1 files changed, 30 insertions, 20 deletions
diff --git a/source/blender/src/editcurve.c b/source/blender/src/editcurve.c index 081544072db..ff498d6bde6 100644 --- a/source/blender/src/editcurve.c +++ b/source/blender/src/editcurve.c @@ -1341,14 +1341,14 @@ void subdivideNurb() Nurb *nu; BezTriple *prevbezt, *bezt, *beztnew, *beztn; BPoint *bp, *prevbp, *bpnew, *bpn; - float vec[12]; - int a, b, sel, aantal, *usel, *vsel; + float vec[15]; + int a, b, sel, amount, *usel, *vsel; // printf("*** subdivideNurb: entering subdivide\n"); nu= editNurb.first; while(nu) { - aantal= 0; + amount= 0; if((nu->type & 7)==CU_BEZIER) { /* Insert a point into a 2D Bezier curve. @@ -1367,15 +1367,15 @@ void subdivideNurb() bezt= prevbezt+1; } while(a--) { - if( BEZSELECTED(prevbezt) && BEZSELECTED(bezt) ) aantal++; + if( BEZSELECTED(prevbezt) && BEZSELECTED(bezt) ) amount++; prevbezt= bezt; bezt++; } - if(aantal) { + if(amount) { /* insert */ beztnew = - (BezTriple*)MEM_mallocN((aantal + nu->pntsu) * sizeof(BezTriple), "subdivNurb"); + (BezTriple*)MEM_mallocN((amount + nu->pntsu) * sizeof(BezTriple), "subdivNurb"); beztn= beztnew; if(nu->flagu & 1) { a= nu->pntsu; @@ -1390,18 +1390,28 @@ void subdivideNurb() while(a--) { memcpy(beztn, prevbezt, sizeof(BezTriple)); beztn++; - // printf("*** subdivideNurb: insert Bezier point\n"); if( BEZSELECTED(prevbezt) && BEZSELECTED(bezt) ) { memcpy(beztn, bezt, sizeof(BezTriple)); - maakbez(prevbezt->vec[1][0],prevbezt->vec[2][0], - bezt->vec[0][0],bezt->vec[1][0],vec,2); - maakbez(prevbezt->vec[1][1],prevbezt->vec[2][1], - bezt->vec[0][1],bezt->vec[1][1],vec+1,2); - maakbez(prevbezt->vec[1][2],prevbezt->vec[2][2], - bezt->vec[0][2],bezt->vec[1][2],vec+2,2); - VECCOPY(beztn->vec[1], vec+3); - beztn->h1= beztn->h2= HD_AUTO; + + /* midpoint subdividing */ + VecMidf(vec, prevbezt->vec[1], prevbezt->vec[2]); + VecMidf(vec+3, prevbezt->vec[2], bezt->vec[0]); + VecMidf(vec+6, bezt->vec[0], bezt->vec[1]); + + VecMidf(vec+9, vec, vec+3); + VecMidf(vec+12, vec+3, vec+6); + + /* change handle of prev beztn */ + VECCOPY((beztn-1)->vec[2], vec); + /* new point */ + VECCOPY(beztn->vec[0], vec+9); + VecMidf(beztn->vec[1], vec+9, vec+12); + VECCOPY(beztn->vec[2], vec+12); + /* handle of next bezt */ + if(a==0 && (nu->flagu & 1)) {VECCOPY(beztnew->vec[0], vec+6);} + else {VECCOPY(bezt->vec[0], vec+6);} + beztn++; } @@ -1413,7 +1423,7 @@ void subdivideNurb() MEM_freeN(nu->bezt); nu->bezt= beztnew; - nu->pntsu+= aantal; + nu->pntsu+= amount; calchandlesNurb(nu); } @@ -1437,15 +1447,15 @@ void subdivideNurb() bp= prevbp+1; } while(a--) { - if( (bp->f1 & 1) && (prevbp->f1 & 1) ) aantal++; + if( (bp->f1 & 1) && (prevbp->f1 & 1) ) amount++; prevbp= bp; bp++; } - if(aantal) { + if(amount) { /* insert */ bpnew = - (BPoint*)MEM_mallocN((aantal + nu->pntsu) * sizeof(BPoint), "subdivNurb2"); + (BPoint*)MEM_mallocN((amount + nu->pntsu) * sizeof(BPoint), "subdivNurb2"); bpn= bpnew; if(nu->flagu & 1) { @@ -1479,7 +1489,7 @@ void subdivideNurb() MEM_freeN(nu->bp); nu->bp= bpnew; - nu->pntsu+= aantal; + nu->pntsu+= amount; if(nu->type & 4) { makeknots(nu, 1, nu->flagu>>1); |