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/displist.c2
-rw-r--r--source/blender/blenkernel/intern/subsurf.c56
-rw-r--r--source/blender/blenlib/BLI_editVert.h1
-rw-r--r--source/blender/include/BDR_drawobject.h3
-rw-r--r--source/blender/src/drawobject.c123
-rw-r--r--source/blender/src/edit.c21
-rw-r--r--source/blender/src/editmesh_add.c2
-rw-r--r--source/blender/src/editmesh_mods.c20
-rw-r--r--source/blender/src/editmesh_tools.c3
-rw-r--r--source/blender/src/editview.c45
10 files changed, 132 insertions, 144 deletions
diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c
index a9e2e879c51..d1542165686 100644
--- a/source/blender/blenkernel/intern/displist.c
+++ b/source/blender/blenkernel/intern/displist.c
@@ -109,6 +109,7 @@ struct _FastLamp {
static FastLamp *fastlamplist= NULL;
static float fviewmat[4][4];
+/* only called from subsurf.c when levels is zero */
DispListMesh *displistmesh_from_editmesh(EditMesh *em)
{
DispListMesh *dlm= MEM_callocN(sizeof(*dlm),"dlm");
@@ -130,6 +131,7 @@ DispListMesh *displistmesh_from_editmesh(EditMesh *em)
for (eve= em->verts.first; eve; eve= eve->next, i++) {
MVert *mvNew= &dlm->mvert[i];
VECCOPY(mvNew->co, eve->co);
+ eve->ssco= eve->co; /* no subsurf coordinate, but we add a save pointer in it */
eve->prev= (void*) i; /* hack to fetch indices */
}
diff --git a/source/blender/blenkernel/intern/subsurf.c b/source/blender/blenkernel/intern/subsurf.c
index 00070fef72c..6e29f1b4add 100644
--- a/source/blender/blenkernel/intern/subsurf.c
+++ b/source/blender/blenkernel/intern/subsurf.c
@@ -171,7 +171,7 @@ struct _HyperVert {
HyperVert *next;
float co[3];
- float *orig; // if set, pointer to original vertex, for handles
+ EditVert *orig; // if set, pointer to original vertex
HyperVert *nmv;
LinkNode *edges, *faces;
};
@@ -256,7 +256,7 @@ static HyperVert *hyperedge_other_vert(HyperEdge *e, HyperVert *a) {
return (a==e->v[0])?e->v[1]:e->v[0];
}
-static HyperVert *hypermesh_add_vert(HyperMesh *hme, float *co, float *orig) {
+static HyperVert *hypermesh_add_vert(HyperMesh *hme, float *co, EditVert *orig) {
HyperVert *hv= BLI_memarena_alloc(hme->arena, sizeof(*hv));
hv->nmv= NULL;
@@ -454,11 +454,11 @@ static HyperMesh *hypermesh_from_editmesh(EditMesh *em, int subdivLevels) {
for (ee= em->edges.first; ee; ee= ee->next) {
if(ee->v1->f1) {
- ee->v1->prev= (EditVert*) hypermesh_add_vert(hme, ee->v1->co, ee->v1->co);
+ ee->v1->prev= (EditVert*) hypermesh_add_vert(hme, ee->v1->co, ee->v1);
ee->v1->f1= 0;
}
if(ee->v2->f1) {
- ee->v2->prev= (EditVert*) hypermesh_add_vert(hme, ee->v2->co, ee->v2->co);
+ ee->v2->prev= (EditVert*) hypermesh_add_vert(hme, ee->v2->co, ee->v2);
ee->v2->f1= 0;
}
if((ee->h & 1)==0) {
@@ -899,16 +899,6 @@ static int hypermesh_get_nverts(HyperMesh *hme) {
return count;
}
-static int hypermesh_get_nverts_handles(HyperMesh *hme) {
- HyperVert *v;
- int count= 0;
-
- for (v= hme->verts; v; v= v->next)
- if(v->orig) count++;
-
- return count;
-}
-
static int hypermesh_get_nfaces(HyperMesh *hme) {
HyperFace *f;
int count= 0;
@@ -929,7 +919,7 @@ static int hypermesh_get_nedges(HyperMesh *hme) {
return count;
}
-/* flag is me->flag, for handles and 'optim' */
+/* flag is me->flag, for 'optim' */
static DispListMesh *hypermesh_to_displistmesh(HyperMesh *hme, short flag) {
int nverts= hypermesh_get_nverts(hme);
int nedges= hypermesh_get_nedges(hme);
@@ -941,7 +931,7 @@ static DispListMesh *hypermesh_to_displistmesh(HyperMesh *hme, short flag) {
TFace *tfaces;
MEdge *med;
MFace *mfaces, *mf;
- int i, j, handles=0;
+ int i, j;
/* hme->orig_me==NULL if we are working on an editmesh */
if (hme->orig_me) {
@@ -952,14 +942,10 @@ static DispListMesh *hypermesh_to_displistmesh(HyperMesh *hme, short flag) {
mfaces= NULL;
}
- /* added: handles for editmode */
- if (hme->orig_me==NULL && (flag & ME_OPT_EDGES)) {
- handles= hypermesh_get_nverts_handles(hme);
- }
-
- dlm->totvert= nverts+handles;
+ /* removed: handles for editmode. it now stores pointer to subsurfed vertex in editvert */
+ dlm->totvert= nverts;
dlm->totface= nfaces;
- dlm->totedge= nedges+handles;
+ dlm->totedge= nedges;
/* calloc for clear flag and nor in mvert */
dlm->mvert= MEM_callocN(dlm->totvert*sizeof(*dlm->mvert), "dlm->mvert");
@@ -999,23 +985,11 @@ static DispListMesh *hypermesh_to_displistmesh(HyperMesh *hme, short flag) {
if(e->flag & HE_SEAM) med->flag |= ME_SEAM;
}
- /* and we add the handles (med is re-used) */
- if(handles) {
- MVert *mv= dlm->mvert+nverts;
-
- i= nverts;
- for (v= hme->verts; v; v= v->next) {
- if(v->orig) {
- /* new vertex */
- Vec3Cpy(mv->co, v->orig);
-
- /* new edge */
- med->v1= (int) v->nmv;
- med->v2= i;
- med->flag = ME_EDGEDRAW;
-
- med++; i++; mv++;
- }
+ /* and we add pointer to subsurfed vertex in editvert */
+ if(hme->orig_me==NULL) {
+ MVert *mv= dlm->mvert;
+ for (v= hme->verts; v; v= v->next, mv++) {
+ if(v->orig) v->orig->ssco= mv->co;
}
}
@@ -1094,7 +1068,7 @@ static DispListMesh *hypermesh_to_displistmesh(HyperMesh *hme, short flag) {
return dlm;
}
-/* flag is me->flag, for handles and 'optim' */
+/* flag is me->flag, and 'optim' */
static DispListMesh *subsurf_subdivide_to_displistmesh(HyperMesh *hme, short subdiv,
short flag, short type) {
DispListMesh *dlm;
diff --git a/source/blender/blenlib/BLI_editVert.h b/source/blender/blenlib/BLI_editVert.h
index 30be5cd7b30..51daf7d0a98 100644
--- a/source/blender/blenlib/BLI_editVert.h
+++ b/source/blender/blenlib/BLI_editVert.h
@@ -44,6 +44,7 @@ typedef struct EditVert
struct EditVert *next, *prev, *vn;
float no[3];
float co[3];
+ float *ssco; /* subsurfed coordinate, dont use for temporal storage! it points to DispListMesh */
short xs, ys;
unsigned char f, h, f1, f2;
short fast; /* only 0 or 1, for editmesh_fastmalloc */
diff --git a/source/blender/include/BDR_drawobject.h b/source/blender/include/BDR_drawobject.h
index 77afe41e73b..a6084081336 100644
--- a/source/blender/include/BDR_drawobject.h
+++ b/source/blender/include/BDR_drawobject.h
@@ -50,9 +50,10 @@ void helpline(float *vec);
void drawaxes(float size);
void drawcamera(struct Object *ob);
+extern int subsurf_optimal(struct Object *ob);
+
void calc_mesh_facedots_ext(void);
void calc_lattverts_ext(void);
-void calc_meshverts(void);
void calc_meshverts_ext(void);
void calc_meshverts_ext_f2(void);
void calc_nurbverts_ext(void);
diff --git a/source/blender/src/drawobject.c b/source/blender/src/drawobject.c
index 202abc6bab2..0c1fb5b0874 100644
--- a/source/blender/src/drawobject.c
+++ b/source/blender/src/drawobject.c
@@ -957,6 +957,16 @@ static void drawlattice(Object *ob)
/* ***************** ******************** */
+int subsurf_optimal(Object *ob)
+{
+ if(ob->type==OB_MESH) {
+ Mesh *me= ob->data;
+ if( (me->flag & ME_OPT_EDGES) && (me->flag & ME_SUBSURF) && me->subdiv) return 1;
+ }
+ return 0;
+}
+
+
void calc_mesh_facedots_ext(void)
{
EditMesh *em = G.editMesh;
@@ -987,7 +997,7 @@ void calc_mesh_facedots_ext(void)
}
/* window coord, assuming all matrices are set OK */
-void calc_meshverts(void)
+static void calc_meshverts(void)
{
EditMesh *em = G.editMesh;
EditVert *eve;
@@ -999,12 +1009,15 @@ void calc_meshverts(void)
MTC_Mat4SwapMat4(G.vd->persmat, mat);
mygetsingmatrix(G.vd->persmat);
- eve= em->verts.first;
- while(eve) {
- if(eve->h==0) {
- project_short(eve->co, &(eve->xs));
+ if(subsurf_optimal(G.obedit)) { // separate loop for speed
+ for(eve= em->verts.first; eve; eve= eve->next) {
+ if(eve->h==0 && eve->ssco) project_short(eve->ssco, &(eve->xs));
+ }
+ }
+ else {
+ for(eve= em->verts.first; eve; eve= eve->next) {
+ if(eve->h==0) project_short(eve->co, &(eve->xs));
}
- eve= eve->next;
}
MTC_Mat4SwapMat4(G.vd->persmat, mat);
}
@@ -1028,6 +1041,7 @@ void calc_meshverts_ext_f2(void)
EditMesh *em = G.editMesh;
EditVert *eve;
float mat[4][4];
+ int optimal= subsurf_optimal(G.obedit);
if(em->verts.first==0) return;
eve= em->verts.first;
@@ -1040,15 +1054,15 @@ void calc_meshverts_ext_f2(void)
MTC_Mat4SwapMat4(G.vd->persmat, mat);
mygetsingmatrix(G.vd->persmat);
- eve= em->verts.first;
- while(eve) {
+ for(eve= em->verts.first; eve; eve= eve->next) {
eve->f &= ~2;
if(eve->h==0) {
- project_short_noclip(eve->co, &(eve->xs));
+ if(optimal && eve->ssco) project_short_noclip(eve->ssco, &(eve->xs));
+ else project_short_noclip(eve->co, &(eve->xs));
+
if( eve->xs >= 0 && eve->ys >= 0 && eve->xs<curarea->winx && eve->ys<curarea->winy);
else eve->f |= 2;
}
- eve= eve->next;
}
/* restore */
@@ -1106,7 +1120,7 @@ void calc_nurbverts_ext(void)
}
-static void draw_vertices(short sel)
+static void draw_vertices(int optimal, int sel)
{
EditMesh *em = G.editMesh;
EditVert *eve;
@@ -1143,8 +1157,16 @@ static void draw_vertices(short sel)
glColor4ub(col[0], col[1], col[2], 100);
bglBegin(GL_POINTS);
- for(eve= em->verts.first; eve; eve= eve->next) {
- if(eve->h==0 && (eve->f & SELECT)==sel ) bglVertex3fv(eve->co);
+ if(optimal) {
+ for(eve= em->verts.first; eve; eve= eve->next) {
+ if(eve->h==0 && (eve->f & SELECT)==sel )
+ if(eve->ssco) bglVertex3fv(eve->ssco);
+ }
+ }
+ else {
+ for(eve= em->verts.first; eve; eve= eve->next) {
+ if(eve->h==0 && (eve->f & SELECT)==sel ) bglVertex3fv(eve->co);
+ }
}
bglEnd();
}
@@ -1172,42 +1194,20 @@ static void draw_vertices(short sel)
if(G.scene->selectmode & SCE_SELECT_VERTEX) {
- if(0) {// test
- float mat[4][4], persmat[4][4], vec4[4];
- float zval;
-
- glFinish(); // maybe for pending polygons
-
- // remake because of polygon offs
- glMatrixMode(GL_PROJECTION);
- glGetFloatv(GL_PROJECTION_MATRIX, (float *)mat);
- glMatrixMode(GL_MODELVIEW);
- Mat4MulMat4(persmat, G.vd->viewmat, mat);
-
- for(eve= em->verts.first; eve; eve= eve->next) {
- if(eve->h==0 && (eve->f & SELECT) ) {
-
- VECCOPY(vec4, eve->co);
- vec4[3]= 1.0;
- Mat4MulVec4fl(persmat, vec4);
- vec4[2]/= vec4[3];
- vec4[2]= 0.5 + vec4[2]/2;
- // test; read 9 pixels
- glReadPixels(curarea->winrct.xmin+eve->xs, curarea->winrct.ymin+eve->ys, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &zval);
-
- //printf("my proj %f zbuf %f mydiff %f\n", vec4[2], zval, vec4[2]-zval);
- if( vec4[2]-zval > 0.0) eve->xs= 3200;
- }
- }
- }
-
glPointSize(size);
glColor3ub(col[0], col[1], col[2]);
bglBegin(GL_POINTS);
- for(eve= em->verts.first; eve; eve= eve->next) {
- if(eve->xs!=3200)
- if(eve->h==0 && (eve->f & SELECT)==sel ) bglVertex3fv(eve->co);
+ if(optimal) {
+ for(eve= em->verts.first; eve; eve= eve->next) {
+ if(eve->h==0 && (eve->f & SELECT)==sel )
+ if(eve->ssco) bglVertex3fv(eve->ssco);
+ }
+ }
+ else {
+ for(eve= em->verts.first; eve; eve= eve->next) {
+ if(eve->h==0 && (eve->f & SELECT)==sel ) bglVertex3fv(eve->co);
+ }
}
bglEnd();
@@ -2520,7 +2520,7 @@ static void drawmeshwire(Object *ob)
EditEdge *eed;
EditFace *efa;
float fvec[3], *f1, *f2, *f3, *f4, *extverts=NULL;
- int a, start, end, test, ok, handles=0;
+ int a, start, end, test, ok, optimal=0;
me= get_mesh(ob);
@@ -2529,7 +2529,7 @@ static void drawmeshwire(Object *ob)
DispListMesh *dlm= NULL;
if(dl) dlm= dl->mesh;
- if( (me->flag & ME_OPT_EDGES) && (me->flag & ME_SUBSURF) && me->subdiv) handles= 1;
+ optimal= subsurf_optimal(ob);
if( (G.f & (G_FACESELECT+G_DRAWFACES))) { /* transp faces */
char col1[4], col2[4];
@@ -2541,7 +2541,7 @@ static void drawmeshwire(Object *ob)
glEnable(GL_BLEND);
glDepthMask(0); // disable write in zbuffer, needed for nice transp
- if(dlm && handles) {
+ if(dlm && optimal) {
for(a=0, mface= dlm->mface; a<dlm->totface; a++, mface++) {
if(mface->v3) {
efa= dlm->editface[a];
@@ -2582,12 +2582,12 @@ static void drawmeshwire(Object *ob)
if(mesh_uses_displist(me)) {
/* dont draw the subsurf when solid... then this is a 'drawextra' */
- if(handles==0 && ob->dt>OB_WIRE && G.vd->drawtype>OB_WIRE);
+ if(optimal==0 && ob->dt>OB_WIRE && G.vd->drawtype>OB_WIRE);
else {
/* don't draw in edge/face mode */
- if(handles && (G.scene->selectmode & SCE_SELECT_VERTEX)==0);
+ if(optimal && (G.scene->selectmode & SCE_SELECT_VERTEX)==0);
else {
- if(handles) BIF_ThemeColor(TH_WIRE);
+ if(optimal) BIF_ThemeColor(TH_WIRE);
else BIF_ThemeColorBlend(TH_WIRE, TH_BACK, 0.7);
drawDispListwire(&me->disp);
@@ -2598,7 +2598,7 @@ static void drawmeshwire(Object *ob)
if(G.scene->selectmode == SCE_SELECT_FACE) {
glBegin(GL_LINES);
- if(dlm && handles) {
+ if(dlm && optimal) {
MEdge *medge= dlm->medge;
MVert *mvert= dlm->mvert;
@@ -2659,7 +2659,7 @@ static void drawmeshwire(Object *ob)
}
else {
glBegin(GL_LINES);
- if(dlm && handles) {
+ if(dlm && optimal) {
MEdge *medge= dlm->medge;
MVert *mvert= dlm->mvert;
@@ -2689,7 +2689,7 @@ static void drawmeshwire(Object *ob)
glEnd();
}
}
- else if(handles==0) {
+ else if(optimal==0) {
BIF_ThemeColor(TH_WIRE);
glBegin(GL_LINES);
for(eed= em->edges.first; eed; eed= eed->next) {
@@ -2703,7 +2703,7 @@ static void drawmeshwire(Object *ob)
if(G.f & G_DRAWCREASES) drawmeshwire_creases();
- if(handles==0 && G.f & G_DRAWSEAMS) {
+ if(optimal==0 && G.f & G_DRAWSEAMS) {
BIF_ThemeColor(TH_EDGE_SEAM);
glLineWidth(2);
@@ -2724,8 +2724,8 @@ static void drawmeshwire(Object *ob)
calc_meshverts();
- draw_vertices(0);
- draw_vertices(1);
+ draw_vertices(optimal, 0);
+ draw_vertices(optimal, 1);
if(G.f & G_DRAWNORMALS) { /* normals */
/*cpack(0xDDDD22);*/
@@ -4099,7 +4099,7 @@ void draw_object(Base *base)
else {
drawmeshsolid(ob, 0);
}
- dtx |= OB_DRAWWIRE; // draws edges, transp faces, subsurf handles, vertices
+ dtx |= OB_DRAWWIRE; // draws edges, transp faces, subsurf optimal, vertices
}
if(ob==G.obedit && (G.f & G_PROPORTIONAL)) draw_prop_circle();
}
@@ -4345,7 +4345,7 @@ void draw_object_ext(Base *base)
static int bbs_mesh_verts(Object *ob, int offset)
{
EditVert *eve;
- int a= offset;
+ int a= offset, optimal= subsurf_optimal(ob);
glPointSize( BIF_GetThemeValuef(TH_VERTEX_SIZE) );
@@ -4353,7 +4353,8 @@ static int bbs_mesh_verts(Object *ob, int offset)
for(eve= G.editMesh->verts.first; eve; eve= eve->next, a++) {
if(eve->h==0) {
cpack( index_to_framebuffer(a) );
- bglVertex3fv(eve->co);
+ if(optimal && eve->ssco) bglVertex3fv(eve->ssco);
+ else bglVertex3fv(eve->co);
}
}
bglEnd();
@@ -4372,7 +4373,7 @@ static int bbs_mesh_wire(Object *ob, int offset)
int index, b, retval, optimal=0;
if(dl) dlm= dl->mesh;
- if( (me->flag & ME_OPT_EDGES) && (me->flag & ME_SUBSURF) && me->subdiv) optimal= 1;
+ optimal= subsurf_optimal(ob);
if(dlm && optimal) {
MEdge *medge= dlm->medge;
diff --git a/source/blender/src/edit.c b/source/blender/src/edit.c
index f2e44425fe8..a198a880781 100644
--- a/source/blender/src/edit.c
+++ b/source/blender/src/edit.c
@@ -152,11 +152,6 @@ int get_border(rcti *rect, short col)
while(TRUE) {
- /* for when a renderwindow is open, and a mouse cursor activates it */
- persp(PERSP_VIEW);
- mywinset(curarea->win);
- persp(PERSP_WIN);
-
/* selection loop while mouse pressed */
getmouseco_areawin(mval);
@@ -173,6 +168,12 @@ int get_border(rcti *rect, short col)
event= extern_qread(&val);
if(event && val) {
+
+ /* for when a renderwindow is open, and a mouse cursor activates it */
+ persp(PERSP_VIEW);
+ mywinset(curarea->win);
+ persp(PERSP_WIN);
+
if(event==ESCKEY) {
retval= 0;
break;
@@ -277,12 +278,12 @@ int get_border(rcti *rect, short col)
event= extern_qread(&val);
- /* still because of the renderwindow... */
- persp(PERSP_VIEW);
- mywinset(curarea->win);
- persp(PERSP_WIN);
+ if(event && val==0) {
+ /* still because of the renderwindow... */
+ persp(PERSP_VIEW);
+ mywinset(curarea->win);
+ persp(PERSP_WIN);
- if(val==0) {
if(event==ESCKEY) {
retval= 0;
break;
diff --git a/source/blender/src/editmesh_add.c b/source/blender/src/editmesh_add.c
index fdcd09c96d3..e7e412ed9be 100644
--- a/source/blender/src/editmesh_add.c
+++ b/source/blender/src/editmesh_add.c
@@ -377,7 +377,7 @@ void adduplicate_mesh(void)
adduplicateflag(SELECT);
waitcursor(0);
- countall(); /* for G.totvert in calc_meshverts() */
+ countall();
transform('d');
}
diff --git a/source/blender/src/editmesh_mods.c b/source/blender/src/editmesh_mods.c
index e0788df5cc2..1b123e33b96 100644
--- a/source/blender/src/editmesh_mods.c
+++ b/source/blender/src/editmesh_mods.c
@@ -581,6 +581,7 @@ static EditFace *findnearestface(short *dist)
/* for interactivity, frontbuffer draw in current window */
static void unified_select_draw(EditVert *eve, EditEdge *eed, EditFace *efa)
{
+ int optimal= subsurf_optimal(G.obedit);
glDrawBuffer(GL_FRONT);
@@ -608,13 +609,13 @@ static void unified_select_draw(EditVert *eve, EditEdge *eed, EditFace *efa)
Mesh *me= G.obedit->data;
DispList *dl= find_displist(&me->disp, DL_MESH);
DispListMesh *dlm= NULL;
-
+
if(efa->fgonf==0) {
if(efa->f & SELECT) BIF_ThemeColor(TH_EDGE_SELECT);
else BIF_ThemeColor(TH_WIRE);
if(dl) dlm= dl->mesh;
- if(dlm && (me->flag & ME_OPT_EDGES) && (me->flag & ME_SUBSURF) && me->subdiv) {
+ if(dlm && optimal) {
MEdge *medge= dlm->medge;
MVert *mvert= dlm->mvert;
int b;
@@ -659,10 +660,8 @@ static void unified_select_draw(EditVert *eve, EditEdge *eed, EditFace *efa)
Mesh *me= G.obedit->data;
DispList *dl= find_displist(&me->disp, DL_MESH);
DispListMesh *dlm= NULL;
- int optimal=0;
if(dl) dlm= dl->mesh;
- if( (me->flag & ME_OPT_EDGES) && (me->flag & ME_SUBSURF) && me->subdiv) optimal= 1;
if(eed->f & SELECT) BIF_ThemeColor(TH_EDGE_SELECT);
else BIF_ThemeColor(TH_WIRE);
@@ -698,20 +697,27 @@ static void unified_select_draw(EditVert *eve, EditEdge *eed, EditFace *efa)
else BIF_ThemeColor(TH_VERTEX);
bglBegin(GL_POINTS);
- bglVertex3fv(eed->v1->co);
- bglVertex3fv(eed->v2->co);
+ if(optimal) {
+ bglVertex3fv(eed->v1->ssco);
+ bglVertex3fv(eed->v2->ssco);
+ } else {
+ bglVertex3fv(eed->v1->co);
+ bglVertex3fv(eed->v2->co);
+ }
bglEnd();
}
}
if(eve) {
if(G.scene->selectmode & SCE_SELECT_VERTEX) {
+
glPointSize(BIF_GetThemeValuef(TH_VERTEX_SIZE));
if(eve->f & SELECT) BIF_ThemeColor(TH_VERTEX_SELECT);
else BIF_ThemeColor(TH_VERTEX);
bglBegin(GL_POINTS);
- bglVertex3fv(eve->co);
+ if(optimal) bglVertex3fv(eve->ssco);
+ else bglVertex3fv(eve->co);
bglEnd();
}
}
diff --git a/source/blender/src/editmesh_tools.c b/source/blender/src/editmesh_tools.c
index a14643e5e3a..ccd4e8b7ed7 100644
--- a/source/blender/src/editmesh_tools.c
+++ b/source/blender/src/editmesh_tools.c
@@ -543,8 +543,7 @@ void extrude_mesh(void)
}
else {
EM_fgon_flags();
- countall(); /* for G.totvert in calc_meshverts() */
- calc_meshverts();
+ countall();
transform('n');
}
diff --git a/source/blender/src/editview.c b/source/blender/src/editview.c
index d2acf2f3f01..49a077ced21 100644
--- a/source/blender/src/editview.c
+++ b/source/blender/src/editview.c
@@ -331,36 +331,36 @@ static void do_lasso_select_mesh(short mcords[][2], short moves, short select)
if(G.scene->selectmode & SCE_SELECT_EDGE) {
short done= 0;
- if(bbsel==0) calc_meshverts_ext_f2(); /* doesnt clip, drawobject.c */
+ calc_meshverts_ext_f2(); /* doesnt clip, drawobject.c */
index= em_solidoffs;
+
/* two stages, for nice edge select first do 'both points in rect'
- unless bbsel is true */
+ also when bbsel is true */
for(eed= em->edges.first; eed; eed= eed->next, index++) {
if(eed->h==0) {
- if(bbsel) {
- if(EM_check_backbuf_border(index)) {
- EM_select_edge(eed, select);
- done= 1;
- }
- }
- else if(edge_fully_inside_rect(rect, eed->v1->xs, eed->v1->ys, eed->v2->xs, eed->v2->ys)) {
+ if(edge_fully_inside_rect(rect, eed->v1->xs, eed->v1->ys, eed->v2->xs, eed->v2->ys)) {
if(lasso_inside(mcords, moves, eed->v1->xs, eed->v1->ys)) {
if(lasso_inside(mcords, moves, eed->v2->xs, eed->v2->ys)) {
- EM_select_edge(eed, select);
- done = 1;
+ if(EM_check_backbuf_border(index)) {
+ EM_select_edge(eed, select);
+ done = 1;
+ }
}
}
}
}
}
- if(bbsel==0 && done==0) {
+ if(done==0) {
index= em_solidoffs;
for(eed= em->edges.first; eed; eed= eed->next, index++) {
if(eed->h==0) {
- if(lasso_inside_edge(mcords, moves, &eed->v1->xs, &eed->v2->xs)) {
+ if(bbsel) {
+ if(EM_check_backbuf_border(index))
+ EM_select_edge(eed, select);
+ }
+ else if(lasso_inside_edge(mcords, moves, &eed->v1->xs, &eed->v2->xs)) {
EM_select_edge(eed, select);
- done = 1;
}
}
}
@@ -1094,13 +1094,13 @@ void borderselect(void)
if(G.scene->selectmode & SCE_SELECT_EDGE) {
short done= 0;
- if(bbsel==0) calc_meshverts_ext_f2(); /* doesnt clip, drawobject.c */
+ calc_meshverts_ext_f2(); /* doesnt clip, drawobject.c */
index= em_solidoffs;
/* two stages, for nice edge select first do 'both points in rect'
- unless bbsel is true */
+ also when bbsel is true */
for(eed= em->edges.first; eed; eed= eed->next, index++) {
if(eed->h==0) {
- if(bbsel || edge_fully_inside_rect(rect, eed->v1->xs, eed->v1->ys, eed->v2->xs, eed->v2->ys)) {
+ if(edge_fully_inside_rect(rect, eed->v1->xs, eed->v1->ys, eed->v2->xs, eed->v2->ys)) {
if(EM_check_backbuf_border(index)) {
EM_select_edge(eed, val==LEFTMOUSE);
done = 1;
@@ -1108,14 +1108,17 @@ void borderselect(void)
}
}
}
-
- if(bbsel==0 && done==0) {
+
+ if(done==0) {
index= em_solidoffs;
for(eed= em->edges.first; eed; eed= eed->next, index++) {
if(eed->h==0) {
- if(edge_inside_rect(rect, eed->v1->xs, eed->v1->ys, eed->v2->xs, eed->v2->ys)) {
+ if(bbsel) {
+ if(EM_check_backbuf_border(index))
+ EM_select_edge(eed, val==LEFTMOUSE);
+ }
+ else if(edge_inside_rect(rect, eed->v1->xs, eed->v1->ys, eed->v2->xs, eed->v2->ys)) {
EM_select_edge(eed, val==LEFTMOUSE);
- done = 1;
}
}
}