Added select group meny to mesh editmode.

Currently only works for faces.
Try Shift+G in face/editmode.
This commit is contained in:
2006-03-25 04:37:40 +00:00
parent 927be3725a
commit 84d8b0cafe
8 changed files with 148 additions and 15 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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[]= {