[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [53135] trunk/blender: Ambient occlusion baker from multi-resolution mesh

Sergey Sharybin sergey.vfx at gmail.com
Tue Dec 18 18:46:42 CET 2012


Revision: 53135
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=53135
Author:   nazgul
Date:     2012-12-18 17:46:42 +0000 (Tue, 18 Dec 2012)
Log Message:
-----------
Ambient occlusion baker from multi-resolution mesh

This implements AO baking directly from multi-resolution mesh with much
less memory overhead than regular baker.

Uses rays distribution implementation from Morten Mikkelsen, raycast
is based on RayObject also used by Blender Internal.

Works in single-thread yet, multi-threading would be implemented later.

Modified Paths:
--------------
    trunk/blender/intern/guardedalloc/intern/mallocn.c
    trunk/blender/release/scripts/startup/bl_ui/properties_render.py
    trunk/blender/source/blender/blenkernel/intern/scene.c
    trunk/blender/source/blender/blenloader/intern/readfile.c
    trunk/blender/source/blender/editors/object/object_bake.c
    trunk/blender/source/blender/makesdna/DNA_scene_types.h
    trunk/blender/source/blender/makesrna/intern/rna_scene.c
    trunk/blender/source/blender/render/extern/include/RE_multires_bake.h
    trunk/blender/source/blender/render/intern/include/rayobject.h
    trunk/blender/source/blender/render/intern/include/rendercore.h
    trunk/blender/source/blender/render/intern/raytrace/rayobject.cpp
    trunk/blender/source/blender/render/intern/source/multires_bake.c
    trunk/blender/source/blender/render/intern/source/rayshade.c
    trunk/blender/source/blender/render/intern/source/rendercore.c

Modified: trunk/blender/intern/guardedalloc/intern/mallocn.c
===================================================================
--- trunk/blender/intern/guardedalloc/intern/mallocn.c	2012-12-18 17:46:26 UTC (rev 53134)
+++ trunk/blender/intern/guardedalloc/intern/mallocn.c	2012-12-18 17:46:42 UTC (rev 53135)
@@ -561,6 +561,8 @@
 	qsort(printblock, totpb, sizeof(MemPrintBlock), compare_len);
 	printf("\ntotal memory len: %.3f MB\n",
 	       (double)mem_in_use / (double)(1024 * 1024));
+	printf("peak memory len: %.3f MB\n",
+	       (double)peak_mem / (double)(1024 * 1024));
 	printf(" ITEMS TOTAL-MiB AVERAGE-KiB TYPE\n");
 	for (a = 0, pb = printblock; a < totpb; a++, pb++) {
 		printf("%6d (%8.3f  %8.3f) %s\n",

Modified: trunk/blender/release/scripts/startup/bl_ui/properties_render.py
===================================================================
--- trunk/blender/release/scripts/startup/bl_ui/properties_render.py	2012-12-18 17:46:26 UTC (rev 53134)
+++ trunk/blender/release/scripts/startup/bl_ui/properties_render.py	2012-12-18 17:46:42 UTC (rev 53135)
@@ -573,7 +573,7 @@
         layout.prop(rd, "bake_type")
 
         multires_bake = False
-        if rd.bake_type in ['NORMALS', 'DISPLACEMENT']:
+        if rd.bake_type in ['NORMALS', 'DISPLACEMENT', 'AO']:
             layout.prop(rd, "use_bake_multires")
             multires_bake = rd.use_bake_multires
 
@@ -602,12 +602,20 @@
             sub.prop(rd, "bake_distance")
             sub.prop(rd, "bake_bias")
         else:
+            split = layout.split()
+
+            col = split.column()
+            col.prop(rd, "use_bake_clear")
+            col.prop(rd, "bake_margin")
+
             if rd.bake_type == 'DISPLACEMENT':
-                layout.prop(rd, "use_bake_lores_mesh")
+                col = split.column()
+                col.prop(rd, "use_bake_lores_mesh")
+            if rd.bake_type == 'AO':
+                col = split.column()
+                col.prop(rd, "bake_bias")
+                col.prop(rd, "bake_rays_number")
 
-            layout.prop(rd, "use_bake_clear")
-            layout.prop(rd, "bake_margin")
 
-
 if __name__ == "__main__":  # only for live edit.
     bpy.utils.register_module(__name__)

Modified: trunk/blender/source/blender/blenkernel/intern/scene.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/scene.c	2012-12-18 17:46:26 UTC (rev 53134)
+++ trunk/blender/source/blender/blenkernel/intern/scene.c	2012-12-18 17:46:42 UTC (rev 53135)
@@ -432,6 +432,7 @@
 	sce->r.bake_osa = 5;
 	sce->r.bake_flag = R_BAKE_CLEAR;
 	sce->r.bake_normal_space = R_BAKE_SPACE_TANGENT;
+	sce->r.bake_rays_number = 256;
 	sce->r.scemode = R_DOCOMP | R_DOSEQ | R_EXTENSION;
 	sce->r.stamp = R_STAMP_TIME | R_STAMP_FRAME | R_STAMP_DATE | R_STAMP_CAMERA | R_STAMP_SCENE | R_STAMP_FILENAME | R_STAMP_RENDERTIME;
 	sce->r.stamp_font_id = 12;

Modified: trunk/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/readfile.c	2012-12-18 17:46:26 UTC (rev 53134)
+++ trunk/blender/source/blender/blenloader/intern/readfile.c	2012-12-18 17:46:42 UTC (rev 53135)
@@ -8420,6 +8420,14 @@
 		}
 	}
 
+	{
+		Scene *scene;
+
+		for (scene = main->scene.first; scene; scene = scene->id.next) {
+			if (scene->r.bake_rays_number == 0)
+				scene->r.bake_rays_number = 256;
+		}
+	}
 	/* WATCH IT!!!: pointers from libdata have not been converted yet here! */
 	/* WATCH IT 2!: Userdef struct init has to be in editors/interface/resources.c! */
 

Modified: trunk/blender/source/blender/editors/object/object_bake.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_bake.c	2012-12-18 17:46:26 UTC (rev 53134)
+++ trunk/blender/source/blender/editors/object/object_bake.c	2012-12-18 17:46:42 UTC (rev 53135)
@@ -96,6 +96,9 @@
 	ListBase data;
 	int bake_clear, bake_filter;
 	short mode, use_lores_mesh;
+	int number_of_rays;
+	float bias;
+	int raytrace_structure;
 } MultiresBakeJob;
 
 static int multiresbake_check(bContext *C, wmOperator *op)
@@ -203,6 +206,9 @@
 
 	if (*lvl == 0) {
 		DerivedMesh *tmp_dm = CDDM_from_mesh(me, ob);
+
+		DM_set_only_copy(tmp_dm, CD_MASK_BAREMESH | CD_MASK_MTFACE);
+
 		dm = CDDM_copy(tmp_dm);
 		tmp_dm->release(tmp_dm);
 	}
@@ -210,6 +216,8 @@
 		MultiresModifierData tmp_mmd = *mmd;
 		DerivedMesh *cddm = CDDM_from_mesh(me, ob);
 
+		DM_set_only_copy(cddm, CD_MASK_BAREMESH | CD_MASK_MTFACE);
+
 		tmp_mmd.lvl = *lvl;
 		tmp_mmd.sculptlvl = *lvl;
 		dm = multires_make_derived_from_derived(cddm, &tmp_mmd, ob, 0);
@@ -227,6 +235,14 @@
 	DerivedMesh *cddm = CDDM_from_mesh(me, ob);
 	DerivedMesh *dm;
 
+	DM_set_only_copy(cddm, CD_MASK_BAREMESH);
+
+	/* TODO: DM_set_only_copy wouldn't set mask for loop and poly data,
+	 *       but we really need BAREMESH only to save lots of memory
+	 */
+	CustomData_set_only_copy(&cddm->loopData, CD_MASK_BAREMESH);
+	CustomData_set_only_copy(&cddm->polyData, CD_MASK_BAREMESH);
+
 	*lvl = mmd->totlvl;
 	*simple = mmd->simple;
 
@@ -298,15 +314,14 @@
 		bkr.bake_filter = scene->r.bake_filter;
 		bkr.mode = scene->r.bake_mode;
 		bkr.use_lores_mesh = scene->r.bake_flag & R_BAKE_LORES_MESH;
+		bkr.bias = scene->r.bake_biasdist;
+		bkr.number_of_rays = scene->r.bake_rays_number;
+		bkr.raytrace_structure = scene->r.raytrace_structure;
 
 		/* create low-resolution DM (to bake to) and hi-resolution DM (to bake from) */
+		bkr.hires_dm = multiresbake_create_hiresdm(scene, ob, &bkr.tot_lvl, &bkr.simple);
 		bkr.lores_dm = multiresbake_create_loresdm(scene, ob, &bkr.lvl);
 
-		if (!bkr.lores_dm)
-			continue;
-
-		bkr.hires_dm = multiresbake_create_hiresdm(scene, ob, &bkr.tot_lvl, &bkr.simple);
-
 		RE_multires_bake_images(&bkr);
 
 		BLI_freelistN(&bkr.image);
@@ -335,24 +350,25 @@
 	bkj->mode = scene->r.bake_mode;
 	bkj->use_lores_mesh = scene->r.bake_flag & R_BAKE_LORES_MESH;
 	bkj->bake_clear = scene->r.bake_flag & R_BAKE_CLEAR;
+	bkj->bias = scene->r.bake_biasdist;
+	bkj->number_of_rays = scene->r.bake_rays_number;
+	bkj->raytrace_structure = scene->r.raytrace_structure;
 
 	CTX_DATA_BEGIN (C, Base *, base, selected_editable_bases)
 	{
 		MultiresBakerJobData *data;
-		DerivedMesh *lores_dm;
 		int lvl;
+
 		ob = base->object;
 
 		multires_force_update(ob);
 
-		lores_dm = multiresbake_create_loresdm(scene, ob, &lvl);
-		if (!lores_dm)
-			continue;
+		data = MEM_callocN(sizeof(MultiresBakerJobData), "multiresBaker derivedMesh_data");
 
-		data = MEM_callocN(sizeof(MultiresBakerJobData), "multiresBaker derivedMesh_data");
-		data->lores_dm = lores_dm;
+		/* create low-resolution DM (to bake to) and hi-resolution DM (to bake from) */
+		data->hires_dm = multiresbake_create_hiresdm(scene, ob, &data->tot_lvl, &data->simple);
+		data->lores_dm = multiresbake_create_loresdm(scene, ob, &lvl);
 		data->lvl = lvl;
-		data->hires_dm = multiresbake_create_hiresdm(scene, ob, &data->tot_lvl, &data->simple);
 
 		BLI_addtail(&bkj->data, data);
 	}
@@ -399,6 +415,10 @@
 		bkr.do_update = do_update;
 		bkr.progress = progress;
 
+		bkr.bias = bkj->bias;
+		bkr.number_of_rays = bkj->number_of_rays;
+		bkr.raytrace_structure = bkj->raytrace_structure;
+
 		RE_multires_bake_images(&bkr);
 
 		BLI_freelistN(&bkr.image);
@@ -652,7 +672,7 @@
 
 static int is_multires_bake(Scene *scene)
 {
-	if (ELEM(scene->r.bake_mode, RE_BAKE_NORMALS, RE_BAKE_DISPLACEMENT))
+	if (ELEM3(scene->r.bake_mode, RE_BAKE_NORMALS, RE_BAKE_DISPLACEMENT, RE_BAKE_AO))
 		return scene->r.bake_flag & R_BAKE_MULTIRES;
 
 	return 0;

Modified: trunk/blender/source/blender/makesdna/DNA_scene_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_scene_types.h	2012-12-18 17:46:26 UTC (rev 53134)
+++ trunk/blender/source/blender/makesdna/DNA_scene_types.h	2012-12-18 17:46:42 UTC (rev 53135)
@@ -491,7 +491,8 @@
 	/* Bake Render options */
 	short bake_osa, bake_filter, bake_mode, bake_flag;
 	short bake_normal_space, bake_quad_split;
-	float bake_maxdist, bake_biasdist, bake_pad;
+	float bake_maxdist, bake_biasdist;
+	int bake_rays_number;
 
 	/* path to render output */
 	char pic[1024]; /* 1024 = FILE_MAX */

Modified: trunk/blender/source/blender/makesrna/intern/rna_scene.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_scene.c	2012-12-18 17:46:26 UTC (rev 53134)
+++ trunk/blender/source/blender/makesrna/intern/rna_scene.c	2012-12-18 17:46:42 UTC (rev 53135)
@@ -3881,6 +3881,13 @@
 	                         "Calculate heights against unsubdivided low resolution mesh");
 	RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL);
 
+	prop = RNA_def_property(srna, "bake_rays_number", PROP_INT, PROP_NONE);
+	RNA_def_property_int_sdna(prop, NULL, "bake_rays_number");
+	RNA_def_property_range(prop, 64, 1024);
+	RNA_def_property_int_default(prop, 256);
+	RNA_def_property_ui_text(prop, "Number of Rays", "Number of rays used for ambient occlusion baking from multires");
+	RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL);
+
 	/* stamp */
 	
 	prop = RNA_def_property(srna, "use_stamp_time", PROP_BOOLEAN, PROP_NONE);

Modified: trunk/blender/source/blender/render/extern/include/RE_multires_bake.h
===================================================================
--- trunk/blender/source/blender/render/extern/include/RE_multires_bake.h	2012-12-18 17:46:26 UTC (rev 53134)
+++ trunk/blender/source/blender/render/extern/include/RE_multires_bake.h	2012-12-18 17:46:42 UTC (rev 53135)
@@ -40,11 +40,16 @@
 	int simple, lvl, tot_lvl, bake_filter;
 	short mode, use_lores_mesh;
 
+	int number_of_rays;
+	float bias;
+
 	int tot_obj, tot_image;
 	ListBase image;
 
 	int baked_objects, baked_faces;
 
+	int raytrace_structure;
+
 	short *stop;
 	short *do_update;
 	float *progress;

Modified: trunk/blender/source/blender/render/intern/include/rayobject.h
===================================================================
--- trunk/blender/source/blender/render/intern/include/rayobject.h	2012-12-18 17:46:26 UTC (rev 53134)
+++ trunk/blender/source/blender/render/intern/include/rayobject.h	2012-12-18 17:46:42 UTC (rev 53135)
@@ -87,6 +87,8 @@
 
 RayObject *RE_rayface_from_vlak(RayFace *face, struct ObjectInstanceRen *obi, struct VlakRen *vlr);
 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list