[Bf-blender-cvs] [78597974dc9] derived: Cleanup: mesh_calc_modifiers refactoring.

Brecht Van Lommel noreply at git.blender.org
Thu Mar 28 02:28:53 CET 2019


Commit: 78597974dc989b75b1b4eccc546c60590980e00c
Author: Brecht Van Lommel
Date:   Wed Mar 27 23:52:41 2019 +0100
Branches: derived
https://developer.blender.org/rB78597974dc989b75b1b4eccc546c60590980e00c

Cleanup: mesh_calc_modifiers refactoring.

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

M	source/blender/blenkernel/intern/DerivedMesh.c

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

diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c
index 33450aeb2d4..2496ccb047e 100644
--- a/source/blender/blenkernel/intern/DerivedMesh.c
+++ b/source/blender/blenkernel/intern/DerivedMesh.c
@@ -991,7 +991,99 @@ static void mesh_copy_autosmooth(Mesh *me, Mesh *me_orig)
 	}
 }
 
-static void mesh_calc_modifiers(
+/* Test if modifier needs to be disabled in sculpt mode. */
+static bool mesh_modifier_sculpt_enabled(
+	Scene *scene,
+	Object *ob,
+	ModifierData *md,
+	const ModifierTypeInfo *mti,
+	bool multires_applied)
+{
+	const bool sculpt_mode = (ob->mode & OB_MODE_SCULPT) && ob->sculpt;
+	if (!sculpt_mode) {
+		return true;
+	}
+
+	MultiresModifierData *mmd = get_multires_modifier(scene, ob, 0);
+	const bool has_multires = (mmd && mmd->sculptlvl != 0);
+	const bool sculpt_dyntopo = ob->sculpt->bm;
+
+	if (!has_multires || multires_applied || sculpt_dyntopo)
+	{
+		if (md->type == eModifierType_Multires && ((MultiresModifierData *)md)->sculptlvl == 0) {
+			/* If multires is on level 0 skip it silently without warning message. */
+			if (!sculpt_dyntopo) {
+				return false;
+			}
+		}
+
+		bool unsupported = sculpt_dyntopo || multires_applied;
+
+		if (scene->toolsettings->sculpt->flags & SCULPT_ONLY_DEFORM)
+			unsupported |= (mti->type != eModifierTypeType_OnlyDeform);
+
+		if (unsupported) {
+			if (sculpt_dyntopo)
+				modifier_setError(md, "Not supported in dyntopo");
+			else
+				modifier_setError(md, "Not supported in sculpt mode");
+
+			return false;
+		}
+		else {
+			modifier_setError(md, "Hide, Mask and optimized display disabled");
+		}
+	}
+
+	return true;
+}
+
+static void mesh_modifiers_add_normals(
+	const Object *ob,
+	const CustomData_MeshMasks *dataMask,
+	Mesh *mesh_final)
+{
+	const bool do_loop_normals = ((((Mesh *)ob->data)->flag & ME_AUTOSMOOTH) != 0 ||
+	                              (dataMask->lmask & CD_MASK_NORMAL) != 0);
+	/* Some modifiers may need this info from their target (other) object, simpler to generate it here as well.
+	 * Note that they will always be generated when no loop normals are comptuted,
+	 * since they are needed by drawing code. */
+	const bool do_poly_normals = ((dataMask->pmask & CD_MASK_NORMAL) != 0);
+
+	if (do_loop_normals) {
+		/* In case we also need poly normals, add the layer here, then BKE_mesh_calc_normals_split() will fill it. */
+		if (do_poly_normals) {
+			if (!CustomData_has_layer(&mesh_final->pdata, CD_NORMAL)) {
+				CustomData_add_layer(&mesh_final->pdata, CD_NORMAL, CD_CALLOC, NULL, mesh_final->totpoly);
+			}
+		}
+		/* Compute loop normals (note: will compute poly and vert normals as well, if needed!) */
+		BKE_mesh_calc_normals_split(mesh_final);
+		BKE_mesh_tessface_clear(mesh_final);
+	}
+	else {
+		/* without this, drawing ngon tri's faces will show ugly tessellated face
+		 * normals and will also have to calculate normals on the fly, try avoid
+		 * this where possible since calculating polygon normals isn't fast,
+		 * note that this isn't a problem for subsurf (only quads) or editmode
+		 * which deals with drawing differently.
+		 *
+		 * Only calc vertex normals if they are flagged as dirty.
+		 * If using loop normals, poly nors have already been computed.
+		 */
+		/* TODO: if (sculpt_dyntopo == false)*/ {
+			BKE_mesh_ensure_normals_for_display(mesh_final);
+		}
+	}
+
+	/* Some modifiers, like datatransfer, may generate those data as temp layer, we do not want to keep them,
+	 * as they are used by display code when available (i.e. even if autosmooth is disabled). */
+	if (!do_loop_normals && CustomData_has_layer(&mesh_final->ldata, CD_NORMAL)) {
+		CustomData_free_layers(&mesh_final->ldata, CD_NORMAL, mesh_final->totloop);
+	}
+}
+
+static void mesh_modifiers_eval(
         struct Depsgraph *depsgraph,
         Scene *scene, Object *ob,
         int useDeform,
@@ -1003,38 +1095,22 @@ static void mesh_calc_modifiers(
         Mesh **r_deform,
         Mesh **r_final)
 {
-	ModifierData *firstmd, *md, *previewmd = NULL;
-	CDMaskLink *datamasks, *curr;
+	BLI_assert((((Mesh *)ob->data)->id.tag & LIB_TAG_COPIED_ON_WRITE_EVAL_RESULT) == 0);
+
 	/* XXX Always copying POLYINDEX, else tessellated data are no more valid! */
-	CustomData_MeshMasks mask, nextmask, previewmask = {0}, append_mask = CD_MASK_BAREMESH_ORIGINDEX;
+	CustomData_MeshMasks append_mask = CD_MASK_BAREMESH_ORIGINDEX;
 
-	float (*deformedVerts)[3] = NULL;
 	int numVerts = ((Mesh *)ob->data)->totvert;
 	const bool useRenderParams = (DEG_get_mode(depsgraph) == DAG_EVAL_RENDER);
 	const int required_mode = useRenderParams ? eModifierMode_Render : eModifierMode_Realtime;
-	bool isPrevDeform = false;
-	MultiresModifierData *mmd = get_multires_modifier(scene, ob, 0);
-	const bool has_multires = (mmd && mmd->sculptlvl != 0);
 	bool multires_applied = false;
-	const bool sculpt_mode = ob->mode & OB_MODE_SCULPT && ob->sculpt && !useRenderParams;
-	const bool sculpt_dyntopo = (sculpt_mode && ob->sculpt->bm)  && !useRenderParams;
 
 	/* Generic preview only in object mode! */
 	const bool do_mod_mcol = (ob->mode == OB_MODE_OBJECT);
-	const bool do_loop_normals = ((((Mesh *)ob->data)->flag & ME_AUTOSMOOTH) != 0 ||
-	                              (dataMask->lmask & CD_MASK_NORMAL) != 0);
-	/* Some modifiers may need this info from their target (other) object, simpler to generate it here as well.
-	 * Note that they will always be generated when no loop normals are comptuted,
-	 * since they are needed by drawing code. */
-	const bool do_poly_normals = ((dataMask->pmask & CD_MASK_NORMAL) != 0);
-
-	VirtualModifierData virtualModifierData;
 
 	ModifierApplyFlag app_flags = useRenderParams ? MOD_APPLY_RENDER : 0;
 	ModifierApplyFlag deform_app_flags = app_flags;
 
-	BLI_assert((((Mesh *)ob->data)->id.tag & LIB_TAG_COPIED_ON_WRITE_EVAL_RESULT) == 0);
-
 	if (useCache)
 		app_flags |= MOD_APPLY_USECACHE;
 	if (useDeform)
@@ -1046,10 +1122,14 @@ static void mesh_calc_modifiers(
 	const ModifierEvalContext mectx_apply = {depsgraph, ob, app_flags};
 	const ModifierEvalContext mectx_orco = {depsgraph, ob, (app_flags & ~MOD_APPLY_USECACHE) | MOD_APPLY_ORCO};
 
-	md = firstmd = modifiers_getVirtualModifierList(ob, &virtualModifierData);
-
 	modifiers_clearErrors(ob);
 
+	VirtualModifierData virtualModifierData;
+	ModifierData *md = modifiers_getVirtualModifierList(ob, &virtualModifierData);
+	ModifierData *firstmd = md;
+
+	ModifierData *previewmd = NULL;
+	CustomData_MeshMasks previewmask = {0};
 	if (do_mod_mcol) {
 		/* Find the last active modifier generating a preview, or NULL if none. */
 		/* XXX Currently, DPaint modifier just ignores this.
@@ -1058,8 +1138,8 @@ static void mesh_calc_modifiers(
 		previewmd = modifiers_getLastPreview(scene, md, required_mode);
 	}
 
-	datamasks = modifiers_calcDataMasks(scene, ob, md, dataMask, required_mode, previewmd, &previewmask);
-	curr = datamasks;
+	CDMaskLink *datamasks = modifiers_calcDataMasks(scene, ob, md, dataMask, required_mode, previewmd, &previewmask);
+	CDMaskLink *curr = datamasks;
 
 	if (r_deform) {
 		*r_deform = NULL;
@@ -1070,6 +1150,8 @@ static void mesh_calc_modifiers(
 	 * e.g. access to updated normals. See T62633 for an example. */
 	Mesh *me = NULL;
 
+	float (*deformedVerts)[3] = NULL;
+	bool isPrevDeform = false;
 	if (useDeform) {
 		/* Apply all leading deforming modifiers */
 		for (; md; md = md->next, curr = curr->next) {
@@ -1079,11 +1161,17 @@ static void mesh_calc_modifiers(
 				continue;
 			}
 
+			if (!useRenderParams) {
+				if (!mesh_modifier_sculpt_enabled(scene, ob, md, mti, multires_applied)) {
+					continue;
+				}
+			}
+
 			if (useDeform < 0 && mti->dependsOnTime && mti->dependsOnTime(md)) {
 				continue;
 			}
 
-			if (mti->type == eModifierTypeType_OnlyDeform && !sculpt_dyntopo) {
+			if (mti->type == eModifierTypeType_OnlyDeform) {
 				if (!deformedVerts) {
 					deformedVerts = BKE_mesh_vertexCos_get(ob->data, &numVerts);
 				}
@@ -1121,11 +1209,6 @@ static void mesh_calc_modifiers(
 			}
 		}
 	}
-	else {
-		/* default behavior for meshes */
-		deformedVerts = BKE_mesh_vertexCos_get(ob->data, &numVerts);
-	}
-
 
 	/* Now apply all remaining modifiers. If useDeform is off then skip
 	 * OnlyDeform ones.
@@ -1149,36 +1232,10 @@ static void mesh_calc_modifiers(
 			continue;
 		}
 
-		if (sculpt_mode &&
-		    (!has_multires || multires_applied || sculpt_dyntopo))
-		{
-			bool unsupported = false;
-
-			if (md->type == eModifierType_Multires && ((MultiresModifierData *)md)->sculptlvl == 0) {
-				/* If multires is on level 0 skip it silently without warning message. */
-				if (!sculpt_dyntopo) {
-					continue;
-				}
-			}
-
-			if (sculpt_dyntopo && !useRenderParams)
-				unsupported = true;
-
-			if (scene->toolsettings->sculpt->flags & SCULPT_ONLY_DEFORM)
-				unsupported |= (mti->type != eModifierTypeType_OnlyDeform);
-
-			unsupported |= multires_applied;
-
-			if (unsupported) {
-				if (sculpt_dyntopo)
-					modifier_setError(md, "Not supported in dyntopo");
-				else
-					modifier_setError(md, "Not supported in sculpt mode");
+		if (!useRenderParams) {
+			if (!mesh_modifier_sculpt_enabled(scene, ob, md, mti, multires_applied)) {
 				continue;
 			}
-			else {
-				modifier_setError(md, "Hide, Mask and optimized display disabled");
-			}
 		}
 
 		if (need_mapping && !modifier_supportsMapping(md)) {
@@ -1190,6 +1247,7 @@ static void mesh_calc_modifiers(
 		}
 
 		/* add an orco layer if needed by this modifier */
+		CustomData_MeshMasks mask;
 		memset(&mask, 0, sizeof(mask));
 		if (mti->requiredDataMask) {
 			mti->requiredDataMask(ob, md, &mask);
@@ -1232,6 +1290,7 @@ static void mesh_calc_modifiers(
 		}
 		else {
 			/* determine which data layers are needed by following modifiers */
+			CustomData_MeshMasks nextmask;
 			if (curr->next)
 				nextmask = curr->next->mask;
 			else
@@ -1390,7 +1449,7 @@ static void mesh_calc_modifiers(
 		if ((index != -1) && (BLI_findindex(&ob->modifiers, md) >= index))
 			break;
 
-		if (sculpt_mode && md->type == eModifierType_Multires) {
+		if (md->type == eModifierType_Multires) {
 			multires_applied = true;
 		}
 	}
@@ -1425,39 +1484,6 @@ static void mesh_calc_modifiers(
 			add_orco_mesh(ob, NULL, *r_de

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list