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:
authorCampbell Barton <ideasman42@gmail.com>2012-07-25 23:36:59 +0400
committerCampbell Barton <ideasman42@gmail.com>2012-07-25 23:36:59 +0400
commit927af4ccc9826753c1176563b72018f31c2e9eed (patch)
tree0c93d7c96c47b3982f48b44b11deef7f2d989f45 /source/blender/editors/transform
parenta9614e732c286b8f4799cdfd674592efa8bbdf8c (diff)
mask transform now works in the image space
Diffstat (limited to 'source/blender/editors/transform')
-rw-r--r--source/blender/editors/transform/transform.c76
-rw-r--r--source/blender/editors/transform/transform_conversions.c64
-rw-r--r--source/blender/editors/transform/transform_generics.c24
-rw-r--r--source/blender/editors/transform/transform_snap.c4
4 files changed, 106 insertions, 62 deletions
diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c
index ceb10060826..81e836a2f7d 100644
--- a/source/blender/editors/transform/transform.c
+++ b/source/blender/editors/transform/transform.c
@@ -120,16 +120,44 @@ void setTransformViewMatrices(TransInfo *t)
calculateCenter2D(t);
}
-static void convertViewVec2D(View2D *v2d, float vec[3], int dx, int dy)
+static void convertViewVec2D(View2D *v2d, float r_vec[3], int dx, int dy)
{
float divx, divy;
divx = v2d->mask.xmax - v2d->mask.xmin;
divy = v2d->mask.ymax - v2d->mask.ymin;
- vec[0] = (v2d->cur.xmax - v2d->cur.xmin) * dx / divx;
- vec[1] = (v2d->cur.ymax - v2d->cur.ymin) * dy / divy;
- vec[2] = 0.0f;
+ r_vec[0] = (v2d->cur.xmax - v2d->cur.xmin) * dx / divx;
+ r_vec[1] = (v2d->cur.ymax - v2d->cur.ymin) * dy / divy;
+ r_vec[2] = 0.0f;
+}
+
+static void convertViewVec2D_mask(View2D *v2d, float r_vec[3], int dx, int dy)
+{
+ float divx, divy;
+ float mulx, muly;
+
+ divx = v2d->mask.xmax - v2d->mask.xmin;
+ divy = v2d->mask.ymax - v2d->mask.ymin;
+
+ mulx = (v2d->cur.xmax - v2d->cur.xmin);
+ muly = (v2d->cur.ymax - v2d->cur.ymin);
+
+ /* difference with convertViewVec2D */
+ /* clamp w/h, mask only */
+ if (mulx / divx < muly / divy) {
+ divy = divx;
+ muly = mulx;
+ }
+ else {
+ divx = divy;
+ mulx = muly;
+ }
+ /* end difference */
+
+ r_vec[0] = mulx * dx / divx;
+ r_vec[1] = muly * dy / divy;
+ r_vec[2] = 0.0f;
}
void convertViewVec(TransInfo *t, float r_vec[3], int dx, int dy)
@@ -143,11 +171,17 @@ void convertViewVec(TransInfo *t, float r_vec[3], int dx, int dy)
else if (t->spacetype == SPACE_IMAGE) {
float aspx, aspy;
- convertViewVec2D(t->view, r_vec, dx, dy);
+ if (t->options & CTX_MASK) {
- /* MASKTODO - see clip clamp w/h */
+ convertViewVec2D_mask(t->view, r_vec, dx, dy);
+
+ ED_space_image_get_aspect(t->sa->spacedata.first, &aspx, &aspy);
+ }
+ else {
+ convertViewVec2D(t->view, r_vec, dx, dy);
+ ED_space_image_get_uv_aspect(t->sa->spacedata.first, &aspx, &aspy);
+ }
- ED_space_image_get_uv_aspect(t->sa->spacedata.first, &aspx, &aspy);
r_vec[0] *= aspx;
r_vec[1] *= aspy;
}
@@ -158,32 +192,14 @@ void convertViewVec(TransInfo *t, float r_vec[3], int dx, int dy)
convertViewVec2D(&t->ar->v2d, r_vec, dx, dy);
}
else if (t->spacetype == SPACE_CLIP) {
- View2D *v2d = t->view;
- float divx, divy;
- float mulx, muly;
- float aspx = 1.0f, aspy = 1.0f;
-
- divx = v2d->mask.xmax - v2d->mask.xmin;
- divy = v2d->mask.ymax - v2d->mask.ymin;
-
- mulx = (v2d->cur.xmax - v2d->cur.xmin);
- muly = (v2d->cur.ymax - v2d->cur.ymin);
+ float aspx, aspy;
if (t->options & CTX_MASK) {
- /* clamp w/h, mask only */
- if (mulx / divx < muly / divy) {
- divy = divx;
- muly = mulx;
- }
- else {
- divx = divy;
- mulx = muly;
- }
+ convertViewVec2D_mask(t->view, r_vec, dx, dy);
+ }
+ else {
+ convertViewVec2D(t->view, r_vec, dx, dy);
}
-
- r_vec[0] = mulx * (dx) / divx;
- r_vec[1] = muly * (dy) / divy;
- r_vec[2] = 0.0f;
if (t->options & CTX_MOVIECLIP) {
ED_space_clip_get_aspect_dimension_aware(t->sa->spacedata.first, &aspx, &aspy);
diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c
index 6dc0e986058..e3a9d06222b 100644
--- a/source/blender/editors/transform/transform_conversions.c
+++ b/source/blender/editors/transform/transform_conversions.c
@@ -4964,6 +4964,36 @@ void autokeyframe_pose_cb_func(bContext *C, Scene *scene, View3D *v3d, Object *o
}
}
+static void special_aftertrans_update__mask(bContext *C, TransInfo *t)
+{
+ Mask *mask;
+
+ if (t->spacetype == SPACE_CLIP) {
+ SpaceClip *sc = t->sa->spacedata.first;
+ mask = ED_space_clip_get_mask(sc);
+ }
+ else if (t->spacetype == SPACE_IMAGE) {
+ SpaceImage *sima = t->sa->spacedata.first;
+ mask = ED_space_image_get_mask(sima);
+ }
+ else {
+ BLI_assert(0);
+ }
+
+ if (t->scene->nodetree) {
+ /* tracks can be used for stabilization nodes,
+ * flush update for such nodes */
+ nodeUpdateID(t->scene->nodetree, &mask->id);
+ WM_event_add_notifier(C, NC_SCENE | ND_NODES, NULL);
+ }
+
+ /* TODO - dont key all masks... */
+ if (IS_AUTOKEY_ON(t->scene)) {
+ Scene *scene = t->scene;
+
+ ED_mask_layer_shape_auto_key_select(mask, CFRA);
+ }
+}
/* inserting keys, pointcache, redraw events... */
/*
@@ -5033,7 +5063,9 @@ void special_aftertrans_update(bContext *C, TransInfo *t)
}
}
else if (t->spacetype == SPACE_IMAGE) {
- /* prevent this passing through to final 'else' which assumes objects */
+ if (t->options & CTX_MASK) {
+ special_aftertrans_update__mask(C, t);
+ }
}
else if (t->spacetype == SPACE_NODE) {
SpaceNode *snode = (SpaceNode *)t->sa->spacedata.first;
@@ -5059,22 +5091,7 @@ void special_aftertrans_update(bContext *C, TransInfo *t)
}
}
else if (t->options & CTX_MASK) {
- SpaceClip *sc = t->sa->spacedata.first;
- Mask *mask = ED_space_clip_get_mask(sc);
-
- if (t->scene->nodetree) {
- /* tracks can be used for stabilization nodes,
- * flush update for such nodes */
- nodeUpdateID(t->scene->nodetree, &mask->id);
- WM_event_add_notifier(C, NC_SCENE | ND_NODES, NULL);
- }
-
- /* TODO - dont key all masks... */
- if (IS_AUTOKEY_ON(t->scene)) {
- Scene *scene = t->scene;
-
- ED_mask_layer_shape_auto_key_select(mask, CFRA);
- }
+ special_aftertrans_update__mask(C, t);
}
}
else if (t->spacetype == SPACE_ACTION) {
@@ -6259,20 +6276,19 @@ static void createTransMaskingData(bContext *C, TransInfo *t)
void flushTransMasking(TransInfo *t)
{
- SpaceClip *sc = t->sa->spacedata.first;
TransData2D *td;
TransDataMasking *tdm;
int a;
- float aspx, aspy, invx, invy;
+ float asp[2], inv[2];
- ED_space_clip_get_aspect(sc, &aspx, &aspy);
- invx = 1.0f / aspx;
- invy = 1.0f / aspy;
+ ED_mask_aspect(t->context, &asp[0], &asp[1]);
+ inv[0] = 1.0f / asp[0];
+ inv[1] = 1.0f / asp[1];
/* flush to 2d vector from internally used 3d vector */
for (a = 0, td = t->data2d, tdm = t->customData; a < t->total; a++, td++, tdm++) {
- td->loc2d[0] = td->loc[0] * invx;
- td->loc2d[1] = td->loc[1] * invy;
+ td->loc2d[0] = td->loc[0] * inv[0];
+ td->loc2d[1] = td->loc[1] * inv[1];
if (tdm->is_handle)
BKE_mask_point_set_handle(tdm->point, td->loc2d, t->flag & T_ALT_TRANSFORM, tdm->orig_handle, tdm->vec);
diff --git a/source/blender/editors/transform/transform_generics.c b/source/blender/editors/transform/transform_generics.c
index 8651241f338..c7846b3935b 100644
--- a/source/blender/editors/transform/transform_generics.c
+++ b/source/blender/editors/transform/transform_generics.c
@@ -607,6 +607,15 @@ static void recalcData_nla(TransInfo *t)
}
}
+static void recalcData_mask_common(TransInfo *t)
+{
+ Mask *mask = CTX_data_edit_mask(t->context);
+
+ flushTransMasking(t);
+
+ DAG_id_tag_update(&mask->id, 0);
+}
+
/* helper for recalcData() - for Image Editor transforms */
static void recalcData_image(TransInfo *t)
{
@@ -619,6 +628,9 @@ static void recalcData_image(TransInfo *t)
DAG_id_tag_update(t->obedit->data, 0);
}
+ else if (t->options & CTX_MASK) {
+ recalcData_mask_common(t);
+ }
}
/* helper for recalcData() - for Movie Clip transforms */
@@ -662,12 +674,8 @@ static void recalcData_spaceclip(TransInfo *t)
DAG_id_tag_update(&clip->id, 0);
}
- else if (ED_space_clip_check_show_maskedit(sc)) {
- Mask *mask = ED_space_clip_get_mask(sc);
-
- flushTransMasking(t);
-
- DAG_id_tag_update(&mask->id, 0);
+ else if (t->options & CTX_MASK) {
+ recalcData_mask_common(t);
}
}
@@ -908,6 +916,10 @@ void recalcData(TransInfo *t)
else if (t->spacetype == SPACE_CLIP) {
recalcData_spaceclip(t);
}
+
+ if (t->options & CTX_MASK) {
+
+ }
}
void drawLine(TransInfo *t, float *center, float *dir, char axis, short options)
diff --git a/source/blender/editors/transform/transform_snap.c b/source/blender/editors/transform/transform_snap.c
index 7c86b697437..66736548875 100644
--- a/source/blender/editors/transform/transform_snap.c
+++ b/source/blender/editors/transform/transform_snap.c
@@ -208,8 +208,8 @@ void drawSnapping(const struct bContext *C, TransInfo *t)
ED_space_image_get_aspect(t->sa->spacedata.first, &xuser_aspx, &yuser_asp);
ED_space_image_width(t->sa->spacedata.first, &wi, &hi);
- w = (((float)wi) / 256.0f) * G.sima->zoom * xuser_asp;
- h = (((float)hi) / 256.0f) * G.sima->zoom * yuser_asp;
+ w = (((float)wi) / IMG_SIZE_FALLBACK) * G.sima->zoom * xuser_asp;
+ h = (((float)hi) / IMG_SIZE_FALLBACK) * G.sima->zoom * yuser_asp;
cpack(0xFFFFFF);
glTranslatef(t->tsnap.snapPoint[0], t->tsnap.snapPoint[1], 0.0f);