[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [27859] trunk/blender/source/blender/ blenkernel/intern/displist.c: Fix #21827: Outer portions of extruded 2D curves do not render correctly

Sergey Sharybin g.ulairi at gmail.com
Tue Mar 30 11:57:58 CEST 2010


Revision: 27859
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=27859
Author:   nazgul
Date:     2010-03-30 11:57:58 +0200 (Tue, 30 Mar 2010)

Log Message:
-----------
Fix #21827: Outer portions of extruded 2D curves do not render correctly

DispList->rt is used by render stuff to set vlak flags. This rt field is setting
to nurbs's flags in displist creation function. Possible flags for nurbs are
CU_SMOOTH and CU_2D. CU_SMOOTH is ok, but CU_2D conflicts with R_NOPUNOFLIP.

I cleared rt's CU_2D flag. Don't forget about possible conflicts if new
nurbs flags will be added.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/displist.c

Modified: trunk/blender/source/blender/blenkernel/intern/displist.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/displist.c	2010-03-30 09:54:17 UTC (rev 27858)
+++ trunk/blender/source/blender/blenkernel/intern/displist.c	2010-03-30 09:57:58 UTC (rev 27859)
@@ -1580,21 +1580,24 @@
 		if(forRender || nu->hide==0) {
 			if(nu->pntsv==1) {
 				len= SEGMENTSU(nu)*nu->resolu;
-				
+
 				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;
-				dl->rt= nu->flag;
-				
+
+				/* dl->rt will be used as flag for render face and */
+				/* CU_2D conflicts with R_NOPUNOFLIP */
+				dl->rt= nu->flag & ~CU_2D;
+
 				data= dl->verts;
 				if(nu->flagu & CU_NURB_CYCLIC) dl->type= DL_POLY;
 				else dl->type= DL_SEGM;
-				
+
 				makeNurbcurve(nu, data, NULL, NULL, nu->resolu, 3*sizeof(float));
 			}
 			else {
@@ -1606,11 +1609,14 @@
 
 				dl->col= nu->mat_nr;
 				dl->charidx= nu->charidx;
-				dl->rt= nu->flag;
-				
+
+				/* dl->rt will be used as flag for render face and */
+				/* CU_2D conflicts with R_NOPUNOFLIP */
+				dl->rt= nu->flag & ~CU_2D;
+
 				data= dl->verts;
 				dl->type= DL_SURF;
-				
+
 				dl->parts= (nu->pntsu*nu->resolu);	/* in reverse, because makeNurbfaces works that way */
 				dl->nr= (nu->pntsv*nu->resolv);
 				if(nu->flagv & CU_NURB_CYCLIC) dl->flag|= DL_CYCL_U;	/* reverse too! */
@@ -1683,26 +1689,29 @@
 				float *fp1, *data;
 				BevPoint *bevp;
 				int a,b;
-				
+
 				if (bl->nr) { /* blank bevel lists can happen */
-					
+
 					/* exception handling; curve without bevel or extrude, with width correction */
 					if(dlbev.first==NULL) {
 						dl= MEM_callocN(sizeof(DispList), "makeDispListbev");
 						dl->verts= MEM_callocN(3*sizeof(float)*bl->nr, "dlverts");
 						BLI_addtail(dispbase, dl);
-						
+
 						if(bl->poly!= -1) dl->type= DL_POLY;
 						else dl->type= DL_SEGM;
-						
+
 						if(dl->type==DL_SEGM) dl->flag = (DL_FRONT_CURVE|DL_BACK_CURVE);
-						
+
 						dl->parts= 1;
 						dl->nr= bl->nr;
 						dl->col= nu->mat_nr;
 						dl->charidx= nu->charidx;
-						dl->rt= nu->flag;
-						
+
+						/* dl->rt will be used as flag for render face and */
+						/* CU_2D conflicts with R_NOPUNOFLIP */
+						dl->rt= nu->flag & ~CU_2D;
+
 						a= dl->nr;
 						bevp= (BevPoint *)(bl+1);
 						data= dl->verts;
@@ -1716,10 +1725,10 @@
 					}
 					else {
 						DispList *dlb;
-						
+
 						for (dlb=dlbev.first; dlb; dlb=dlb->next) {
 	
-								/* for each part of the bevel use a separate displblock */
+							/* for each part of the bevel use a separate displblock */
 							dl= MEM_callocN(sizeof(DispList), "makeDispListbev1");
 							dl->verts= data= MEM_callocN(3*sizeof(float)*dlb->nr*bl->nr, "dlverts");
 							BLI_addtail(dispbase, dl);
@@ -1734,11 +1743,15 @@
 							dl->nr= dlb->nr;
 							dl->col= nu->mat_nr;
 							dl->charidx= nu->charidx;
-							dl->rt= nu->flag;
+
+							/* dl->rt will be used as flag for render face and */
+							/* CU_2D conflicts with R_NOPUNOFLIP */
+							dl->rt= nu->flag & ~CU_2D;
+
 							dl->bevelSplitFlag= MEM_callocN(sizeof(*dl->col2)*((bl->nr+0x1F)>>5), "col2");
 							bevp= (BevPoint *)(bl+1);
 	
-								/* for each point of poly make a bevel piece */
+							/* for each point of poly make a bevel piece */
 							bevp= (BevPoint *)(bl+1);
 							for(a=0; a<bl->nr; a++,bevp++) {
 								float fac=1.0;
@@ -1748,7 +1761,7 @@
 								} else {
 									fac = calc_taper(scene, cu->taperobj, a, bl->nr);
 								}
-								
+
 								if (bevp->split_tag) {
 									dl->bevelSplitFlag[a>>5] |= 1<<(a&0x1F);
 								}
@@ -1762,9 +1775,9 @@
 										vec[0]= fp1[1]+widfac;
 										vec[1]= fp1[2];
 										vec[2]= 0.0;
-										
+
 										mul_qt_v3(bevp->quat, vec);
-										
+
 										data[0]= bevp->vec[0] + fac*vec[0];
 										data[1]= bevp->vec[1] + fac*vec[1];
 										data[2]= bevp->vec[2] + fac*vec[2];





More information about the Bf-blender-cvs mailing list