diff options
-rw-r--r-- | source/blender/blenkernel/intern/subsurf.c | 19 | ||||
-rw-r--r-- | source/blender/src/editmesh.c | 65 | ||||
-rw-r--r-- | source/blender/src/editobject.c | 13 |
3 files changed, 58 insertions, 39 deletions
diff --git a/source/blender/blenkernel/intern/subsurf.c b/source/blender/blenkernel/intern/subsurf.c index bc1ea3fc478..613cc69d9f7 100644 --- a/source/blender/blenkernel/intern/subsurf.c +++ b/source/blender/blenkernel/intern/subsurf.c @@ -402,16 +402,25 @@ static HyperMesh *hypermesh_from_editmesh(EditVert *everts, EditEdge *eedges, Ed EditEdge *ee; EditVlak *ef; + /* we only add vertices with edges, 'f1' is a free flag */ + for (ev= everts; ev; ev= ev->next) ev->f1= 1; + /* hack, tuck the new hypervert pointer into * the ev->prev link so we can find it easy, * then restore real prev links later. */ - for (ev= everts; ev; ev= ev->next) - ev->prev= (EditVert*) hypermesh_add_vert(hme, ev->co, ev->co); - - for (ee= eedges; ee; ee= ee->next) + for (ee= eedges; ee; ee= ee->next) { + if(ee->v1->f1) { + ee->v1->prev= (EditVert*) hypermesh_add_vert(hme, ee->v1->co, ee->v1->co); + ee->v1->f1= 0; + } + if(ee->v2->f1) { + ee->v2->prev= (EditVert*) hypermesh_add_vert(hme, ee->v2->co, ee->v2->co); + ee->v2->f1= 0; + } + hypermesh_add_edge(hme, (HyperVert*) ee->v1->prev, (HyperVert*) ee->v2->prev, 1); - + } for (ef= efaces; ef; ef= ef->next) { int nverts= ef->v4?4:3; HyperVert *verts[4]; diff --git a/source/blender/src/editmesh.c b/source/blender/src/editmesh.c index 72c447054ef..b990fef9eff 100644 --- a/source/blender/src/editmesh.c +++ b/source/blender/src/editmesh.c @@ -85,6 +85,7 @@ #include "BIF_interface.h" #include "BIF_editmesh.h" #include "BIF_mywindow.h" +#include "BIF_resources.h" #include "BIF_glutil.h" #include "BSE_view.h" @@ -1992,39 +1993,29 @@ static EditVert *findnearestvert(short sel) static void tekenvertices_special(int mode, EditVert *act) /* teken = draw */ { - /* for special cases: + /* hackish routine for visual speed: * mode 0: deselect the selected ones, draw then, except act * mode 1: only draw act - * only for visual speed, after it redraws all */ EditVert *eve; - int doit=0; - /* first test if there are special vertices */ - - eve= (EditVert *)G.edve.first; - while(eve) { - eve->f1= 0; - if(eve->h==0) { - if(mode==0) { - if(eve!=act && eve->f & 1) { - doit= 1; - eve->f1= 1; - eve->f -= 1; + if(mode==0) { + eve= (EditVert *)G.edve.first; + while(eve) { + if(eve->h==0) { + if(mode==0) { + if(eve!=act && eve->f & 1) { + eve->f -= 1; + } } } - else if(mode==1) { - if(eve==act) eve->f1= 1; - doit= 1; - } + eve= eve->next; } - eve= eve->next; } - if(doit==0) return; - - if(G.f & (G_FACESELECT+G_DRAWFACES)) { + + if(G.f & (G_FACESELECT|G_DRAWFACES|G_DRAWEDGES)) { + /* update full view later on */ allqueue(REDRAWVIEW3D, 0); - return; } glDrawBuffer(GL_FRONT); @@ -2034,11 +2025,35 @@ static void tekenvertices_special(int mode, EditVert *act) /* teken = draw */ persp(PERSP_VIEW); mymultmatrix(G.obedit->obmat); - tekenvertices(0); - tekenvertices(1); + if(mode==0) { + /* zbuffering is off outside of internal drawing loops... */ + if(G.vd->drawtype > OB_WIRE) { + G.zbuf= 1; + glEnable(GL_DEPTH_TEST); + } + tekenvertices(0); + glDisable(GL_DEPTH_TEST); + } + else { + /* only draw active vertex */ + float size= BIF_GetThemeValuef(TH_VERTEX_SIZE); + char col[3]; + + if(act->f & 1) BIF_GetThemeColor3ubv(TH_VERTEX_SELECT, col); + else BIF_GetThemeColor3ubv(TH_VERTEX, col); + glPointSize(size); + glColor3ub(col[0], col[1], col[2]); + + glBegin(GL_POINTS); + glVertex3fv(act->co); + glEnd(); + + glPointSize(1.0); + } myloadmatrix(G.vd->viewmat); + glFlush(); glDrawBuffer(GL_BACK); } diff --git a/source/blender/src/editobject.c b/source/blender/src/editobject.c index 467e5786178..c1885a2621c 100644 --- a/source/blender/src/editobject.c +++ b/source/blender/src/editobject.c @@ -1065,9 +1065,10 @@ void exit_editmode(int freedata) /* freedata==0 at render */ error("too many vertices"); return; } - load_editMesh(); + load_editMesh(); /* makes new displist */ if(freedata) free_editMesh(); + if(G.f & G_FACESELECT) allqueue(REDRAWIMAGE, 0); build_particle_system(G.obedit); @@ -1094,12 +1095,9 @@ void exit_editmode(int freedata) /* freedata==0 at render */ ob= G.obedit; - /* obedit has to be 0 for curve-extrude, not for smeshes */ - if(ob->type==OB_CURVE) G.obedit= 0; - G.obedit= 0; + /* displist make is different in editmode */ + if(freedata) G.obedit= NULL; makeDispList(ob); - - /* has this influence at other objects? */ if(ob->type==OB_CURVE) { @@ -1134,9 +1132,6 @@ void exit_editmode(int freedata) /* freedata==0 at render */ allqueue(REDRAWBUTSEDIT, 0); allqueue(REDRAWBUTSLOGIC, 0); } - else { - G.obedit= ob; - } scrarea_queue_headredraw(curarea); } |