Changeset View
Changeset View
Standalone View
Standalone View
source/blender/blenkernel/intern/mesh_validate.c
| Show First 20 Lines • Show All 1,495 Lines • ▼ Show 20 Lines | void BKE_mesh_calc_edges(Mesh *mesh, bool update, const bool select) | ||||
| CustomData_free(&mesh->edata, mesh->totedge); | CustomData_free(&mesh->edata, mesh->totedge); | ||||
| mesh->edata = edata; | mesh->edata = edata; | ||||
| mesh->totedge = totedge; | mesh->totedge = totedge; | ||||
| mesh->medge = CustomData_get_layer(&mesh->edata, CD_MEDGE); | mesh->medge = CustomData_get_layer(&mesh->edata, CD_MEDGE); | ||||
| BLI_edgehash_free(eh, NULL); | 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); | |||||
| } | |||||
| /** \} */ | /** \} */ | ||||