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>2006-11-15 13:02:57 +0300
committerTon Roosendaal <ton@blender.org>2006-11-15 13:02:57 +0300
commit95c7c41bd060a55fb2679d53635474dc69703ed7 (patch)
tree628320b2a9914bb96a64f6a757c1967db5d6fd3d
parent3d7e802c6c3a0efe686a4ee6213a47f1b0ad3aab (diff)
Bugfix #5224
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.
-rw-r--r--source/blender/include/BSE_drawview.h2
-rw-r--r--source/blender/include/editmesh.h4
-rw-r--r--source/blender/src/drawview.c4
-rw-r--r--source/blender/src/editface.c4
-rw-r--r--source/blender/src/editmesh_loop.c23
-rw-r--r--source/blender/src/editmesh_mods.c32
-rw-r--r--source/blender/src/editobject.c2
7 files changed, 35 insertions, 36 deletions
diff --git a/source/blender/include/BSE_drawview.h b/source/blender/include/BSE_drawview.h
index 041381bbb1a..fa0faf2c05f 100644
--- a/source/blender/include/BSE_drawview.h
+++ b/source/blender/include/BSE_drawview.h
@@ -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);
diff --git a/source/blender/include/editmesh.h b/source/blender/include/editmesh.h
index 2deab0a6f22..e6c24cd7b61 100644
--- a/source/blender/include/editmesh.h
+++ b/source/blender/include/editmesh.h
@@ -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 */
diff --git a/source/blender/src/drawview.c b/source/blender/src/drawview.c
index ee7b462f1da..46c7beeedcc 100644
--- a/source/blender/src/drawview.c
+++ b/source/blender/src/drawview.c
@@ -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;
diff --git a/source/blender/src/editface.c b/source/blender/src/editface.c
index 71ed5a4516b..49194f3fb67 100644
--- a/source/blender/src/editface.c
+++ b/source/blender/src/editface.c
@@ -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;
diff --git a/source/blender/src/editmesh_loop.c b/source/blender/src/editmesh_loop.c
index aeabf3e2b7d..885c64891cb 100644
--- a/source/blender/src/editmesh_loop.c
+++ b/source/blender/src/editmesh_loop.c
@@ -222,12 +222,12 @@ void CutEdgeloop(int numcuts)
{
EditMesh *em = G.editMesh;
EditEdge *nearest=NULL, *eed;
- int keys = 0, holdnum=0, selectmode;
+ float fac;
+ int keys = 0, holdnum=0, selectmode, dist;
short mvalo[2] = {0,0}, mval[2];
- short event,val,choosing=1,cancel=0,dist,cuthalf = 0,smooth=0;
- char msg[128];
+ short event, val, choosing=1, cancel=0, cuthalf = 0, smooth=0;
short hasHidden = 0;
- float fac;
+ 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];
diff --git a/source/blender/src/editmesh_mods.c b/source/blender/src/editmesh_mods.c
index 52befe8a64c..95a0e85a20d 100644
--- a/source/blender/src/editmesh_mods.c
+++ b/source/blender/src/editmesh_mods.c
@@ -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) {
diff --git a/source/blender/src/editobject.c b/source/blender/src/editobject.c
index d66f99941fe..36dc8883b45 100644
--- a/source/blender/src/editobject.c
+++ b/source/blender/src/editobject.c
@@ -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);