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.
This commit is contained in:
@@ -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;
|
||||
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user