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;