Merge branch 'blender-v4.5-release'

This commit is contained in:
Campbell Barton
2025-06-05 21:31:39 +10:00
13 changed files with 143 additions and 97 deletions

View File

@@ -157,13 +157,8 @@ const UserDef U_default = {
.ndof_sensitivity = 4.0,
.ndof_orbit_sensitivity = 4.0,
.ndof_deadzone = 0.0,
.ndof_flag = (NDOF_SHOW_GUIDE_ORBIT_CENTER | NDOF_ORBIT_CENTER_AUTO | NDOF_MODE_ORBIT |
NDOF_LOCK_HORIZON | NDOF_SHOULD_PAN | NDOF_SHOULD_ZOOM | NDOF_SHOULD_ROTATE |
/* Software from the driver authors follows this convention
* so invert this by default, see: #67579. */
NDOF_ROTX_INVERT_AXIS | NDOF_ROTY_INVERT_AXIS | NDOF_ROTZ_INVERT_AXIS |
NDOF_PANX_INVERT_AXIS | NDOF_PANY_INVERT_AXIS | NDOF_PANZ_INVERT_AXIS |
NDOF_ZOOM_INVERT | NDOF_CAMERA_PAN_ZOOM),
.ndof_flag = (NDOF_SHOW_GUIDE_ORBIT_CENTER | NDOF_ORBIT_CENTER_AUTO | NDOF_LOCK_HORIZON |
NDOF_SHOULD_PAN | NDOF_SHOULD_ZOOM | NDOF_SHOULD_ROTATE | NDOF_CAMERA_PAN_ZOOM),
.image_draw_method = IMAGE_DRAW_METHOD_AUTO,
.glalphaclip = 0.004,
.autokey_mode = (AUTOKEY_MODE_NORMAL & ~AUTOKEY_ON),

View File

@@ -2072,25 +2072,17 @@ class USERPREF_PT_ndof_settings(Panel):
@staticmethod
def draw_settings(layout, props, show_3dview_settings=True):
col = layout.column()
col.prop(props, "ndof_sensitivity", text="Pan Sensitivity")
col.prop(props, "ndof_orbit_sensitivity")
col.prop(props, "ndof_deadzone")
layout.separator()
if show_3dview_settings:
col = layout.column()
col.row().prop(props, "ndof_view_navigate_method", expand=True, text="Navigation")
col.row().prop(props, "ndof_view_rotate_method", expand=True, text="Rotation")
col.row().prop(props, "ndof_navigation_mode", text="Navigation Mode")
col.prop(props, "ndof_lock_horizon", text="Lock Horizon")
layout.separator()
if show_3dview_settings:
col = layout.column(heading="Show Guides")
col.prop(props, "ndof_show_guide_orbit_axis", text="Orbit Axis")
col.prop(props, "ndof_show_guide_orbit_center", text="Orbit Center")
col = layout.column(heading="Orbit Center")
col.prop(props, "ndof_orbit_center_auto")
colsub = col.column()
@@ -2099,36 +2091,43 @@ class USERPREF_PT_ndof_settings(Panel):
del colsub
col.separator()
col = layout.column(heading="Zoom")
col.prop(props, "ndof_zoom_invert")
col.prop(props, "ndof_lock_camera_pan_zoom")
row = col.row(heading="Pan")
row.prop(props, "ndof_pan_yz_swap_axis", text="Swap Y and Z Axes")
col = layout.column(heading="Show")
col.prop(props, "ndof_show_guide_orbit_axis", text="Orbit Axis")
col.prop(props, "ndof_show_guide_orbit_center", text="Orbit Center")
layout.separator()
row = layout.row(heading=("Invert Axis Pan" if show_3dview_settings else "Invert Pan Axis"))
for text, attr in (
("X", "ndof_panx_invert_axis"),
("Y", "ndof_pany_invert_axis"),
("Z", "ndof_panz_invert_axis"),
):
row.prop(props, attr, text=text, toggle=True)
layout_header, layout_advanced = layout.panel("NDOF_advanced", default_closed=True)
layout_header.label(text="Advanced")
if layout_advanced:
col = layout_advanced.column()
col.prop(props, "ndof_sensitivity", text="Pan Sensitivity")
col.prop(props, "ndof_orbit_sensitivity")
col.prop(props, "ndof_deadzone")
if show_3dview_settings:
row = layout.row(heading="Orbit")
col.separator()
col.row().prop(props, "ndof_zoom_direction", expand=True)
col.separator()
row = col.row(heading=("Invert Pan" if show_3dview_settings else "Invert Pan Axis"))
for text, attr in (
("X", "ndof_rotx_invert_axis"),
("Y", "ndof_roty_invert_axis"),
("Z", "ndof_rotz_invert_axis"),
("X", "ndof_panx_invert_axis"),
("Y", "ndof_pany_invert_axis"),
("Z", "ndof_panz_invert_axis"),
):
row.prop(props, attr, text=text, toggle=True)
layout.separator()
if show_3dview_settings:
row = col.row(heading="Invert Rotate")
for text, attr in (
("X", "ndof_rotx_invert_axis"),
("Y", "ndof_roty_invert_axis"),
("Z", "ndof_rotz_invert_axis"),
):
row.prop(props, attr, text=text, toggle=True)
col = layout.column(heading="Fly/Walk")
col.prop(props, "ndof_lock_horizon")
col.prop(props, "ndof_fly_helicopter")
if show_3dview_settings:
col.prop(props, "ndof_lock_camera_pan_zoom")
def draw(self, context):
layout = self.layout

View File

@@ -1532,7 +1532,7 @@ static wmOperatorStatus view2d_ndof_invoke(bContext *C, wmOperator *op, const wm
if (has_translate) {
float pan_vec[3];
WM_event_ndof_pan_get(ndof, pan_vec, false);
WM_event_ndof_pan_get(ndof, pan_vec);
pan_vec[0] *= speed;
pan_vec[1] *= speed;
@@ -1550,7 +1550,7 @@ static wmOperatorStatus view2d_ndof_invoke(bContext *C, wmOperator *op, const wm
bool do_zoom_xy[2];
if (U.ndof_flag & NDOF_ZOOM_INVERT) {
if (U.ndof_flag & NDOF_PANZ_INVERT_AXIS) {
zoom_factor = -zoom_factor;
}

View File

@@ -1654,7 +1654,7 @@ static wmOperatorStatus clip_view_ndof_invoke(bContext *C,
const wmNDOFMotionData *ndof = static_cast<wmNDOFMotionData *>(event->customdata);
const float pan_speed = NDOF_PIXELS_PER_SECOND;
WM_event_ndof_pan_get(ndof, pan_vec, true);
WM_event_ndof_pan_get(ndof, pan_vec);
mul_v3_fl(pan_vec, ndof->dt);
mul_v2_fl(pan_vec, pan_speed / sc->zoom);

View File

@@ -795,7 +795,7 @@ static wmOperatorStatus image_view_ndof_invoke(bContext *C,
const wmNDOFMotionData *ndof = static_cast<const wmNDOFMotionData *>(event->customdata);
const float pan_speed = NDOF_PIXELS_PER_SECOND;
WM_event_ndof_pan_get(ndof, pan_vec, true);
WM_event_ndof_pan_get(ndof, pan_vec);
mul_v3_fl(pan_vec, ndof->dt);
mul_v2_fl(pan_vec, pan_speed / sima->zoom);

View File

@@ -1526,7 +1526,7 @@ void view3d_draw_region_info(const bContext *C, ARegion *region)
if (U.ndof_flag & NDOF_SHOW_GUIDE_ORBIT_CENTER) {
/* Draw this only when orbiting and auto orbit-center is enabled */
if ((U.ndof_flag & NDOF_MODE_ORBIT) && (U.ndof_flag & NDOF_ORBIT_CENTER_AUTO)) {
if (NDOF_IS_ORBIT_AROUND_CENTER_MODE(&U) && (U.ndof_flag & NDOF_ORBIT_CENTER_AUTO)) {
if (rv3d->ndof_flag & RV3D_NDOF_OFS_IS_VALID) {
/* When the center is locked, the auto-center is not used. */
if (!(v3d->ob_center_cursor || v3d->ob_center)) {

View File

@@ -249,7 +249,7 @@ void ViewOpsData::init_navigation(bContext *C,
* Logically it doesn't make sense to use the selection as a pivot when the first-person
* navigation pivots from the view-point. This also interferes with zoom-speed,
* causing zoom-speed scale based on the distance to the selection center, see: #115253. */
if ((U.ndof_flag & NDOF_MODE_ORBIT) == 0) {
if (U.ndof_navigation_mode == NDOF_NAVIGATION_MODE_FLY) {
viewops_flag &= ~VIEWOPS_FLAG_ORBIT_SELECT;
}
}

View File

@@ -101,7 +101,7 @@ static float view3d_ndof_pan_speed_calc_from_dist(RegionView3D *rv3d, const floa
static float view3d_ndof_pan_speed_calc(RegionView3D *rv3d)
{
float tvec[3];
if ((U.ndof_flag & NDOF_MODE_ORBIT) && (U.ndof_flag & NDOF_ORBIT_CENTER_AUTO) &&
if (NDOF_IS_ORBIT_AROUND_CENTER_MODE(&U) && (U.ndof_flag & NDOF_ORBIT_CENTER_AUTO) &&
(rv3d->ndof_flag & RV3D_NDOF_OFS_IS_VALID))
{
negate_v3_v3(tvec, rv3d->ndof_ofs);
@@ -133,7 +133,7 @@ static void view3d_ndof_pan_zoom(const wmNDOFMotionData *ndof,
return;
}
WM_event_ndof_pan_get(ndof, pan_vec, false);
WM_event_ndof_pan_get_for_navigation(ndof, pan_vec);
if (has_zoom) {
/* zoom with Z */
@@ -149,7 +149,7 @@ static void view3d_ndof_pan_zoom(const wmNDOFMotionData *ndof,
if (ndof->tvec[2]) {
float zoom_distance = rv3d->dist * ndof->dt * ndof->tvec[2];
if (U.ndof_flag & NDOF_ZOOM_INVERT) {
if (U.ndof_flag & NDOF_PANZ_INVERT_AXIS) {
zoom_distance = -zoom_distance;
}
@@ -202,7 +202,7 @@ static void view3d_ndof_orbit(const wmNDOFMotionData *ndof,
invert_qt_qt_normalized(view_inv, rv3d->viewquat);
if (U.ndof_flag & NDOF_TURNTABLE) {
if (U.ndof_flag & NDOF_LOCK_HORIZON) {
float rot[3];
/* Turntable view code adapted for 3D mouse use. */
@@ -211,7 +211,7 @@ static void view3d_ndof_orbit(const wmNDOFMotionData *ndof,
float yvec[3] = {0, 1, 0};
/* only use XY, ignore Z */
WM_event_ndof_rotate_get(ndof, rot);
WM_event_ndof_rotate_get_for_navigation(ndof, rot);
/* Determine the direction of the X vector (for rotating up and down). */
mul_qt_v3(view_inv, xvec);
@@ -301,7 +301,7 @@ void view3d_ndof_fly(const wmNDOFMotionData *ndof,
speed *= 0.2f;
}
WM_event_ndof_pan_get(ndof, trans, false);
WM_event_ndof_pan_get(ndof, trans);
mul_v3_fl(trans, speed * ndof->dt);
trans_orig_y = trans[1];
@@ -600,7 +600,7 @@ static wmOperatorStatus view3d_ndof_cameraview_pan_zoom(ViewOpsData *vod,
const bool has_zoom = ndof->tvec[2] != 0.0f;
float pan_vec[3];
WM_event_ndof_pan_get(ndof, pan_vec, true);
WM_event_ndof_pan_get_for_navigation(ndof, pan_vec);
mul_v3_fl(pan_vec, ndof->dt);
/* NOTE: unlike image and clip views, the 2D pan doesn't have to be scaled by the zoom level.
@@ -785,7 +785,7 @@ static wmOperatorStatus ndof_orbit_zoom_invoke_impl(bContext *C,
/* NOTE: based on feedback from #67579, users want to have pan and orbit enabled at once.
* It's arguable that orbit shouldn't pan (since we have a pan only operator),
* so if there are users who like to separate orbit/pan operations - it can be a preference. */
const bool is_orbit_around_pivot = (U.ndof_flag & NDOF_MODE_ORBIT) ||
const bool is_orbit_around_pivot = NDOF_IS_ORBIT_AROUND_CENTER_MODE(&U) ||
ED_view3d_offset_lock_check(v3d, rv3d);
const bool has_rotation = ndof_has_rotate(ndof, rv3d);
bool has_translate, has_zoom;
@@ -954,15 +954,16 @@ static wmOperatorStatus ndof_all_invoke_impl(bContext *C,
const wmEvent *event,
PointerRNA * /*ptr*/)
{
/* weak!, but it works */
const int ndof_flag = U.ndof_flag;
wmOperatorStatus ret;
U.ndof_flag &= ~NDOF_MODE_ORBIT;
/* weak!, but it works */
const uint8_t ndof_navigation_mode_backup = U.ndof_navigation_mode;
U.ndof_navigation_mode = NDOF_NAVIGATION_MODE_FLY;
ret = ndof_orbit_zoom_invoke_impl(C, vod, event, nullptr);
U.ndof_flag = ndof_flag;
U.ndof_navigation_mode = ndof_navigation_mode_backup;
return ret;
}

View File

@@ -516,9 +516,9 @@ typedef struct UserDef {
float ndof_deadzone;
/** #eNdof_Flag, flags for 3D mouse. */
int ndof_flag;
/** #eMultiSample_Type, amount of samples for OpenGL FSA, if zero no FSA. */
short ogl_multisamples;
/** #eNdof_Navigation_Mode, current navigation mode. */
uint8_t ndof_navigation_mode;
char _pad17[1];
/** eImageDrawMethod, Method to be used to draw the images
* (AUTO, GLSL, Textures or DrawPixels) */
@@ -1010,15 +1010,13 @@ typedef enum eNdof_Flag {
NDOF_SHOULD_ZOOM = (1 << 4),
NDOF_SHOULD_ROTATE = (1 << 5),
/* Orbit navigation modes. */
NDOF_MODE_ORBIT = (1 << 6),
// NDOF_UNUSED_6 = (1 << 6), /* Dirty. */
/* actually... users probably don't care about what the mode
* is called, just that it feels right */
/* zoom is up/down if this flag is set (otherwise forward/backward) */
NDOF_PAN_YZ_SWAP_AXIS = (1 << 7),
NDOF_ZOOM_INVERT = (1 << 8),
// NDOF_UNUSED_8 = (1 << 8), /* Dirty. */
NDOF_ROTX_INVERT_AXIS = (1 << 9),
NDOF_ROTY_INVERT_AXIS = (1 << 10),
NDOF_ROTZ_INVERT_AXIS = (1 << 11),
@@ -1032,6 +1030,33 @@ typedef enum eNdof_Flag {
NDOF_SHOW_GUIDE_ORBIT_CENTER = (1 << 19),
} eNdof_Flag;
/**
* NDOF Navigation Modes.
* Each mode describes some style of navigation rather than control a single aspect of navigation.
*/
typedef enum eNdof_Navigation_Mode {
/**
* 3D mouse cap represents objects movement in 3D space.
* Pulling the cap will pull the objects closer to the camera.
*/
NDOF_NAVIGATION_MODE_OBJECT = 0,
/**
* 3D mouse cap controls the movement of the view window
* and allows for flying through the scene.
*/
NDOF_NAVIGATION_MODE_FLY = 1,
/* TODO: implement "Target Camera Mode" and "Drone Mode" */
} eNdof_Navigation_Mode;
/**
* Some navigation modes make use of "Auto Center" (#NDOF_ORBIT_CENTER_AUTO) and some don't.
* Instead of testing against all possibilities use a macro.
*
* TODO: Add Target Camera Mode when implemented.
*/
#define NDOF_IS_ORBIT_AROUND_CENTER_MODE(userdef) \
((userdef)->ndof_navigation_mode == NDOF_NAVIGATION_MODE_OBJECT)
#define NDOF_PIXELS_PER_SECOND 600.0f
/** UserDef.ogl_multisamples */

View File

@@ -6470,18 +6470,33 @@ static void rna_def_userdef_input(BlenderRNA *brna)
# ifdef WITH_INPUT_NDOF
static const EnumPropertyItem ndof_view_navigation_items[] = {
{0, "FREE", 0, "Free", "Use full 6 degrees of freedom by default"},
{NDOF_MODE_ORBIT, "ORBIT", 0, "Orbit", "Orbit about the view center by default"},
{NDOF_NAVIGATION_MODE_OBJECT,
"OBJECT",
0,
"Object",
"This mode is like reaching into the screen and holding the model in your hand. "
"Push the 3D Mouse cap left, and the model moves left. Push right and the model "
"moves right"},
{NDOF_NAVIGATION_MODE_FLY,
"FLY",
0,
"Fly",
"Enables using the 3D Mouse as if it is a camera. Push into the scene and the camera "
"moves forward into the scene. You are entering the scene as if flying around in it"},
{0, nullptr, 0, nullptr, nullptr},
};
static const EnumPropertyItem ndof_view_rotation_items[] = {
{NDOF_TURNTABLE,
"TURNTABLE",
static const EnumPropertyItem ndof_zoom_direction_items[] = {
{0,
"NDOF_ZOOM_FORWARD",
0,
"Turntable",
"Use turntable style rotation in the viewport"},
{0, "TRACKBALL", 0, "Trackball", "Use trackball style rotation in the viewport"},
"Forward/Backward",
"Zoom by pulling the 3D Mouse cap upwards or pushing the cap downwards"},
{NDOF_PAN_YZ_SWAP_AXIS,
"NDOF_ZOOM_UP",
0,
"Up/Down",
"Zoom by pulling the 3D Mouse cap upwards or pushing the cap downwards"},
{0, nullptr, 0, nullptr, nullptr},
};
# endif /* WITH_INPUT_NDOF */
@@ -6714,14 +6729,11 @@ static void rna_def_userdef_input(BlenderRNA *brna)
prop, "Deadzone", "Threshold of initial movement needed from the device's rest position");
RNA_def_property_update(prop, 0, "rna_userdef_ndof_deadzone_update");
prop = RNA_def_property(srna, "ndof_pan_yz_swap_axis", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, nullptr, "ndof_flag", NDOF_PAN_YZ_SWAP_AXIS);
prop = RNA_def_property(srna, "ndof_zoom_direction", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_bitflag_sdna(prop, nullptr, "ndof_flag");
RNA_def_property_enum_items(prop, ndof_zoom_direction_items);
RNA_def_property_ui_text(
prop, "Y/Z Swap Axis", "Pan using up/down on the device (otherwise forward/backward)");
prop = RNA_def_property(srna, "ndof_zoom_invert", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, nullptr, "ndof_flag", NDOF_ZOOM_INVERT);
RNA_def_property_ui_text(prop, "Invert Zoom", "Zoom using opposite direction");
prop, "Zoom direction", "Which axis of the 3D Mouse cap zooms the view");
/* 3D view */
prop = RNA_def_property(srna, "ndof_show_guide_orbit_axis", PROP_BOOLEAN, PROP_NONE);
@@ -6738,15 +6750,16 @@ static void rna_def_userdef_input(BlenderRNA *brna)
prop, "Show Orbit Center Guide", "Display the orbit center during rotation");
/* 3D view */
prop = RNA_def_property(srna, "ndof_view_navigate_method", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_bitflag_sdna(prop, nullptr, "ndof_flag");
prop = RNA_def_property(srna, "ndof_navigation_mode", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_items(prop, ndof_view_navigation_items);
RNA_def_property_ui_text(prop, "NDOF View Navigate", "Navigation style in the viewport");
RNA_def_property_ui_text(prop, "NDOF View Navigate", "3D Mouse Navigation Mode");
prop = RNA_def_property(srna, "ndof_view_rotate_method", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_bitflag_sdna(prop, nullptr, "ndof_flag");
RNA_def_property_enum_items(prop, ndof_view_rotation_items);
RNA_def_property_ui_text(prop, "NDOF View Rotation", "Rotation style in the viewport");
prop = RNA_def_property(srna, "ndof_lock_horizon", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, nullptr, "ndof_flag", NDOF_LOCK_HORIZON);
RNA_def_property_ui_text(
prop,
"NDOF Lock Horizon",
"Lock Horizon forces the horizon to be kept leveled as it currently is");
prop = RNA_def_property(srna, "ndof_orbit_center_auto", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, nullptr, "ndof_flag", NDOF_ORBIT_CENTER_AUTO);
@@ -6761,8 +6774,8 @@ static void rna_def_userdef_input(BlenderRNA *brna)
prop = RNA_def_property(srna, "ndof_orbit_center_selected", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, nullptr, "ndof_flag", NDOF_ORBIT_CENTER_SELECTED);
RNA_def_property_ui_text(prop,
"Use Selected Items",
"Use selected item forces the orbit center "
"Selected Items",
"Selected Item forces the orbit center "
"to only take the currently selected objects into account.");
/* 3D view: yaw */
@@ -6796,10 +6809,6 @@ static void rna_def_userdef_input(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Invert Z Axis", "");
/* 3D view: fly */
prop = RNA_def_property(srna, "ndof_lock_horizon", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, nullptr, "ndof_flag", NDOF_LOCK_HORIZON);
RNA_def_property_ui_text(prop, "Lock Horizon", "Keep horizon level while flying with 3D Mouse");
prop = RNA_def_property(srna, "ndof_fly_helicopter", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, nullptr, "ndof_flag", NDOF_FLY_HELICOPTER);
RNA_def_property_ui_text(prop,
@@ -6810,7 +6819,7 @@ static void rna_def_userdef_input(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, nullptr, "ndof_flag", NDOF_CAMERA_PAN_ZOOM);
RNA_def_property_ui_text(
prop,
"Lock Camera Pan/Zoom",
"Pan / Zoom Camera View",
"Pan/zoom the camera view instead of leaving the camera view when orbiting");
# endif /* WITH_INPUT_NDOF */

View File

@@ -811,7 +811,7 @@ static void rna_NDOFMotionEventData_translation_get(PointerRNA *ptr, float *valu
{
# ifdef WITH_INPUT_NDOF
const wmNDOFMotionData *ndof = static_cast<const wmNDOFMotionData *>(ptr->data);
WM_event_ndof_pan_get(ndof, values, false);
WM_event_ndof_pan_get(ndof, values);
# else
UNUSED_VARS(ptr);
ARRAY_SET_ITEMS(values, 0, 0, 0);

View File

@@ -2011,7 +2011,9 @@ int WM_userdef_event_map(int kmitype);
int WM_userdef_event_type_from_keymap_type(int kmitype);
#ifdef WITH_INPUT_NDOF
void WM_event_ndof_pan_get(const wmNDOFMotionData *ndof, float r_pan[3], bool use_zoom);
void WM_event_ndof_pan_get_for_navigation(const wmNDOFMotionData *ndof, float r_pan[3]);
void WM_event_ndof_rotate_get_for_navigation(const wmNDOFMotionData *ndof, float r_rot[3]);
void WM_event_ndof_pan_get(const wmNDOFMotionData *ndof, float r_pan[3]);
void WM_event_ndof_rotate_get(const wmNDOFMotionData *ndof, float r_rot[3]);
float WM_event_ndof_to_axis_angle(const wmNDOFMotionData *ndof, float axis[3]);

View File

@@ -511,12 +511,27 @@ int WM_userdef_event_type_from_keymap_type(int kmitype)
#ifdef WITH_INPUT_NDOF
void WM_event_ndof_pan_get(const wmNDOFMotionData *ndof, float r_pan[3], const bool use_zoom)
void WM_event_ndof_pan_get_for_navigation(const wmNDOFMotionData *ndof, float r_pan[3])
{
const float sign = (U.ndof_navigation_mode == NDOF_NAVIGATION_MODE_OBJECT) ? -1.0f : 1.0f;
r_pan[0] = ndof->tvec[0] * ((U.ndof_flag & NDOF_PANX_INVERT_AXIS) ? -sign : sign);
r_pan[1] = ndof->tvec[1] * ((U.ndof_flag & NDOF_PANY_INVERT_AXIS) ? -sign : sign);
r_pan[2] = ndof->tvec[2] * ((U.ndof_flag & NDOF_PANZ_INVERT_AXIS) ? -sign : sign);
}
void WM_event_ndof_rotate_get_for_navigation(const wmNDOFMotionData *ndof, float r_rot[3])
{
const float sign = (U.ndof_navigation_mode == NDOF_NAVIGATION_MODE_OBJECT) ? -1.0f : 1.0f;
r_rot[0] = ndof->rvec[0] * ((U.ndof_flag & NDOF_ROTX_INVERT_AXIS) ? -sign : sign);
r_rot[1] = ndof->rvec[1] * ((U.ndof_flag & NDOF_ROTY_INVERT_AXIS) ? -sign : sign);
r_rot[2] = ndof->rvec[2] * ((U.ndof_flag & NDOF_ROTZ_INVERT_AXIS) ? -sign : sign);
}
void WM_event_ndof_pan_get(const wmNDOFMotionData *ndof, float r_pan[3])
{
int z_flag = use_zoom ? NDOF_ZOOM_INVERT : NDOF_PANZ_INVERT_AXIS;
r_pan[0] = ndof->tvec[0] * ((U.ndof_flag & NDOF_PANX_INVERT_AXIS) ? -1.0f : 1.0f);
r_pan[1] = ndof->tvec[1] * ((U.ndof_flag & NDOF_PANY_INVERT_AXIS) ? -1.0f : 1.0f);
r_pan[2] = ndof->tvec[2] * ((U.ndof_flag & z_flag) ? -1.0f : 1.0f);
r_pan[2] = ndof->tvec[2] * ((U.ndof_flag & NDOF_PANZ_INVERT_AXIS) ? -1.0f : 1.0f);
}
void WM_event_ndof_rotate_get(const wmNDOFMotionData *ndof, float r_rot[3])