static void bm_loop_attrs_copy( BMesh *source_mesh, BMesh *target_mesh, const BMLoop *source_loop, BMLoop *target_loop, uint64_t UNUSED(cd_mask)) { if ((source_mesh == target_mesh) && (source_loop == target_loop)) { BLI_assert(!"BMLoop: source and targer match"); return; } CustomData_bmesh_free_block_data(&target_mesh->ldata, target_loop->head.data); CustomData_bmesh_copy_data(&source_mesh->ldata, &target_mesh->ldata, source_loop->head.data, &target_loop->head.data); }
static void bm_edge_attrs_copy( BMesh *source_mesh, BMesh *target_mesh, const BMEdge *source_edge, BMEdge *target_edge, uint64_t UNUSED(cd_mask)) { if ((source_mesh == target_mesh) && (source_edge == target_edge)) { BLI_assert(!"BMEdge: source and targer match"); return; } CustomData_bmesh_free_block_data(&target_mesh->edata, target_edge->head.data); CustomData_bmesh_copy_data(&source_mesh->edata, &target_mesh->edata, source_edge->head.data, &target_edge->head.data); }
static void bm_vert_attrs_copy( BMesh *source_mesh, BMesh *target_mesh, const BMVert *source_vertex, BMVert *target_vertex) { if ((source_mesh == target_mesh) && (source_vertex == target_vertex)) { BLI_assert(!"BMVert: source and targer match"); return; } copy_v3_v3(target_vertex->no, source_vertex->no); CustomData_bmesh_free_block_data(&target_mesh->vdata, target_vertex->head.data); CustomData_bmesh_copy_data(&source_mesh->vdata, &target_mesh->vdata, source_vertex->head.data, &target_vertex->head.data); }
static void bm_face_attrs_copy( BMesh *source_mesh, BMesh *target_mesh, const BMFace *source_face, BMFace *target_face) { if ((source_mesh == target_mesh) && (source_face == target_face)) { BLI_assert(!"BMFace: source and targer match"); return; } copy_v3_v3(target_face->no, source_face->no); CustomData_bmesh_free_block_data(&target_mesh->pdata, target_face->head.data); CustomData_bmesh_copy_data(&source_mesh->pdata, &target_mesh->pdata, source_face->head.data, &target_face->head.data); target_face->mat_nr = source_face->mat_nr; }
/*move the EditMesh conversion functions to editmesh_tools.c*/ BME_Mesh *BME_editmesh_to_bmesh(EditMesh *em) { BME_Mesh *bm; int allocsize[4] = {512,512,2048,512}, numTex, numCol; BME_Vert *v1, *v2; BME_Edge *e, *edar[4]; BME_Poly *f; EditVert *eve; EditEdge *eed; EditFace *efa; int len; bm = BME_make_mesh(allocsize); /*copy custom data layout*/ CustomData_copy(&em->vdata, &bm->vdata, CD_MASK_BMESH, CD_CALLOC, 0); CustomData_copy(&em->edata, &bm->edata, CD_MASK_BMESH, CD_CALLOC, 0); CustomData_copy(&em->fdata, &bm->pdata, CD_MASK_BMESH, CD_CALLOC, 0); /*copy face corner data*/ CustomData_to_bmeshpoly(&em->fdata, &bm->pdata, &bm->ldata); /*initialize memory pools*/ CustomData_bmesh_init_pool(&bm->vdata, allocsize[0]); CustomData_bmesh_init_pool(&bm->edata, allocsize[1]); CustomData_bmesh_init_pool(&bm->ldata, allocsize[2]); CustomData_bmesh_init_pool(&bm->pdata, allocsize[3]); /*needed later*/ numTex = CustomData_number_of_layers(&bm->pdata, CD_MTEXPOLY); numCol = CustomData_number_of_layers(&bm->ldata, CD_MLOOPCOL); BME_model_begin(bm); /*add verts*/ eve= em->verts.first; while(eve) { v1 = BME_MV(bm,eve->co); VECCOPY(v1->no,eve->no); v1->flag = eve->f; v1->h = eve->h; v1->bweight = eve->bweight; /*Copy Custom Data*/ CustomData_bmesh_copy_data(&em->vdata, &bm->vdata, eve->data, &v1->data); eve->tmp.v = (EditVert*)v1; eve = eve->next; } /*add edges*/ eed= em->edges.first; while(eed) { v1 = (BME_Vert*)eed->v1->tmp.v; v2 = (BME_Vert*)eed->v2->tmp.v; e = BME_ME(bm, v1, v2); e->crease = eed->crease; e->bweight = eed->bweight; e->flag = eed->f & SELECT; if(eed->sharp) e->flag |= ME_SHARP; if(eed->seam) e->flag |= ME_SEAM; //XXX if(eed->h & EM_FGON) e->flag |= ME_FGON; if(eed->h & 1) e->flag |= ME_HIDE; eed->tmp.e = (EditEdge*)e; CustomData_bmesh_copy_data(&em->edata, &bm->edata, eed->data, &e->data); eed = eed->next; } /*add faces.*/ efa= em->faces.first; while(efa) { if(efa->v4) len = 4; else len = 3; edar[0] = (BME_Edge*)efa->e1->tmp.e; edar[1] = (BME_Edge*)efa->e2->tmp.e; edar[2] = (BME_Edge*)efa->e3->tmp.e; if(len == 4){ edar[3] = (BME_Edge*)efa->e4->tmp.e; } /*find v1 and v2*/ v1 = (BME_Vert*)efa->v1->tmp.v; v2 = (BME_Vert*)efa->v2->tmp.v; f = BME_MF(bm,v1,v2,edar,len); f->mat_nr = efa->mat_nr; f->flag = efa->flag; if(efa->h) { f->flag |= ME_HIDE; f->flag &= ~ME_FACE_SEL; } else { if(efa->f & 1) f->flag |= ME_FACE_SEL; else f->flag &= ~ME_FACE_SEL; } CustomData_bmesh_copy_data(&em->fdata, &bm->pdata, efa->data, &f->data); BME_corners_to_loops(bm, &em->fdata, efa->data, f,numCol,numTex); efa = efa->next; } BME_model_end(bm); return bm; }