diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2011-12-29 20:05:09 +0400 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2011-12-29 20:05:09 +0400 |
commit | e61ffcffe9815b1373dc35af17958ca2c41c6184 (patch) | |
tree | fc8fbfd64dad8a146c11abd1347107c8e758bffa /source/blender/editors/object | |
parent | 8301cd1ce671c463084188b668ad2928bbfa4a4e (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/object')
-rw-r--r-- | source/blender/editors/object/object_bake.c | 29 |
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); |