diff options
Diffstat (limited to 'source/blender/editors/mesh/mesh_data.c')
-rw-r--r-- | source/blender/editors/mesh/mesh_data.c | 351 |
1 files changed, 200 insertions, 151 deletions
diff --git a/source/blender/editors/mesh/mesh_data.c b/source/blender/editors/mesh/mesh_data.c index 770fd68079a..69aeee48a4b 100644 --- a/source/blender/editors/mesh/mesh_data.c +++ b/source/blender/editors/mesh/mesh_data.c @@ -79,8 +79,8 @@ static void delete_customdata_layer(bContext *C, Object *ob, CustomDataLayer *la { Mesh *me = ob->data; CustomData *data; - void *actlayerdata, *rndlayerdata, *clonelayerdata, *stencillayerdata, *layerdata=layer->data; - int type= layer->type; + void *actlayerdata, *rndlayerdata, *clonelayerdata, *stencillayerdata, *layerdata = layer->data; + int type = layer->type; int index; int i, actindex, rndindex, cloneindex, stencilindex, tot; @@ -135,7 +135,7 @@ static void delete_customdata_layer(bContext *C, Object *ob, CustomDataLayer *la if (actlayerdata != layerdata) { /* find index */ actindex = CustomData_get_layer_index(data, type); - for (i=actindex; i<data->totlayer; i++) { + for (i = actindex; i < data->totlayer; i++) { if (data->layers[i].data == actlayerdata) { actindex = i - actindex; break; @@ -149,7 +149,7 @@ static void delete_customdata_layer(bContext *C, Object *ob, CustomDataLayer *la if (rndlayerdata != layerdata) { /* find index */ rndindex = CustomData_get_layer_index(data, type); - for (i=rndindex; i<data->totlayer; i++) { + for (i = rndindex; i < data->totlayer; i++) { if (data->layers[i].data == rndlayerdata) { rndindex = i - rndindex; break; @@ -163,7 +163,7 @@ static void delete_customdata_layer(bContext *C, Object *ob, CustomDataLayer *la if (clonelayerdata != layerdata) { /* find index */ cloneindex = CustomData_get_layer_index(data, type); - for (i=cloneindex; i<data->totlayer; i++) { + for (i = cloneindex; i < data->totlayer; i++) { if (data->layers[i].data == clonelayerdata) { cloneindex = i - cloneindex; break; @@ -177,7 +177,7 @@ static void delete_customdata_layer(bContext *C, Object *ob, CustomDataLayer *la if (stencillayerdata != layerdata) { /* find index */ stencilindex = CustomData_get_layer_index(data, type); - for (i=stencilindex; i<data->totlayer; i++) { + for (i = stencilindex; i < data->totlayer; i++) { if (data->layers[i].data == stencillayerdata) { stencilindex = i - stencilindex; break; @@ -189,26 +189,45 @@ static void delete_customdata_layer(bContext *C, Object *ob, CustomDataLayer *la } } -static void copy_editface_active_customdata(BMEditMesh *em, int type, int index) +/* copies from active to 'index' */ +static void editmesh_face_copy_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); + BMesh *bm = em->bm; + CustomData *pdata = &bm->pdata; + BMIter iter; + BMFace *efa; + const int n = CustomData_get_active_layer(pdata, type); + + /* ensure all current elements follow new customdata layout */ + BM_ITER(efa, &iter, bm, BM_FACES_OF_MESH, NULL) { + void *data = CustomData_bmesh_get_n(pdata, efa->head.data, type, n); + CustomData_bmesh_set_n(pdata, efa->head.data, type, index, data); + } +} - for (efa= em->faces.first; efa; efa= efa->next) { - void *data= CustomData_em_get_n(&em->fdata, efa->data, type, n); - CustomData_em_set_n(&em->fdata, efa->data, type, index, data); +/* copies from active to 'index' */ +static void editmesh_loop_copy_customdata(BMEditMesh *em, int type, int index) +{ + BMesh *bm = em->bm; + CustomData *ldata = &bm->ldata; + BMIter iter; + BMIter liter; + BMFace *efa; + BMLoop *loop; + const int n = CustomData_get_active_layer(ldata, type); + + /* ensure all current elements follow new customdata layout */ + BM_ITER(efa, &iter, bm, BM_FACES_OF_MESH, NULL) { + BM_ITER(loop, &liter, bm, BM_LOOPS_OF_FACE, efa) { + void *data = CustomData_bmesh_get_n(ldata, loop->head.data, type, n); + CustomData_bmesh_set_n(ldata, loop->head.data, type, index, data); + } } -#endif } -int ED_mesh_uv_loop_reset(struct bContext *C, struct Mesh *me) +int ED_mesh_uv_loop_reset_ex(struct bContext *C, struct Mesh *me, const int layernum) { - BMEditMesh *em= me->edit_btmesh; + BMEditMesh *em = me->edit_btmesh; MLoopUV *luv; BLI_array_declare(polylengths); int *polylengths = NULL; @@ -232,7 +251,7 @@ int ED_mesh_uv_loop_reset(struct bContext *C, struct Mesh *me) i = 0; BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) { - luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV); + luv = CustomData_bmesh_get_n(&em->bm->ldata, l->head.data, CD_MLOOPUV, layernum); BLI_array_append(uvs, luv->uv); i++; } @@ -244,14 +263,16 @@ int ED_mesh_uv_loop_reset(struct bContext *C, struct Mesh *me) /* Collect Mesh UVs */ MPoly *mp; + MLoopUV *mloouv; BLI_assert(CustomData_has_layer(&me->ldata, CD_MLOOPUV)); + mloouv = CustomData_get_layer_n(&me->ldata, CD_MLOOPUV, layernum); for (j = 0; j < me->totpoly; j++) { mp = &me->mpoly[j]; for (i = 0; i < mp->totloop; i++) { - luv = &me->mloopuv[mp->loopstart + i]; + luv = &mloouv[mp->loopstart + i]; BLI_array_append(uvs, luv->uv); } @@ -285,12 +306,12 @@ int ED_mesh_uv_loop_reset(struct bContext *C, struct Mesh *me) fuvs[3][0] = 0.0; fuvs[3][1] = 1.0; - /*make sure we ignore 2-sided faces*/ + /*make sure we ignore 2-sided faces*/ } else if (len > 2) { float fac = 0.0f, dfac = 1.0f / (float)len; - dfac *= M_PI*2; + dfac *= M_PI * 2; for (i = 0; i < len; i++) { fuvs[i][0] = 0.5f * sin(fac) + 0.5f; @@ -303,45 +324,55 @@ int ED_mesh_uv_loop_reset(struct bContext *C, struct Mesh *me) fuvs += len; } - /* BMESH_TODO: Copy poly UVs onto CD_MTFACE layer for tessellated faces */ - BLI_array_free(uvs); BLI_array_free(polylengths); DAG_id_tag_update(&me->id, 0); - WM_event_add_notifier(C, NC_GEOM|ND_DATA, me); + WM_event_add_notifier(C, NC_GEOM | ND_DATA, me); return 1; } +int ED_mesh_uv_loop_reset(struct bContext *C, struct Mesh *me) +{ + /* could be ldata or pdata */ + CustomData *pdata = GET_CD_DATA(me, pdata); + const int layernum = CustomData_get_active_layer_index(pdata, CD_MTEXPOLY); + return ED_mesh_uv_loop_reset_ex(C, me, layernum); +} + +/* note: keep in sync with ED_mesh_color_add */ int ED_mesh_uv_texture_add(bContext *C, Mesh *me, const char *name, int active_set) { BMEditMesh *em; int layernum; + short is_init = FALSE; + if (me->edit_btmesh) { - em= me->edit_btmesh; + em = me->edit_btmesh; layernum = CustomData_number_of_layers(&em->bm->pdata, CD_MTEXPOLY); if (layernum >= MAX_MTFACE) return -1; - BM_data_layer_add(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); - + /* CD_MTEXPOLY */ + BM_data_layer_add_named(em->bm, &em->bm->pdata, CD_MTEXPOLY, name); /* copy data from active UV */ - if (layernum) - copy_editface_active_customdata(em, CD_MTFACE, layernum); - + if (layernum) { + editmesh_face_copy_customdata(em, CD_MTEXPOLY, layernum); + } if (active_set || layernum == 0) { CustomData_set_layer_active(&em->bm->pdata, CD_MTEXPOLY, layernum); } - BM_data_layer_add(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); + /* CD_MLOOPUV */ + BM_data_layer_add_named(em->bm, &em->bm->ldata, CD_MLOOPUV, name); + /* copy data from active UV */ + if (layernum) { + editmesh_loop_copy_customdata(em, CD_MLOOPUV, layernum); + is_init = TRUE; + } if (active_set || layernum == 0) { CustomData_set_layer_active(&em->bm->ldata, CD_MLOOPUV, layernum); } @@ -355,6 +386,7 @@ int ED_mesh_uv_texture_add(bContext *C, Mesh *me, const char *name, int active_s 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); CustomData_add_layer_named(&me->fdata, CD_MTFACE, CD_DUPLICATE, me->mtface, me->totface, name); + is_init = TRUE; } else { CustomData_add_layer_named(&me->pdata, CD_MTEXPOLY, CD_DEFAULT, NULL, me->totpoly, name); @@ -372,10 +404,13 @@ int ED_mesh_uv_texture_add(bContext *C, Mesh *me, const char *name, int active_s mesh_update_customdata_pointers(me, TRUE); } - ED_mesh_uv_loop_reset(C, me); + /* don't overwrite our copied coords */ + if (is_init == FALSE) { + ED_mesh_uv_loop_reset_ex(C, me, layernum); + } DAG_id_tag_update(&me->id, 0); - WM_event_add_notifier(C, NC_GEOM|ND_DATA, me); + WM_event_add_notifier(C, NC_GEOM | ND_DATA, me); return layernum; } @@ -386,11 +421,11 @@ int ED_mesh_uv_texture_remove(bContext *C, Object *ob, Mesh *me) CustomDataLayer *cdlp, *cdlu; int index; - index= CustomData_get_active_layer_index(pdata, CD_MTEXPOLY); - cdlp= (index == -1)? NULL: &pdata->layers[index]; + index = CustomData_get_active_layer_index(pdata, CD_MTEXPOLY); + cdlp = (index == -1) ? NULL : &pdata->layers[index]; - index= CustomData_get_active_layer_index(ldata, CD_MLOOPUV); - cdlu= (index == -1)? NULL: &ldata->layers[index]; + index = CustomData_get_active_layer_index(ldata, CD_MLOOPUV); + cdlu = (index == -1) ? NULL : &ldata->layers[index]; if (!cdlp || !cdlu) return 0; @@ -399,38 +434,37 @@ int ED_mesh_uv_texture_remove(bContext *C, Object *ob, Mesh *me) delete_customdata_layer(C, ob, cdlu); DAG_id_tag_update(&me->id, 0); - WM_event_add_notifier(C, NC_GEOM|ND_DATA, me); + WM_event_add_notifier(C, NC_GEOM | ND_DATA, me); return 1; } +/* note: keep in sync with ED_mesh_uv_texture_add */ int ED_mesh_color_add(bContext *C, Scene *UNUSED(scene), Object *UNUSED(ob), Mesh *me, const char *name, int active_set) { BMEditMesh *em; int layernum; if (me->edit_btmesh) { - em= me->edit_btmesh; + em = me->edit_btmesh; - layernum= CustomData_number_of_layers(&em->bm->ldata, CD_MLOOPCOL); + layernum = CustomData_number_of_layers(&em->bm->ldata, CD_MLOOPCOL); if (layernum >= MAX_MCOL) { return -1; } - BM_data_layer_add(em->bm, &em->bm->ldata, CD_MLOOPCOL); - CustomData_set_layer_active(&em->bm->ldata, CD_MLOOPCOL, layernum); - + /* CD_MLOOPCOL */ + BM_data_layer_add_named(em->bm, &em->bm->ldata, CD_MLOOPCOL, name); /* copy data from active vertex color layer */ if (layernum) { - copy_editface_active_customdata(em, CD_MLOOPCOL, layernum); + editmesh_loop_copy_customdata(em, CD_MLOOPCOL, layernum); } - if (active_set || layernum == 0) { CustomData_set_layer_active(&em->bm->ldata, CD_MLOOPCOL, layernum); } } else { - layernum= CustomData_number_of_layers(&me->ldata, CD_MLOOPCOL); + layernum = CustomData_number_of_layers(&me->ldata, CD_MLOOPCOL); if (layernum >= CD_MLOOPCOL) { return -1; } @@ -444,7 +478,7 @@ int ED_mesh_color_add(bContext *C, Scene *UNUSED(scene), Object *UNUSED(ob), Mes CustomData_add_layer_named(&me->fdata, CD_MCOL, CD_DEFAULT, NULL, me->totface, name); } - if (active_set || layernum==0) { + if (active_set || layernum == 0) { CustomData_set_layer_active(&me->ldata, CD_MLOOPCOL, layernum); CustomData_set_layer_active(&me->fdata, CD_MCOL, layernum); } @@ -453,7 +487,7 @@ int ED_mesh_color_add(bContext *C, Scene *UNUSED(scene), Object *UNUSED(ob), Mes } DAG_id_tag_update(&me->id, 0); - WM_event_add_notifier(C, NC_GEOM|ND_DATA, me); + WM_event_add_notifier(C, NC_GEOM | ND_DATA, me); return layernum; } @@ -464,15 +498,15 @@ int ED_mesh_color_remove(bContext *C, Object *ob, Mesh *me) CustomDataLayer *cdl; int index; - index= CustomData_get_active_layer_index(ldata, CD_MLOOPCOL); - cdl= (index == -1)? NULL: &ldata->layers[index]; + index = CustomData_get_active_layer_index(ldata, CD_MLOOPCOL); + cdl = (index == -1) ? NULL : &ldata->layers[index]; if (!cdl) return 0; delete_customdata_layer(C, ob, cdl); DAG_id_tag_update(&me->id, 0); - WM_event_add_notifier(C, NC_GEOM|ND_DATA, me); + WM_event_add_notifier(C, NC_GEOM | ND_DATA, me); return 1; } @@ -483,7 +517,7 @@ int ED_mesh_color_remove_named(bContext *C, Object *ob, Mesh *me, const char *na CustomDataLayer *cdl; int index; - index= CustomData_get_named_layer_index(ldata, CD_MLOOPCOL, name); + index = CustomData_get_named_layer_index(ldata, CD_MLOOPCOL, name); cdl = (index == -1) ? NULL : &ldata->layers[index]; if (!cdl) @@ -491,7 +525,7 @@ int ED_mesh_color_remove_named(bContext *C, Object *ob, Mesh *me, const char *na delete_customdata_layer(C, ob, cdl); DAG_id_tag_update(&me->id, 0); - WM_event_add_notifier(C, NC_GEOM|ND_DATA, me); + WM_event_add_notifier(C, NC_GEOM | ND_DATA, me); return 1; } @@ -500,15 +534,15 @@ int ED_mesh_color_remove_named(bContext *C, Object *ob, Mesh *me, const char *na static int layers_poll(bContext *C) { - Object *ob= ED_object_context(C); - ID *data= (ob)? ob->data: NULL; - return (ob && !ob->id.lib && ob->type==OB_MESH && data && !data->lib); + Object *ob = ED_object_context(C); + ID *data = (ob) ? ob->data : NULL; + return (ob && !ob->id.lib && ob->type == OB_MESH && data && !data->lib); } static int mesh_uv_texture_add_exec(bContext *C, wmOperator *UNUSED(op)) { - Object *ob= ED_object_context(C); - Mesh *me= ob->data; + Object *ob = ED_object_context(C); + Mesh *me = ob->data; if (ED_mesh_uv_texture_add(C, me, NULL, TRUE) == -1) return OPERATOR_CANCELLED; @@ -528,23 +562,23 @@ void MESH_OT_uv_texture_add(wmOperatorType *ot) ot->exec = mesh_uv_texture_add_exec; /* flags */ - ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO; + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } static int drop_named_image_invoke(bContext *C, wmOperator *op, wmEvent *event) { - Main *bmain= CTX_data_main(C); - Scene *scene= CTX_data_scene(C); - View3D *v3d= CTX_wm_view3d(C); - Base *base= ED_view3d_give_base_under_cursor(C, event->mval); - Image *ima= NULL; + Main *bmain = CTX_data_main(C); + Scene *scene = CTX_data_scene(C); + View3D *v3d = CTX_wm_view3d(C); + Base *base = ED_view3d_give_base_under_cursor(C, event->mval); + Image *ima = NULL; Mesh *me; Object *obedit; - int exitmode= 0; - char name[MAX_ID_NAME-2]; + int exitmode = 0; + char name[MAX_ID_NAME - 2]; /* Check context */ - if (base==NULL || base->object->type!=OB_MESH) { + if (base == NULL || base->object->type != OB_MESH) { BKE_report(op->reports, RPT_ERROR, "Not an Object or Mesh"); return OPERATOR_CANCELLED; } @@ -554,11 +588,11 @@ static int drop_named_image_invoke(bContext *C, wmOperator *op, wmEvent *event) char path[FILE_MAX]; RNA_string_get(op->ptr, "filepath", path); - ima= BKE_add_image_file(path); + ima = BKE_add_image_file(path); } else { RNA_string_get(op->ptr, "name", name); - ima= (Image *)find_id("IM", name); + ima = (Image *)find_id("IM", name); } if (!ima) { @@ -568,22 +602,22 @@ static int drop_named_image_invoke(bContext *C, wmOperator *op, wmEvent *event) /* put mesh in editmode */ - obedit= base->object; - me= obedit->data; - if (me->edit_btmesh==NULL) { - EDBM_MakeEditBMesh(scene->toolsettings, scene, obedit); - exitmode= 1; + obedit = base->object; + me = obedit->data; + if (me->edit_btmesh == NULL) { + EDBM_mesh_make(scene->toolsettings, scene, obedit); + exitmode = 1; } - if (me->edit_btmesh==NULL) + if (me->edit_btmesh == NULL) return OPERATOR_CANCELLED; ED_uvedit_assign_image(bmain, scene, obedit, ima, NULL); if (exitmode) { - EDBM_LoadEditBMesh(scene, obedit); - EDBM_FreeEditBMesh(me->edit_btmesh); + EDBM_mesh_load(obedit); + EDBM_mesh_free(me->edit_btmesh); MEM_freeN(me->edit_btmesh); - me->edit_btmesh= NULL; + me->edit_btmesh = NULL; /* load_editMesh free's pointers used by CustomData layers which might be used by DerivedMesh too, * so signal to re-create DerivedMesh here (sergey) */ @@ -594,7 +628,7 @@ static int drop_named_image_invoke(bContext *C, wmOperator *op, wmEvent *event) if (v3d) v3d->flag2 |= V3D_SOLID_TEX; - WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data); + WM_event_add_notifier(C, NC_GEOM | ND_DATA, obedit->data); return OPERATOR_FINISHED; } @@ -614,14 +648,14 @@ void MESH_OT_drop_named_image(wmOperatorType *ot) ot->flag = OPTYPE_UNDO; /* properties */ - RNA_def_string(ot->srna, "name", "Image", MAX_ID_NAME-2, "Name", "Image name to assign"); + RNA_def_string(ot->srna, "name", "Image", MAX_ID_NAME - 2, "Name", "Image name to assign"); RNA_def_string(ot->srna, "filepath", "Path", FILE_MAX, "Filepath", "Path to image file"); } static int mesh_uv_texture_remove_exec(bContext *C, wmOperator *UNUSED(op)) { - Object *ob= ED_object_context(C); - Mesh *me= ob->data; + Object *ob = ED_object_context(C); + Mesh *me = ob->data; if (!ED_mesh_uv_texture_remove(C, ob, me)) return OPERATOR_CANCELLED; @@ -641,16 +675,16 @@ void MESH_OT_uv_texture_remove(wmOperatorType *ot) ot->exec = mesh_uv_texture_remove_exec; /* flags */ - ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO; + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } /*********************** vertex color operators ************************/ static int mesh_vertex_color_add_exec(bContext *C, wmOperator *UNUSED(op)) { - Scene *scene= CTX_data_scene(C); - Object *ob= ED_object_context(C); - Mesh *me= ob->data; + Scene *scene = CTX_data_scene(C); + Object *ob = ED_object_context(C); + Mesh *me = ob->data; if (ED_mesh_color_add(C, scene, ob, me, NULL, TRUE) == -1) return OPERATOR_CANCELLED; @@ -670,13 +704,13 @@ void MESH_OT_vertex_color_add(wmOperatorType *ot) ot->exec = mesh_vertex_color_add_exec; /* flags */ - ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO; + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } static int mesh_vertex_color_remove_exec(bContext *C, wmOperator *UNUSED(op)) { - Object *ob= ED_object_context(C); - Mesh *me= ob->data; + Object *ob = ED_object_context(C); + Mesh *me = ob->data; if (!ED_mesh_color_remove(C, ob, me)) return OPERATOR_CANCELLED; @@ -696,17 +730,17 @@ void MESH_OT_vertex_color_remove(wmOperatorType *ot) ot->poll = layers_poll; /* flags */ - ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO; + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } /*********************** sticky operators ************************/ static int mesh_sticky_add_exec(bContext *C, wmOperator *UNUSED(op)) { - Scene *scene= CTX_data_scene(C); - View3D *v3d= CTX_wm_view3d(C); - Object *ob= ED_object_context(C); - Mesh *me= ob->data; + Scene *scene = CTX_data_scene(C); + View3D *v3d = CTX_wm_view3d(C); + Object *ob = ED_object_context(C); + Mesh *me = ob->data; /* why is this commented out? */ #if 0 @@ -717,7 +751,7 @@ static int mesh_sticky_add_exec(bContext *C, wmOperator *UNUSED(op)) RE_make_sticky(scene, v3d); DAG_id_tag_update(&me->id, 0); - WM_event_add_notifier(C, NC_GEOM|ND_DATA, me); + WM_event_add_notifier(C, NC_GEOM | ND_DATA, me); return OPERATOR_FINISHED; } @@ -734,22 +768,22 @@ void MESH_OT_sticky_add(wmOperatorType *ot) ot->exec = mesh_sticky_add_exec; /* flags */ - ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO; + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } static int mesh_sticky_remove_exec(bContext *C, wmOperator *UNUSED(op)) { - Object *ob= ED_object_context(C); - Mesh *me= ob->data; + Object *ob = ED_object_context(C); + Mesh *me = ob->data; if (!me->msticky) return OPERATOR_CANCELLED; CustomData_free_layer_active(&me->vdata, CD_MSTICKY, me->totvert); - me->msticky= NULL; + me->msticky = NULL; DAG_id_tag_update(&me->id, 0); - WM_event_add_notifier(C, NC_GEOM|ND_DATA, me); + WM_event_add_notifier(C, NC_GEOM | ND_DATA, me); return OPERATOR_FINISHED; } @@ -766,7 +800,7 @@ void MESH_OT_sticky_remove(wmOperatorType *ot) ot->exec = mesh_sticky_remove_exec; /* flags */ - ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO; + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } /************************** Add Geometry Layers *************************/ @@ -778,7 +812,7 @@ void ED_mesh_update(Mesh *mesh, bContext *C, int calc_edges, int calc_tessface) int tessface_input = FALSE; if (mesh->totface > 0 && mesh->totpoly == 0) { - convert_mfaces_to_mpolys(mesh); + BKE_mesh_convert_mfaces_to_mpolys(mesh); /* would only be converting back again, don't bother */ tessface_input = TRUE; @@ -824,7 +858,7 @@ void ED_mesh_update(Mesh *mesh, bContext *C, int calc_edges, int calc_tessface) #endif DAG_id_tag_update(&mesh->id, 0); - WM_event_add_notifier(C, NC_GEOM|ND_DATA, mesh); + WM_event_add_notifier(C, NC_GEOM | ND_DATA, mesh); } static void mesh_add_verts(Mesh *mesh, int len) @@ -836,7 +870,7 @@ static void mesh_add_verts(Mesh *mesh, int len) if (len == 0) return; - totvert= mesh->totvert + len; + totvert = mesh->totvert + len; CustomData_copy(&mesh->vdata, &vdata, CD_MASK_MESH, CD_DEFAULT, totvert); CustomData_copy_data(&mesh->vdata, &vdata, 0, 0, mesh->totvert); @@ -844,25 +878,25 @@ static void mesh_add_verts(Mesh *mesh, int len) CustomData_add_layer(&vdata, CD_MVERT, CD_CALLOC, NULL, totvert); CustomData_free(&mesh->vdata, mesh->totvert); - mesh->vdata= vdata; + mesh->vdata = vdata; mesh_update_customdata_pointers(mesh, FALSE); /* scan the input list and insert the new vertices */ - mvert= &mesh->mvert[mesh->totvert]; - for (i=0; i<len; i++, mvert++) + mvert = &mesh->mvert[mesh->totvert]; + for (i = 0; i < len; i++, mvert++) mvert->flag |= SELECT; /* set final vertex list size */ - mesh->totvert= totvert; + mesh->totvert = totvert; } void ED_mesh_transform(Mesh *me, float *mat) { int i; - MVert *mvert= me->mvert; + MVert *mvert = me->mvert; - for (i= 0; i < me->totvert; i++, mvert++) + for (i = 0; i < me->totvert; i++, mvert++) mul_m4_v3((float (*)[4])mat, mvert->co); mesh_calc_normals_mapping(me->mvert, me->totvert, me->mloop, me->mpoly, me->totloop, me->totpoly, NULL, NULL, 0, NULL, NULL); @@ -877,7 +911,7 @@ static void mesh_add_edges(Mesh *mesh, int len) if (len == 0) return; - totedge= mesh->totedge+len; + totedge = mesh->totedge + len; /* update customdata */ CustomData_copy(&mesh->edata, &edata, CD_MASK_MESH, CD_DEFAULT, totedge); @@ -887,18 +921,18 @@ static void mesh_add_edges(Mesh *mesh, int len) CustomData_add_layer(&edata, CD_MEDGE, CD_CALLOC, NULL, totedge); CustomData_free(&mesh->edata, mesh->totedge); - mesh->edata= edata; + mesh->edata = edata; mesh_update_customdata_pointers(mesh, FALSE); /* new edges don't change tessellation */ /* set default flags */ - medge= &mesh->medge[mesh->totedge]; - for (i=0; i<len; i++, medge++) - medge->flag= ME_EDGEDRAW|ME_EDGERENDER|SELECT; + medge = &mesh->medge[mesh->totedge]; + for (i = 0; i < len; i++, medge++) + medge->flag = ME_EDGEDRAW | ME_EDGERENDER | SELECT; - mesh->totedge= totedge; + mesh->totedge = totedge; } -static void mesh_add_faces(Mesh *mesh, int len) +static void mesh_add_tessfaces(Mesh *mesh, int len) { CustomData fdata; MFace *mface; @@ -907,7 +941,7 @@ static void mesh_add_faces(Mesh *mesh, int len) if (len == 0) return; - totface= mesh->totface + len; /* new face count */ + totface = mesh->totface + len; /* new face count */ /* update customdata */ CustomData_copy(&mesh->fdata, &fdata, CD_MASK_MESH, CD_DEFAULT, totface); @@ -917,15 +951,15 @@ static void mesh_add_faces(Mesh *mesh, int len) CustomData_add_layer(&fdata, CD_MFACE, CD_CALLOC, NULL, totface); CustomData_free(&mesh->fdata, mesh->totface); - mesh->fdata= fdata; + mesh->fdata = fdata; mesh_update_customdata_pointers(mesh, TRUE); /* set default flags */ - mface= &mesh->mface[mesh->totface]; - for (i=0; i<len; i++, mface++) - mface->flag= ME_FACE_SEL; + mface = &mesh->mface[mesh->totface]; + for (i = 0; i < len; i++, mface++) + mface->flag = ME_FACE_SEL; - mesh->totface= totface; + mesh->totface = totface; } static void mesh_add_loops(Mesh *mesh, int len) @@ -936,7 +970,7 @@ static void mesh_add_loops(Mesh *mesh, int len) if (len == 0) return; - totloop= mesh->totloop + len; /* new face count */ + totloop = mesh->totloop + len; /* new face count */ /* update customdata */ CustomData_copy(&mesh->ldata, &ldata, CD_MASK_MESH, CD_DEFAULT, totloop); @@ -946,10 +980,10 @@ static void mesh_add_loops(Mesh *mesh, int len) CustomData_add_layer(&ldata, CD_MLOOP, CD_CALLOC, NULL, totloop); CustomData_free(&mesh->ldata, mesh->totloop); - mesh->ldata= ldata; + mesh->ldata = ldata; mesh_update_customdata_pointers(mesh, TRUE); - mesh->totloop= totloop; + mesh->totloop = totloop; } static void mesh_add_polys(Mesh *mesh, int len) @@ -961,7 +995,7 @@ static void mesh_add_polys(Mesh *mesh, int len) if (len == 0) return; - totpoly= mesh->totpoly + len; /* new face count */ + totpoly = mesh->totpoly + len; /* new face count */ /* update customdata */ CustomData_copy(&mesh->pdata, &pdata, CD_MASK_MESH, CD_DEFAULT, totpoly); @@ -971,15 +1005,15 @@ static void mesh_add_polys(Mesh *mesh, int len) CustomData_add_layer(&pdata, CD_MPOLY, CD_CALLOC, NULL, totpoly); CustomData_free(&mesh->pdata, mesh->totpoly); - mesh->pdata= pdata; + mesh->pdata = pdata; mesh_update_customdata_pointers(mesh, TRUE); /* set default flags */ - mpoly= &mesh->mpoly[mesh->totpoly]; - for (i=0; i<len; i++, mpoly++) - mpoly->flag= ME_FACE_SEL; + mpoly = &mesh->mpoly[mesh->totpoly]; + for (i = 0; i < len; i++, mpoly++) + mpoly->flag = ME_FACE_SEL; - mesh->totpoly= totpoly; + mesh->totpoly = totpoly; } static void mesh_remove_verts(Mesh *mesh, int len) @@ -989,11 +1023,11 @@ static void mesh_remove_verts(Mesh *mesh, int len) if (len == 0) return; - totvert= mesh->totvert - len; + totvert = mesh->totvert - len; CustomData_free_elem(&mesh->vdata, totvert, len); /* set final vertex list size */ - mesh->totvert= totvert; + mesh->totvert = totvert; } static void mesh_remove_edges(Mesh *mesh, int len) @@ -1003,10 +1037,10 @@ static void mesh_remove_edges(Mesh *mesh, int len) if (len == 0) return; - totedge= mesh->totedge - len; + totedge = mesh->totedge - len; CustomData_free_elem(&mesh->edata, totedge, len); - mesh->totedge= totedge; + mesh->totedge = totedge; } static void mesh_remove_faces(Mesh *mesh, int len) @@ -1016,10 +1050,10 @@ static void mesh_remove_faces(Mesh *mesh, int len) if (len == 0) return; - totface= mesh->totface - len; /* new face count */ + totface = mesh->totface - len; /* new face count */ CustomData_free_elem(&mesh->fdata, totface, len); - mesh->totface= totface; + mesh->totface = totface; } #if 0 @@ -1039,21 +1073,26 @@ void ED_mesh_geometry_add(Mesh *mesh, ReportList *reports, int verts, int edges, } #endif -void ED_mesh_faces_add(Mesh *mesh, ReportList *reports, int count) +void ED_mesh_tessfaces_add(Mesh *mesh, ReportList *reports, int count) { if (mesh->edit_btmesh) { - BKE_report(reports, RPT_ERROR, "Can't add faces in edit mode"); + BKE_report(reports, RPT_ERROR, "Can't add tessfaces in edit mode"); + return; + } + + if (mesh->mpoly) { + BKE_report(reports, RPT_ERROR, "Can't add tessfaces to a mesh that already has polygons"); return; } - mesh_add_faces(mesh, count); + mesh_add_tessfaces(mesh, count); } void ED_mesh_edges_add(Mesh *mesh, ReportList *reports, int count) { if (mesh->edit_btmesh) { BKE_report(reports, RPT_ERROR, "Can't add edges in edit mode"); - return; + return; } mesh_add_edges(mesh, count); @@ -1115,7 +1154,7 @@ void ED_mesh_loops_add(Mesh *mesh, ReportList *reports, int count) { if (mesh->edit_btmesh) { BKE_report(reports, RPT_ERROR, "Can't add loops in edit mode."); - return; + return; } mesh_add_loops(mesh, count); @@ -1143,3 +1182,13 @@ void ED_mesh_calc_normals(Mesh *mesh) NULL); #endif } + +void ED_mesh_calc_tessface(Mesh *mesh) +{ + if (mesh->edit_btmesh) { + BMEdit_RecalcTessellation(mesh->edit_btmesh); + } + else { + BKE_mesh_tessface_calc(mesh); + } +} |