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/intern/mesh_validate.c | |
parent | 456ed41e2c9d26e21a0a4ee7a278cc9bcc087add (diff) |
Modifiers: use Mesh instead of DerivedMesh for explode.
Differential Revision: https://developer.blender.org/D3718
Diffstat (limited to 'source/blender/blenkernel/intern/mesh_validate.c')
-rw-r--r-- | source/blender/blenkernel/intern/mesh_validate.c | 62 |
1 files changed, 62 insertions, 0 deletions
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); +} + /** \} */ |