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:
authorCampbell Barton <ideasman42@gmail.com>2013-09-12 14:41:00 +0400
committerCampbell Barton <ideasman42@gmail.com>2013-09-12 14:41:00 +0400
commitc9dfe7bd74a03886d4284985418619ccf5077ac3 (patch)
tree0cc3f49b5df73eff5c56fc2e220c1294cd25c6b9
parent7bbb83893539211ba91cae98818b1238cf21bea7 (diff)
more localized fix for [#36299], only changes behavior for subsurf with orco in editmode
-rw-r--r--source/blender/blenkernel/intern/DerivedMesh.c6
-rw-r--r--source/blender/blenkernel/intern/subsurf_ccg.c2
-rw-r--r--source/blender/modifiers/intern/MOD_subsurf.c8
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;
}