[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [16942] trunk/blender/source/blender: fix for own bugs in curves.

Campbell Barton ideasman42 at gmail.com
Mon Oct 6 08:10:14 CEST 2008


Revision: 16942
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16942
Author:   campbellbarton
Date:     2008-10-06 08:10:14 +0200 (Mon, 06 Oct 2008)

Log Message:
-----------
fix for own bugs in curves.
- the number of segments was always 1 too many on cyclic curves.
- [#17739] - normals were not being calculated when rendering curves.

Replaced macro DL_SURFINDEX with a function. it that assumes variable names and could break from the loop that called it.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_displist.h
    trunk/blender/source/blender/blenkernel/intern/curve.c
    trunk/blender/source/blender/blenkernel/intern/displist.c
    trunk/blender/source/blender/blenkernel/intern/exotic.c
    trunk/blender/source/blender/python/api2_2x/NMesh.c
    trunk/blender/source/blender/render/intern/source/convertblender.c

Modified: trunk/blender/source/blender/blenkernel/BKE_displist.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_displist.h	2008-10-06 01:59:11 UTC (rev 16941)
+++ trunk/blender/source/blender/blenkernel/BKE_displist.h	2008-10-06 06:10:14 UTC (rev 16942)
@@ -50,29 +50,7 @@
 #define DL_FRONT_CURVE	4
 #define DL_BACK_CURVE	8
 
-#define DL_SURFINDEX(cyclu, cyclv, sizeu, sizev)	    \
-\
-if( (cyclv)==0 && a==(sizev)-1) break;		    \
-if(cyclu) {						    \
-	p1= sizeu*a;					    \
-		p2= p1+ sizeu-1;				    \
-			p3= p1+ sizeu;					    \
-				p4= p2+ sizeu;					    \
-					b= 0;						    \
-}							    \
-else {						    \
-	p2= sizeu*a;					    \
-		p1= p2+1;					    \
-			p4= p2+ sizeu;					    \
-				p3= p1+ sizeu;					    \
-					b= 1;						    \
-}							    \
-if( (cyclv) && a==sizev-1) {			    \
-	p3-= sizeu*sizev;				    \
-		p4-= sizeu*sizev;				    \
-}
 
-
 /* prototypes */
 
 struct Base;
@@ -114,6 +92,7 @@
 extern void shadeDispList(struct Base *base);
 extern void shadeMeshMCol(struct Object *ob, struct Mesh *me);
 
+int surfindex_displist(DispList *dl, int a, int *b, int *p1, int *p2, int *p3, int *p4);
 void imagestodisplist(void);
 void reshadeall_displist(void);
 void filldisplist(struct ListBase *dispbase, struct ListBase *to);

Modified: trunk/blender/source/blender/blenkernel/intern/curve.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/curve.c	2008-10-06 01:59:11 UTC (rev 16941)
+++ trunk/blender/source/blender/blenkernel/intern/curve.c	2008-10-06 06:10:14 UTC (rev 16942)
@@ -832,7 +832,9 @@
 	if(len==0) return;
 	sum= (float *)MEM_callocN(sizeof(float)*len, "makeNurbcurve1");
 	
-	resolu= (resolu*SEGMENTSU(nu))+1;
+	resolu= (resolu*SEGMENTSU(nu));
+	if((nu->flagu & CU_CYCLIC)==0) resolu++;
+	
 	if(resolu==0) {
 		MEM_freeN(sum);
 		return;
@@ -842,7 +844,8 @@
 	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);
+	ustep= (uend-ustart)/(resolu - ((nu->flagu & CU_CYCLIC) ? 0 : 1));
+	
 	basisu= (float *)MEM_mallocN(sizeof(float)*KNOTSU(nu), "makeNurbcurve3");
 
 	if(nu->flagu & CU_CYCLIC) cycl= nu->orderu-1; 
@@ -1678,7 +1681,9 @@
 			}
 			else if((nu->type & 7)==CU_NURBS) {
 				if(nu->pntsv==1) {
-					len= (resolu*SEGMENTSU(nu))+1;
+					len= (resolu*SEGMENTSU(nu));
+					if((nu->flagu & CU_CYCLIC)==0) len++;
+					
 					bl= MEM_callocN(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-10-06 01:59:11 UTC (rev 16941)
+++ trunk/blender/source/blender/blenkernel/intern/displist.c	2008-10-06 06:10:14 UTC (rev 16942)
@@ -206,9 +206,10 @@
 				ndata= dl->nors;
 				
 				for(a=0; a<dl->parts; a++) {
+					
+					if (surfindex_displist(dl, a, &b, &p1, &p2, &p3, &p4)==0)
+						break;
 	
-					DL_SURFINDEX(dl->flag & DL_CYCL_U, dl->flag & DL_CYCL_V, dl->nr, dl->parts);
-	
 					v1= vdata+ 3*p1; 
 					n1= ndata+ 3*p1;
 					v2= vdata+ 3*p2; 
@@ -271,6 +272,33 @@
 	}
 }
 
+int surfindex_displist(DispList *dl, int a, int *b, int *p1, int *p2, int *p3, int *p4)
+{
+	if((dl->flag & DL_CYCL_V)==0 && a==(dl->parts)-1) {
+		return 0;
+	}
+	
+	if(dl->flag & DL_CYCL_U) {
+		(*p1)= dl->nr*a;
+		(*p2)= (*p1)+ dl->nr-1;
+		(*p3)= (*p1)+ dl->nr;
+		(*p4)= (*p2)+ dl->nr;
+		(*b)= 0;
+	} else {
+		(*p2)= dl->nr*a;
+		(*p1)= (*p2)+1;
+		(*p4)= (*p2)+ dl->nr;
+		(*p3)= (*p1)+ dl->nr;
+		(*b)= 1;
+	}
+	
+	if( (dl->flag & DL_CYCL_U) && a==dl->parts-1) {			    \
+		(*p3)-= dl->nr*dl->parts;				    \
+		(*p4)-= dl->nr*dl->parts;				    \
+	}
+	
+	return 1;
+}
 
 /* ***************************** shade displist. note colors now are in rgb(a) order ******************** */
 
@@ -858,12 +886,14 @@
 				}
 			}
 			else if((nu->type & 7)==CU_NURBS) {
-				len= (resolu*SEGMENTSU(nu))+1;
+				len= (resolu*SEGMENTSU(nu));
+				if((nu->flagu & CU_CYCLIC)==0) len++;
 				
 				dl= MEM_callocN(sizeof(DispList), "makeDispListsurf");
 				dl->verts= MEM_callocN(len*3*sizeof(float), "dlverts");
 				BLI_addtail(dispbase, dl);
 				dl->parts= 1;
+				
 				dl->nr= len;
 				dl->col= nu->mat_nr;
 				dl->charidx = nu->charidx;
@@ -1308,7 +1338,8 @@
 	
 	for(a=0; a<dl->parts; a++) {
 		
-		DL_SURFINDEX(dl->flag & DL_CYCL_U, dl->flag & DL_CYCL_V, dl->nr, dl->parts);
+		if (surfindex_displist(dl, a, &b, &p1, &p2, &p3, &p4)==0)
+			break;
 		
 		for(; b<dl->nr; b++, index+=4) {	
 			index[0]= p1;

Modified: trunk/blender/source/blender/blenkernel/intern/exotic.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/exotic.c	2008-10-06 01:59:11 UTC (rev 16941)
+++ trunk/blender/source/blender/blenkernel/intern/exotic.c	2008-10-06 06:10:14 UTC (rev 16942)
@@ -2097,8 +2097,10 @@
 			}
 
 			for(a=0; a<dl->parts; a++) {
-
-				DL_SURFINDEX(dl->flag & DL_CYCL_U, dl->flag & DL_CYCL_V, dl->nr, dl->parts);
+				
+				if (surfindex_displist(dl, a, &b, &p1, &p2, &p3, &p4)==0)
+					break;
+				
 				p1+= startve; 
 				p2+= startve; 
 				p3+= startve; 

Modified: trunk/blender/source/blender/python/api2_2x/NMesh.c
===================================================================
--- trunk/blender/source/blender/python/api2_2x/NMesh.c	2008-10-06 01:59:11 UTC (rev 16941)
+++ trunk/blender/source/blender/python/api2_2x/NMesh.c	2008-10-06 06:10:14 UTC (rev 16942)
@@ -2158,9 +2158,9 @@
 
 			for(a=0; a<dl->parts; a++) {
 				
-				DL_SURFINDEX(dl->flag & DL_CYCL_U, dl->flag & DL_CYCL_V, dl->nr, dl->parts);
+				if (surfindex_displist(dl, a, &b, &p1, &p2, &p3, &p4)==0)
+					break;
 				
-				
 				for(; b<dl->nr; b++) {
 					vidx[0] = p2 + ioffset;
 					vidx[1] = p1 + ioffset;

Modified: trunk/blender/source/blender/render/intern/source/convertblender.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/convertblender.c	2008-10-06 01:59:11 UTC (rev 16941)
+++ trunk/blender/source/blender/render/intern/source/convertblender.c	2008-10-06 06:10:14 UTC (rev 16942)
@@ -2443,7 +2443,6 @@
 	VlakRen *vlr, *vlr1, *vlr2, *vlr3;
 	Curve *cu= ob->data;
 	float *data, n1[3];
-	/*float flen; - as yet unused */
 	int u, v, orcoret= 0;
 	int p1, p2, p3, p4, a;
 	int sizeu, nsizeu, sizev, nsizev;
@@ -2515,7 +2514,8 @@
 			vlr= RE_findOrAddVlak(obr, obr->totvlak++);
 			vlr->v1= v1; vlr->v2= v2; vlr->v3= v3; vlr->v4= v4;
 			
-			/* flen= CalcNormFloat4(vlr->v4->co, vlr->v3->co, vlr->v2->co, vlr->v1->co, n1); - as yet unused */
+			CalcNormFloat4(vlr->v4->co, vlr->v3->co, vlr->v2->co, vlr->v1->co, n1);
+			
 			VECCOPY(vlr->n, n1);
 			
 			vlr->mat= matar[ dl->col];
@@ -2787,8 +2787,10 @@
 					for(a=0; a<dl->parts; a++) {
 
 						frontside= (a >= dl->nr/2);
-
-						DL_SURFINDEX(dl->flag & DL_CYCL_U, dl->flag & DL_CYCL_V, dl->nr, dl->parts);
+						
+						if (surfindex_displist(dl, a, &b, &p1, &p2, &p3, &p4)==0)
+							break;
+						
 						p1+= startvert;
 						p2+= startvert;
 						p3+= startvert;





More information about the Bf-blender-cvs mailing list