Revision: 26623
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=26623
Author:   blendix
Date:     2010-02-05 13:45:23 +0100 (Fri, 05 Feb 2010)

Log Message:
-----------
Render Branch: move pixel & surface cache code to own file for reuse,
not really generic yet but getting there.

Modified Paths:
--------------
    branches/render25/source/blender/render/intern/include/diskocclusion.h
    branches/render25/source/blender/render/intern/include/object_strand.h
    branches/render25/source/blender/render/intern/include/render_types.h
    branches/render25/source/blender/render/intern/include/strand.h
    branches/render25/source/blender/render/intern/source/convertblender.c
    branches/render25/source/blender/render/intern/source/database.c
    branches/render25/source/blender/render/intern/source/diskocclusion.c
    branches/render25/source/blender/render/intern/source/environment.c
    branches/render25/source/blender/render/intern/source/object_mesh.c
    branches/render25/source/blender/render/intern/source/object_strand.c

Added Paths:
-----------
    branches/render25/source/blender/render/intern/include/cache.h
    branches/render25/source/blender/render/intern/source/cache.c

Added: branches/render25/source/blender/render/intern/include/cache.h
===================================================================
--- branches/render25/source/blender/render/intern/include/cache.h              
                (rev 0)
+++ branches/render25/source/blender/render/intern/include/cache.h      
2010-02-05 12:45:23 UTC (rev 26623)
@@ -0,0 +1,82 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *
+ * Contributor(s): Blender Foundation.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifndef __RENDER_CACHE_H__
+#define __RENDER_CACHE_H__
+
+#include "object.h"
+
+struct DerivedMesh;
+struct ObjectRen;
+struct Render;
+struct RenderDB;
+struct RenderPart;
+struct ShadeInput;
+struct ShadeSample;
+
+/* Pixel Cache: per part cache for sharing occlusion and other shading
+   results between pixel. */
+
+typedef struct PixelCacheSample {
+       float co[3], n[3];
+       float ao[3], env[3], indirect[3];
+       float intensity, dist2;
+       int x, y, filled;
+} PixelCacheSample;
+
+typedef struct PixelCache {
+       PixelCacheSample *sample;
+       int x, y, w, h, step;
+} PixelCache;
+
+PixelCache *pixel_cache_create(struct Render *re, struct RenderPart *pa, 
struct ShadeSample *ssamp);
+void pixel_cache_free(PixelCache *cache);
+
+int pixel_cache_sample(struct PixelCache *cache, struct ShadeInput *shi);
+void pixel_cache_insert_sample(struct PixelCache *cache, struct ShadeInput 
*shi);
+
+/* Surface Cache: used for strand to cache occlusion and speed vectors
+   on the original surface to be used by the strand. */
+
+typedef struct SurfaceCache {
+       struct SurfaceCache *next, *prev;
+       ObjectRen obr;
+       int (*face)[4];
+       float (*co)[3];
+       /* for occlusion caching */
+       float (*ao)[3];
+       float (*env)[3];
+       float (*indirect)[3];
+       /* for speedvectors */
+       float (*prevco)[3], (*nextco)[3];
+       int totvert, totface;
+} SurfaceCache;
+
+SurfaceCache *surface_cache_create(struct Render *re, struct ObjectRen *obr, 
struct DerivedMesh *dm, float mat[][4], int timeoffset);
+void surface_cache_free(struct RenderDB *rdb);
+
+void surface_cache_sample(SurfaceCache *cache, struct ShadeInput *shi);
+
+#endif /* __RENDER_CACHE_H__ */
+

Modified: branches/render25/source/blender/render/intern/include/diskocclusion.h
===================================================================
--- branches/render25/source/blender/render/intern/include/diskocclusion.h      
2010-02-05 11:52:51 UTC (rev 26622)
+++ branches/render25/source/blender/render/intern/include/diskocclusion.h      
2010-02-05 12:45:23 UTC (rev 26623)
@@ -40,6 +40,7 @@
 /* Sample */
 
 void disk_occlusion_sample(struct Render *re, struct ShadeInput *shi);
+void disk_occlusion_sample_direct(struct Render *re, struct ShadeInput *shi);
 
 /* Part Cache */
 

Modified: branches/render25/source/blender/render/intern/include/object_strand.h
===================================================================
--- branches/render25/source/blender/render/intern/include/object_strand.h      
2010-02-05 11:52:51 UTC (rev 26622)
+++ branches/render25/source/blender/render/intern/include/object_strand.h      
2010-02-05 12:45:23 UTC (rev 26623)
@@ -41,7 +41,7 @@
 struct RenderDB;
 struct ZSpan;
 struct ObjectInstanceRen;
-struct StrandSurface;
+struct SurfaceCache;
 struct DerivedMesh;
 struct ObjectRen;
 
@@ -92,7 +92,7 @@
 void render_strand_segment(struct Render *re, float winmat[][4], struct 
StrandPart *spart, struct ZSpan *zspan, int totzspan, StrandSegment *sseg);
 void strand_minmax(struct StrandRen *strand, float *min, float *max);
 
-struct StrandSurface *cache_strand_surface(struct Render *re, struct ObjectRen 
*obr, struct DerivedMesh *dm, float mat[][4], int timeoffset);
+struct SurfaceCache *cache_strand_surface(struct Render *re, struct ObjectRen 
*obr, struct DerivedMesh *dm, float mat[][4], int timeoffset);
 void free_strand_surface(struct RenderDB *rdb);
 
 struct StrandShadeCache *strand_shade_cache_create(void);
@@ -128,20 +128,6 @@
        float strandco;
 } StrandVert;
 
-typedef struct StrandSurface {
-       struct StrandSurface *next, *prev;
-       ObjectRen obr;
-       int (*face)[4];
-       float (*co)[3];
-       /* for occlusion caching */
-       float (*ao)[3];
-       float (*env)[3];
-       float (*indirect)[3];
-       /* for speedvectors */
-       float (*prevco)[3], (*nextco)[3];
-       int totvert, totface;
-} StrandSurface;
-
 typedef struct StrandBound {
        int start, end;
        float boundbox[2][3];
@@ -155,7 +141,7 @@
 
        struct ObjectRen *obr;
        struct Material *ma;
-       struct StrandSurface *surface;
+       struct SurfaceCache *surface;
        unsigned int lay;
        int overrideuv;
        int flag, maxdepth;

Modified: branches/render25/source/blender/render/intern/include/render_types.h
===================================================================
--- branches/render25/source/blender/render/intern/include/render_types.h       
2010-02-05 11:52:51 UTC (rev 26622)
+++ branches/render25/source/blender/render/intern/include/render_types.h       
2010-02-05 12:45:23 UTC (rev 26623)
@@ -97,7 +97,7 @@
 
        /* approximate ao */
        void *occlusiontree;
-       ListBase strandsurface;
+       ListBase surfacecache;
 
        /* volume */
        ListBase render_volumes_inside;

Modified: branches/render25/source/blender/render/intern/include/strand.h
===================================================================
--- branches/render25/source/blender/render/intern/include/strand.h     
2010-02-05 11:52:51 UTC (rev 26622)
+++ branches/render25/source/blender/render/intern/include/strand.h     
2010-02-05 12:45:23 UTC (rev 26623)
@@ -41,7 +41,7 @@
 struct RenderPrimitiveIterator;
 struct ZSpan;
 struct ObjectInstanceRen;
-struct StrandSurface;
+struct SurfaceCache;
 struct DerivedMesh;
 struct ObjectRen;
 
@@ -92,9 +92,6 @@
 void render_strand_segment(struct Render *re, float winmat[][4], struct 
StrandPart *spart, struct ZSpan *zspan, int totzspan, StrandSegment *sseg);
 void strand_minmax(struct StrandRen *strand, float *min, float *max);
 
-struct StrandSurface *cache_strand_surface(struct Render *re, struct ObjectRen 
*obr, struct DerivedMesh *dm, float mat[][4], int timeoffset);
-void free_strand_surface(struct Render *re);
-
 struct StrandShadeCache *strand_shade_cache_create(void);
 void strand_shade_cache_free(struct StrandShadeCache *cache);
 void strand_shade_segment(struct Render *re, struct StrandShadeCache *cache, 
struct StrandSegment *sseg, struct ShadeSample *ssamp, float t, float s, int 
addpassflag);

Added: branches/render25/source/blender/render/intern/source/cache.c
===================================================================
--- branches/render25/source/blender/render/intern/source/cache.c               
                (rev 0)
+++ branches/render25/source/blender/render/intern/source/cache.c       
2010-02-05 12:45:23 UTC (rev 26623)
@@ -0,0 +1,380 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *
+ * Contributor(s): Blender Foundation.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <stdlib.h>
+
+#include "DNA_material_types.h"
+#include "DNA_meshdata_types.h"
+
+#include "BLI_listbase.h"
+#include "BLI_math.h"
+
+#include "BKE_DerivedMesh.h"
+
+#include "cache.h"
+#include "diskocclusion.h"
+#include "object_strand.h"
+#include "part.h"
+#include "rendercore.h"
+#include "render_types.h"
+#include "shading.h"
+
+/******************************* Pixel Cache *********************************/
+
+#define CACHE_STEP 3
+
+static PixelCacheSample *find_sample(PixelCache *cache, int x, int y)
+{
+       x -= cache->x;
+       y -= cache->y;
+
+       x /= cache->step;
+       y /= cache->step;
+       x *= cache->step;
+       y *= cache->step;
+
+       if(x < 0 || x >= cache->w || y < 0 || y >= cache->h)
+               return NULL;
+       else
+               return &cache->sample[y*cache->w + x];
+}
+
+int pixel_cache_sample(PixelCache *cache, ShadeInput *shi)
+{
+       PixelCacheSample *samples[4], *sample;
+       float *co= shi->geometry.co;
+       float *n= shi->geometry.vn;
+       int x= shi->geometry.xs;
+       int y= shi->geometry.ys;
+       float *ao= shi->shading.ao;
+       float *env= shi->shading.env;
+       float *indirect= shi->shading.indirect;
+       float wn[4], wz[4], wb[4], tx, ty, w, totw, mino, maxo;
+       float d[3], dist2;
+       int i, x1, y1, x2, y2;
+
+       /* first try to find a sample in the same pixel */
+       if(cache->sample && cache->step) {
+               sample= &cache->sample[(y-cache->y)*cache->w + (x-cache->x)];
+               if(sample->filled) {
+                       sub_v3_v3v3(d, sample->co, co);
+                       dist2= dot_v3v3(d, d);
+                       if(dist2 < 0.5f*sample->dist2 && dot_v3v3(sample->n, n) 
> 0.98f) {
+                               copy_v3_v3(ao, sample->ao);
+                               copy_v3_v3(env, sample->env);
+                               copy_v3_v3(indirect, sample->indirect);
+                               return 1;
+                       }
+               }
+       }
+       else
+               return 0;
+
+       /* try to interpolate between 4 neighbouring pixels */
+       samples[0]= find_sample(cache, x, y);
+       samples[1]= find_sample(cache, x+cache->step, y);
+       samples[2]= find_sample(cache, x, y+cache->step);
+       samples[3]= find_sample(cache, x+cache->step, y+cache->step);
+
+       for(i=0; i<4; i++)
+               if(!samples[i] || !samples[i]->filled)
+                       return 0;
+
+       /* require intensities not being too different */
+       mino= MIN4(samples[0]->intensity, samples[1]->intensity, 
samples[2]->intensity, samples[3]->intensity);

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