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
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2006-03-25 07:37:40 +0300
committerCampbell Barton <ideasman42@gmail.com>2006-03-25 07:37:40 +0300
commit84d8b0cafe387ee873749f2777c39e26a4ebeee0 (patch)
treee947f8f3f3f593c89e135e0ffd5df1add8665b8e /source/blender
parent927be3725aa01d847dc9a10b0c5fc0eec5114564 (diff)
Added select group meny to mesh editmode.
Currently only works for faces. Try Shift+G in face/editmode.
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/blenlib/intern/arithb.c4
-rw-r--r--source/blender/include/BIF_editmesh.h3
-rw-r--r--source/blender/include/BIF_space.h2
-rw-r--r--source/blender/src/editmesh_lib.c24
-rw-r--r--source/blender/src/editmesh_mods.c115
-rw-r--r--source/blender/src/header_view3d.c2
-rw-r--r--source/blender/src/space.c12
-rw-r--r--source/blender/src/toolbox.c1
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[]= {