diff options
author | Sebastian Parborg <zeddb> | 2018-09-25 13:35:43 +0300 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2018-09-25 15:01:23 +0300 |
commit | d1916764008de69aa6fcf4348223c7001497b64d (patch) | |
tree | 4fe368cbe43ec9f88a0e9793511fd0262d6e2d8c /source/blender/blenkernel | |
parent | 456ed41e2c9d26e21a0a4ee7a278cc9bcc087add (diff) |
Modifiers: use Mesh instead of DerivedMesh for explode.
Differential Revision: https://developer.blender.org/D3718
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r-- | source/blender/blenkernel/BKE_mesh.h | 1 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/mesh.c | 4 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/mesh_validate.c | 62 |
3 files changed, 66 insertions, 1 deletions
diff --git a/source/blender/blenkernel/BKE_mesh.h b/source/blender/blenkernel/BKE_mesh.h index a2ac413764c..e937dd992cd 100644 --- a/source/blender/blenkernel/BKE_mesh.h +++ b/source/blender/blenkernel/BKE_mesh.h @@ -499,6 +499,7 @@ void BKE_mesh_strip_loose_edges(struct Mesh *me); void BKE_mesh_calc_edges_legacy(struct Mesh *me, const bool use_old); void BKE_mesh_calc_edges(struct Mesh *mesh, bool update, const bool select); +void BKE_mesh_calc_edges_tessface(struct Mesh *mesh); /* **** Depsgraph evaluation **** */ diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c index c38196bcfb9..d59fa3ece60 100644 --- a/source/blender/blenkernel/intern/mesh.c +++ b/source/blender/blenkernel/intern/mesh.c @@ -650,7 +650,9 @@ static Mesh *mesh_new_nomain_from_template_ex( int loops_len, int polys_len, CustomDataMask mask) { - const bool do_tessface = ((me_src->totface != 0) && (me_src->totpoly == 0)); /* only do tessface if we have no polys */ + /* Only do tessface if we are creating tessfaces or copying from mesh with only tessfaces. */ + const bool do_tessface = (tessface_len || + ((me_src->totface != 0) && (me_src->totpoly == 0))); Mesh *me_dst = BKE_id_new_nomain(ID_ME, NULL); diff --git a/source/blender/blenkernel/intern/mesh_validate.c b/source/blender/blenkernel/intern/mesh_validate.c index d5a19d19764..bfb3b107084 100644 --- a/source/blender/blenkernel/intern/mesh_validate.c +++ b/source/blender/blenkernel/intern/mesh_validate.c @@ -1501,4 +1501,66 @@ void BKE_mesh_calc_edges(Mesh *mesh, bool update, const bool select) BLI_edgehash_free(eh, NULL); } + +/** + * Calculate/create edges from tessface data + * + * \param mesh The mesh to add edges into + */ + +void BKE_mesh_calc_edges_tessface(Mesh *mesh) +{ + CustomData edgeData; + EdgeSetIterator *ehi; + MFace *mf = mesh->mface; + MEdge *med; + EdgeSet *eh; + int i, *index, numEdges, numFaces = mesh->totface; + + eh = BLI_edgeset_new_ex(__func__, BLI_EDGEHASH_SIZE_GUESS_FROM_POLYS(numFaces)); + + for (i = 0; i < numFaces; i++, mf++) { + BLI_edgeset_add(eh, mf->v1, mf->v2); + BLI_edgeset_add(eh, mf->v2, mf->v3); + + if (mf->v4) { + BLI_edgeset_add(eh, mf->v3, mf->v4); + BLI_edgeset_add(eh, mf->v4, mf->v1); + } + else { + BLI_edgeset_add(eh, mf->v3, mf->v1); + } + } + + numEdges = BLI_edgeset_len(eh); + + /* write new edges into a temporary CustomData */ + CustomData_reset(&edgeData); + CustomData_add_layer(&edgeData, CD_MEDGE, CD_CALLOC, NULL, numEdges); + CustomData_add_layer(&edgeData, CD_ORIGINDEX, CD_CALLOC, NULL, numEdges); + + med = CustomData_get_layer(&edgeData, CD_MEDGE); + index = CustomData_get_layer(&edgeData, CD_ORIGINDEX); + + for (ehi = BLI_edgesetIterator_new(eh), i = 0; + BLI_edgesetIterator_isDone(ehi) == false; + BLI_edgesetIterator_step(ehi), i++, med++, index++) + { + BLI_edgesetIterator_getKey(ehi, &med->v1, &med->v2); + + med->flag = ME_EDGEDRAW | ME_EDGERENDER; + *index = ORIGINDEX_NONE; + } + BLI_edgesetIterator_free(ehi); + + /* free old CustomData and assign new one */ + CustomData_free(&mesh->edata, mesh->totedge); + mesh->edata = edgeData; + mesh->totedge = numEdges; + + mesh->medge = CustomData_get_layer(&mesh->edata, CD_MEDGE); + + BLI_edgeset_free(eh); +} + /** \} */ |