This did not work how brecht intended - shared location sticky mode first uses the vert then checks the locations match, not just the locations.

updated lasso tool to support this.
This commit is contained in:
Campbell Barton
2007-10-07 02:49:03 +00:00
parent e96b27dd72
commit 8703dd9f52

View File

@@ -533,80 +533,62 @@ static void do_lasso_select_mesh_uv(short mcords[][2], short moves, short select
}
}
} else if ((G.sima->flag & SI_SYNC_UVSEL)==0 && G.sima->sticky == SI_STICKY_LOC) {
/* This is not that nice!
*
* do a proximity based sticky selecion,
* need to do some odd stuff here
*/
int j, face_count=0, coord_end = 0; /* so we know what the last coord is */
float *coords, limit[2];
EditVert *eve;
EditFace *efa_vlist;
MTFace *tf_vlist;
UvMapVert *vlist;
struct UvVertMap *vmap;
float limit[2];
int a;
get_connected_limit_tface_uv(limit);
/* count and index */
/* would be nice to do this within a draw loop but most below are optional, so it would involve too many checks */
for (efa= em->faces.first; efa; efa= efa->next) {
tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
if (SIMA_FACEDRAW_CHECK(efa, tf)) {
efa->tmp.p = tf;
face_count++;
} else {
efa->tmp.p = NULL;
}
}
/* assumes worst case where all quads are selected */
coords = MEM_mallocN(sizeof(float) * face_count * 8, "lasso sticky coords");
for (a=0, eve= em->verts.first; eve; a++, eve= eve->next)
eve->tmp.l = a;
EM_init_index_arrays(0, 0, 1);
vmap= make_uv_vert_map_EM(0, 0, limit);
if(vmap == NULL)
return;
for (efa= em->faces.first; efa; efa= efa->next) {
if ((tf=(MTFace *)efa->tmp.p)) {
if ((select) != (SIMA_FACESEL_CHECK(efa, tf))) {
tface_center(tf, cent, (void *)efa->v4);
uvco_to_areaco_noclip(cent, screenUV);
if (BLI_in_rcti(&rect, screenUV[0], screenUV[1]) && lasso_inside(mcords, moves, screenUV[0], screenUV[1])) {
/* select now so as to avoid a location lookup later on */
tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
if ((select) != (SIMA_FACESEL_CHECK(efa, tf))) {
tface_center(tf, cent, (void *)efa->v4);
uvco_to_areaco_noclip(cent, screenUV);
if (BLI_in_rcti(&rect, screenUV[0], screenUV[1]) && lasso_inside(mcords, moves, screenUV[0], screenUV[1])) {
nverts= efa->v4? 4: 3;
for(i=0; i<nverts; i++) {
if (select) {
SIMA_FACESEL_SET(efa, tf);
SIMA_UVSEL_SET(efa, tf, i);
} else {
SIMA_FACESEL_UNSET(efa, tf);
SIMA_UVSEL_UNSET(efa, tf, i);
}
/* add this face's coords so we can select close coords later on */
nverts= efa->v4? 4: 3;
for(j=0; j<nverts; j++) {
coords[coord_end++] = tf->uv[j][0];
coords[coord_end++] = tf->uv[j][1];
}
}
}
}
}
/* now select verts based on proximity to existing coords */
for (efa= em->faces.first; efa; efa= efa->next) {
if ((tf=(MTFace *)efa->tmp.p)) {
nverts= efa->v4? 4: 3;
for(i=0; i<nverts; i++) {
if ((SIMA_UVSEL_CHECK(efa, tf, i)) != (select) ) {
/* this corner is not selected, check if its next to an adjacent selected uv face */
for (j=0; j<coord_end; j+=2) {
if ( fabs(coords[j ]-tf->uv[i][0]) < limit[0] &&
fabs(coords[j+1]-tf->uv[i][1]) < limit[1] ) {
if (select)
tf->flag |= TF_SEL_MASK(i);
else
tf->flag &= ~TF_SEL_MASK(i);
break;
vlist= get_uv_map_vert_EM(vmap, (*(&efa->v1 + i))->tmp.l);
while (vlist) {
if (!vlist->separate) {
efa_vlist = EM_get_face_for_index(vlist->f);
if (efa != efa_vlist) {
tf_vlist = CustomData_em_get(&em->fdata, efa_vlist->data, CD_MTFACE);
if (select) {
SIMA_UVSEL_SET(efa_vlist, tf_vlist, vlist->tfindex);
} else {
SIMA_UVSEL_UNSET(efa_vlist, tf_vlist, vlist->tfindex);
}
}
}
vlist = vlist->next;
}
}
}
}
}
MEM_freeN(coords);
EM_free_index_arrays();
free_uv_vert_map_EM(vmap);
} else { /* SI_STICKY_DISABLE or G.sima->flag & SI_SYNC_UVSEL */