[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