Fix T40582: issues with apply scale when having multires and scene simplify
authorSergey Sharybin <sergey.vfx@gmail.com>
Thu, 12 Jun 2014 07:49:46 +0000 (13:49 +0600)
committerSergey Sharybin <sergey.vfx@gmail.com>
Thu, 12 Jun 2014 07:49:46 +0000 (13:49 +0600)
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
source/blender/blenkernel/BKE_multires.h
source/blender/blenkernel/intern/multires.c
source/blender/modifiers/intern/MOD_multires.c

index 3b2bafa799f417fd1a730aa894e934da02c9452b..75616b9df78ba713f5977f5dc0003d7d58323317 100644 (file)
@@ -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;
 
 
index aa09fe1ce8df635ffe61f6495e61d27f0edca03c..11d81a149b1963d398cece92f8a28f21a6311feb 100644 (file)
@@ -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,
index 3d8e35699a98ae937d5788fc6c815fad03907dee..5fe2a56c01a542fac50fbebb42c55e2b81d0a8b5 100644 (file)
@@ -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)
index c95cd96757f2baee265119bacac6f7aad7d857d2..deae10b5bcb30347be35e8b5b23950c7c465e766 100644 (file)
@@ -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)