[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [25101] trunk/blender/source/blender/ editors/transform: Make toggle and hold snap method cohabit nicely.
Martin Poirier
theeth at yahoo.com
Thu Dec 3 20:18:00 CET 2009
Revision: 25101
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=25101
Author: theeth
Date: 2009-12-03 20:18:00 +0100 (Thu, 03 Dec 2009)
Log Message:
-----------
Make toggle and hold snap method cohabit nicely.
Shift-Tab toggles the global toolsetting snap settings (both in and out of transform).
Holding down Ctrl inverts the snap setting in transform (turns it on when global snap is off and vice versa).
Ctrl-Shift-Tab to select snap mode (only outside of transform for now).
For old (pre 2.5) behavior, just keep global snap off and use Ctrl.
NOTE: transform modal events for snap have change a bit, saved keymap might not work anymore.
Modified Paths:
--------------
trunk/blender/source/blender/editors/transform/transform.c
trunk/blender/source/blender/editors/transform/transform.h
trunk/blender/source/blender/editors/transform/transform_constraints.c
trunk/blender/source/blender/editors/transform/transform_ops.c
trunk/blender/source/blender/editors/transform/transform_snap.c
Modified: trunk/blender/source/blender/editors/transform/transform.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform.c 2009-12-03 18:35:37 UTC (rev 25100)
+++ trunk/blender/source/blender/editors/transform/transform.c 2009-12-03 19:18:00 UTC (rev 25101)
@@ -507,8 +507,8 @@
#define TFM_MODAL_TRANSLATE 3
#define TFM_MODAL_ROTATE 4
#define TFM_MODAL_RESIZE 5
-#define TFM_MODAL_SNAP_ON 6
-#define TFM_MODAL_SNAP_OFF 7
+#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
@@ -529,8 +529,8 @@
{TFM_MODAL_TRANSLATE, "TRANSLATE", 0, "Translate", ""},
{TFM_MODAL_ROTATE, "ROTATE", 0, "Rotate", ""},
{TFM_MODAL_RESIZE, "RESIZE", 0, "Resize", ""},
- {TFM_MODAL_SNAP_ON, "SNAP_ON", 0, "Snap On", ""},
- {TFM_MODAL_SNAP_OFF, "SNAP_OFF", 0, "Snap Off", ""},
+ {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", ""},
@@ -560,7 +560,10 @@
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_CLICK, KM_ANY, 0, TFM_MODAL_SNAP_TOGGLE);
+ 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);
@@ -651,12 +654,12 @@
}
break;
- case TFM_MODAL_SNAP_ON:
- t->modifiers |= MOD_SNAP;
+ case TFM_MODAL_SNAP_INV_ON:
+ t->modifiers |= MOD_SNAP_INVERT;
t->redraw = 1;
break;
- case TFM_MODAL_SNAP_OFF:
- t->modifiers &= ~MOD_SNAP;
+ case TFM_MODAL_SNAP_INV_OFF:
+ t->modifiers &= ~MOD_SNAP_INVERT;
t->redraw = 1;
break;
case TFM_MODAL_SNAP_TOGGLE:
Modified: trunk/blender/source/blender/editors/transform/transform.h
===================================================================
--- trunk/blender/source/blender/editors/transform/transform.h 2009-12-03 18:35:37 UTC (rev 25100)
+++ trunk/blender/source/blender/editors/transform/transform.h 2009-12-03 19:18:00 UTC (rev 25101)
@@ -91,8 +91,8 @@
typedef struct TransSnap {
short mode;
+ short target;
short modePoint;
- short modeTarget;
short modeSelect;
short align;
short project;
@@ -382,7 +382,8 @@
#define MOD_CONSTRAINT_SELECT 0x01
#define MOD_PRECISION 0x02
#define MOD_SNAP 0x04
-#define MOD_CONSTRAINT_PLANE 0x08
+#define MOD_SNAP_INVERT 0x08
+#define MOD_CONSTRAINT_PLANE 0x10
/* ******************************************************************************** */
@@ -427,13 +428,6 @@
#define POINT_INIT 4
#define MULTI_POINTS 8
-/* transsnap->modeTarget */
-#define SNAP_CLOSEST 0
-#define SNAP_CENTER 1
-#define SNAP_MEDIAN 2
-#define SNAP_ACTIVE 3
-
-
void TFM_OT_transform(struct wmOperatorType *ot);
int initTransform(struct bContext *C, struct TransInfo *t, struct wmOperator *op, struct wmEvent *event, int mode);
@@ -597,6 +591,9 @@
void snapGrid(TransInfo *t, float *val);
void snapGridAction(TransInfo *t, float *val, GearsType action);
+int activeSnap(TransInfo *t);
+int validSnap(TransInfo *t);
+
void initSnapping(struct TransInfo *t, struct wmOperator *op);
void applyProject(TransInfo *t);
void applySnapping(TransInfo *t, float *vec);
Modified: trunk/blender/source/blender/editors/transform/transform_constraints.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform_constraints.c 2009-12-03 18:35:37 UTC (rev 25100)
+++ trunk/blender/source/blender/editors/transform/transform_constraints.c 2009-12-03 19:18:00 UTC (rev 25101)
@@ -290,7 +290,7 @@
mul_m3_v3(t->con.pmtx, out);
// With snap, a projection is alright, no need to correct for view alignment
- if (!(t->tsnap.mode != SCE_SNAP_MODE_INCREMENT && t->modifiers & MOD_SNAP)) {
+ if (!(t->tsnap.mode != SCE_SNAP_MODE_INCREMENT && activeSnap(t))) {
if (getConstraintSpaceDimension(t) == 2) {
if (out[0] != 0.0f || out[1] != 0.0f || out[2] != 0.0f) {
planeProjection(t, in, out);
Modified: trunk/blender/source/blender/editors/transform/transform_ops.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform_ops.c 2009-12-03 18:35:37 UTC (rev 25100)
+++ trunk/blender/source/blender/editors/transform/transform_ops.c 2009-12-03 19:18:00 UTC (rev 25101)
@@ -784,10 +784,10 @@
km = WM_keymap_add_item(keymap, "TFM_OT_mirror", MKEY, KM_PRESS, KM_CTRL, 0);
- km = WM_keymap_add_item(keymap, "WM_OT_context_toggle", LEFTCTRLKEY, KM_CLICK, 0, 0);
+ km = WM_keymap_add_item(keymap, "WM_OT_context_toggle", TABKEY, KM_PRESS, KM_SHIFT, 0);
RNA_string_set(km->ptr, "path", "scene.tool_settings.snap");
- km = WM_keymap_add_item(keymap, "TFM_OT_snap_type", LEFTCTRLKEY, KM_CLICK, KM_SHIFT, 0);
+ km = WM_keymap_add_item(keymap, "TFM_OT_snap_type", TABKEY, KM_PRESS, KM_SHIFT|KM_CLICK, 0);
break;
case SPACE_ACTION:
@@ -861,7 +861,7 @@
km = WM_keymap_add_item(keymap, "TFM_OT_mirror", MKEY, KM_PRESS, KM_CTRL, 0);
- km = WM_keymap_add_item(keymap, "WM_OT_context_toggle", LEFTCTRLKEY, KM_CLICK, 0, 0);
+ km = WM_keymap_add_item(keymap, "WM_OT_context_toggle", TABKEY, KM_PRESS, KM_SHIFT, 0);
RNA_string_set(km->ptr, "path", "scene.tool_settings.snap");
break;
default:
Modified: trunk/blender/source/blender/editors/transform/transform_snap.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform_snap.c 2009-12-03 18:35:37 UTC (rev 25100)
+++ trunk/blender/source/blender/editors/transform/transform_snap.c 2009-12-03 19:18:00 UTC (rev 25101)
@@ -90,7 +90,7 @@
/********************* PROTOTYPES ***********************/
-void setSnappingCallback(TransInfo *t, short snap_target);
+void setSnappingCallback(TransInfo *t);
void ApplySnapTranslation(TransInfo *t, float vec[3]);
void ApplySnapRotation(TransInfo *t, float *vec);
@@ -123,15 +123,20 @@
return status;
}
-int validSnap(TransInfo *t) {
+int validSnap(TransInfo *t)
+{
return (t->tsnap.status & (POINT_INIT|TARGET_INIT)) == (POINT_INIT|TARGET_INIT) ||
(t->tsnap.status & (MULTI_POINTS|TARGET_INIT)) == (MULTI_POINTS|TARGET_INIT);
}
+int activeSnap(TransInfo *t)
+{
+ return (t->modifiers & (MOD_SNAP|MOD_SNAP_INVERT)) == MOD_SNAP || (t->modifiers & (MOD_SNAP|MOD_SNAP_INVERT)) == MOD_SNAP_INVERT;
+}
+
void drawSnapping(const struct bContext *C, TransInfo *t)
{
- if (validSnap(t) &&
- (t->modifiers & MOD_SNAP))
+ if (validSnap(t) && activeSnap(t))
{
char col[4] = {1, 0, 1};
@@ -232,7 +237,7 @@
void applyProject(TransInfo *t)
{
/* XXX FLICKER IN OBJECT MODE */
- if ((t->tsnap.project) && (t->modifiers & MOD_SNAP) && (t->modifiers & MOD_SNAP))
+ if ((t->tsnap.project) && activeSnap(t))
{
TransData *td = t->data;
float tvec[3];
@@ -268,7 +273,7 @@
project_float(t->ar, iloc, mval);
- if (snapObjectsTransform(t, mval, &dist, loc, no, t->tsnap.modeTarget))
+ if (snapObjectsTransform(t, mval, &dist, loc, no, t->tsnap.target))
{
// if(t->flag & (T_EDIT|T_POSE)) {
// mul_m4_v3(imat, loc);
@@ -298,8 +303,7 @@
t->tsnap.applySnap(t, vec);
}
- else if ((t->tsnap.mode != SCE_SNAP_MODE_INCREMENT) &&
- (t->modifiers & MOD_SNAP))
+ else if ((t->tsnap.mode != SCE_SNAP_MODE_INCREMENT) && activeSnap(t))
{
double current = PIL_check_seconds_timer();
@@ -325,7 +329,7 @@
t->tsnap.align = 0;
t->tsnap.mode = 0;
t->tsnap.modeSelect = 0;
- t->tsnap.modeTarget = 0;
+ t->tsnap.target = 0;
t->tsnap.last = 0;
t->tsnap.applySnap = NULL;
@@ -352,11 +356,67 @@
return 0;
}
-void initSnapping(TransInfo *t, wmOperator *op)
+void initSnappingMode(TransInfo *t)
{
ToolSettings *ts = t->settings;
Object *obedit = t->obedit;
Scene *scene = t->scene;
+
+ resetSnapping(t);
+
+ /* force project off when not supported */
+ if (ts->snap_mode != SCE_SNAP_MODE_FACE)
+ {
+ t->tsnap.project = 0;
+ }
+
+ t->tsnap.mode = ts->snap_mode;
+
+ if ((t->spacetype == SPACE_VIEW3D || t->spacetype == SPACE_IMAGE) && // Only 3D view or UV
+ (t->flag & T_CAMERA) == 0) { // Not with camera selected in camera view
+ setSnappingCallback(t);
+
+ /* Edit mode */
+ if (t->tsnap.applySnap != NULL && // A snapping function actually exist
+ (obedit != NULL && ELEM3(obedit->type, OB_MESH, OB_ARMATURE, OB_CURVE)) ) // Temporary limited to edit mode meshes, armature, curves
+ {
+ if (t->flag & T_PROP_EDIT)
+ {
+ t->tsnap.modeSelect = SNAP_NOT_OBEDIT;
+ }
+ else
+ {
+ t->tsnap.modeSelect = SNAP_ALL;
+ }
+ }
+ /* Particles edit mode*/
+ else if (t->tsnap.applySnap != NULL && // A snapping function actually exist
+ (obedit == NULL && BASACT && BASACT->object && BASACT->object->mode & OB_MODE_PARTICLE_EDIT ))
+ {
+ t->tsnap.modeSelect = SNAP_ALL;
+ }
+ /* Object mode */
+ else if (t->tsnap.applySnap != NULL && // A snapping function actually exist
+ (obedit == NULL) ) // Object Mode
+ {
+ t->tsnap.modeSelect = SNAP_NOT_SELECTED;
+ }
+ else
+ {
+ /* Grid if snap is not possible */
+ t->tsnap.mode = SCE_SNAP_MODE_INCREMENT;
+ }
+ }
+ else
+ {
+ /* Always grid outside of 3D view */
+ t->tsnap.mode = SCE_SNAP_MODE_INCREMENT;
+ }
+}
+
+void initSnapping(TransInfo *t, wmOperator *op)
+{
+ ToolSettings *ts = t->settings;
short snap_target = t->settings->snap_target;
resetSnapping(t);
@@ -405,76 +465,27 @@
t->tsnap.peel = ((t->settings->snap_flag & SCE_SNAP_PROJECT) == SCE_SNAP_PROJECT);
}
- /* force project off when not supported */
- if (ts->snap_mode != SCE_SNAP_MODE_FACE)
- {
- t->tsnap.project = 0;
- }
-
- t->tsnap.mode = ts->snap_mode;
+ t->tsnap.target = snap_target;
- if ((t->spacetype == SPACE_VIEW3D || t->spacetype == SPACE_IMAGE) && // Only 3D view or UV
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list