[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [13375] trunk/blender/source/blender/ render/intern:

Brecht Van Lommel brechtvanlommel at pandora.be
Wed Jan 23 21:54:44 CET 2008


Revision: 13375
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=13375
Author:   blendix
Date:     2008-01-23 21:54:44 +0100 (Wed, 23 Jan 2008)

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

Bugfix to filter strands with solid correctly.

Modified Paths:
--------------
    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

Modified: trunk/blender/source/blender/render/intern/include/rendercore.h
===================================================================
--- trunk/blender/source/blender/render/intern/include/rendercore.h	2008-01-23 17:58:09 UTC (rev 13374)
+++ trunk/blender/source/blender/render/intern/include/rendercore.h	2008-01-23 20:54:44 UTC (rev 13375)
@@ -50,6 +50,7 @@
 struct RenderPart;
 struct RenderLayer;
 struct ObjectRen;
+struct ListBase;
 
 /* ------------------------------------------------------------------------- */
 
@@ -90,6 +91,8 @@
 
 void zbufshade_sss_tile(struct RenderPart *pa);
 
+void addps(struct ListBase *lb, long *rd, int obi, int facenr, int z, unsigned short mask);
+
 /* -------- ray.c ------- */
 
 extern void freeraytree(Render *re);

Modified: trunk/blender/source/blender/render/intern/include/zbuf.h
===================================================================
--- trunk/blender/source/blender/render/intern/include/zbuf.h	2008-01-23 17:58:09 UTC (rev 13374)
+++ trunk/blender/source/blender/render/intern/include/zbuf.h	2008-01-23 20:54:44 UTC (rev 13375)
@@ -50,7 +50,7 @@
 void zbuffer_shadow(struct Render *re, float winmat[][4], struct LampRen *lar, int *rectz, int size, float jitx, float jity);
 void zbuffer_solid(struct RenderPart *pa, unsigned int layer, short layflag, void (*fillfunc)(struct RenderPart*, struct ZSpan*, int, void*), void *data);
 
-unsigned short *zbuffer_transp_shade(struct RenderPart *pa, struct RenderLayer *rl, float *pass);
+unsigned short *zbuffer_transp_shade(struct RenderPart *pa, struct RenderLayer *rl, float *pass, struct ListBase *psmlist);
 unsigned short *zbuffer_strands_shade(struct Render *re, struct RenderPart *pa, struct RenderLayer *rl, float *pass);
 void convert_zbuf_to_distbuf(struct RenderPart *pa, struct RenderLayer *rl);
 void zbuffer_sss(RenderPart *pa, unsigned int lay, void *handle, void (*func)(void*, int, int, int, int, int));

Modified: trunk/blender/source/blender/render/intern/source/rendercore.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/rendercore.c	2008-01-23 17:58:09 UTC (rev 13374)
+++ trunk/blender/source/blender/render/intern/source/rendercore.c	2008-01-23 20:54:44 UTC (rev 13375)
@@ -631,7 +631,7 @@
 	lb->first= lb->last= NULL;
 }
 
-static void addps(ListBase *lb, long *rd, int obi, int facenr, int z, unsigned short mask)
+void addps(ListBase *lb, long *rd, int obi, int facenr, int z, unsigned short mask)
 {
 	PixStrMain *psm;
 	PixStr *ps, *last= NULL;
@@ -925,7 +925,7 @@
 				
 				/* swap for live updates, and it is used in zbuf.c!!! */
 				SWAP(float *, rl->acolrect, rl->rectf);
-				ztramask= zbuffer_transp_shade(pa, rl, rl->rectf);
+				ztramask= zbuffer_transp_shade(pa, rl, rl->rectf, &psmlist);
 				SWAP(float *, rl->acolrect, rl->rectf);
 				
 				/* zbuffer transp only returns ztramask if there's solid rendered */
@@ -1147,7 +1147,7 @@
 				
 				/* swap for live updates */
 				SWAP(float *, rl->acolrect, rl->rectf);
-				zbuffer_transp_shade(pa, rl, rl->rectf);
+				zbuffer_transp_shade(pa, rl, rl->rectf, NULL);
 				SWAP(float *, rl->acolrect, rl->rectf);
 				
 				fcol= rl->rectf; acol= rl->acolrect;

Modified: trunk/blender/source/blender/render/intern/source/strand.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/strand.c	2008-01-23 17:58:09 UTC (rev 13374)
+++ trunk/blender/source/blender/render/intern/source/strand.c	2008-01-23 20:54:44 UTC (rev 13375)
@@ -428,6 +428,7 @@
 	ShadeResult *result;
 	float *pass;
 	int *rectz, *outrectz;
+	long *rectdaps;
 	unsigned short *mask;
 	int rectx, recty;
 	int addpassflag, addzbuf, sample;
@@ -607,13 +608,33 @@
 	StrandBuffer *buffer= spart->segment->buffer;
 	ShadeResult *shr;
 	float /**pass,*/ t, s;
-	int offset, zverg;
+	int offset, zverg, bufferz;
 
 	/* check again solid z-buffer */
 	offset = y*spart->rectx + x;
 	zverg= (int)z;
 
-	if(zverg < spart->rectz[offset]) {
+	if(spart->rectdaps) {
+		/* find the z of the sample */
+		PixStr *ps;
+		long *rd= spart->rectdaps + offset;
+		int sample= (1<<spart->sample);
+		
+		bufferz= 0x7FFFFFFF;
+		
+		if(*rd) {	
+			for(ps= (PixStr *)(*rd); ps; ps= ps->next) {
+				if(sample & ps->mask) {
+					bufferz= ps->z;
+					break;
+				}
+			}
+		}
+	}
+	else
+		bufferz= spart->rectz[offset];
+
+	if(zverg < bufferz) {
 		/* fill in output z-buffer if needed */
 		if(spart->addzbuf)
 			if(zverg < spart->outrectz[offset])
@@ -994,6 +1015,7 @@
 	spart.rectx= pa->rectx;
 	spart.recty= pa->recty;
 	spart.rectz= pa->rectz;
+	spart.rectdaps= pa->rectdaps;
 	spart.addpassflag= rl->passflag & ~(SCE_PASS_Z|SCE_PASS_COMBINED);
 	spart.addzbuf= rl->passflag & SCE_PASS_Z;
 

Modified: trunk/blender/source/blender/render/intern/source/zbuf.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/zbuf.c	2008-01-23 17:58:09 UTC (rev 13374)
+++ trunk/blender/source/blender/render/intern/source/zbuf.c	2008-01-23 20:54:44 UTC (rev 13375)
@@ -3693,7 +3693,7 @@
 
 /* main render call to fill in pass the full transparent layer */
 /* returns a mask, only if a) transp rendered and b) solid was rendered */
-unsigned short *zbuffer_transp_shade(RenderPart *pa, RenderLayer *rl, float *pass)
+unsigned short *zbuffer_transp_shade(RenderPart *pa, RenderLayer *rl, float *pass, ListBase *psmlist)
 {
 	RenderResult *rr= pa->result;
 	ShadeSample ssamp;
@@ -3859,6 +3859,9 @@
 								*sp |= zrow[totface].mask;
 							if(filled==0)
 								break;
+
+							if(R.totstrand)
+								addps(psmlist, pa->rectdaps+od, zrow[totface].obi, zrow[totface].p, zrow[totface].z, zrow[totface].mask);
 						}
 					}
 					





More information about the Bf-blender-cvs mailing list