diff options
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/blenkernel/BKE_cdderivedmesh.h | 3 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/cdderivedmesh.c | 144 | ||||
-rw-r--r-- | source/blender/editors/uvedit/uvedit_unwrap_ops.c | 14 |
3 files changed, 10 insertions, 151 deletions
diff --git a/source/blender/blenkernel/BKE_cdderivedmesh.h b/source/blender/blenkernel/BKE_cdderivedmesh.h index 50af6c876b4..d39850a162b 100644 --- a/source/blender/blenkernel/BKE_cdderivedmesh.h +++ b/source/blender/blenkernel/BKE_cdderivedmesh.h @@ -49,9 +49,6 @@ struct DerivedMesh *CDDM_from_mesh_ex(struct Mesh *mesh, eCDAllocType alloctype, const struct CustomData_MeshMasks *mask); -/* creates a CDDerivedMesh from the given BMEditMesh */ -DerivedMesh *CDDM_from_editbmesh(struct BMEditMesh *em, const bool use_mdisps); - /* Copies the given DerivedMesh with verts, faces & edges stored as * custom element data. */ diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c index a55b5dc7817..5fc4e909fac 100644 --- a/source/blender/blenkernel/intern/cdderivedmesh.c +++ b/source/blender/blenkernel/intern/cdderivedmesh.c @@ -370,150 +370,6 @@ DerivedMesh *CDDM_from_mesh_ex(Mesh *mesh, return dm; } -/* TODO(campbell): remove, use BKE_mesh_from_bmesh_for_eval_nomain instead. */ - -/* used for both editbmesh and bmesh */ -static DerivedMesh *cddm_from_bmesh_ex(struct BMesh *bm, const bool use_mdisps) -{ - DerivedMesh *dm = CDDM_new(bm->totvert, bm->totedge, 0, bm->totloop, bm->totface); - - CDDerivedMesh *cddm = (CDDerivedMesh *)dm; - BMIter iter; - BMVert *eve; - BMEdge *eed; - BMFace *efa; - MVert *mvert = cddm->mvert; - MEdge *medge = cddm->medge; - MLoop *mloop = cddm->mloop; - MPoly *mpoly = cddm->mpoly; - int *index, add_orig; - CustomData_MeshMasks mask = {0}; - unsigned int i, j; - - const int cd_vert_bweight_offset = CustomData_get_offset(&bm->vdata, CD_BWEIGHT); - const int cd_edge_bweight_offset = CustomData_get_offset(&bm->edata, CD_BWEIGHT); - const int cd_edge_crease_offset = CustomData_get_offset(&bm->edata, CD_CREASE); - - dm->deformedOnly = 1; - - /* don't add origindex layer if one already exists */ - add_orig = !CustomData_has_layer(&bm->pdata, CD_ORIGINDEX); - - mask = CD_MASK_DERIVEDMESH; - if (use_mdisps) { - mask.lmask |= CD_MASK_MDISPS; - } - - /* don't process shapekeys, we only feed them through the modifier stack as needed, - * e.g. for applying modifiers or the like*/ - mask.vmask &= ~CD_MASK_SHAPEKEY; - CustomData_merge(&bm->vdata, &dm->vertData, mask.vmask, CD_CALLOC, dm->numVertData); - CustomData_merge(&bm->edata, &dm->edgeData, mask.emask, CD_CALLOC, dm->numEdgeData); - CustomData_merge(&bm->ldata, &dm->loopData, mask.lmask, CD_CALLOC, dm->numLoopData); - CustomData_merge(&bm->pdata, &dm->polyData, mask.pmask, CD_CALLOC, dm->numPolyData); - - index = dm->getVertDataArray(dm, CD_ORIGINDEX); - - BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, i) { - MVert *mv = &mvert[i]; - - copy_v3_v3(mv->co, eve->co); - - BM_elem_index_set(eve, i); /* set_inline */ - - normal_float_to_short_v3(mv->no, eve->no); - - mv->flag = BM_vert_flag_to_mflag(eve); - - if (cd_vert_bweight_offset != -1) { - mv->bweight = BM_ELEM_CD_GET_FLOAT_AS_UCHAR(eve, cd_vert_bweight_offset); - } - - if (add_orig) { - *index++ = i; - } - - CustomData_from_bmesh_block(&bm->vdata, &dm->vertData, eve->head.data, i); - } - bm->elem_index_dirty &= ~BM_VERT; - - index = dm->getEdgeDataArray(dm, CD_ORIGINDEX); - BM_ITER_MESH_INDEX (eed, &iter, bm, BM_EDGES_OF_MESH, i) { - MEdge *med = &medge[i]; - - BM_elem_index_set(eed, i); /* set_inline */ - - med->v1 = BM_elem_index_get(eed->v1); - med->v2 = BM_elem_index_get(eed->v2); - - med->flag = BM_edge_flag_to_mflag(eed); - - /* handle this differently to editmode switching, - * only enable draw for single user edges rather then calculating angle */ - if ((med->flag & ME_EDGEDRAW) == 0) { - if (eed->l && eed->l == eed->l->radial_next) { - med->flag |= ME_EDGEDRAW; - } - } - - if (cd_edge_crease_offset != -1) { - med->crease = BM_ELEM_CD_GET_FLOAT_AS_UCHAR(eed, cd_edge_crease_offset); - } - if (cd_edge_bweight_offset != -1) { - med->bweight = BM_ELEM_CD_GET_FLOAT_AS_UCHAR(eed, cd_edge_bweight_offset); - } - - CustomData_from_bmesh_block(&bm->edata, &dm->edgeData, eed->head.data, i); - if (add_orig) { - *index++ = i; - } - } - bm->elem_index_dirty &= ~BM_EDGE; - - index = CustomData_get_layer(&dm->polyData, CD_ORIGINDEX); - j = 0; - BM_ITER_MESH_INDEX (efa, &iter, bm, BM_FACES_OF_MESH, i) { - BMLoop *l_iter; - BMLoop *l_first; - MPoly *mp = &mpoly[i]; - - BM_elem_index_set(efa, i); /* set_inline */ - - mp->totloop = efa->len; - mp->flag = BM_face_flag_to_mflag(efa); - mp->loopstart = j; - mp->mat_nr = efa->mat_nr; - - l_iter = l_first = BM_FACE_FIRST_LOOP(efa); - do { - mloop->v = BM_elem_index_get(l_iter->v); - mloop->e = BM_elem_index_get(l_iter->e); - CustomData_from_bmesh_block(&bm->ldata, &dm->loopData, l_iter->head.data, j); - - BM_elem_index_set(l_iter, j); /* set_inline */ - - j++; - mloop++; - } while ((l_iter = l_iter->next) != l_first); - - CustomData_from_bmesh_block(&bm->pdata, &dm->polyData, efa->head.data, i); - - if (add_orig) { - *index++ = i; - } - } - bm->elem_index_dirty &= ~(BM_FACE | BM_LOOP); - - dm->cd_flag = BM_mesh_cd_flag_from_bmesh(bm); - - return dm; -} - -DerivedMesh *CDDM_from_editbmesh(BMEditMesh *em, const bool use_mdisps) -{ - return cddm_from_bmesh_ex(em->bm, use_mdisps); -} - DerivedMesh *CDDM_copy(DerivedMesh *source) { CDDerivedMesh *cddm = cdDM_create("CDDM_copy cddm"); diff --git a/source/blender/editors/uvedit/uvedit_unwrap_ops.c b/source/blender/editors/uvedit/uvedit_unwrap_ops.c index 1e758771f6a..49acf0ca3a4 100644 --- a/source/blender/editors/uvedit/uvedit_unwrap_ops.c +++ b/source/blender/editors/uvedit/uvedit_unwrap_ops.c @@ -53,6 +53,8 @@ #include "BKE_scene.h" #include "BKE_editmesh.h" #include "BKE_layer.h" +#include "BKE_lib_id.h" +#include "BKE_mesh.h" #include "DEG_depsgraph.h" @@ -500,11 +502,15 @@ static ParamHandle *construct_param_handle_subsurfed(const Scene *scene, smd.levels = smd_real->levels; smd.subdivType = smd_real->subdivType; - initialDerived = CDDM_from_editbmesh(em, false); - derivedMesh = subsurf_make_derived_from_derived( - initialDerived, &smd, scene, NULL, SUBSURF_IN_EDIT_MODE); + { + Mesh *me_from_em = BKE_mesh_from_bmesh_for_eval_nomain(em->bm, NULL, ob->data); + initialDerived = CDDM_from_mesh_ex(me_from_em, CD_REFERENCE, &CD_MASK_MESH); + derivedMesh = subsurf_make_derived_from_derived( + initialDerived, &smd, scene, NULL, SUBSURF_IN_EDIT_MODE); - initialDerived->release(initialDerived); + initialDerived->release(initialDerived); + BKE_id_free(NULL, me_from_em); + } /* get the derived data */ subsurfedVerts = derivedMesh->getVertArray(derivedMesh); |