Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Parborg <zeddb>2018-09-25 13:35:43 +0300
committerBrecht Van Lommel <brechtvanlommel@gmail.com>2018-09-25 15:01:23 +0300
commitd1916764008de69aa6fcf4348223c7001497b64d (patch)
tree4fe368cbe43ec9f88a0e9793511fd0262d6e2d8c /source/blender/blenkernel/intern/mesh_validate.c
parent456ed41e2c9d26e21a0a4ee7a278cc9bcc087add (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.c62
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);
+}
+
/** \} */