[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [23101] trunk/blender/source/blender: Curve cleanup

Campbell Barton ideasman42 at gmail.com
Thu Sep 10 04:57:26 CEST 2009


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. @@




More information about the Bf-blender-cvs mailing list