[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [15402] branches/soc-2008-unclezeiv/source /blender: Initial commit for area light conversion code.

Davide Vercelli davide.vercelli at gmail.com
Wed Jul 2 03:50:10 CEST 2008


Revision: 15402
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15402
Author:   unclezeiv
Date:     2008-07-02 03:48:57 +0200 (Wed, 02 Jul 2008)

Log Message:
-----------
Initial commit for area light conversion code.

Modified Paths:
--------------
    branches/soc-2008-unclezeiv/source/blender/makesdna/DNA_scene_types.h
    branches/soc-2008-unclezeiv/source/blender/render/intern/source/lightcuts.c
    branches/soc-2008-unclezeiv/source/blender/src/buttons_scene.c

Modified: branches/soc-2008-unclezeiv/source/blender/makesdna/DNA_scene_types.h
===================================================================
--- branches/soc-2008-unclezeiv/source/blender/makesdna/DNA_scene_types.h	2008-07-02 00:23:02 UTC (rev 15401)
+++ branches/soc-2008-unclezeiv/source/blender/makesdna/DNA_scene_types.h	2008-07-02 01:48:57 UTC (rev 15402)
@@ -316,7 +316,9 @@
 	float lightcuts_max_error;
 	int lightcuts_max_lights;
 	int lightcuts_max_cut;
-	int pad1;
+	int lightcuts_area_density;
+	float lightcuts_unused;
+	int pad4;
 } RenderData;
 
 /* control render convert and shading engine */

Modified: branches/soc-2008-unclezeiv/source/blender/render/intern/source/lightcuts.c
===================================================================
--- branches/soc-2008-unclezeiv/source/blender/render/intern/source/lightcuts.c	2008-07-02 00:23:02 UTC (rev 15401)
+++ branches/soc-2008-unclezeiv/source/blender/render/intern/source/lightcuts.c	2008-07-02 01:48:57 UTC (rev 15402)
@@ -431,55 +431,140 @@
 	MEM_freeN(pair_array);
 }
 
-#ifdef LIGHTCUTS_CURRENTLY_UNUSED
-/*
- * TODO: this is a temporary function, I need a proper initializer
- * right now this code is partly copied from add_render_lamp()
- */
-static void init_lamp_data(Render * re, LampRen * lar)
+
+static void create_lamp_oriented(Render * re, LampRen * lar, LampRen * orig)
 {
-	if(re->r.mode & R_SHADOW) {
+	/* float xs, ys, dist; */
+	/* TODO: what is xs ys ?? where are they used? */
+	lar->dist= orig->dist;
+	lar->distkw= lar->dist * lar->dist; /* who uses this? */
+	
+	/* float co[3]; */
+	/* initialize later */
+	
+	/* short type, mode; */
+	lar->type = LA_SPOT;
+	lar->mode = LA_SHAD_RAY; /* at least */
+	
+	/* float r, g, b, k; k is GAMMA */
+	/* initialize later */
+	
+	/* float energy, haint; */
+	/* initialize later */
+	lar->haint= 0.0f;
+	
+	/* int lay; */
+	/* TODO: check thislayer stuff... */
+	lar->lay= orig->lay;
+	
+	/* float spotsi,spotbl; */
+	lar->spotsi= 0.0f; /* it's actually the cosine; TODO: check if it's ok */
+	
+	/* float vec[3]; */
+	/* same as original area light */
+	VECCOPY(lar->vec, orig->vec);
+	
+	/* float xsp, ysp, distkw, inpr; TODO: unknown uses!! */
+	/* float halokw, halo; TODO: unknown uses!! */
+	
+	/* short falloff_type; */
+	lar->falloff_type= LA_FALLOFF_INVSQUARE;
+	
+	/* float ld1,ld2; */
+	/* struct CurveMapping *curfalloff; */
+	lar->curfalloff= NULL;
 
-		if(lar->type==LA_AREA && (lar->mode & LA_SHAD_RAY) && (lar->ray_samp_method == LA_SAMP_CONSTANT)) {
-			init_jitter_plane(lar);
-		}
+	/* copied from Lamp, to decouple more rendering stuff */
+	/** Size of the shadowbuffer */
+	/* short bufsize; */
+	/** Number of samples for the shadows */
+	/*	short samp; */
+	/** Softness factor for shadow */
+	/* float soft; */
+	/** amount of subsample buffers and type of filter for sampling */
+	/* short buffers, filtertype; */
+	/** shadow buffer type (regular, irregular) */
+	/* short buftype; */
+	/** autoclip */
+	/* short bufflag; */
+	/** shadow plus halo: detail level */
+	/* short shadhalostep; */
+	/** Near clip of the lamp */
+	/* float clipsta; */
+	/** Far clip of the lamp */
+	/* float clipend; */
+	/** A small depth offset to prevent self-shadowing. */
+	/* float bias; */
+	
+	/*	short ray_samp, ray_sampy, ray_sampz, ray_samp_method, ray_samp_type, area_shape, ray_totsamp; */
+	lar->ray_samp= 1;
+	lar->ray_samp_method= LA_SAMP_CONSTANT;
+	lar->ray_samp_type= LA_SAMP_UMBRA; /* LA_SAMP_DITHER, LA_SAMP_JITTER TODO: is it for area lights?*/
+	
+	/* short xold[BLENDER_MAX_THREADS], yold[BLENDER_MAX_THREADS]; // last jitter table for area lights */
+	/* float area_size, area_sizey, area_sizez; */
+	/* float adapt_thresh; */
 
-		else if (lar->type==LA_SPOT && (lar->mode & LA_SHAD_BUF) ) {
-			/* Per lamp, one shadow buffer is made. */
-#if 0
-/* TODO: matrix mat is not available here */
-			lar->bufflag= la->bufflag;
-			Mat4CpyMat4(mat, ob->obmat);
-			initshadowbuf(re, lar, mat);	/* mat is altered */
-#endif
-		}
+	/* struct ShadBuf *shb; */
+	/* float *jitter; */
+	
+	/* float imat[3][3]; */
+	Mat3CpyMat3(lar->imat, orig->imat);
+	
+	/* float spottexfac; */
+	/* float sh_invcampos[3], sh_zfac; // sh_= spothalo */
+	
+	/* float mat[3][3];	// 3x3 part from lampmat x viewmat */
+	Mat3CpyMat3(lar->mat, orig->mat);
+	/* float area[8][3], areasize; */
+	
+	/* passes & node shader support: all shadow info for a pixel */
+	/* LampShadowSample *shadsamp; */
+	{
+		LampShadowSample *ls;
+		LampShadowSubSample *lss;
+		int a, b;
 
-		/* this is the way used all over to check for shadow */
-		if(lar->shb || (lar->mode & LA_SHAD_RAY)) {
-			LampShadowSample *ls;
-			LampShadowSubSample *lss;
-			int a, b;
+		memset(re->shadowsamplenr, 0, sizeof(re->shadowsamplenr));
+		
+		lar->shadsamp= MEM_mallocN(re->r.threads*sizeof(LampShadowSample), "lamp shadow sample");
+		ls= lar->shadsamp;
 
-			memset(re->shadowsamplenr, 0, sizeof(re->shadowsamplenr));
-
-			lar->shadsamp= MEM_mallocN(re->r.threads*sizeof(LampShadowSample), "lamp shadow sample");
-			ls= lar->shadsamp;
-
-			/* shadfacs actually mean light, let's put them to 1 to prevent uninitialized accidents */
-			for(a=0; a<re->r.threads; a++, ls++) {
-				lss= ls->s;
-				for(b=0; b<re->r.osa; b++, lss++) {
-					lss->samplenr= -1;	/* used to detect whether we store or read */
-					lss->shadfac[0]= 1.0f;
-					lss->shadfac[1]= 1.0f;
-					lss->shadfac[2]= 1.0f;
-					lss->shadfac[3]= 1.0f;
-				}
+		/* shadfacs actually mean light, let's put them to 1 to prevent uninitialized accidents */
+		for(a=0; a<re->r.threads; a++, ls++) {
+			lss= ls->s;
+			for(b=0; b<re->r.osa; b++, lss++) {
+				lss->samplenr= -1;	/* used to detect whether we store or read */
+				lss->shadfac[0]= 1.0f;
+				lss->shadfac[1]= 1.0f;
+				lss->shadfac[2]= 1.0f;
+				lss->shadfac[3]= 1.0f;
 			}
 		}
 	}
+		
+	/* yafray: photonlight params */
+	/*
+	int YF_numphotons, YF_numsearch;
+	short YF_phdepth, YF_useqmc, YF_bufsize;
+	float YF_causticblur, YF_ltradius;
+	float YF_glowint, YF_glowofs;
+	short YF_glowtype;
+	*/
+	
+	/* ray optim */
+	/*
+	VlakRen *vlr_last[BLENDER_MAX_THREADS];
+	ObjectInstanceRen *obi_last[BLENDER_MAX_THREADS];
+	
+	struct MTex *mtex[MAX_MTEX];
+	*/
+	/* threading */
+	/*
+	int thread_assigned;
+	int thread_ready;
+	*/
 }
-#endif
 
 void lightcuts_init(Render * re)
 {
@@ -490,11 +575,7 @@
 	LampRen *lar;
 	char tree_time_str[12]; /* length 12 required by BLI_timestr */
 	int i;
-
-#ifdef LIGHTCUTS_CURRENTLY_UNUSED
-	LampRen *larnew;
-	float r, g, b, n;
-#endif
+	float density;
 	
 	re->i.infostr= "Initializing Lightcuts";
 	re->stats_draw(&re->i);
@@ -504,11 +585,87 @@
 	lcd->max_local_dist= MAXFLOAT;
 	lcd->max_spot_dist= MAXFLOAT;
 	lcd->light_counter= 0;
+	density= sqrtf(re->r.lightcuts_area_density);
 
 	for(go=lights->first; go; go= go->next) {
 		lar= go->lampren;
 		if(lar==NULL) continue;
+		
+		if (lar->type == LA_AREA) {
+			int x, y, smpx, smpy;
+			float area, gapx, gapy, factor, realw, realh;
+			float xdir[3];
+			float ydir[3];
+			float stepx, stepy;
+			LampRen *orig= lar;
+			
+			VECCOPY(xdir, orig->mat[0]);
+			VECCOPY(ydir, orig->mat[1]);
+			
+			realw= sqrtf(VEC_LEN_SQ(orig->mat[0])) * orig->area_size;
+			realh= sqrtf(VEC_LEN_SQ(orig->mat[1])) * orig->area_sizey;
+			 
+			area= realw * realh;
+			smpx= MAX2((int)(density * realw), 1);
+			smpy= MAX2((int)(density * realh), 1);
+			gapx= 1.0 / (float)(smpx);
+			gapy= 1.0 / (float)(smpx);
+			factor= 2.0f * area / (smpx * smpy);
+			
+			/* XXX: TODO: temporary check just to avoid freezing on undue densities */
+			if (lcd->light_counter + smpx * smpy > re->r.lightcuts_max_lights) {
+				printf("Err: required light density would violate light limit\n");
+				continue;
+			}
+			
+			for (x=0; x<smpx; x++) {
+				for (y=0; y<smpy; y++) {
+					gonew= MEM_callocN(sizeof(GroupObject), "groupobject");
+					BLI_addtail(pointlights, gonew);
+					gonew->recalc= go->recalc; /* XXX: what is this? */
+					/*
+					 * XXX: probably wrong, more a test to see if it is used somewhere
+					 * or deallocated
+					 * The point here is that we create new lights with no corresponding
+					 * objects... do we need objects there?
+					 */
+					gonew->ob= 0; /* XXX: or go->ob */
 
+					lar = (LampRen *)MEM_callocN(sizeof(LampRen), "lampren");
+					
+					create_lamp_oriented(re, lar, orig);
+					lar->r= orig->r * factor;
+					lar->g= orig->g * factor;
+					lar->b= orig->b * factor;
+					lar->energy= orig->energy * factor;
+
+					/* place a light in its own square with random jittering */
+					stepx= orig->area_size * (gapx * (x + BLI_frand()) - 0.5f);
+					stepy= orig->area_sizey * (gapy * (y + BLI_frand()) - 0.5f);
+					lar->co[0]= orig->co[0] + xdir[0] * stepx + ydir[0] * stepy;
+					lar->co[1]= orig->co[1] + xdir[1] * stepx + ydir[1] * stepy;
+					lar->co[2]= orig->co[2] + xdir[2] * stepx + ydir[2] * stepy;
+
+#ifdef LIGHTCUTS_DEBUG
+					printf("coordinates: %4f %4f %4f\n", lar->co[0], lar->co[1], lar->co[2]);
+#endif
+
+					BLI_addtail(&re->lampren, lar);
+					/* check deallocation */
+					gonew->lampren= lar;
+					
+					/* TODO: handle other attenuation models */
+					if (lar->dist < lcd->max_spot_dist)
+						lcd->max_spot_dist= lar->dist;
+					
+					lcd->trees[TREE_SPOT].counter++;
+					lcd->light_counter++;
+					lar->ray_samp_method = LA_SAMP_CONSTANT;
+				}
+			}
+			continue;
+		}
+
 		/* first copy the initial light */
 		gonew= MEM_callocN(sizeof(GroupObject), "groupobject");
 		BLI_addtail(pointlights, gonew);
@@ -549,51 +706,6 @@
 		 * TODO: QMC may be restored for stronger lights
 		 */
 		lar->ray_samp_method = LA_SAMP_CONSTANT;
-
-#ifdef LIGHTCUTS_CURRENTLY_UNUSED
-		/*
-		 * proof-of-concept functionality:
-		 * for each existing "lamp" or "sun", add another one, identical but:
-		 * - having a random colour
-		 * - displaced of 1 unit along light direction
-		 */
-		gonew= MEM_callocN(sizeof(GroupObject), "groupobject");
-		BLI_addtail(pointlights, gonew);
-		gonew->recalc= go->recalc;
-		/*
-		 * XXX: probably wrong, more a test to see if it is used somewhere
-		 * or deallocated
-		 * The point here is that we create new lights with no corresponding
-		 * objects... do we need objects there?
-		 */
-		gonew->ob= 0;
-
-		larnew = (LampRen *)MEM_callocN(sizeof(LampRen), "lampren");
-		memcpy(larnew, lar, sizeof(LampRen));
-
-		/* beware of copying pointers, or destruction will have problems */
-		larnew->shb = NULL;
-		larnew->jitter = NULL;
-		larnew->shadsamp = NULL;
-		larnew->curfalloff = NULL;
-

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list