From 20550d6f7f33f2d1a2bcc043ae17b474bec85f66 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Thu, 12 Jun 2014 13:49:46 +0600 Subject: Fix T40582: issues with apply scale when having multires and scene simplify Reshape and applying scale matrix on multires needs to create DM with simplify setting disabled. Added a special flag to modifier apply for this now. --- source/blender/blenkernel/BKE_modifier.h | 5 ++++- source/blender/blenkernel/BKE_multires.h | 3 ++- source/blender/blenkernel/intern/multires.c | 15 ++++++++++----- source/blender/modifiers/intern/MOD_multires.c | 6 +++++- 4 files changed, 21 insertions(+), 8 deletions(-) (limited to 'source') diff --git a/source/blender/blenkernel/BKE_modifier.h b/source/blender/blenkernel/BKE_modifier.h index 3b2bafa799f..75616b9df78 100644 --- a/source/blender/blenkernel/BKE_modifier.h +++ b/source/blender/blenkernel/BKE_modifier.h @@ -111,7 +111,10 @@ typedef enum ModifierApplyFlag { MOD_APPLY_RENDER = 1 << 0, /* Render time. */ MOD_APPLY_USECACHE = 1 << 1, /* Result of evaluation will be cached, so modifier might * want to cache data for quick updates (used by subsurf) */ - MOD_APPLY_ORCO = 1 << 2 /* Modifier evaluated for undeformed texture coordinates */ + MOD_APPLY_ORCO = 1 << 2, /* Modifier evaluated for undeformed texture coordinates */ + MOD_APPLY_IGNORE_SIMPLIFY = 1 << 3, /* Ignore scene simplification flag and use subdivisions + * level set in multires modifier. + */ } ModifierApplyFlag; diff --git a/source/blender/blenkernel/BKE_multires.h b/source/blender/blenkernel/BKE_multires.h index aa09fe1ce8d..11d81a149b1 100644 --- a/source/blender/blenkernel/BKE_multires.h +++ b/source/blender/blenkernel/BKE_multires.h @@ -65,7 +65,8 @@ void multiresModifier_set_levels_from_disps(struct MultiresModifierData *mmd, st typedef enum { MULTIRES_USE_LOCAL_MMD = 1, MULTIRES_USE_RENDER_PARAMS = 2, - MULTIRES_ALLOC_PAINT_MASK = 4 + MULTIRES_ALLOC_PAINT_MASK = 4, + MULTIRES_IGNORE_SIMPLIFY = 8 } MultiresFlags; struct DerivedMesh *multires_make_derived_from_derived(struct DerivedMesh *dm, diff --git a/source/blender/blenkernel/intern/multires.c b/source/blender/blenkernel/intern/multires.c index 3d8e35699a9..5fe2a56c01a 100644 --- a/source/blender/blenkernel/intern/multires.c +++ b/source/blender/blenkernel/intern/multires.c @@ -286,7 +286,7 @@ DerivedMesh *get_multires_dm(Scene *scene, MultiresModifierData *mmd, Object *ob DerivedMesh *tdm = mesh_get_derived_deform(scene, ob, CD_MASK_BAREMESH); DerivedMesh *dm; - dm = mti->applyModifier(md, ob, tdm, MOD_APPLY_USECACHE); + dm = mti->applyModifier(md, ob, tdm, MOD_APPLY_USECACHE | MOD_APPLY_IGNORE_SIMPLIFY); if (dm == tdm) { dm = CDDM_copy(tdm); } @@ -338,12 +338,15 @@ MultiresModifierData *get_multires_modifier(Scene *scene, Object *ob, bool use_f return mmd; } -static int multires_get_level(Object *ob, MultiresModifierData *mmd, int render) +static int multires_get_level(Object *ob, MultiresModifierData *mmd, + bool render, bool ignore_simplify) { if (render) return (mmd->modifier.scene) ? get_render_subsurf_level(&mmd->modifier.scene->r, mmd->renderlvl) : mmd->renderlvl; else if (ob->mode == OB_MODE_SCULPT) return mmd->sculptlvl; + else if (ignore_simplify) + return mmd->lvl; else return (mmd->modifier.scene) ? get_render_subsurf_level(&mmd->modifier.scene->r, mmd->lvl) : mmd->lvl; } @@ -433,7 +436,7 @@ int multiresModifier_reshapeFromDeformMod(Scene *scene, MultiresModifierData *mm int numVerts, result; float (*deformedVerts)[3]; - if (multires_get_level(ob, mmd, 0) == 0) + if (multires_get_level(ob, mmd, false, true) == 0) return 0; /* Create DerivedMesh for deformation modifier */ @@ -682,7 +685,7 @@ static void multires_del_higher(MultiresModifierData *mmd, Object *ob, int lvl) void multiresModifier_del_levels(MultiresModifierData *mmd, Object *ob, int direction) { Mesh *me = BKE_mesh_from_object(ob); - int lvl = multires_get_level(ob, mmd, 0); + int lvl = multires_get_level(ob, mmd, false, true); int levels = mmd->totlvl - lvl; MDisps *mdisps; @@ -1431,7 +1434,9 @@ DerivedMesh *multires_make_derived_from_derived(DerivedMesh *dm, CCGDerivedMesh *ccgdm = NULL; CCGElem **gridData, **subGridData; CCGKey key; - int lvl = multires_get_level(ob, mmd, (flags & MULTIRES_USE_RENDER_PARAMS)); + const bool render = (flags & MULTIRES_USE_RENDER_PARAMS) != 0; + const bool ignore_simplify = (flags & MULTIRES_IGNORE_SIMPLIFY) != 0; + int lvl = multires_get_level(ob, mmd, render, ignore_simplify); int i, gridSize, numGrids; if (lvl == 0) diff --git a/source/blender/modifiers/intern/MOD_multires.c b/source/blender/modifiers/intern/MOD_multires.c index c95cd96757f..deae10b5bcb 100644 --- a/source/blender/modifiers/intern/MOD_multires.c +++ b/source/blender/modifiers/intern/MOD_multires.c @@ -74,7 +74,8 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *dm, MultiresModifierData *mmd = (MultiresModifierData *)md; DerivedMesh *result; Mesh *me = (Mesh *)ob->data; - const int useRenderParams = flag & MOD_APPLY_RENDER; + const bool useRenderParams = (flag & MOD_APPLY_RENDER) != 0; + const bool ignore_simplify = (flag & MOD_APPLY_IGNORE_SIMPLIFY) != 0; MultiresFlags flags = 0; const bool has_mask = CustomData_has_layer(&me->ldata, CD_GRID_PAINT_MASK); @@ -91,6 +92,9 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *dm, if (useRenderParams) flags |= MULTIRES_USE_RENDER_PARAMS; + if (ignore_simplify) + flags |= MULTIRES_IGNORE_SIMPLIFY; + result = multires_make_derived_from_derived(dm, mmd, ob, flags); if (result == dm) -- cgit v1.2.3