Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorTon Roosendaal <ton@blender.org>2009-01-31 19:54:37 +0300
committerTon Roosendaal <ton@blender.org>2009-01-31 19:54:37 +0300
commit59534ac58976515500fc174883d9a6f6d3217d62 (patch)
treef3055a92785103959724588e64c172095202c5a6 /source
parentdb2bb765f9d2a0ea7209cab7a720c1cbbc2c5683 (diff)
2.5
Edit Mesh Added the two other 'select similar' ops, for edge and face. For testing fun I've put these ones as first keys using the modifier order feature. So it's now: SHIFT+G : similar vertex CTRL+SHIFT+G: similar edge SHIFT+CTRL+G: similar face Not very useful here; but I think this can work well to map a double amount of options under mouseclicks. Power user config stuff!
Diffstat (limited to 'source')
-rw-r--r--source/blender/editors/mesh/editmesh_mods.c185
-rw-r--r--source/blender/editors/mesh/mesh_intern.h2
-rw-r--r--source/blender/editors/mesh/mesh_ops.c7
-rw-r--r--source/blender/windowmanager/intern/wm_event_system.c27
4 files changed, 118 insertions, 103 deletions
diff --git a/source/blender/editors/mesh/editmesh_mods.c b/source/blender/editors/mesh/editmesh_mods.c
index c3d496e7196..c32fe9cfca9 100644
--- a/source/blender/editors/mesh/editmesh_mods.c
+++ b/source/blender/editors/mesh/editmesh_mods.c
@@ -654,12 +654,22 @@ FACES GROUP
mode 6: same co-planer
*/
+static EnumPropertyItem prop_simface_types[] = {
+ {1, "MATERIAL", "Material", ""},
+ {2, "IMAGE", "Image", ""},
+ {3, "AREA", "Area", ""},
+ {4, "PERIMETER", "Perimeter", ""},
+ {5, "NORMAL", "Normal", ""},
+ {6, "COPLANAR", "Co-planar", ""},
+ {0, NULL, NULL, NULL}
+};
+
+
/* this as a way to compare the ares, perim of 2 faces thay will scale to different sizes
*0.5 so smaller faces arnt ALWAYS selected with a thresh of 1.0 */
#define SCALE_CMP(a,b) ((a+a*thresh >= b) && (a-(a*thresh*0.5) <= b))
-
-int facegroup_select(EditMesh *em, short mode)
+static int similar_face_select__internal(Scene *scene, EditMesh *em, int mode)
{
EditFace *efa, *base_efa=NULL;
unsigned int selcount=0; /*count how many new faces we select*/
@@ -667,9 +677,8 @@ int facegroup_select(EditMesh *em, short mode)
/*deselcount, count how many deselected faces are left, so we can bail out early
also means that if there are no deselected faces, we can avoid a lot of looping */
unsigned int deselcount=0;
-
+ float thresh= scene->toolsettings->select_thresh;
short ok=0;
- float thresh=0; // XXX scene->toolsettings->select_thresh;
for(efa= em->faces.first; efa; efa= efa->next) {
if (!efa->h) {
@@ -787,6 +796,41 @@ int facegroup_select(EditMesh *em, short mode)
return selcount;
}
+static int similar_face_select_exec(bContext *C, wmOperator *op)
+{
+ Scene *scene= CTX_data_scene(C);
+ Object *obedit= CTX_data_edit_object(C);
+ Mesh *me= obedit->data;
+ EditMesh *em= me->edit_mesh;
+
+ int selcount = similar_face_select__internal(scene, em, RNA_int_get(op->ptr, "type"));
+
+ if (selcount) {
+ /* here was an edge-mode only select flush case, has to be generalized */
+ EM_selectmode_flush(em);
+ WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+ return OPERATOR_FINISHED;
+ }
+
+ return OPERATOR_CANCELLED;
+}
+
+void MESH_OT_similar_face_select(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Similar Face Select";
+ ot->idname= "MESH_OT_similar_face_select";
+
+ /* api callbacks */
+ ot->invoke= WM_menu_invoke;
+ ot->exec= similar_face_select_exec;
+ ot->poll= ED_operator_editmesh;
+
+ /* properties */
+ RNA_def_enum(ot->srna, "type", prop_simface_types, 0, "Type", "");
+}
+
+/* ***************************************************** */
/*
EDGE GROUP
@@ -799,11 +843,18 @@ EDGE GROUP
mode 7: similar sharp
*/
-/* this function is only used by edgegroup_select's edge angle */
-
-
+static EnumPropertyItem prop_simedge_types[] = {
+ {1, "LENGTH", "Length", ""},
+ {2, "DIR", "Direction", ""},
+ {3, "FACE", "Amount of Vertices in Face", ""},
+ {4, "FACE_ANGLE", "Face Angles", ""},
+ {5, "CREASE", "Crease", ""},
+ {6, "SEAM", "Seam", ""},
+ {7, "SHARP", "Sharpness", ""},
+ {0, NULL, NULL, NULL}
+};
-static int edgegroup_select__internal(EditMesh *em, short mode)
+static int similar_edge_select__internal(Scene *scene, EditMesh *em, int mode)
{
EditEdge *eed, *base_eed=NULL;
unsigned int selcount=0; /* count how many new edges we select*/
@@ -813,7 +864,7 @@ static int edgegroup_select__internal(EditMesh *em, short mode)
unsigned int deselcount=0;
short ok=0;
- float thresh=0; // XXX scene->toolsettings->select_thresh;
+ float thresh= scene->toolsettings->select_thresh;
for(eed= em->edges.first; eed; eed= eed->next) {
if (!eed->h) {
@@ -1001,29 +1052,41 @@ static int edgegroup_select__internal(EditMesh *em, short mode)
return selcount;
}
/* wrap the above function but do selection flushing edge to face */
-int edgegroup_select(EditMesh *em, short mode)
+static int similar_edge_select_exec(bContext *C, wmOperator *op)
{
- int selcount = edgegroup_select__internal(em, mode);
+ Scene *scene= CTX_data_scene(C);
+ Object *obedit= CTX_data_edit_object(C);
+ Mesh *me= obedit->data;
+ EditMesh *em= me->edit_mesh;
+
+ int selcount = similar_edge_select__internal(scene, em, RNA_int_get(op->ptr, "type"));
if (selcount) {
- /* Could run a generic flush function,
- * but the problem is only that all edges of a face
- * can be selected without the face becoming selected */
- EditFace *efa;
- for(efa= em->faces.first; efa; efa= efa->next) {
- if (efa->v4) {
- if (efa->e1->f&SELECT && efa->e2->f&SELECT && efa->e3->f&SELECT && efa->e4->f&SELECT)
- efa->f |= SELECT;
- } else {
- if (efa->e1->f&SELECT && efa->e2->f&SELECT && efa->e3->f&SELECT)
- efa->f |= SELECT;
- }
- }
+ /* here was an edge-mode only select flush case, has to be generalized */
+ EM_selectmode_flush(em);
+ WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+ return OPERATOR_FINISHED;
}
- return selcount;
+
+ return OPERATOR_CANCELLED;
}
+void MESH_OT_similar_edge_select(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Similar Edge Select";
+ ot->idname= "MESH_OT_similar_edge_select";
+
+ /* api callbacks */
+ ot->invoke= WM_menu_invoke;
+ ot->exec= similar_edge_select_exec;
+ ot->poll= ED_operator_editmesh;
+
+ /* properties */
+ RNA_def_enum(ot->srna, "type", prop_simedge_types, 0, "Type", "");
+}
+/* ********************************* */
/*
VERT GROUP
@@ -1041,20 +1104,19 @@ static EnumPropertyItem prop_simvertex_types[] = {
static int similar_vert_select_exec(bContext *C, wmOperator *op)
{
-// Scene *scene= CTX_data_scene(C);
+ Scene *scene= CTX_data_scene(C);
Object *obedit= CTX_data_edit_object(C);
Mesh *me= obedit->data;
EditMesh *em= me->edit_mesh;
EditVert *eve, *base_eve=NULL;
unsigned int selcount=0; /* count how many new edges we select*/
-
/*count how many visible selected edges there are,
so we can return when there are none left */
unsigned int deselcount=0;
short ok=0;
- float thresh=0; // XXX scene->toolsettings->select_thresh;
+ float thresh= scene->toolsettings->select_thresh;
for(eve= em->verts.first; eve; eve= eve->next) {
if (!eve->h) {
@@ -1163,73 +1225,6 @@ static int similar_vert_select_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
-/* EditMode menu triggered from space.c by pressing Shift+G
-handles face/edge vert context and
-facegroup_select/edgegroup_select/vertgroup_select do all the work
-*/
-
-void select_mesh_group_menu(EditMesh *em)
-{
- short ret;
- int selcount, first_item=1, multi=0;
- char str[512] = "Select Similar "; /* total max length is 404 at the moment */
-
- if (!ELEM3(em->selectmode, SCE_SELECT_VERTEX, SCE_SELECT_EDGE, SCE_SELECT_FACE)) {
- multi=1;
- }
-
- if(em->selectmode & SCE_SELECT_VERTEX) {
- if (multi) strcat(str, "%t|Vertices%x-1|");
- else strcat(str, "Vertices %t|");
- strcat(str, " Normal %x1| Face Users %x2| Shared Vertex Groups%x3");
- first_item=0;
- }
-
- if(em->selectmode & SCE_SELECT_EDGE) {
- if (multi) {
- if (first_item) strcat(str, "%t|Edges%x-1|");
- else strcat(str, "|%l|Edges%x-1|");
- } else strcat(str, "Edges %t|");
-
- strcat(str, " Length %x10| Direction %x20| Face Users%x30| Face Angle%x40| Crease%x50| Seam%x60| Sharp%x70");
- first_item=0;
- }
-
- if(em->selectmode & SCE_SELECT_FACE) {
- if (multi) {
- strcat(str, "|%l|Faces%x-1|");
- } else strcat(str, "Faces %t|");
- strcat(str, " Material %x100| Image %x200| Area %x300| Perimeter %x400| Normal %x500| Co-Planar %x600");
-
- }
-
- ret= pupmenu(str);
- if (ret<1) return;
-
-
- if (ret<100) {
- selcount= edgegroup_select(em, ret/10);
-
- if (selcount) { /* update if data was selected */
- /*EM_select_flush(em);*/ /* dont use because it can end up selecting more edges and is not usefull*/
- em->totedgesel+=selcount;
-// if (EM_texFaceCheck())
- BIF_undo_push("Select Similar Edges");
- }
- return;
- }
-
- if (ret<1000) {
- selcount= facegroup_select(em, ret/100);
- if (selcount) { /* update if data was selected */
- em->totfacesel+=selcount;
-// if (EM_texFaceCheck())
- BIF_undo_push("Select Similar Faces");
- }
- return;
- }
-}
-
void MESH_OT_similar_vertex_select(wmOperatorType *ot)
{
/* identifiers */
diff --git a/source/blender/editors/mesh/mesh_intern.h b/source/blender/editors/mesh/mesh_intern.h
index 11cedd46e78..ac491c01438 100644
--- a/source/blender/editors/mesh/mesh_intern.h
+++ b/source/blender/editors/mesh/mesh_intern.h
@@ -187,6 +187,8 @@ void MESH_OT_select_linked_flat_faces(struct wmOperatorType *ot);
void MESH_OT_select_sharp_edges(struct wmOperatorType *ot);
void MESH_OT_shortest_path_select(struct wmOperatorType *ot);
void MESH_OT_similar_vertex_select(struct wmOperatorType *ot);
+void MESH_OT_similar_edge_select(struct wmOperatorType *ot);
+void MESH_OT_similar_face_select(struct wmOperatorType *ot);
extern EditEdge *findnearestedge(ViewContext *vc, int *dist);
extern void EM_automerge(int update);
diff --git a/source/blender/editors/mesh/mesh_ops.c b/source/blender/editors/mesh/mesh_ops.c
index d19f72520dc..029dbcf6afe 100644
--- a/source/blender/editors/mesh/mesh_ops.c
+++ b/source/blender/editors/mesh/mesh_ops.c
@@ -148,6 +148,8 @@ void ED_operatortypes_mesh(void)
WM_operatortype_append(MESH_OT_add_edge_face);
WM_operatortype_append(MESH_OT_shortest_path_select);
WM_operatortype_append(MESH_OT_similar_vertex_select);
+ WM_operatortype_append(MESH_OT_similar_edge_select);
+ WM_operatortype_append(MESH_OT_similar_face_select);
}
/* note mesh keymap also for other space? */
@@ -182,7 +184,10 @@ void ED_keymap_mesh(wmWindowManager *wm)
RNA_float_set(WM_keymap_add_item(keymap, "MESH_OT_select_linked_flat_faces", FKEY, KM_PRESS, (KM_CTRL|KM_SHIFT|KM_ALT), 0)->ptr,"sharpness",135.0);
RNA_float_set(WM_keymap_add_item(keymap, "MESH_OT_select_sharp_edges", SKEY, KM_PRESS, (KM_CTRL|KM_SHIFT|KM_ALT), 0)->ptr,"sharpness",135.0);
- WM_keymap_add_item(keymap, "MESH_OT_similar_vertex_select", JKEY, KM_PRESS, 0, 0);
+ /* temp hotkeys! */
+ WM_keymap_add_item(keymap, "MESH_OT_similar_vertex_select", GKEY, KM_PRESS, KM_SHIFT, 0);
+ WM_keymap_add_item(keymap, "MESH_OT_similar_edge_select", GKEY, KM_PRESS, KM_SHIFT2|KM_CTRL, 0);
+ WM_keymap_add_item(keymap, "MESH_OT_similar_face_select", GKEY, KM_PRESS, KM_SHIFT|KM_CTRL2, 0);
/* transform keymap already defined, so no tweaks for select */
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index faa8eda2f17..0da13fa119f 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -496,14 +496,16 @@ static int wm_eventmatch(wmEvent *winevent, wmKeymapItem *kmi)
if(kmi->val!=KM_ANY)
if(winevent->val!=kmi->val) return 0;
+
+ /* modifiers also check bits, so it allows modifier order */
if(kmi->shift!=KM_ANY)
- if(winevent->shift!=kmi->shift) return 0;
+ if(winevent->shift != kmi->shift && !(winevent->shift & kmi->shift)) return 0;
if(kmi->ctrl!=KM_ANY)
- if(winevent->ctrl!=kmi->ctrl) return 0;
+ if(winevent->ctrl != kmi->ctrl && !(winevent->ctrl & kmi->ctrl)) return 0;
if(kmi->alt!=KM_ANY)
- if(winevent->alt!=kmi->alt) return 0;
+ if(winevent->alt != kmi->alt && !(winevent->alt & kmi->alt)) return 0;
if(kmi->oskey!=KM_ANY)
- if(winevent->oskey!=kmi->oskey) return 0;
+ if(winevent->oskey != kmi->oskey && !(winevent->oskey & kmi->oskey)) return 0;
if(kmi->keymodifier)
if(winevent->keymodifier!=kmi->keymodifier) return 0;
@@ -1149,12 +1151,23 @@ void wm_event_add_ghostevent(wmWindow *win, int type, void *customdata)
/* modifiers */
if (event.type==LEFTSHIFTKEY || event.type==RIGHTSHIFTKEY) {
event.shift= evt->shift= event.val;
- } else if (event.type==LEFTCTRLKEY || event.type==RIGHTCTRLKEY) {
+ if(event.val && (evt->ctrl || evt->alt || evt->oskey))
+ event.shift= evt->shift = 3; // define?
+ }
+ else if (event.type==LEFTCTRLKEY || event.type==RIGHTCTRLKEY) {
event.ctrl= evt->ctrl= event.val;
- } else if (event.type==LEFTALTKEY || event.type==RIGHTALTKEY) {
+ if(event.val && (evt->shift || evt->alt || evt->oskey))
+ event.ctrl= evt->ctrl = 3; // define?
+ }
+ else if (event.type==LEFTALTKEY || event.type==RIGHTALTKEY) {
event.alt= evt->alt= event.val;
- } else if (event.type==COMMANDKEY) {
+ if(event.val && (evt->ctrl || evt->shift || evt->oskey))
+ event.alt= evt->alt = 3; // define?
+ }
+ else if (event.type==COMMANDKEY) {
event.oskey= evt->oskey= event.val;
+ if(event.val && (evt->ctrl || evt->alt || evt->shift))
+ event.oskey= evt->oskey = 3; // define?
}
/* if test_break set, it catches this. Keep global for now? */