Changeset View
Changeset View
Standalone View
Standalone View
source/blender/bmesh/intern/bmesh_mesh_convert.cc
| Show First 20 Lines • Show All 992 Lines • ▼ Show 20 Lines | |||||
| BLI_assert(cd_mask_extra == nullptr || (cd_mask_extra->vmask & CD_MASK_SHAPEKEY) == 0); | BLI_assert(cd_mask_extra == nullptr || (cd_mask_extra->vmask & CD_MASK_SHAPEKEY) == 0); | ||||
| me->totvert = bm->totvert; | me->totvert = bm->totvert; | ||||
| me->totedge = bm->totedge; | me->totedge = bm->totedge; | ||||
| me->totface = 0; | me->totface = 0; | ||||
| me->totloop = bm->totloop; | me->totloop = bm->totloop; | ||||
| me->totpoly = bm->totface; | me->totpoly = bm->totface; | ||||
| CustomData_add_layer(&me->vdata, CD_ORIGINDEX, CD_CALLOC, nullptr, bm->totvert); | |||||
| CustomData_add_layer(&me->edata, CD_ORIGINDEX, CD_CALLOC, nullptr, bm->totedge); | |||||
| CustomData_add_layer(&me->pdata, CD_ORIGINDEX, CD_CALLOC, nullptr, bm->totface); | |||||
| CustomData_add_layer(&me->vdata, CD_MVERT, CD_CALLOC, nullptr, bm->totvert); | CustomData_add_layer(&me->vdata, CD_MVERT, CD_CALLOC, nullptr, bm->totvert); | ||||
| CustomData_add_layer(&me->edata, CD_MEDGE, CD_CALLOC, nullptr, bm->totedge); | CustomData_add_layer(&me->edata, CD_MEDGE, CD_CALLOC, nullptr, bm->totedge); | ||||
| CustomData_add_layer(&me->ldata, CD_MLOOP, CD_CALLOC, nullptr, bm->totloop); | CustomData_add_layer(&me->ldata, CD_MLOOP, CD_CALLOC, nullptr, bm->totloop); | ||||
| CustomData_add_layer(&me->pdata, CD_MPOLY, CD_CALLOC, nullptr, bm->totface); | CustomData_add_layer(&me->pdata, CD_MPOLY, CD_CALLOC, nullptr, bm->totface); | ||||
| /* Don't process shape-keys, we only feed them through the modifier stack as needed, | /* Don't process shape-keys, we only feed them through the modifier stack as needed, | ||||
| * e.g. for applying modifiers or the like. */ | * e.g. for applying modifiers or the like. */ | ||||
| CustomData_MeshMasks mask = CD_MASK_DERIVEDMESH; | CustomData_MeshMasks mask = CD_MASK_DERIVEDMESH; | ||||
| Show All 11 Lines | |||||
| BMIter iter; | BMIter iter; | ||||
| BMVert *eve; | BMVert *eve; | ||||
| BMEdge *eed; | BMEdge *eed; | ||||
| BMFace *efa; | BMFace *efa; | ||||
| MVert *mvert = me->mvert; | MVert *mvert = me->mvert; | ||||
| MEdge *medge = me->medge; | MEdge *medge = me->medge; | ||||
| MLoop *mloop = me->mloop; | MLoop *mloop = me->mloop; | ||||
| MPoly *mpoly = me->mpoly; | MPoly *mpoly = me->mpoly; | ||||
| int *index, add_orig; | |||||
| unsigned int i, j; | unsigned int i, j; | ||||
| const int cd_vert_bweight_offset = CustomData_get_offset(&bm->vdata, CD_BWEIGHT); | 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_bweight_offset = CustomData_get_offset(&bm->edata, CD_BWEIGHT); | ||||
| const int cd_edge_crease_offset = CustomData_get_offset(&bm->edata, CD_CREASE); | const int cd_edge_crease_offset = CustomData_get_offset(&bm->edata, CD_CREASE); | ||||
| BKE_mesh_normals_tag_dirty(me); | BKE_mesh_normals_tag_dirty(me); | ||||
| me->runtime.deformed_only = true; | me->runtime.deformed_only = true; | ||||
| /* Don't add origindex layer if one already exists. */ | |||||
| add_orig = !CustomData_has_layer(&bm->pdata, CD_ORIGINDEX); | |||||
| index = (int *)CustomData_get_layer(&me->vdata, CD_ORIGINDEX); | |||||
| BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, i) { | BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, i) { | ||||
| MVert *mv = &mvert[i]; | MVert *mv = &mvert[i]; | ||||
| copy_v3_v3(mv->co, eve->co); | copy_v3_v3(mv->co, eve->co); | ||||
| BM_elem_index_set(eve, i); /* set_inline */ | BM_elem_index_set(eve, i); /* set_inline */ | ||||
| mv->flag = BM_vert_flag_to_mflag(eve); | mv->flag = BM_vert_flag_to_mflag(eve); | ||||
| if (cd_vert_bweight_offset != -1) { | if (cd_vert_bweight_offset != -1) { | ||||
| mv->bweight = BM_ELEM_CD_GET_FLOAT_AS_UCHAR(eve, cd_vert_bweight_offset); | 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, &me->vdata, eve->head.data, i); | CustomData_from_bmesh_block(&bm->vdata, &me->vdata, eve->head.data, i); | ||||
| } | } | ||||
| bm->elem_index_dirty &= ~BM_VERT; | bm->elem_index_dirty &= ~BM_VERT; | ||||
| index = (int *)CustomData_get_layer(&me->edata, CD_ORIGINDEX); | |||||
| BM_ITER_MESH_INDEX (eed, &iter, bm, BM_EDGES_OF_MESH, i) { | BM_ITER_MESH_INDEX (eed, &iter, bm, BM_EDGES_OF_MESH, i) { | ||||
| MEdge *med = &medge[i]; | MEdge *med = &medge[i]; | ||||
| BM_elem_index_set(eed, i); /* set_inline */ | BM_elem_index_set(eed, i); /* set_inline */ | ||||
| med->v1 = BM_elem_index_get(eed->v1); | med->v1 = BM_elem_index_get(eed->v1); | ||||
| med->v2 = BM_elem_index_get(eed->v2); | med->v2 = BM_elem_index_get(eed->v2); | ||||
| Show All 10 Lines | |||||
| if (cd_edge_crease_offset != -1) { | if (cd_edge_crease_offset != -1) { | ||||
| med->crease = BM_ELEM_CD_GET_FLOAT_AS_UCHAR(eed, cd_edge_crease_offset); | med->crease = BM_ELEM_CD_GET_FLOAT_AS_UCHAR(eed, cd_edge_crease_offset); | ||||
| } | } | ||||
| if (cd_edge_bweight_offset != -1) { | if (cd_edge_bweight_offset != -1) { | ||||
| med->bweight = BM_ELEM_CD_GET_FLOAT_AS_UCHAR(eed, cd_edge_bweight_offset); | med->bweight = BM_ELEM_CD_GET_FLOAT_AS_UCHAR(eed, cd_edge_bweight_offset); | ||||
| } | } | ||||
| CustomData_from_bmesh_block(&bm->edata, &me->edata, eed->head.data, i); | CustomData_from_bmesh_block(&bm->edata, &me->edata, eed->head.data, i); | ||||
| if (add_orig) { | |||||
| *index++ = i; | |||||
| } | |||||
| } | } | ||||
| bm->elem_index_dirty &= ~BM_EDGE; | bm->elem_index_dirty &= ~BM_EDGE; | ||||
| index = (int *)CustomData_get_layer(&me->pdata, CD_ORIGINDEX); | |||||
| j = 0; | j = 0; | ||||
| BM_ITER_MESH_INDEX (efa, &iter, bm, BM_FACES_OF_MESH, i) { | BM_ITER_MESH_INDEX (efa, &iter, bm, BM_FACES_OF_MESH, i) { | ||||
| BMLoop *l_iter; | BMLoop *l_iter; | ||||
| BMLoop *l_first; | BMLoop *l_first; | ||||
| MPoly *mp = &mpoly[i]; | MPoly *mp = &mpoly[i]; | ||||
| BM_elem_index_set(efa, i); /* set_inline */ | BM_elem_index_set(efa, i); /* set_inline */ | ||||
| Show All 10 Lines | |||||
| BM_elem_index_set(l_iter, j); /* set_inline */ | BM_elem_index_set(l_iter, j); /* set_inline */ | ||||
| j++; | j++; | ||||
| mloop++; | mloop++; | ||||
| } while ((l_iter = l_iter->next) != l_first); | } while ((l_iter = l_iter->next) != l_first); | ||||
| CustomData_from_bmesh_block(&bm->pdata, &me->pdata, efa->head.data, i); | CustomData_from_bmesh_block(&bm->pdata, &me->pdata, efa->head.data, i); | ||||
| if (add_orig) { | |||||
| *index++ = i; | |||||
| } | |||||
| } | } | ||||
| bm->elem_index_dirty &= ~(BM_FACE | BM_LOOP); | bm->elem_index_dirty &= ~(BM_FACE | BM_LOOP); | ||||
| me->cd_flag = BM_mesh_cd_flag_from_bmesh(bm); | me->cd_flag = BM_mesh_cd_flag_from_bmesh(bm); | ||||
| } | } | ||||
| Context not available. | |||||