Revision: 23101 http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=23101 Author: campbellbarton Date: 2009-09-10 04:57:25 +0200 (Thu, 10 Sep 2009)
Log Message: ----------- Curve cleanup Renamed BevPoint's members * x,y,z -> vec[3]; compatible with other functions. * f1 -> split_tag; used by displist to set the splitting flag. * f2 -> dupe_tag; used in curve.c to remove duplicates. BevList * flag -> dupe_nr; was being used as a counter for duplicate points. * use arithb.c functions where possible. * arrays for coords, tilt and radius were being allocated, then copied into the BevPoint's, now write directly into the values without allocing/freeing arrays. Modified Paths: -------------- trunk/blender/source/blender/blenkernel/BKE_curve.h trunk/blender/source/blender/blenkernel/intern/anim.c trunk/blender/source/blender/blenkernel/intern/armature.c trunk/blender/source/blender/blenkernel/intern/colortools.c trunk/blender/source/blender/blenkernel/intern/curve.c trunk/blender/source/blender/blenkernel/intern/displist.c trunk/blender/source/blender/makesdna/DNA_curve_types.h trunk/blender/source/blender/python/api2_2x/Geometry.c trunk/blender/source/blender/src/drawipo.c trunk/blender/source/blender/src/drawobject.c Modified: trunk/blender/source/blender/blenkernel/BKE_curve.h =================================================================== --- trunk/blender/source/blender/blenkernel/BKE_curve.h 2009-09-10 01:55:10 UTC (rev 23100) +++ trunk/blender/source/blender/blenkernel/BKE_curve.h 2009-09-10 02:57:25 UTC (rev 23101) @@ -70,7 +70,7 @@ void makeknots( struct Nurb *nu, short uv); void makeNurbfaces(struct Nurb *nu, float *coord_array, int rowstride); -void makeNurbcurve(struct Nurb *nu, float *coord_array, float *tilt_array, float *radius_array, int resolu); +void makeNurbcurve(struct Nurb *nu, float *coord_array, float *tilt_array, float *radius_array, int resolu, int stride); void forward_diff_bezier(float q0, float q1, float q2, float q3, float *p, int it, int stride); float *make_orco_curve( struct Object *ob); float *make_orco_surf( struct Object *ob); Modified: trunk/blender/source/blender/blenkernel/intern/anim.c =================================================================== --- trunk/blender/source/blender/blenkernel/intern/anim.c 2009-09-10 01:55:10 UTC (rev 23100) +++ trunk/blender/source/blender/blenkernel/intern/anim.c 2009-09-10 02:57:25 UTC (rev 23101) @@ -86,11 +86,11 @@ void calc_curvepath(Object *ob) { BevList *bl; - BevPoint *bevp, *bevpn, *bevpfirst, *bevplast, *tempbevp; + BevPoint *bevp, *bevpn, *bevpfirst, *bevplast; Curve *cu; Nurb *nu; Path *path; - float *fp, *dist, *maxdist, x, y, z; + float *fp, *dist, *maxdist, xyz[3]; float fac, d=0, fac1, fac2; int a, tot, cycl=0; float *ft; @@ -129,19 +129,12 @@ *fp= 0; for(a=0; a<tot; a++) { fp++; - if(cycl && a==tot-1) { - x= bevpfirst->x - bevp->x; - y= bevpfirst->y - bevp->y; - z= bevpfirst->z - bevp->z; - } - else { - tempbevp = bevp+1; - x= (tempbevp)->x - bevp->x; - y= (tempbevp)->y - bevp->y; - z= (tempbevp)->z - bevp->z; - } - *fp= *(fp-1)+ (float)sqrt(x*x+y*y+z*z); + if(cycl && a==tot-1) + VecSubf(xyz, bevpfirst->vec, bevp->vec); + else + VecSubf(xyz, (bevp+1)->vec, bevp->vec); + *fp= *(fp-1)+VecLength(xyz); bevp++; } @@ -178,14 +171,11 @@ fac2= *(fp)-d; fac1= fac2/fac1; fac2= 1.0f-fac1; - - ft[0]= fac1*bevp->x+ fac2*(bevpn)->x; - ft[1]= fac1*bevp->y+ fac2*(bevpn)->y; - ft[2]= fac1*bevp->z+ fac2*(bevpn)->z; + + VecLerpf(ft, bevp->vec, bevpn->vec, fac2); ft[3]= fac1*bevp->alfa+ fac2*(bevpn)->alfa; ft+= 4; - } MEM_freeN(dist); Modified: trunk/blender/source/blender/blenkernel/intern/armature.c =================================================================== --- trunk/blender/source/blender/blenkernel/intern/armature.c 2009-09-10 01:55:10 UTC (rev 23100) +++ trunk/blender/source/blender/blenkernel/intern/armature.c 2009-09-10 02:57:25 UTC (rev 23101) @@ -654,10 +654,10 @@ if(bone->segments > MAX_BBONE_SUBDIV) bone->segments= MAX_BBONE_SUBDIV; - forward_diff_bezier(0.0, h1[0], h2[0], 0.0, data[0], MAX_BBONE_SUBDIV, 4); - forward_diff_bezier(0.0, h1[1], length + h2[1], length, data[0]+1, MAX_BBONE_SUBDIV, 4); - forward_diff_bezier(0.0, h1[2], h2[2], 0.0, data[0]+2, MAX_BBONE_SUBDIV, 4); - forward_diff_bezier(roll1, roll1 + 0.390464f*(roll2-roll1), roll2 - 0.390464f*(roll2-roll1), roll2, data[0]+3, MAX_BBONE_SUBDIV, 4); + forward_diff_bezier(0.0, h1[0], h2[0], 0.0, data[0], MAX_BBONE_SUBDIV, 4*sizeof(float)); + forward_diff_bezier(0.0, h1[1], length + h2[1], length, data[0]+1, MAX_BBONE_SUBDIV, 4*sizeof(float)); + forward_diff_bezier(0.0, h1[2], h2[2], 0.0, data[0]+2, MAX_BBONE_SUBDIV, 4*sizeof(float)); + forward_diff_bezier(roll1, roll1 + 0.390464f*(roll2-roll1), roll2 - 0.390464f*(roll2-roll1), roll2, data[0]+3, MAX_BBONE_SUBDIV, 4*sizeof(float)); equalize_bezier(data[0], bone->segments); // note: does stride 4! Modified: trunk/blender/source/blender/blenkernel/intern/colortools.c =================================================================== --- trunk/blender/source/blender/blenkernel/intern/colortools.c 2009-09-10 01:55:10 UTC (rev 23100) +++ trunk/blender/source/blender/blenkernel/intern/colortools.c 2009-09-10 02:57:25 UTC (rev 23101) @@ -413,8 +413,8 @@ for(a=0; a<cuma->totpoint-1; a++, fp += 2*CM_RESOL) { correct_bezpart(bezt[a].vec[1], bezt[a].vec[2], bezt[a+1].vec[0], bezt[a+1].vec[1]); - forward_diff_bezier(bezt[a].vec[1][0], bezt[a].vec[2][0], bezt[a+1].vec[0][0], bezt[a+1].vec[1][0], fp, CM_RESOL-1, 2); - forward_diff_bezier(bezt[a].vec[1][1], bezt[a].vec[2][1], bezt[a+1].vec[0][1], bezt[a+1].vec[1][1], fp+1, CM_RESOL-1, 2); + forward_diff_bezier(bezt[a].vec[1][0], bezt[a].vec[2][0], bezt[a+1].vec[0][0], bezt[a+1].vec[1][0], fp, CM_RESOL-1, 2*sizeof(float)); + forward_diff_bezier(bezt[a].vec[1][1], bezt[a].vec[2][1], bezt[a+1].vec[0][1], bezt[a+1].vec[1][1], fp+1, CM_RESOL-1, 2*sizeof(float)); } /* store first and last handle for extrapolation, unit length */ Modified: trunk/blender/source/blender/blenkernel/intern/curve.c =================================================================== --- trunk/blender/source/blender/blenkernel/intern/curve.c 2009-09-10 01:55:10 UTC (rev 23100) +++ trunk/blender/source/blender/blenkernel/intern/curve.c 2009-09-10 02:57:25 UTC (rev 23101) @@ -64,7 +64,6 @@ #include "BKE_library.h" #include "BKE_key.h" - /* globals */ extern ListBase editNurb; /* editcurve.c */ @@ -813,7 +812,7 @@ MEM_freeN(jend); } -void makeNurbcurve(Nurb *nu, float *coord_array, float *tilt_array, float *radius_array, int resolu) +void makeNurbcurve(Nurb *nu, float *coord_array, float *tilt_array, float *radius_array, int resolu, int stride) /* coord_array has to be 3*4*pntsu*resolu in size and zero-ed * tilt_array and radius_array will be written to if valid */ { @@ -897,10 +896,10 @@ } } - coord_fp+= 3; + coord_fp = (float *)(((char *)coord_fp) + stride); - if (tilt_fp) tilt_fp++; - if (radius_fp) radius_fp++; + if (tilt_fp) tilt_fp = (float *)(((char *)tilt_fp) + stride); + if (radius_fp) radius_fp = (float *)(((char *)radius_fp) + stride); u+= ustep; } @@ -931,7 +930,7 @@ for(a=0; a<=it; a++) { *p= q0; - p+= stride; + p = (float *)(((char *)p)+stride); q0+= q1; q1+= q2; q2+= q3; @@ -1350,8 +1349,8 @@ /* take first vertex of possible hole */ bevp= (BevPoint *)(bl2+1); - hvec1[0]= bevp->x; - hvec1[1]= bevp->y; + hvec1[0]= bevp->vec[0]; + hvec1[1]= bevp->vec[1]; hvec1[2]= 0.0; VECCOPY(hvec2,hvec1); hvec2[0]+=1000; @@ -1364,16 +1363,16 @@ prevbevp= bevp+(nr-1); while(nr--) { - min= prevbevp->y; - max= bevp->y; + min= prevbevp->vec[0]; + max= bevp->vec[1]; if(max<min) { min= max; - max= prevbevp->y; + max= prevbevp->vec[1]; } if(min!=max) { if(min<=hvec1[1] && max>=hvec1[1]) { /* there's a transition, calc intersection point */ - mode= cu_isectLL(&(prevbevp->x),&(bevp->x),hvec1,hvec2,0,1,&lab,&mu,vec); + mode= cu_isectLL(prevbevp->vec, bevp->vec, hvec1, hvec2, 0, 1, &lab, &mu, vec); /* if lab==0.0 or lab==1.0 then the edge intersects exactly a transition only allow for one situation: we choose lab= 1.0 */ @@ -1446,12 +1445,15 @@ } -static void alfa_bezpart(BezTriple *prevbezt, BezTriple *bezt, Nurb *nu, float *tilt_array, float *radius_array, int resolu) +static void alfa_bezpart(BezTriple *prevbezt, BezTriple *bezt, Nurb *nu, float *tilt_array, float *radius_array, int resolu, int stride) { BezTriple *pprev, *next, *last; float fac, dfac, t[4]; int a; + if(tilt_array==NULL && radius_array==NULL) + return; + last= nu->bezt+(nu->pntsu-1); /* returns a point */ @@ -1474,11 +1476,13 @@ for(a=0; a<resolu; a++, fac+= dfac) { if (tilt_array) { if (nu->tilt_interp==3) { /* May as well support for tilt also 2.47 ease interp */ - tilt_array[a] = prevbezt->alfa + (bezt->alfa - prevbezt->alfa)*(3.0f*fac*fac - 2.0f*fac*fac*fac); + *tilt_array = prevbezt->alfa + (bezt->alfa - prevbezt->alfa)*(3.0f*fac*fac - 2.0f*fac*fac*fac); } else { key_curve_position_weights(fac, t, nu->tilt_interp); - tilt_array[a]= t[0]*pprev->alfa + t[1]*prevbezt->alfa + t[2]*bezt->alfa + t[3]*next->alfa; + *tilt_array= t[0]*pprev->alfa + t[1]*prevbezt->alfa + t[2]*bezt->alfa + t[3]*next->alfa; } + + tilt_array = (float *)(((char *)tilt_array) + stride); } if (radius_array) { @@ -1486,15 +1490,17 @@ /* Support 2.47 ease interp * Note! - this only takes the 2 points into account, * giving much more localized results to changes in radius, sometimes you want that */ - radius_array[a] = prevbezt->radius + (bezt->radius - prevbezt->radius)*(3.0f*fac*fac - 2.0f*fac*fac*fac); + *radius_array = prevbezt->radius + (bezt->radius - prevbezt->radius)*(3.0f*fac*fac - 2.0f*fac*fac*fac); } else { /* reuse interpolation from tilt if we can */ if (tilt_array==NULL || nu->tilt_interp != nu->radius_interp) { key_curve_position_weights(fac, t, nu->radius_interp); } - radius_array[a]= t[0]*pprev->radius + t[1]*prevbezt->radius + t[2]*bezt->radius + t[3]*next->radius; + *radius_array= t[0]*pprev->radius + t[1]*prevbezt->radius + t[2]*bezt->radius + t[3]*next->radius; } + + radius_array = (float *)(((char *)radius_array) + stride); } } } @@ -1514,8 +1520,6 @@ BevList *bl, *blnew, *blnext; BevPoint *bevp, *bevp2, *bevp1 = NULL, *bevp0; float min, inp, x1, x2, y1, y2, vec[3], vec_prev[3], q[4], quat[4], quat_prev[4], cross[3]; - float *coord_array, *tilt_array=NULL, *radius_array=NULL, *coord_fp, *tilt_fp=NULL, *radius_fp=NULL; - float *v1, *v2; struct bevelsort *sortdata, *sd, *sd1; int a, b, nr, poly, resolu, len=0; int do_tilt, do_radius; @@ -1558,17 +1562,15 @@ if(nu->flagu & CU_CYCLIC) bl->poly= 0; else bl->poly= -1; bl->nr= len; - bl->flag= 0; + bl->dupe_nr= 0; bevp= (BevPoint *)(bl+1); bp= nu->bp; while(len--) { - bevp->x= bp->vec[0]; - bevp->y= bp->vec[1]; - bevp->z= bp->vec[2]; + VECCOPY(bevp->vec, bp->vec); bevp->alfa= bp->alfa; bevp->radius= bp->radius; - bevp->f1= SELECT; + bevp->split_tag= TRUE; bevp++; bp++; } @@ -1594,88 +1596,52 @@ bezt++; } - coord_array= coord_fp= MEM_mallocN(3*sizeof(float)*(resolu+1), "makeBevelCoords"); - - if(do_tilt) - tilt_array= tilt_fp= MEM_callocN(sizeof(float)*(resolu+1), "makeBevelTilt"); - - if (do_radius) @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs