[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