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:
authorTon Roosendaal <ton@blender.org>2004-09-27 14:12:45 +0400
committerTon Roosendaal <ton@blender.org>2004-09-27 14:12:45 +0400
commit061442cbd1e69ad494eb22a69a2ae89e72e9d978 (patch)
treedb043e68669d8a0adc68bef0834ecb03b5178264 /source/blender/src/editmesh_mods.c
parent995826f3edccb064955bf88b36566fd4550af3b9 (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.c47
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;
}
}
}