Index: release/scripts/startup/bl_ui/space_userpref.py =================================================================== --- release/scripts/startup/bl_ui/space_userpref.py (Revision 39819) +++ release/scripts/startup/bl_ui/space_userpref.py (Arbeitskopie) @@ -773,9 +773,20 @@ layout.separator() layout.label(text="orbit options") - layout.prop(input_prefs, "ndof_orbit_invert_axes") + if input_prefs.view_rotate_method == 'TRACKBALL': + layout.prop(input_prefs, "ndof_roll_invert_axis") + layout.prop(input_prefs, "ndof_tilt_invert_axis") + layout.prop(input_prefs, "ndof_rotate_invert_axis") + else: + layout.prop(input_prefs, "ndof_orbit_invert_axes") layout.separator() + layout.label(text="pan options") + layout.prop(input_prefs, "ndof_panx_invert_axis") + layout.prop(input_prefs, "ndof_pany_invert_axis") + layout.prop(input_prefs, "ndof_panz_invert_axis") + + layout.separator() layout.label(text="fly options") layout.prop(input_prefs, "ndof_fly_helicopter", icon='NDOF_FLY') layout.prop(input_prefs, "ndof_lock_horizon", icon='NDOF_DOM') Index: source/blender/editors/space_view3d/view3d_edit.c =================================================================== --- source/blender/editors/space_view3d/view3d_edit.c (Revision 39819) +++ source/blender/editors/space_view3d/view3d_edit.c (Arbeitskopie) @@ -1017,18 +1017,26 @@ if (has_rotation) { - const int invert = U.ndof_flag & NDOF_ORBIT_INVERT_AXES; - rv3d->view = RV3D_VIEW_USER; if (U.flag & USER_TRACKBALL) { + const int invert_roll = U.ndof_flag & NDOF_ROLL_INVERT_AXIS; + const int invert_tilt = U.ndof_flag & NDOF_TILT_INVERT_AXIS; + const int invert_rot = U.ndof_flag & NDOF_ROTATE_INVERT_AXIS; + float rot[4]; float axis[3]; float angle = rot_sensitivity * ndof_to_axis_angle(ndof, axis); - - if (invert) - angle = -angle; - + + if (invert_roll) + axis[2] = -axis[2]; + + if (invert_tilt) + axis[0] = -axis[0]; + + if (invert_rot) + axis[1] = -axis[1]; + // transform rotation axis from view to world coordinates mul_qt_v3(view_inv, axis); @@ -1042,6 +1050,8 @@ mul_qt_qtqt(rv3d->viewquat, rv3d->viewquat, rot); } else { /* turntable view code by John Aughey, adapted for 3D mouse by [mce] */ + const int invert = U.ndof_flag & NDOF_ORBIT_INVERT_AXES; + float angle, rot[4]; float xvec[3] = {1,0,0}; @@ -1143,11 +1153,27 @@ const float vertical_sensitivity = 0.4f; const float lateral_sensitivity = 0.6f; - float pan_vec[3] = {lateral_sensitivity * ndof->tvec[0], - vertical_sensitivity * ndof->tvec[1], - forward_sensitivity * ndof->tvec[2] - }; + const int invert_panx = U.ndof_flag & NDOF_PANX_INVERT_AXIS; + const int invert_pany = U.ndof_flag & NDOF_PANY_INVERT_AXIS; + const int invert_panz = U.ndof_flag & NDOF_PANZ_INVERT_AXIS; + float pan_vec[3]; + + if (invert_panx) + pan_vec[0] = -lateral_sensitivity * ndof->tvec[0]; + else + pan_vec[0] = lateral_sensitivity * ndof->tvec[0]; + + if (invert_panz) + pan_vec[1] = -vertical_sensitivity * ndof->tvec[1]; + else + pan_vec[1] = vertical_sensitivity * ndof->tvec[1]; + + if (invert_pany) + pan_vec[2] = -forward_sensitivity * ndof->tvec[2]; + else + pan_vec[2] = forward_sensitivity * ndof->tvec[2]; + mul_v3_fl(pan_vec, speed * dt); #endif /* transform motion from view to world coordinates */ Index: source/blender/makesdna/DNA_userdef_types.h =================================================================== --- source/blender/makesdna/DNA_userdef_types.h (Revision 39819) +++ source/blender/makesdna/DNA_userdef_types.h (Arbeitskopie) @@ -607,6 +607,12 @@ /* zoom is up/down if this flag is set (otherwise forward/backward) */ #define NDOF_ZOOM_UPDOWN (1 << 7) #define NDOF_ZOOM_INVERT (1 << 8) +#define NDOF_ROTATE_INVERT_AXIS (1 << 9) +#define NDOF_TILT_INVERT_AXIS (1 << 10) +#define NDOF_ROLL_INVERT_AXIS (1 << 11) +#define NDOF_PANX_INVERT_AXIS (1 << 12) +#define NDOF_PANY_INVERT_AXIS (1 << 13) +#define NDOF_PANZ_INVERT_AXIS (1 << 14) #ifdef __cplusplus Index: source/blender/makesrna/intern/rna_userdef.c =================================================================== --- source/blender/makesrna/intern/rna_userdef.c (Revision 39819) +++ source/blender/makesrna/intern/rna_userdef.c (Arbeitskopie) @@ -2791,6 +2791,36 @@ RNA_def_property_ui_text(prop, "Invert Axes", "Toggle between moving the viewpoint or moving the scene being viewed"); /* in 3Dx docs, this is called 'object mode' vs. 'target camera mode' */ + /* 3D view: roll */ + prop= RNA_def_property(srna, "ndof_roll_invert_axis", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "ndof_flag", NDOF_ROLL_INVERT_AXIS); + RNA_def_property_ui_text(prop, "Invert roll Axis", "Invert roll axis"); + + /* 3D view: tilt */ + prop= RNA_def_property(srna, "ndof_tilt_invert_axis", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "ndof_flag", NDOF_TILT_INVERT_AXIS); + RNA_def_property_ui_text(prop, "Invert tilt Axis", "Invert tilt axis"); + + /* 3D view: rotate */ + prop= RNA_def_property(srna, "ndof_rotate_invert_axis", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "ndof_flag", NDOF_ROTATE_INVERT_AXIS); + RNA_def_property_ui_text(prop, "Invert rotation Axis", "Invert rotation axis"); + + /* 3D view: pan x */ + prop= RNA_def_property(srna, "ndof_panx_invert_axis", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "ndof_flag", NDOF_PANX_INVERT_AXIS); + RNA_def_property_ui_text(prop, "Invert x Axis", "Invert x axis"); + + /* 3D view: pan y */ + prop= RNA_def_property(srna, "ndof_pany_invert_axis", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "ndof_flag", NDOF_PANY_INVERT_AXIS); + RNA_def_property_ui_text(prop, "Invert y Axis", "Invert y axis"); + + /* 3D view: pan z */ + prop= RNA_def_property(srna, "ndof_panz_invert_axis", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "ndof_flag", NDOF_PANZ_INVERT_AXIS); + RNA_def_property_ui_text(prop, "Invert z Axis", "Invert z axis"); + /* 3D view: fly */ prop= RNA_def_property(srna, "ndof_lock_horizon", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "ndof_flag", NDOF_LOCK_HORIZON);