[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [60631] trunk/blender: Derivative map baker

Sergey Sharybin sergey.vfx at gmail.com
Wed Oct 9 17:51:15 CEST 2013


Revision: 60631
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=60631
Author:   nazgul
Date:     2013-10-09 15:51:14 +0000 (Wed, 09 Oct 2013)
Log Message:
-----------
Derivative map baker

Added support for derivative map baking, which
is accessable as a dedicated baker type. Works
pretty much the same as displacement map baker,
but gives you derivative map.

In fact, inernally this baker is just a filter
which applies on the result of displacement map.

Both regular and multires baking are supported.

Patch by Morten Mikkelsen and self.

Modified Paths:
--------------
    trunk/blender/release/scripts/startup/bl_ui/properties_render.py
    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/extern/include/RE_pipeline.h
    trunk/blender/source/blender/render/extern/include/RE_shader_ext.h
    trunk/blender/source/blender/render/intern/source/bake.c
    trunk/blender/source/blender/render/intern/source/convertblender.c
    trunk/blender/source/blender/render/intern/source/multires_bake.c

Modified: trunk/blender/release/scripts/startup/bl_ui/properties_render.py
===================================================================
--- trunk/blender/release/scripts/startup/bl_ui/properties_render.py	2013-10-09 15:36:04 UTC (rev 60630)
+++ trunk/blender/release/scripts/startup/bl_ui/properties_render.py	2013-10-09 15:51:14 UTC (rev 60631)
@@ -501,7 +501,7 @@
         layout.prop(rd, "bake_type")
 
         multires_bake = False
-        if rd.bake_type in ['NORMALS', 'DISPLACEMENT', 'AO']:
+        if rd.bake_type in ['NORMALS', 'DISPLACEMENT', 'DERIVATIVE', 'AO']:
             layout.prop(rd, "use_bake_multires")
             multires_bake = rd.use_bake_multires
 
@@ -542,11 +542,20 @@
             if rd.bake_type == 'DISPLACEMENT':
                 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_samples")
 
+        if rd.bake_type == 'DERIVATIVE':
+            row = layout.row()
+            row.prop(rd, "use_bake_user_scale", text="")
 
+            sub = row.column()
+            sub.active = rd.use_bake_user_scale
+            sub.prop(rd, "bake_user_scale", text="User Scale")
+
+
 if __name__ == "__main__":  # only for live edit.
     bpy.utils.register_module(__name__)

Modified: trunk/blender/source/blender/editors/object/object_bake.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_bake.c	2013-10-09 15:36:04 UTC (rev 60630)
+++ trunk/blender/source/blender/editors/object/object_bake.c	2013-10-09 15:51:14 UTC (rev 60631)
@@ -91,20 +91,24 @@
 typedef struct MultiresBakerJobData {
 	struct MultiresBakerJobData *next, *prev;
 	DerivedMesh *lores_dm, *hires_dm;
-	int simple, lvl, tot_lvl;
+	bool simple;
+	int lvl, tot_lvl;
 	ListBase images;
 } MultiresBakerJobData;
 
 /* data passing to multires-baker job */
 typedef struct {
 	ListBase data;
-	int bake_clear, bake_filter;
-	short mode, use_lores_mesh;
-	int number_of_rays;
-	float bias;
-	int raytrace_structure;
-	int octree_resolution;
-	int threads;
+	bool bake_clear;      /* Clear the images before baking */
+	int bake_filter;      /* Bake-filter, aka margin */
+	short mode;           /* mode of baking (displacement, normals, AO) */
+	bool use_lores_mesh;  /* Use low-resolution mesh when baking displacement maps */
+	int number_of_rays;   /* Number of rays to be cast when doing AO baking */
+	float bias;           /* Bias between object and start ray point when doing AO baking */
+	int raytrace_structure;  /* Optimization structure to be used for AO baking */
+	int octree_resolution;   /* Reslution of octotree when using octotree optimization structure */
+	int threads;             /* Number of threads to be used for baking */
+	float user_scale;          /* User scale used to scale displacement when baking derivative map. */
 } MultiresBakeJob;
 
 static bool multiresbake_check(bContext *C, wmOperator *op)
@@ -236,7 +240,7 @@
 	return dm;
 }
 
-static DerivedMesh *multiresbake_create_hiresdm(Scene *scene, Object *ob, int *lvl, int *simple)
+static DerivedMesh *multiresbake_create_hiresdm(Scene *scene, Object *ob, int *lvl, bool *simple)
 {
 	Mesh *me = (Mesh *)ob->data;
 	MultiresModifierData *mmd = get_multires_modifier(scene, ob, 0);
@@ -253,7 +257,7 @@
 	CustomData_set_only_copy(&cddm->polyData, CD_MASK_BAREMESH);
 
 	*lvl = mmd->totlvl;
-	*simple = mmd->simple;
+	*simple = mmd->simple != 0;
 
 	tmp_mmd.lvl = mmd->totlvl;
 	tmp_mmd.sculptlvl = mmd->totlvl;
@@ -349,7 +353,7 @@
 			if (scene->r.bake_mode == RE_BAKE_NORMALS) {
 				clear_flag = CLEAR_TANGENT_NORMAL;
 			}
-			else if (scene->r.bake_mode == RE_BAKE_DISPLACEMENT) {
+			else if (ELEM(scene->r.bake_mode, RE_BAKE_DISPLACEMENT, RE_BAKE_DERIVATIVE)) {
 				clear_flag = CLEAR_DISPLACEMENT;
 			}
 
@@ -376,6 +380,8 @@
 		bkr.raytrace_structure = scene->r.raytrace_structure;
 		bkr.octree_resolution = scene->r.ocres;
 		bkr.threads = BKE_scene_num_threads(scene);
+		bkr.user_scale = (scene->r.bake_flag & R_BAKE_USERSCALE) ? scene->r.bake_user_scale : -1.0f;
+		//bkr.reports= op->reports;
 
 		/* 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);
@@ -414,6 +420,8 @@
 	bkj->raytrace_structure = scene->r.raytrace_structure;
 	bkj->octree_resolution = scene->r.ocres;
 	bkj->threads = BKE_scene_num_threads(scene);
+	bkj->user_scale = (scene->r.bake_flag & R_BAKE_USERSCALE) ? scene->r.bake_user_scale : -1.0f;
+	//bkj->reports = op->reports;
 
 	CTX_DATA_BEGIN (C, Base *, base, selected_editable_bases)
 	{
@@ -453,7 +461,7 @@
 			if (bkj->mode == RE_BAKE_NORMALS) {
 				clear_flag = CLEAR_TANGENT_NORMAL;
 			}
-			else if (bkj->mode == RE_BAKE_DISPLACEMENT) {
+			else if (ELEM(bkj->mode, RE_BAKE_DISPLACEMENT, RE_BAKE_DERIVATIVE)) {
 				clear_flag = CLEAR_DISPLACEMENT;
 			}
 
@@ -468,6 +476,8 @@
 		bkr.bake_filter = bkj->bake_filter;
 		bkr.mode = bkj->mode;
 		bkr.use_lores_mesh = bkj->use_lores_mesh;
+		bkr.user_scale = bkj->user_scale;
+		//bkr.reports = bkj->reports;
 
 		/* create low-resolution DM (to bake to) and hi-resolution DM (to bake from) */
 		bkr.lores_dm = data->lores_dm;
@@ -773,7 +783,7 @@
 
 static int is_multires_bake(Scene *scene)
 {
-	if (ELEM3(scene->r.bake_mode, RE_BAKE_NORMALS, RE_BAKE_DISPLACEMENT, RE_BAKE_AO))
+	if (ELEM4(scene->r.bake_mode, RE_BAKE_NORMALS, RE_BAKE_DISPLACEMENT, RE_BAKE_DERIVATIVE, 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	2013-10-09 15:36:04 UTC (rev 60630)
+++ trunk/blender/source/blender/makesdna/DNA_scene_types.h	2013-10-09 15:51:14 UTC (rev 60631)
@@ -511,6 +511,7 @@
 	short bake_normal_space, bake_quad_split;
 	float bake_maxdist, bake_biasdist;
 	short bake_samples, bake_pad;
+	float bake_user_scale, bake_pad1;
 
 	/* path to render output */
 	char pic[1024]; /* 1024 = FILE_MAX */
@@ -1353,6 +1354,7 @@
 #define R_BAKE_MULTIRES		16
 #define R_BAKE_LORES_MESH	32
 #define R_BAKE_VCOL			64
+#define R_BAKE_USERSCALE	128
 
 /* bake_normal_space */
 #define R_BAKE_SPACE_CAMERA	 0

Modified: trunk/blender/source/blender/makesrna/intern/rna_scene.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_scene.c	2013-10-09 15:36:04 UTC (rev 60630)
+++ trunk/blender/source/blender/makesrna/intern/rna_scene.c	2013-10-09 15:51:14 UTC (rev 60631)
@@ -4088,6 +4088,7 @@
 		{RE_BAKE_NORMALS, "NORMALS", 0, "Normals", "Bake normals"},
 		{RE_BAKE_TEXTURE, "TEXTURE", 0, "Textures", "Bake textures"},
 		{RE_BAKE_DISPLACEMENT, "DISPLACEMENT", 0, "Displacement", "Bake displacement"},
+		{RE_BAKE_DERIVATIVE, "DERIVATIVE", 0, "Derivative", "Bake derivative map"},
 		{RE_BAKE_EMIT, "EMIT", 0, "Emission", "Bake Emit values (glow)"},
 		{RE_BAKE_ALPHA, "ALPHA", 0, "Alpha", "Bake Alpha values (transparency)"},
 		{RE_BAKE_MIRROR_INTENSITY, "MIRROR_INTENSITY", 0, "Mirror Intensity", "Bake Mirror values"},
@@ -4674,6 +4675,17 @@
 	                         "Bake to vertex colors instead of to a UV-mapped image");
 	RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL);
 
+	prop = RNA_def_property(srna, "use_bake_user_scale", PROP_BOOLEAN, PROP_NONE);
+	RNA_def_property_boolean_sdna(prop, NULL, "bake_flag", R_BAKE_USERSCALE);
+	RNA_def_property_ui_text(prop, "User scale", "Use a user scale for the derivative map");
+
+	prop = RNA_def_property(srna, "bake_user_scale", PROP_FLOAT, PROP_NONE);
+	RNA_def_property_float_sdna(prop, NULL, "bake_user_scale");
+	RNA_def_property_range(prop, 0.0, 1000.0);
+	RNA_def_property_ui_text(prop, "Scale",
+	                         "Instead of automatically normalizing to 0..1, "
+	                         "apply a user scale to the derivative map.");
+
 	/* 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	2013-10-09 15:36:04 UTC (rev 60630)
+++ trunk/blender/source/blender/render/extern/include/RE_multires_bake.h	2013-10-09 15:51:14 UTC (rev 60631)
@@ -37,21 +37,26 @@
 
 typedef struct MultiresBakeRender {
 	DerivedMesh *lores_dm, *hires_dm;
-	int simple, lvl, tot_lvl, bake_filter;
-	short mode, use_lores_mesh;
+	bool simple;
+	int bake_filter;      /* Bake-filter, aka margin */
+	int lvl, tot_lvl;
+	short mode;
+	bool use_lores_mesh;  /* Use low-resolution mesh when baking displacement maps */
 
-	int number_of_rays;
-	float bias;
+	int number_of_rays;   /* Number of rays to be cast when doing AO baking */
+	float bias;           /* Bias between object and start ray point when doing AO baking */
 
 	int tot_obj, tot_image;
 	ListBase image;
 
 	int baked_objects, baked_faces;
 
-	int raytrace_structure;
-	int octree_resolution;
-	int threads;
-	
+	int raytrace_structure;    /* Optimization structure to be used for AO baking */
+	int octree_resolution;     /* Reslution of octotree when using octotree optimization structure */
+	int threads;               /* Number of threads to be used for baking */
+
+	float user_scale;          /* User scale used to scale displacement when baking derivative map. */
+
 	short *stop;
 	short *do_update;
 	float *progress;

Modified: trunk/blender/source/blender/render/extern/include/RE_pipeline.h
===================================================================
--- trunk/blender/source/blender/render/extern/include/RE_pipeline.h	2013-10-09 15:36:04 UTC (rev 60630)
+++ trunk/blender/source/blender/render/extern/include/RE_pipeline.h	2013-10-09 15:51:14 UTC (rev 60631)
@@ -281,6 +281,7 @@
 #define RE_BAKE_MIRROR_INTENSITY	10
 #define RE_BAKE_ALPHA				11
 #define RE_BAKE_EMIT				12
+#define RE_BAKE_DERIVATIVE		13
 
 void RE_Database_Baking(struct Render *re, struct Main *bmain, struct Scene *scene, unsigned int lay, const int type, struct Object *actob);
 

Modified: trunk/blender/source/blender/render/extern/include/RE_shader_ext.h

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list