[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [32192] trunk/blender/source/blender/ editors/curve/editcurve.c: bugfix [#24041] Adding NURBS Sphere and NURBS Donut problem

Campbell Barton ideasman42 at gmail.com
Wed Sep 29 17:19:16 CEST 2010


Revision: 32192
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=32192
Author:   campbellbarton
Date:     2010-09-29 17:19:16 +0200 (Wed, 29 Sep 2010)

Log Message:
-----------
bugfix [#24041] Adding NURBS Sphere and NURBS Donut problem

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 13:38:43 UTC (rev 32191)
+++ trunk/blender/source/blender/editors/curve/editcurve.c	2010-09-29 15:19:16 UTC (rev 32192)
@@ -3973,7 +3973,7 @@
  * 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.
 */
-static int spin_nurb(bContext *C, Scene *scene, Object *obedit, float *dvec, float *cent, short mode)
+static int spin_nurb(RegionView3D *rv3d, Object *obedit, float *dvec, float *cent, short mode)
 {
 	Curve *cu= (Curve*)obedit->data;
 	ListBase *editnurb= curve_get_editcurve(obedit);
@@ -3982,16 +3982,27 @@
 	float bmat[3][3], rotmat[3][3], scalemat1[3][3], scalemat2[3][3];
 	float persmat[3][3], persinv[3][3];
 	short a,ok, changed= 0;
-	
-	unit_m3(persmat);
+
+	if (mode != 2)	copy_m3_m4(persmat, rv3d->viewmat);
+	else			unit_m3(persmat);
 	invert_m3_m3(persinv, persmat);
 
 	/* imat and center and size */
 	copy_m3_m4(bmat, obedit->obmat);
 	invert_m3_m3(imat, bmat);
 
-	n[0]=n[1]= 0.0;
-	n[2]= 1.0;
+	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]);
+	}
 	
 	phi= M_PI/8.0;
 	q[0]= cos(phi);
@@ -4044,10 +4055,6 @@
 				weightflagNurb(editnurb, 1, 4.0/sqrt(2.0), 1);
 			}
 		}
-		if(dvec) {
-			mul_m3_v3(bmat,dvec);
-			translateflagNurb(editnurb, 1,dvec);
-		}
 	}
 
 	if(ok) {
@@ -4072,7 +4079,11 @@
 	RNA_float_get_array(op->ptr, "center", cent);
 	RNA_float_get_array(op->ptr, "axis", axis);
 	
-	if(!spin_nurb(C, scene, obedit, axis, cent, 0)) {
+	invert_m4_m4(obedit->imat, obedit->obmat);
+	mul_m4_v3(obedit->imat, cent);
+	mul_mat3_m4_v3(obedit->imat, axis);
+	
+	if(!spin_nurb(ED_view3d_context_rv3d(C), obedit, axis, cent, 2)) {
 		BKE_report(op->reports, RPT_ERROR, "Can't spin");
 		return OPERATOR_CANCELLED;
 	}
@@ -5884,6 +5895,13 @@
 			BLI_addtail(editnurb, nu); /* temporal for extrude and translate */
 			vec[0]=vec[1]= 0.0;
 			vec[2]= -grid;
+			
+			if(newname && (U.flag & USER_ADD_VIEWALIGNED) == 0) {
+				/* pass */
+			}
+			else {
+				mul_mat3_m4_v3(mat, vec);
+			}
 
 			translateflagNurb(editnurb, 1, vec);
 			extrudeflagNurb(cu->editnurb, 1);
@@ -5936,9 +5954,9 @@
 
 			BLI_addtail(editnurb, nu); /* temporal for spin */
 			if(newname && (U.flag & USER_ADD_VIEWALIGNED) == 0)
-				spin_nurb(C, scene, obedit, tmp_vec, tmp_cent, 2);
+				spin_nurb(ED_view3d_context_rv3d(C), obedit, NULL, tmp_cent, 2);
 			else
-				spin_nurb(C, scene, obedit, tmp_vec, mat[3], 2);
+				spin_nurb(ED_view3d_context_rv3d(C), obedit, NULL, mat[3], (U.flag & USER_ADD_VIEWALIGNED) ? 0 : 2);
 
 			makeknots(nu, 2);
 
@@ -5969,9 +5987,9 @@
 			nu->flag= CU_SMOOTH;
 			BLI_addtail(editnurb, nu); /* temporal for extrude and translate */
 			if(newname && (U.flag & USER_ADD_VIEWALIGNED) == 0)
-				spin_nurb(C, scene, obedit, tmp_vec, tmp_cent, 2);
+				spin_nurb(ED_view3d_context_rv3d(C), obedit, NULL, tmp_cent, 2);
 			else
-				spin_nurb(C, scene, obedit, tmp_vec, mat[3], 2);
+				spin_nurb(ED_view3d_context_rv3d(C), obedit, NULL, mat[3], (U.flag & USER_ADD_VIEWALIGNED) ? 0 : 2);
 
 			BLI_remlink(editnurb, nu);
 





More information about the Bf-blender-cvs mailing list