From 088579f36bc5c9c0cf65c23cba68dfd64abb0bba Mon Sep 17 00:00:00 2001 From: Joseph Eagar Date: Mon, 18 May 2009 10:29:37 +0000 Subject: [PATCH] selection now works. next up, undo, and also need to track down an odd bug with face selection and the subdivide tool, which may be related to the bmesh derivedmesh not being refreshed often enough. also committing a start on a set of docs, which are in mediawiki format. --- source/blender/bmesh/bmesh.h | 1 + source/blender/bmesh/intern/bmesh_marking.c | 6 +- source/blender/bmesh/intern/bmesh_mesh.c | 2 +- source/blender/editors/include/ED_mesh.h | 10 +- source/blender/editors/mesh/bmesh_tools.c | 274 ++++++++++++++++++ source/blender/editors/mesh/bmeshutils.c | 180 +++++++++--- source/blender/editors/mesh/bmeshutils_mods.c | 4 +- source/blender/editors/mesh/editmesh_mods.c | 69 ----- source/blender/editors/mesh/editmesh_tools.c | 189 +----------- source/blender/editors/mesh/meshtools.c | 2 +- .../blender/editors/space_view3d/drawobject.c | 14 +- .../editors/space_view3d/view3d_header.c | 22 +- .../editors/space_view3d/view3d_select.c | 18 +- 13 files changed, 456 insertions(+), 335 deletions(-) create mode 100644 source/blender/editors/mesh/bmesh_tools.c diff --git a/source/blender/bmesh/bmesh.h b/source/blender/bmesh/bmesh.h index b0653a3fd90..64f8fc9a82d 100644 --- a/source/blender/bmesh/bmesh.h +++ b/source/blender/bmesh/bmesh.h @@ -300,6 +300,7 @@ void BM_Data_Facevert_Edgeinterp(struct BMesh *bm, struct BMVert *v1, struct BMV /*computes the centroid of a face, using the center of the bounding box*/ int BM_Compute_Face_Center(BMesh *bm, BMFace *f, float center[3]); +void BM_SelectMode_Flush(BMesh *bm); /*convert an editmesh to a bmesh*/ BMesh *editmesh_to_bmesh(struct EditMesh *em); diff --git a/source/blender/bmesh/intern/bmesh_marking.c b/source/blender/bmesh/intern/bmesh_marking.c index 8d76ca21dc6..970d1570f9b 100644 --- a/source/blender/bmesh/intern/bmesh_marking.c +++ b/source/blender/bmesh/intern/bmesh_marking.c @@ -27,7 +27,7 @@ * */ -void bmesh_selectmode_flush(BMesh *bm) +void BM_SelectMode_Flush(BMesh *bm) { BMEdge *e; BMLoop *l; @@ -178,7 +178,7 @@ void BM_Selectmode_Set(BMesh *bm, int selectmode) BM_Select_Edge(bm, e, 0); for(f = BMIter_New(&faces, bm, BM_FACES_OF_MESH, bm ); f; f= BMIter_Step(&faces)) bmesh_clear_sysflag(&(f->head), 0); - bmesh_selectmode_flush(bm); + BM_SelectMode_Flush(bm); } else if(bm->selectmode & BM_EDGE){ for(v= BMIter_New(&verts, bm, BM_VERTS_OF_MESH, bm ); v; v= BMIter_Step(&verts)) @@ -187,7 +187,7 @@ void BM_Selectmode_Set(BMesh *bm, int selectmode) if(bmesh_test_sysflag(&(e->head), BM_SELECT)) BM_Select_Edge(bm, e, 1); } - bmesh_selectmode_flush(bm); + BM_SelectMode_Flush(bm); } else if(bm->selectmode & BM_FACE){ for(e = BMIter_New(&edges, bm, BM_EDGES_OF_MESH, bm ); e; e= BMIter_Step(&edges)) diff --git a/source/blender/bmesh/intern/bmesh_mesh.c b/source/blender/bmesh/intern/bmesh_mesh.c index 10f780fb3cd..be983139249 100644 --- a/source/blender/bmesh/intern/bmesh_mesh.c +++ b/source/blender/bmesh/intern/bmesh_mesh.c @@ -273,5 +273,5 @@ void bmesh_end_edit(BMesh *bm, int flag){ /*compute normals, clear temp flags and flush selections*/ BM_Compute_Normals(bm); - bmesh_selectmode_flush(bm); + BM_SelectMode_Flush(bm); } diff --git a/source/blender/editors/include/ED_mesh.h b/source/blender/editors/include/ED_mesh.h index 97664c65af8..fb31d9813c3 100644 --- a/source/blender/editors/include/ED_mesh.h +++ b/source/blender/editors/include/ED_mesh.h @@ -90,6 +90,14 @@ void EDBM_selectmode_flush(struct BMEditMesh *em); int EDBM_get_actSelection(struct BMEditMesh *em, struct BMEditSelection *ese); void EDBM_editselection_center(struct BMEditMesh *em, float *center, struct BMEditSelection *ese); void EDBM_editselection_plane(struct BMEditMesh *em, float *plane, struct BMEditSelection *ese); +void EDBM_selectmode_set(struct BMEditMesh *em); +void EDBM_convertsel(struct BMEditMesh *em, short oldmode, short selectmode); + +int EDBM_check_backbuf(unsigned int index); +int EDBM_mask_init_backbuf_border(struct ViewContext *vc, short mcords[][2], short tot, short xmin, short ymin, short xmax, short ymax); +void EDBM_free_backbuf(void); +int EDBM_init_backbuf_border(struct ViewContext *vc, short xmin, short ymin, short xmax, short ymax); +int EDBM_init_backbuf_circle(struct ViewContext *vc, short xs, short ys, short rads); /* meshtools.c */ @@ -156,7 +164,7 @@ struct UvMapVert *EM_get_uv_map_vert(struct UvVertMap *vmap, unsigned int v); void EM_free_uv_vert_map(struct UvVertMap *vmap); /* editmesh_mods.c */ -extern unsigned int em_vertoffs, em_solidoffs, em_wireoffs; +extern unsigned int bm_vertoffs, bm_solidoffs, bm_wireoffs; void mouse_mesh(struct bContext *C, short mval[2], short extend); int EM_check_backbuf(unsigned int index); diff --git a/source/blender/editors/mesh/bmesh_tools.c b/source/blender/editors/mesh/bmesh_tools.c new file mode 100644 index 00000000000..acdb54bd08f --- /dev/null +++ b/source/blender/editors/mesh/bmesh_tools.c @@ -0,0 +1,274 @@ + /* $Id: bmesh_tools.c + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2004 by Blender Foundation. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): Joseph Eagar + * + * ***** END GPL LICENSE BLOCK ***** + */ +#include +#include +#include +#include +#include + +#include "MEM_guardedalloc.h" +#include "PIL_time.h" + +#include "BLO_sys_types.h" // for intptr_t support + +#include "DNA_mesh_types.h" +#include "DNA_material_types.h" +#include "DNA_meshdata_types.h" +#include "DNA_modifier_types.h" +#include "DNA_object_types.h" +#include "DNA_scene_types.h" +#include "DNA_screen_types.h" +#include "DNA_view3d_types.h" +#include "DNA_key_types.h" +#include "DNA_windowmanager_types.h" + +#include "RNA_types.h" +#include "RNA_define.h" +#include "RNA_access.h" + +#include "BLI_blenlib.h" +#include "BLI_arithb.h" +#include "BLI_editVert.h" +#include "BLI_rand.h" +#include "BLI_ghash.h" +#include "BLI_linklist.h" +#include "BLI_heap.h" + +#include "BKE_context.h" +#include "BKE_customdata.h" +#include "BKE_depsgraph.h" +#include "BKE_global.h" +#include "BKE_library.h" +#include "BKE_mesh.h" +#include "BKE_object.h" +#include "BKE_utildefines.h" +#include "BKE_bmesh.h" +#include "BKE_report.h" +#include "BKE_tessmesh.h" + +#include "BIF_gl.h" +#include "BIF_glutil.h" + +#include "WM_api.h" +#include "WM_types.h" + +#include "BMF_Api.h" + +#include "ED_mesh.h" +#include "ED_view3d.h" +#include "ED_util.h" +#include "ED_screen.h" +#include "BIF_transform.h" + +#include "UI_interface.h" + +#include "mesh_intern.h" +#include "bmesh.h" + +static int subdivide_exec(bContext *C, wmOperator *op) +{ + Object *obedit= CTX_data_edit_object(C); + Scene *scene = CTX_data_scene(C); + + BM_esubdivideflag(obedit, ((Mesh *)obedit->data)->edit_btmesh->bm, + 1, 0.0, scene->toolsettings->editbutflag, 1, 0); + + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); + + return OPERATOR_FINISHED; +} + +void MESH_OT_subdivide(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Subdivide"; + ot->idname= "MESH_OT_subdivide"; + + /* api callbacks */ + ot->exec= subdivide_exec; + ot->poll= ED_operator_editmesh; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} + +static int subdivide_multi_exec(bContext *C, wmOperator *op) +{ + Object *obedit= CTX_data_edit_object(C); + Scene *scene = CTX_data_scene(C); + BMEditMesh *em= ((Mesh *)obedit->data)->edit_btmesh; + + BM_esubdivideflag(obedit, em->bm, 1, 0.0, scene->toolsettings->editbutflag, RNA_int_get(op->ptr,"number_cuts"), 0); + + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); + + return OPERATOR_FINISHED; +} + +void MESH_OT_subdivide_multi(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Subdivide Multi"; + ot->idname= "MESH_OT_subdivide_multi"; + + /* api callbacks */ + ot->exec= subdivide_multi_exec; + ot->poll= ED_operator_editmesh; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* props */ + RNA_def_int(ot->srna, "number_cuts", 4, 1, 100, "Number of Cuts", "", 1, INT_MAX); +} + +static int subdivide_multi_fractal_exec(bContext *C, wmOperator *op) +{ + Object *obedit= CTX_data_edit_object(C); + Scene *scene = CTX_data_scene(C); + BMEditMesh *em= ((Mesh *)obedit->data)->edit_btmesh; + + BM_esubdivideflag(obedit, em->bm, 1, -(RNA_float_get(op->ptr, "random_factor")/100), scene->toolsettings->editbutflag, RNA_int_get(op->ptr, "number_cuts"), 0); + + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); + + return OPERATOR_FINISHED; +} + +void MESH_OT_subdivide_multi_fractal(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Subdivide Multi Fractal"; + ot->idname= "MESH_OT_subdivide_multi_fractal"; + + /* api callbacks */ + ot->exec= subdivide_multi_fractal_exec; + ot->poll= ED_operator_editmesh; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* properties */ + RNA_def_int(ot->srna, "number_cuts", 4, 1, 100, "Number of Cuts", "", 1, INT_MAX); + RNA_def_float(ot->srna, "random_factor", 5.0, 0.0f, FLT_MAX, "Random Factor", "", 0.0f, 1000.0f); +} + +static int subdivide_smooth_exec(bContext *C, wmOperator *op) +{ + Object *obedit= CTX_data_edit_object(C); + Scene *scene = CTX_data_scene(C); + BMEditMesh *em= ((Mesh *)obedit->data)->edit_btmesh; + + BM_esubdivideflag(obedit, em->bm, 1, 0.292f*RNA_float_get(op->ptr, "smoothness"), scene->toolsettings->editbutflag | B_SMOOTH, 1, 0); + + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); + + return OPERATOR_FINISHED; +} + +void MESH_OT_subdivide_smooth(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Subdivide Smooth"; + ot->idname= "MESH_OT_subdivide_smooth"; + + /* api callbacks */ + ot->exec= subdivide_smooth_exec; + ot->poll= ED_operator_editmesh; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* props */ + RNA_def_float(ot->srna, "smoothness", 1.0f, 0.0f, 1000.0f, "Smoothness", "", 0.0f, FLT_MAX); +} + +static int subdivs_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + uiMenuItem *head; + + head= uiPupMenuBegin("Subdivision Type", 0); + uiMenuItemsEnumO(head, "MESH_OT_subdivs", "type"); + uiPupMenuEnd(C, head); + + return OPERATOR_CANCELLED; +} + +static int subdivs_exec(bContext *C, wmOperator *op) +{ + switch(RNA_int_get(op->ptr, "type")) + { + case 0: // simple + subdivide_exec(C,op); + break; + case 1: // multi + subdivide_multi_exec(C,op); + break; + case 2: // fractal; + subdivide_multi_fractal_exec(C,op); + break; + case 3: //smooth + subdivide_smooth_exec(C,op); + break; + } + + return OPERATOR_FINISHED; +} + +void MESH_OT_subdivs(wmOperatorType *ot) +{ + static EnumPropertyItem type_items[]= { + {0, "SIMPLE", "Simple", ""}, + {1, "MULTI", "Multi", ""}, + {2, "FRACTAL", "Fractal", ""}, + {3, "SMOOTH", "Smooth", ""}, + {0, NULL, NULL}}; + + /* identifiers */ + ot->name= "subdivs"; + ot->idname= "MESH_OT_subdivs"; + + /* api callbacks */ + ot->invoke= subdivs_invoke; + ot->exec= subdivs_exec; + + ot->poll= ED_operator_editmesh; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /*props */ + RNA_def_enum(ot->srna, "type", type_items, 0, "Type", ""); + + /* this is temp, the ops are different, but they are called from subdivs, so all the possible props should be here as well*/ + RNA_def_int(ot->srna, "number_cuts", 4, 1, 10, "Number of Cuts", "", 1, INT_MAX); + RNA_def_float(ot->srna, "random_factor", 5.0, 0.0f, FLT_MAX, "Random Factor", "", 0.0f, 1000.0f); + RNA_def_float(ot->srna, "smoothness", 1.0f, 0.0f, 1000.0f, "Smoothness", "", 0.0f, FLT_MAX); + +} + diff --git a/source/blender/editors/mesh/bmeshutils.c b/source/blender/editors/mesh/bmeshutils.c index 4a0679bd748..99d4279c786 100644 --- a/source/blender/editors/mesh/bmeshutils.c +++ b/source/blender/editors/mesh/bmeshutils.c @@ -305,7 +305,7 @@ BMFace *EDBM_get_actFace(BMEditMesh *em, int sloppy) ese = em->selected.last; for (; ese; ese=ese->prev){ - if(ese->type == EDITFACE) { + if(ese->type == BM_FACE) { efa = (BMFace *)ese->data; if (BM_TestHFlag(efa, BM_HIDDEN)) efa= NULL; @@ -328,97 +328,85 @@ BMFace *EDBM_get_actFace(BMEditMesh *em, int sloppy) void EDBM_selectmode_flush(BMEditMesh *em) { + em->bm->selectmode = em->selectmode; + BM_SelectMode_Flush(em->bm); } int EDBM_get_actSelection(BMEditMesh *em, BMEditSelection *ese) { - ese->data = NULL; - return 0; -#if 0 - EditSelection *ese_last = em->selected.last; - EditFace *efa = EM_get_actFace(em, 0); + BMEditSelection *ese_last = em->selected.last; + BMFace *efa = EDBM_get_actFace(em, 0); ese->next = ese->prev = NULL; if (ese_last) { - if (ese_last->type == EDITFACE) { /* if there is an active face, use it over the last selected face */ + if (ese_last->type == BM_FACE) { /* if there is an active face, use it over the last selected face */ if (efa) { ese->data = (void *)efa; } else { ese->data = ese_last->data; } - ese->type = EDITFACE; + ese->type = BM_FACE; } else { ese->data = ese_last->data; ese->type = ese_last->type; } } else if (efa) { /* no */ ese->data = (void *)efa; - ese->type = EDITFACE; + ese->type = BM_FACE; } else { ese->data = NULL; return 0; } return 1; -#endif } /* ********* Selection History ************ */ static int EDBM_check_selection(BMEditMesh *em, void *data) { -#if 0 - EditSelection *ese; + BMEditSelection *ese; for(ese = em->selected.first; ese; ese = ese->next){ if(ese->data == data) return 1; } return 0; -#endif } void EDBM_remove_selection(BMEditMesh *em, void *data) { -#if 0 - EditSelection *ese; + BMEditSelection *ese; for(ese=em->selected.first; ese; ese = ese->next){ if(ese->data == data){ BLI_freelinkN(&(em->selected),ese); break; } } -#endif } void EDBM_store_selection(BMEditMesh *em, void *data) { -#if 0 - EditSelection *ese; - if(!EM_check_selection(em, data)){ - ese = (EditSelection*) MEM_callocN( sizeof(EditSelection), "Edit Selection"); - ese->type = type; + BMEditSelection *ese; + if(!EDBM_check_selection(em, data)){ + ese = (BMEditSelection*) MEM_callocN( sizeof(BMEditSelection), "BMEdit Selection"); + ese->type = ((BMHeader*)data)->type; ese->data = data; BLI_addtail(&(em->selected),ese); } -#endif } void EDBM_validate_selections(BMEditMesh *em) { -#if 0 - EditSelection *ese, *nextese; + BMEditSelection *ese, *nextese; ese = em->selected.first; while(ese){ nextese = ese->next; - if(ese->type == EDITVERT && !(((EditVert*)ese->data)->f & SELECT)) BLI_freelinkN(&(em->selected), ese); - else if(ese->type == EDITEDGE && !(((EditEdge*)ese->data)->f & SELECT)) BLI_freelinkN(&(em->selected), ese); - else if(ese->type == EDITFACE && !(((EditFace*)ese->data)->f & SELECT)) BLI_freelinkN(&(em->selected), ese); + if (!BM_TestHFlag(ese->data, BM_SELECT)) BLI_freelinkN(&(em->selected), ese); ese = nextese; } -#endif } void EDBM_clear_flag_all(BMEditMesh *em, int flag) @@ -448,13 +436,13 @@ void EDBM_clear_flag_all(BMEditMesh *em, int flag) static void EDBM_strip_selections(BMEditMesh *em) { -#if 0 - EditSelection *ese, *nextese; + BMEditSelection *ese, *nextese; + if(!(em->selectmode & SCE_SELECT_VERTEX)){ ese = em->selected.first; while(ese){ nextese = ese->next; - if(ese->type == EDITVERT) BLI_freelinkN(&(em->selected),ese); + if(ese->type == BM_VERT) BLI_freelinkN(&(em->selected),ese); ese = nextese; } } @@ -462,7 +450,7 @@ static void EDBM_strip_selections(BMEditMesh *em) ese=em->selected.first; while(ese){ nextese = ese->next; - if(ese->type == EDITEDGE) BLI_freelinkN(&(em->selected), ese); + if(ese->type == BM_EDGE) BLI_freelinkN(&(em->selected), ese); ese = nextese; } } @@ -470,11 +458,117 @@ static void EDBM_strip_selections(BMEditMesh *em) ese=em->selected.first; while(ese){ nextese = ese->next; - if(ese->type == EDITFACE) BLI_freelinkN(&(em->selected), ese); + if(ese->type == BM_FACE) BLI_freelinkN(&(em->selected), ese); ese = nextese; } } -#endif +} + + +/* when switching select mode, makes sure selection is consistant for editing */ +/* also for paranoia checks to make sure edge or face mode works */ +void EDBM_selectmode_set(BMEditMesh *em) +{ + BMVert *eve; + BMEdge *eed; + BMFace *efa; + BMIter iter; + + em->bm->selectmode = em->selectmode; + + EDBM_strip_selections(em); /*strip BMEditSelections from em->selected that are not relevant to new mode*/ + + if(em->selectmode & SCE_SELECT_VERTEX) { + BMIter iter; + + eed = BMIter_New(&iter, em->bm, BM_EDGES_OF_MESH, NULL); + for ( ; eed; eed=BMIter_Step(&iter)) BM_Select(em->bm, eed, 0); + + efa = BMIter_New(&iter, em->bm, BM_FACES_OF_MESH, NULL); + for ( ; efa; efa=BMIter_Step(&iter)) BM_Select(em->bm, efa, 0); + + EDBM_selectmode_flush(em); + } + else if(em->selectmode & SCE_SELECT_EDGE) { + /* deselect vertices, and select again based on edge select */ + eve = BMIter_New(&iter, em->bm, BM_VERTS_OF_MESH, NULL); + for ( ; eve; eve=BMIter_Step(&iter)) BM_Select(em->bm, eve, 0); + + eed = BMIter_New(&iter, em->bm, BM_EDGES_OF_MESH, NULL); + for ( ; eed; eed=BMIter_Step(&iter)) { + if (BM_TestHFlag(eed, BM_SELECT)) + BM_Select(em->bm, eed, 1); + } + + /* selects faces based on edge status */ + EDBM_selectmode_flush(em); + } + else if(em->selectmode & SCE_SELECT_FACE) { + /* deselect eges, and select again based on face select */ + eed = BMIter_New(&iter, em->bm, BM_EDGES_OF_MESH, NULL); + for ( ; eed; eed=BMIter_Step(&iter)) BM_Select(em->bm, eed, 0); + + efa = BMIter_New(&iter, em->bm, BM_FACES_OF_MESH, NULL); + for ( ; efa; efa=BMIter_Step(&iter)) { + if (BM_TestHFlag(efa, BM_SELECT)) + BM_Select(em->bm, efa, 1); + } + } +} + +void EDBM_convertsel(BMEditMesh *em, short oldmode, short selectmode) +{ + BMVert *eve; + BMEdge *eed; + BMFace *efa; + BMIter iter; + + /*have to find out what the selectionmode was previously*/ + if(oldmode == SCE_SELECT_VERTEX) { + if(selectmode == SCE_SELECT_EDGE) { + /*select all edges associated with every selected vertex*/ + eed = BMIter_New(&iter, em->bm, BM_EDGES_OF_MESH, NULL); + for ( ; eed; eed=BMIter_Step(&iter)) { + if(BM_TestHFlag(eed->v1, BM_SELECT)) BM_Select(em->bm, eed, 1); + else if(BM_TestHFlag(eed->v2, BM_SELECT)) BM_Select(em->bm, eed, 1); + } + } + else if(selectmode == SCE_SELECT_FACE) { + BMIter liter; + BMLoop *l; + + /*select all faces associated with every selected vertex*/ + efa = BMIter_New(&iter, em->bm, BM_FACES_OF_MESH, NULL); + for ( ; efa; efa=BMIter_Step(&iter)) { + l = BMIter_New(&liter, em->bm, BM_LOOPS_OF_FACE, efa); + for (; l; l=BMIter_Step(&liter)) { + if (BM_TestHFlag(l->v, BM_SELECT)) { + BM_Select(em->bm, efa, 1); + break; + } + } + } + } + } + + if(oldmode == SCE_SELECT_EDGE){ + if(selectmode == SCE_SELECT_FACE) { + BMIter liter; + BMLoop *l; + + /*select all faces associated with every selected vertex*/ + efa = BMIter_New(&iter, em->bm, BM_FACES_OF_MESH, NULL); + for ( ; efa; efa=BMIter_Step(&iter)) { + l = BMIter_New(&liter, em->bm, BM_LOOPS_OF_FACE, efa); + for (; l; l=BMIter_Step(&liter)) { + if (BM_TestHFlag(l->v, BM_SELECT)) { + BM_Select(em->bm, efa, 1); + break; + } + } + } + } + } } /* generic way to get data from an EditSelection type @@ -486,14 +580,14 @@ EM_editselection_plane */ void EDBM_editselection_center(BMEditMesh *em, float *center, BMEditSelection *ese) { - if (ese->type==EDITVERT) { + if (ese->type==BM_VERT) { BMVert *eve= ese->data; VecCopyf(center, eve->co); - } else if (ese->type==EDITEDGE) { + } else if (ese->type==BM_EDGE) { BMEdge *eed= ese->data; VecAddf(center, eed->v1->co, eed->v2->co); VecMulf(center, 0.5); - } else if (ese->type==EDITFACE) { + } else if (ese->type==BM_FACE) { BMFace *efa= ese->data; BM_Compute_Face_Center(em->bm, efa, center); } @@ -501,10 +595,10 @@ void EDBM_editselection_center(BMEditMesh *em, float *center, BMEditSelection *e void EDBM_editselection_normal(float *normal, BMEditSelection *ese) { - if (ese->type==EDITVERT) { + if (ese->type==BM_VERT) { BMVert *eve= ese->data; VecCopyf(normal, eve->no); - } else if (ese->type==EDITEDGE) { + } else if (ese->type==BM_EDGE) { BMEdge *eed= ese->data; float plane[3]; /* need a plane to correct the normal */ float vec[3]; /* temp vec storage */ @@ -520,7 +614,7 @@ void EDBM_editselection_normal(float *normal, BMEditSelection *ese) Crossf(normal, plane, vec); Normalize(normal); - } else if (ese->type==EDITFACE) { + } else if (ese->type==BM_FACE) { BMFace *efa= ese->data; VecCopyf(normal, efa->no); } @@ -531,7 +625,7 @@ also make the plane run allong an axis that is related to the geometry, because this is used for the manipulators Y axis.*/ void EDBM_editselection_plane(BMEditMesh *em, float *plane, BMEditSelection *ese) { - if (ese->type==EDITVERT) { + if (ese->type==BM_VERT) { BMVert *eve= ese->data; float vec[3]={0,0,0}; @@ -548,7 +642,7 @@ void EDBM_editselection_plane(BMEditMesh *em, float *plane, BMEditSelection *ese else vec[2]=1; Crossf(plane, eve->no, vec); } - } else if (ese->type==EDITEDGE) { + } else if (ese->type==BM_EDGE) { BMEdge *eed= ese->data; /*the plane is simple, it runs allong the edge @@ -561,7 +655,7 @@ void EDBM_editselection_plane(BMEditMesh *em, float *plane, BMEditSelection *ese else VecSubf(plane, eed->v1->co, eed->v2->co); - } else if (ese->type==EDITFACE) { + } else if (ese->type==BM_FACE) { BMFace *efa= ese->data; float vec[3] = {0.0f, 0.0f, 0.0f}; diff --git a/source/blender/editors/mesh/bmeshutils_mods.c b/source/blender/editors/mesh/bmeshutils_mods.c index 69426fdb8c1..47e8c4942e8 100644 --- a/source/blender/editors/mesh/bmeshutils_mods.c +++ b/source/blender/editors/mesh/bmeshutils_mods.c @@ -624,7 +624,7 @@ static int unified_findnearest(ViewContext *vc, BMVert **eve, BMEdge **eed, BMFa view3d_validate_backbuf(vc); if(em->selectmode & SCE_SELECT_VERTEX) - *eve= EDBM_findnearestvert(vc, &dist, SELECT, 0); + *eve= EDBM_findnearestvert(vc, &dist, BM_SELECT, 0); if(em->selectmode & SCE_SELECT_FACE) *efa= EDBM_findnearestface(vc, &dist); @@ -1264,7 +1264,7 @@ void mouse_mesh(bContext *C, short mval[2], short extend) } } else if(eed) { - if(!BM_TestHFlag(efa, BM_SELECT)) { + if(!BM_TestHFlag(eed, BM_SELECT)) { EDBM_store_selection(vc.em, eed); BM_Select(vc.em->bm, eed, 1); } diff --git a/source/blender/editors/mesh/editmesh_mods.c b/source/blender/editors/mesh/editmesh_mods.c index 7213df60e14..d7f1d4b479d 100644 --- a/source/blender/editors/mesh/editmesh_mods.c +++ b/source/blender/editors/mesh/editmesh_mods.c @@ -2737,75 +2737,6 @@ void MESH_OT_select_all_toggle(wmOperatorType *ot) static int bmesh_test_exec(bContext *C, wmOperator *op) { -#if 0 - Object *obedit= CTX_data_edit_object(C); - EditMesh *em= ((Mesh *)obedit->data)->edit_mesh; - EditMesh *em2; - BMesh *bm; - - bm = editmesh_to_bmesh(em); - -#if 1 /*edge subdivide test*/ - //esubdivideflag(obedit, em, 1, -(RNA_float_get(op->ptr, "random_factor")/100), scene->toolsettings->editbutflag, RNA_int_get(op->ptr, "number_cuts"), 0); - - BM_esubdivideflag(obedit, bm, SELECT, -0.05f, 0, G.rt==0?1:G.rt, 0); - //BM_esubdivideflag(obedit, bm, SELECT, 0, 0, G.rt==0?1:G.rt, SUBDIV_SELECT_INNER); - -#endif - -#if 0 - /*dissolve vert test*/ - { - BMOperator op; - BMOpSlot *eoutput, *foutput; - int i; - - BMO_Init_Op(&op, "dissolveverts"); - BMO_HeaderFlag_To_Slot(bm, &op, "verts", BM_SELECT, BM_VERT); - BMO_Exec_Op(bm, &op); - - BMO_Finish_Op(bm, &op); - } -#endif - -#if 0 - /*triangulator test code*/ - { - BMOperator op; - BMOpSlot *eoutput, *foutput; - int i; - - BMO_Init_Op(&op, "triangulate"); - BMO_HeaderFlag_To_Slot(bm, &op, "faces", BM_SELECT, BM_FACE); - BMO_Exec_Op(bm, &op); - - eoutput = BMO_GetSlot(&op, "edgeout"); - foutput = BMO_GetSlot(&op, "faceout"); - - /*select new faces/edges*/ - for (i=0; ilen; i++) { - BM_Select(bm, ((void**)eoutput->data.buf)[i], 1); - } - - for (i=0; ilen; i++) { - BM_Select(bm, ((void**)foutput->data.buf)[i], 1); - } - - BMO_Finish_Op(bm, &op); - - } -#endif - em2 = bmesh_to_editmesh(bm); - - /*free em's data, then copy the contents of the em2 struct - to em, then free the em2 struct.*/ - free_editMesh(em); - *em = *em2; - MEM_freeN(em2); - - BM_Free_Mesh(bm); - WM_event_add_notifier(C, NC_OBJECT|ND_DRAW|ND_TRANSFORM|ND_GEOM_SELECT, obedit); -#endif return OPERATOR_FINISHED; } diff --git a/source/blender/editors/mesh/editmesh_tools.c b/source/blender/editors/mesh/editmesh_tools.c index 0342a39f855..046366eb553 100644 --- a/source/blender/editors/mesh/editmesh_tools.c +++ b/source/blender/editors/mesh/editmesh_tools.c @@ -75,6 +75,8 @@ editmesh_tool.c: UI called tools for editmesh, geometry changes here, otherwise #include "BKE_utildefines.h" #include "BKE_bmesh.h" #include "BKE_report.h" +#include "BKE_tessmesh.h" + #include "BIF_gl.h" #include "BIF_glutil.h" @@ -6471,193 +6473,6 @@ void MESH_OT_mirror_colors(wmOperatorType *ot) /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; } - -static int subdivide_exec(bContext *C, wmOperator *op) -{ - Object *obedit= CTX_data_edit_object(C); - Scene *scene = CTX_data_scene(C); - EditMesh *em= EM_GetEditMesh((Mesh *)obedit->data); - - BM_esubdivideflag_conv(obedit, em, 1, 0.0, scene->toolsettings->editbutflag, 1, 0); - - WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); - - EM_EndEditMesh(obedit->data, em); - return OPERATOR_FINISHED; -} - -void MESH_OT_subdivide(wmOperatorType *ot) -{ - /* identifiers */ - ot->name= "Subdivide"; - ot->idname= "MESH_OT_subdivide"; - - /* api callbacks */ - ot->exec= subdivide_exec; - ot->poll= ED_operator_editmesh; - - /* flags */ - ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; -} - -static int subdivide_multi_exec(bContext *C, wmOperator *op) -{ - Object *obedit= CTX_data_edit_object(C); - Scene *scene = CTX_data_scene(C); - EditMesh *em= EM_GetEditMesh((Mesh *)obedit->data); - - BM_esubdivideflag_conv(obedit, em, 1, 0.0, scene->toolsettings->editbutflag, RNA_int_get(op->ptr,"number_cuts"), 0); - - WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); - - EM_EndEditMesh(obedit->data, em); - return OPERATOR_FINISHED; -} - -void MESH_OT_subdivide_multi(wmOperatorType *ot) -{ - /* identifiers */ - ot->name= "Subdivide Multi"; - ot->idname= "MESH_OT_subdivide_multi"; - - /* api callbacks */ - ot->exec= subdivide_multi_exec; - ot->poll= ED_operator_editmesh; - - /* flags */ - ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; - - /* props */ - RNA_def_int(ot->srna, "number_cuts", 4, 1, 100, "Number of Cuts", "", 1, INT_MAX); -} - -static int subdivide_multi_fractal_exec(bContext *C, wmOperator *op) -{ - Object *obedit= CTX_data_edit_object(C); - Scene *scene = CTX_data_scene(C); - EditMesh *em= EM_GetEditMesh((Mesh *)obedit->data); - - BM_esubdivideflag_conv(obedit, em, 1, -(RNA_float_get(op->ptr, "random_factor")/100), scene->toolsettings->editbutflag, RNA_int_get(op->ptr, "number_cuts"), 0); - - WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); - - EM_EndEditMesh(obedit->data, em); - return OPERATOR_FINISHED; -} - -void MESH_OT_subdivide_multi_fractal(wmOperatorType *ot) -{ - /* identifiers */ - ot->name= "Subdivide Multi Fractal"; - ot->idname= "MESH_OT_subdivide_multi_fractal"; - - /* api callbacks */ - ot->exec= subdivide_multi_fractal_exec; - ot->poll= ED_operator_editmesh; - - /* flags */ - ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; - - /* properties */ - RNA_def_int(ot->srna, "number_cuts", 4, 1, 100, "Number of Cuts", "", 1, INT_MAX); - RNA_def_float(ot->srna, "random_factor", 5.0, 0.0f, FLT_MAX, "Random Factor", "", 0.0f, 1000.0f); -} - -static int subdivide_smooth_exec(bContext *C, wmOperator *op) -{ - Object *obedit= CTX_data_edit_object(C); - Scene *scene = CTX_data_scene(C); - EditMesh *em= EM_GetEditMesh((Mesh *)obedit->data); - - BM_esubdivideflag_conv(obedit, em, 1, 0.292f*RNA_float_get(op->ptr, "smoothness"), scene->toolsettings->editbutflag | B_SMOOTH, 1, 0); - - WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); - - EM_EndEditMesh(obedit->data, em); - return OPERATOR_FINISHED; -} - -void MESH_OT_subdivide_smooth(wmOperatorType *ot) -{ - /* identifiers */ - ot->name= "Subdivide Smooth"; - ot->idname= "MESH_OT_subdivide_smooth"; - - /* api callbacks */ - ot->exec= subdivide_smooth_exec; - ot->poll= ED_operator_editmesh; - - /* flags */ - ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; - - /* props */ - RNA_def_float(ot->srna, "smoothness", 1.0f, 0.0f, 1000.0f, "Smoothness", "", 0.0f, FLT_MAX); -} - -static int subdivs_invoke(bContext *C, wmOperator *op, wmEvent *event) -{ - uiMenuItem *head; - - head= uiPupMenuBegin("Subdivision Type", 0); - uiMenuItemsEnumO(head, "MESH_OT_subdivs", "type"); - uiPupMenuEnd(C, head); - - return OPERATOR_CANCELLED; -} - -static int subdivs_exec(bContext *C, wmOperator *op) -{ - switch(RNA_int_get(op->ptr, "type")) - { - case 0: // simple - subdivide_exec(C,op); - break; - case 1: // multi - subdivide_multi_exec(C,op); - break; - case 2: // fractal; - subdivide_multi_fractal_exec(C,op); - break; - case 3: //smooth - subdivide_smooth_exec(C,op); - break; - } - - return OPERATOR_FINISHED; -} - -void MESH_OT_subdivs(wmOperatorType *ot) -{ - static EnumPropertyItem type_items[]= { - {0, "SIMPLE", "Simple", ""}, - {1, "MULTI", "Multi", ""}, - {2, "FRACTAL", "Fractal", ""}, - {3, "SMOOTH", "Smooth", ""}, - {0, NULL, NULL}}; - - /* identifiers */ - ot->name= "subdivs"; - ot->idname= "MESH_OT_subdivs"; - - /* api callbacks */ - ot->invoke= subdivs_invoke; - ot->exec= subdivs_exec; - - ot->poll= ED_operator_editmesh; - - /* flags */ - ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; - - /*props */ - RNA_def_enum(ot->srna, "type", type_items, 0, "Type", ""); - - /* this is temp, the ops are different, but they are called from subdivs, so all the possible props should be here as well*/ - RNA_def_int(ot->srna, "number_cuts", 4, 1, 10, "Number of Cuts", "", 1, INT_MAX); - RNA_def_float(ot->srna, "random_factor", 5.0, 0.0f, FLT_MAX, "Random Factor", "", 0.0f, 1000.0f); - RNA_def_float(ot->srna, "smoothness", 1.0f, 0.0f, 1000.0f, "Smoothness", "", 0.0f, FLT_MAX); - -} - /* ************************************* */ /* note; the EM_selectmode_set() calls here illustrate how badly constructed it all is... from before the diff --git a/source/blender/editors/mesh/meshtools.c b/source/blender/editors/mesh/meshtools.c index 6f4560be895..5dbb402f8b4 100644 --- a/source/blender/editors/mesh/meshtools.c +++ b/source/blender/editors/mesh/meshtools.c @@ -851,7 +851,7 @@ BMVert *editmesh_get_x_mirror_vert(Object *ob, BMEditMesh *em, float *co) poinval= mesh_octree_table(ob, em, vec, 'u'); if(poinval != -1) - return (EditVert *)(poinval); + return (BMVert *)(poinval); return NULL; } diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c index ff501fbc6f7..c22d159b405 100644 --- a/source/blender/editors/space_view3d/drawobject.c +++ b/source/blender/editors/space_view3d/drawobject.c @@ -5413,22 +5413,22 @@ void draw_object_backbufsel(Scene *scene, View3D *v3d, RegionView3D *rv3d, Objec bbs_mesh_solid_EM(em, scene, v3d, ob, dm, scene->selectmode & SCE_SELECT_FACE); if(scene->selectmode & SCE_SELECT_FACE) - em_solidoffs = 1+em->bm->totface; + bm_solidoffs = 1+em->bm->totface; else - em_solidoffs= 1; + bm_solidoffs= 1; bglPolygonOffset(rv3d->dist, 1.0); // we draw edges always, for loop (select) tools - bbs_mesh_wire(em, dm, em_solidoffs); - em_wireoffs= em_solidoffs + em->bm->totedge; + bbs_mesh_wire(em, dm, bm_solidoffs); + bm_wireoffs= bm_solidoffs + em->bm->totedge; // we draw verts if vert select mode or if in transform (for snap). if(scene->selectmode & SCE_SELECT_VERTEX || G.moving & G_TRANSFORM_EDIT) { - bbs_mesh_verts(em, dm, em_wireoffs); - em_vertoffs= em_wireoffs + em->bm->totvert; + bbs_mesh_verts(em, dm, bm_wireoffs); + bm_vertoffs= bm_wireoffs + em->bm->totvert; } - else em_vertoffs= em_wireoffs; + else bm_vertoffs= bm_wireoffs; bglPolygonOffset(rv3d->dist, 0.0); diff --git a/source/blender/editors/space_view3d/view3d_header.c b/source/blender/editors/space_view3d/view3d_header.c index 28db2f45094..20f24ba3958 100644 --- a/source/blender/editors/space_view3d/view3d_header.c +++ b/source/blender/editors/space_view3d/view3d_header.c @@ -64,6 +64,7 @@ #include "BKE_particle.h" #include "BKE_screen.h" #include "BKE_utildefines.h" /* for VECCOPY */ +#include "BKE_tessmesh.h" #include "ED_armature.h" #include "ED_particle.h" @@ -4882,11 +4883,11 @@ static void do_view3d_header_buttons(bContext *C, void *arg, int event) Base *basact= CTX_data_active_base(C); Object *ob= CTX_data_active_object(C); Object *obedit = CTX_data_edit_object(C); - EditMesh *em= NULL; + BMEditMesh *em= NULL; int bit, ctrl= win->eventstate->ctrl, shift= win->eventstate->shift; if(obedit && obedit->type==OB_MESH) { - em= EM_GetEditMesh((Mesh *)obedit->data); + em= ((Mesh *)obedit->data)->edit_btmesh; } /* watch it: if sa->win does not exist, check that when calling direct drawing routines */ @@ -5012,7 +5013,7 @@ static void do_view3d_header_buttons(bContext *C, void *arg, int event) if(shift==0 || em->selectmode==0) em->selectmode= SCE_SELECT_VERTEX; scene->selectmode= em->selectmode; - EM_selectmode_set(em); + EDBM_selectmode_set(em); WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); ED_undo_push(C, "Selectmode Set: Vertex"); } @@ -5021,12 +5022,12 @@ static void do_view3d_header_buttons(bContext *C, void *arg, int event) if(em) { if(shift==0 || em->selectmode==0){ if( (em->selectmode ^ SCE_SELECT_EDGE) == SCE_SELECT_VERTEX){ - if(ctrl) EM_convertsel(em, SCE_SELECT_VERTEX,SCE_SELECT_EDGE); + if(ctrl) EDBM_convertsel(em, SCE_SELECT_VERTEX,SCE_SELECT_EDGE); } em->selectmode = SCE_SELECT_EDGE; } scene->selectmode= em->selectmode; - EM_selectmode_set(em); + EDBM_selectmode_set(em); WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); ED_undo_push(C, "Selectmode Set: Edge"); } @@ -5035,12 +5036,13 @@ static void do_view3d_header_buttons(bContext *C, void *arg, int event) if(em) { if( shift==0 || em->selectmode==0){ if( ((scene->selectmode ^ SCE_SELECT_FACE) == SCE_SELECT_VERTEX) || ((scene->selectmode ^ SCE_SELECT_FACE) == SCE_SELECT_EDGE)){ - if(ctrl) EM_convertsel(em, (scene->selectmode ^ SCE_SELECT_FACE),SCE_SELECT_FACE); + if(ctrl) + EDBM_convertsel(em, (scene->selectmode ^ SCE_SELECT_FACE),SCE_SELECT_FACE); } em->selectmode = SCE_SELECT_FACE; } scene->selectmode= em->selectmode; - EM_selectmode_set(em); + EDBM_selectmode_set(em); WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); ED_undo_push(C, "Selectmode Set: Face"); } @@ -5117,8 +5119,6 @@ static void do_view3d_header_buttons(bContext *C, void *arg, int event) } break; } - - EM_EndEditMesh(obedit->data, em); } static void view3d_header_pulldowns(const bContext *C, uiBlock *block, Object *ob, int *xcoord, int yco) @@ -5483,7 +5483,7 @@ void view3d_header_buttons(const bContext *C, ARegion *ar) /* selection modus */ if(obedit && (obedit->type == OB_MESH)) { - EditMesh *em= EM_GetEditMesh((Mesh *)obedit->data); + BMEditMesh *em= ((Mesh *)obedit->data)->edit_btmesh; uiBlockBeginAlign(block); uiDefIconButBitS(block, TOG, SCE_SELECT_VERTEX, B_SEL_VERT, ICON_VERTEXSEL, xco,yco,XIC,YIC, &em->selectmode, 1.0, 0.0, 0, 0, "Vertex select mode (Ctrl Tab 1)"); @@ -5499,8 +5499,6 @@ void view3d_header_buttons(const bContext *C, ARegion *ar) } uiBlockEndAlign(block); xco+= 20; - - EM_EndEditMesh(obedit->data, em); } else if(G.f & G_PARTICLEEDIT) { uiBlockBeginAlign(block); diff --git a/source/blender/editors/space_view3d/view3d_select.c b/source/blender/editors/space_view3d/view3d_select.c index 6db7ae19cd3..d822015d6e0 100644 --- a/source/blender/editors/space_view3d/view3d_select.c +++ b/source/blender/editors/space_view3d/view3d_select.c @@ -154,7 +154,7 @@ void EM_backbuf_checkAndSelectVerts(BMEditMesh *em, int select) { BMVert *eve; BMIter iter; - int index= em_wireoffs; + int index= bm_wireoffs; eve = BMIter_New(&iter, em->bm, BM_VERTS_OF_MESH, NULL); for ( ; eve; eve=BMIter_Step(&iter), index++) { @@ -170,7 +170,7 @@ void EM_backbuf_checkAndSelectEdges(BMEditMesh *em, int select) { BMEdge *eed; BMIter iter; - int index= em_solidoffs; + int index= bm_solidoffs; eed = BMIter_New(&iter, em->bm, BM_EDGES_OF_MESH, NULL); for ( ; eed; eed=BMIter_Step(&iter), index++) { @@ -418,7 +418,7 @@ static void do_lasso_select_mesh__doSelectEdge(void *userData, BMEdge *eed, int { struct { ViewContext vc; rcti *rect; short (*mcords)[2], moves, select, pass, done; } *data = userData; - if (EM_check_backbuf(em_solidoffs+index)) { + if (EM_check_backbuf(bm_solidoffs+index)) { if (data->pass==0) { if ( edge_fully_inside_rect(data->rect, x0, y0, x1, y1) && lasso_inside(data->mcords, data->moves, x0, y0) && @@ -653,7 +653,7 @@ static void do_lasso_select_facemode(ViewContext *vc, short mcords[][2], short m if(me==NULL || me->mtface==NULL) return; if(me->totface==0) return; - em_vertoffs= me->totface+1; /* max index array */ + bm_vertoffs= me->totface+1; /* max index array */ lasso_select_boundbox(&rect, mcords, moves); EM_mask_init_backbuf_border(vc, mcords, moves, rect.xmin, rect.ymin, rect.xmax, rect.ymax); @@ -1260,7 +1260,7 @@ static void do_mesh_box_select__doSelectEdge(void *userData, BMEdge *eed, int x0 { struct { ViewContext vc; rcti *rect; short select, pass, done; } *data = userData; - if(EM_check_backbuf(em_solidoffs+index)) { + if(EM_check_backbuf(bm_solidoffs+index)) { if (data->pass==0) { if (edge_fully_inside_rect(data->rect, x0, y0, x1, y1)) { BM_Select_Edge(data->vc.em->bm, eed, data->select); @@ -1297,7 +1297,7 @@ static void do_mesh_box_select(ViewContext *vc, rcti *rect, int select) data.pass = 0; data.done = 0; - bbsel= EM_init_backbuf_border(vc, rect->xmin, rect->ymin, rect->xmax, rect->ymax); + bbsel= EDBM_init_backbuf_border(vc, rect->xmin, rect->ymin, rect->xmax, rect->ymax); if(vc->scene->selectmode & SCE_SELECT_VERTEX) { if (bbsel) { @@ -1658,9 +1658,9 @@ static void mesh_circle_select(ViewContext *vc, int selecting, short *mval, floa Mesh *me = ob?ob->data:NULL; if (me) { - em_vertoffs= me->totface+1; /* max index array */ + bm_vertoffs= me->totface+1; /* max index array */ - bbsel= EM_init_backbuf_circle(vc, mval[0], mval[1], (short)(rad+1.0)); + bbsel= EDBM_init_backbuf_circle(vc, mval[0], mval[1], (short)(rad+1.0)); EM_backbuf_checkAndSelectTFaces(me, selecting==LEFTMOUSE); EM_free_backbuf(); @@ -1670,7 +1670,7 @@ static void mesh_circle_select(ViewContext *vc, int selecting, short *mval, floa else { struct {ViewContext *vc; short select, mval[2]; float radius; } data; - bbsel= EM_init_backbuf_circle(vc, mval[0], mval[1], (short)(rad+1.0)); + bbsel= EDBM_init_backbuf_circle(vc, mval[0], mval[1], (short)(rad+1.0)); vc->em= ((Mesh *)vc->obedit->data)->edit_btmesh; data.select = selecting;