Prob: selection sometimes gave wrong edges/faces

Selection code for editmesh was still using a short for calculating the
distance of a projected vertex/edge/face from the mouse position. In
zoomed in cases that'll give overflows and unpredictable results.

It was fixed only half before... now all shorts are removed for distance
calculus.
This commit is contained in:
2006-11-15 10:02:57 +00:00
parent 3d7e802c6c
commit 95c7c41bd0
7 changed files with 36 additions and 37 deletions

View File

@@ -55,7 +55,7 @@ void backdrawview3d(int test);
void check_backbuf(void);
unsigned int sample_backbuf(int x, int y);
struct ImBuf *read_backbuf(short xmin, short ymin, short xmax, short ymax);
unsigned int sample_backbuf_rect(short mval[2], int size, unsigned int min, unsigned int max, short *dist);;
unsigned int sample_backbuf_rect(short mval[2], int size, unsigned int min, unsigned int max, int *dist);;
void drawview3dspace(struct ScrArea *sa, void *spacedata);
void drawview3d_render(struct View3D *v3d, int winx, int winy);

View File

@@ -89,8 +89,8 @@ extern void translateflag(short flag, float *vec);
extern int convex(float *v1, float *v2, float *v3, float *v4);
/* ******************* editmesh_mods.c */
extern EditEdge *findnearestedge(short *dist);
extern EditVert *findnearestvert(short *dist, short sel);
extern EditEdge *findnearestedge(int *dist);
extern EditVert *findnearestvert(int *dist, short sel);
/* ******************* editmesh_tools.c */

View File

@@ -1233,13 +1233,13 @@ ImBuf *read_backbuf(short xmin, short ymin, short xmax, short ymax)
}
/* smart function to sample a rect spiralling outside, nice for backbuf selection */
unsigned int sample_backbuf_rect(short mval[2], int size, unsigned int min, unsigned int max, short *dist)
unsigned int sample_backbuf_rect(short mval[2], int size, unsigned int min, unsigned int max, int *dist)
{
struct ImBuf *buf;
unsigned int *bufmin, *bufmax, *tbuf;
int minx, miny;
int a, b, rc, nr, amount, dirvec[4][2];
short distance=0;
int distance=0;
unsigned int index = 0;
amount= (size-1)/2;

View File

@@ -135,7 +135,7 @@ int facesel_face_pick(Mesh *me, short *mval, unsigned int *index, short rect)
if (rect) {
/* sample rect to increase changes of selecting, so that when clicking
on an edge in the backbuf, we can still select a face */
short dist;
int dist;
*index = sample_backbuf_rect(mval, 3, 1, me->totface+1, &dist);
}
else
@@ -153,7 +153,7 @@ int facesel_face_pick(Mesh *me, short *mval, unsigned int *index, short rect)
/* returns 0 if not found, otherwise 1 */
static int facesel_edge_pick(Mesh *me, short *mval, unsigned int *index)
{
short dist;
int dist;
unsigned int min = me->totface + 1;
unsigned int max = me->totface + me->totedge + 1;

View File

@@ -222,12 +222,12 @@ void CutEdgeloop(int numcuts)
{
EditMesh *em = G.editMesh;
EditEdge *nearest=NULL, *eed;
int keys = 0, holdnum=0, selectmode;
short mvalo[2] = {0,0}, mval[2];
short event,val,choosing=1,cancel=0,dist,cuthalf = 0,smooth=0;
char msg[128];
short hasHidden = 0;
float fac;
int keys = 0, holdnum=0, selectmode, dist;
short mvalo[2] = {0,0}, mval[2];
short event, val, choosing=1, cancel=0, cuthalf = 0, smooth=0;
short hasHidden = 0;
char msg[128];
selectmode = G.scene->selectmode;
@@ -487,16 +487,15 @@ typedef struct CutCurve {
static CutCurve *get_mouse_trail(int *len, char mode, char cutmode, struct GHash *gh)
{
CutCurve *curve,*temp;
EditVert *snapvert;
float *scr, mval[2], lastx=0, lasty=0;
int i=0, j, blocks=1, lasti=0;
int dist, tolerance;
short event, val, qual, vsnap=0, ldown=0, restart=0, rubberband=0;
short mval1[2], lockaxis=0, lockx=0, locky=0, oldmode;
EditVert *snapvert;
short sdist, stolerance;
float *scr, mval[2], lastx=0, lasty=0;
*len=0;
stolerance = 75;
tolerance = 75;
curve=(CutCurve *)MEM_callocN(1024*sizeof(CutCurve), "MouseTrail");
@@ -562,12 +561,12 @@ static CutCurve *get_mouse_trail(int *len, char mode, char cutmode, struct GHash
if(vsnap){
persp(PERSP_VIEW);
sdist = stolerance;
snapvert = findnearestvert(&sdist, SELECT);
dist = tolerance;
snapvert = findnearestvert(&dist, SELECT);
glColor3ub(255, 0, 255);
glDrawBuffer(GL_FRONT);
persp(PERSP_WIN);
if(snapvert && (sdist < stolerance)){
if(snapvert && (dist < tolerance)){
scr = BLI_ghash_lookup(gh, snapvert);
mval[0] = scr[0];
mval[1] = scr[1];

View File

@@ -352,14 +352,14 @@ static void findnearestvert__doClosest(void *userData, EditVert *eve, int x, int
}
}
}
EditVert *findnearestvert(short *dist, short sel)
EditVert *findnearestvert(int *dist, short sel)
{
short mval[2];
getmouseco_areawin(mval);
if(G.vd->drawtype>OB_WIRE && (G.vd->flag & V3D_ZBUF_SELECT)) {
short distance;
int distance;
unsigned int index = sample_backbuf_rect(mval, 50, em_wireoffs, 0xFFFFFF, &distance);
EditVert *eve = BLI_findlink(&G.editMesh->verts, index-1);
@@ -421,9 +421,9 @@ static float labda_PdistVL2Dfl( float *v1, float *v2, float *v3)
/* note; uses G.vd, so needs active 3d window */
static void findnearestedge__doClosest(void *userData, EditEdge *eed, int x0, int y0, int x1, int y1, int index)
{
struct { float mval[2]; short dist; EditEdge *closest; } *data = userData;
struct { float mval[2]; int dist; EditEdge *closest; } *data = userData;
float v1[2], v2[2];
short distance;
int distance;
v1[0] = x0;
v1[1] = y0;
@@ -454,14 +454,14 @@ static void findnearestedge__doClosest(void *userData, EditEdge *eed, int x0, in
}
}
}
EditEdge *findnearestedge(short *dist)
EditEdge *findnearestedge(int *dist)
{
short mval[2];
getmouseco_areawin(mval);
if(G.vd->drawtype>OB_WIRE && (G.vd->flag & V3D_ZBUF_SELECT)) {
short distance;
int distance;
unsigned int index = sample_backbuf_rect(mval, 50, em_solidoffs, em_wireoffs, &distance);
EditEdge *eed = BLI_findlink(&G.editMesh->edges, index-1);
@@ -473,7 +473,7 @@ EditEdge *findnearestedge(short *dist)
}
}
else {
struct { float mval[2]; short dist; EditEdge *closest; } data;
struct { float mval[2]; int dist; EditEdge *closest; } data;
data.mval[0] = mval[0];
data.mval[1] = mval[1];
@@ -489,10 +489,10 @@ EditEdge *findnearestedge(short *dist)
static void findnearestface__getDistance(void *userData, EditFace *efa, int x, int y, int index)
{
struct { short mval[2], dist; EditFace *toFace; } *data = userData;
struct { short mval[2]; int dist; EditFace *toFace; } *data = userData;
if (efa==data->toFace) {
short temp = abs(data->mval[0]-x) + abs(data->mval[1]-y);
int temp = abs(data->mval[0]-x) + abs(data->mval[1]-y);
if (temp<data->dist)
data->dist = temp;
@@ -500,7 +500,7 @@ static void findnearestface__getDistance(void *userData, EditFace *efa, int x, i
}
static void findnearestface__doClosest(void *userData, EditFace *efa, int x, int y, int index)
{
struct { short mval[2], pass, dist; int lastIndex, closestIndex; EditFace *closest; } *data = userData;
struct { short mval[2], pass; int dist, lastIndex, closestIndex; EditFace *closest; } *data = userData;
if (data->pass==0) {
if (index<=data->lastIndex)
@@ -511,7 +511,7 @@ static void findnearestface__doClosest(void *userData, EditFace *efa, int x, int
}
if (data->dist>3) {
short temp = abs(data->mval[0]-x) + abs(data->mval[1]-y);
int temp = abs(data->mval[0]-x) + abs(data->mval[1]-y);
if (temp<data->dist) {
data->dist = temp;
@@ -520,7 +520,7 @@ static void findnearestface__doClosest(void *userData, EditFace *efa, int x, int
}
}
}
static EditFace *findnearestface(short *dist)
static EditFace *findnearestface(int *dist)
{
short mval[2];
@@ -531,7 +531,7 @@ static EditFace *findnearestface(short *dist)
EditFace *efa = BLI_findlink(&G.editMesh->faces, index-1);
if (efa) {
struct { short mval[2], dist; EditFace *toFace; } data;
struct { short mval[2]; int dist; EditFace *toFace; } data;
data.mval[0] = mval[0];
data.mval[1] = mval[1];
@@ -549,7 +549,7 @@ static EditFace *findnearestface(short *dist)
return NULL;
}
else {
struct { short mval[2], pass, dist; int lastIndex, closestIndex; EditFace *closest; } data;
struct { short mval[2], pass; int dist, lastIndex, closestIndex; EditFace *closest; } data;
static int lastSelectedIndex=0;
static EditFace *lastSelected=NULL;
@@ -727,7 +727,7 @@ static void unified_select_draw(EditVert *eve, EditEdge *eed, EditFace *efa)
*/
static int unified_findnearest(EditVert **eve, EditEdge **eed, EditFace **efa)
{
short dist= 75;
int dist= 75;
*eve= NULL;
*eed= NULL;
@@ -1535,7 +1535,7 @@ static void mouse_mesh_loop(void)
{
EditEdge *eed;
int select;
short dist= 50;
int dist= 50;
eed= findnearestedge(&dist);
if(eed) {

View File

@@ -1260,7 +1260,7 @@ static Object *group_objects_menu(Group *group)
str= MEM_callocN(40+32*len, "menu");
strcpy(str, "Select a Group Object %t");
strcpy(str, "Make Proxy for: %t");
a= strlen(str);
for(nr=1, go= group->gobject.first; go; go= go->next, nr++) {
a+= sprintf(str+a, "|%s %%x%d", go->ob->id.name+2, nr);