diff options
author | Ton Roosendaal <ton@blender.org> | 2004-10-01 02:29:19 +0400 |
---|---|---|
committer | Ton Roosendaal <ton@blender.org> | 2004-10-01 02:29:19 +0400 |
commit | 30ef2326b90a2048c3889fb73e581fe854f8296f (patch) | |
tree | 59c0cc91c9d3b250015e95666d094d00456072eb /source/blender | |
parent | 8ae56af0cf3af36d4f0a9b21575e773ba678bb49 (diff) |
- Made the 'zbuf clip select' in editmode default when reading on old file
- Added transparent wires in solid draw for editmmode, to denote selecting
clicks "through". Switching this and the zbuf-clip mode is actually nice!
- little annoyance; removed object centerpoint drawing in editmode.
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/blenloader/intern/readfile.c | 19 | ||||
-rw-r--r-- | source/blender/src/drawobject.c | 262 | ||||
-rw-r--r-- | source/blender/src/editmesh_mods.c | 18 |
3 files changed, 177 insertions, 122 deletions
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index f6e5ecb4820..406e52a1919 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -4472,9 +4472,26 @@ static void do_versions(Main *main) } if(main->versionfile <= 234) { Scene *sce; + bScreen *sc; + int set_zbuf_sel=0; for (sce= main->scene.first; sce; sce= sce->id.next) { - if(sce->selectmode==0) sce->selectmode= SCE_SELECT_VERTEX; + if(sce->selectmode==0) { + sce->selectmode= SCE_SELECT_VERTEX; + set_zbuf_sel= 1; + } + } + for (sc= main->screen.first; sc; sc= sc->id.next) { + ScrArea *sa; + for (sa= sc->areabase.first; sa; sa= sa->next) { + SpaceLink *sl; + for (sl= sa->spacedata.first; sl; sl= sl->next) { + if(sl->spacetype==SPACE_VIEW3D) { + View3D *v3d= (View3D *)sl; + if(set_zbuf_sel) v3d->flag |= V3D_ZBUF_SELECT; + } + } + } } } diff --git a/source/blender/src/drawobject.c b/source/blender/src/drawobject.c index 0c1fb5b0874..dc2c5fce456 100644 --- a/source/blender/src/drawobject.c +++ b/source/blender/src/drawobject.c @@ -2508,6 +2508,140 @@ static void glVertex_efa_edges(EditFace *efa) } } +static void drawmeshwire_wirextra(DispListMesh *dlm, int optimal, char alpha) +{ + EditMesh *em= G.editMesh; + EditFace *efa; + EditEdge *eed; + int a; + char wire[4], sel[4]; + + /* since this function does transparant... */ + BIF_GetThemeColor3ubv(TH_EDGE_SELECT, sel); + BIF_GetThemeColor3ubv(TH_WIRE, wire); + + wire[3]= alpha; + sel[3]= alpha; + + if(G.scene->selectmode == SCE_SELECT_FACE) { + + glBegin(GL_LINES); + if(dlm && optimal) { + MEdge *medge= dlm->medge; + MVert *mvert= dlm->mvert; + + for (a=0; a<dlm->totedge; a++, medge++) { + if(medge->flag & ME_EDGEDRAW) { + eed= dlm->editedge[a]; + if(eed && eed->h==0) { + if(eed->f & SELECT) glColor4ubv(sel); + else glColor4ubv(wire); + glVertex3fv(mvert[medge->v1].co); + glVertex3fv(mvert[medge->v2].co); + } + } + } + } + else { + /* draw faces twice, to have selected ones on top */ + glColor4ubv(wire); + for(efa= em->faces.first; efa; efa= efa->next) { + if(efa->h==0 && (efa->f & SELECT)==0) { + glVertex_efa_edges(efa); + } + } + glColor4ubv(sel); + for(efa= em->faces.first; efa; efa= efa->next) { + if(efa->h==0 && (efa->f & SELECT)) { + glVertex_efa_edges(efa); + } + } + } + glEnd(); + } + else if( (G.f & G_DRAWEDGES) || (G.scene->selectmode & SCE_SELECT_EDGE) ) { + /* Use edge highlighting */ + + /* (bleeding edges) to illustrate selection is defined on vertex basis */ + /* but cannot do with subdivided edges... */ + if(dlm==NULL && (G.scene->selectmode & SCE_SELECT_VERTEX)) { + glShadeModel(GL_SMOOTH); + glBegin(GL_LINES); + + for(eed= em->edges.first; eed; eed= eed->next) { + if(eed->h==0) { + if(eed->v1->f & SELECT) glColor4ubv(sel); + else glColor4ubv(wire); + glVertex3fv(eed->v1->co); + if(eed->v2->f & SELECT) glColor4ubv(sel); + else glColor4ubv(wire); + glVertex3fv(eed->v2->co); + } + } + glEnd(); + glShadeModel(GL_FLAT); + } + else { + glBegin(GL_LINES); + if(dlm && optimal) { + MEdge *medge= dlm->medge; + MVert *mvert= dlm->mvert; + + for (a=0; a<dlm->totedge; a++, medge++) { + if(medge->flag & ME_EDGEDRAW) { + eed= dlm->editedge[a]; + if(eed && eed->h==0) { + if(eed->f & SELECT) glColor4ubv(sel); + else glColor4ubv(wire); + glVertex3fv(mvert[medge->v1].co); + glVertex3fv(mvert[medge->v2].co); + } + } + } + } + else { + glBegin(GL_LINES); + for(eed= em->edges.first; eed; eed= eed->next) { + if(eed->h==0) { + if(eed->f & SELECT) glColor4ubv(sel); + else glColor4ubv(wire); + glVertex3fv(eed->v1->co); + glVertex3fv(eed->v2->co); + } + } + } + glEnd(); + } + } + else { + glColor4ubv(wire); + glBegin(GL_LINES); + if(dlm && optimal) { + MEdge *medge= dlm->medge; + MVert *mvert= dlm->mvert; + + for (a=0; a<dlm->totedge; a++, medge++) { + if(medge->flag & ME_EDGEDRAW) { + eed= dlm->editedge[a]; + if(eed && eed->h==0) { + glVertex3fv(mvert[medge->v1].co); + glVertex3fv(mvert[medge->v2].co); + } + } + } + } + else { + for(eed= em->edges.first; eed; eed= eed->next) { + if(eed->h==0) { + glVertex3fv(eed->v1->co); + glVertex3fv(eed->v2->co); + } + } + } + glEnd(); + } +} + static void drawmeshwire(Object *ob) { EditMesh *em = G.editMesh; @@ -2582,124 +2716,25 @@ static void drawmeshwire(Object *ob) if(mesh_uses_displist(me)) { /* dont draw the subsurf when solid... then this is a 'drawextra' */ - if(optimal==0 && ob->dt>OB_WIRE && G.vd->drawtype>OB_WIRE); + if(ob->dt>OB_WIRE && G.vd->drawtype>OB_WIRE); else { - /* don't draw in edge/face mode */ - if(optimal && (G.scene->selectmode & SCE_SELECT_VERTEX)==0); - else { - if(optimal) BIF_ThemeColor(TH_WIRE); - else BIF_ThemeColorBlend(TH_WIRE, TH_BACK, 0.7); - - drawDispListwire(&me->disp); - } + BIF_ThemeColorBlend(TH_WIRE, TH_BACK, 0.7); + drawDispListwire(&me->disp); } } - if(G.scene->selectmode == SCE_SELECT_FACE) { + /* here starts all fancy draw-extra over */ - glBegin(GL_LINES); - if(dlm && optimal) { - MEdge *medge= dlm->medge; - MVert *mvert= dlm->mvert; - - for (a=0; a<dlm->totedge; a++, medge++) { - if(medge->flag & ME_EDGEDRAW) { - eed= dlm->editedge[a]; - if(eed && eed->h==0) { - if(eed->f & SELECT) BIF_ThemeColor(TH_EDGE_SELECT); - else BIF_ThemeColor(TH_WIRE); - glVertex3fv(mvert[medge->v1].co); - glVertex3fv(mvert[medge->v2].co); - } - } - } - } - else { - /* draw faces twice, to have selected ones on top */ - BIF_ThemeColor(TH_WIRE); - for(efa= em->faces.first; efa; efa= efa->next) { - if(efa->h==0 && (efa->f & SELECT)==0) { - glVertex_efa_edges(efa); - } - } - BIF_ThemeColor(TH_EDGE_SELECT); - for(efa= em->faces.first; efa; efa= efa->next) { - if(efa->h==0 && (efa->f & SELECT)) { - glVertex_efa_edges(efa); - } - } - } - glEnd(); - } - else if( (G.f & G_DRAWEDGES) || (G.scene->selectmode & SCE_SELECT_EDGE) ) { - /* Use edge highlighting */ - char col[4], colhi[4]; - - BIF_GetThemeColor3ubv(TH_EDGE_SELECT, colhi); - BIF_GetThemeColor3ubv(TH_WIRE, col); - - /* (bleeding edges) to illustrate selection is defined on vertex basis */ - /* but cannot do with subdivided edges... */ - if(dlm==NULL && (G.scene->selectmode & SCE_SELECT_VERTEX)) { - glShadeModel(GL_SMOOTH); - glBegin(GL_LINES); - - for(eed= em->edges.first; eed; eed= eed->next) { - if(eed->h==0) { - if(eed->v1->f & SELECT) glColor3ub(colhi[0], colhi[1], colhi[2]); - else glColor3ub(col[0], col[1], col[2]); - glVertex3fv(eed->v1->co); - if(eed->v2->f & SELECT) glColor3ub(colhi[0], colhi[1], colhi[2]); - else glColor3ub(col[0], col[1], col[2]); - glVertex3fv(eed->v2->co); - } - } - glEnd(); - glShadeModel(GL_FLAT); - } - else { - glBegin(GL_LINES); - if(dlm && optimal) { - MEdge *medge= dlm->medge; - MVert *mvert= dlm->mvert; - - for (a=0; a<dlm->totedge; a++, medge++) { - if(medge->flag & ME_EDGEDRAW) { - eed= dlm->editedge[a]; - if(eed && eed->h==0) { - if(eed->f & SELECT) glColor3ub(colhi[0], colhi[1], colhi[2]); - else glColor3ub(col[0], col[1], col[2]); - glVertex3fv(mvert[medge->v1].co); - glVertex3fv(mvert[medge->v2].co); - } - } - } - } - else { - glBegin(GL_LINES); - for(eed= em->edges.first; eed; eed= eed->next) { - if(eed->h==0) { - if(eed->f & SELECT) glColor3ub(colhi[0], colhi[1], colhi[2]); - else glColor3ub(col[0], col[1], col[2]); - glVertex3fv(eed->v1->co); - glVertex3fv(eed->v2->co); - } - } - } - glEnd(); - } - } - else if(optimal==0) { - BIF_ThemeColor(TH_WIRE); - glBegin(GL_LINES); - for(eed= em->edges.first; eed; eed= eed->next) { - if(eed->h==0) { - glVertex3fv(eed->v1->co); - glVertex3fv(eed->v2->co); - } - } - glEnd(); + /* show wires in transparant when no zbuf clipping for select */ + if(G.zbuf && (G.vd->flag & V3D_ZBUF_SELECT)==0) { + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_BLEND); + glDisable(GL_DEPTH_TEST); + drawmeshwire_wirextra(dlm, optimal, 85); + glDisable(GL_BLEND); + glEnable(GL_DEPTH_TEST); } + drawmeshwire_wirextra(dlm, optimal, 255); if(G.f & G_DRAWCREASES) drawmeshwire_creases(); @@ -4269,7 +4304,8 @@ void draw_object(Base *base) /* object centers */ if(G.zbuf) glDisable(GL_DEPTH_TEST); - if(ob->type == OB_LAMP) { + if(ob==G.obedit); + else if(ob->type == OB_LAMP) { if(ob->id.lib) { if(base->flag & SELECT) rect= rectllib_sel; else rect= rectllib_desel; diff --git a/source/blender/src/editmesh_mods.c b/source/blender/src/editmesh_mods.c index 1b123e33b96..b2acd58d8a2 100644 --- a/source/blender/src/editmesh_mods.c +++ b/source/blender/src/editmesh_mods.c @@ -644,14 +644,16 @@ static void unified_select_draw(EditVert *eve, EditEdge *eed, EditFace *efa) } if(G.scene->selectmode & SCE_SELECT_FACE) { - glPointSize(BIF_GetThemeValuef(TH_FACEDOT_SIZE)); - - if(efa->f & SELECT) BIF_ThemeColor(TH_FACE_DOT); - else BIF_ThemeColor(TH_WIRE); - - bglBegin(GL_POINTS); - bglVertex3fv(efa->cent); - bglEnd(); + if(efa->fgonf==0) { + glPointSize(BIF_GetThemeValuef(TH_FACEDOT_SIZE)); + + if(efa->f & SELECT) BIF_ThemeColor(TH_FACE_DOT); + else BIF_ThemeColor(TH_WIRE); + + bglBegin(GL_POINTS); + bglVertex3fv(efa->cent); + bglEnd(); + } } } /* edge selected */ |