Revision: 17903
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=17903
Author:   joeedh
Date:     2008-12-17 10:09:33 +0100 (Wed, 17 Dec 2008)

Log Message:
-----------
more speed tweaks and improvements, and some bug fixes.  also made dsm use the 
same buttons for osa that normla shadow buffers do.

Modified Paths:
--------------
    branches/soc-2007-joeedh/source/blender/blenkernel/BKE_dsm.h
    branches/soc-2007-joeedh/source/blender/render/intern/include/render_types.h
    branches/soc-2007-joeedh/source/blender/render/intern/source/dsm.c
    branches/soc-2007-joeedh/source/blender/render/intern/source/dsm_func.c
    branches/soc-2007-joeedh/source/blender/render/intern/source/shadbuf.c
    branches/soc-2007-joeedh/source/blender/render/intern/source/shadeoutput.c
    branches/soc-2007-joeedh/source/blender/render/intern/source/zbuf.c
    branches/soc-2007-joeedh/source/blender/src/buttons_shading.c

Modified: branches/soc-2007-joeedh/source/blender/blenkernel/BKE_dsm.h
===================================================================
--- branches/soc-2007-joeedh/source/blender/blenkernel/BKE_dsm.h        
2008-12-17 06:00:17 UTC (rev 17902)
+++ branches/soc-2007-joeedh/source/blender/blenkernel/BKE_dsm.h        
2008-12-17 09:09:33 UTC (rev 17903)
@@ -97,17 +97,17 @@
 
 #define DSM_FINAL_TILESIZE             50
 #define DSM_TILE_MEMARENASIZE  (1<<16)
-#define DSM_AASAMPLES          (shb->samp > 5? 5: shb->samp)
+#define DSM_AASAMPLES          (shb->osasamp)
 #define DSM_AAWIDTH                    1.5f;
 #define DSM_MAXSAMPLES         25
 
-#define DSM_SAMPLEMERGE_LIMIT  (0x7FFFFFFF) //20000000
+#define DSM_SAMPLEMERGE_LIMIT  4000000 //(G.rt*1000000) 
//((G.rt!=103&&G.rt!=104)?200000000 : 0) //20000000
 
 //angle limit of strands.  is in degrees, so
 //code has to convert.ss
 #define DSM_STRAND_ADAPTCOS 8.0
 
-#define DSM_LINEAR     1
+#define DSM_LINEAR     (G.rt != 102 && G.rt != 103)
 #define DSM_SOFT       0
 #define DSM_VIS                0
 //#define DOQMCDEBUG

Modified: 
branches/soc-2007-joeedh/source/blender/render/intern/include/render_types.h
===================================================================
--- 
branches/soc-2007-joeedh/source/blender/render/intern/include/render_types.h    
    2008-12-17 06:00:17 UTC (rev 17902)
+++ 
branches/soc-2007-joeedh/source/blender/render/intern/include/render_types.h    
    2008-12-17 09:09:33 UTC (rev 17903)
@@ -237,7 +237,7 @@
 
 typedef struct ShadBuf {
        /* regular shadowbuffer */
-       short samp, shadhalostep, totbuf;
+       short samp, osasamp, shadhalostep, totbuf;
        float persmat[4][4];
        float viewmat[4][4];
        float winmat[4][4];

Modified: branches/soc-2007-joeedh/source/blender/render/intern/source/dsm.c
===================================================================
--- branches/soc-2007-joeedh/source/blender/render/intern/source/dsm.c  
2008-12-17 06:00:17 UTC (rev 17902)
+++ branches/soc-2007-joeedh/source/blender/render/intern/source/dsm.c  
2008-12-17 09:09:33 UTC (rev 17903)
@@ -1000,7 +1000,7 @@
                                
                                /*add the first header samples, which are at 
-0x7FFFFFF z and
                                  have a visibility of 1.0f.*/
-                               for (d=0; d<shb->samp*shb->samp; d++) {
+                               for (d=0; d<DSM_AASAMPLES*DSM_AASAMPLES; d++) {
                                        for (a=0; a<3; a++) {
                                                row[totface].p = -1;
                                                row[totface].value = 1.0f;
@@ -1083,13 +1083,6 @@
                                                printf("EVVVVIIIL! one: %d, 
two: %d\n", row[a].depth, row[a+1].depth);
                                        }
                                        
-                                       /*for (b=0; b<3; b++) {
-                                               if (accum[row[a].samplenr][b] < 
0.001 && samp_totlayers[row[a].samplenr][b] < dbuf->max_layers) {
-                                                       
samp_totlayers[row[a].samplenr][b] += 1;
-                                                       
accum[row[a].samplenr][b] = 1.0f;
-                                               }
-                                       }*/
-                                       
                                        if (accum[row[a].samplenr][0] > 0.001 
|| accum[row[a].samplenr][1] > 0.001 || accum[row[a].samplenr][2] > 0.001) {
                                                float clr[4];
 
@@ -1145,8 +1138,12 @@
                                                        }
                                                } else if (row[a].type == 
DSM_FACE) {
                                                        float sco[3];
-                                                       sco[0] = 
(float)(x+tile->x*dbuf->tsizex) + shb->jit[2*row[a].samplenr]*shb->soft + 0.5f;
-                                                       sco[1] = 
(float)(y+tile->y*dbuf->tsizey) + shb->jit[2*row[a].samplenr+1]*shb->soft + 
0.5f;
+                                                       sco[0] = 
(float)(x+tile->x*dbuf->tsizex)
+                                                                + 
shb->jit[2*row[a].samplenr]
+                                                                * shb->soft + 
0.5f;
+                                                       sco[1] = 
(float)(y+tile->y*dbuf->tsizey)
+                                                                + 
shb->jit[2*row[a].samplenr+1]
+                                                                * shb->soft + 
0.5f;
                                                        sco[2] = row[a].depth;
 
                                                        vlak =  
RE_findOrAddVlak(re->objectinstance[row[a].obi].obr, (row[a].p-1) & 
RE_QUAD_MASK);

Modified: 
branches/soc-2007-joeedh/source/blender/render/intern/source/dsm_func.c
===================================================================
--- branches/soc-2007-joeedh/source/blender/render/intern/source/dsm_func.c     
2008-12-17 06:00:17 UTC (rev 17902)
+++ branches/soc-2007-joeedh/source/blender/render/intern/source/dsm_func.c     
2008-12-17 09:09:33 UTC (rev 17903)
@@ -89,8 +89,8 @@
 #define COMPSTATE_DONE                 3
 
 void DSM_MergeLayerListNew(DSMTile *tile, int x, int y, _ClrEntry *row, 
ListBase (*transfuncs)[3],
-                                                                  int totface, 
void *scratchmem1, void *scratchmem2, void *scratchmem3,
-                                                                  int 
scratchlen, float *weight, int samplewid, float error)
+                           int totface, void *scratchmem1, void *scratchmem2, 
void *scratchmem3,
+                           int scratchlen, float *weight, int samplewid, float 
error)
 {
        DSMFunction *func[3];
        DSMLayerSample *cursamp[3]={NULL, NULL, NULL}, *samp;
@@ -101,7 +101,7 @@
        double startpoint[3] = {-1.0, -1.0, -1.0}, endpoint[3] = {-1.0, -1.0, 
-1.0}, err=error; // /2.0;
        int i, ci, totfaces[3] = {0, 0, 0}, cursor[3]={0, 0, 0};
        int state[3] = {COMPSTATE_PROCESSING, COMPSTATE_PROCESSING, 
COMPSTATE_PROCESSING};
-       int totface2[3] = {0, 0, 0}, count[3]={0, 0, 0};
+       int totface2[3] = {0, 0, 0}, count[3]={0, 0, 0}, done = 0;
 
        /*first alloc, then assign, as internally the function
          array may be reallocated to increase its size (thus invalidating
@@ -144,6 +144,8 @@
        /*we add 1 to totface to compensate for how compression must lag behind 
merging.*/
        for (i=0, csamp=row; i<totface; i++, csamp++) {
                ci = csamp->index;
+               if (done & (1<<(ci+3))) continue;
+
                BASSERT(ci >= 0 && ci < 3);
                samp = func[ci]->samples + totfaces[ci];
 
@@ -158,7 +160,8 @@
                if (samp->depth > func[ci]->zmax) func[ci]->zmax = csamp->depth;
                if (samp->depth < func[ci]->zmin) func[ci]->zmin = csamp->depth;
 
-               if (lastcsamp[ci]) accum[ci] = accum[ci] + 
(double)(csamp->depth-lastcsamp[ci]->depth)*slope[ci];
+               if (lastcsamp[ci]) 
+                       accum[ci] = accum[ci] + 
(double)(csamp->depth-lastcsamp[ci]->depth)*slope[ci];
                samp->value = (float) accum[ci];
                
                if (csamp->next && csamp->next->depth == csamp->depth) {
@@ -167,10 +170,12 @@
 
                if (csamp->next) {
                        if (csamp->next->depth != csamp->depth) {
-                               s2 = ((double)(csamp->next->value - 
csamp->value)) / (double)(csamp->next->depth - csamp->depth);
+                               s2 = ((double)(csamp->next->value - 
csamp->value))
+                                    / (double)(csamp->next->depth - 
csamp->depth);
                                if (csamp->prev) {
                                        if (csamp->prev->depth != csamp->depth) 
{
-                                               s1 = ((double)(csamp->value - 
csamp->prev->value)) / (double)(csamp->depth - csamp->prev->depth);
+                                               s1 = ((double)(csamp->value - 
csamp->prev->value)) 
+                                                     / (double)(csamp->depth - 
csamp->prev->depth);
                                                slope[ci] += 
weight[csamp->samplenr]*(s2 - s1);
                                        } else {
                                                slope[ci] += 
weight[csamp->samplenr]*s2;
@@ -190,12 +195,15 @@
                                if (csamp->prev->depth == csamp->depth) {
                                        //accum[ci] += 
weight[csamp->samplenr]*(csamp->value-csamp->prev->value);
                                } else {
-                                       s1 = ((double)(csamp->value - 
csamp->prev->value)) / (double)(csamp->depth - csamp->prev->depth);
+                                       s1 = ((double)(csamp->value - 
csamp->prev->value)) 
+                                       / (double)(csamp->depth - 
csamp->prev->depth);
+
                                        slope[ci] -= weight[csamp->samplenr]*s1;
                                }
-                       }                       
+                       }
                }
-
+               
+               
                if (accum[ci] < -0.001f) {
                        printf("EVIL! accum: %f\n", accum[ci]);
                        accum[ci] = 0.0f;
@@ -206,82 +214,16 @@
                }
 
                lastcsamp[ci] = csamp;
-
                totfaces[ci]++;
                
-               /*
-               //continue;
-               //compression has to lag behind merging by 1 samples.
-               if (totfaces[ci] <= 1) continue;
-
-               if (state[ci] == COMPSTATE_PROCESSING) {
-                       *cursamp[ci] = sout[ci][cursor[ci]];
-                       
-                       //store the number of original samples between this one 
and
-                       //the last, this is actually used by the (probably 
coded post-
-                       //GSoC) soft shadow method.
-                       cursamp[ci]->orig_totsamples = 0;
-
-                       if (state[ci] != COMPSTATE_DONE && cursor[ci] >= 
totfaces[ci]) { //func[ci]->totsamples - 1) {
-                               totface2[ci]++;
-                               state[ci] = COMPSTATE_DONE;
-                               continue;
-                       }
-
-                       start[ci] = (sout[ci][cursor[ci]+1].value+err) - 
cursamp[ci]->value;
-                       end[ci]   = (sout[ci][cursor[ci]+1].value-err) - 
cursamp[ci]->value;
-                       if (sout[ci][cursor[ci]+1].depth != cursamp[ci]->depth) 
{
-                               start[ci] /= 
(double)(sout[ci][cursor[ci]+1].depth - cursamp[ci]->depth);
-                               end[ci]   /= 
(double)(sout[ci][cursor[ci]+1].depth - cursamp[ci]->depth);
-                       }
-                       cursor[ci] += 1;
-
-                       state[ci] = COMPSTATE_COMPRESSING;
+               if (done == 32) break;
+               if (done & (1<<ci)) {
+                       done |= (1<<(ci+3));
                }
-               
-               if (state[ci] == COMPSTATE_COMPRESSING) {
-                       ostartpoint[ci] = startpoint[ci];
-                       oendpoint[ci] = endpoint[ci];
-                       if (sout[ci][cursor[ci]].depth == cursamp[ci]->depth) {
-                               //startpoint = cursamp->value + err;
-                               //endpoint = cursamp->value - err;
-                               break;
-                       } else {
-                               startpoint[ci] = cursamp[ci]->value + start[ci] 
* (double)(sout[ci][cursor[ci]].depth - cursamp[ci]->depth);
-                               endpoint[ci]   = cursamp[ci]->value + end[ci] * 
(double)(sout[ci][cursor[ci]].depth - cursamp[ci]->depth);
-                       }
-                       if (startpoint[ci] > sout[ci][cursor[ci]].value && 
endpoint[ci] < sout[ci][cursor[ci]].value) {
-                               if (startpoint[ci] > 
sout[ci][cursor[ci]].value+err) {
-                                       start[ci] = 
(sout[ci][cursor[ci]].value+err) - cursamp[ci]->value;
-                                       if (sout[ci][cursor[ci]].depth != 
cursamp[ci]->depth) {
-                                               start[ci] /= 
(double)(sout[ci][cursor[ci]].depth - cursamp[ci]->depth);
-                                       }
-                               }
-                               if (endpoint[ci] < 
sout[ci][cursor[ci]].value-err) {
-                                       end[ci] = 
(sout[ci][cursor[ci]].value-err) - cursamp[ci]->value;
-                                       if (sout[ci][cursor[ci]].depth != 
cursamp[ci]->depth) {
-                                               end[ci] /= 
(double)(sout[ci][cursor[ci]].depth - cursamp[ci]->depth);
-                                       }
-                               }       
-                       } else {
-                               cursor[ci] -= 1;
-                               state[ci] = COMPSTATE_PROCESSING2;
-                       }
-                       cursamp[ci]->orig_totsamples++;
-                       cursor[ci] += 1;
+               if (accum[ci] < 0.005) {
+                       done |= 1<<ci;                  
+                       //all functions have hit zero visibility.
                }
-
-               if (state[ci] == COMPSTATE_PROCESSING2) {
-                       cursamp[ci]++;
-                       totface2[ci]++;
-
-                       if (cursor[ci] >= func[ci]->totsamples) {
-                               *cursamp[ci] = sout[ci][totfaces[ci]-1]; 
//samp[func->totsamples-1];
-                               cursamp[ci]++;
-                               totface2[ci]++;
-                       }
-                       state[ci] = COMPSTATE_PROCESSING;
-               }*/
        }
        
 
@@ -292,8 +234,6 @@
                if (totfaces[i]==1) totface2[i] = 1;
 
                func[i]->totsamples = totface2[i];
-               //func[i]->samples = BLI_memarena_alloc(tile->arena, 
sizeof(DSMLayerSample)*totface2[i]);
-               //memcpy(func[i]->samples, sout[i], 
sizeof(DSMLayerSample)*totface2[i]);
                BASSERT(accum[i] < 1.0001);
                
                DSM_CompressFunction(tile->arena, func[i], error);
@@ -523,6 +463,8 @@
 
                lastcsamp = csamp;
                func->totsamples++;
+
+               if (accum < 0.005) break;
        }
        
        BASSERT(accum < 1.0001);
@@ -570,4 +512,4 @@
                zspan->apsmcounter--;
        }
        return zspan->curpstr;
-}
\ No newline at end of file
+}


@@ 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