[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [26623] branches/render25/source/blender/ render/intern: Render Branch: move pixel & surface cache code to own file for reuse,
Brecht Van Lommel
brecht at blender.org
Fri Feb 5 13:45:23 CET 2010
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. @@
More information about the Bf-blender-cvs
mailing list