[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