[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [13782] trunk/blender/source/blender:

Brecht Van Lommel brechtvanlommel at pandora.be
Wed Feb 20 15:17:53 CET 2008


Revision: 13782
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=13782
Author:   blendix
Date:     2008-02-20 15:17:53 +0100 (Wed, 20 Feb 2008)

Log Message:
-----------

Negative zmask rendering: now there is a setting to render everything
behind the zmask instead of in front. Might need tweaks, and doesn't
work with halo yet.

Modified Paths:
--------------
    trunk/blender/source/blender/makesdna/DNA_scene_types.h
    trunk/blender/source/blender/render/intern/include/render_types.h
    trunk/blender/source/blender/render/intern/include/rendercore.h
    trunk/blender/source/blender/render/intern/include/zbuf.h
    trunk/blender/source/blender/render/intern/source/rendercore.c
    trunk/blender/source/blender/render/intern/source/strand.c
    trunk/blender/source/blender/render/intern/source/zbuf.c
    trunk/blender/source/blender/src/buttons_scene.c

Modified: trunk/blender/source/blender/makesdna/DNA_scene_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_scene_types.h	2008-02-20 14:10:41 UTC (rev 13781)
+++ trunk/blender/source/blender/makesdna/DNA_scene_types.h	2008-02-20 14:17:53 UTC (rev 13782)
@@ -138,10 +138,11 @@
 #define SCE_LAY_STRAND	32
 	/* flags between 32 and 0x8000 are set to 1 already, for future options */
 
-#define SCE_LAY_ALL_Z	0x8000
-#define SCE_LAY_XOR		0x10000
-#define SCE_LAY_DISABLE	0x20000
-#define SCE_LAY_ZMASK	0x40000
+#define SCE_LAY_ALL_Z		0x8000
+#define SCE_LAY_XOR			0x10000
+#define SCE_LAY_DISABLE		0x20000
+#define SCE_LAY_ZMASK		0x40000
+#define SCE_LAY_NEG_ZMASK	0x80000
 
 /* srl->passflag */
 #define SCE_PASS_COMBINED	1

Modified: trunk/blender/source/blender/render/intern/include/render_types.h
===================================================================
--- trunk/blender/source/blender/render/intern/include/render_types.h	2008-02-20 14:10:41 UTC (rev 13781)
+++ trunk/blender/source/blender/render/intern/include/render_types.h	2008-02-20 14:17:53 UTC (rev 13782)
@@ -85,6 +85,7 @@
 	int *recto;						/* object table for objects */
 	int *rectp;						/* polygon index table */
 	int *rectz;						/* zbuffer */
+	int *rectmask;					/* negative zmask */
 	long *rectdaps;					/* delta acum buffer for pixel structs */
 	int *rectbacko;					/* object table for backside sss */
 	int *rectbackp;					/* polygon index table for backside sss */

Modified: trunk/blender/source/blender/render/intern/include/rendercore.h
===================================================================
--- trunk/blender/source/blender/render/intern/include/rendercore.h	2008-02-20 14:10:41 UTC (rev 13781)
+++ trunk/blender/source/blender/render/intern/include/rendercore.h	2008-02-20 14:17:53 UTC (rev 13782)
@@ -57,7 +57,7 @@
 typedef struct PixStr
 {
 	struct PixStr *next;
-	int obi, facenr, z;
+	int obi, facenr, z, maskz;
 	unsigned short mask;
 	short shadfac;
 } PixStr;

Modified: trunk/blender/source/blender/render/intern/include/zbuf.h
===================================================================
--- trunk/blender/source/blender/render/intern/include/zbuf.h	2008-02-20 14:10:41 UTC (rev 13781)
+++ trunk/blender/source/blender/render/intern/include/zbuf.h	2008-02-20 14:17:53 UTC (rev 13782)
@@ -96,6 +96,7 @@
 	int *rectz1;							/* seconday z buffer for shadowbuffer (2nd closest z) */
 	int *rectp;								/* polygon index buffer */
 	int *recto;								/* object buffer */
+	int *rectmask;							/* negative zmask buffer */
 	APixstr *apixbuf, *curpstr;				/* apixbuf for transparent */
 	APixstrand *curpstrand;					/* same for strands */
 	struct ListBase *apsmbase;

Modified: trunk/blender/source/blender/render/intern/source/rendercore.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/rendercore.c	2008-02-20 14:10:41 UTC (rev 13781)
+++ trunk/blender/source/blender/render/intern/source/rendercore.c	2008-02-20 14:17:53 UTC (rev 13782)
@@ -684,7 +684,7 @@
 	lb->first= lb->last= NULL;
 }
 
-static void addps(ListBase *lb, long *rd, int obi, int facenr, int z, unsigned short mask)
+static void addps(ListBase *lb, long *rd, int obi, int facenr, int z, int maskz, unsigned short mask)
 {
 	PixStrMain *psm;
 	PixStr *ps, *last= NULL;
@@ -717,6 +717,7 @@
 	ps->obi= obi;
 	ps->facenr= facenr;
 	ps->z= z;
+	ps->maskz= maskz;
 	ps->mask = mask;
 	ps->shadfac= 0;
 }
@@ -905,16 +906,16 @@
 	int *ro= zspan->recto;
 	int *rp= zspan->rectp;
 	int *rz= zspan->rectz;
+	int *rm= zspan->rectmask;
 	int x, y;
 	int mask= 1<<sample;
 
 	for(y=0; y<pa->recty; y++) {
-		for(x=0; x<pa->rectx; x++, rd++, rp++, ro++) {
+		for(x=0; x<pa->rectx; x++, rd++, rp++, ro++, rz++, rm++) {
 			if(*rp) {
-				addps(lb, rd, *ro, *rp, *(rz+x), mask);
+				addps(lb, rd, *ro, *rp, *rz, (zspan->rectmask)? *rm: 0, mask);
 			}
 		}
-		rz+= pa->rectx;
 	}
 
 	if(sdata->rl->layflag & SCE_LAY_EDGE) 
@@ -936,9 +937,10 @@
 	pa->recto= MEM_mallocN(sizeof(int)*pa->rectx*pa->recty, "recto");
 	pa->rectp= MEM_mallocN(sizeof(int)*pa->rectx*pa->recty, "rectp");
 	pa->rectz= MEM_mallocN(sizeof(int)*pa->rectx*pa->recty, "rectz");
+	for(rl= rr->layers.first; rl; rl= rl->next) {
+		if((rl->layflag & SCE_LAY_ZMASK) && (rl->layflag & SCE_LAY_NEG_ZMASK))
+			pa->rectmask= MEM_mallocN(sizeof(int)*pa->rectx*pa->recty, "rectmask");
 	
-	for(rl= rr->layers.first; rl; rl= rl->next) {
-
 		/* initialize pixelstructs and edge buffer */
 		addpsmain(&psmlist);
 		pa->rectdaps= MEM_callocN(sizeof(long)*pa->rectx*pa->recty+4, "zbufDArectd");
@@ -1041,6 +1043,11 @@
 		
 		if(edgerect) MEM_freeN(edgerect);
 		edgerect= NULL;
+
+		if(pa->rectmask) {
+			MEM_freeN(pa->rectmask);
+			pa->rectmask= NULL;
+		}
 	}
 	
 	/* free all */
@@ -1076,7 +1083,9 @@
 	pa->rectz= MEM_mallocN(sizeof(int)*pa->rectx*pa->recty, "rectz");
 
 	for(rl= rr->layers.first; rl; rl= rl->next) {
-		
+		if((rl->layflag & SCE_LAY_ZMASK) && (rl->layflag & SCE_LAY_NEG_ZMASK))
+			pa->rectmask= MEM_mallocN(sizeof(int)*pa->rectx*pa->recty, "rectmask");
+
 		/* general shader info, passes */
 		shade_sample_initialize(&ssamp, pa, rl);
 		
@@ -1190,6 +1199,11 @@
 		
 		if(edgerect) MEM_freeN(edgerect);
 		edgerect= NULL;
+
+		if(pa->rectmask) {
+			MEM_freeN(pa->rectmask);
+			pa->rectmask= NULL;
+		}
 	}
 
 	/* display active layer */
@@ -1223,7 +1237,7 @@
 	if(pa->rectall) {
 		long *rs= pa->rectall + pa->rectx*y + x;
 
-		addps(&handle->psmlist, rs, obi, facenr, z, 0);
+		addps(&handle->psmlist, rs, obi, facenr, z, 0, 0);
 		handle->totps++;
 	}
 	if(pa->rectz) {

Modified: trunk/blender/source/blender/render/intern/source/strand.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/strand.c	2008-02-20 14:10:41 UTC (rev 13781)
+++ trunk/blender/source/blender/render/intern/source/strand.c	2008-02-20 14:17:53 UTC (rev 13782)
@@ -415,6 +415,7 @@
 	APixstrand *apixbuf;
 	int *totapixbuf;
 	int *rectz;
+	int *rectmask;
 	long *rectdaps;
 	int rectx, recty;
 	int sample;
@@ -495,7 +496,7 @@
 	StrandSegment *sseg= spart->segment;
 	APixstrand *apn, *apnew;
 	float t, s;
-	int offset, mask, obi, strnr, seg, zverg, bufferz;
+	int offset, mask, obi, strnr, seg, zverg, bufferz, maskz=0;
 
 	offset = y*spart->rectx + x;
 	obi= sseg->obi - spart->re->objectinstance;
@@ -512,18 +513,24 @@
 		long *rd= spart->rectdaps + offset;
 		
 		bufferz= 0x7FFFFFFF;
+		if(spart->rectmask) maskz= 0x7FFFFFFF;
 		
 		if(*rd) {	
 			for(ps= (PixStr *)(*rd); ps; ps= ps->next) {
 				if(mask & ps->mask) {
 					bufferz= ps->z;
+					if(spart->rectmask)
+						maskz= ps->maskz;
 					break;
 				}
 			}
 		}
 	}
-	else
+	else {
 		bufferz= spart->rectz[offset];
+		if(spart->rectmask)
+			maskz= spart->rectmask[offset];
+	}
 
 #define CHECK_ADD(n) \
 	if(apn->p[n]==strnr && apn->obi[n]==obi && apn->seg[n]==seg) \
@@ -534,29 +541,31 @@
 
 	/* add to pixel list */
 	if(zverg < bufferz && (spart->totapixbuf[offset] < MAX_ZROW)) {
-		t = u*spart->t[0] + v*spart->t[1] + (1.0f-u-v)*spart->t[2];
-		s = fabs(u*spart->s[0] + v*spart->s[1] + (1.0f-u-v)*spart->s[2]);
+		if(!spart->rectmask || zverg > maskz) {
+			t = u*spart->t[0] + v*spart->t[1] + (1.0f-u-v)*spart->t[2];
+			s = fabs(u*spart->s[0] + v*spart->s[1] + (1.0f-u-v)*spart->s[2]);
 
-		apn= spart->apixbuf + offset;
-		while(apn) {
-			CHECK_ADD(0);
-			CHECK_ADD(1);
-			CHECK_ADD(2);
-			CHECK_ADD(3);
-			CHECK_ASSIGN(0);
-			CHECK_ASSIGN(1);
-			CHECK_ASSIGN(2);
-			CHECK_ASSIGN(3);
+			apn= spart->apixbuf + offset;
+			while(apn) {
+				CHECK_ADD(0);
+				CHECK_ADD(1);
+				CHECK_ADD(2);
+				CHECK_ADD(3);
+				CHECK_ASSIGN(0);
+				CHECK_ASSIGN(1);
+				CHECK_ASSIGN(2);
+				CHECK_ASSIGN(3);
 
-			apnew= addpsAstrand(spart->zspan);
-			SWAP(APixstrand, *apnew, *apn);
-			apn->next= apnew;
-			CHECK_ASSIGN(0);
+				apnew= addpsAstrand(spart->zspan);
+				SWAP(APixstrand, *apnew, *apn);
+				apn->next= apnew;
+				CHECK_ASSIGN(0);
+			}
+
+			strand_shade_refcount(cache, sseg->v[1]);
+			strand_shade_refcount(cache, sseg->v[2]);
+			spart->totapixbuf[offset]++;
 		}
-
-		strand_shade_refcount(cache, sseg->v[1]);
-		strand_shade_refcount(cache, sseg->v[2]);
-		spart->totapixbuf[offset]++;
 	}
 }
 
@@ -779,6 +788,7 @@
 	spart.zspan= &zspan;
 	spart.rectdaps= pa->rectdaps;
 	spart.rectz= pa->rectz;
+	spart.rectmask= pa->rectmask;
 	spart.cache= cache;
 
 	zbuf_alloc_span(&zspan, pa->rectx, pa->recty, re->clipcrop);

Modified: trunk/blender/source/blender/render/intern/source/zbuf.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/zbuf.c	2008-02-20 14:10:41 UTC (rev 13781)
+++ trunk/blender/source/blender/render/intern/source/zbuf.c	2008-02-20 14:17:53 UTC (rev 13782)
@@ -306,8 +306,8 @@
 	float x0,y0,z0;
 	float x1,y1,z1,x2,y2,z2,xx1;
 	float *span1, *span2;
-	int *rz, x, y;
-	int sn1, sn2, rectx, *rectzofs, my0, my2, mask;
+	int *rz, *rm, x, y;
+	int sn1, sn2, rectx, *rectzofs, *rectmaskofs, my0, my2, mask;
 	
 	/* init */
 	zbuf_init_span(zspan);
@@ -352,6 +352,7 @@
 	/* start-offset in rect */
 	rectx= zspan->rectx;
 	rectzofs= (int *)(zspan->arectz+rectx*(my2));
+	rectmaskofs= (int *)(zspan->rectmask+rectx*(my2));
 	apofs= (zspan->apixbuf+ rectx*(my2));
 	mask= zspan->mask;
 
@@ -378,6 +379,7 @@
 		if(sn2>=sn1) {
 			zverg= (double)sn1*zxd + zy0;
 			rz= rectzofs+sn1;
+			rm= rectmaskofs+sn1;
 			ap= apofs+sn1;
 			x= sn2-sn1;
 			
@@ -385,26 +387,29 @@
 			
 			while(x>=0) {
 				if( (int)zverg < *rz) {
-//					int i= zvlnr & 3;
-					
-					apn= ap;
-					while(apn) {
-						if(apn->p[0]==0) {apn->obi[0]= obi; apn->p[0]= zvlnr; apn->z[0]= zverg; apn->mask[0]= mask; break; }
-						if(apn->p[0]==zvlnr && apn->obi[0]==obi) {apn->mask[0]|= mask; break; }
-						if(apn->p[1]==0) {apn->obi[1]= obi; apn->p[1]= zvlnr; apn->z[1]= zverg; apn->mask[1]= mask; break; }
-						if(apn->p[1]==zvlnr && apn->obi[1]==obi) {apn->mask[1]|= mask; break; }
-						if(apn->p[2]==0) {apn->obi[2]= obi; apn->p[2]= zvlnr; apn->z[2]= zverg; apn->mask[2]= mask; break; }
-						if(apn->p[2]==zvlnr && apn->obi[2]==obi) {apn->mask[2]|= mask; break; }
-						if(apn->p[3]==0) {apn->obi[3]= obi; apn->p[3]= zvlnr; apn->z[3]= zverg; apn->mask[3]= mask; break; }
-						if(apn->p[3]==zvlnr && apn->obi[3]==obi) {apn->mask[3]|= mask; break; }

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list