diff options
author | Ton Roosendaal <ton@blender.org> | 2003-07-21 00:25:30 +0400 |
---|---|---|
committer | Ton Roosendaal <ton@blender.org> | 2003-07-21 00:25:30 +0400 |
commit | 6b070b3d0d9486efd5ba0f964a34d595857f96cd (patch) | |
tree | 9d082ff6175fdb9642c60b8f9f45545149fced7f | |
parent | ab76e4594a9c64bf582d001df0b4de822bf0954b (diff) |
- added ALT_RIGHTMOUSE select edges in Mesh editmode
- added 'draw edges' mode in F9 menu
- changed ugly 'draw faces' in a nice transparant :)
- hotkey for screenshots: ALT+CTRL+F3 now works too
-rw-r--r-- | source/blender/blenkernel/BKE_global.h | 1 | ||||
-rw-r--r-- | source/blender/src/buttons.c | 1 | ||||
-rw-r--r-- | source/blender/src/drawobject.c | 94 | ||||
-rw-r--r-- | source/blender/src/editmesh.c | 97 | ||||
-rw-r--r-- | source/blender/src/editscreen.c | 2 |
5 files changed, 151 insertions, 44 deletions
diff --git a/source/blender/blenkernel/BKE_global.h b/source/blender/blenkernel/BKE_global.h index ebdd008847c..2f75dd8be16 100644 --- a/source/blender/blenkernel/BKE_global.h +++ b/source/blender/blenkernel/BKE_global.h @@ -167,6 +167,7 @@ typedef struct Global { #define G_WEIGHTPAINT 32768 /* __NLA */ #define G_TEXTUREPAINT 65536 #define G_NOFROZEN (1 << 17) // frozen modules inactive +#define G_DRAWEDGES (1 << 18) /* G.fileflags */ diff --git a/source/blender/src/buttons.c b/source/blender/src/buttons.c index b8076c5af1d..6378a536bff 100644 --- a/source/blender/src/buttons.c +++ b/source/blender/src/buttons.c @@ -1676,6 +1676,7 @@ void meshbuts(void) uiDefButF(block, NUM, REDRAWVIEW3D, "NSize:", 1090, 90, 164, 19, &editbutsize, 0.001, 2.0, 10, 0, "Set the length of the face normals"); uiDefButI(block, TOG|BIT|6, REDRAWVIEW3D, "Draw Normals", 1090,70,164,19, &G.f, 0, 0, 0, 0, "Draw face normals"); uiDefButI(block, TOG|BIT|7, REDRAWVIEW3D, "Draw Faces", 1090,50,164,19, &G.f, 0, 0, 0, 0, "Draw faces"); + uiDefButI(block, TOG|BIT|18, REDRAWVIEW3D, "Draw Edges", 1090,30,164,19, &G.f, 0, 0, 0, 0, "Draw edges"); uiDefButI(block, TOG|BIT|11, 0, "All edges", 1090,10,164,19, &G.f, 0, 0, 0, 0, "Draw edges normally, without optimisation"); uiDrawBlock(block); diff --git a/source/blender/src/drawobject.c b/source/blender/src/drawobject.c index 76dad6c3f15..e5e44617fe7 100644 --- a/source/blender/src/drawobject.c +++ b/source/blender/src/drawobject.c @@ -2409,18 +2409,35 @@ static void drawmeshwire(Object *ob) } cpack(0x0); - eed= G.eded.first; - - glBegin(GL_LINES); - while(eed) { - if(eed->h==0) { - glVertex3fv(eed->v1->co); - glVertex3fv(eed->v2->co); + if(G.f & G_DRAWEDGES) { /* Use edge Highlighting */ + glShadeModel(GL_SMOOTH); + + eed= G.eded.first; + glBegin(GL_LINES); + while(eed) { + if(eed->h==0) { + if(eed->v1->f & 1) cpack(0x559999); else cpack(0x0); + glVertex3fv(eed->v1->co); + if(eed->v2->f & 1) cpack(0x559999); else cpack(0x0); + glVertex3fv(eed->v2->co); + } + eed= eed->next; } - eed= eed->next; + glEnd(); + glShadeModel(GL_FLAT); + } + else { + eed= G.eded.first; + glBegin(GL_LINES); + while(eed) { + if(eed->h==0) { + glVertex3fv(eed->v1->co); + glVertex3fv(eed->v2->co); + } + eed= eed->next; + } + glEnd(); } - glEnd(); - if(ob!=G.obedit) return; calc_meshverts(); @@ -2458,35 +2475,52 @@ static void drawmeshwire(Object *ob) } if(G.f & (G_FACESELECT+G_DRAWFACES)) { /* faces */ + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_BLEND); + evl= G.edvl.first; while(evl) { if(evl->v1->h==0 && evl->v2->h==0 && evl->v3->h==0) { - if(vlakselectedAND(evl, 1)) cpack(0x559999); - else cpack(0x664466); - - if(evl->v4 && evl->v4->h==0) { - - CalcCent4f(cent, evl->v1->co, evl->v2->co, evl->v3->co, evl->v4->co); - glBegin(GL_LINE_LOOP); - VecMidf(fvec, cent, evl->v1->co); glVertex3fv(fvec); - VecMidf(fvec, cent, evl->v2->co); glVertex3fv(fvec); - VecMidf(fvec, cent, evl->v3->co); glVertex3fv(fvec); - VecMidf(fvec, cent, evl->v4->co); glVertex3fv(fvec); - glEnd(); - } - else { - - CalcCent3f(cent, evl->v1->co, evl->v2->co, evl->v3->co); - glBegin(GL_LINE_LOOP); - VecMidf(fvec, cent, evl->v1->co); glVertex3fv(fvec); - VecMidf(fvec, cent, evl->v2->co); glVertex3fv(fvec); - VecMidf(fvec, cent, evl->v3->co); glVertex3fv(fvec); + if(1) { + if(vlakselectedAND(evl, 1)) glColor4ub(200, 100, 200, 60); + else glColor4ub(0, 50, 150, 30); + + glBegin(evl->v4?GL_QUADS:GL_TRIANGLES); + glVertex3fv(evl->v1->co); + glVertex3fv(evl->v2->co); + glVertex3fv(evl->v3->co); + if(evl->v4) glVertex3fv(evl->v4->co); glEnd(); + + } else { + if(vlakselectedAND(evl, 1)) cpack(0x559999); + else cpack(0x664466); + + if(evl->v4 && evl->v4->h==0) { + + CalcCent4f(cent, evl->v1->co, evl->v2->co, evl->v3->co, evl->v4->co); + glBegin(GL_LINE_LOOP); + VecMidf(fvec, cent, evl->v1->co); glVertex3fv(fvec); + VecMidf(fvec, cent, evl->v2->co); glVertex3fv(fvec); + VecMidf(fvec, cent, evl->v3->co); glVertex3fv(fvec); + VecMidf(fvec, cent, evl->v4->co); glVertex3fv(fvec); + glEnd(); + } + else { + + CalcCent3f(cent, evl->v1->co, evl->v2->co, evl->v3->co); + glBegin(GL_LINE_LOOP); + VecMidf(fvec, cent, evl->v1->co); glVertex3fv(fvec); + VecMidf(fvec, cent, evl->v2->co); glVertex3fv(fvec); + VecMidf(fvec, cent, evl->v3->co); glVertex3fv(fvec); + glEnd(); + } } } evl= evl->next; } + glDisable(GL_BLEND); } } else { diff --git a/source/blender/src/editmesh.c b/source/blender/src/editmesh.c index b86c8baec37..9860f9039e3 100644 --- a/source/blender/src/editmesh.c +++ b/source/blender/src/editmesh.c @@ -2033,24 +2033,96 @@ static void tekenvertices_special(int mode, EditVert *act) /* teken = draw */ if(G.zbuf) glEnable(GL_DEPTH_TEST); } +static void edge_select(void) +{ + EditEdge *closest=0, *eed=0; + short found=0, mval[2]; + float distance[2], v1[2], v2[2], mval2[2]; + + calc_meshverts_ext_f2(); /*sets (eve->f & 2) for vertices that aren't visible*/ + + if(G.eded.first==0) return; + eed=G.eded.first; + + getmouseco_areawin(mval); + mval2[0] = (float)mval[0]; /* cast to float because of the pdist function only taking floats...*/ + mval2[1] = (float)mval[1]; + + while(eed) { /*compare the distance to the rest of the edges and find the closest one*/ + if( !((eed->v1->f & 2) && (eed->v2->f & 2))){ /* Are both vertices of the edge invisible? then don't select the edge*/ + v1[0] = eed->v1->xs; /* oh great! the screencoordinates are not an array....grrrr*/ + v1[1] = eed->v1->ys; + v2[0] = eed->v2->xs; + v2[1] = eed->v2->ys; + + distance[1] = PdistVL2Dfl(mval2, v1, v2); + + if(distance[1]<50){ /* TODO: make this maximum selecting distance selectable (the same with vertice select?) */ + if(found) { //do we have to compare it to other distances? + if (distance[1]<distance[0]){ + distance[0]=distance[1]; + closest=eed; /*save the current closest edge*/ + } + } else { + distance[0]=distance[1]; + closest=eed; + found=1; + } + } + } + eed= eed->next; + } + + if(found){ /* Did we find anything that is selectable?*/ + + if( (G.qual & LR_SHIFTKEY)==0) { + EditVert *eve; + + /* deselectall */ + for(eve= G.edve.first; eve; eve= eve->next) eve->f&= ~1; + + /* select edge */ + closest->v1->f |= 1; + closest->v2->f |= 1; + } + else { + /* both of the vertices are selected: deselect both*/ + if((closest->v1->f & 1) && (closest->v2->f & 1) ){ + closest->v1->f &= ~1; + closest->v2->f &= ~1; + } + else { + /* select them */ + closest->v1->f |= 1; + closest->v2->f |= 1; + } + } + allqueue(REDRAWVIEW3D, 0); + } +} + void mouse_mesh(void) { EditVert *act=0; - act= findnearestvert(1); - if(act) { - - if((G.qual & LR_SHIFTKEY)==0) { - tekenvertices_special(0, act); + if(G.qual & LR_ALTKEY) edge_select(); + else { + + act= findnearestvert(1); + if(act) { + + if((G.qual & LR_SHIFTKEY)==0) { + tekenvertices_special(0, act); + } + if( (act->f & 1)==0) act->f+= 1; + else if(G.qual & LR_SHIFTKEY) act->f-= 1; + + tekenvertices_special(1, act); + countall(); } - if( (act->f & 1)==0) act->f+= 1; - else if(G.qual & LR_SHIFTKEY) act->f-= 1; - - tekenvertices_special(1, act); - countall(); + + rightmouse_transform(); } - - rightmouse_transform(); } static void selectconnectedAll(void) @@ -2093,7 +2165,6 @@ static void selectconnectedAll(void) } - void selectconnected_mesh(void) { EditVert *eve,*v1,*v2,*act= 0; diff --git a/source/blender/src/editscreen.c b/source/blender/src/editscreen.c index 7ed7063c385..a2c78632e49 100644 --- a/source/blender/src/editscreen.c +++ b/source/blender/src/editscreen.c @@ -818,7 +818,7 @@ unsigned short extern_qread_ext(short *val, char *ascii) else if(event==REDRAW) ext_redraw= *val; else if(event==INPUTCHANGE) ext_inputchange= *val; else if(event==MOUSEY || event==MOUSEX) ext_mousemove= 1; - else if((G.qual & LR_CTRLKEY) && event==F3KEY) { + else if((G.qual & (LR_CTRLKEY|LR_ALTKEY)) && event==F3KEY) { BIF_screendump(); } |