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
path: root/source
diff options
context:
space:
mode:
Diffstat (limited to 'source')
-rw-r--r--source/blender/include/BIF_editsima.h1
-rw-r--r--source/blender/include/transform.h1
-rw-r--r--source/blender/makesdna/DNA_view2d_types.h4
-rw-r--r--source/blender/src/drawimage.c397
-rw-r--r--source/blender/src/editsima.c9
-rw-r--r--source/blender/src/header_image.c19
-rw-r--r--source/blender/src/space.c33
-rw-r--r--source/blender/src/transform_conversions.c12
-rw-r--r--source/blender/src/transform_generics.c20
9 files changed, 303 insertions, 193 deletions
diff --git a/source/blender/include/BIF_editsima.h b/source/blender/include/BIF_editsima.h
index ba5dfe3149f..42678c14c81 100644
--- a/source/blender/include/BIF_editsima.h
+++ b/source/blender/include/BIF_editsima.h
@@ -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);
diff --git a/source/blender/include/transform.h b/source/blender/include/transform.h
index d343720b781..a06356e6531 100644
--- a/source/blender/include/transform.h
+++ b/source/blender/include/transform.h
@@ -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]);
diff --git a/source/blender/makesdna/DNA_view2d_types.h b/source/blender/makesdna/DNA_view2d_types.h
index cfd6f682e71..3ed82ddc793 100644
--- a/source/blender/makesdna/DNA_view2d_types.h
+++ b/source/blender/makesdna/DNA_view2d_types.h
@@ -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 */
diff --git a/source/blender/src/drawimage.c b/source/blender/src/drawimage.c
index 462c7a6d878..ae11bf1f800 100644
--- a/source/blender/src/drawimage.c
+++ b/source/blender/src/drawimage.c
@@ -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();
-
- /* draw shadow mesh */
- if ((G.sima->flag & SI_DRAWSHADOW) && (G.obedit==OBACT)) { /* TODO - editmesh */
- DerivedMesh *dm;
+ if (!G.obedit || !CustomData_has_layer(&em->fdata, CD_MTFACE))
+ return;
+
+
+ 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();
+
+ /* 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();
+ /* draw final mesh with modifiers applied */
+ /* should test - editmesh_get_derived_cage_and_final */
+ dm = editmesh_get_derived_base();
- glColor3ub(112, 112, 112);
- if (dm->drawUVEdges) dm->drawUVEdges(dm);
+ glColor3ub(112, 112, 112);
+ if (dm->drawUVEdges) dm->drawUVEdges(dm);
- 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(!(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();
- }
- }
- }
- }
+ dm->release(dm);
+ }
+ else if((G.sima->flag & SI_DRAWTOOL) || (G.obedit==OBACT)) {
+ /* draw mesh without modifiers applied */
- 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);
- }
-
+ 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();
+ glEnd();
+ }
+ }
+ }
+ }
- cpack(0xFF);
- glBegin(GL_LINE_STRIP);
+ 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]);
- 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);
}
+ }
+ 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();
- /* unselected uv's */
- BIF_ThemeColor(TH_VERTEX);
- glPointSize(pointsize);
+ 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);
+ }
+ }
- 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();
+ /* 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);
+ }
- /* pinned uv's */
- /* give odd pointsizes odd pin pointsizes */
- glPointSize(pointsize*2 + (((int)pointsize % 2)? (-1): 0));
- cpack(0xFF);
+ /* 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->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]);
- }
- }
+ 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();
+ }
+ }
+ bglEnd();
- /* selected uv's */
- BIF_ThemeColor(TH_VERTEX_SELECT);
- glPointSize(pointsize);
+ /* 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->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]);
- }
- }
+ 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();
+ }
+ }
+ bglEnd();
+
+ /* selected uv's */
+ BIF_ThemeColor(TH_VERTEX_SELECT);
+ glPointSize(pointsize);
- glPointSize(1.0);
+ 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);
diff --git a/source/blender/src/editsima.c b/source/blender/src/editsima.c
index ed5a1c73cb9..9ec9dc73a4d 100644
--- a/source/blender/src/editsima.c
+++ b/source/blender/src/editsima.c
@@ -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;
diff --git a/source/blender/src/header_image.c b/source/blender/src/header_image.c
index 649ce1438f9..dc18e8f60a4 100644
--- a/source/blender/src/header_image.c
+++ b/source/blender/src/header_image.c
@@ -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);
diff --git a/source/blender/src/space.c b/source/blender/src/space.c
index 2845b3340bb..8e8c4f4c400 100644
--- a/source/blender/src/space.c
+++ b/source/blender/src/space.c
@@ -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,8 +4911,30 @@ 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;
}
- }
+ }
/* least intrusive nonumpad hack, only for plus/minus */
diff --git a/source/blender/src/transform_conversions.c b/source/blender/src/transform_conversions.c
index 00df69ee631..2fdf68951b8 100644
--- a/source/blender/src/transform_conversions.c
+++ b/source/blender/src/transform_conversions.c
@@ -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);
diff --git a/source/blender/src/transform_generics.c b/source/blender/src/transform_generics.c
index 33ced3b292c..8e92fdda38a 100644
--- a/source/blender/src/transform_generics.c
+++ b/source/blender/src/transform_generics.c
@@ -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 */