Added select group meny to mesh editmode.
Currently only works for faces. Try Shift+G in face/editmode.
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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');
|
||||
|
||||
@@ -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[]= {
|
||||
|
||||
Reference in New Issue
Block a user