diff options
author | Ton Roosendaal <ton@blender.org> | 2004-09-27 14:12:45 +0400 |
---|---|---|
committer | Ton Roosendaal <ton@blender.org> | 2004-09-27 14:12:45 +0400 |
commit | 061442cbd1e69ad494eb22a69a2ae89e72e9d978 (patch) | |
tree | db043e68669d8a0adc68bef0834ecb03b5178264 /source/blender/src/editmesh_mods.c | |
parent | 995826f3edccb064955bf88b36566fd4550af3b9 (diff) |
- improvement for edge/face select
- edges now sample on three locationsm gives more hits
- own version of glPolygonOffset remains cumbersome... but for select
now the selection routine gets more offset than draw.
- first attempt to clean drawobject.c and displists
- generic call for draw object in backbuf for select purposes, cleans up
a lot in the other calls.
- also to verify if we can (in future) use this for vertex/edge/face
select, but the whole drawobject code works against me... this is
for another refactory (incl. displist) and out of the focus for now
- subsurf.c: now creates new faces in order of original. Not used yet, but is
handy to recover the original order for selection/paint purposes.
Diffstat (limited to 'source/blender/src/editmesh_mods.c')
-rw-r--r-- | source/blender/src/editmesh_mods.c | 47 |
1 files changed, 39 insertions, 8 deletions
diff --git a/source/blender/src/editmesh_mods.c b/source/blender/src/editmesh_mods.c index 4b776e7fbaf..4a38cbeeacb 100644 --- a/source/blender/src/editmesh_mods.c +++ b/source/blender/src/editmesh_mods.c @@ -155,7 +155,7 @@ int EM_zbuffer_visible(float *co, short xs, short ys) persp(PERSP_VIEW); mymultmatrix(G.obedit->obmat); - bglPolygonOffset(G.vd->dist); // sets proj matrix + bglPolygonOffset(2.0); // sets proj matrix glGetFloatv(GL_PROJECTION_MATRIX, (float *)pmat); glGetFloatv(GL_MODELVIEW_MATRIX, (float *)vmat); Mat4MulMat4(persmat, vmat, pmat); @@ -178,8 +178,25 @@ int EM_zbuffer_visible(float *co, short xs, short ys) unsigned int zvali; myglReadPixels(xs, ys, &zvali); - // glReadPixels(curarea->winrct.xmin+xs, curarea->winrct.ymin+ys, 1, 1, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, &zvali); zval= ((float)zvali)/((float)0xFFFFFFFF); + if( vec4[2] <= zval) return 1; +/* + myglReadPixels(xs+1, ys, &zvali); + zval= ((float)zvali)/((float)0xFFFFFFFF); + if( vec4[2] <= zval) return 1; + + myglReadPixels(xs, ys+1, &zvali); + zval= ((float)zvali)/((float)0xFFFFFFFF); + if( vec4[2] <= zval) return 1; + + myglReadPixels(xs-1, ys, &zvali); + zval= ((float)zvali)/((float)0xFFFFFFFF); + if( vec4[2] <= zval) return 1; + + myglReadPixels(xs, ys-1, &zvali); + zval= ((float)zvali)/((float)0xFFFFFFFF); + if( vec4[2] <= zval) return 1; +*/ // printf("my proj %f zbuf %x %f mydiff %f\n", vec4[2], zvali, zval, vec4[2]-zval); } else { @@ -256,14 +273,30 @@ static EditVert *findnearestvert(short *dist, short sel) return act; } +/* more samples */ +int EM_zbuffer_edge_visible(float *v1, float *v2, short *val1, short *val2) +{ + float cent[3]; + + /* midpoints work bad in persp mode... */ + VecMidf(cent, v1, v2); + if(EM_zbuffer_visible(cent, (val1[0]+val2[0])/2, (val1[1]+val2[1])/2)) return 1; + + // endpoints; should be both visible + if(EM_zbuffer_visible(v1, val1[0], val1[1])) + if(EM_zbuffer_visible(v1, val2[0], val2[1])) + return 1; + + return 0; +} EditEdge *findnearestedge(short *dist) { EditMesh *em = G.editMesh; EditEdge *closest, *eed; EditVert *eve; - short mval[2], distance; float v1[2], v2[2], mval2[2]; + short mval[2], distance; if(em->edges.first==NULL) return NULL; else eed= em->edges.first; @@ -295,11 +328,9 @@ EditEdge *findnearestedge(short *dist) distance= (short)PdistVL2Dfl(mval2, v1, v2); if(distance < *dist) { - if(EM_zbuffer_visible(eed->v1->co, eed->v1->xs, eed->v1->ys)) { - if(EM_zbuffer_visible(eed->v2->co, eed->v2->xs, eed->v2->ys)) { - *dist= distance; - closest= eed; - } + if(EM_zbuffer_edge_visible(eed->v1->co, eed->v2->co, &eed->v1->xs, &eed->v2->xs)) { + *dist= distance; + closest= eed; } } } |