diff options
author | Campbell Barton <ideasman42@gmail.com> | 2006-03-25 07:37:40 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2006-03-25 07:37:40 +0300 |
commit | 84d8b0cafe387ee873749f2777c39e26a4ebeee0 (patch) | |
tree | e947f8f3f3f593c89e135e0ffd5df1add8665b8e /source | |
parent | 927be3725aa01d847dc9a10b0c5fc0eec5114564 (diff) |
Added select group meny to mesh editmode.
Currently only works for faces.
Try Shift+G in face/editmode.
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/blenlib/intern/arithb.c | 4 | ||||
-rw-r--r-- | source/blender/include/BIF_editmesh.h | 3 | ||||
-rw-r--r-- | source/blender/include/BIF_space.h | 2 | ||||
-rw-r--r-- | source/blender/src/editmesh_lib.c | 24 | ||||
-rw-r--r-- | source/blender/src/editmesh_mods.c | 115 | ||||
-rw-r--r-- | source/blender/src/header_view3d.c | 2 | ||||
-rw-r--r-- | source/blender/src/space.c | 12 | ||||
-rw-r--r-- | source/blender/src/toolbox.c | 1 |
8 files changed, 148 insertions, 15 deletions
diff --git a/source/blender/blenlib/intern/arithb.c b/source/blender/blenlib/intern/arithb.c index 67f3cca92f3..0734efba7f7 100644 --- a/source/blender/blenlib/intern/arithb.c +++ b/source/blender/blenlib/intern/arithb.c @@ -2313,8 +2313,8 @@ float VecAngle3( float *v1, float *v2, float *v3) VecSubf(vec2, v2, v3); Normalise(vec1); Normalise(vec2); - - return saacos(vec1[0]*vec2[0] + vec1[1]*vec2[1] + vec1[2]*vec2[2]) * 180.0/M_PI; + /* 180.0/M_PI is 57.2957795131f*/ + return saacos(vec1[0]*vec2[0] + vec1[1]*vec2[1] + vec1[2]*vec2[2]) * 57.2957795131f; } diff --git a/source/blender/include/BIF_editmesh.h b/source/blender/include/BIF_editmesh.h index 627c2a53756..1b6fafab1f7 100644 --- a/source/blender/include/BIF_editmesh.h +++ b/source/blender/include/BIF_editmesh.h @@ -76,6 +76,8 @@ extern void EM_clear_flag_all(int flag); extern void EM_select_face(struct EditFace *efa, int sel); extern void EM_select_edge(struct EditEdge *eed, int sel); +extern float EM_face_area(struct EditFace *efa); +extern float EM_face_perimeter(struct EditFace *efa); extern void EM_deselect_flush(void); // vertices to edges/faces (exception!) extern void EM_select_flush(void); // vertices to edges/faces (exception!) @@ -145,6 +147,7 @@ extern void editmesh_select_by_material(int index); extern void editmesh_deselect_by_material(int index); extern void Edge_Menu(void); +extern void select_mesh_group_menu(void); extern void editmesh_mark_seam(int clear); diff --git a/source/blender/include/BIF_space.h b/source/blender/include/BIF_space.h index d5dc65a2b3c..2f5dbd4fc16 100644 --- a/source/blender/include/BIF_space.h +++ b/source/blender/include/BIF_space.h @@ -117,7 +117,7 @@ extern void newspace(struct ScrArea *sa, int type); extern void set_rects_butspace(struct SpaceButs *buts); extern void test_butspace(void); extern void start_game(void); -extern void select_grouped(short nr); +extern void select_object_grouped(short nr); extern void join_menu(void); extern void BIF_undo_push(char *str); diff --git a/source/blender/src/editmesh_lib.c b/source/blender/src/editmesh_lib.c index 9d67f62db2a..c3cd12f1ebf 100644 --- a/source/blender/src/editmesh_lib.c +++ b/source/blender/src/editmesh_lib.c @@ -1573,12 +1573,26 @@ int convex(float *v1, float *v2, float *v3, float *v4) - edges having ->fgoni index set (for select) */ -static float editface_area(EditFace *efa) +float EM_face_area(EditFace *efa) { if(efa->v4) return AreaQ3Dfl(efa->v1->co, efa->v2->co, efa->v3->co, efa->v4->co); else return AreaT3Dfl(efa->v1->co, efa->v2->co, efa->v3->co); } +float EM_face_perimeter(EditFace *efa) +{ + if(efa->v4) return + VecLenf(efa->v1->co, efa->v2->co)+ + VecLenf(efa->v2->co, efa->v3->co)+ + VecLenf(efa->v3->co, efa->v4->co)+ + VecLenf(efa->v4->co, efa->v1->co); + + else return + VecLenf(efa->v1->co, efa->v2->co)+ + VecLenf(efa->v2->co, efa->v3->co)+ + VecLenf(efa->v3->co, efa->v1->co); +} + void EM_fgon_flags(void) { EditMesh *em = G.editMesh; @@ -1616,7 +1630,7 @@ void EM_fgon_flags(void) if(efa->e4 && (efa->e4->h & EM_FGON)) efa->e4->fgoni= curindex; // we search for largest face, to give facedot drawing rights - maxsize= editface_area(efa); + maxsize= EM_face_area(efa); efamax= efa; // now flush curendex over edges and set faceflags @@ -1636,7 +1650,7 @@ void EM_fgon_flags(void) if(efan->e3->h & EM_FGON) efan->e3->fgoni= curindex; if(efan->e4 && (efan->e4->h & EM_FGON)) efan->e4->fgoni= curindex; - size= editface_area(efan); + size= EM_face_area(efan); if(size>maxsize) { efamax= efan; maxsize= size; @@ -1668,7 +1682,3 @@ void EM_fgon_flags(void) } } - - - - diff --git a/source/blender/src/editmesh_mods.c b/source/blender/src/editmesh_mods.c index 8c03eb20209..5bc8d3d9cbe 100644 --- a/source/blender/src/editmesh_mods.c +++ b/source/blender/src/editmesh_mods.c @@ -744,6 +744,121 @@ static int unified_findnearest(EditVert **eve, EditEdge **eed, EditFace **efa) return (*eve || *eed || *efa); } +/* **************** GROUP SELECTS ************** */ +/* selects new faces/edges/verts based on the + existing selection + mode 1 is same material + mode 2 is same image + mode 3: same area + mode 4: same perimeter + mode 5: same normal + mode 6: same co-planer +*/ +void facegroup_select(short mode) +{ + EditMesh *em = G.editMesh; + EditFace *efa, *base_efa; + short change=0; + float thresh=G.scene->toolsettings->doublimit; + + for(efa= em->faces.first; efa; efa= efa->next) { + if (efa->f & SELECT) { + base_efa= efa; + break; + } + } + + if (mode==1) { /* same material */ + for(efa= em->faces.first; efa; efa= efa->next) { + if (!(efa->f & SELECT) && base_efa->mat_nr == efa->mat_nr) { + EM_select_face(efa, 1); + change=1; + } + } + } else if (mode==2) { /* same image */ + for(efa= em->faces.first; efa; efa= efa->next) { + if (!(efa->f & SELECT) && base_efa->tf.tpage == efa->tf.tpage) { + EM_select_face(efa, 1); + change=1; + } + } + } else if (mode==3) { /* same area */ + float area, base_area; + base_area= EM_face_area(base_efa); + for(efa= em->faces.first; efa; efa= efa->next) { + if (!(efa->f & SELECT)) { + area= EM_face_area(efa); + if (fabs(area-base_area)<=thresh) { + EM_select_face(efa, 1); + change=1; + } + } + } + } else if (mode==4) { /* same perimeter */ + float perimeter, base_perimeter; + base_perimeter= EM_face_perimeter(base_efa); + for(efa= em->faces.first; efa; efa= efa->next) { + if (!(efa->f & SELECT)) { + perimeter= EM_face_perimeter(efa); + if (fabs(perimeter-base_perimeter)<=thresh) { + EM_select_face(efa, 1); + change=1; + } + } + } + } else if (mode==5) { /* same normal */ + float angle; + for(efa= em->faces.first; efa; efa= efa->next) { + if (!(efa->f & SELECT)) { + angle= saacos(base_efa->n[0]*efa->n[0] + base_efa->n[1]*efa->n[1] + base_efa->n[2]*efa->n[2]) * 57.2957795131; /*180.0/M_PI*/ + if (angle<=thresh) { + EM_select_face(efa, 1); + change=1; + } + } + } + } else if (mode==6) { /* same planer */ + float angle, base_dot, dot; + base_dot= base_efa->cent[0]*base_efa->n[0] + base_efa->cent[1]*base_efa->n[1] + base_efa->cent[2]*base_efa->n[2]; + for(efa= em->faces.first; efa; efa= efa->next) { + if (!(efa->f & SELECT)) { + angle= saacos(base_efa->n[0]*efa->n[0] + base_efa->n[1]*efa->n[1] + base_efa->n[2]*efa->n[2]) * 57.2957795131; /*180.0/M_PI*/ + if (angle<=thresh) { + dot= efa->cent[0]*base_efa->n[0] + efa->cent[1]*base_efa->n[1] + efa->cent[2]*base_efa->n[2]; + if (fabs(base_dot-dot) <= thresh) { + EM_select_face(efa, 1); + change=1; + } + } + } + } + } + + + if (change) { + allqueue(REDRAWVIEW3D, 0); + BIF_undo_push("Select Grouped Faces"); + } +} + +void select_mesh_group_menu() +{ + short ret; + + if(G.scene->selectmode & SCE_SELECT_FACE) { + ret= pupmenu("Select Grouped Faces (by Same)%t|Material %x1|Image %x2|Area %x3|Perimeter %x4|Normal %x5|Co-Planer %x6"); + if (ret<1) return; + facegroup_select(ret); + + } else if(G.scene->selectmode & SCE_SELECT_EDGE) { + /**/ + } else if(G.scene->selectmode & SCE_SELECT_VERTEX) { + /**/ + } + +} + + /* **************** LOOP SELECTS *************** */ /* selects quads in loop direction of indicated edge */ diff --git a/source/blender/src/header_view3d.c b/source/blender/src/header_view3d.c index 6482377eb66..5ecfb89fd4d 100644 --- a/source/blender/src/header_view3d.c +++ b/source/blender/src/header_view3d.c @@ -746,7 +746,7 @@ void do_view3d_select_object_groupedmenu(void *arg, int event) case 3: /* Parent */ case 4: /* Objects on Shared Layers */ case 5: /* Objects in Same Group */ - select_grouped((short)event); + select_object_grouped((short)event); break; } allqueue(REDRAWVIEW3D, 0); diff --git a/source/blender/src/space.c b/source/blender/src/space.c index f51f2ddef9e..7562f8e6165 100644 --- a/source/blender/src/space.c +++ b/source/blender/src/space.c @@ -614,7 +614,7 @@ static void select_same_group(Object *ob) /* Select objects in the same group as } } -void select_grouped(short nr) +void select_object_grouped(short nr) { Base *base; @@ -640,7 +640,7 @@ void select_grouped(short nr) allqueue(REDRAWIPO, 0); } -static void select_grouped_menu(void) +static void select_object_grouped_menu(void) { char *str; short nr; @@ -658,7 +658,7 @@ static void select_grouped_menu(void) nr= pupmenu(str); MEM_freeN(str); - select_grouped(nr); + select_object_grouped(nr); } void join_menu(void) @@ -1346,7 +1346,11 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt) case GKEY: if(G.qual & LR_CTRLKEY) group_operation_with_menu(); else if((G.qual==LR_SHIFTKEY)) - select_grouped_menu(); + if(G.obedit) { + if(G.obedit->type==OB_MESH) + select_mesh_group_menu(); + } else + select_object_grouped_menu(); else if(G.qual==LR_ALTKEY) { if(okee("Clear location")) { clear_object('g'); diff --git a/source/blender/src/toolbox.c b/source/blender/src/toolbox.c index a8d0d70f3f4..dc57e325d13 100644 --- a/source/blender/src/toolbox.c +++ b/source/blender/src/toolbox.c @@ -830,6 +830,7 @@ static TBitem tb_object_select_grouped[]= { { 0, "Immediate Children|Shift G, 2", 2, NULL}, { 0, "Parent|Shift G, 3", 3, NULL}, { 0, "Objects on Shared Layers|Shift G, 4", 4, NULL}, +{ 0, "Objects in Same Group|Shift G, 5", 5, NULL}, { -1, "", 0, do_view3d_select_object_groupedmenu}}; static TBitem tb_object_select[]= { |