[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [42979] trunk/blender/source/blender/ editors/object/object_bake.c: Fix #29687: Normal bake from multires gives distorted results.

Sergey Sharybin sergey.vfx at gmail.com
Thu Dec 29 17:05:17 CET 2011


Revision: 42979
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=42979
Author:   nazgul
Date:     2011-12-29 16:05:09 +0000 (Thu, 29 Dec 2011)
Log Message:
-----------
Fix #29687: Normal bake from multires gives distorted results.

It is just a limitation of multires baker which doesn't deal correct with
baking to subdivision level 0. It was supposed to work with levels on which
sculpt data is affecting on mesh, so interpolation between grids works correct.

Fully accurate baking in this case will need raycasting stuff which will make
it much slower and will remove main benefit of regular baker -- speed and
low memory usage.
Another option would be to make multires apply sculpting data on level 0,
but it's not related at baking at all and has got it's own difficulties.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/object/object_bake.c

Modified: trunk/blender/source/blender/editors/object/object_bake.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_bake.c	2011-12-29 14:57:15 UTC (rev 42978)
+++ trunk/blender/source/blender/editors/object/object_bake.c	2011-12-29 16:05:09 UTC (rev 42979)
@@ -997,9 +997,7 @@
 	*lvl= mmd->lvl;
 
 	if(*lvl==0) {
-		DerivedMesh *tmp_dm= CDDM_from_mesh(me, ob);
-		dm= CDDM_copy(tmp_dm);
-		tmp_dm->release(tmp_dm);
+		return NULL;
 	} else {
 		MultiresModifierData tmp_mmd= *mmd;
 		DerivedMesh *cddm= CDDM_from_mesh(me, ob);
@@ -1059,6 +1057,7 @@
 {
 	Object *ob;
 	Scene *scene= CTX_data_scene(C);
+	int objects_baked= 0;
 
 	if(!multiresbake_check(C, op))
 		return OPERATOR_CANCELLED;
@@ -1089,6 +1088,10 @@
 
 		/* create low-resolution DM (to bake to) and hi-resolution DM (to bake from) */
 		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);
 
 		multiresbake_start(&bkr);
@@ -1097,9 +1100,14 @@
 
 		bkr.lores_dm->release(bkr.lores_dm);
 		bkr.hires_dm->release(bkr.hires_dm);
+
+		objects_baked++;
 	}
 	CTX_DATA_END;
 
+	if(!objects_baked)
+		BKE_report(op->reports, RPT_ERROR, "No objects found to bake from");
+
 	return OPERATOR_FINISHED;
 }
 
@@ -1117,13 +1125,21 @@
 
 	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->lores_dm = multiresbake_create_loresdm(scene, ob, &data->lvl);
+		data->lores_dm = lores_dm;
+		data->lvl = lvl;
 		data->hires_dm = multiresbake_create_hiresdm(scene, ob, &data->tot_lvl, &data->simple);
+
 		BLI_addtail(&bkj->data, data);
 	}
 	CTX_DATA_END;
@@ -1206,6 +1222,11 @@
 	bkr= MEM_callocN(sizeof(MultiresBakeJob), "MultiresBakeJob data");
 	init_multiresbake_job(C, bkr);
 
+	if(!bkr->data.first) {
+		BKE_report(op->reports, RPT_ERROR, "No objects found to bake from");
+		return OPERATOR_CANCELLED;
+	}
+
 	/* setup job */
 	steve= WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), scene, "Multires Bake", WM_JOB_EXCL_RENDER|WM_JOB_PRIORITY|WM_JOB_PROGRESS);
 	WM_jobs_customdata(steve, bkr, multiresbake_freejob);




More information about the Bf-blender-cvs mailing list