[Bf-blender-cvs] [20fbe6bca80] blender2.8: Modifier: move edit-mesh calculation from DerivedMesh to Mesh

Campbell Barton noreply at git.blender.org
Tue Oct 9 06:13:35 CEST 2018


Commit: 20fbe6bca808d7c5aaf7a07c6cd66c78cbaa016c
Author: Campbell Barton
Date:   Tue Oct 9 15:04:51 2018 +1100
Branches: blender2.8
https://developer.blender.org/rB20fbe6bca808d7c5aaf7a07c6cd66c78cbaa016c

Modifier: move edit-mesh calculation from DerivedMesh to Mesh

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

M	source/blender/blenkernel/BKE_DerivedMesh.h
M	source/blender/blenkernel/intern/DerivedMesh.c
M	source/blender/blenkernel/intern/crazyspace.c

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

diff --git a/source/blender/blenkernel/BKE_DerivedMesh.h b/source/blender/blenkernel/BKE_DerivedMesh.h
index 0b0030ec101..a8e6558c533 100644
--- a/source/blender/blenkernel/BKE_DerivedMesh.h
+++ b/source/blender/blenkernel/BKE_DerivedMesh.h
@@ -554,7 +554,7 @@ DerivedMesh *editbmesh_get_derived_cage_and_final(
 DerivedMesh *object_get_derived_final(struct Object *ob, const bool for_render);
 
 float (*editbmesh_get_vertex_cos(struct BMEditMesh *em, int *r_numVerts))[3];
-bool editbmesh_modifier_is_enabled(struct Scene *scene, struct ModifierData *md, DerivedMesh *dm);
+bool editbmesh_modifier_is_enabled(struct Scene *scene, struct ModifierData *md, bool has_prev_mesh);
 void makeDerivedMesh(
         struct Depsgraph *depsgraph, struct Scene *scene, struct Object *ob, struct BMEditMesh *em,
         CustomDataMask dataMask, const bool build_shapekey_layers);
diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c
index e4c2c935a33..208803a8de9 100644
--- a/source/blender/blenkernel/intern/DerivedMesh.c
+++ b/source/blender/blenkernel/intern/DerivedMesh.c
@@ -463,12 +463,6 @@ void DM_ensure_normals(DerivedMesh *dm)
 	BLI_assert((dm->dirty & DM_DIRTY_NORMALS) == 0);
 }
 
-static void DM_calc_loop_normals(DerivedMesh *dm, const bool use_split_normals, float split_angle)
-{
-	dm->calcLoopNormals(dm, use_split_normals, split_angle);
-	dm->dirty |= DM_DIRTY_TESS_CDLAYERS;
-}
-
 /* note: until all modifiers can take MPoly's as input,
  * use this at the start of modifiers  */
 void DM_ensure_tessface(DerivedMesh *dm)
@@ -1169,7 +1163,7 @@ static float (*get_editbmesh_orco_verts(BMEditMesh *em))[3]
 }
 
 /* orco custom data layer */
-static float (*get_orco_coords_dm(Object *ob, BMEditMesh *em, int layer, int *free))[3]
+static float (*get_orco_coords(Object *ob, BMEditMesh *em, int layer, int *free))[3]
 {
 	*free = 0;
 
@@ -1200,29 +1194,6 @@ static float (*get_orco_coords_dm(Object *ob, BMEditMesh *em, int layer, int *fr
 	return NULL;
 }
 
-static DerivedMesh *create_orco_dm(Object *ob, Mesh *me, BMEditMesh *em, int layer)
-{
-	DerivedMesh *dm;
-	float (*orco)[3];
-	int free;
-
-	if (em) {
-		dm = CDDM_from_editbmesh(em, false, false);
-	}
-	else {
-		dm = CDDM_from_mesh(me);
-	}
-
-	orco = get_orco_coords_dm(ob, em, layer, &free);
-
-	if (orco) {
-		CDDM_apply_vert_coords(dm, orco);
-		if (free) MEM_freeN(orco);
-	}
-
-	return dm;
-}
-
 static Mesh *create_orco_mesh(Object *ob, Mesh *me, BMEditMesh *em, int layer)
 {
 	Mesh *mesh;
@@ -1236,7 +1207,7 @@ static Mesh *create_orco_mesh(Object *ob, Mesh *me, BMEditMesh *em, int layer)
 		mesh = BKE_mesh_copy_for_eval(me, true);
 	}
 
-	orco = get_orco_coords_dm(ob, em, layer, &free);
+	orco = get_orco_coords(ob, em, layer, &free);
 
 	if (orco) {
 		BKE_mesh_apply_vert_coords(mesh, orco);
@@ -1246,44 +1217,6 @@ static Mesh *create_orco_mesh(Object *ob, Mesh *me, BMEditMesh *em, int layer)
 	return mesh;
 }
 
-static void add_orco_dm(
-        Object *ob, BMEditMesh *em, DerivedMesh *dm,
-        DerivedMesh *orcodm, int layer)
-{
-	float (*orco)[3], (*layerorco)[3];
-	int totvert, free;
-
-	totvert = dm->getNumVerts(dm);
-
-	if (orcodm) {
-		orco = MEM_calloc_arrayN(totvert, sizeof(float[3]), "dm orco");
-		free = 1;
-
-		if (orcodm->getNumVerts(orcodm) == totvert)
-			orcodm->getVertCos(orcodm, orco);
-		else
-			dm->getVertCos(dm, orco);
-	}
-	else {
-		/* TODO(sybren): totvert should potentially change here, as ob->data
-		 * or em may have a different number of vertices than dm. */
-		orco = get_orco_coords_dm(ob, em, layer, &free);
-	}
-
-	if (orco) {
-		if (layer == CD_ORCO)
-			BKE_mesh_orco_verts_transform(ob->data, orco, totvert, 0);
-
-		if (!(layerorco = DM_get_vert_data_layer(dm, layer))) {
-			DM_add_vert_layer(dm, layer, CD_CALLOC, NULL);
-			layerorco = DM_get_vert_data_layer(dm, layer);
-		}
-
-		memcpy(layerorco, orco, sizeof(float) * 3 * totvert);
-		if (free) MEM_freeN(orco);
-	}
-}
-
 static void add_orco_mesh(
         Object *ob, BMEditMesh *em, Mesh *mesh,
         Mesh *orco_mesh, int layer)
@@ -1306,7 +1239,7 @@ static void add_orco_mesh(
 	else {
 		/* TODO(sybren): totvert should potentially change here, as ob->data
 		 * or em may have a different number of vertices than dm. */
-		orco = get_orco_coords_dm(ob, em, layer, &free);
+		orco = get_orco_coords(ob, em, layer, &free);
 	}
 
 	if (orco) {
@@ -1326,7 +1259,7 @@ static void add_orco_mesh(
 	}
 }
 
-static void DM_update_statvis_color(const Scene *scene, Object *ob, DerivedMesh *dm)
+static void UNUSED_FUNCTION(DM_update_statvis_color)(const Scene *scene, Object *ob, DerivedMesh *dm)
 {
 	BMEditMesh *em = BKE_editmesh_from_object(ob);
 
@@ -1433,21 +1366,6 @@ static void UNUSED_FUNCTION(add_shapekey_layers)(DerivedMesh *dm, Mesh *me, Obje
  *
  * \note tessfaces should already be calculated.
  */
-static void dm_ensure_display_normals(DerivedMesh *dm)
-{
-	/* Note: dm *may* have a poly CD_NORMAL layer (generated by a modifier needing poly normals e.g.).
-	 *       We do not use it here, though. And it should be tagged as temp!
-	 */
-	/* BLI_assert((CustomData_has_layer(&dm->polyData, CD_NORMAL) == false)); */
-
-	if ((dm->type == DM_TYPE_CDDM) &&
-	    ((dm->dirty & DM_DIRTY_NORMALS) || CustomData_has_layer(&dm->polyData, CD_NORMAL) == false))
-	{
-		/* if normals are dirty we want to calculate vertex normals too */
-		CDDM_calc_normals_mapping_ex(dm, (dm->dirty & DM_DIRTY_NORMALS) ? false : true);
-	}
-}
-
 static void mesh_ensure_display_normals(Mesh *mesh)
 {
 	/* Note: mesh *may* have a poly CD_NORMAL layer (generated by a modifier needing poly normals e.g.).
@@ -1979,7 +1897,7 @@ float (*editbmesh_get_vertex_cos(BMEditMesh *em, int *r_numVerts))[3]
 	return cos;
 }
 
-bool editbmesh_modifier_is_enabled(Scene *scene, ModifierData *md, DerivedMesh *dm)
+bool editbmesh_modifier_is_enabled(Scene *scene, ModifierData *md, bool has_prev_mesh)
 {
 	const ModifierTypeInfo *mti = modifierType_getInfo(md->type);
 	const int required_mode = eModifierMode_Realtime | eModifierMode_Editmode;
@@ -1988,7 +1906,7 @@ bool editbmesh_modifier_is_enabled(Scene *scene, ModifierData *md, DerivedMesh *
 		return false;
 	}
 
-	if ((mti->flags & eModifierTypeFlag_RequiresOriginalData) && dm) {
+	if ((mti->flags & eModifierTypeFlag_RequiresOriginalData) && has_prev_mesh) {
 		modifier_setError(md, "Modifier requires original data, bad stack position");
 		return false;
 	}
@@ -1996,21 +1914,42 @@ bool editbmesh_modifier_is_enabled(Scene *scene, ModifierData *md, DerivedMesh *
 	return true;
 }
 
+
+/* TODO(campbell): support mesh with only an edit-mesh which is lazy initialized. */
+static Mesh *mesh_from_editmesh_with_coords(
+        BMEditMesh *em, CustomDataMask data_mask, float (*vertexCos)[3])
+{
+	Mesh *me = BKE_bmesh_to_mesh_nomain(
+	        em->bm,
+	        &(struct BMeshToMeshParams){
+	            .cd_mask_extra = data_mask,
+	        });
+	if (vertexCos) {
+		/* We will own this array in the future. */
+		BKE_mesh_apply_vert_coords(me, vertexCos);
+		MEM_freeN(vertexCos);
+	}
+	return me;
+}
+
 static void editbmesh_calc_modifiers(
         struct Depsgraph *depsgraph, Scene *scene, Object *ob,
         BMEditMesh *em, CustomDataMask dataMask,
         /* return args */
-        DerivedMesh **r_cage, DerivedMesh **r_final)
+        Mesh **r_cage, Mesh **r_final)
 {
 	ModifierData *md;
 	float (*deformedVerts)[3] = NULL;
 	CustomDataMask mask = 0, append_mask = 0;
-	DerivedMesh *dm = NULL, *orcodm = NULL;
+	Mesh *me = NULL;
+	Mesh *me_orco = NULL;
 	int i, numVerts = 0, cageIndex = modifiers_getCageIndex(scene, ob, NULL, 1);
 	CDMaskLink *datamasks, *curr;
 	const int required_mode = eModifierMode_Realtime | eModifierMode_Editmode;
 
+#if 0
 	const bool do_init_statvis = false;
+#endif
 	VirtualModifierData virtualModifierData;
 
 	/* TODO(sybren): do we really need multiple objects, or shall we change the flags where needed? */
@@ -2019,12 +1958,11 @@ static void editbmesh_calc_modifiers(
 	const ModifierEvalContext mectx_cache = {depsgraph, ob, MOD_APPLY_USECACHE};
 
 	const bool do_loop_normals = (((Mesh *)(ob->data))->flag & ME_AUTOSMOOTH) != 0;
-	const float loop_normals_split_angle = ((Mesh *)(ob->data))->smoothresh;
 
 	modifiers_clearErrors(ob);
 
 	if (r_cage && cageIndex == -1) {
-		*r_cage = getEditDerivedBMesh(em, ob, dataMask, NULL);
+		*r_cage = mesh_from_editmesh_with_coords(em, dataMask, NULL);
 	}
 
 	md = modifiers_getVirtualModifierList(ob, &virtualModifierData);
@@ -2036,15 +1974,16 @@ static void editbmesh_calc_modifiers(
 	for (i = 0; md; i++, md = md->next, curr = curr->next) {
 		const ModifierTypeInfo *mti = modifierType_getInfo(md->type);
 
-		if (!editbmesh_modifier_is_enabled(scene, md, dm)) {
+		if (!editbmesh_modifier_is_enabled(scene, md, me != NULL)) {
 			continue;
 		}
 
 		/* add an orco layer if needed by this modifier */
-		if (dm && mti->requiredDataMask) {
+		if (me && mti->requiredDataMask) {
 			mask = mti->requiredDataMask(ob, md);
-			if (mask & CD_MASK_ORCO)
-				add_orco_dm(ob, em, dm, orcodm, CD_ORCO);
+			if (mask & CD_MASK_ORCO) {
+				add_orco_mesh(ob, em, me, me_orco, CD_ORCO);
+			}
 		}
 
 		/* How to apply modifier depends on (a) what we already have as
@@ -2055,15 +1994,12 @@ static void editbmesh_calc_modifiers(
 		if (mti->type == eModifierTypeType_OnlyDeform) {
 			/* No existing verts to deform, need to build them. */
 			if (!deformedVerts) {
-				if (dm) {
+				if (me) {
 					/* Deforming a derived mesh, read the vertex locations
 					 * out of the mesh and deform them. Once done with this
 					 * run of deformers verts will be written back.
 					 */
-					numVerts = dm->getNumVerts(dm);
-					deformedVerts =
-					    MEM_malloc_arrayN(numVerts, sizeof(*deformedVerts), "dfmv");
-					dm->getVertCos(dm, deformedVerts);
+					deformedVerts = BKE_mesh_vertexCos_get(me, &numVerts);
 				}
 				else {
 					deformedVerts = editbmesh_get_vertex_cos(em, &numVerts);
@@ -2071,60 +2007,63 @@ static void editbmesh_calc_modifiers(
 			}
 
 			if (mti->deformVertsEM)
-				modwrap_deformVertsEM_DM_deprecated(md, &mectx, em, dm, deformedVerts, numVerts);
+				modwrap_deformVertsEM(md, &mectx, em, me, deformedVerts, numVerts);

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list