[Bf-blender-cvs] [1c0be0e90fb] blender2.8: Ported Mesh Deform modifier

Sybren A. Stüvel noreply at git.blender.org
Tue May 8 11:47:57 CEST 2018


Commit: 1c0be0e90fb17775ca4fdbe91cc0fb377dd446d7
Author: Sybren A. Stüvel
Date:   Tue May 8 11:33:31 2018 +0200
Branches: blender2.8
https://developer.blender.org/rB1c0be0e90fb17775ca4fdbe91cc0fb377dd446d7

Ported Mesh Deform modifier

This modifier still has issues that are not related to this port:

- While editing the deformation mesh, the deformed mesh doesn't update.
  This update only happens after exiting edit mode, making editing
  cumbersome.
- Binding doesn't work yet. It works fine when binding in master and
  loading pre-bound in 2.8. This was also an issue before this port, and
  will be investigated separately.

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

M	source/blender/blenkernel/BKE_mesh.h
M	source/blender/blenkernel/intern/mesh.c
M	source/blender/editors/armature/meshlaplacian.c
M	source/blender/editors/include/ED_armature.h
M	source/blender/makesdna/DNA_modifier_types.h
M	source/blender/modifiers/intern/MOD_meshdeform.c
M	source/blender/modifiers/intern/MOD_util.c
M	source/blender/modifiers/intern/MOD_util.h

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

diff --git a/source/blender/blenkernel/BKE_mesh.h b/source/blender/blenkernel/BKE_mesh.h
index 2adc1dbb6e3..6e10bc71cb5 100644
--- a/source/blender/blenkernel/BKE_mesh.h
+++ b/source/blender/blenkernel/BKE_mesh.h
@@ -102,11 +102,15 @@ void BKE_mesh_update_customdata_pointers(struct Mesh *me, const bool do_ensure_t
 void BKE_mesh_ensure_skin_customdata(struct Mesh *me);
 
 struct Mesh *BKE_mesh_new_nomain(int numVerts, int numEdges, int numTessFaces,int numLoops, int numPolys);
-struct Mesh * BKE_mesh_from_template(
+struct Mesh *BKE_mesh_from_template(
         const struct Mesh *me_src,
         int numVerts, int numEdges, int numTessFaces,
         int numLoops, int numPolys);
 
+/* These functions construct a new Mesh, contrary to BKE_mesh_from_nurbs which modifies ob itself. */
+struct Mesh *BKE_new_mesh_nomain_from_curve(struct Object *ob);
+struct Mesh *BKE_new_mesh_nomain_from_curve_displist(struct Object *ob, struct ListBase *dispbase);
+
 bool BKE_mesh_ensure_edit_data(struct Mesh *me);
 bool BKE_mesh_clear_edit_data(struct Mesh *me);
 
@@ -182,6 +186,8 @@ int  BKE_mesh_mselect_find(struct Mesh *me, int index, int type);
 int  BKE_mesh_mselect_active_get(struct Mesh *me, int type);
 void BKE_mesh_mselect_active_set(struct Mesh *me, int index, int type);
 
+void BKE_mesh_apply_vert_coords(struct Mesh *mesh, float (*vertCoords)[3]);
+
 /* *** mesh_runtime.c *** */
 
 void BKE_mesh_runtime_recalc_looptri(struct Mesh *mesh);
diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c
index cece1a7c4c6..25e8405f69d 100644
--- a/source/blender/blenkernel/intern/mesh.c
+++ b/source/blender/blenkernel/intern/mesh.c
@@ -1497,6 +1497,58 @@ int BKE_mesh_nurbs_displist_to_mdata(
 	return 0;
 }
 
+Mesh *BKE_new_mesh_nomain_from_curve_displist(Object *ob, ListBase *dispbase)
+{
+	Curve *cu = ob->data;
+	Mesh *mesh;
+	MVert *allvert;
+	MEdge *alledge;
+	MLoop *allloop;
+	MPoly *allpoly;
+	MLoopUV *alluv = NULL;
+	int totvert, totedge, totloop, totpoly;
+	bool use_orco_uv = (cu->flag & CU_UV_ORCO) != 0;
+
+	if (BKE_mesh_nurbs_displist_to_mdata(
+	        ob, dispbase, &allvert, &totvert, &alledge,
+	        &totedge, &allloop, &allpoly, (use_orco_uv) ? &alluv : NULL,
+	        &totloop, &totpoly) != 0)
+	{
+		/* Error initializing mdata. This often happens when curve is empty */
+		return BKE_mesh_new_nomain(0, 0, 0, 0, 0);
+	}
+
+	mesh = BKE_mesh_new_nomain(totvert, totedge, 0, totloop, totpoly);
+	mesh->runtime.cd_dirty_vert |= CD_MASK_NORMAL;
+
+	memcpy(mesh->mvert, allvert, totvert * sizeof(MVert));
+	memcpy(mesh->medge, alledge, totedge * sizeof(MEdge));
+	memcpy(mesh->mloop, allloop, totloop * sizeof(MLoop));
+	memcpy(mesh->mpoly, allpoly, totpoly * sizeof(MPoly));
+
+	if (alluv) {
+		const char *uvname = "Orco";
+		CustomData_add_layer_named(&mesh->ldata, CD_MLOOPUV, CD_ASSIGN, alluv, totloop, uvname);
+	}
+
+	MEM_freeN(allvert);
+	MEM_freeN(alledge);
+	MEM_freeN(allloop);
+	MEM_freeN(allpoly);
+
+	return mesh;
+}
+
+Mesh *BKE_new_mesh_nomain_from_curve(Object *ob)
+{
+	ListBase disp = {NULL, NULL};
+
+	if (ob->curve_cache) {
+		disp = ob->curve_cache->disp;
+	}
+
+	return BKE_new_mesh_nomain_from_curve_displist(ob, &disp);
+}
 
 /* this may fail replacing ob->data, be sure to check ob->type */
 void BKE_mesh_from_nurbs_displist(Object *ob, ListBase *dispbase, const bool use_orco_uv, const char *obdata_name)
@@ -2226,6 +2278,22 @@ void BKE_mesh_mselect_active_set(Mesh *me, int index, int type)
 	           (me->mselect[me->totselect - 1].type  == type));
 }
 
+
+void BKE_mesh_apply_vert_coords(Mesh *mesh, float (*vertCoords)[3])
+{
+	MVert *vert;
+	int i;
+
+	/* this will just return the pointer if it wasn't a referenced layer */
+	vert = CustomData_duplicate_referenced_layer(&mesh->vdata, CD_MVERT, mesh->totvert);
+	mesh->mvert = vert;
+
+	for (i = 0; i < mesh->totvert; ++i, ++vert)
+		copy_v3_v3(vert->co, vertCoords[i]);
+
+	mesh->runtime.cd_dirty_vert |= CD_MASK_NORMAL;
+}
+
 /**
  * Compute 'split' (aka loop, or per face corner's) normals.
  *
@@ -2781,7 +2849,6 @@ Mesh *BKE_mesh_new_from_object(
 	return tmpmesh;
 }
 
-
 /* **** Depsgraph evaluation **** */
 
 void BKE_mesh_eval_geometry(Depsgraph *depsgraph,
diff --git a/source/blender/editors/armature/meshlaplacian.c b/source/blender/editors/armature/meshlaplacian.c
index eaae7dacbba..5503a4880df 100644
--- a/source/blender/editors/armature/meshlaplacian.c
+++ b/source/blender/editors/armature/meshlaplacian.c
@@ -833,7 +833,7 @@ typedef struct MeshDeformBind {
 	int size, size3;
 
 	/* meshes */
-	DerivedMesh *cagedm;
+	Mesh *cagemesh;
 	float (*cagecos)[3];
 	float (*vertexcos)[3];
 	int totvert, totcagevert;
@@ -863,7 +863,7 @@ typedef struct MeshDeformBind {
 		const MLoop *mloop;
 		const MLoopTri *looptri;
 		const float (*poly_nors)[3];
-	} cagedm_cache;
+	} cagemesh_cache;
 } MeshDeformBind;
 
 typedef struct MeshDeformIsect {
@@ -888,9 +888,9 @@ static void harmonic_ray_callback(void *userdata, int index, const BVHTreeRay *r
 {
 	struct MeshRayCallbackData *data = userdata;
 	MeshDeformBind *mdb = data->mdb;
-	const MLoop *mloop = mdb->cagedm_cache.mloop;
-	const MLoopTri *looptri = mdb->cagedm_cache.looptri, *lt;
-	const float (*poly_nors)[3] = mdb->cagedm_cache.poly_nors;
+	const MLoop *mloop = mdb->cagemesh_cache.mloop;
+	const MLoopTri *looptri = mdb->cagemesh_cache.looptri, *lt;
+	const float (*poly_nors)[3] = mdb->cagemesh_cache.poly_nors;
 	MeshDeformIsect *isec = data->isec;
 	float no[3], co[3], dist;
 	float *face[3];
@@ -954,9 +954,9 @@ static MDefBoundIsect *meshdeform_ray_tree_intersect(MeshDeformBind *mdb, const
 	if (BLI_bvhtree_ray_cast_ex(mdb->bvhtree, isect_mdef.start, vec_normal,
 	                            0.0, &hit, harmonic_ray_callback, &data, BVH_RAYCAST_WATERTIGHT) != -1)
 	{
-		const MLoop *mloop = mdb->cagedm_cache.mloop;
-		const MLoopTri *lt = &mdb->cagedm_cache.looptri[hit.index];
-		const MPoly *mp = &mdb->cagedm_cache.mpoly[lt->poly];
+		const MLoop *mloop = mdb->cagemesh_cache.mloop;
+		const MLoopTri *lt = &mdb->cagemesh_cache.looptri[hit.index];
+		const MPoly *mp = &mdb->cagemesh_cache.mpoly[lt->poly];
 		const float (*cagecos)[3] = mdb->cagecos;
 		const float len = isect_mdef.lambda;
 		MDefBoundIsect *isect;
@@ -1131,8 +1131,8 @@ static void meshdeform_bind_floodfill(MeshDeformBind *mdb)
 
 static float meshdeform_boundary_phi(const MeshDeformBind *mdb, const MDefBoundIsect *isect, int cagevert)
 {
-	const MLoop *mloop = mdb->cagedm_cache.mloop;
-	const MPoly *mp = &mdb->cagedm_cache.mpoly[isect->poly_index];
+	const MLoop *mloop = mdb->cagemesh_cache.mloop;
+	const MPoly *mp = &mdb->cagemesh_cache.mpoly[isect->poly_index];
 	int i;
 
 	for (i = 0; i < mp->totloop; i++) {
@@ -1447,7 +1447,7 @@ static void harmonic_coordinates_bind(Scene *UNUSED(scene), MeshDeformModifierDa
 	mdb->totalphi = MEM_callocN(sizeof(float) * mdb->size3, "MeshDeformBindTotalPhi");
 	mdb->boundisect = MEM_callocN(sizeof(*mdb->boundisect) * mdb->size3, "MDefBoundIsect");
 	mdb->semibound = MEM_callocN(sizeof(int) * mdb->size3, "MDefSemiBound");
-	mdb->bvhtree = bvhtree_from_mesh_get(&mdb->bvhdata, mdb->cagedm, BVHTREE_FROM_LOOPTRI, 4);
+	mdb->bvhtree = BKE_bvhtree_from_mesh_looptri(&mdb->bvhdata, mdb->cagemesh, FLT_EPSILON * 100, 4, 6);
 	mdb->inside = MEM_callocN(sizeof(int) * mdb->totvert, "MDefInside");
 
 	if (mmd->flag & MOD_MDEF_DYNAMIC_BIND)
@@ -1460,11 +1460,11 @@ static void harmonic_coordinates_bind(Scene *UNUSED(scene), MeshDeformModifierDa
 
 	/* initialize data from 'cagedm' for reuse */
 	{
-		DerivedMesh *dm = mdb->cagedm;
-		mdb->cagedm_cache.mpoly = dm->getPolyArray(dm);
-		mdb->cagedm_cache.mloop = dm->getLoopArray(dm);
-		mdb->cagedm_cache.looptri = dm->getLoopTriArray(dm);
-		mdb->cagedm_cache.poly_nors = dm->getPolyDataArray(dm, CD_NORMAL);  /* can be NULL */
+		Mesh *me = mdb->cagemesh;
+		mdb->cagemesh_cache.mpoly = me->mpoly;
+		mdb->cagemesh_cache.mloop = me->mloop;
+		mdb->cagemesh_cache.looptri = BKE_mesh_get_looptri_array(me);
+		mdb->cagemesh_cache.poly_nors = CustomData_get_layer(&me->pdata, CD_NORMAL);  /* can be NULL */
 	}
 
 	/* make bounding box equal size in all directions, add padding, and compute
@@ -1576,7 +1576,7 @@ static void harmonic_coordinates_bind(Scene *UNUSED(scene), MeshDeformModifierDa
 }
 
 void ED_mesh_deform_bind_callback(
-        Scene *scene, MeshDeformModifierData *mmd, DerivedMesh *cagedm,
+        Scene *scene, MeshDeformModifierData *mmd, Mesh *cagemesh,
         float *vertexcos, int totvert, float cagemat[4][4])
 {
 	MeshDeformBind mdb;
@@ -1592,12 +1592,12 @@ void ED_mesh_deform_bind_callback(
 	mdb.vertexcos = MEM_callocN(sizeof(float) * 3 * totvert, "MeshDeformCos");
 	mdb.totvert = totvert;
 	
-	mdb.cagedm = cagedm;
-	mdb.totcagevert = mdb.cagedm->getNumVerts(mdb.cagedm);
+	mdb.cagemesh = cagemesh;
+	mdb.totcagevert = mdb.cagemesh->totvert;
 	mdb.cagecos = MEM_callocN(sizeof(*mdb.cagecos) * mdb.totcagevert, "MeshDeformBindCos");
 	copy_m4_m4(mdb.cagemat, cagemat);
 
-	mvert = mdb.cagedm->getVertArray(mdb.cagedm);
+	mvert = mdb.cagemesh->mvert;
 	for (a = 0; a < mdb.totcagevert; a++)
 		copy_v3_v3(mdb.cagecos[a], mvert[a].co);
 	for (a = 0; a < mdb.totvert; a++)
diff --git a/source/blender/editors/include/ED_armature.h b/source/blender/editors/include/ED_armature.h
index 8b5886d65f1..2934745484a 100644
--- a/source/blender/editors/include/ED_armature.h
+++ b/source/blender/editors/include/ED_armature.h
@@ -43,7 +43,7 @@ struct Depsgraph;
 struct IDProperty;
 struct ListBase;
 struct MeshDeformModifierData;
-struct DerivedMesh;
+struct Mesh;
 struct Object;
 struct ReportList;
 struct Scene;
@@ -230,7 +230,7 @@ struct Object *ED_pose_object_from_context(struct bContext *C);
 void ED_mesh_deform_bind_callback(
         struct Scene *scene,
         struct MeshDeformModifierData *mmd,
-        struct DerivedMesh *cagedm,
+        struct Mesh *cagemesh,
         float *vertexcos, int totvert, float cagemat[4][4]);
 
 #ifdef __cplusplus
diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h
index cfa101b0b6e..148ffed7c7f 100644
--- a/source/blender/makesdna/DNA_modifier_types.h
+++ b/source/blender/makesdna/DNA_modifier_typ

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list