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/src/drawobject.c | |
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/src/drawobject.c')
-rw-r--r-- | source/blender/src/drawobject.c | 262 |
1 files changed, 149 insertions, 113 deletions
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; |