Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/blender/blenkernel/intern/subsurf.c19
-rw-r--r--source/blender/src/editmesh.c65
-rw-r--r--source/blender/src/editobject.c13
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);
}