diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2018-06-27 17:34:26 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2018-06-27 17:35:06 +0300 |
commit | f55f2db6bd6f1fc25bdf9b8a04e8f5283137811c (patch) | |
tree | d8b636473250dc93f03f3a313de5e9b1a8801bb6 /source/blender/blenkernel/intern/multires.c | |
parent | 08b105654d1f3df1173696f0a212586d99ff5169 (diff) |
Fix T55644: Multires ignores render subdivision when simplified
We did not tell proper render/viewport context to subsurf derived mesh
created for multires.
Diffstat (limited to 'source/blender/blenkernel/intern/multires.c')
-rw-r--r-- | source/blender/blenkernel/intern/multires.c | 36 |
1 files changed, 23 insertions, 13 deletions
diff --git a/source/blender/blenkernel/intern/multires.c b/source/blender/blenkernel/intern/multires.c index 00a3e5c77d0..bead42aca0a 100644 --- a/source/blender/blenkernel/intern/multires.c +++ b/source/blender/blenkernel/intern/multires.c @@ -720,24 +720,33 @@ static DerivedMesh *multires_dm_create_local(Scene *scene, Object *ob, DerivedMe static DerivedMesh *subsurf_dm_create_local( Scene *scene, Object *ob, DerivedMesh *dm, - int lvl, int simple, int optimal, int plain_uv, int alloc_paint_mask) + int lvl, + bool is_simple, bool is_optimal, bool is_plain_uv, bool alloc_paint_mask, + bool for_render) { SubsurfModifierData smd = {{NULL}}; SubsurfFlags flags = 0; smd.levels = smd.renderLevels = lvl; - if (!plain_uv) + if (!is_plain_uv) { smd.flags |= eSubsurfModifierFlag_SubsurfUv; - if (simple) + } + if (is_simple) { smd.subdivType = ME_SIMPLE_SUBSURF; - if (optimal) + } + if (is_optimal) { smd.flags |= eSubsurfModifierFlag_ControlEdges; + } - if (ob->mode & OB_MODE_EDIT) + if (ob->mode & OB_MODE_EDIT) { flags |= SUBSURF_IN_EDIT_MODE; - - if (alloc_paint_mask) + } + if (alloc_paint_mask) { flags |= SUBSURF_ALLOC_PAINT_MASK; + } + if (for_render) { + flags |= SUBSURF_USE_RENDER_PARAMS; + } return subsurf_make_derived_from_derived(dm, &smd, scene, NULL, flags); } @@ -871,7 +880,7 @@ void multiresModifier_base_apply(MultiresModifierData *mmd, Scene *scene, Object /* subdivide the mesh to highest level without displacements */ cddm = CDDM_from_mesh(me); DM_set_only_copy(cddm, CD_MASK_BAREMESH); - origdm = subsurf_dm_create_local(scene, ob, cddm, totlvl, 0, 0, mmd->flags & eMultiresModifierFlag_PlainUv, 0); + origdm = subsurf_dm_create_local(scene, ob, cddm, totlvl, 0, 0, mmd->flags & eMultiresModifierFlag_PlainUv, 0, false); cddm->release(cddm); /* calc disps */ @@ -912,7 +921,7 @@ static void multires_subdivide( /* create subsurf DM from original mesh at high level */ cddm = CDDM_from_mesh(me); DM_set_only_copy(cddm, CD_MASK_BAREMESH); - highdm = subsurf_dm_create_local(scene, ob, cddm, totlvl, simple, 0, mmd->flags & eMultiresModifierFlag_PlainUv, has_mask); + highdm = subsurf_dm_create_local(scene, ob, cddm, totlvl, simple, 0, mmd->flags & eMultiresModifierFlag_PlainUv, has_mask, false); ss = ((CCGDerivedMesh *)highdm)->ss; /* create multires DM from original mesh at low level */ @@ -1233,7 +1242,7 @@ void multires_modifier_update_mdisps(struct DerivedMesh *dm, Scene *scene) else cddm = CDDM_from_mesh(me); DM_set_only_copy(cddm, CD_MASK_BAREMESH); - highdm = subsurf_dm_create_local(scene, ob, cddm, totlvl, mmd->simple, 0, mmd->flags & eMultiresModifierFlag_PlainUv, has_mask); + highdm = subsurf_dm_create_local(scene, ob, cddm, totlvl, mmd->simple, 0, mmd->flags & eMultiresModifierFlag_PlainUv, has_mask, false); ss = ((CCGDerivedMesh *)highdm)->ss; /* create multires DM from original mesh and displacements */ @@ -1295,7 +1304,7 @@ void multires_modifier_update_mdisps(struct DerivedMesh *dm, Scene *scene) else cddm = CDDM_from_mesh(me); DM_set_only_copy(cddm, CD_MASK_BAREMESH); - subdm = subsurf_dm_create_local(scene, ob, cddm, mmd->totlvl, mmd->simple, 0, mmd->flags & eMultiresModifierFlag_PlainUv, has_mask); + subdm = subsurf_dm_create_local(scene, ob, cddm, mmd->totlvl, mmd->simple, 0, mmd->flags & eMultiresModifierFlag_PlainUv, has_mask, false); cddm->release(cddm); multiresModifier_disp_run(dm, me, NULL, CALC_DISPLACEMENTS, subdm->getGridData(subdm), mmd->totlvl); @@ -1378,7 +1387,8 @@ DerivedMesh *multires_make_derived_from_derived(DerivedMesh *dm, result = subsurf_dm_create_local(scene, ob, dm, lvl, mmd->simple, mmd->flags & eMultiresModifierFlag_ControlEdges, mmd->flags & eMultiresModifierFlag_PlainUv, - flags & MULTIRES_ALLOC_PAINT_MASK); + flags & MULTIRES_ALLOC_PAINT_MASK, + render); if (!(flags & MULTIRES_USE_LOCAL_MMD)) { ccgdm = (CCGDerivedMesh *)result; @@ -2200,7 +2210,7 @@ static void multires_apply_smat(struct Depsgraph *depsgraph, Scene *scene, Objec MEM_freeN(vertCos); /* scaled ccgDM for tangent space of object with applied scale */ - dm = subsurf_dm_create_local(scene, ob, cddm, high_mmd.totlvl, high_mmd.simple, 0, mmd->flags & eMultiresModifierFlag_PlainUv, 0); + dm = subsurf_dm_create_local(scene, ob, cddm, high_mmd.totlvl, high_mmd.simple, 0, mmd->flags & eMultiresModifierFlag_PlainUv, 0, false); cddm->release(cddm); gridSize = dm->getGridSize(dm); |