Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2011-12-29 20:05:09 +0400
committerSergey Sharybin <sergey.vfx@gmail.com>2011-12-29 20:05:09 +0400
commite61ffcffe9815b1373dc35af17958ca2c41c6184 (patch)
treefc8fbfd64dad8a146c11abd1347107c8e758bffa /source/blender/editors
parent8301cd1ce671c463084188b668ad2928bbfa4a4e (diff)
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.
Diffstat (limited to 'source/blender/editors')
-rw-r--r--source/blender/editors/object/object_bake.c29
1 files changed, 25 insertions, 4 deletions
diff --git a/source/blender/editors/object/object_bake.c b/source/blender/editors/object/object_bake.c
index d1d41af1e50..a02b90a1d16 100644
--- a/source/blender/editors/object/object_bake.c
+++ b/source/blender/editors/object/object_bake.c
@@ -997,9 +997,7 @@ static DerivedMesh *multiresbake_create_loresdm(Scene *scene, Object *ob, int *l
*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 @@ static int multiresbake_image_exec_locked(bContext *C, wmOperator *op)
{
Object *ob;
Scene *scene= CTX_data_scene(C);
+ int objects_baked= 0;
if(!multiresbake_check(C, op))
return OPERATOR_CANCELLED;
@@ -1089,6 +1088,10 @@ static int multiresbake_image_exec_locked(bContext *C, wmOperator *op)
/* 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 @@ static int multiresbake_image_exec_locked(bContext *C, wmOperator *op)
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 @@ static void init_multiresbake_job(bContext *C, MultiresBakeJob *bkj)
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 @@ static int multiresbake_image_exec(bContext *C, wmOperator *op)
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);