diff options
author | Campbell Barton <ideasman42@gmail.com> | 2013-09-12 14:41:00 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2013-09-12 14:41:00 +0400 |
commit | c9dfe7bd74a03886d4284985418619ccf5077ac3 (patch) | |
tree | 0cc3f49b5df73eff5c56fc2e220c1294cd25c6b9 | |
parent | 7bbb83893539211ba91cae98818b1238cf21bea7 (diff) |
more localized fix for [#36299], only changes behavior for subsurf with orco in editmode
-rw-r--r-- | source/blender/blenkernel/intern/DerivedMesh.c | 6 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/subsurf_ccg.c | 2 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_subsurf.c | 8 |
3 files changed, 7 insertions, 9 deletions
diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c index 5809e48e6cd..368c1e517ef 100644 --- a/source/blender/blenkernel/intern/DerivedMesh.c +++ b/source/blender/blenkernel/intern/DerivedMesh.c @@ -2086,14 +2086,10 @@ static void editbmesh_calc_modifiers(Scene *scene, Object *ob, BMEditMesh *em, D mask &= ~CD_MASK_ORCO; DM_set_only_copy(orcodm, mask | CD_MASK_ORIGINDEX); - /* disabled: subsurf can't calculate twice on the same editmesh (uses freed cache) [#36299] */ -#if 0 if (mti->applyModifierEM) { ndm = modwrap_applyModifierEM(md, ob, em, orcodm, MOD_APPLY_ORCO); } - else -#endif - { + else { ndm = modwrap_applyModifier(md, ob, orcodm, MOD_APPLY_ORCO); } ASSERT_IS_VALID_DM(ndm); diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c index d5761fa918e..2461ec85bb4 100644 --- a/source/blender/blenkernel/intern/subsurf_ccg.c +++ b/source/blender/blenkernel/intern/subsurf_ccg.c @@ -3573,6 +3573,8 @@ struct DerivedMesh *subsurf_make_derived_from_derived( int drawInteriorEdges = !(smd->flags & eSubsurfModifierFlag_ControlEdges); CCGDerivedMesh *result; + /* note: editmode calculation can only run once per + * modifier stack evaluation (uses freed cache) [#36299] */ if (flags & SUBSURF_FOR_EDIT_MODE) { int levels = (smd->modifier.scene) ? get_render_subsurf_level(&smd->modifier.scene->r, smd->levels) : smd->levels; diff --git a/source/blender/modifiers/intern/MOD_subsurf.c b/source/blender/modifiers/intern/MOD_subsurf.c index 98cea62a2ff..4e2656bbf00 100644 --- a/source/blender/modifiers/intern/MOD_subsurf.c +++ b/source/blender/modifiers/intern/MOD_subsurf.c @@ -121,14 +121,14 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, static DerivedMesh *applyModifierEM(ModifierData *md, Object *UNUSED(ob), struct BMEditMesh *UNUSED(editData), DerivedMesh *derivedData, - ModifierApplyFlag UNUSED(flag)) + ModifierApplyFlag flag) { SubsurfModifierData *smd = (SubsurfModifierData *) md; DerivedMesh *result; + /* 'orco' using editmode flags would cause cache to be used twice in editbmesh_calc_modifiers */ + SubsurfFlags ss_flags = (flag & MOD_APPLY_ORCO) ? 0 : (SUBSURF_FOR_EDIT_MODE | SUBSURF_IN_EDIT_MODE); - result = subsurf_make_derived_from_derived(derivedData, smd, - NULL, (SUBSURF_FOR_EDIT_MODE | - SUBSURF_IN_EDIT_MODE)); + result = subsurf_make_derived_from_derived(derivedData, smd, NULL, ss_flags); return result; } |