Revision: 16211
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16211
Author:   joeedh
Date:     2008-08-21 21:10:32 +0200 (Thu, 21 Aug 2008)

Log Message:
-----------
fix for somewhat embarresing threading bug introduced
when I added the option to only use the main thread
for rendering if threads is set to 1 (it's a #define'd
option the code for debugging purposes, as it doesn't work
quite as well).

Modified Paths:
--------------
    
branches/soc-2007-joeedh/source/blender/render/intern/source/convertblender.c
    branches/soc-2007-joeedh/source/blender/render/intern/source/dsm.c
    branches/soc-2007-joeedh/source/blender/render/intern/source/dsm_soft.c
    branches/soc-2007-joeedh/source/blender/render/intern/source/pipeline.c
    branches/soc-2007-joeedh/source/blender/render/intern/source/rayshade.c

Modified: 
branches/soc-2007-joeedh/source/blender/render/intern/source/convertblender.c
===================================================================
--- 
branches/soc-2007-joeedh/source/blender/render/intern/source/convertblender.c   
    2008-08-21 19:00:24 UTC (rev 16210)
+++ 
branches/soc-2007-joeedh/source/blender/render/intern/source/convertblender.c   
    2008-08-21 19:10:32 UTC (rev 16211)
@@ -3587,7 +3587,7 @@
        
        /* Annoying, lamp UI does this, but the UI might not have been used? - 
add here too.
         * make sure this matches buttons_shading.c's logic */
-       if(ELEM4(la->type, LA_AREA, LA_SPOT, LA_SUN, LA_LOCAL) && (la->mode & 
LA_SHAD_RAY))
+       if(ELEM4(la->type, LA_AREA, LA_SPOT, LA_SUN, LA_LOCAL))
                if (ELEM3(la->type, LA_SPOT, LA_SUN, LA_LOCAL))
                        if (la->ray_samp_method == LA_SAMP_CONSTANT) 
la->ray_samp_method = LA_SAMP_HALTON;
        

Modified: branches/soc-2007-joeedh/source/blender/render/intern/source/dsm.c
===================================================================
--- branches/soc-2007-joeedh/source/blender/render/intern/source/dsm.c  
2008-08-21 19:00:24 UTC (rev 16210)
+++ branches/soc-2007-joeedh/source/blender/render/intern/source/dsm.c  
2008-08-21 19:10:32 UTC (rev 16211)
@@ -749,6 +749,7 @@
                                                        zco= 
((float)apn->z[a])/2147483647.0f;
                                                        zco = 
(shb->winmat[3][2])/(shb->winmat[2][2] - shb->winmat[2][3]*zco);
                                                        zco = (zco - 
shb->clipsta) / (shb->clipend - shb->clipsta);
+
                                                        row2[totface].depth = 
2147483647.0f*zco;
                                                        //if (zco < -0.001 || 
zco > 1.001) printf("linear z: %f\n", zco);
                                                } else row2[totface].depth = 
apn->z[a];

Modified: 
branches/soc-2007-joeedh/source/blender/render/intern/source/dsm_soft.c
===================================================================
--- branches/soc-2007-joeedh/source/blender/render/intern/source/dsm_soft.c     
2008-08-21 19:00:24 UTC (rev 16210)
+++ branches/soc-2007-joeedh/source/blender/render/intern/source/dsm_soft.c     
2008-08-21 19:10:32 UTC (rev 16211)
@@ -79,7 +79,125 @@
 extern Render R;
 static TCS_TilePool *deepbuffer_pool = NULL;
 
+#if 0
+/*backprojection based method*/
+float DSM_getBPSoftShadow(Render *re, ShadBuf *shb, ShadeInput *shi, LampRen 
*lar,
+                                                float *rco, float *dxco, float 
*dyco, float inp, int channel)
+{
+       DSMBuffer *buf = shb->dsmbuffer;
+       DSMTile *tile;
+       DSMFunction *func;
+       DSMSampleLayer *samp, *startsamp=NULL;
+       float fac, co[4], co2[4], d, siz;
+       float xs, ys, a, b, res, worldz, startz;
+       int zs, bias, i;
+       float corners[4];
 
+       BASSERT(shb->dsmbuffer);
+
+       if(inp <= 0.0f) return 0.0f;
+
+       /* rotate renderco en osaco */
+       siz= 0.5f*(float)shb->size;
+
+       VECCOPY(co, rco);
+       VECCOPY(co4, rco;
+
+       co4[3] = 1.0f;
+       co[3]= 1.0f;
+       MTC_Mat4MulVec4fl(shb->persmat, co); /* rational hom co */
+       MTC_Mat4MulVec4fl(shb->viewmat, co4); /* used for getting world-space 
depth */
+       
+       worldz = co4[2];
+
+       xs= siz*(1.0f+co[0]/co[3]);
+       ys= siz*(1.0f+co[1]/co[3]);
+
+       /* Clip for z: clipsta and clipend clip values of the shadow buffer. We
+               * can test for -1.0/1.0 because of the properties of the
+               * coordinate transformations. */
+
+       if (G.rt == 20) d = -0.0f;
+       else d = -1.0f;
+
+       if (G.rt == 30) {
+               if (co[2] - shb->clipsta < -0.00001f) return 1.0;
+               else if (co[2] > shb->clipend) co[2] = shb->clipend - 0.001;
+
+               fac= (double)(co[2] - shb->clipsta) / (double)(shb->clipend - 
shb->clipsta);
+       } else {
+
+               /* Clip for z: clipsta and clipend clip values of the shadow 
buffer. We
+                       * can test for -1.0/1.0 because of the properties of the
+                       * coordinate transformations. */
+               fac= (co[2]/co[3]);
+
+               if(fac>=1.0f) {
+                       return 0.0f;
+               } else if(fac<= -1.0f) {
+                       return 1.0f;
+               }
+
+               if (G.rt == 31 || DSM_LINEAR) {
+                       fac = (shb->winmat[3][2])/(shb->winmat[2][2] - 
shb->winmat[2][3]*fac);
+                       fac     = (fac - shb->clipsta) / (shb->clipend - 
shb->clipsta);
+               }
+       }
+
+       zs= ((float)0x7FFFFFFF)*fac;
+
+       /* with inp==1.0, bias is half the size. correction value was 1.1, 
giving errors
+          on cube edges, with one side being almost frontal lighted (ton)  */
+       bias= (1.5f-inp*inp)*shb->bias;
+
+       if (xs >= buf->sizex || xs < 0) {
+               return 1.0;
+       }
+
+       if (ys >= buf->sizey || ys < 0) {
+               return 1.0;
+       }
+
+       tile = TCS_GetAndLockTile(dbuf, xs, ys, 0);
+       xs %= buf->tsizex;
+       ys %= buf->tsizey;
+
+       switch (channel) {
+               case 0:
+                       func = &tile->r_rect[ys*tile->sizex+xs];
+                       break;
+               case 1:
+                       func = &tile->g_rect[ys*tile->sizex+xs];
+                       break;
+               case 2:
+                       func = &tile->b_rect[ys*tile->sizex+xs];
+                       break;
+       }
+
+       samp = func->samples;
+       for (i=0; i<func->totsamples; i++, samp++) {
+               if (zs > samp->depth) {
+                       startsamp = samp;
+                       break;
+               }
+       }
+       
+       BASSERT(startsamp);
+       if (startsamp == NULL) {
+               TCS_UnlockTile(tile);
+               return 1.0f;
+       }
+
+       //compute the world-space depth
+       startz = (float) startsamp->depth / 2147483647.0f;
+       startz = startz*(shb->clipend - shb->clipsta) + shb->clipsta;
+       
+
+
+       TCS_UnlockTile(tile);
+}
+#endif
+
 /*-------------non-working soft shadow code-----------*/
 #if 1
 static void DSM_ProcessPixel(DSMFunction *func, int index, int zenter, int 
zexit, float *shadclr, int bias, int zthresh)
@@ -110,7 +228,7 @@
 
                        //check if layer-zthresh to layer+zthresh overlaps 
zenter, zexit
                        if ((max >= zenter && max <= zexit) || (min >= zenter 
&& min <= zexit)
-                                || (min <= zenter && max >= zexit)) {
+                                || (min <= zenter && max >= zexit) || (min < 
zenter && max > zexit)) {
                                if (i != 0) shadclr[index] *= 1.0 - 
((samp-1)->value - (samp)->value);
                                else shadclr[index] *= samp->value;
 
@@ -240,8 +358,14 @@
                start= floor(v1[1]);
                end= start+floor(dy);
 
-               if(start>=recty || end<0) return;
+               if(start>=recty || end<0) {
+                       shadclr[0] += shadclr2[0];
+                       shadclr[1] += shadclr2[1];
+                       shadclr[2] += shadclr2[2];
 
+                       return;
+               }
+
                if(end>=recty) end= recty-1;
 
                oldx= floor(v1[0]);
@@ -311,7 +435,7 @@
        float adapt_thresh = lar->adapt_thresh;
        int max_samples = lar->ray_totsamp;
        float pos[3], zco;
-       int do_soft=1, full_osa=0;
+       int do_soft=1, full_osa=0, first=1;
 
        shadowclr[0] = shadowclr[1] = shadowclr[2] = 1.0f;
 
@@ -324,7 +448,6 @@
        }
 
        if(inp <= 0.0f) return;
-       
 
        /* rotate renderco en osaco */
        siz= 0.5f*(float)shb->size;
@@ -388,23 +511,23 @@
 
        colsq[0] = colsq[1] = colsq[2] = 0.0;
        if (lar->ray_totsamp < 2) do_soft = 0;
-       if ((R.r.mode & R_OSA) && (R.osa > 0) && (shi->vlr->flag & R_FULL_OSA)) 
full_osa = 1;
+       if ((re->r.mode & R_OSA) && (re->osa > 0) && (shi->vlr->flag & 
R_FULL_OSA)) full_osa = 1;
        
        if (full_osa) {
-               if (do_soft) max_samples  = max_samples/R.osa + 1;
+               if (do_soft) max_samples  = max_samples/re->osa + 1;
                else max_samples = 1;
        } else {
                if (do_soft) max_samples = lar->ray_totsamp;
-               else max_samples = (R.osa > 4)?R.osa:5;
+               else max_samples = (re->osa > 4)?re->osa:5;
        }
 
        /* sampling init */
        if (lar->ray_samp_method==LA_SAMP_HALTON) {
-               qsa = get_thread_qmcsampler(&R, shi->thread, SAMP_TYPE_HALTON, 
max_samples);
-               qsa_jit = get_thread_qmcsampler(&R, shi->thread, 
SAMP_TYPE_HALTON, max_samples);
+               qsa = get_thread_qmcsampler(re, shi->thread, SAMP_TYPE_HALTON, 
max_samples);
+               qsa_jit = get_thread_qmcsampler(re, shi->thread, 
SAMP_TYPE_HALTON, max_samples);
        } else if (lar->ray_samp_method==LA_SAMP_HAMMERSLEY) {
-               qsa = get_thread_qmcsampler(&R, shi->thread, 
SAMP_TYPE_HAMMERSLEY, max_samples);
-               qsa_jit = get_thread_qmcsampler(&R, shi->thread, 
SAMP_TYPE_HAMMERSLEY, max_samples);
+               qsa = get_thread_qmcsampler(re, shi->thread, 
SAMP_TYPE_HAMMERSLEY, max_samples);
+               qsa_jit = get_thread_qmcsampler(re, shi->thread, 
SAMP_TYPE_HAMMERSLEY, max_samples);
        }
 
        QMC_initPixel(qsa, shi->thread);
@@ -431,7 +554,7 @@
                
                /*
                if (shi->vlr && !full_osa) {
-                       QMC_sampleRect(jit, qsa_jit, shi->thread, samples, 1.0, 
1.0);
+                       QMC_sampleRect(jit, qsa_jit, shi->thread, samples+1, 
1.0, 1.0);
                        
                        pos[0] += shi->dxco[0]*jit[0] + shi->dyco[0]*jit[1];
                        pos[1] += shi->dxco[1]*jit[0] + shi->dyco[1]*jit[1];
@@ -452,7 +575,7 @@
                                VecOrthoBasisf(v, ru, rv);
                                
                                /* sampling, returns quasi-random vector in 
area_size disc */
-                               QMC_sampleDisc(samp3d, qsa, shi->thread, 
samples,lar->area_size);
+                               QMC_sampleDisc(samp3d, qsa, shi->thread, 
samples, lar->area_size);
 
                                /* distribute disc samples across the tangent 
plane */
                                s[0] = samp3d[0]*ru[0] + samp3d[1]*rv[0];
@@ -468,22 +591,28 @@
                                ///* align samples to lamp vector */
                                //Mat3MulVecfl(lar->mat, samp3d);
                        }
-                       sco[0]= samp3d[0];
-                       sco[1]= samp3d[1];
-                       sco[2]= samp3d[2];
                } else {
                        VECCOPY(sco, vec);
                }
-               
+
+               BASSERT(samp3d[0] != 0.0);
+               BASSERT(samp3d[1] != 0.0);
+               BASSERT(samp3d[0] >= -lar->area_size/2 && samp3d[0] <= 
lar->area_size/2);
+               BASSERT(samp3d[1] >= -lar->area_sizey/2 && samp3d[1] <= 
lar->area_sizey/2);
+
+               sco[0]= samp3d[0];
+               sco[1]= samp3d[1];
+               sco[2]= samp3d[2];
+
                sco[2] = 0.0f;
                
                VECCOPY(raystart, pos);         
                
                /* trace the ray */
                MTC_Mat4MulVecfl(re->viewinv, raystart);
-               MTC_Mat4MulVecfl(shb->viewmat, raystart);
+               MTC_Mat4MulVecfl(shb->viewmat_uncorrected, raystart);
                
-               VecClipLine3f(raystart, sco, 2, -shb->clipsta-0.06f);
+               VecClipLine3f(raystart, sco, 2, -shb->clipsta-0.006f);
                
                //BSE_Add3DVisPoint(raystart, BSE_Yellow, 0);
                //BSE_Add3DVisPoint(sco, BSE_Yellow, 1);
@@ -503,7 +632,7 @@
                MTC_Mat4MulVec4fl(shb->winmat, raystart);
                MTC_Mat4MulVec4fl(shb->winmat, sco);
 
-               if (DSM_zbufclipwire(shb->clipsta, shb->clipend, shb->size, 
shb->size, raystart, sco)) {// int DSM_zbufclipwire(int rectx, int recty, float 
*v1, float *v2);
+               if (DSM_zbufclipwire(shb->clipsta, shb->clipend, shb->size, 
shb->size, sco, raystart)) {// int DSM_zbufclipwire(int rectx, int recty, float 
*v1, float *v2);
                        //printf("postray: [%f, %f, %f, %f]-[%f, %f, %f, 
%f]\n", raystart[0], raystart[1], raystart[2], raystart[3], sco[0], sco[1], 
sco[2], sco[3]);
                        #ifdef DOQMCDEBUG
                        {
@@ -518,17 +647,23 @@
                                zco = ((float)raystart[2])/2147483647.0f;
                                zco = (shb->winmat[3][2])/(shb->winmat[2][2] - 
shb->winmat[2][3]*zco);
                                zco     = (zco - shb->clipsta) / (shb->clipend 
- shb->clipsta);
-                               raystart[2] = ((float)0x7FFFFFFF)*zco;
+                               raystart[2] = 2147483647.0f*zco;
 
                                zco = ((float)sco[2])/2147483647.0f;
                                zco = (shb->winmat[3][2])/(shb->winmat[2][2] - 
shb->winmat[2][3]*zco);
                                zco     = (zco - shb->clipsta) / (shb->clipend 
- shb->clipsta);
-                               sco[2] = ((float)0x7FFFFFFF)*zco;
+                               sco[2] = 2147483647.0f*zco;
 
                        }
+
                        DSM_RasterRayPath(buf, bias, zthresh, shadclr, 
raystart, sco);
 
+               } else {
+                       shadclr[0] += 1.0f;

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to