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 /source/blender/src
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.
Diffstat (limited to 'source/blender/src')
-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
5 files changed, 32 insertions, 33 deletions
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);