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:
Diffstat (limited to 'source/blender/editors/transform/transform.c')
-rw-r--r--source/blender/editors/transform/transform.c478
1 files changed, 319 insertions, 159 deletions
diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c
index 2e711a27948..7f70eeab517 100644
--- a/source/blender/editors/transform/transform.c
+++ b/source/blender/editors/transform/transform.c
@@ -126,7 +126,7 @@
void setTransformViewMatrices(TransInfo *t)
{
- if(t->spacetype==SPACE_VIEW3D && t->ar->regiontype == RGN_TYPE_WINDOW) {
+ if(t->spacetype==SPACE_VIEW3D && t->ar && t->ar->regiontype == RGN_TYPE_WINDOW) {
RegionView3D *rv3d = t->ar->regiondata;
copy_m4_m4(t->viewmat, rv3d->viewmat);
@@ -450,69 +450,29 @@ static void view_editmove(unsigned short event)
#endif
}
-#if 0
-static char *transform_to_undostr(TransInfo *t)
-{
- switch (t->mode) {
- case TFM_TRANSLATION:
- return "Translate";
- case TFM_ROTATION:
- return "Rotate";
- case TFM_RESIZE:
- return "Scale";
- case TFM_TOSPHERE:
- return "To Sphere";
- case TFM_SHEAR:
- return "Shear";
- case TFM_WARP:
- return "Warp";
- case TFM_SHRINKFATTEN:
- return "Shrink/Fatten";
- case TFM_TILT:
- return "Tilt";
- case TFM_TRACKBALL:
- return "Trackball";
- case TFM_PUSHPULL:
- return "Push/Pull";
- case TFM_BEVEL:
- return "Bevel";
- case TFM_BWEIGHT:
- return "Bevel Weight";
- case TFM_CREASE:
- return "Crease";
- case TFM_BONESIZE:
- return "Bone Width";
- case TFM_BONE_ENVELOPE:
- return "Bone Envelope";
- case TFM_TIME_TRANSLATE:
- return "Translate Anim. Data";
- case TFM_TIME_SCALE:
- return "Scale Anim. Data";
- case TFM_TIME_SLIDE:
- return "Time Slide";
- case TFM_BAKE_TIME:
- return "Key Time";
- case TFM_MIRROR:
- return "Mirror";
- }
- return "Transform";
-}
-#endif
-
/* ************************************************* */
/* NOTE: these defines are saved in keymap files, do not change values but just add new ones */
-#define TFM_MODAL_CANCEL 1
-#define TFM_MODAL_CONFIRM 2
-#define TFM_MODAL_TRANSLATE 3
-#define TFM_MODAL_ROTATE 4
-#define TFM_MODAL_RESIZE 5
-#define TFM_MODAL_SNAP_GEARS 6
-#define TFM_MODAL_SNAP_GEARS_OFF 7
-#define TFM_MODAL_SNAP_GEARS_TOGGLE 8
+#define TFM_MODAL_CANCEL 1
+#define TFM_MODAL_CONFIRM 2
+#define TFM_MODAL_TRANSLATE 3
+#define TFM_MODAL_ROTATE 4
+#define TFM_MODAL_RESIZE 5
+#define TFM_MODAL_SNAP_INV_ON 6
+#define TFM_MODAL_SNAP_INV_OFF 7
+#define TFM_MODAL_SNAP_TOGGLE 8
+#define TFM_MODAL_AXIS_X 9
+#define TFM_MODAL_AXIS_Y 10
+#define TFM_MODAL_AXIS_Z 11
+#define TFM_MODAL_PLANE_X 12
+#define TFM_MODAL_PLANE_Y 13
+#define TFM_MODAL_PLANE_Z 14
+#define TFM_MODAL_CONS_OFF 15
+#define TFM_MODAL_ADD_SNAP 16
+#define TFM_MODAL_REMOVE_SNAP 17
/* called in transform_ops.c, on each regeneration of keymaps */
-void transform_modal_keymap(wmKeyConfig *keyconf)
+wmKeyMap* transform_modal_keymap(wmKeyConfig *keyconf)
{
static EnumPropertyItem modal_items[] = {
{TFM_MODAL_CANCEL, "CANCEL", 0, "Cancel", ""},
@@ -520,15 +480,24 @@ void transform_modal_keymap(wmKeyConfig *keyconf)
{TFM_MODAL_TRANSLATE, "TRANSLATE", 0, "Translate", ""},
{TFM_MODAL_ROTATE, "ROTATE", 0, "Rotate", ""},
{TFM_MODAL_RESIZE, "RESIZE", 0, "Resize", ""},
- {TFM_MODAL_SNAP_GEARS, "SNAP_GEARS", 0, "Snap On", ""},
- {TFM_MODAL_SNAP_GEARS_OFF, "SNAP_GEARS_OFF", 0, "Snap Off", ""},
- {TFM_MODAL_SNAP_GEARS_TOGGLE, "SNAP_GEARS_TOGGLE", 0, "Snap Toggle", ""},
+ {TFM_MODAL_SNAP_INV_ON, "SNAP_INV_ON", 0, "Invert Snap On", ""},
+ {TFM_MODAL_SNAP_INV_OFF, "SNAP_INV_OFF", 0, "Invert Snap Off", ""},
+ {TFM_MODAL_SNAP_TOGGLE, "SNAP_TOGGLE", 0, "Snap Toggle", ""},
+ {TFM_MODAL_AXIS_X, "AXIS_X", 0, "Orientation X axis", ""},
+ {TFM_MODAL_AXIS_Y, "AXIS_Y", 0, "Orientation Y axis", ""},
+ {TFM_MODAL_AXIS_Z, "AXIS_Z", 0, "Orientation Z axis", ""},
+ {TFM_MODAL_PLANE_X, "PLANE_X", 0, "Orientation X plane", ""},
+ {TFM_MODAL_PLANE_Y, "PLANE_Y", 0, "Orientation Y plane", ""},
+ {TFM_MODAL_PLANE_Z, "PLANE_Z", 0, "Orientation Z plane", ""},
+ {TFM_MODAL_CONS_OFF, "CONS_OFF", 0, "Remove Constraints", ""},
+ {TFM_MODAL_ADD_SNAP, "ADD_SNAP", 0, "Add Snap Point", ""},
+ {TFM_MODAL_REMOVE_SNAP, "REMOVE_SNAP", 0, "Remove Last Snap Point", ""},
{0, NULL, 0, NULL, NULL}};
wmKeyMap *keymap= WM_modalkeymap_get(keyconf, "Transform Modal Map");
/* this function is called for each spacetype, only needs to add map once */
- if(keymap) return;
+ if(keymap) return NULL;
keymap= WM_modalkeymap_add(keyconf, "Transform Modal Map", modal_items);
@@ -542,28 +511,23 @@ void transform_modal_keymap(wmKeyConfig *keyconf)
WM_modalkeymap_add_item(keymap, RKEY, KM_PRESS, 0, 0, TFM_MODAL_ROTATE);
WM_modalkeymap_add_item(keymap, SKEY, KM_PRESS, 0, 0, TFM_MODAL_RESIZE);
- WM_modalkeymap_add_item(keymap, LEFTCTRLKEY, KM_PRESS, KM_ANY, 0, TFM_MODAL_SNAP_GEARS_TOGGLE);
-
- /* assign map to operators */
- WM_modalkeymap_assign(keymap, "TFM_OT_transform");
- WM_modalkeymap_assign(keymap, "TFM_OT_translate");
- WM_modalkeymap_assign(keymap, "TFM_OT_rotate");
- WM_modalkeymap_assign(keymap, "TFM_OT_tosphere");
- WM_modalkeymap_assign(keymap, "TFM_OT_resize");
- WM_modalkeymap_assign(keymap, "TFM_OT_shear");
- WM_modalkeymap_assign(keymap, "TFM_OT_warp");
- WM_modalkeymap_assign(keymap, "TFM_OT_shrink_fatten");
- WM_modalkeymap_assign(keymap, "TFM_OT_tilt");
- WM_modalkeymap_assign(keymap, "TFM_OT_trackball");
- WM_modalkeymap_assign(keymap, "TFM_OT_mirror");
- WM_modalkeymap_assign(keymap, "TFM_OT_edge_slide");
+ WM_modalkeymap_add_item(keymap, TABKEY, KM_PRESS, KM_SHIFT, 0, TFM_MODAL_SNAP_TOGGLE);
+
+ WM_modalkeymap_add_item(keymap, LEFTCTRLKEY, KM_PRESS, KM_ANY, 0, TFM_MODAL_SNAP_INV_ON);
+ WM_modalkeymap_add_item(keymap, LEFTCTRLKEY, KM_RELEASE, KM_ANY, 0, TFM_MODAL_SNAP_INV_OFF);
+
+ WM_modalkeymap_add_item(keymap, AKEY, KM_PRESS, 0, 0, TFM_MODAL_ADD_SNAP);
+ WM_modalkeymap_add_item(keymap, AKEY, KM_PRESS, KM_ALT, 0, TFM_MODAL_REMOVE_SNAP);
+
+ return keymap;
}
-void transformEvent(TransInfo *t, wmEvent *event)
+int transformEvent(TransInfo *t, wmEvent *event)
{
float mati[3][3] = {{1.0f, 0.0f, 0.0f}, {0.0f, 1.0f, 0.0f}, {0.0f, 0.0f, 1.0f}};
char cmode = constraintModeToChar(t);
+ int handled = 1;
t->redraw |= handleMouseInput(t, &t->mouse, event);
@@ -629,18 +593,111 @@ void transformEvent(TransInfo *t, wmEvent *event)
}
break;
- case TFM_MODAL_SNAP_GEARS:
- t->modifiers |= MOD_SNAP_GEARS;
+ case TFM_MODAL_SNAP_INV_ON:
+ t->modifiers |= MOD_SNAP_INVERT;
+ t->redraw = 1;
+ break;
+ case TFM_MODAL_SNAP_INV_OFF:
+ t->modifiers &= ~MOD_SNAP_INVERT;
+ t->redraw = 1;
+ break;
+ case TFM_MODAL_SNAP_TOGGLE:
+ t->modifiers ^= MOD_SNAP;
t->redraw = 1;
break;
- case TFM_MODAL_SNAP_GEARS_OFF:
- t->modifiers &= ~MOD_SNAP_GEARS;
+ case TFM_MODAL_AXIS_X:
+ if ((t->flag & T_NO_CONSTRAINT)==0) {
+ if (cmode == 'X') {
+ stopConstraint(t);
+ }
+ else {
+ if (t->flag & T_2D_EDIT) {
+ setUserConstraint(t, V3D_MANIP_GLOBAL, (CON_AXIS0), "along X");
+ }
+ else {
+ setUserConstraint(t, t->current_orientation, (CON_AXIS0), "along %s X");
+ }
+ }
+ t->redraw = 1;
+ }
+ break;
+ case TFM_MODAL_AXIS_Y:
+ if ((t->flag & T_NO_CONSTRAINT)==0) {
+ if (cmode == 'Y') {
+ stopConstraint(t);
+ }
+ else {
+ if (t->flag & T_2D_EDIT) {
+ setUserConstraint(t, V3D_MANIP_GLOBAL, (CON_AXIS1), "along Y");
+ }
+ else {
+ setUserConstraint(t, t->current_orientation, (CON_AXIS1), "along %s Y");
+ }
+ }
+ t->redraw = 1;
+ }
+ break;
+ case TFM_MODAL_AXIS_Z:
+ if ((t->flag & (T_NO_CONSTRAINT|T_2D_EDIT))== 0) {
+ if (cmode == 'Z') {
+ stopConstraint(t);
+ }
+ else {
+ setUserConstraint(t, t->current_orientation, (CON_AXIS2), "along %s Z");
+ }
+ t->redraw = 1;
+ }
+ break;
+ case TFM_MODAL_PLANE_X:
+ if ((t->flag & (T_NO_CONSTRAINT|T_2D_EDIT))== 0) {
+ if (cmode == 'X') {
+ stopConstraint(t);
+ }
+ else {
+ setUserConstraint(t, t->current_orientation, (CON_AXIS1|CON_AXIS2), "locking %s X");
+ }
+ t->redraw = 1;
+ }
+ break;
+ case TFM_MODAL_PLANE_Y:
+ if ((t->flag & (T_NO_CONSTRAINT|T_2D_EDIT))== 0) {
+ if (cmode == 'Y') {
+ stopConstraint(t);
+ }
+ else {
+ setUserConstraint(t, t->current_orientation, (CON_AXIS0|CON_AXIS2), "locking %s Y");
+ }
+ t->redraw = 1;
+ }
+ break;
+ case TFM_MODAL_PLANE_Z:
+ if ((t->flag & (T_NO_CONSTRAINT|T_2D_EDIT))== 0) {
+ if (cmode == 'Z') {
+ stopConstraint(t);
+ }
+ else {
+ setUserConstraint(t, t->current_orientation, (CON_AXIS0|CON_AXIS1), "locking %s Z");
+ }
+ t->redraw = 1;
+ }
+ break;
+ case TFM_MODAL_CONS_OFF:
+ if ((t->flag & T_NO_CONSTRAINT)==0) {
+ stopConstraint(t);
+ t->redraw = 1;
+ }
+ break;
+ case TFM_MODAL_ADD_SNAP:
+ addSnapPoint(t);
t->redraw = 1;
break;
- case TFM_MODAL_SNAP_GEARS_TOGGLE:
- t->modifiers ^= MOD_SNAP_GEARS;
+ case TFM_MODAL_REMOVE_SNAP:
+ removeSnapPoint(t);
t->redraw = 1;
break;
+ default:
+ handled = 0;
+ break;
}
}
/* else do non-mapped events */
@@ -763,32 +820,28 @@ void transformEvent(TransInfo *t, wmEvent *event)
break;
case XKEY:
if ((t->flag & T_NO_CONSTRAINT)==0) {
- if (cmode == 'X') {
- if (t->flag & T_2D_EDIT) {
+ if (t->flag & T_2D_EDIT) {
+ if (cmode == 'X') {
stopConstraint(t);
+ } else {
+ setUserConstraint(t, V3D_MANIP_GLOBAL, (CON_AXIS0), "along X");
}
- else {
- if (t->con.mode & CON_USER) {
+ } else {
+ if (cmode == 'X') {
+ if (t->con.orientation != V3D_MANIP_GLOBAL) {
stopConstraint(t);
- }
- else {
+ } else {
short orientation = t->current_orientation != V3D_MANIP_GLOBAL ? t->current_orientation : V3D_MANIP_LOCAL;
if ((t->modifiers & MOD_CONSTRAINT_PLANE) == 0)
setUserConstraint(t, orientation, (CON_AXIS0), "along %s X");
else if (t->modifiers & MOD_CONSTRAINT_PLANE)
setUserConstraint(t, orientation, (CON_AXIS1|CON_AXIS2), "locking %s X");
}
- }
- }
- else {
- if (t->flag & T_2D_EDIT) {
- setConstraint(t, mati, (CON_AXIS0), "along X axis");
- }
- else {
+ } else {
if ((t->modifiers & MOD_CONSTRAINT_PLANE) == 0)
- setConstraint(t, mati, (CON_AXIS0), "along global X");
+ setUserConstraint(t, V3D_MANIP_GLOBAL, (CON_AXIS0), "along %s X");
else if (t->modifiers & MOD_CONSTRAINT_PLANE)
- setConstraint(t, mati, (CON_AXIS1|CON_AXIS2), "locking global X");
+ setUserConstraint(t, V3D_MANIP_GLOBAL, (CON_AXIS1|CON_AXIS2), "locking %s X");
}
}
t->redraw = 1;
@@ -796,56 +849,50 @@ void transformEvent(TransInfo *t, wmEvent *event)
break;
case YKEY:
if ((t->flag & T_NO_CONSTRAINT)==0) {
- if (cmode == 'Y') {
- if (t->flag & T_2D_EDIT) {
+ if (t->flag & T_2D_EDIT) {
+ if (cmode == 'Y') {
stopConstraint(t);
+ } else {
+ setUserConstraint(t, V3D_MANIP_GLOBAL, (CON_AXIS1), "along Y");
}
- else {
- if (t->con.mode & CON_USER) {
+ } else {
+ if (cmode == 'Y') {
+ if (t->con.orientation != V3D_MANIP_GLOBAL) {
stopConstraint(t);
- }
- else {
+ } else {
short orientation = t->current_orientation != V3D_MANIP_GLOBAL ? t->current_orientation : V3D_MANIP_LOCAL;
if ((t->modifiers & MOD_CONSTRAINT_PLANE) == 0)
setUserConstraint(t, orientation, (CON_AXIS1), "along %s Y");
else if (t->modifiers & MOD_CONSTRAINT_PLANE)
setUserConstraint(t, orientation, (CON_AXIS0|CON_AXIS2), "locking %s Y");
}
- }
- }
- else {
- if (t->flag & T_2D_EDIT) {
- setConstraint(t, mati, (CON_AXIS1), "along Y axis");
- }
- else {
+ } else {
if ((t->modifiers & MOD_CONSTRAINT_PLANE) == 0)
- setConstraint(t, mati, (CON_AXIS1), "along global Y");
+ setUserConstraint(t, V3D_MANIP_GLOBAL, (CON_AXIS1), "along %s Y");
else if (t->modifiers & MOD_CONSTRAINT_PLANE)
- setConstraint(t, mati, (CON_AXIS0|CON_AXIS2), "locking global Y");
+ setUserConstraint(t, V3D_MANIP_GLOBAL, (CON_AXIS0|CON_AXIS2), "locking %s Y");
}
}
t->redraw = 1;
}
break;
case ZKEY:
- if ((t->flag & T_NO_CONSTRAINT)==0) {
+ if ((t->flag & (T_NO_CONSTRAINT|T_2D_EDIT))==0) {
if (cmode == 'Z') {
- if (t->con.mode & CON_USER) {
+ if (t->con.orientation != V3D_MANIP_GLOBAL) {
stopConstraint(t);
- }
- else {
+ } else {
short orientation = t->current_orientation != V3D_MANIP_GLOBAL ? t->current_orientation : V3D_MANIP_LOCAL;
if ((t->modifiers & MOD_CONSTRAINT_PLANE) == 0)
setUserConstraint(t, orientation, (CON_AXIS2), "along %s Z");
- else if ((t->modifiers & MOD_CONSTRAINT_PLANE) && ((t->flag & T_2D_EDIT)==0))
+ else if (t->modifiers & MOD_CONSTRAINT_PLANE)
setUserConstraint(t, orientation, (CON_AXIS0|CON_AXIS1), "locking %s Z");
}
- }
- else if ((t->flag & T_2D_EDIT)==0) {
+ } else {
if ((t->modifiers & MOD_CONSTRAINT_PLANE) == 0)
- setConstraint(t, mati, (CON_AXIS2), "along global Z");
+ setUserConstraint(t, V3D_MANIP_GLOBAL, (CON_AXIS2), "along %s Z");
else if (t->modifiers & MOD_CONSTRAINT_PLANE)
- setConstraint(t, mati, (CON_AXIS0|CON_AXIS1), "locking global Z");
+ setUserConstraint(t, V3D_MANIP_GLOBAL, (CON_AXIS0|CON_AXIS1), "locking %s Z");
}
t->redraw = 1;
}
@@ -898,6 +945,9 @@ void transformEvent(TransInfo *t, wmEvent *event)
// case NDOFMOTION:
// viewmoveNDOF(1);
// break;
+ default:
+ handled = 0;
+ break;
}
// Numerical input events
@@ -935,7 +985,9 @@ void transformEvent(TransInfo *t, wmEvent *event)
case NDOF_REFRESH:
t->redraw = 1;
break;
-
+ default:
+ handled = 0;
+ break;
}
// Snapping events
@@ -964,6 +1016,9 @@ void transformEvent(TransInfo *t, wmEvent *event)
//// if (t->options & CTX_TWEAK)
// t->state = TRANS_CONFIRM;
// break;
+ default:
+ handled = 0;
+ break;
}
/* confirm transform if launch key is released after mouse move */
@@ -977,9 +1032,14 @@ void transformEvent(TransInfo *t, wmEvent *event)
// Per transform event, if present
if (t->handleEvent)
t->redraw |= t->handleEvent(t, event);
+
+ if (handled || t->redraw)
+ return 0;
+ else
+ return OPERATOR_PASS_THROUGH;
}
-int calculateTransformCenter(bContext *C, wmEvent *event, int centerMode, float *vec)
+int calculateTransformCenter(bContext *C, int centerMode, float *vec)
{
TransInfo *t = MEM_callocN(sizeof(TransInfo), "TransInfo data");
int success = 1;
@@ -990,9 +1050,9 @@ int calculateTransformCenter(bContext *C, wmEvent *event, int centerMode, float
t->mode = TFM_DUMMY;
- initTransInfo(C, t, NULL, event); // internal data, mouse, vectors
+ initTransInfo(C, t, NULL, NULL); // internal data, mouse, vectors
- createTransData(C, t); // make TransData structs from selection
+ createTransData(C, t); // make TransData structs from selection
t->around = centerMode; // override userdefined mode
@@ -1010,9 +1070,9 @@ int calculateTransformCenter(bContext *C, wmEvent *event, int centerMode, float
/* aftertrans does insert ipos and action channels, and clears base flags, doesnt read transdata */
- special_aftertrans_update(t);
+ special_aftertrans_update(C, t);
- postTrans(t);
+ postTrans(C, t);
MEM_freeN(t);
@@ -1103,11 +1163,14 @@ static void drawArc(float size, float angle_start, float angle_end, int segments
glEnd();
}
-void drawHelpline(const struct bContext *C, TransInfo *t)
+static void drawHelpline(bContext *C, int x, int y, void *customdata)
{
+ TransInfo *t = (TransInfo*)customdata;
+
if (t->helpline != HLP_NONE && !(t->flag & T_USES_MANIPULATOR))
{
float vecrot[3], cent[2];
+ int mval[2] = {x, y};
VECCOPY(vecrot, t->center);
if(t->flag & T_EDIT) {
@@ -1134,7 +1197,7 @@ void drawHelpline(const struct bContext *C, TransInfo *t)
glVertex2fv(cent);
glEnd();
- glTranslatef(t->mval[0], t->mval[1], 0);
+ glTranslatef(mval[0], mval[1], 0);
glRotatef(-180 / M_PI * atan2f(cent[0] - t->mval[0], cent[1] - t->mval[1]), 0, 0, 1);
setlinestyle(0);
@@ -1146,7 +1209,7 @@ void drawHelpline(const struct bContext *C, TransInfo *t)
case HLP_HARROW:
UI_ThemeColor(TH_WIRE);
- glTranslatef(t->mval[0], t->mval[1], 0);
+ glTranslatef(mval[0], mval[1], 0);
glLineWidth(3.0);
drawArrow(RIGHT, 5, 10, 5);
@@ -1156,7 +1219,7 @@ void drawHelpline(const struct bContext *C, TransInfo *t)
case HLP_VARROW:
UI_ThemeColor(TH_WIRE);
- glTranslatef(t->mval[0], t->mval[1], 0);
+ glTranslatef(mval[0], mval[1], 0);
glLineWidth(3.0);
glBegin(GL_LINES);
@@ -1179,7 +1242,7 @@ void drawHelpline(const struct bContext *C, TransInfo *t)
glVertex2fv(cent);
glEnd();
- glTranslatef(cent[0], cent[1], 0);
+ glTranslatef(cent[0] - t->mval[0] + mval[0], cent[1] - t->mval[1] + mval[1], 0);
setlinestyle(0);
glLineWidth(3.0);
@@ -1208,7 +1271,7 @@ void drawHelpline(const struct bContext *C, TransInfo *t)
char col[3], col2[3];
UI_GetThemeColor3ubv(TH_GRID, col);
- glTranslatef(t->mval[0], t->mval[1], 0);
+ glTranslatef(mval[0], mval[1], 0);
glLineWidth(3.0);
@@ -1243,9 +1306,9 @@ void drawTransformView(const struct bContext *C, struct ARegion *ar, void *arg)
void drawTransformPixel(const struct bContext *C, struct ARegion *ar, void *arg)
{
- TransInfo *t = arg;
-
- drawHelpline(C, t);
+// TransInfo *t = arg;
+//
+// drawHelpline(C, t->mval[0], t->mval[1], t);
}
void saveTransform(bContext *C, TransInfo *t, wmOperator *op)
@@ -1280,28 +1343,30 @@ void saveTransform(bContext *C, TransInfo *t, wmOperator *op)
}
// If modal, save settings back in scene if not set as operator argument
- if (t->flag & T_MODAL)
- {
+ if (t->flag & T_MODAL) {
+
/* save settings if not set in operator */
- if (RNA_struct_find_property(op->ptr, "proportional") && !RNA_property_is_set(op->ptr, "proportional"))
- {
+ if (RNA_struct_find_property(op->ptr, "proportional") && !RNA_property_is_set(op->ptr, "proportional")) {
ts->proportional = proportional;
}
- if (RNA_struct_find_property(op->ptr, "proportional_size") && !RNA_property_is_set(op->ptr, "proportional_size"))
- {
+ if (RNA_struct_find_property(op->ptr, "proportional_size") && !RNA_property_is_set(op->ptr, "proportional_size")) {
ts->proportional_size = t->prop_size;
}
- if (RNA_struct_find_property(op->ptr, "proportional_editing_falloff") && !RNA_property_is_set(op->ptr, "proportional_editing_falloff"))
- {
+ if (RNA_struct_find_property(op->ptr, "proportional_editing_falloff") && !RNA_property_is_set(op->ptr, "proportional_editing_falloff")) {
ts->prop_mode = t->prop_mode;
}
- if(t->spacetype == SPACE_VIEW3D)
- {
- if (RNA_struct_find_property(op->ptr, "constraint_orientation") && !RNA_property_is_set(op->ptr, "constraint_orientation"))
- {
+ /* do we check for parameter? */
+ if (t->modifiers & MOD_SNAP) {
+ ts->snap_flag |= SCE_SNAP;
+ } else {
+ ts->snap_flag &= ~SCE_SNAP;
+ }
+
+ if(t->spacetype == SPACE_VIEW3D) {
+ if (RNA_struct_find_property(op->ptr, "constraint_orientation") && !RNA_property_is_set(op->ptr, "constraint_orientation")) {
View3D *v3d = t->view;
v3d->twmode = t->current_orientation;
@@ -1323,7 +1388,14 @@ void saveTransform(bContext *C, TransInfo *t, wmOperator *op)
if (RNA_struct_find_property(op->ptr, "constraint_axis"))
{
- RNA_enum_set(op->ptr, "constraint_orientation", t->current_orientation);
+ /* constraint orientation can be global, event if user selects something else
+ * so use the orientation in the constraint if set
+ * */
+ if (t->con.mode & CON_APPLY) {
+ RNA_enum_set(op->ptr, "constraint_orientation", t->con.orientation);
+ } else {
+ RNA_enum_set(op->ptr, "constraint_orientation", t->current_orientation);
+ }
if (t->con.mode & CON_APPLY)
{
@@ -1367,12 +1439,13 @@ int initTransform(bContext *C, TransInfo *t, wmOperator *op, wmEvent *event, int
initTransformOrientation(C, t);
t->draw_handle_view = ED_region_draw_cb_activate(t->ar->type, drawTransformView, t, REGION_DRAW_POST_VIEW);
- t->draw_handle_pixel = ED_region_draw_cb_activate(t->ar->type, drawTransformPixel, t, REGION_DRAW_POST_PIXEL);
+ //t->draw_handle_pixel = ED_region_draw_cb_activate(t->ar->type, drawTransformPixel, t, REGION_DRAW_POST_PIXEL);
+ t->draw_handle_cursor = WM_paint_cursor_activate(CTX_wm_manager(C), NULL, drawHelpline, t);
}
else if(t->spacetype == SPACE_IMAGE) {
unit_m3(t->spacemtx);
t->draw_handle_view = ED_region_draw_cb_activate(t->ar->type, drawTransformView, t, REGION_DRAW_POST_VIEW);
- t->draw_handle_pixel = ED_region_draw_cb_activate(t->ar->type, drawTransformPixel, t, REGION_DRAW_POST_PIXEL);
+ //t->draw_handle_pixel = ED_region_draw_cb_activate(t->ar->type, drawTransformPixel, t, REGION_DRAW_POST_PIXEL);
}
else
unit_m3(t->spacemtx);
@@ -1380,7 +1453,7 @@ int initTransform(bContext *C, TransInfo *t, wmOperator *op, wmEvent *event, int
createTransData(C, t); // make TransData structs from selection
if (t->total == 0) {
- postTrans(t);
+ postTrans(C, t);
return 0;
}
@@ -1486,6 +1559,9 @@ int initTransform(bContext *C, TransInfo *t, wmOperator *op, wmEvent *event, int
case TFM_ALIGN:
initAlign(t);
break;
+ case TFM_SEQ_SLIDE:
+ initSeqSlide(t);
+ break;
}
/* overwrite initial values if operator supplied a non-null vector */
@@ -1573,10 +1649,10 @@ int transformEnd(bContext *C, TransInfo *t)
}
/* aftertrans does insert keyframes, and clears base flags, doesnt read transdata */
- special_aftertrans_update(t);
+ special_aftertrans_update(C, t);
/* free data */
- postTrans(t);
+ postTrans(C, t);
/* send events out for redraws */
viewRedrawPost(t);
@@ -3156,11 +3232,11 @@ static void applyTranslation(TransInfo *t, float vec[3]) {
/* uses t->vec to store actual translation in */
int Translation(TransInfo *t, short mval[2])
{
- float tvec[3];
char str[250];
if (t->con.mode & CON_APPLY) {
float pvec[3] = {0.0f, 0.0f, 0.0f};
+ float tvec[3];
applySnapping(t, t->values);
t->con.applyVec(t, NULL, t->values, tvec, pvec);
VECCOPY(t->values, tvec);
@@ -5171,6 +5247,90 @@ int Align(TransInfo *t, short mval[2])
return 1;
}
+/* ************************** SEQ SLIDE *************************** */
+
+void initSeqSlide(TransInfo *t)
+{
+ t->transform = SeqSlide;
+
+ initMouseInputMode(t, &t->mouse, INPUT_VECTOR);
+
+ t->idx_max = 1;
+ t->num.flag = 0;
+ t->num.idx_max = t->idx_max;
+
+ t->ndof.axis = 1|2;
+
+ t->snap[0] = 0.0f;
+ t->snap[1] = floor(t->scene->r.frs_sec / t->scene->r.frs_sec_base);
+ t->snap[2] = 10.0f;
+}
+
+static void headerSeqSlide(TransInfo *t, float val[2], char *str)
+{
+ char tvec[60];
+
+ if (hasNumInput(&t->num)) {
+ outputNumInput(&(t->num), tvec);
+ }
+ else {
+ sprintf(&tvec[0], "%.0f, %.0f", val[0], val[1]);
+ }
+
+ sprintf(str, "Sequence Slide: %s%s", &tvec[0], t->con.text);
+}
+
+static void applySeqSlide(TransInfo *t, float val[2]) {
+ TransData *td = t->data;
+ int i;
+
+ for(i = 0 ; i < t->total; i++, td++) {
+ float tvec[2];
+
+ if (td->flag & TD_NOACTION)
+ break;
+
+ if (td->flag & TD_SKIP)
+ continue;
+
+ copy_v2_v2(tvec, val);
+
+ mul_v2_fl(tvec, td->factor);
+
+ td->loc[0] = td->iloc[0] + tvec[0];
+ td->loc[1] = td->iloc[1] + tvec[1];
+ }
+}
+
+int SeqSlide(TransInfo *t, short mval[2])
+{
+ char str[200];
+
+ if (t->con.mode & CON_APPLY) {
+ float pvec[3] = {0.0f, 0.0f, 0.0f};
+ float tvec[3];
+ t->con.applyVec(t, NULL, t->values, tvec, pvec);
+ VECCOPY(t->values, tvec);
+ }
+ else {
+ applyNDofInput(&t->ndof, t->values);
+ snapGrid(t, t->values);
+ applyNumInput(&t->num, t->values);
+ }
+
+ t->values[0] = floor(t->values[0] + 0.5);
+ t->values[1] = floor(t->values[1] + 0.5);
+
+ headerSeqSlide(t, t->values, str);
+ applySeqSlide(t, t->values);
+
+ recalcData(t);
+
+ ED_area_headerprint(t->sa, str);
+
+ return 1;
+}
+
/* ************************** ANIM EDITORS - TRANSFORM TOOLS *************************** */
/* ---------------- Special Helpers for Various Settings ------------- */
@@ -5372,7 +5532,7 @@ static void applyTimeTranslate(TransInfo *t, float sval)
AnimData *adt= (t->spacetype != SPACE_NLA) ? td->extra : NULL;
/* check if any need to apply nla-mapping */
- if (adt) {
+ if (adt && t->spacetype != SPACE_SEQ) {
deltax = t->values[0];
if (autosnap == SACTSNAP_STEP) {