[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [32201] trunk/blender/source/blender/ editors/curve/editcurve.c: cleanup of nurb spin function, was very confusing.

Campbell Barton ideasman42 at gmail.com
Thu Sep 30 07:26:38 CEST 2010


Revision: 32201
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=32201
Author:   campbellbarton
Date:     2010-09-30 07:26:36 +0200 (Thu, 30 Sep 2010)

Log Message:
-----------
cleanup of nurb spin function, was very confusing. no functional changes.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/curve/editcurve.c

Modified: trunk/blender/source/blender/editors/curve/editcurve.c
===================================================================
--- trunk/blender/source/blender/editors/curve/editcurve.c	2010-09-29 22:13:24 UTC (rev 32200)
+++ trunk/blender/source/blender/editors/curve/editcurve.c	2010-09-30 05:26:36 UTC (rev 32201)
@@ -1280,13 +1280,9 @@
 
 			while(a--) {
 				if(bp->f1 & flag) {
-					bp->vec[0]-=cent[0];
-					bp->vec[1]-=cent[1];
-					bp->vec[2]-=cent[2];
+					sub_v3_v3(bp->vec, cent);
 					mul_m3_v3(rotmat, bp->vec);
-					bp->vec[0]+=cent[0];
-					bp->vec[1]+=cent[1];
-					bp->vec[2]+=cent[2];
+					add_v3_v3(bp->vec, cent);
 				}
 				bp++;
 			}
@@ -1326,7 +1322,7 @@
 	}
 }
 
-static void weightflagNurb(ListBase *editnurb, short flag, float w, int mode)	/* mode==0: replace, mode==1: multiply */
+static void weightflagNurb(ListBase *editnurb, short flag, float w)
 {
 	Nurb *nu;
 	BPoint *bp;
@@ -1338,8 +1334,8 @@
 			bp= nu->bp;
 			while(a--) {
 				if(bp->f1 & flag) {
-					if(mode==1) bp->vec[3]*= w;
-					else bp->vec[3]= w;
+					/* a mode used to exist for replace/multiple but is was unused */
+					bp->vec[3]*= w;
 				}
 				bp++;
 			}
@@ -3969,14 +3965,9 @@
 
 /******************** spin operator ***********************/
 
-/* from what I can gather, the mode==0 magic number spins and bridges the nurbs based on the 
- * orientation of the global 3d view (yuck yuck!) mode==1 does the same, but doesn't bridge up
- * up the new geometry, mode==2 now does the same as 0, but aligned to world axes, not the view.
-*/
-
 /* 'cent' is in object space and 'dvec' in worldspace.
  */
-static int spin_nurb(RegionView3D *rv3d, Object *obedit, float *dvec, float *cent, short mode)
+static int spin_nurb(float viewmat[][4], Object *obedit, float *axis, float *cent)
 {
 	Curve *cu= (Curve*)obedit->data;
 	ListBase *editnurb= curve_get_editcurve(obedit);
@@ -3986,27 +3977,15 @@
 	float persmat[3][3], persinv[3][3];
 	short a,ok, changed= 0;
 
-	if (mode != 2)	copy_m3_m4(persmat, rv3d->viewmat);
-	else			unit_m3(persmat);
+	copy_m3_m4(persmat, viewmat);
 	invert_m3_m3(persinv, persmat);
 
 	/* imat and center and size */
 	copy_m3_m4(bmat, obedit->obmat);
 	invert_m3_m3(imat, bmat);
-
-	if(dvec || mode==2) {
-		if(dvec) {
-			normalize_v3_v3(n, dvec);
-		}
-		else {
-			n[0]=n[1]= 0.0;
-			n[2]= 1.0;
-		}
-	}
-	else {
-		normalize_v3_v3(n, rv3d->viewinv[2]);
-	}
 	
+	normalize_v3_v3(n, axis);
+	
 	phi= M_PI/8.0;
 	q[0]= cos(phi);
 	si= sin(phi);
@@ -4018,8 +3997,8 @@
 	mul_m3_m3m3(rotmat, imat, tmat);
 
 	unit_m3(scalemat1);
-	scalemat1[0][0]= sqrt(2.0);
-	scalemat1[1][1]= sqrt(2.0);
+	scalemat1[0][0]= M_SQRT2;
+	scalemat1[1][1]= M_SQRT2;
 
 	mul_m3_m3m3(tmat,persmat,bmat);
 	mul_m3_m3m3(cmat,scalemat1,tmat);
@@ -4027,8 +4006,8 @@
 	mul_m3_m3m3(scalemat1,imat,tmat);
 
 	unit_m3(scalemat2);
-	scalemat2[0][0]/= sqrt(2.0);
-	scalemat2[1][1]/= sqrt(2.0);
+	scalemat2[0][0]/= M_SQRT2;
+	scalemat2[1][1]/= M_SQRT2;
 
 	mul_m3_m3m3(tmat,persmat,bmat);
 	mul_m3_m3m3(cmat,scalemat2,tmat);
@@ -4038,26 +4017,23 @@
 	ok= 1;
 
 	for(a=0;a<7;a++) {
-		if(mode==0 || mode==2) ok= extrudeflagNurb(cu->editnurb, 1);
-		else adduplicateflagNurb(obedit, 1);
+		ok= extrudeflagNurb(cu->editnurb, 1);
 
 		if(ok==0)
 			return changed;
 
 		changed= 1;
 
-		rotateflagNurb(editnurb, 1,cent,rotmat);
+		rotateflagNurb(editnurb, SELECT, cent, rotmat);
 
-		if(mode==0 || mode==2) {
-			if( (a & 1)==0 ) {
-				rotateflagNurb(editnurb, 1,cent,scalemat1);
-				weightflagNurb(editnurb, 1, 0.25*sqrt(2.0), 1);
-			}
-			else {
-				rotateflagNurb(editnurb, 1,cent,scalemat2);
-				weightflagNurb(editnurb, 1, 4.0/sqrt(2.0), 1);
-			}
+		if( (a & SELECT)==0 ) {
+			rotateflagNurb(editnurb, SELECT, cent, scalemat1);
+			weightflagNurb(editnurb, SELECT, 0.25*M_SQRT2);
 		}
+		else {
+			rotateflagNurb(editnurb, SELECT, cent, scalemat2);
+			weightflagNurb(editnurb, SELECT, 4.0/M_SQRT2);
+		}
 	}
 
 	if(ok) {
@@ -4075,7 +4051,6 @@
 
 static int spin_exec(bContext *C, wmOperator *op)
 {
-	Scene *scene= CTX_data_scene(C);
 	Object *obedit= CTX_data_edit_object(C);
 	float cent[3], axis[3];
 	
@@ -4085,7 +4060,7 @@
 	invert_m4_m4(obedit->imat, obedit->obmat);
 	mul_m4_v3(obedit->imat, cent);
 	
-	if(!spin_nurb(ED_view3d_context_rv3d(C), obedit, axis, cent, 0)) {
+	if(!spin_nurb(ED_view3d_context_rv3d(C)->viewmat, obedit, axis, cent)) {
 		BKE_report(op->reports, RPT_ERROR, "Can't spin");
 		return OPERATOR_CANCELLED;
 	}
@@ -5638,10 +5613,10 @@
 Nurb *add_nurbs_primitive(bContext *C, float mat[4][4], int type, int newname)
 {
 	static int xzproj= 0;	/* this function calls itself... */
-	Scene *scene= CTX_data_scene(C);
 	Object *obedit= CTX_data_edit_object(C);
 	ListBase *editnurb= curve_get_editcurve(obedit);
 	View3D *v3d= CTX_wm_view3d(C);
+	RegionView3D *rv3d= ED_view3d_context_rv3d(C);
 	Nurb *nu = NULL;
 	BezTriple *bezt;
 	BPoint *bp;
@@ -5649,7 +5624,10 @@
 	float fac, grid;
 	int a, b, cutype, stype;
 	int force_3d = ((Curve *)obedit->data)->flag & CU_3D; /* could be adding to an existing 3D curve */
-	
+
+	float umat[4][4];
+	unit_m4(umat);
+
 	cutype= type & CU_TYPE;	// poly, bezier, nurbs, etc
 	stype= type & CU_PRIMITIVE;
 	
@@ -5834,7 +5812,7 @@
 					bp->vec[0]+= 0.25*nurbcircle[a][0]*grid-.75*grid;
 					bp->vec[2]+= 0.25*nurbcircle[a][1]*grid;
 				}
-				if(a & 1) bp->vec[3]= 0.25*sqrt(2.0);
+				if(a & 1) bp->vec[3]= 0.25*M_SQRT2;
 				else bp->vec[3]= 1.0;
 				mul_m4_v3(mat,bp->vec);
 				bp->radius = bp->weight = 1.0;
@@ -5925,7 +5903,7 @@
 	case CU_PRIM_SPHERE:	/* sphere */
 		if( cutype==CU_NURBS ) {
 			float tmp_cent[3] = {0.f, 0.f, 0.f};
-			float tmp_vec[3] = {0.f, 0.f, 0.f};
+			float tmp_vec[3] = {0.f, 0.f, 1.f};
 			
 			if(newname) {
 				rename_id((ID *)obedit, "SurfSphere");
@@ -5946,7 +5924,7 @@
 				bp->f1= SELECT;
 				bp->vec[0]+= nurbcircle[a][0]*grid;
 				bp->vec[2]+= nurbcircle[a][1]*grid;
-				if(a & 1) bp->vec[3]= 0.5*sqrt(2.0);
+				if(a & 1) bp->vec[3]= 0.5*M_SQRT2;
 				else bp->vec[3]= 1.0;
 				mul_m4_v3(mat,bp->vec);
 				bp++;
@@ -5955,11 +5933,11 @@
 			makeknots(nu, 1);
 
 			BLI_addtail(editnurb, nu); /* temporal for spin */
-			if(newname && (U.flag & USER_ADD_VIEWALIGNED) == 0)
-				spin_nurb(ED_view3d_context_rv3d(C), obedit, NULL, tmp_cent, 2);
-			else
-				spin_nurb(ED_view3d_context_rv3d(C), obedit, NULL, mat[3], (U.flag & USER_ADD_VIEWALIGNED) ? 0 : 2);
 
+			if(newname && (U.flag & USER_ADD_VIEWALIGNED) == 0)	spin_nurb(umat, obedit, tmp_vec, tmp_cent);
+			else if ((U.flag & USER_ADD_VIEWALIGNED))			spin_nurb(rv3d->viewmat, obedit, rv3d->viewinv[2], mat[3]);
+			else												spin_nurb(umat, obedit, tmp_vec, mat[3]);
+
 			makeknots(nu, 2);
 
 			a= nu->pntsu*nu->pntsv;
@@ -5974,7 +5952,7 @@
 	case CU_PRIM_DONUT:	/* torus */
 		if( cutype==CU_NURBS ) {
 			float tmp_cent[3] = {0.f, 0.f, 0.f};
-			float tmp_vec[3] = {0.f, 0.f, 0.f};
+			float tmp_vec[3] = {0.f, 0.f, 1.f};
 			
 			if(newname) {
 				rename_id((ID *)obedit, "SurfTorus");
@@ -5987,12 +5965,14 @@
 			nu->resolu= 4;
 			nu->resolv= 4;
 			nu->flag= CU_SMOOTH;
-			BLI_addtail(editnurb, nu); /* temporal for extrude and translate */
-			if(newname && (U.flag & USER_ADD_VIEWALIGNED) == 0)
-				spin_nurb(ED_view3d_context_rv3d(C), obedit, NULL, tmp_cent, 2);
-			else
-				spin_nurb(ED_view3d_context_rv3d(C), obedit, NULL, mat[3], (U.flag & USER_ADD_VIEWALIGNED) ? 0 : 2);
+			BLI_addtail(editnurb, nu); /* temporal for spin */
 
+			/* same as above */
+			if(newname && (U.flag & USER_ADD_VIEWALIGNED) == 0)	spin_nurb(umat, obedit, tmp_vec, tmp_cent);
+			else if ((U.flag & USER_ADD_VIEWALIGNED))			spin_nurb(rv3d->viewmat, obedit, rv3d->viewinv[2], mat[3]);
+			else												spin_nurb(umat, obedit, tmp_vec, mat[3]);
+
+
 			BLI_remlink(editnurb, nu);
 
 			a= nu->pntsu*nu->pntsv;





More information about the Bf-blender-cvs mailing list