diff --git a/source/blender/editors/mesh/mesh_data.c b/source/blender/editors/mesh/mesh_data.c index c4a302d4d18..c4df9801400 100644 --- a/source/blender/editors/mesh/mesh_data.c +++ b/source/blender/editors/mesh/mesh_data.c @@ -43,6 +43,7 @@ #include "DNA_scene_types.h" #include "DNA_view3d_types.h" +#include "BLI_utildefines.h" #include "BLI_math.h" #include "BLI_editVert.h" #include "BLI_edgehash.h" @@ -56,6 +57,7 @@ #include "BKE_material.h" #include "BKE_mesh.h" #include "BKE_report.h" +#include "BKE_tessmesh.h" #include "RNA_access.h" #include "RNA_define.h" @@ -72,15 +74,27 @@ #include "mesh_intern.h" +#define GET_CD_DATA(me, data) (me->edit_btmesh ? &me->edit_btmesh->bm->data : &me->data) + static void delete_customdata_layer(bContext *C, Object *ob, CustomDataLayer *layer) { Mesh *me = ob->data; - CustomData *data= (me->edit_mesh)? &me->edit_mesh->fdata: &me->fdata; + CustomData *data; void *actlayerdata, *rndlayerdata, *clonelayerdata, *stencillayerdata, *layerdata=layer->data; int type= layer->type; - int index= CustomData_get_layer_index(data, type); - int i, actindex, rndindex, cloneindex, stencilindex; + int index; + int i, actindex, rndindex, cloneindex, stencilindex, tot; + if (layer->type == CD_MLOOPCOL || layer->type == CD_MLOOPUV) { + data = (me->edit_btmesh)? &me->edit_btmesh->bm->ldata: &me->ldata; + tot = me->totloop; + } else { + data = (me->edit_btmesh)? &me->edit_btmesh->bm->pdata: &me->pdata; + tot = me->totpoly; + } + + index = CustomData_get_layer_index(data, type); + /* ok, deleting a non-active layer needs to preserve the active layer indices. to do this, we store a pointer to the .data member of both layer and the active layer, (to detect if we're deleting the active layer or not), then use the active @@ -94,15 +108,15 @@ static void delete_customdata_layer(bContext *C, Object *ob, CustomDataLayer *la stencillayerdata = data->layers[CustomData_get_stencil_layer_index(data, type)].data; CustomData_set_layer_active(data, type, layer - &data->layers[index]); - if(me->edit_mesh) { - EM_free_data_layer(me->edit_mesh, data, type); + if(me->edit_btmesh) { + BM_free_data_layer(me->edit_btmesh->bm, data, type); } else { - CustomData_free_layer_active(data, type, me->totface); + CustomData_free_layer_active(data, type, tot); mesh_update_customdata_pointers(me); } - if(!CustomData_has_layer(data, type) && (type == CD_MCOL && (ob->mode & OB_MODE_VERTEX_PAINT))) + if(!CustomData_has_layer(data, type) && (type == CD_MLOOPCOL && (ob->mode & OB_MODE_VERTEX_PAINT))) ED_object_toggle_modes(C, OB_MODE_VERTEX_PAINT); /* reconstruct active layer */ @@ -163,8 +177,13 @@ static void delete_customdata_layer(bContext *C, Object *ob, CustomDataLayer *la } } -static void copy_editface_active_customdata(EditMesh *em, int type, int index) +static void copy_editface_active_customdata(BMEditMesh *em, int type, int index) { +#if 1 /*BMESH_TODO*/ + (void)em; + (void)type; + (void)index; +#else EditFace *efa; int n= CustomData_get_active_layer(&em->fdata, type); @@ -172,41 +191,56 @@ static void copy_editface_active_customdata(EditMesh *em, int type, int index) void *data= CustomData_em_get_n(&em->fdata, efa->data, type, n); CustomData_em_set_n(&em->fdata, efa->data, type, index, data); } +#endif } int ED_mesh_uv_texture_add(bContext *C, Mesh *me, const char *name, int active_set) { - EditMesh *em; + BMEditMesh *em; int layernum; - if(me->edit_mesh) { - em= me->edit_mesh; + if(me->edit_btmesh) { + em= me->edit_btmesh; - layernum= CustomData_number_of_layers(&em->fdata, CD_MTFACE); + layernum= CustomData_number_of_layers(&em->bm->pdata, CD_MTEXPOLY); if(layernum >= MAX_MTFACE) return 0; - EM_add_data_layer(em, &em->fdata, CD_MTFACE, name); + BM_add_data_layer(em->bm, &em->bm->pdata, CD_MTEXPOLY); + CustomData_set_layer_active(&em->bm->pdata, CD_MTEXPOLY, layernum); + CustomData_set_layer_name(&em->bm->pdata, CD_MTEXPOLY, layernum, name); if(layernum) /* copy data from active UV */ copy_editface_active_customdata(em, CD_MTFACE, layernum); if(active_set || layernum==0) - CustomData_set_layer_active(&em->fdata, CD_MTFACE, layernum); + CustomData_set_layer_active(&em->bm->pdata, CD_MTEXPOLY, layernum); + + BM_add_data_layer(em->bm, &em->bm->ldata, CD_MLOOPUV); + CustomData_set_layer_name(&em->bm->ldata, CD_MLOOPUV, layernum, name); + + CustomData_set_layer_active(&em->bm->ldata, CD_MLOOPUV, layernum); + if(active_set || layernum==0) + CustomData_set_layer_active(&em->bm->ldata, CD_MLOOPUV, layernum); } else { - layernum= CustomData_number_of_layers(&me->fdata, CD_MTFACE); + layernum= CustomData_number_of_layers(&me->pdata, CD_MTEXPOLY); if(layernum >= MAX_MTFACE) return 0; - if(me->mtface) - CustomData_add_layer_named(&me->fdata, CD_MTFACE, CD_DUPLICATE, me->mtface, me->totface, name); - else - CustomData_add_layer_named(&me->fdata, CD_MTFACE, CD_DEFAULT, NULL, me->totface, name); - - if(active_set || layernum==0) - CustomData_set_layer_active(&me->fdata, CD_MTFACE, layernum); - + if(me->mtpoly) { + CustomData_add_layer_named(&me->pdata, CD_MTEXPOLY, CD_DUPLICATE, me->mtpoly, me->totpoly, name); + CustomData_add_layer_named(&me->ldata, CD_MLOOPUV, CD_DUPLICATE, me->mloopuv, me->totloop, name); + } else { + CustomData_add_layer_named(&me->pdata, CD_MTEXPOLY, CD_DEFAULT, NULL, me->totpoly, name); + CustomData_add_layer_named(&me->ldata, CD_MLOOPUV, CD_DEFAULT, NULL, me->totloop, name); + } + + if(active_set || layernum==0) { + CustomData_set_layer_active(&me->pdata, CD_MTEXPOLY, layernum); + CustomData_set_layer_active(&me->ldata, CD_MLOOPUV, layernum); + } + mesh_update_customdata_pointers(me); } @@ -218,17 +252,22 @@ int ED_mesh_uv_texture_add(bContext *C, Mesh *me, const char *name, int active_s int ED_mesh_uv_texture_remove(bContext *C, Object *ob, Mesh *me) { - CustomData *data= (me->edit_mesh)? &me->edit_mesh->fdata: &me->fdata; - CustomDataLayer *cdl; + CustomData *pdata = GET_CD_DATA(me, pdata), *ldata = GET_CD_DATA(me, ldata); + CustomDataLayer *cdlp, *cdlu; int index; - index= CustomData_get_active_layer_index(data, CD_MTFACE); - cdl= (index == -1) ? NULL: &data->layers[index]; + index= CustomData_get_active_layer_index(pdata, CD_MTEXPOLY); + cdlp= (index == -1)? NULL: &pdata->layers[index]; - if(!cdl) + index= CustomData_get_active_layer_index(ldata, CD_MLOOPUV); + cdlu= (index == -1)? NULL: &ldata->layers[index]; + + if (!cdlp || !cdlu) return 0; - delete_customdata_layer(C, ob, cdl); + delete_customdata_layer(C, ob, cdlp); + delete_customdata_layer(C, ob, cdlu); + DAG_id_tag_update(&me->id, 0); WM_event_add_notifier(C, NC_GEOM|ND_DATA, me); @@ -237,39 +276,42 @@ int ED_mesh_uv_texture_remove(bContext *C, Object *ob, Mesh *me) int ED_mesh_color_add(bContext *C, Scene *UNUSED(scene), Object *UNUSED(ob), Mesh *me, const char *name, int active_set) { - EditMesh *em; - MCol *mcol; + BMEditMesh *em; + MLoopCol *mcol; int layernum; - if(me->edit_mesh) { - em= me->edit_mesh; + if(me->edit_btmesh) { + em= me->edit_btmesh; - layernum= CustomData_number_of_layers(&em->fdata, CD_MCOL); + layernum= CustomData_number_of_layers(&em->bm->ldata, CD_MLOOPCOL); if(layernum >= MAX_MCOL) return 0; - EM_add_data_layer(em, &em->fdata, CD_MCOL, name); + BM_add_data_layer(em->bm, &em->bm->pdata, CD_MLOOPCOL); + CustomData_set_layer_active(&em->bm->ldata, CD_MLOOPCOL, layernum); + if(layernum) /* copy data from active vertex color layer */ copy_editface_active_customdata(em, CD_MCOL, layernum); if(active_set || layernum==0) - CustomData_set_layer_active(&em->fdata, CD_MCOL, layernum); + CustomData_set_layer_active(&em->bm->ldata, CD_MLOOPCOL, layernum); + } else { - layernum= CustomData_number_of_layers(&me->fdata, CD_MCOL); - if(layernum >= MAX_MCOL) + layernum= CustomData_number_of_layers(&me->ldata, CD_MLOOPCOL); + if(layernum >= CD_MLOOPCOL) return 0; - mcol= me->mcol; + mcol= me->mloopcol; - if(me->mcol) - CustomData_add_layer_named(&me->fdata, CD_MCOL, CD_DUPLICATE, me->mcol, me->totface, name); + if(me->mloopcol) + CustomData_add_layer_named(&me->ldata, CD_MLOOPCOL, CD_DUPLICATE, me->mloopcol, me->totloop, name); else - CustomData_add_layer_named(&me->fdata, CD_MCOL, CD_DEFAULT, NULL, me->totface, name); + CustomData_add_layer_named(&me->ldata, CD_MLOOPCOL, CD_DEFAULT, NULL, me->totloop, name); if(active_set || layernum==0) - CustomData_set_layer_active(&me->fdata, CD_MCOL, layernum); + CustomData_set_layer_active(&me->ldata, CD_MLOOPCOL, layernum); mesh_update_customdata_pointers(me); } @@ -282,12 +324,11 @@ int ED_mesh_color_add(bContext *C, Scene *UNUSED(scene), Object *UNUSED(ob), Mes int ED_mesh_color_remove(bContext *C, Object *ob, Mesh *me) { - CustomData *data= (me->edit_mesh)? &me->edit_mesh->fdata: &me->fdata; CustomDataLayer *cdl; int index; - index= CustomData_get_active_layer_index(data, CD_MCOL); - cdl= (index == -1)? NULL: &data->layers[index]; + index= CustomData_get_active_layer_index(&me->ldata, CD_MLOOPCOL); + cdl= (index == -1)? NULL: &me->ldata.layers[index]; if(!cdl) return 0; @@ -368,25 +409,25 @@ static int drop_named_image_invoke(bContext *C, wmOperator *op, wmEvent *event) return OPERATOR_CANCELLED; } - /* turn mesh in editmode */ - /* BKE_mesh_get/end_editmesh: ED_uvedit_assign_image also calls this */ + /* put mesh in editmode */ obedit= base->object; me= obedit->data; - if(me->edit_mesh==NULL) { - make_editMesh(scene, obedit); + if(me->edit_btmesh==NULL) { + EDBM_MakeEditBMesh(scene->toolsettings, scene, obedit); exitmode= 1; } - if(me->edit_mesh==NULL) + + if(me->edit_btmesh==NULL) return OPERATOR_CANCELLED; ED_uvedit_assign_image(scene, obedit, ima, NULL); if(exitmode) { - load_editMesh(scene, obedit); - free_editMesh(me->edit_mesh); - MEM_freeN(me->edit_mesh); - me->edit_mesh= NULL; + EDBM_LoadEditBMesh(scene, obedit); + EDBM_FreeEditBMesh(me->edit_btmesh); + MEM_freeN(me->edit_btmesh); + me->edit_btmesh= NULL; } /* dummie drop support; ensure view shows a result :) */ @@ -572,7 +613,7 @@ void ED_mesh_update(Mesh *mesh, bContext *C, int calc_edges) if(calc_edges || (mesh->totface && mesh->totedge == 0)) BKE_mesh_calc_edges(mesh, calc_edges); - mesh_calc_normals(mesh->mvert, mesh->totvert, mesh->mface, mesh->totface, NULL); + mesh_calc_normals(mesh->mvert, mesh->totvert, mesh->mloop, mesh->mpoly, mesh->totloop, mesh->totpoly, NULL, NULL, 0, NULL, NULL); DAG_id_tag_update(&mesh->id, 0); WM_event_add_notifier(C, NC_GEOM|ND_DATA, mesh); @@ -608,15 +649,15 @@ static void mesh_add_verts(Mesh *mesh, int len) mesh->totvert= totvert; } -void ED_mesh_transform(Mesh *me, float *mat) +void ED_mesh_transform(Mesh *mesh, float *mat) { int i; - MVert *mvert= me->mvert; + MVert *mvert= mesh->mvert; - for(i= 0; i < me->totvert; i++, mvert++) + for(i= 0; i < mesh->totvert; i++, mvert++) mul_m4_v3((float (*)[4])mat, mvert->co); - mesh_calc_normals(me->mvert, me->totvert, me->mface, me->totface, NULL); + mesh_calc_normals(mesh->mvert, mesh->totvert, mesh->mloop, mesh->mpoly, mesh->totloop, mesh->totpoly, NULL, NULL, 0, NULL, NULL); } static void mesh_add_edges(Mesh *mesh, int len) @@ -682,7 +723,7 @@ static void mesh_add_faces(Mesh *mesh, int len) /* void ED_mesh_geometry_add(Mesh *mesh, ReportList *reports, int verts, int edges, int faces) { - if(mesh->edit_mesh) { + if(mesh->edit_btmesh) { BKE_report(reports, RPT_ERROR, "Can't add geometry in edit mode."); return; } @@ -698,19 +739,18 @@ void ED_mesh_geometry_add(Mesh *mesh, ReportList *reports, int verts, int edges, void ED_mesh_faces_add(Mesh *mesh, ReportList *reports, int count) { - if(mesh->edit_mesh) { + if(mesh->edit_btmesh) { BKE_report(reports, RPT_ERROR, "Can't add faces in edit mode."); return; } - mesh_add_faces(mesh, count); } void ED_mesh_edges_add(Mesh *mesh, ReportList *reports, int count) { - if(mesh->edit_mesh) { + if(mesh->edit_btmesh) { BKE_report(reports, RPT_ERROR, "Can't add edges in edit mode."); - return; + return; } mesh_add_edges(mesh, count); @@ -718,7 +758,7 @@ void ED_mesh_edges_add(Mesh *mesh, ReportList *reports, int count) void ED_mesh_vertices_add(Mesh *mesh, ReportList *reports, int count) { - if(mesh->edit_mesh) { + if(mesh->edit_btmesh) { BKE_report(reports, RPT_ERROR, "Can't add vertices in edit mode."); return; } @@ -726,7 +766,7 @@ void ED_mesh_vertices_add(Mesh *mesh, ReportList *reports, int count) mesh_add_verts(mesh, count); } -void ED_mesh_calc_normals(Mesh *me) +void ED_mesh_calc_normals(Mesh *mesh) { - mesh_calc_normals(me->mvert, me->totvert, me->mface, me->totface, NULL); + mesh_calc_normals(mesh->mvert, mesh->totvert, mesh->mloop, mesh->mpoly, mesh->totloop, mesh->totpoly, NULL, NULL, 0, NULL, NULL); }