- rewrote UV Stitch, (seperate from limit stitch now), does much less

work for same results.
- UV Stitch with the V key was not working (as stated in the menu)
- Rotate UV's and Colors now have an option for CCW (was in the menu 
but not implimented)
- Draw face dot in UV when in face mode
This commit is contained in:
2007-09-30 08:28:15 +00:00
parent 51b56a4d3f
commit b47c75953b
6 changed files with 302 additions and 150 deletions

View File

@@ -93,7 +93,8 @@ void mirrormenu_tface_uv(void);
void mirror_tface_uv(char mirroraxis); void mirror_tface_uv(char mirroraxis);
void hide_tface_uv(int swap); void hide_tface_uv(int swap);
void reveal_tface_uv(void); void reveal_tface_uv(void);
void stitch_uv_tface(int mode); void stitch_limit_uv_tface(void);
void stitch_vert_uv_tface(void);
void unlink_selection(void); void unlink_selection(void);
void select_linked_tface_uv(int mode); void select_linked_tface_uv(int mode);
void pin_tface_uv(int mode); void pin_tface_uv(int mode);

View File

@@ -445,10 +445,31 @@ static void drawcursor_sima(float xuser_asp, float yuser_asp)
setlinestyle(0); setlinestyle(0);
} }
// checks if we are selecting only faces
static int draw_uvs_face_check(void)
{
if (G.sima==NULL)
return 0;
if (G.sima->flag & SI_SYNC_UVSEL && G.scene->selectmode == SCE_SELECT_FACE)
return 1;
if (G.sima->flag & SI_SELACTFACE)
return 1;
return 0;
}
void tface_center(MTFace *tf, float cent[2], void * isquad)
{
if (isquad) {
cent[0] = (tf->uv[0][0] + tf->uv[1][0] + tf->uv[2][0] + tf->uv[3][0]) / 4.0;
cent[1] = (tf->uv[0][1] + tf->uv[1][1] + tf->uv[2][1] + tf->uv[3][1]) / 4.0;
} else {
cent[0] = (tf->uv[0][0] + tf->uv[1][0] + tf->uv[2][0]) / 3.0;
cent[1] = (tf->uv[0][1] + tf->uv[1][1] + tf->uv[2][1]) / 3.0;
}
}
/* draws uv's in the image space */ /* draws uv's in the image space */
void draw_uvs_sima(void) void draw_uvs_sima(void)
{ {
MTFace *tface,*activetface = NULL; MTFace *tface,*activetface = NULL;
@@ -457,10 +478,13 @@ void draw_uvs_sima(void)
char col1[4], col2[4]; char col1[4], col2[4];
float pointsize; float pointsize;
int drawface;
if (!G.obedit || !CustomData_has_layer(&em->fdata, CD_MTFACE)) if (!G.obedit || !CustomData_has_layer(&em->fdata, CD_MTFACE))
return; return;
drawface = draw_uvs_face_check();
calc_image_view(G.sima, 'f'); /* float */ calc_image_view(G.sima, 'f'); /* float */
myortho2(G.v2d->cur.xmin, G.v2d->cur.xmax, G.v2d->cur.ymin, G.v2d->cur.ymax); myortho2(G.v2d->cur.xmin, G.v2d->cur.xmax, G.v2d->cur.ymin, G.v2d->cur.ymax);
glLoadIdentity(); glLoadIdentity();
@@ -686,6 +710,51 @@ void draw_uvs_sima(void)
glDisable(GL_BLEND); glDisable(GL_BLEND);
} }
if (drawface) {
// draw UV face points
float cent[2];
/* unselected faces's */
pointsize = BIF_GetThemeValuef(TH_FACEDOT_SIZE);
// TODO - drawobject.c changes this value after - Investiagate!
glPointSize(pointsize);
BIF_ThemeColor(TH_WIRE);
bglBegin(GL_POINTS);
for (efa= em->faces.first; efa; efa= efa->next) {
// tface= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
// if (SIMA_FACEDRAW_CHECK(efa, tface)) {
/*this is a shortcut to do the same as above but a faster for drawing */
if ((tface=(MTFace *)efa->tmp.p)) {
if( ! SIMA_FACESEL_CHECK(efa, tface) ) {
tface_center(tface, cent, (void *)efa->v4);
bglVertex2fv(cent);
}
}
}
bglEnd();
/* selected faces's */
BIF_ThemeColor(TH_FACE_DOT);
bglBegin(GL_POINTS);
for (efa= em->faces.first; efa; efa= efa->next) {
// tface= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
// if (SIMA_FACEDRAW_CHECK(efa, tface)) {
/*this is a shortcut to do the same as above but a faster for drawing */
if ((tface=(MTFace *)efa->tmp.p)) {
if( SIMA_FACESEL_CHECK(efa, tface) ) {
tface_center(tface, cent, (void *)efa->v4);
bglVertex2fv(cent);
}
}
}
bglEnd();
} else {
/* unselected uv's */ /* unselected uv's */
BIF_ThemeColor(TH_VERTEX); BIF_ThemeColor(TH_VERTEX);
pointsize = BIF_GetThemeValuef(TH_VERTEX_SIZE); pointsize = BIF_GetThemeValuef(TH_VERTEX_SIZE);
@@ -754,6 +823,7 @@ void draw_uvs_sima(void)
} }
} }
bglEnd(); bglEnd();
}
glPointSize(1.0); glPointSize(1.0);
} }

View File

@@ -6559,7 +6559,7 @@ void mesh_rotate_uvs(void)
{ {
EditMesh *em = G.editMesh; EditMesh *em = G.editMesh;
EditFace *efa; EditFace *efa;
short change = 0; short change = 0, ccw;
MTFace *tf; MTFace *tf;
float u1, v1; float u1, v1;
@@ -6568,12 +6568,32 @@ void mesh_rotate_uvs(void)
return; return;
} }
ccw = (G.qual == LR_SHIFTKEY);
for(efa=em->faces.first; efa; efa=efa->next) { for(efa=em->faces.first; efa; efa=efa->next) {
if (efa->f & SELECT) { if (efa->f & SELECT) {
tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE); tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
u1= tf->uv[0][0]; u1= tf->uv[0][0];
v1= tf->uv[0][1]; v1= tf->uv[0][1];
if (ccw) {
if(efa->v4) {
tf->uv[0][0]= tf->uv[3][0];
tf->uv[0][1]= tf->uv[3][1];
tf->uv[3][0]= tf->uv[2][0];
tf->uv[3][1]= tf->uv[2][1];
} else {
tf->uv[0][0]= tf->uv[2][0];
tf->uv[0][1]= tf->uv[2][1];
}
tf->uv[2][0]= tf->uv[1][0];
tf->uv[2][1]= tf->uv[1][1];
tf->uv[1][0]= u1;
tf->uv[1][1]= v1;
} else {
tf->uv[0][0]= tf->uv[1][0]; tf->uv[0][0]= tf->uv[1][0];
tf->uv[0][1]= tf->uv[1][1]; tf->uv[0][1]= tf->uv[1][1];
@@ -6591,6 +6611,7 @@ void mesh_rotate_uvs(void)
tf->uv[2][0]= u1; tf->uv[2][0]= u1;
tf->uv[2][1]= v1; tf->uv[2][1]= v1;
} }
}
change = 1; change = 1;
} }
} }
@@ -6657,18 +6678,30 @@ void mesh_rotate_colors(void)
{ {
EditMesh *em = G.editMesh; EditMesh *em = G.editMesh;
EditFace *efa; EditFace *efa;
short change = 0; short change = 0, ccw;
MCol tmpcol, *mcol; MCol tmpcol, *mcol;
if (!EM_vertColorCheck()) { if (!EM_vertColorCheck()) {
error("mesh has no color layers"); error("mesh has no color layers");
return; return;
} }
ccw = (G.qual == LR_SHIFTKEY);
for(efa=em->faces.first; efa; efa=efa->next) { for(efa=em->faces.first; efa; efa=efa->next) {
if (efa->f & SELECT) { if (efa->f & SELECT) {
mcol = CustomData_em_get(&em->fdata, efa->data, CD_MCOL); mcol = CustomData_em_get(&em->fdata, efa->data, CD_MCOL);
tmpcol= mcol[0]; tmpcol= mcol[0];
if (ccw) {
if(efa->v4) {
mcol[0]= mcol[3];
mcol[3]= mcol[2];
} else {
mcol[0]= mcol[2];
}
mcol[2]= mcol[1];
mcol[1]= tmpcol;
} else {
mcol[0]= mcol[1]; mcol[0]= mcol[1];
mcol[1]= mcol[2]; mcol[1]= mcol[2];
@@ -6678,6 +6711,7 @@ void mesh_rotate_colors(void)
} }
else else
mcol[2]= tmpcol; mcol[2]= tmpcol;
}
change = 1; change = 1;
} }
} }

View File

@@ -308,16 +308,100 @@ void weld_align_tface_uv(char tool)
object_uvs_changed(OBACT); object_uvs_changed(OBACT);
} }
// just for averaging UV's
typedef struct UVVertAverage {
float uv[2];
int count;
} UVVertAverage;
void stitch_vert_uv_tface(void)
{
EditMesh *em = G.editMesh;
EditFace *efa;
EditVert *eve;
MTFace *tface;
int count;
UVVertAverage *uv_average, *uvav;
if( is_uv_tface_editing_allowed()==0 ) return;
// index and count verts
for (count=0, eve=em->verts.first; eve; count++, eve= eve->next) {
eve->tmp.l = count;
}
uv_average = MEM_callocN(sizeof(UVVertAverage) * count, "Stitch");
// gather uv averages per vert
for (efa= em->faces.first; efa; efa= efa->next) {
tface = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
if (SIMA_FACEDRAW_CHECK(efa, tface)) {
if (SIMA_UVSEL_CHECK(efa, tface, 0)) {
uvav = uv_average + efa->v1->tmp.l;
uvav->count++;
uvav->uv[0] += tface->uv[0][0];
uvav->uv[1] += tface->uv[0][1];
}
if (SIMA_UVSEL_CHECK(efa, tface, 1)) {
uvav = uv_average + efa->v2->tmp.l;
uvav->count++;
uvav->uv[0] += tface->uv[1][0];
uvav->uv[1] += tface->uv[1][1];
}
if (SIMA_UVSEL_CHECK(efa, tface, 2)) {
uvav = uv_average + efa->v3->tmp.l;
uvav->count++;
uvav->uv[0] += tface->uv[2][0];
uvav->uv[1] += tface->uv[2][1];
}
if (efa->v4 && SIMA_UVSEL_CHECK(efa, tface, 3)) {
uvav = uv_average + efa->v4->tmp.l;
uvav->count++;
uvav->uv[0] += tface->uv[3][0];
uvav->uv[1] += tface->uv[3][1];
}
}
}
// apply uv welding
for (efa= em->faces.first; efa; efa= efa->next) {
tface = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
if (SIMA_FACEDRAW_CHECK(efa, tface)) {
if (SIMA_UVSEL_CHECK(efa, tface, 0)) {
uvav = uv_average + efa->v1->tmp.l;
tface->uv[0][0] = uvav->uv[0]/uvav->count;
tface->uv[0][1] = uvav->uv[1]/uvav->count;
}
if (SIMA_UVSEL_CHECK(efa, tface, 1)) {
uvav = uv_average + efa->v2->tmp.l;
tface->uv[1][0] = uvav->uv[0]/uvav->count;
tface->uv[1][1] = uvav->uv[1]/uvav->count;
}
if (SIMA_UVSEL_CHECK(efa, tface, 2)) {
uvav = uv_average + efa->v3->tmp.l;
tface->uv[2][0] = uvav->uv[0]/uvav->count;
tface->uv[2][1] = uvav->uv[1]/uvav->count;
}
if (efa->v4 && SIMA_UVSEL_CHECK(efa, tface, 3)) {
uvav = uv_average + efa->v4->tmp.l;
tface->uv[3][0] = uvav->uv[0]/uvav->count;
tface->uv[3][1] = uvav->uv[1]/uvav->count;
}
}
}
MEM_freeN(uv_average);
object_uvs_changed(OBACT);
}
void weld_align_menu_tface_uv(void) void weld_align_menu_tface_uv(void)
{ {
short mode= 0; short mode= 0;
if( is_uv_tface_editing_allowed()==0 ) return; if( is_uv_tface_editing_allowed()==0 ) return;
mode= pupmenu("Weld/Align%t|Weld%x1|Align X%x2|Align Y%x3|"); mode= pupmenu("Weld/Align%t|Weld%x1|Align X%x2|Align Y%x3");
if(mode==-1) return; if(mode==-1) return;
if(mode==1) weld_align_tface_uv('w'); if(mode==1) weld_align_tface_uv('w');
else if(mode==2) weld_align_tface_uv('x'); else if(mode==2) weld_align_tface_uv('x');
else if(mode==3) weld_align_tface_uv('y'); else if(mode==3) weld_align_tface_uv('y');
@@ -1201,12 +1285,12 @@ void mouseco_to_cursor_sima(void)
scrarea_queue_winredraw(curarea); scrarea_queue_winredraw(curarea);
} }
void stitch_uv_tface(int mode) void stitch_limit_uv_tface(void)
{ {
MTFace *tf; MTFace *tf;
int a, vtot; int a, vtot;
float newuv[2], limit[2]; float newuv[2], limit[2];
UvMapVert *vlist, *iterv, *v; UvMapVert *vlist, *iterv;
EditMesh *em = G.editMesh; EditMesh *em = G.editMesh;
EditVert *ev; EditVert *ev;
EditFace *efa; EditFace *efa;
@@ -1222,11 +1306,9 @@ void stitch_uv_tface(int mode)
} }
limit[0]= limit[1]= 20.0; limit[0]= limit[1]= 20.0;
if(mode==1) {
add_numbut(0, NUM|FLO, "Limit:", 0.1, 1000.0, &limit[0], NULL); add_numbut(0, NUM|FLO, "Limit:", 0.1, 1000.0, &limit[0], NULL);
if (!do_clever_numbuts("Stitch UVs", 1, REDRAW)) if (!do_clever_numbuts("Stitch UVs", 1, REDRAW))
return; return;
}
limit[0]= limit[1]= limit[0]/256.0; limit[0]= limit[1]= limit[0]/256.0;
if(G.sima->image) { if(G.sima->image) {
@@ -1244,40 +1326,6 @@ void stitch_uv_tface(int mode)
if(vmap == NULL) if(vmap == NULL)
return; return;
if(mode==0) {
for(a=0, ev= em->verts.first; ev; a++, ev= ev->next) {
v = get_uv_map_vert_EM(vmap, a);
if(v == NULL)
continue;
newuv[0]= 0; newuv[1]= 0;
vtot= 0;
for(iterv=v; iterv; iterv=iterv->next) {
efa = EM_get_face_for_index(iterv->f);
tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
if (tf->flag & TF_SEL_MASK(iterv->tfindex)) {
newuv[0] += tf->uv[iterv->tfindex][0];
newuv[1] += tf->uv[iterv->tfindex][1];
vtot++;
}
}
if (vtot > 1) {
newuv[0] /= vtot; newuv[1] /= vtot;
for(iterv=v; iterv; iterv=iterv->next) {
efa = EM_get_face_for_index(iterv->f);
tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
if (tf->flag & TF_SEL_MASK(iterv->tfindex)) {
tf->uv[iterv->tfindex][0]= newuv[0];
tf->uv[iterv->tfindex][1]= newuv[1];
}
}
}
}
} else if(mode==1) {
for(a=0, ev= em->verts.first; ev; a++, ev= ev->next) { for(a=0, ev= em->verts.first; ev; a++, ev= ev->next) {
vlist= get_uv_map_vert_EM(vmap, a); vlist= get_uv_map_vert_EM(vmap, a);
@@ -1315,7 +1363,6 @@ void stitch_uv_tface(int mode)
vlist= iterv; vlist= iterv;
} }
} }
}
free_uv_vert_map_EM(vmap); free_uv_vert_map_EM(vmap);
EM_free_index_arrays(); EM_free_index_arrays();

View File

@@ -970,10 +970,10 @@ static void do_image_uvsmenu(void *arg, int event)
else G.sima->flag |= SI_CLIP_UV; else G.sima->flag |= SI_CLIP_UV;
break; break;
case 3: /* Limit Stitch UVs */ case 3: /* Limit Stitch UVs */
stitch_uv_tface(1); stitch_limit_uv_tface();
break; break;
case 4: /* Stitch UVs */ case 4: /* Stitch UVs */
stitch_uv_tface(0); stitch_vert_uv_tface();
break; break;
case 5: /* Proportional Edit (toggle) */ case 5: /* Proportional Edit (toggle) */
if(G.scene->proportional) if(G.scene->proportional)

View File

@@ -4901,10 +4901,10 @@ static void winqreadimagespace(ScrArea *sa, void *spacedata, BWinEvent *evt)
} }
break; break;
case VKEY: case VKEY:
if(G.qual==LR_SHIFTKEY) if(G.qual == 0)
stitch_uv_tface(0); stitch_vert_uv_tface();
else if(G.qual==LR_SHIFTKEY) else if(G.qual==LR_SHIFTKEY)
stitch_uv_tface(1); stitch_limit_uv_tface();
else if(G.qual==LR_CTRLKEY) else if(G.qual==LR_CTRLKEY)
minimize_stretch_tface_uv(); minimize_stretch_tface_uv();
break; break;