[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [16243] branches/soc-2008-unclezeiv/source /blender: Indirect lighting: added option to create a mesh during rendering ; each virtual point light is represented as a vertex.

Davide Vercelli davide.vercelli at gmail.com
Sun Aug 24 23:14:08 CEST 2008


Revision: 16243
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16243
Author:   unclezeiv
Date:     2008-08-24 23:14:07 +0200 (Sun, 24 Aug 2008)

Log Message:
-----------
Indirect lighting: added option to create a mesh during rendering; each virtual point light is represented as a vertex.

This feature was requested on blenderartists as a way to "debug" indirect lighting. Adding a mesh as a visualization feedback is surely a hack, but maybe a similar functionality should be available also in the final version: suggestions for better (future) implementations are welcome.

Modified Paths:
--------------
    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/render/intern/source/lightcuts.c
===================================================================
--- branches/soc-2008-unclezeiv/source/blender/render/intern/source/lightcuts.c	2008-08-24 20:57:56 UTC (rev 16242)
+++ branches/soc-2008-unclezeiv/source/blender/render/intern/source/lightcuts.c	2008-08-24 21:14:07 UTC (rev 16243)
@@ -51,6 +51,18 @@
 #include "render_types.h"
 #include "shading.h"
 
+/* includes for debug vpl visualization mesh */
+#include "BKE_customdata.h"
+#include "BKE_depsgraph.h"
+#include "BKE_mesh.h"
+#include "BKE_library.h"
+#include "BKE_material.h"
+#include "BKE_object.h"
+#include "DNA_customdata_types.h"
+#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
+#include "DNA_object_types.h"
+
 /* #define LIGHTCUTS_DEBUG */
 
 #define LC_DBG_TREE_BUILDTIMES   0x0001
@@ -80,10 +92,11 @@
 #define FALLOFF_MIX    3
 #define FALLOFF_SLIDER 3
 
-#define LC_OPT_FIXED_DIRS 0x01
+#define LC_OPT_FIXED_DIRS  0x01
 #define LC_OPT_ONLY_INDIR  0x02
 #define LC_OPT_2ND_BOUNCE  0x04
 #define LC_OPT_ENV_LIGHT   0x08
+#define LC_OPT_INDIR_MESH  0x10
 
 /*
  * This is a table to select the "worst falloff" for a cluster, given the
@@ -194,6 +207,7 @@
 	int dbg_first_pixel;
 	int dbg_options;
 #endif
+	float* dbg_vis_vpl;
 } LightcutsData;
 
 typedef struct SampleCoordInfo {
@@ -1109,6 +1123,71 @@
 	dir[2]= cosf(phi);
 }
 
+static void dbg_create_vpl_mesh(Render *re, LightcutsData *lcd)
+{
+	int i, newlen;
+	Mesh *mesh;
+	MVert *newvert, *tmpvert;
+	CustomData vdata;
+	Base *base;
+	Scene *scene;
+	Object *object, *camera;
+
+	mesh= add_mesh("indir_visualize");
+	MEM_freeN(mesh->bb);
+	mesh->bb= NULL;
+	mesh->id.us = 0;
+
+	/* create custom vertex data arrays and copy existing vertices into it */
+	newlen = mesh->totvert + lcd->vpl_counter;
+	CustomData_copy( &mesh->vdata, &vdata, CD_MASK_MESH, CD_DEFAULT, newlen );
+	CustomData_copy_data( &mesh->vdata, &vdata, 0, 0, mesh->totvert );
+
+	if ( !CustomData_has_layer( &vdata, CD_MVERT ) )
+		CustomData_add_layer( &vdata, CD_MVERT, CD_CALLOC, NULL, newlen );
+
+	newvert = CustomData_get_layer( &vdata, CD_MVERT );
+
+	/* scan the input list and insert the new vertices */
+
+	tmpvert = &newvert[mesh->totvert];
+	for( i = 0; i < lcd->vpl_counter; ++i, ++tmpvert )
+		memcpy( tmpvert->co, &lcd->dbg_vis_vpl[3 * i], sizeof(float) * 3 );
+	
+	CustomData_free( &mesh->vdata, mesh->totvert );
+	mesh->vdata = vdata;
+	mesh_update_customdata_pointers( mesh );
+	mesh->totvert = newlen;
+
+	object= add_only_object(OB_MESH, "indir_visualize");
+	object->data= mesh;
+	id_us_plus((ID *)mesh);
+	object->flag = SELECT;
+
+	/* link to scene */
+	scene= re->scene;
+	base= MEM_callocN( sizeof( Base ), "lc_newbase" );
+	base->object= object; /* link object to the new base */
+	base->lay= object->lay = scene->lay & ((1<<20)-1); /* Layer, by default visible*/
+	base->flag= SELECT;
+	object->id.us= 1; /* we will exist once in this scene */
+
+	/* finally, link new base to scene */
+	BLI_addhead( &(scene->base), base );
+
+	/* make sure data and object materials are consistent */
+	test_object_materials( (ID *)object->data );
+
+	/* copy camera location and rotation */
+	camera= scene->camera;		
+	VECCOPY(object->loc, camera->loc);
+	VECCOPY(object->dloc, camera->dloc);
+	VECCOPY(object->rot, camera->rot);
+	VECCOPY(object->drot, camera->drot);
+
+	DAG_object_flush_update(scene, object, OB_RECALC_OB);
+}
+
 /* XXX: terrible hack currently needed by get_bounce_color */
 extern struct Render R;
 
@@ -1348,6 +1427,9 @@
 			lev, co[0], co[1], co[2], scol[0], scol[1], scol[2], isec.vec[0], isec.vec[1], isec.vec[2]);
 #endif
 	
+	if (lcd->options & LC_OPT_INDIR_MESH)
+		VECCOPY(lcd->dbg_vis_vpl + 3 * lcd->vpl_counter, co);
+	
 	/* XXX: see remarks on similar code in convert_environment_map */
 	go= MEM_callocN(sizeof(GroupObject), "groupobject");
 	BLI_addtail(&lcd->pointlights, go);
@@ -1531,6 +1613,24 @@
 		R.r.mode&= ~R_LIGHTCUTS;
 	}
 	
+	if (lcd->options & LC_OPT_INDIR_MESH) {
+		/* allocate array to hold coordinates for all possible virtual point lights */
+		int max_vpl;
+		int nlights= 0;
+		
+		for(go=lights->first; go; go= go->next) {
+			lar= go->lampren;
+			if(lar==NULL) continue;
+			
+			if (ELEM3(lar->type, LA_LOCAL, LA_SUN, LA_SPOT))
+				nlights++;
+		}
+		
+		max_vpl= (nlights + re->r.lightcuts_area_lights + re->r.lightcuts_env_map) * lcd->do_indir;
+		
+		lcd->dbg_vis_vpl= MEM_callocN(sizeof(float) * 3 * max_vpl, "lc_vpl_visualization");
+	}
+	
 	/* TODO: we could do some form of importance sampling here */
 	for(go=lights->first; go; go= go->next) {
 		lar= go->lampren;
@@ -1634,6 +1734,9 @@
 	
 	/* XXX: restore mode (terrible hack needed by get_bounce_color) */
 	R.r.mode|= R_LIGHTCUTS;
+	
+	if (lcd->options & LC_OPT_INDIR_MESH)
+		dbg_create_vpl_mesh(re, lcd);
 }
 
 /* Adapted from "Transforming Axis-Aligned Bounding Boxes" by Jim Arvo, "Graphics Gems", Academic Press, 1990 */
@@ -2293,6 +2396,8 @@
 				MEM_freeN(lcd->trees[i].array);
 		BLI_freelistN(&lcd->pointlights);
 		MEM_freeN(lcd->cut_nodes);
+		if (lcd->dbg_vis_vpl);
+			MEM_freeN(lcd->dbg_vis_vpl);
 		MEM_freeN(lcd);
 	}
 	*p= NULL;

Modified: branches/soc-2008-unclezeiv/source/blender/src/buttons_scene.c
===================================================================
--- branches/soc-2008-unclezeiv/source/blender/src/buttons_scene.c	2008-08-24 20:57:56 UTC (rev 16242)
+++ branches/soc-2008-unclezeiv/source/blender/src/buttons_scene.c	2008-08-24 21:14:07 UTC (rev 16243)
@@ -3450,6 +3450,7 @@
 	uiBlockBeginAlign(block);
 	uiDefButBitI(block, TOG, SCE_PASS_LCFAUX, B_SET_PASS, "False color", 200, 0, 48, 20, &srl->passflag, 0, 0, 0, 0, "(Debug option) Deliver false color pass");
 	uiDefButI(block, NUM, B_DIFF, "Debug:", 200, -22, 48, 20, &G.scene->r.lightcuts_debug_options, 0, 0xffffffff, 0, 0, "(Debug option) Slider to select debug prints");
+	uiDefButBitS(block, TOG, 0x10, B_SET_PASS, "VPL Mesh", 200, -44, 48, 20, &G.scene->r.lightcuts_options, 0, 0, 0, 0, "(Debug option) Creates a mesh to visualize indirect light placement");
 	uiBlockEndAlign(block);
 	
 	uiBlockBeginAlign(block);





More information about the Bf-blender-cvs mailing list