[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [13384] trunk/blender/source/blender:

Brecht Van Lommel brechtvanlommel at pandora.be
Thu Jan 24 14:11:16 CET 2008


Revision: 13384
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=13384
Author:   blendix
Date:     2008-01-24 14:11:15 +0100 (Thu, 24 Jan 2008)

Log Message:
-----------

Fix for strand render + simplification + vector blur. With the number
of strands changing between frames, vector blur couldn't work. Now
speed vectors are interpolated from the surface. This also means
child particles don't have to be computed in the previous and next
frames, so saves time too.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_particle.h
    trunk/blender/source/blender/blenkernel/BKE_utildefines.h
    trunk/blender/source/blender/blenkernel/intern/particle.c
    trunk/blender/source/blender/render/intern/include/occlusion.h
    trunk/blender/source/blender/render/intern/include/render_types.h
    trunk/blender/source/blender/render/intern/include/strand.h
    trunk/blender/source/blender/render/intern/source/convertblender.c
    trunk/blender/source/blender/render/intern/source/occlusion.c
    trunk/blender/source/blender/render/intern/source/strand.c

Modified: trunk/blender/source/blender/blenkernel/BKE_particle.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_particle.h	2008-01-24 10:53:16 UTC (rev 13383)
+++ trunk/blender/source/blender/blenkernel/BKE_particle.h	2008-01-24 13:11:15 UTC (rev 13384)
@@ -215,7 +215,7 @@
 void psys_free(struct Object * ob, struct ParticleSystem * psys);
 void psys_free_children(struct ParticleSystem *psys);
 
-void psys_render_set(struct Object *ob, struct ParticleSystem *psys, float viewmat[][4], float winmat[][4], int winx, int winy);
+void psys_render_set(struct Object *ob, struct ParticleSystem *psys, float viewmat[][4], float winmat[][4], int winx, int winy, int timeoffset);
 void psys_render_restore(struct Object *ob, struct ParticleSystem *psys);
 int psys_render_simplify_distribution(struct ParticleThreadContext *ctx, int tot);
 int psys_render_simplify_params(struct ParticleSystem *psys, struct ChildParticle *cpa, float *params);

Modified: trunk/blender/source/blender/blenkernel/BKE_utildefines.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_utildefines.h	2008-01-24 10:53:16 UTC (rev 13383)
+++ trunk/blender/source/blender/blenkernel/BKE_utildefines.h	2008-01-24 13:11:15 UTC (rev 13384)
@@ -112,6 +112,7 @@
 #define VECADD(v1,v2,v3) 	{*(v1)= *(v2) + *(v3); *(v1+1)= *(v2+1) + *(v3+1); *(v1+2)= *(v2+2) + *(v3+2);}
 #define VECSUB(v1,v2,v3) 	{*(v1)= *(v2) - *(v3); *(v1+1)= *(v2+1) - *(v3+1); *(v1+2)= *(v2+2) - *(v3+2);}
 #define VECADDFAC(v1,v2,v3,fac) {*(v1)= *(v2) + *(v3)*(fac); *(v1+1)= *(v2+1) + *(v3+1)*(fac); *(v1+2)= *(v2+2) + *(v3+2)*(fac);}
+#define QUATADDFAC(v1,v2,v3,fac) {*(v1)= *(v2) + *(v3)*(fac); *(v1+1)= *(v2+1) + *(v3+1)*(fac); *(v1+2)= *(v2+2) + *(v3+2)*(fac); *(v1+3)= *(v2+3) + *(v3+3)*(fac);}
 
 #define INPR(v1, v2)		( (v1)[0]*(v2)[0] + (v1)[1]*(v2)[1] + (v1)[2]*(v2)[2] )
 

Modified: trunk/blender/source/blender/blenkernel/intern/particle.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/particle.c	2008-01-24 10:53:16 UTC (rev 13383)
+++ trunk/blender/source/blender/blenkernel/intern/particle.c	2008-01-24 13:11:15 UTC (rev 13384)
@@ -394,6 +394,7 @@
 	int winx, winy;
 
 	int dosimplify;
+	int timeoffset;
 	ParticleRenderElem *elems;
 	int *origindex;
 } ParticleRenderData;
@@ -455,13 +456,15 @@
 	return area;
 }
 
-void psys_render_set(Object *ob, ParticleSystem *psys, float viewmat[][4], float winmat[][4], int winx, int winy)
+void psys_render_set(Object *ob, ParticleSystem *psys, float viewmat[][4], float winmat[][4], int winx, int winy, int timeoffset)
 {
 	ParticleRenderData*data;
 	ParticleSystemModifierData *psmd= psys_get_modifier(ob, psys);
 
 	if(!G.rendering)
 		return;
+	if(psys->renderdata)
+		return;
 
 	data= MEM_callocN(sizeof(ParticleRenderData), "ParticleRenderData");
 
@@ -489,6 +492,8 @@
 	data->winx= winx;
 	data->winy= winy;
 
+	data->timeoffset= timeoffset;
+
 	psys->renderdata= data;
 }
 
@@ -554,9 +559,15 @@
 
 	if(part->draw_as!=PART_DRAW_PATH || !(part->draw & PART_DRAW_REN_STRAND))
 		return tot;
-	if(!ctx->psys->renderdata || !(part->simplify_flag & PART_SIMPLIFY_ENABLE))
+	if(!ctx->psys->renderdata)
 		return tot;
 
+	data= ctx->psys->renderdata;
+	if(data->timeoffset)
+		return 0;
+	if(!(part->simplify_flag & PART_SIMPLIFY_ENABLE))
+		return tot;
+
 	mvert= dm->getVertArray(dm);
 	mface= dm->getFaceArray(dm);
 	origindex= dm->getFaceDataArray(dm, CD_ORIGINDEX);
@@ -571,7 +582,6 @@
 	facetotvert= MEM_callocN(sizeof(int)*totorigface, "SimplifyFaceArea");
 	elems= MEM_callocN(sizeof(ParticleRenderElem)*totorigface, "SimplifyFaceElem");
 
-	data= ctx->psys->renderdata;
 	if(data->elems)
 		MEM_freeN(data->elems);
 
@@ -2076,7 +2086,7 @@
 			rough_t = t;
 
 		if(part->rough1 != 0.0 && pa_rough1 != 0.0)
-				do_rough(orco, rough_t, pa_rough1*part->rough1, part->rough1_size, 0.0, (ParticleKey*)state);
+			do_rough(orco, rough_t, pa_rough1*part->rough1, part->rough1_size, 0.0, (ParticleKey*)state);
 
 		if(part->rough2 != 0.0 && pa_rough2 != 0.0)
 			do_rough(cpa->rand, rough_t, pa_rough2*part->rough2, part->rough2_size, part->rough2_thres, (ParticleKey*)state);
@@ -3517,7 +3527,7 @@
 			part->kink_amp, part->kink, part->kink_axis, ob->obmat);
 
 		if(part->rough1 != 0.0)
-				do_rough(orco, t, part->rough1, part->rough1_size, 0.0, state);
+			do_rough(orco, t, part->rough1, part->rough1_size, 0.0, state);
 
 		if(part->rough2 != 0.0)
 			do_rough(cpa->rand, t, part->rough2, part->rough2_size, part->rough2_thres, state);

Modified: trunk/blender/source/blender/render/intern/include/occlusion.h
===================================================================
--- trunk/blender/source/blender/render/intern/include/occlusion.h	2008-01-24 10:53:16 UTC (rev 13383)
+++ trunk/blender/source/blender/render/intern/include/occlusion.h	2008-01-24 13:11:15 UTC (rev 13384)
@@ -45,7 +45,5 @@
 void cache_occ_samples(struct Render *re, struct RenderPart *pa, struct ShadeSample *ssamp);
 void free_occ_samples(struct Render *re, struct RenderPart *pa);
 
-void *cache_occ_mesh(struct Render *re, struct ObjectRen *obr, struct DerivedMesh *dm, float mat[][4]);
-
 #endif
 

Modified: trunk/blender/source/blender/render/intern/include/render_types.h
===================================================================
--- trunk/blender/source/blender/render/intern/include/render_types.h	2008-01-24 10:53:16 UTC (rev 13383)
+++ trunk/blender/source/blender/render/intern/include/render_types.h	2008-01-24 13:11:15 UTC (rev 13384)
@@ -161,7 +161,7 @@
 
 	/* occlusion tree */
 	void *occlusiontree;
-	ListBase occlusionmesh;
+	ListBase strandsurface;
 	
 	/* use this instead of R.r.cfra */
 	float cfra;	
@@ -337,6 +337,18 @@
 	float strandco;
 } StrandVert;
 
+typedef struct StrandSurface {
+	struct StrandSurface *next, *prev;
+	ObjectRen obr;
+	int (*face)[4];
+	float (*co)[3];
+	/* for occlusion caching */
+	float (*col)[3];					/* for occlusion */
+	/* for speedvectors */
+	float (*prevco)[3], (*nextco)[3];
+	int totvert, totface;
+} StrandSurface;
+
 typedef struct StrandBuffer {
 	struct StrandBuffer *next, *prev;
 	struct StrandVert *vert;
@@ -344,7 +356,7 @@
 
 	struct ObjectRen *obr;
 	struct Material *ma;
-	void *occlusionmesh;
+	struct StrandSurface *surface;
 	unsigned int lay;
 	int overrideuv;
 	int flag, maxdepth;

Modified: trunk/blender/source/blender/render/intern/include/strand.h
===================================================================
--- trunk/blender/source/blender/render/intern/include/strand.h	2008-01-24 10:53:16 UTC (rev 13383)
+++ trunk/blender/source/blender/render/intern/include/strand.h	2008-01-24 13:11:15 UTC (rev 13384)
@@ -44,6 +44,9 @@
 struct RenderPrimitiveIterator;
 struct ZSpan;
 struct ObjectInstanceRen;
+struct StrandSurface;
+struct DerivedMesh;
+struct ObjectRen;
 
 typedef struct StrandPoint {
 	/* position within segment */
@@ -89,6 +92,9 @@
 void render_strand_segment(struct Render *re, float winmat[][4], struct StrandPart *spart, struct ZSpan *zspan, int totzspan, StrandSegment *sseg);
 void project_strands(Render *re, void (*projectfunc)(float *, float mat[][4], float *),  int do_pano, int do_buckets);
 
+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 RenderBuckets *init_buckets(struct Render *re);
 void add_buckets_primitive(struct RenderBuckets *buckets, float *min, float *max, void *prim);
 void free_buckets(struct RenderBuckets *buckets);

Modified: trunk/blender/source/blender/render/intern/source/convertblender.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/convertblender.c	2008-01-24 10:53:16 UTC (rev 13383)
+++ trunk/blender/source/blender/render/intern/source/convertblender.c	2008-01-24 13:11:15 UTC (rev 13384)
@@ -108,6 +108,7 @@
 #include "radio.h"
 #include "shadbuf.h"
 #include "shading.h"
+#include "strand.h"
 #include "texture.h"
 #include "sss.h"
 #include "zbuf.h"
@@ -1465,7 +1466,7 @@
 		if(har) har->lay= obr->ob->lay;
 	}
 }
-static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem *psys)
+static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem *psys, int timeoffset)
 {
 	Object *ob= obr->ob;
 	Object *tob=0, *bb_ob=re->scene->camera;
@@ -1487,7 +1488,7 @@
 	float *orco=0,*surfnor=0,*uvco=0, strandlen=0.0f, curlen=0.0f;
 	float hasize, pa_size, pa_time, r_tilt, cfra=bsystem_time(ob,(float)CFRA,0.0);
 	float adapt_angle=0.0, adapt_pix=0.0, random, simplify[2];
-	int i, a, k, max_k=0, totpart, totuv=0, override_uv=-1, dosimplify = 0, doapproxao = 0;
+	int i, a, k, max_k=0, totpart, totuv=0, override_uv=-1, dosimplify = 0, dosurfacecache = 0;
 	int path_possible=0, keys_possible=0, baked_keys=0, totchild=psys->totchild;
 	int seed, path_nbr=0, path=0, orco1=0, adapt=0, uv[3]={0,0,0}, num;
 	char **uv_name=0;
@@ -1647,9 +1648,11 @@
 
 				svert= strandbuf->vert;
 
-				if((re->wrld.mode & WO_AMB_OCC) && (re->wrld.ao_gather_method == WO_AOGATHER_APPROX))
+				if(re->r.mode & R_SPEED)
+					dosurfacecache= 1;
+				else if((re->wrld.mode & WO_AMB_OCC) && (re->wrld.ao_gather_method == WO_AOGATHER_APPROX))
 					if(ma->amb != 0.0f)
-						doapproxao= 1;
+						dosurfacecache= 1;
 			}
 		}
 	}
@@ -1827,7 +1830,7 @@
 				VECCOPY(snor, surfnor);
 			}
 
-			if(doapproxao && num >= 0) {
+			if(dosurfacecache && num >= 0) {
 				int *facenum= RE_strandren_get_face(obr, strand, 1);
 				*facenum= num;
 			}
@@ -1931,8 +1934,8 @@
 			break;
 	}
 
-	if(doapproxao)
-		strandbuf->occlusionmesh= cache_occ_mesh(re, obr, psmd->dm, mat);
+	if(dosurfacecache)
+		strandbuf->surface= cache_strand_surface(re, obr, psmd->dm, mat, timeoffset);
 
 /* 4. clean up */
 	if(ma) do_mat_ipo(ma);
@@ -2543,7 +2546,7 @@
 	freedisplist(&displist);
 }
 
-static void init_render_curve(Render *re, ObjectRen *obr, int only_verts)
+static void init_render_curve(Render *re, ObjectRen *obr, int timeoffset)
 {
 	Object *ob= obr->ob;
 	Curve *cu;
@@ -2621,7 +2624,7 @@
 				}
 			}
 			
-			if(only_verts==0) {
+			if(timeoffset==0) {
 				startvlak= obr->totvlak;
 				index= dl->index;
 				for(a=0; a<dl->parts; a++, index+=3) {
@@ -2674,7 +2677,7 @@
 					}
 				}
 

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list