2D Cursor in UV window

this can be placed by the moused and used for transforming around.

still need numeric location input but no room left in the image panel.
This commit is contained in:
2007-09-14 16:12:17 +00:00
parent 6e38ff32be
commit 1bde4e3274
9 changed files with 325 additions and 215 deletions

View File

@@ -49,6 +49,7 @@ int minmax_tface_uv(float *min, float *max);
void transform_width_height_tface_uv(int *width, int *height);
void transform_aspect_ratio_tface_uv(float *aspx, float *aspy);
void mouseco_to_cursor_sima(void);
void borderselect_sima(short whichuvs);
void mouseco_to_curtile(void);
void mouse_select_sima(void);

View File

@@ -422,6 +422,7 @@ void calculateCenterBound(TransInfo *t);
void calculateCenterMedian(TransInfo *t);
void calculateCenterCursor(TransInfo *t);
void calculateCenterCursor2D(TransInfo *t);
void calculatePropRatio(TransInfo *t);
void getViewVector(float coord[3], float vec[3]);

View File

@@ -45,6 +45,10 @@ typedef struct View2D {
short keepaspect, keepzoom;
short oldwinx, oldwiny;
int flag;
float cursor[2]; /* only used in the UV view for now*/
short around;
char pad[6];
} View2D;
/* v2d->keepzoom */

View File

@@ -367,218 +367,262 @@ void uvco_to_areaco_noclip(float *vec, int *mval)
mval[1]= y;
}
static void drawcursor_sima(void)
{
int wi, hi;
float w, h;
transform_width_height_tface_uv(&wi, &hi);
w = (((float)wi)/256.0f)*G.sima->zoom;
h = (((float)hi)/256.0f)*G.sima->zoom;
cpack(0xFFFFFF);
glTranslatef(G.v2d->cursor[0], G.v2d->cursor[1], 0.0f);
fdrawline(-0.05/w, 0, 0, 0.05/h);
fdrawline(0, 0.05/h, 0.05/w, 0);
fdrawline(0.05/w, 0, 0, -0.05/h);
fdrawline(0, -0.05/h, -0.05/w, 0);
setlinestyle(4);
cpack(0xFF);
fdrawline(-0.05/w, 0, 0, 0.05/h);
fdrawline(0, 0.05/h, 0.05/w, 0);
fdrawline(0.05/w, 0, 0, -0.05/h);
fdrawline(0, -0.05/h, -0.05/w, 0);
setlinestyle(0);
cpack(0x0);
fdrawline(-0.020/w, 0, -0.1/w, 0);
fdrawline(0.1/w, 0, .020/w, 0);
fdrawline(0, -0.020/h, 0, -0.1/h);
fdrawline(0, 0.1/h, 0, 0.020/h);
setlinestyle(1);
cpack(0xFFFFFF);
fdrawline(-0.020/w, 0, -0.1/w, 0);
fdrawline(0.1/w, 0, .020/w, 0);
fdrawline(0, -0.020/h, 0, -0.1/h);
fdrawline(0, 0.1/h, 0, 0.020/h);
glTranslatef(-G.v2d->cursor[0], -G.v2d->cursor[1], 0.0f);
setlinestyle(0);
}
void draw_tfaces(void)
{
MTFace *tface,*activetface = NULL;
EditMesh *em = G.editMesh;
EditFace *efa;
/*int a;*/
char col1[4], col2[4];
float pointsize= BIF_GetThemeValuef(TH_VERTEX_SIZE);
if (G.obedit) {
if (CustomData_has_layer(&em->fdata, CD_MTFACE)) {
calc_image_view(G.sima, 'f'); /* float */
myortho2(G.v2d->cur.xmin, G.v2d->cur.xmax, G.v2d->cur.ymin, G.v2d->cur.ymax);
glLoadIdentity();
if (!G.obedit || !CustomData_has_layer(&em->fdata, CD_MTFACE))
return;
/* draw shadow mesh */
if ((G.sima->flag & SI_DRAWSHADOW) && (G.obedit==OBACT)) { /* TODO - editmesh */
DerivedMesh *dm;
/* draw final mesh with modifiers applied */
/* should test - editmesh_get_derived_cage_and_final */
dm = editmesh_get_derived_base();
calc_image_view(G.sima, 'f'); /* float */
myortho2(G.v2d->cur.xmin, G.v2d->cur.xmax, G.v2d->cur.ymin, G.v2d->cur.ymax);
glLoadIdentity();
glColor3ub(112, 112, 112);
if (dm->drawUVEdges) dm->drawUVEdges(dm);
/* draw shadow mesh */
if ((G.sima->flag & SI_DRAWSHADOW) && (G.obedit==OBACT)) { /* TODO - editmesh */
DerivedMesh *dm;
dm->release(dm);
}
else if((G.sima->flag & SI_DRAWTOOL) || (G.obedit==OBACT)) {
/* draw mesh without modifiers applied */
/* draw final mesh with modifiers applied */
/* should test - editmesh_get_derived_cage_and_final */
dm = editmesh_get_derived_base();
if (G.obedit) {
glColor3ub(112, 112, 112);
for (efa= em->faces.first; efa; efa= efa->next) {
/*if(!(mface->flag & ME_HIDE) && (mface->flag & ME_FACE_SEL)) {*/
if(!(efa->flag & ME_HIDE) && (efa->f & SELECT)) {
tface= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
glBegin(GL_LINE_LOOP);
glVertex2fv(tface->uv[0]);
glVertex2fv(tface->uv[1]);
glVertex2fv(tface->uv[2]);
if(efa->v4) glVertex2fv(tface->uv[3]);
glEnd();
}
}
}
}
glColor3ub(112, 112, 112);
if (dm->drawUVEdges) dm->drawUVEdges(dm);
if((G.sima->flag & SI_DRAWTOOL) || !(G.obedit==OBACT))
return; /* only draw shadow mesh */
/* draw transparent faces */
if(G.f & G_DRAWFACES) {
BIF_GetThemeColor4ubv(TH_FACE, col1);
BIF_GetThemeColor4ubv(TH_FACE_SELECT, col2);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
for (efa= em->faces.first; efa; efa= efa->next) {
if(efa->f & SELECT) {
tface= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
if(!(~tface->flag & (TF_SEL1|TF_SEL2|TF_SEL3)) &&
(!efa->v4 || tface->flag & TF_SEL4))
glColor4ubv((GLubyte *)col2);
else
glColor4ubv((GLubyte *)col1);
glBegin(efa->v4?GL_QUADS:GL_TRIANGLES);
glVertex2fv(tface->uv[0]);
glVertex2fv(tface->uv[1]);
glVertex2fv(tface->uv[2]);
if(efa->v4) glVertex2fv(tface->uv[3]);
glEnd();
}
}
glDisable(GL_BLEND);
}
dm->release(dm);
}
else if((G.sima->flag & SI_DRAWTOOL) || (G.obedit==OBACT)) {
/* draw mesh without modifiers applied */
if (G.obedit) {
glColor3ub(112, 112, 112);
for (efa= em->faces.first; efa; efa= efa->next) {
if (efa->f & SELECT) {
/*if(!(mface->flag & ME_HIDE) && (mface->flag & ME_FACE_SEL)) {*/
if(!(efa->flag & ME_HIDE) && (efa->f & SELECT)) {
tface= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
cpack(0x0);
glBegin(GL_LINE_LOOP);
glVertex2fv(tface->uv[0]);
glVertex2fv(tface->uv[1]);
glVertex2fv(tface->uv[2]);
if(efa->v4) glVertex2fv(tface->uv[3]);
glEnd();
setlinestyle(2);
cpack(0xFFFFFF);
glBegin(GL_LINE_STRIP);
glVertex2fv(tface->uv[0]);
glVertex2fv(tface->uv[1]);
glEnd();
glBegin(GL_LINE_STRIP);
glVertex2fv(tface->uv[0]);
if(efa->v4) glVertex2fv(tface->uv[3]);
else glVertex2fv(tface->uv[2]);
glEnd();
glBegin(GL_LINE_STRIP);
glVertex2fv(tface->uv[1]);
glVertex2fv(tface->uv[2]);
if(efa->v4) glVertex2fv(tface->uv[3]);
glEnd();
setlinestyle(0);
}
}
/* draw active face edges */
/*if (activetface){*/
/* colors: R=u G=v */
activetface = get_active_mtface(&efa, NULL);
if (activetface) {
setlinestyle(2);
tface=activetface;
/*mface=activemface;*/
cpack(0x0);
glBegin(GL_LINE_LOOP);
glVertex2fv(tface->uv[0]);
glBegin(GL_LINE_LOOP);
glVertex2fv(tface->uv[0]);
glVertex2fv(tface->uv[1]);
glVertex2fv(tface->uv[2]);
if(efa->v4) glVertex2fv(tface->uv[3]);
glEnd();
cpack(0xFF00);
glBegin(GL_LINE_STRIP);
glVertex2fv(tface->uv[0]);
glVertex2fv(tface->uv[1]);
glEnd();
cpack(0xFF);
glBegin(GL_LINE_STRIP);
glVertex2fv(tface->uv[0]);
if(efa->v4) glVertex2fv(tface->uv[3]);
else glVertex2fv(tface->uv[2]);
glEnd();
cpack(0xFFFFFF);
glBegin(GL_LINE_STRIP);
glVertex2fv(tface->uv[1]);
glVertex2fv(tface->uv[2]);
if(efa->v4) glVertex2fv(tface->uv[3]);
glEnd();
setlinestyle(0);
}
/* unselected uv's */
BIF_ThemeColor(TH_VERTEX);
glPointSize(pointsize);
bglBegin(GL_POINTS);
for (efa= em->faces.first; efa; efa= efa->next) {
if (efa->f & SELECT) {
tface= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
if(tface->flag & TF_SEL1); else bglVertex2fv(tface->uv[0]);
if(tface->flag & TF_SEL2); else bglVertex2fv(tface->uv[1]);
if(tface->flag & TF_SEL3); else bglVertex2fv(tface->uv[2]);
if(efa->v4) {
if(tface->flag & TF_SEL4); else bglVertex2fv(tface->uv[3]);
}
glEnd();
}
}
bglEnd();
/* pinned uv's */
/* give odd pointsizes odd pin pointsizes */
glPointSize(pointsize*2 + (((int)pointsize % 2)? (-1): 0));
cpack(0xFF);
bglBegin(GL_POINTS);
for (efa= em->faces.first; efa; efa= efa->next) {
if (efa->f & SELECT) {
tface= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
if(tface->unwrap & TF_PIN1) bglVertex2fv(tface->uv[0]);
if(tface->unwrap & TF_PIN2) bglVertex2fv(tface->uv[1]);
if(tface->unwrap & TF_PIN3) bglVertex2fv(tface->uv[2]);
if(efa->v4) {
if(tface->unwrap & TF_PIN4) bglVertex2fv(tface->uv[3]);
}
}
}
bglEnd();
/* selected uv's */
BIF_ThemeColor(TH_VERTEX_SELECT);
glPointSize(pointsize);
bglBegin(GL_POINTS);
for (efa= em->faces.first; efa; efa= efa->next) {
if (efa->f & SELECT) {
tface= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
if(tface->flag & TF_SEL1) bglVertex2fv(tface->uv[0]);
if(tface->flag & TF_SEL2) bglVertex2fv(tface->uv[1]);
if(tface->flag & TF_SEL3) bglVertex2fv(tface->uv[2]);
if(efa->v4) {
if(tface->flag & TF_SEL4) bglVertex2fv(tface->uv[3]);
}
}
}
bglEnd();
glPointSize(1.0);
}
}
if((G.sima->flag & SI_DRAWTOOL) || !(G.obedit==OBACT))
return; /* only draw shadow mesh */
/* draw transparent faces */
if(G.f & G_DRAWFACES) {
BIF_GetThemeColor4ubv(TH_FACE, col1);
BIF_GetThemeColor4ubv(TH_FACE_SELECT, col2);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
for (efa= em->faces.first; efa; efa= efa->next) {
if(efa->f & SELECT) {
tface= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
if(!(~tface->flag & (TF_SEL1|TF_SEL2|TF_SEL3)) &&
(!efa->v4 || tface->flag & TF_SEL4))
glColor4ubv((GLubyte *)col2);
else
glColor4ubv((GLubyte *)col1);
glBegin(efa->v4?GL_QUADS:GL_TRIANGLES);
glVertex2fv(tface->uv[0]);
glVertex2fv(tface->uv[1]);
glVertex2fv(tface->uv[2]);
if(efa->v4) glVertex2fv(tface->uv[3]);
glEnd();
}
}
glDisable(GL_BLEND);
}
for (efa= em->faces.first; efa; efa= efa->next) {
if (efa->f & SELECT) {
tface= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
cpack(0x0);
glBegin(GL_LINE_LOOP);
glVertex2fv(tface->uv[0]);
glVertex2fv(tface->uv[1]);
glVertex2fv(tface->uv[2]);
if(efa->v4) glVertex2fv(tface->uv[3]);
glEnd();
setlinestyle(2);
cpack(0xFFFFFF);
glBegin(GL_LINE_STRIP);
glVertex2fv(tface->uv[0]);
glVertex2fv(tface->uv[1]);
glEnd();
glBegin(GL_LINE_STRIP);
glVertex2fv(tface->uv[0]);
if(efa->v4) glVertex2fv(tface->uv[3]);
else glVertex2fv(tface->uv[2]);
glEnd();
glBegin(GL_LINE_STRIP);
glVertex2fv(tface->uv[1]);
glVertex2fv(tface->uv[2]);
if(efa->v4) glVertex2fv(tface->uv[3]);
glEnd();
setlinestyle(0);
}
}
/* draw active face edges */
/*if (activetface){*/
/* colors: R=u G=v */
activetface = get_active_mtface(&efa, NULL);
if (activetface) {
setlinestyle(2);
tface=activetface;
/*mface=activemface;*/
cpack(0x0);
glBegin(GL_LINE_LOOP);
glVertex2fv(tface->uv[0]);
glVertex2fv(tface->uv[1]);
glVertex2fv(tface->uv[2]);
if(efa->v4) glVertex2fv(tface->uv[3]);
glEnd();
cpack(0xFF00);
glBegin(GL_LINE_STRIP);
glVertex2fv(tface->uv[0]);
glVertex2fv(tface->uv[1]);
glEnd();
cpack(0xFF);
glBegin(GL_LINE_STRIP);
glVertex2fv(tface->uv[0]);
if(efa->v4) glVertex2fv(tface->uv[3]);
else glVertex2fv(tface->uv[2]);
glEnd();
cpack(0xFFFFFF);
glBegin(GL_LINE_STRIP);
glVertex2fv(tface->uv[1]);
glVertex2fv(tface->uv[2]);
if(efa->v4) glVertex2fv(tface->uv[3]);
glEnd();
setlinestyle(0);
}
/* unselected uv's */
BIF_ThemeColor(TH_VERTEX);
glPointSize(pointsize);
bglBegin(GL_POINTS);
for (efa= em->faces.first; efa; efa= efa->next) {
if (efa->f & SELECT) {
tface= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
if(tface->flag & TF_SEL1); else bglVertex2fv(tface->uv[0]);
if(tface->flag & TF_SEL2); else bglVertex2fv(tface->uv[1]);
if(tface->flag & TF_SEL3); else bglVertex2fv(tface->uv[2]);
if(efa->v4) {
if(tface->flag & TF_SEL4); else bglVertex2fv(tface->uv[3]);
}
}
}
bglEnd();
/* pinned uv's */
/* give odd pointsizes odd pin pointsizes */
glPointSize(pointsize*2 + (((int)pointsize % 2)? (-1): 0));
cpack(0xFF);
bglBegin(GL_POINTS);
for (efa= em->faces.first; efa; efa= efa->next) {
if (efa->f & SELECT) {
tface= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
if(tface->unwrap & TF_PIN1) bglVertex2fv(tface->uv[0]);
if(tface->unwrap & TF_PIN2) bglVertex2fv(tface->uv[1]);
if(tface->unwrap & TF_PIN3) bglVertex2fv(tface->uv[2]);
if(efa->v4) {
if(tface->unwrap & TF_PIN4) bglVertex2fv(tface->uv[3]);
}
}
}
bglEnd();
/* selected uv's */
BIF_ThemeColor(TH_VERTEX_SELECT);
glPointSize(pointsize);
bglBegin(GL_POINTS);
for (efa= em->faces.first; efa; efa= efa->next) {
if (efa->f & SELECT) {
tface= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
if(tface->flag & TF_SEL1) bglVertex2fv(tface->uv[0]);
if(tface->flag & TF_SEL2) bglVertex2fv(tface->uv[1]);
if(tface->flag & TF_SEL3) bglVertex2fv(tface->uv[2]);
if(efa->v4) {
if(tface->flag & TF_SEL4) bglVertex2fv(tface->uv[3]);
}
}
}
bglEnd();
/* Draw the cursor here, this should be in its own function really but it relys on the previous calls to set the view matrix */
drawcursor_sima();
glPointSize(1.0);
}
static unsigned int *get_part_from_ibuf(ImBuf *ibuf, short startx, short starty, short endx, short endy)
@@ -1717,8 +1761,9 @@ void drawimagespace(ScrArea *sa, void *spacedata)
glPixelZoom(1.0, 1.0);
if(show_viewer==0)
if(show_viewer==0) {
draw_tfaces();
}
}
glPixelZoom(1.0, 1.0);

View File

@@ -895,6 +895,15 @@ void mouseco_to_curtile(void)
}
}
/* Could be used for other 2D views also */
void mouseco_to_cursor_sima(void)
{
short mval[2];
getmouseco_areawin(mval);
areamouseco_to_ipoco(G.v2d, mval, &G.v2d->cursor[0], &G.v2d->cursor[1]);
scrarea_queue_winredraw(curarea);
}
void stitch_uv_tface(int mode)
{
MTFace *tf;

View File

@@ -1083,6 +1083,18 @@ static uiBlock *image_uvsmenu(void *arg_unused)
return block;
}
static char *around_pup(void)
{
static char string[512];
char *str = string;
str += sprintf(str, "%s", "Pivot: %t");
str += sprintf(str, "%s", "|Bounding Box Center %x0");
str += sprintf(str, "%s", "|Median Point %x3");
str += sprintf(str, "%s", "|2D Cursor %x1");
return string;
}
void image_buttons(void)
{
Image *ima;
@@ -1158,6 +1170,13 @@ void image_buttons(void)
xco= std_libbuttons(block, xco, 0, 0, NULL, B_SIMABROWSE, ID_IM, 0, (ID *)ima, 0, &(G.sima->imanr), 0, 0, B_IMAGEDELETE, 0, 0);
/* UV EditMode buttons */
if (EM_texFaceCheck()) {
xco+=10;
uiDefIconTextButS(block, ICONTEXTROW,B_AROUND, ICON_ROTATE, around_pup(), xco,0,XIC+10,YIC, &(G.v2d->around), 0, 3.0, 0, 0, "Rotation/Scaling Pivot (Hotkeys: Comma, Shift Comma, Period) ");
xco+= XIC+15;
}
if (ima) {
RenderResult *rr= BKE_image_get_renderresult(ima);

View File

@@ -4788,10 +4788,13 @@ static void winqreadimagespace(ScrArea *sa, void *spacedata, BWinEvent *evt)
else
sima_sample_color();
}
else if(EM_texFaceCheck())
gesture();
else
else if(EM_texFaceCheck()) {
if (!gesture()) {
mouseco_to_cursor_sima();
}
} else {
sima_sample_color();
}
break;
case RIGHTMOUSE:
if(EM_texFaceCheck())
@@ -4908,6 +4911,28 @@ static void winqreadimagespace(ScrArea *sa, void *spacedata, BWinEvent *evt)
if(G.qual==0)
image_viewcenter();
break;
case COMMAKEY:
if(G.qual==LR_SHIFTKEY) {
G.v2d->around= V3D_CENTROID;
} else if(G.qual==0) {
G.v2d->around= V3D_CENTER;
}
scrarea_queue_headredraw(curarea);
scrarea_queue_winredraw(curarea);
break;
case PERIODKEY:
if(G.qual==LR_CTRLKEY) {
G.v2d->around= V3D_LOCAL;
} else if(G.qual==0) {
G.v2d->around= V3D_CURSOR;
}
scrarea_queue_headredraw(curarea);
scrarea_queue_winredraw(curarea);
break;
}
}

View File

@@ -1857,12 +1857,6 @@ static void createTransUVs(TransInfo *t)
if(is_uv_tface_editing_allowed()==0) return;
/* count */
/*
tf= me->mtface;
mf= me->mface;
for(a=me->totface; a>0; a--, tf++, mf++) {
if(mf->v3 && mf->flag & ME_FACE_SEL) {
*/
for (efa= em->faces.first; efa; efa= efa->next) {
if (efa->f & SELECT) {
tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
@@ -1889,12 +1883,6 @@ static void createTransUVs(TransInfo *t)
td= t->data;
td2d= t->data2d;
/*
tf= me->mtface;
mf= me->mface;
for(a=me->totface; a>0; a--, tf++, mf++) {
if(mf->v3 && mf->flag & ME_FACE_SEL) {
*/
for (efa= em->faces.first; efa; efa= efa->next) {
if (efa->f & SELECT) {
tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);

View File

@@ -464,6 +464,8 @@ void initTrans (TransInfo *t)
if(t->spacetype==SPACE_VIEW3D) {
if(G.vd->flag & V3D_ALIGN) t->flag |= T_V3D_ALIGN;
t->around = G.vd->around;
} else if(t->spacetype==SPACE_IMAGE) {
t->around = G.v2d->around;
}
else
t->around = V3D_CENTER;
@@ -654,6 +656,19 @@ void calculateCenterCursor(TransInfo *t)
calculateCenter2D(t);
}
void calculateCenterCursor2D(TransInfo *t)
{
float aspx=1.0, aspy=1.0;
if(t->spacetype==SPACE_IMAGE) /* only space supported right now but may change */
transform_aspect_ratio_tface_uv(&aspx, &aspy);
if (G.v2d) {
t->center[0] = G.v2d->cursor[0] * aspx;
t->center[1] = G.v2d->cursor[1] * aspy;
}
calculateCenter2D(t);
}
void calculateCenterMedian(TransInfo *t)
{
float partial[3] = {0.0f, 0.0f, 0.0f};
@@ -717,7 +732,10 @@ void calculateCenter(TransInfo *t)
calculateCenterMedian(t);
break;
case V3D_CURSOR:
calculateCenterCursor(t);
if(t->spacetype==SPACE_IMAGE)
calculateCenterCursor2D(t);
else
calculateCenterCursor(t);
break;
case V3D_LOCAL:
/* Individual element center uses median center for helpline and such */