[Bf-blender-cvs] [0012082c10d] master: Cleanup: move mesh conversion into own function

Campbell Barton noreply at git.blender.org
Tue May 8 18:08:10 CEST 2018


Commit: 0012082c10dac4e766e808c5251762a6956dae46
Author: Campbell Barton
Date:   Tue May 8 17:44:54 2018 +0200
Branches: master
https://developer.blender.org/rB0012082c10dac4e766e808c5251762a6956dae46

Cleanup: move mesh conversion into own function

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

M	source/blender/blenkernel/BKE_mesh.h
M	source/blender/blenkernel/CMakeLists.txt
M	source/blender/blenkernel/intern/mesh.c
A	source/blender/blenkernel/intern/mesh_convert.c

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

diff --git a/source/blender/blenkernel/BKE_mesh.h b/source/blender/blenkernel/BKE_mesh.h
index bf135254941..e5c82f0be9a 100644
--- a/source/blender/blenkernel/BKE_mesh.h
+++ b/source/blender/blenkernel/BKE_mesh.h
@@ -100,22 +100,6 @@ void   BKE_mesh_orco_verts_transform(struct Mesh *me, float (*orco)[3], int totv
 int test_index_face(struct MFace *mface, struct CustomData *mfdata, int mfindex, int nr);
 struct Mesh *BKE_mesh_from_object(struct Object *ob);
 void BKE_mesh_assign_object(struct Object *ob, struct Mesh *me);
-void BKE_mesh_from_metaball(struct ListBase *lb, struct Mesh *me);
-int  BKE_mesh_nurbs_to_mdata(
-        struct Object *ob, struct MVert **r_allvert, int *r_totvert,
-        struct MEdge **r_alledge, int *r_totedge, struct MLoop **r_allloop, struct MPoly **r_allpoly,
-        int *r_totloop, int *r_totpoly);
-int BKE_mesh_nurbs_displist_to_mdata(
-        struct Object *ob, const struct ListBase *dispbase,
-        struct MVert **r_allvert, int *r_totvert,
-        struct MEdge **r_alledge, int *r_totedge,
-        struct MLoop **r_allloop, struct MPoly **r_allpoly,
-        struct MLoopUV **r_alluv, int *r_totloop, int *r_totpoly);
-void BKE_mesh_from_nurbs_displist(
-        struct Object *ob, struct ListBase *dispbase, const bool use_orco_uv, const char *obdata_name);
-void BKE_mesh_from_nurbs(struct Object *ob);
-void BKE_mesh_to_curve_nurblist(struct DerivedMesh *dm, struct ListBase *nurblist, const int edge_users_test);
-void BKE_mesh_to_curve(struct Scene *scene, struct Object *ob);
 void BKE_mesh_material_index_remove(struct Mesh *me, short index);
 void BKE_mesh_material_index_clear(struct Mesh *me);
 void BKE_mesh_material_remap(struct Mesh *me, const unsigned int *remap, unsigned int remap_len);
@@ -135,9 +119,6 @@ float (*BKE_mesh_vertexCos_get(const struct Mesh *me, int *r_numVerts))[3];
 
 void BKE_mesh_split_faces(struct Mesh *mesh, bool free_loop_normals);
 
-struct Mesh *BKE_mesh_new_from_object(struct Main *bmain, struct Scene *sce, struct Object *ob,
-                                      int apply_modifiers, int settings, int calc_tessface, int calc_undeformed);
-
 /* vertex level transformations & checks (no derived mesh) */
 
 bool BKE_mesh_minmax(const struct Mesh *me, float r_min[3], float r_max[3]);
@@ -159,7 +140,28 @@ 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);
 
+/* *** mesh_convert.c *** */
+
+void BKE_mesh_from_metaball(struct ListBase *lb, struct Mesh *me);
+int  BKE_mesh_nurbs_to_mdata(
+        struct Object *ob, struct MVert **r_allvert, int *r_totvert,
+        struct MEdge **r_alledge, int *r_totedge, struct MLoop **r_allloop, struct MPoly **r_allpoly,
+        int *r_totloop, int *r_totpoly);
+int BKE_mesh_nurbs_displist_to_mdata(
+        struct Object *ob, const struct ListBase *dispbase,
+        struct MVert **r_allvert, int *r_totvert,
+        struct MEdge **r_alledge, int *r_totedge,
+        struct MLoop **r_allloop, struct MPoly **r_allpoly,
+        struct MLoopUV **r_alluv, int *r_totloop, int *r_totpoly);
+void BKE_mesh_from_nurbs_displist(
+        struct Object *ob, struct ListBase *dispbase, const bool use_orco_uv, const char *obdata_name);
+void BKE_mesh_from_nurbs(struct Object *ob);
+void BKE_mesh_to_curve_nurblist(struct DerivedMesh *dm, struct ListBase *nurblist, const int edge_users_test);
+void BKE_mesh_to_curve(struct Scene *scene, struct Object *ob);
 
+struct Mesh *BKE_mesh_new_from_object(
+        struct Main *bmain, struct Scene *sce, struct Object *ob,
+        int apply_modifiers, int settings, int calc_tessface, int calc_undeformed);
 
 /* *** mesh_evaluate.c *** */
 
diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt
index 723ba347dfb..c2b2fc4f869 100644
--- a/source/blender/blenkernel/CMakeLists.txt
+++ b/source/blender/blenkernel/CMakeLists.txt
@@ -136,6 +136,7 @@ set(SRC
 	intern/mball.c
 	intern/mball_tessellate.c
 	intern/mesh.c
+	intern/mesh_convert.c
 	intern/mesh_evaluate.c
 	intern/mesh_mapping.c
 	intern/mesh_remap.c
diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c
index fd56534146d..855cf4b43eb 100644
--- a/source/blender/blenkernel/intern/mesh.c
+++ b/source/blender/blenkernel/intern/mesh.c
@@ -68,11 +68,6 @@
 
 #include "DEG_depsgraph.h"
 
-/* Define for cases when you want extra validation of mesh
- * after certain modifications.
- */
-// #undef VALIDATE_MESH
-
 enum {
 	MESHCMP_DVERT_WEIGHTMISMATCH = 1,
 	MESHCMP_DVERT_GROUPMISMATCH,
@@ -919,727 +914,6 @@ void BKE_mesh_assign_object(Object *ob, Mesh *me)
 	test_object_modifiers(ob);
 }
 
-void BKE_mesh_from_metaball(ListBase *lb, Mesh *me)
-{
-	DispList *dl;
-	MVert *mvert;
-	MLoop *mloop, *allloop;
-	MPoly *mpoly;
-	const float *nors, *verts;
-	int a, *index;
-	
-	dl = lb->first;
-	if (dl == NULL) return;
-
-	if (dl->type == DL_INDEX4) {
-		mvert = CustomData_add_layer(&me->vdata, CD_MVERT, CD_CALLOC, NULL, dl->nr);
-		allloop = mloop = CustomData_add_layer(&me->ldata, CD_MLOOP, CD_CALLOC, NULL, dl->parts * 4);
-		mpoly = CustomData_add_layer(&me->pdata, CD_MPOLY, CD_CALLOC, NULL, dl->parts);
-		me->mvert = mvert;
-		me->mloop = mloop;
-		me->mpoly = mpoly;
-		me->totvert = dl->nr;
-		me->totpoly = dl->parts;
-
-		a = dl->nr;
-		nors = dl->nors;
-		verts = dl->verts;
-		while (a--) {
-			copy_v3_v3(mvert->co, verts);
-			normal_float_to_short_v3(mvert->no, nors);
-			mvert++;
-			nors += 3;
-			verts += 3;
-		}
-		
-		a = dl->parts;
-		index = dl->index;
-		while (a--) {
-			int count = index[2] != index[3] ? 4 : 3;
-
-			mloop[0].v = index[0];
-			mloop[1].v = index[1];
-			mloop[2].v = index[2];
-			if (count == 4)
-				mloop[3].v = index[3];
-
-			mpoly->totloop = count;
-			mpoly->loopstart = (int)(mloop - allloop);
-			mpoly->flag = ME_SMOOTH;
-
-
-			mpoly++;
-			mloop += count;
-			me->totloop += count;
-			index += 4;
-		}
-
-		BKE_mesh_update_customdata_pointers(me, true);
-
-		BKE_mesh_calc_normals(me);
-
-		BKE_mesh_calc_edges(me, true, false);
-	}
-}
-
-/**
- * Specialized function to use when we _know_ existing edges don't overlap with poly edges.
- */
-static void make_edges_mdata_extend(MEdge **r_alledge, int *r_totedge,
-                                    const MPoly *mpoly, MLoop *mloop,
-                                    const int totpoly)
-{
-	int totedge = *r_totedge;
-	int totedge_new;
-	EdgeHash *eh;
-	unsigned int eh_reserve;
-	const MPoly *mp;
-	int i;
-
-	eh_reserve = max_ii(totedge, BLI_EDGEHASH_SIZE_GUESS_FROM_POLYS(totpoly));
-	eh = BLI_edgehash_new_ex(__func__, eh_reserve);
-
-	for (i = 0, mp = mpoly; i < totpoly; i++, mp++) {
-		BKE_mesh_poly_edgehash_insert(eh, mp, mloop + mp->loopstart);
-	}
-
-	totedge_new = BLI_edgehash_len(eh);
-
-#ifdef DEBUG
-	/* ensure that theres no overlap! */
-	if (totedge_new) {
-		MEdge *medge = *r_alledge;
-		for (i = 0; i < totedge; i++, medge++) {
-			BLI_assert(BLI_edgehash_haskey(eh, medge->v1, medge->v2) == false);
-		}
-	}
-#endif
-
-	if (totedge_new) {
-		EdgeHashIterator *ehi;
-		MEdge *medge;
-		unsigned int e_index = totedge;
-
-		*r_alledge = medge = (*r_alledge ? MEM_reallocN(*r_alledge, sizeof(MEdge) * (totedge + totedge_new)) :
-		                                   MEM_calloc_arrayN(totedge_new, sizeof(MEdge), __func__));
-		medge += totedge;
-
-		totedge += totedge_new;
-
-		/* --- */
-		for (ehi = BLI_edgehashIterator_new(eh);
-		     BLI_edgehashIterator_isDone(ehi) == false;
-		     BLI_edgehashIterator_step(ehi), ++medge, e_index++)
-		{
-			BLI_edgehashIterator_getKey(ehi, &medge->v1, &medge->v2);
-			BLI_edgehashIterator_setValue(ehi, SET_UINT_IN_POINTER(e_index));
-
-			medge->crease = medge->bweight = 0;
-			medge->flag = ME_EDGEDRAW | ME_EDGERENDER;
-		}
-		BLI_edgehashIterator_free(ehi);
-
-		*r_totedge = totedge;
-
-
-		for (i = 0, mp = mpoly; i < totpoly; i++, mp++) {
-			MLoop *l = &mloop[mp->loopstart];
-			MLoop *l_prev = (l + (mp->totloop - 1));
-			int j;
-			for (j = 0; j < mp->totloop; j++, l++) {
-				/* lookup hashed edge index */
-				l_prev->e = GET_UINT_FROM_POINTER(BLI_edgehash_lookup(eh, l_prev->v, l->v));
-				l_prev = l;
-			}
-		}
-	}
-
-	BLI_edgehash_free(eh, NULL);
-}
-
-
-/* Initialize mverts, medges and, faces for converting nurbs to mesh and derived mesh */
-/* return non-zero on error */
-int BKE_mesh_nurbs_to_mdata(
-        Object *ob, MVert **r_allvert, int *r_totvert,
-        MEdge **r_alledge, int *r_totedge, MLoop **r_allloop, MPoly **r_allpoly,
-        int *r_totloop, int *r_totpoly)
-{
-	ListBase disp = {NULL, NULL};
-
-	if (ob->curve_cache) {
-		disp = ob->curve_cache->disp;
-	}
-
-	return BKE_mesh_nurbs_displist_to_mdata(
-	        ob, &disp,
-	        r_allvert, r_totvert,
-	        r_alledge, r_totedge,
-	        r_allloop, r_allpoly, NULL,
-	        r_totloop, r_totpoly);
-}
-
-/* BMESH: this doesn't calculate all edges from polygons,
- * only free standing edges are calculated */
-
-/* Initialize mverts, medges and, faces for converting nurbs to mesh and derived mesh */
-/* use specified dispbase */
-int BKE_mesh_nurbs_displist_to_mdata(
-        Object *ob, const ListBase *dispbase,
-        MVert **r_allvert, int *r_totvert,
-        MEdge **r_alledge, int *r_totedge,
-        MLoop **r_allloop, MPoly **r_allpoly,
-        MLoopUV **r_alluv,
-        int *r_totloop, int *r_totpoly)
-{
-	Curve *cu = ob->data;
-	DispList *dl;
-	MVert *mvert;
-	MPoly *mpoly;
-	MLoop *mloop;
-	MLoopUV *mloopuv = NULL;
-	MEdge *medge;
-	const float *data;
-	int a, b, ofs, vertcount, startvert, totvert = 0, totedge = 0, totloop = 0, totpoly = 0;
-	int p1, p2, p3, p4, *index;
-	const bool conv_polys = ((CU_DO_2DFILL(cu) == false) ||  /* 2d polys are filled with DL_INDEX3 displists */
-	                         (ob->type == OB_SURF));  /* surf polys are never filled */
-
-	/* count */
-	dl = dispbase->first;
-	while (dl) {
-		if (dl->type == DL_SEGM) {
-			totvert += dl->parts * dl->nr;
-			totedge += dl->parts * (dl->nr - 1);
-		}
-		else if (dl->type == DL_POLY) {
-			if (conv_polys) {
-				totvert += dl->parts * dl->nr;
-				totedge += dl

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list