EditVert *addvertlist(EditMesh *em, float *vec, EditVert *example) { EditVert *eve; static int hashnr= 0; eve= callocvert(em, sizeof(EditVert), 1); BLI_addtail(&em->verts, eve); em->totvert++; if(vec) VECCOPY(eve->co, vec); eve->hash= hashnr++; if( hashnr>=EDHASHSIZE) hashnr= 0; /* new verts get keyindex of -1 since they did not * have a pre-editmode vertex order */ eve->keyindex = -1; if(example) { CustomData_em_copy_data(&em->vdata, &em->vdata, example->data, &eve->data); eve->bweight = example->bweight; } else { CustomData_em_set_default(&em->vdata, &eve->data); } return eve; }
/* adds the geometry in the bmesh to editMesh (does not free editMesh) * if td != NULL, the transdata will be mapped to the EditVert's co */ void BME_bmesh_to_editmesh(BME_Mesh *bm, BME_TransData_Head *td, EditMesh *em) { BME_Vert *v1; BME_Edge *e; BME_Poly *f; BME_TransData *vtd; EditVert *eve1, *eve2, *eve3, *eve4, **evlist; EditEdge *eed; EditFace *efa; int totvert, len, i, numTex, numCol; if (em == NULL) return; CustomData_copy(&bm->vdata, &em->vdata, CD_MASK_BMESH, CD_CALLOC, 0); CustomData_copy(&bm->edata, &em->edata, CD_MASK_BMESH, CD_CALLOC, 0); CustomData_copy(&bm->pdata, &em->fdata, CD_MASK_BMESH, CD_CALLOC, 0); CustomData_from_bmeshpoly(&em->fdata, &bm->pdata, &bm->ldata,0); numTex = CustomData_number_of_layers(&bm->pdata, CD_MTEXPOLY); numCol = CustomData_number_of_layers(&bm->ldata, CD_MLOOPCOL); /* convert to EditMesh */ /* make editverts */ totvert = BLI_countlist(&(bm->verts)); evlist= (EditVert **)MEM_mallocN(totvert*sizeof(void *),"evlist"); for (i=0,v1=bm->verts.first;v1;v1=v1->next,i++) { v1->tflag1 = i; eve1 = NULL; //XXX addvertlist(v1->co,NULL); if (td && (vtd = BME_get_transdata(td,v1))) { vtd->loc = eve1->co; } eve1->keyindex = i; evlist[i]= eve1; eve1->f = (unsigned char)v1->flag; eve1->h = (unsigned char)v1->h; eve1->bweight = v1->bweight; CustomData_em_copy_data(&bm->vdata, &em->vdata, v1->data, &eve1->data); } /* make edges */ for (e=bm->edges.first;e;e=e->next) { if(0) { //XXX if(!(findedgelist(evlist[e->v1->tflag1], evlist[e->v2->tflag1]))){ eed= NULL; //XXX addedgelist(evlist[e->v1->tflag1], evlist[e->v2->tflag1], NULL); eed->crease = e->crease; eed->bweight = e->bweight; if(e->flag & ME_SEAM) eed->seam = 1; if(e->flag & ME_SHARP) eed->sharp = 1; if(e->flag & SELECT) eed->f |= SELECT; //XXX if(e->flag & ME_FGON) eed->h= EM_FGON; // 2 different defines! if(e->flag & ME_HIDE) eed->h |= 1; if(em->selectmode==SCE_SELECT_EDGE) { ; //XXX EM_select_edge(eed, eed->f & SELECT); } CustomData_em_copy_data(&bm->edata, &em->edata, e->data, &eed->data); } } /* make faces */ for (f=bm->polys.first;f;f=f->next) { len = BME_cycle_length(f->loopbase); if (len==3 || len==4) { eve1= evlist[f->loopbase->v->tflag1]; eve2= evlist[f->loopbase->next->v->tflag1]; eve3= evlist[f->loopbase->next->next->v->tflag1]; if (len == 4) { eve4= evlist[f->loopbase->prev->v->tflag1]; } else { eve4= NULL; } efa = NULL; //XXX addfacelist(eve1, eve2, eve3, eve4, NULL, NULL); efa->mat_nr = (unsigned char)f->mat_nr; efa->flag= f->flag & ~ME_HIDE; if(f->flag & ME_FACE_SEL) { efa->f |= SELECT; } if(f->flag & ME_HIDE) efa->h= 1; // XXX flag depricated // if((G.f & G_FACESELECT) && (efa->f & SELECT)) //XXX EM_select_face(efa, 1); /* flush down */ CustomData_em_copy_data(&bm->pdata, &em->fdata, f->data, &efa->data); BME_loops_to_corners(bm, &em->fdata, efa->data, f,numCol,numTex); } } MEM_freeN(evlist); }
EditFace *addfacelist(EditMesh *em, EditVert *v1, EditVert *v2, EditVert *v3, EditVert *v4, EditFace *example, EditFace *exampleEdges) { EditFace *efa; EditEdge *e1, *e2=0, *e3=0, *e4=0; /* added sanity check... seems to happen for some tools, or for enter editmode for corrupted meshes */ if(v1==v4 || v2==v4 || v3==v4) v4= NULL; /* add face to list and do the edges */ if(exampleEdges) { e1= addedgelist(em, v1, v2, exampleEdges->e1); e2= addedgelist(em, v2, v3, exampleEdges->e2); if(v4) e3= addedgelist(em, v3, v4, exampleEdges->e3); else e3= addedgelist(em, v3, v1, exampleEdges->e3); if(v4) e4= addedgelist(em, v4, v1, exampleEdges->e4); } else { e1= addedgelist(em, v1, v2, NULL); e2= addedgelist(em, v2, v3, NULL); if(v4) e3= addedgelist(em, v3, v4, NULL); else e3= addedgelist(em, v3, v1, NULL); if(v4) e4= addedgelist(em, v4, v1, NULL); } if(v1==v2 || v2==v3 || v1==v3) return NULL; if(e2==0) return NULL; efa= (EditFace *)callocface(em, sizeof(EditFace), 1); efa->v1= v1; efa->v2= v2; efa->v3= v3; efa->v4= v4; efa->e1= e1; efa->e2= e2; efa->e3= e3; efa->e4= e4; if(example) { efa->mat_nr= example->mat_nr; efa->flag= example->flag; CustomData_em_copy_data(&em->fdata, &em->fdata, example->data, &efa->data); CustomData_em_validate_data(&em->fdata, efa->data, efa->v4 ? 4 : 3); } else { efa->mat_nr= em->mat_nr; CustomData_em_set_default(&em->fdata, &efa->data); } BLI_addtail(&em->faces, efa); em->totface++; if(efa->v4) { normal_quad_v3( efa->n,efa->v1->co, efa->v2->co, efa->v3->co, efa->v4->co); cent_quad_v3(efa->cent, efa->v1->co, efa->v2->co, efa->v3->co, efa->v4->co); } else { normal_tri_v3( efa->n,efa->v1->co, efa->v2->co, efa->v3->co); cent_tri_v3(efa->cent, efa->v1->co, efa->v2->co, efa->v3->co); } return efa; }