[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [16696] trunk/blender/source/blender: changing the number of subdivisions for nurbs curves.

Campbell Barton ideasman42 at gmail.com
Tue Sep 23 08:26:48 CEST 2008


Revision: 16696
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16696
Author:   campbellbarton
Date:     2008-09-23 08:26:48 +0200 (Tue, 23 Sep 2008)

Log Message:
-----------
changing the number of subdivisions for nurbs curves.
this way each edge/segment gets the same number of points matching the resolution value.
before, a nurbs curve would have the same number of points no matter if it was cyclic or not.

This will make slight changes to objects on an animated path, but only noticable if the path has a low resolution.

bug [#11744] NurbCurve Radius incorrect - now dosnt show bad results with order 4 on non-cyclic curve.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_curve.h
    trunk/blender/source/blender/blenkernel/intern/anim.c
    trunk/blender/source/blender/blenkernel/intern/curve.c
    trunk/blender/source/blender/blenkernel/intern/displist.c
    trunk/blender/source/blender/src/editcurve.c

Modified: trunk/blender/source/blender/blenkernel/BKE_curve.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_curve.h	2008-09-23 05:00:00 UTC (rev 16695)
+++ trunk/blender/source/blender/blenkernel/BKE_curve.h	2008-09-23 06:26:48 UTC (rev 16696)
@@ -39,9 +39,12 @@
 struct BezTriple;
 struct BevList;
 
-#define KNOTSU(nu)	    ( (nu)->orderu+ (nu)->pntsu+ (nu->orderu-1)*((nu)->flagu & CU_CYCLIC) )
-#define KNOTSV(nu)	    ( (nu)->orderv+ (nu)->pntsv+ (nu->orderv-1)*((nu)->flagv & CU_CYCLIC) )
+#define KNOTSU(nu)	    ( (nu)->orderu+ (nu)->pntsu+ (((nu)->flagu & CU_CYCLIC) ? (nu->orderu-1) : 0) )
+#define KNOTSV(nu)	    ( (nu)->orderv+ (nu)->pntsv+ (((nu)->flagv & CU_CYCLIC) ? (nu->orderv-1) : 0) )
 
+/* Non cyclic nurbs have 1 less segment */
+#define SEGMENTSU(nu)	    ( ((nu)->flagu & CU_CYCLIC) ? (nu)->pntsu : (nu)->pntsu-1 )
+#define SEGMENTSV(nu)	    ( ((nu)->flagv & CU_CYCLIC) ? (nu)->pntsv : (nu)->pntsv-1 )
 
 void unlink_curve( struct Curve *cu);
 void free_curve( struct Curve *cu);

Modified: trunk/blender/source/blender/blenkernel/intern/anim.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/anim.c	2008-09-23 05:00:00 UTC (rev 16695)
+++ trunk/blender/source/blender/blenkernel/intern/anim.c	2008-09-23 06:26:48 UTC (rev 16696)
@@ -52,6 +52,7 @@
 #include "DNA_vfont_types.h"
 
 #include "BKE_anim.h"
+#include "BKE_curve.h"
 #include "BKE_DerivedMesh.h"
 #include "BKE_displist.h"
 #include "BKE_effect.h"
@@ -118,7 +119,7 @@
 	
 	path->len= tot+1;
 	/* exception: vector handle paths and polygon paths should be subdivided at least a factor resolu */
-	if(path->len<nu->resolu*nu->pntsu) path->len= nu->resolu*nu->pntsu;
+	if(path->len<nu->resolu*SEGMENTSU(nu)) path->len= nu->resolu*SEGMENTSU(nu);
 	
 	dist= (float *)MEM_mallocN((tot+1)*4, "calcpathdist");
 

Modified: trunk/blender/source/blender/blenkernel/intern/curve.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/curve.c	2008-09-23 05:00:00 UTC (rev 16695)
+++ trunk/blender/source/blender/blenkernel/intern/curve.c	2008-09-23 06:26:48 UTC (rev 16696)
@@ -825,8 +825,8 @@
 	len= nu->pntsu;
 	if(len==0) return;
 	sum= (float *)MEM_callocN(sizeof(float)*len, "makeNurbcurve1");
-
-	resolu*= nu->pntsu;
+	
+	resolu= (resolu*SEGMENTSU(nu))+1;
 	if(resolu==0) {
 		MEM_freeN(sum);
 		return;
@@ -836,7 +836,7 @@
 	ustart= fp[nu->orderu-1];
 	if(nu->flagu & CU_CYCLIC) uend= fp[nu->pntsu+nu->orderu-1];
 	else uend= fp[nu->pntsu];
-	ustep= (uend-ustart)/(resolu-1+(nu->flagu & CU_CYCLIC));
+	ustep= (uend-ustart)/(resolu-1);
 	basisu= (float *)MEM_mallocN(sizeof(float)*KNOTSU(nu), "makeNurbcurve3");
 
 	if(nu->flagu & CU_CYCLIC) cycl= nu->orderu-1; 
@@ -1620,7 +1620,7 @@
 			}
 			else if((nu->type & 7)==CU_NURBS) {
 				if(nu->pntsv==1) {
-					len= resolu*nu->pntsu;
+					len= (resolu*SEGMENTSU(nu))+1;
 					bl= MEM_mallocN(sizeof(BevList)+len*sizeof(BevPoint), "makeBevelList3");
 					BLI_addtail(&(cu->bev), bl);
 					bl->nr= len;

Modified: trunk/blender/source/blender/blenkernel/intern/displist.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/displist.c	2008-09-23 05:00:00 UTC (rev 16695)
+++ trunk/blender/source/blender/blenkernel/intern/displist.c	2008-09-23 06:26:48 UTC (rev 16696)
@@ -858,7 +858,8 @@
 				}
 			}
 			else if((nu->type & 7)==CU_NURBS) {
-				len= nu->pntsu*resolu;
+				len= (resolu*SEGMENTSU(nu))+1;
+				
 				dl= MEM_callocN(sizeof(DispList), "makeDispListsurf");
 				dl->verts= MEM_callocN(len*3*sizeof(float), "dlverts");
 				BLI_addtail(dispbase, dl);
@@ -1322,7 +1323,7 @@
 	for (nu=nubase->first; nu; nu=nu->next) {
 		if(forRender || nu->hide==0) {
 			if(nu->pntsv==1) {
-				len= nu->pntsu*nu->resolu;
+				len= nu->resolu*SEGMENTSU(nu)+1;
 				
 				dl= MEM_callocN(sizeof(DispList), "makeDispListsurf");
 				dl->verts= MEM_callocN(len*3*sizeof(float), "dlverts");

Modified: trunk/blender/source/blender/src/editcurve.c
===================================================================
--- trunk/blender/source/blender/src/editcurve.c	2008-09-23 05:00:00 UTC (rev 16695)
+++ trunk/blender/source/blender/src/editcurve.c	2008-09-23 06:26:48 UTC (rev 16696)
@@ -1727,7 +1727,7 @@
          */
 			/* count */
 			if(nu->flagu & CU_CYCLIC) {
-				a= nu->pntsu*nu->pntsv;
+				a= nu->pntsu;
 				bp= nu->bp;
 				prevbp= bp+(a-1);
 			}
@@ -2145,7 +2145,7 @@
 			nu->type |= 1;
 			calchandlesNurb(nu);
 		}
-		else if(type==4) {		    /* to Nurb */
+		else if(type==CU_NURBS) {
 			nu->type &= ~7;
 			nu->type+= 4;
 			nu->orderu= 4;





More information about the Bf-blender-cvs mailing list