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.

This commit is contained in:
Joseph Eagar
2009-05-18 10:29:37 +00:00
parent 0ba863de29
commit 088579f36b
13 changed files with 456 additions and 335 deletions

View File

@@ -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);

View File

@@ -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))

View File

@@ -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);
}

View File

@@ -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);

View File

@@ -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 <stdlib.h>
#include <stdarg.h>
#include <string.h>
#include <math.h>
#include <float.h>
#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);
}

View File

@@ -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};

View File

@@ -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);
}

View File

@@ -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; i<eoutput->len; i++) {
BM_Select(bm, ((void**)eoutput->data.buf)[i], 1);
}
for (i=0; i<foutput->len; 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;
}

View File

@@ -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

View File

@@ -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;
}

View File

@@ -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);

View File

@@ -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);

View File

@@ -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;