[Bf-blender-cvs] [20550d6] master: Fix T40582: issues with apply scale when having multires and scene simplify

Sergey Sharybin noreply at git.blender.org
Thu Jun 12 09:51:23 CEST 2014


Commit: 20550d6f7f33f2d1a2bcc043ae17b474bec85f66
Author: Sergey Sharybin
Date:   Thu Jun 12 13:49:46 2014 +0600
https://developer.blender.org/rB20550d6f7f33f2d1a2bcc043ae17b474bec85f66

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.

===================================================================

M	source/blender/blenkernel/BKE_modifier.h
M	source/blender/blenkernel/BKE_multires.h
M	source/blender/blenkernel/intern/multires.c
M	source/blender/modifiers/intern/MOD_multires.c

===================================================================

diff --git a/source/blender/blenkernel/BKE_modifier.h b/source/blender/blenkernel/BKE_modifier.h
index 3b2bafa..75616b9 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 aa09fe1..11d81a1 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 3d8e356..5fe2a56 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 c95cd96..deae10b 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)




More information about the Bf-blender-cvs mailing list