diff --git a/data/assets/examples/joystickProperty.asset b/data/assets/examples/joystickProperty.asset index bcd71b14e9..56016e8a18 100644 --- a/data/assets/examples/joystickProperty.asset +++ b/data/assets/examples/joystickProperty.asset @@ -5,10 +5,8 @@ -- "Zoom" -- both in and out -- "Zoom In" -- "Zoom Out" --- "LocalRoll X" --- "LocalRoll Y" --- "GlobalRoll X" --- "GlobalRoll Y" +-- "LocalRoll" +-- "GlobalRoll" -- "Pan X" -- "Pan Y" -- Fourth parameter determines whether the axis should be inverted @@ -18,7 +16,8 @@ -- The axis values can either go back to 0 when the joystick is released or it can -- stay at the value it was before the joystick was released. -- The latter is called a sticky axis, when the values don't go back to 0. --- Seventh parameter is the sensitivity for the axis +-- Seventh parameter can be used to reverse the camera movement for the axis +-- Eighth parameter is the sensitivity for the axis -- Parameters for bindJoystickAxisProperty: @@ -59,8 +58,6 @@ local freezeValue = function(name, axis, min, max) local isPropertyBound = true; if joystickType == "None" then isPropertyBound = false; - else - isPropertyBound = true; end if isPropertyBound then diff --git a/data/assets/util/joysticks/joystick_helper.asset b/data/assets/util/joysticks/joystick_helper.asset index e7ed239957..d46fd0d270 100644 --- a/data/assets/util/joysticks/joystick_helper.asset +++ b/data/assets/util/joysticks/joystick_helper.asset @@ -9,11 +9,11 @@ local bindLocalRoll = function(name, axis) -- We only want to store the current state in the first mode that is enabled, otherwise we will overwrite the backup if not Joystick.State.IsInRollMode then -- Save current axis state - Joystick.State.Axis.Type, Joystick.State.Axis.Inverted, Joystick.State.Axis.JoystickType, Joystick.State.Axis.Sticky, Joystick.State.Axis.Sensitivity, Joystick.State.Axis.PropertyUri, Joystick.State.Axis.MinValue, Joystick.State.Axis.MaxValue, Joystick.State.Axis.IsRemote = openspace.navigation.joystickAxis("]] .. name .. "\", " .. axis .. [[); + Joystick.State.Axis.Type, Joystick.State.Axis.Inverted, Joystick.State.Axis.JoystickType, Joystick.State.Axis.Sticky, Joystick.State.Axis.Flip, Joystick.State.Axis.Sensitivity, Joystick.State.Axis.PropertyUri, Joystick.State.Axis.MinValue, Joystick.State.Axis.MaxValue, Joystick.State.Axis.IsRemote = openspace.navigation.joystickAxis("]] .. name .. "\", " .. axis .. [[); end -- Set new axis state - openspace.navigation.bindJoystickAxis("]] .. name .. "\", " .. axis .. [[, "LocalRoll X", Joystick.State.Axis.Inverted, Joystick.State.Axis.JoystickType, Joystick.State.Axis.Sticky, Joystick.State.Axis.Sensitivity); + openspace.navigation.bindJoystickAxis("]] .. name .. "\", " .. axis .. [[, "LocalRoll", Joystick.State.Axis.Inverted, Joystick.State.Axis.JoystickType, Joystick.State.Axis.Sticky, Joystick.State.Axis.Flip, Joystick.State.Axis.Sensitivity); Joystick.State.IsInRollMode = true ]] end @@ -23,11 +23,11 @@ local bindGlobalRoll = function(name, axis) -- We only want to store the current state in the first mode that is enabled, otherwise we will overwrite the backup if not Joystick.State.IsInRollMode then -- Save current axis state - Joystick.State.Axis.Type, Joystick.State.Axis.Inverted, Joystick.State.Axis.JoystickType, Joystick.State.Axis.Sticky, Joystick.State.Axis.Sensitivity, Joystick.State.Axis.PropertyUri, Joystick.State.Axis.MinValue, Joystick.State.Axis.MaxValue, Joystick.State.Axis.IsRemote = openspace.navigation.joystickAxis("]] .. name .. "\", " .. axis .. [[); + Joystick.State.Axis.Type, Joystick.State.Axis.Inverted, Joystick.State.Axis.JoystickType, Joystick.State.Axis.Sticky, Joystick.State.Axis.Flip, Joystick.State.Axis.Sensitivity, Joystick.State.Axis.PropertyUri, Joystick.State.Axis.MinValue, Joystick.State.Axis.MaxValue, Joystick.State.Axis.IsRemote = openspace.navigation.joystickAxis("]] .. name .. "\", " .. axis .. [[); end -- Set new axis state - openspace.navigation.bindJoystickAxis("]] .. name .. "\", " .. axis .. [[, "GlobalRoll X", Joystick.State.Axis.Inverted, Joystick.State.Axis.JoystickType, Joystick.State.Axis.Sticky, Joystick.State.Axis.Sensitivity); + openspace.navigation.bindJoystickAxis("]] .. name .. "\", " .. axis .. [[, "GlobalRoll", Joystick.State.Axis.Inverted, Joystick.State.Axis.JoystickType, Joystick.State.Axis.Sticky, Joystick.State.Axis.Flip, Joystick.State.Axis.Sensitivity); Joystick.State.IsInRollMode = true ]] end @@ -35,20 +35,20 @@ end local permaBindLocalRoll = function(name, axis) return [[ -- Save current axis state - Joystick.State.Axis.Type, Joystick.State.Axis.Inverted, Joystick.State.Axis.JoystickType, Joystick.State.Axis.Sticky, Joystick.State.Axis.Sensitivity, Joystick.State.Axis.PropertyUri, Joystick.State.Axis.MinValue, Joystick.State.Axis.MaxValue, Joystick.State.Axis.IsRemote = openspace.navigation.joystickAxis("]] .. name .. "\", " .. axis .. [[); + Joystick.State.Axis.Type, Joystick.State.Axis.Inverted, Joystick.State.Axis.JoystickType, Joystick.State.Axis.Sticky, Joystick.State.Axis.Flip, Joystick.State.Axis.Sensitivity, Joystick.State.Axis.PropertyUri, Joystick.State.Axis.MinValue, Joystick.State.Axis.MaxValue, Joystick.State.Axis.IsRemote = openspace.navigation.joystickAxis("]] .. name .. "\", " .. axis .. [[); -- Set new axis state - openspace.navigation.bindJoystickAxis("]] .. name .. "\", " .. axis .. [[, "LocalRoll X", Joystick.State.Axis.Inverted, Joystick.State.Axis.JoystickType, Joystick.State.Axis.Sticky, Joystick.State.Axis.Sensitivity); + openspace.navigation.bindJoystickAxis("]] .. name .. "\", " .. axis .. [[, "LocalRoll", Joystick.State.Axis.Inverted, Joystick.State.Axis.JoystickType, Joystick.State.Axis.Sticky, Joystick.State.Axis.Flip, Joystick.State.Axis.Sensitivity); ]] end local permaBindGlobalRoll = function(name, axis) return [[ -- Save current axis state - Joystick.State.Axis.Type, Joystick.State.Axis.Inverted, Joystick.State.Axis.JoystickType, Joystick.State.Axis.Sticky, Joystick.State.Axis.Sensitivity, Joystick.State.Axis.PropertyUri, Joystick.State.Axis.MinValue, Joystick.State.Axis.MaxValue, Joystick.State.Axis.IsRemote = openspace.navigation.joystickAxis("]] .. name .. "\", " .. axis .. [[); + Joystick.State.Axis.Type, Joystick.State.Axis.Inverted, Joystick.State.Axis.JoystickType, Joystick.State.Axis.Sticky, Joystick.State.Axis.Flip, Joystick.State.Axis.Sensitivity, Joystick.State.Axis.PropertyUri, Joystick.State.Axis.MinValue, Joystick.State.Axis.MaxValue, Joystick.State.Axis.IsRemote = openspace.navigation.joystickAxis("]] .. name .. "\", " .. axis .. [[); -- Set new axis state - openspace.navigation.bindJoystickAxis("]] .. name .. "\", " .. axis .. [[, "GlobalRoll X", Joystick.State.Axis.Inverted, Joystick.State.Axis.JoystickType, Joystick.State.Axis.Sticky, Joystick.State.Axis.Sensitivity); + openspace.navigation.bindJoystickAxis("]] .. name .. "\", " .. axis .. [[, "GlobalRoll", Joystick.State.Axis.Inverted, Joystick.State.Axis.JoystickType, Joystick.State.Axis.Sticky, Joystick.State.Axis.Flip, Joystick.State.Axis.Sensitivity); ]] end @@ -56,9 +56,9 @@ local unbindRoll = function(name, axis) return [[ -- Reset previous state if (Joystick.State.Axis.Type == "Property") then - openspace.navigation.bindJoystickAxisProperty("]] .. name .. "\", " .. axis .. [[, Joystick.State.Axis.PropertyUri, Joystick.State.Axis.MinValue, Joystick.State.Axis.MaxValue, Joystick.State.Axis.Inverted, Joystick.State.Axis.IsRemote); + openspace.navigation.bindJoystickAxisProperty("]] .. name .. "\", " .. axis .. [[, Joystick.State.Axis.PropertyUri, Joystick.State.Axis.MinValue, Joystick.State.Axis.MaxValue, Joystick.State.Axis.Inverted, Joystick.State.Axis.Flip, Joystick.State.Axis.IsRemote); else - openspace.navigation.bindJoystickAxis("]] .. name .. "\", " .. axis .. [[, Joystick.State.Axis.Type, Joystick.State.Axis.Inverted, Joystick.State.Axis.JoystickType, Joystick.State.Axis.Sticky, Joystick.State.Axis.Sensitivity); + openspace.navigation.bindJoystickAxis("]] .. name .. "\", " .. axis .. [[, Joystick.State.Axis.Type, Joystick.State.Axis.Inverted, Joystick.State.Axis.JoystickType, Joystick.State.Axis.Sticky, Joystick.State.Axis.Flip, Joystick.State.Axis.Sensitivity); end ]] end diff --git a/data/assets/util/joysticks/ps4.asset b/data/assets/util/joysticks/ps4.asset index 770f138fcd..501b2a1756 100644 --- a/data/assets/util/joysticks/ps4.asset +++ b/data/assets/util/joysticks/ps4.asset @@ -8,10 +8,8 @@ local joystickHelper = asset.require("./joystick_helper") -- "Zoom" -- both in and out -- "Zoom In" -- "Zoom Out" --- "LocalRoll X" --- "LocalRoll Y" --- "GlobalRoll X" --- "GlobalRoll Y" +-- "LocalRoll" +-- "GlobalRoll" -- "Pan X" -- "Pan Y" -- Fourth parameter determines whether the axis should be inverted @@ -21,7 +19,8 @@ local joystickHelper = asset.require("./joystick_helper") -- The axis values can either go back to 0 when the joystick is released or it can -- stay at the value it was before the joystick was released. -- The latter is called a sticky axis, when the values don't go back to 0. --- Seventh parameter is the sensitivity for the axis +-- Seventh parameter can be used to reverse the camera movement for the axis +-- Eighth parameter is the sensitivity for the axis local PS4Controller = { LeftThumbStick = { 0 , 1 }, diff --git a/data/assets/util/joysticks/space-mouse-compact-wireless.asset b/data/assets/util/joysticks/space-mouse-compact-wireless.asset index 2874aa23f2..a157bbcb5d 100644 --- a/data/assets/util/joysticks/space-mouse-compact-wireless.asset +++ b/data/assets/util/joysticks/space-mouse-compact-wireless.asset @@ -8,10 +8,8 @@ local joystickHelper = asset.require("./joystick_helper") -- "Zoom" -- both in and out -- "Zoom In" -- "Zoom Out" --- "LocalRoll X" --- "LocalRoll Y" --- "GlobalRoll X" --- "GlobalRoll Y" +-- "LocalRoll" +-- "GlobalRoll" -- "Pan X" -- "Pan Y" -- Fourth parameter determines whether the axis should be inverted @@ -22,7 +20,8 @@ local joystickHelper = asset.require("./joystick_helper") -- stay at the value it was before the joystick was released. -- The latter is called a sticky axis, when the values don't go back to 0. -- This version of the SpaceMouse IS Sticky. --- Seventh parameter is the sensitivity for the axis +-- Seventh parameter can be used to reverse the camera movement for the axis +-- Eighth parameter is the sensitivity for the axis local SpaceMouse = { Push = {0, 1, 2}, -- left/right, back/forth, up/down @@ -37,12 +36,12 @@ asset.onInitialize(function() local controller = SpaceMouse; local name = "3Dconnexion Universal Receiver"; - openspace.navigation.bindJoystickAxis(name, controller.Push[1], "Orbit X", false, "JoystickLike", true, 40.0); - openspace.navigation.bindJoystickAxis(name, controller.Push[2], "Orbit Y", false, "JoystickLike", true, 40.0); - openspace.navigation.bindJoystickAxis(name, controller.Twist[1], "Pan X", true, "JoystickLike", true, 40.0); - openspace.navigation.bindJoystickAxis(name, controller.Tilt[2], "Pan Y", false, "JoystickLike", true, 35.0); - openspace.navigation.bindJoystickAxis(name, controller.Push[3], "Zoom", false, "JoystickLike", true, 40.0); - openspace.navigation.bindJoystickAxis(name, controller.Tilt[1], "LocalRoll X", false, "JoystickLike", true, 35.0); + openspace.navigation.bindJoystickAxis(name, controller.Push[1], "Orbit X", false, "JoystickLike", true, false, 40.0); + openspace.navigation.bindJoystickAxis(name, controller.Push[2], "Orbit Y", false, "JoystickLike", true, false, 40.0); + openspace.navigation.bindJoystickAxis(name, controller.Twist[1], "Pan X", true, "JoystickLike", true, false, 40.0); + openspace.navigation.bindJoystickAxis(name, controller.Tilt[2], "Pan Y", false, "JoystickLike", true, false, 35.0); + openspace.navigation.bindJoystickAxis(name, controller.Push[3], "Zoom", false, "JoystickLike", true, false, 40.0); + openspace.navigation.bindJoystickAxis(name, controller.Tilt[1], "LocalRoll", false, "JoystickLike", true, false, 35.0); openspace.navigation.bindJoystickButton( name, diff --git a/data/assets/util/joysticks/space-mouse-compact.asset b/data/assets/util/joysticks/space-mouse-compact.asset index d9a2d13fed..6d5bec1202 100644 --- a/data/assets/util/joysticks/space-mouse-compact.asset +++ b/data/assets/util/joysticks/space-mouse-compact.asset @@ -8,10 +8,8 @@ local joystickHelper = asset.require("./joystick_helper") -- "Zoom" -- both in and out -- "Zoom In" -- "Zoom Out" --- "LocalRoll X" --- "LocalRoll Y" --- "GlobalRoll X" --- "GlobalRoll Y" +-- "LocalRoll" +-- "GlobalRoll" -- "Pan X" -- "Pan Y" -- Fourth parameter determines whether the axis should be inverted @@ -22,7 +20,8 @@ local joystickHelper = asset.require("./joystick_helper") -- stay at the value it was before the joystick was released. -- The latter is called a sticky axis, when the values don't go back to 0. -- This version of the SpaceMouse IS Sticky. --- Seventh parameter is the sensitivity for the axis +-- Seventh parameter can be used to reverse the camera movement for the axis +-- Eighth parameter is the sensitivity for the axis local SpaceMouse = { Push = {0, 1, 2}, -- left/right, back/forth, up/down @@ -37,12 +36,12 @@ asset.onInitialize(function() local controller = SpaceMouse; local name = "SpaceNavigator"; - openspace.navigation.bindJoystickAxis(name, controller.Push[1], "Orbit X", false, "JoystickLike", true, 40.0); - openspace.navigation.bindJoystickAxis(name, controller.Push[2], "Orbit Y", false, "JoystickLike", true, 40.0); - openspace.navigation.bindJoystickAxis(name, controller.Twist[1], "Pan X", true, "JoystickLike", true, 40.0); - openspace.navigation.bindJoystickAxis(name, controller.Tilt[2], "Pan Y", false, "JoystickLike", true, 35.0); - openspace.navigation.bindJoystickAxis(name, controller.Push[3], "Zoom", false, "JoystickLike", true, 40.0); - openspace.navigation.bindJoystickAxis(name, controller.Tilt[1], "LocalRoll X", false, "JoystickLike", true, 35.0); + openspace.navigation.bindJoystickAxis(name, controller.Push[1], "Orbit X", false, "JoystickLike", true, false, 40.0); + openspace.navigation.bindJoystickAxis(name, controller.Push[2], "Orbit Y", false, "JoystickLike", true, false, 40.0); + openspace.navigation.bindJoystickAxis(name, controller.Twist[1], "Pan X", true, "JoystickLike", true, false, 40.0); + openspace.navigation.bindJoystickAxis(name, controller.Tilt[2], "Pan Y", false, "JoystickLike", true, false, 35.0); + openspace.navigation.bindJoystickAxis(name, controller.Push[3], "Zoom", false, "JoystickLike", true, false, 40.0); + openspace.navigation.bindJoystickAxis(name, controller.Tilt[1], "LocalRoll", false, "JoystickLike", true, false, 35.0); openspace.navigation.bindJoystickButton( name, diff --git a/data/assets/util/joysticks/space-mouse-enterprise-wireless.asset b/data/assets/util/joysticks/space-mouse-enterprise-wireless.asset index 2a8f124196..0764248b8f 100644 --- a/data/assets/util/joysticks/space-mouse-enterprise-wireless.asset +++ b/data/assets/util/joysticks/space-mouse-enterprise-wireless.asset @@ -8,10 +8,8 @@ local joystickHelper = asset.require("./joystick_helper") -- "Zoom" -- both in and out -- "Zoom In" -- "Zoom Out" --- "LocalRoll X" --- "LocalRoll Y" --- "GlobalRoll X" --- "GlobalRoll Y" +-- "LocalRoll" +-- "GlobalRoll" -- "Pan X" -- "Pan Y" -- Fourth parameter determines whether the axis should be inverted @@ -22,7 +20,8 @@ local joystickHelper = asset.require("./joystick_helper") -- stay at the value it was before the joystick was released. -- The latter is called a sticky axis, when the values don't go back to 0. -- This version of the SpaceMouse is NOT Sticky. --- Seventh parameter is the sensitivity for the axis +-- Seventh parameter can be used to reverse the camera movement for the axis +-- Eighth parameter is the sensitivity for the axis local SpaceMouse = { Push = {0, 1, 2}, -- left/right, back/forth, up/down @@ -50,5 +49,5 @@ asset.onInitialize(function() openspace.navigation.bindJoystickAxis(name, controller.Twist[1], "Pan X", true); openspace.navigation.bindJoystickAxis(name, controller.Tilt[2], "Pan Y"); openspace.navigation.bindJoystickAxis(name, controller.Push[3], "Zoom"); - openspace.navigation.bindJoystickAxis(name, controller.Tilt[1], "LocalRoll X"); + openspace.navigation.bindJoystickAxis(name, controller.Tilt[1], "LocalRoll"); end) diff --git a/data/assets/util/joysticks/space-mouse-enterprise.asset b/data/assets/util/joysticks/space-mouse-enterprise.asset index cb9510a641..8d808c8c4d 100644 --- a/data/assets/util/joysticks/space-mouse-enterprise.asset +++ b/data/assets/util/joysticks/space-mouse-enterprise.asset @@ -8,10 +8,8 @@ local joystickHelper = asset.require("./joystick_helper") -- "Zoom" -- both in and out -- "Zoom In" -- "Zoom Out" --- "LocalRoll X" --- "LocalRoll Y" --- "GlobalRoll X" --- "GlobalRoll Y" +-- "LocalRoll" +-- "GlobalRoll" -- "Pan X" -- "Pan Y" -- Fourth parameter determines whether the axis should be inverted @@ -22,7 +20,8 @@ local joystickHelper = asset.require("./joystick_helper") -- stay at the value it was before the joystick was released. -- The latter is called a sticky axis, when the values don't go back to 0. -- This version of the SpaceMouse is NOT Sticky. --- Seventh parameter is the sensitivity for the axis +-- Seventh parameter can be used to reverse the camera movement for the axis +-- Eighth parameter is the sensitivity for the axis local SpaceMouse = { Push = {0, 1, 2}, -- left/right, back/forth, up/down @@ -50,5 +49,5 @@ asset.onInitialize(function() openspace.navigation.bindJoystickAxis(name, controller.Twist[1], "Pan X", true); openspace.navigation.bindJoystickAxis(name, controller.Tilt[2], "Pan Y"); openspace.navigation.bindJoystickAxis(name, controller.Push[3], "Zoom"); - openspace.navigation.bindJoystickAxis(name, controller.Tilt[1], "LocalRoll X"); + openspace.navigation.bindJoystickAxis(name, controller.Tilt[1], "LocalRoll"); end) diff --git a/data/assets/util/joysticks/xbox-wireless.asset b/data/assets/util/joysticks/xbox-wireless.asset index 0c98947505..d774d1e2ac 100644 --- a/data/assets/util/joysticks/xbox-wireless.asset +++ b/data/assets/util/joysticks/xbox-wireless.asset @@ -8,10 +8,8 @@ local joystickHelper = asset.require("./joystick_helper") -- "Zoom" -- both in and out -- "Zoom In" -- "Zoom Out" --- "LocalRoll X" --- "LocalRoll Y" --- "GlobalRoll X" --- "GlobalRoll Y" +-- "LocalRoll" +-- "GlobalRoll" -- "Pan X" -- "Pan Y" -- Fourth parameter determines whether the axis should be inverted @@ -21,7 +19,8 @@ local joystickHelper = asset.require("./joystick_helper") -- The axis values can either go back to 0 when the joystick is released or it can -- stay at the value it was before the joystick was released. -- The latter is called a sticky axis, when the values don't go back to 0. --- Seventh parameter is the sensitivity for the axis +-- Seventh parameter can be used to reverse the camera movement for the axis +-- Eighth parameter is the sensitivity for the axis local XBoxController = { LeftThumbStick = { 0 , 1 }, diff --git a/data/assets/util/joysticks/xbox.asset b/data/assets/util/joysticks/xbox.asset index 03685efbfe..a75b8701c0 100644 --- a/data/assets/util/joysticks/xbox.asset +++ b/data/assets/util/joysticks/xbox.asset @@ -8,10 +8,8 @@ local joystickHelper = asset.require("./joystick_helper") -- "Zoom" -- both in and out -- "Zoom In" -- "Zoom Out" --- "LocalRoll X" --- "LocalRoll Y" --- "GlobalRoll X" --- "GlobalRoll Y" +-- "LocalRoll" +-- "GlobalRoll" -- "Pan X" -- "Pan Y" -- Fourth parameter determines whether the axis should be inverted @@ -21,7 +19,8 @@ local joystickHelper = asset.require("./joystick_helper") -- The axis values can either go back to 0 when the joystick is released or it can -- stay at the value it was before the joystick was released. -- The latter is called a sticky axis, when the values don't go back to 0. --- Seventh parameter is the sensitivity for the axis +-- Seventh parameter can be used to reverse the camera movement for the axis +-- Eighth parameter is the sensitivity for the axis local XBoxController = { LeftThumbStick = { 0 , 1 }, diff --git a/include/openspace/interaction/joystickcamerastates.h b/include/openspace/interaction/joystickcamerastates.h index 214ef79007..c3dcdd9ad9 100644 --- a/include/openspace/interaction/joystickcamerastates.h +++ b/include/openspace/interaction/joystickcamerastates.h @@ -44,10 +44,8 @@ public: ZoomIn, ZoomOut, Zoom, - LocalRollX, - LocalRollY, - GlobalRollX, - GlobalRollY, + LocalRoll, + GlobalRoll, PanX, PanY, Property @@ -60,11 +58,13 @@ public: BooleanType(AxisInvert); BooleanType(ButtonCommandRemote); + BooleanType(AxisFlip); struct AxisInformation { AxisType type = AxisType::None; AxisInvert invert = AxisInvert::No; JoystickType joystickType = JoystickType::JoystickLike; + AxisFlip flip = AxisFlip::No; // The axis values can either go back to 0 when the joystick is released or it can // stay at the value it was before the joystick was released. @@ -91,7 +91,8 @@ public: void setAxisMapping(std::string joystickName, int axis, AxisType mapping, AxisInvert shouldInvert = AxisInvert::No, JoystickType joystickType = JoystickType::JoystickLike, - bool isSticky = false, double sensitivity = 0.0 + bool isSticky = false, AxisFlip shouldFlip = AxisFlip::No, + double sensitivity = 0.0 ); void setAxisMappingProperty(std::string joystickName, int axis, @@ -168,10 +169,8 @@ inline std::string to_string( case T::ZoomIn: return "Zoom In"; case T::ZoomOut: return "Zoom Out"; case T::Zoom: return "Zoom In and Out"; - case T::LocalRollX: return "LocalRoll X"; - case T::LocalRollY: return "LocalRoll Y"; - case T::GlobalRollX: return "GlobalRoll X"; - case T::GlobalRollY: return "GlobalRoll Y"; + case T::LocalRoll: return "LocalRoll"; + case T::GlobalRoll: return "GlobalRoll"; case T::PanX: return "Pan X"; case T::PanY: return "Pan Y"; case T::Property: return "Property"; @@ -191,10 +190,8 @@ from_string(std::string_view string) if (string == "Zoom In") { return T::ZoomIn; } if (string == "Zoom Out") { return T::ZoomOut; } if (string == "Zoom") { return T::Zoom; } - if (string == "LocalRoll X") { return T::LocalRollX; } - if (string == "LocalRoll Y") { return T::LocalRollY; } - if (string == "GlobalRoll X") { return T::GlobalRollX; } - if (string == "GlobalRoll Y") { return T::GlobalRollY; } + if (string == "LocalRoll") { return T::LocalRoll; } + if (string == "GlobalRoll") { return T::GlobalRoll; } if (string == "Pan X") { return T::PanX; } if (string == "Pan Y") { return T::PanY; } if (string == "Property") { return T::Property; } diff --git a/include/openspace/navigation/navigationhandler.h b/include/openspace/navigation/navigationhandler.h index ea2fdfcb44..fff06f53e6 100644 --- a/include/openspace/navigation/navigationhandler.h +++ b/include/openspace/navigation/navigationhandler.h @@ -105,15 +105,16 @@ public: JoystickCameraStates::AxisInvert::No, JoystickCameraStates::JoystickType joystickType = JoystickCameraStates::JoystickType::JoystickLike, - bool isSticky = false, double sensitivity = 0.0 - ); + bool isSticky = false, + JoystickCameraStates::AxisFlip shouldFlip = JoystickCameraStates::AxisFlip::No, + double sensitivity = 0.0); void setJoystickAxisMappingProperty(std::string joystickName, int axis, std::string propertyUri, float min = 0.f, float max = 1.f, JoystickCameraStates::AxisInvert shouldInvert = - JoystickCameraStates::AxisInvert::No, bool isRemote = true - ); + JoystickCameraStates::AxisInvert::No, + bool isRemote = true); JoystickCameraStates::AxisInformation joystickAxisMapping( const std::string& joystickName, int axis) const; diff --git a/src/interaction/joystickcamerastates.cpp b/src/interaction/joystickcamerastates.cpp index 0ca0273b6a..b53d1c76aa 100644 --- a/src/interaction/joystickcamerastates.cpp +++ b/src/interaction/joystickcamerastates.cpp @@ -56,8 +56,8 @@ void JoystickCameraStates::updateStateFromInput( std::pair globalRotation = std::pair(false, glm::dvec2(0.0)); std::pair zoom = std::pair(false, 0.0); - std::pair localRoll = std::pair(false, glm::dvec2(0.0)); - std::pair globalRoll = std::pair(false, glm::dvec2(0.0)); + std::pair localRoll = std::pair(false, 0.0); + std::pair globalRoll = std::pair(false, 0.0); std::pair localRotation = std::pair(false, glm::dvec2(0.0)); for (const JoystickInputState& joystickInputState : joystickInputStates) { @@ -121,6 +121,10 @@ void JoystickCameraStates::updateStateFromInput( } } + if (t.flip) { + value = -value; + } + switch (t.type) { case AxisType::None: break; @@ -141,21 +145,13 @@ void JoystickCameraStates::updateStateFromInput( zoom.first = true; zoom.second -= value; break; - case AxisType::LocalRollX: + case AxisType::LocalRoll: localRoll.first = true; - localRoll.second.x += value; + localRoll.second+= value; break; - case AxisType::LocalRollY: - localRoll.first = true; - localRoll.second.y += value; - break; - case AxisType::GlobalRollX: + case AxisType::GlobalRoll: globalRoll.first = true; - globalRoll.second.x += value; - break; - case AxisType::GlobalRollY: - globalRoll.first = true; - globalRoll.second.y += value; + globalRoll.second += value; break; case AxisType::PanX: localRotation.first = true; @@ -216,14 +212,14 @@ void JoystickCameraStates::updateStateFromInput( } if (localRoll.first) { - _localRollState.velocity.set(localRoll.second, deltaTime); + _localRollState.velocity.set(glm::dvec2(localRoll.second), deltaTime); } else { _localRollState.velocity.decelerate(deltaTime); } if (globalRoll.first) { - _globalRollState.velocity.set(globalRoll.second, deltaTime); + _globalRollState.velocity.set(glm::dvec2(globalRoll.second), deltaTime); } else { _globalRollState.velocity.decelerate(deltaTime); @@ -242,6 +238,7 @@ void JoystickCameraStates::setAxisMapping(std::string joystickName, AxisInvert shouldInvert, JoystickType joystickType, bool isSticky, + AxisFlip shouldFlip, double sensitivity) { JoystickCameraState* joystickCameraState = findOrAddJoystickCameraState(joystickName); @@ -259,6 +256,7 @@ void JoystickCameraStates::setAxisMapping(std::string joystickName, joystickCameraState->axisMapping[axis].invert = shouldInvert; joystickCameraState->axisMapping[axis].joystickType = joystickType; joystickCameraState->axisMapping[axis].isSticky = isSticky; + joystickCameraState->axisMapping[axis].flip = shouldFlip; joystickCameraState->axisMapping[axis].sensitivity = sensitivity; joystickCameraState->prevAxisValues[axis] = diff --git a/src/navigation/navigationhandler.cpp b/src/navigation/navigationhandler.cpp index 4134e9ff47..966cd0ef6c 100644 --- a/src/navigation/navigationhandler.cpp +++ b/src/navigation/navigationhandler.cpp @@ -524,6 +524,7 @@ void NavigationHandler::setJoystickAxisMapping(std::string joystickName, int axi JoystickCameraStates::AxisInvert shouldInvert, JoystickCameraStates::JoystickType joystickType, bool isSticky, + JoystickCameraStates::AxisFlip shouldFlip, double sensitivity) { _orbitalNavigator.joystickStates().setAxisMapping( @@ -533,6 +534,7 @@ void NavigationHandler::setJoystickAxisMapping(std::string joystickName, int axi shouldInvert, joystickType, isSticky, + shouldFlip, sensitivity ); } diff --git a/src/navigation/navigationhandler_lua.inl b/src/navigation/navigationhandler_lua.inl index e9fa215803..b43f3d3582 100644 --- a/src/navigation/navigationhandler_lua.inl +++ b/src/navigation/navigationhandler_lua.inl @@ -167,14 +167,27 @@ namespace { * 'isInverted' is 'true', the axis value is inverted. 'joystickType' is if the joystick * behaves more like a joystick or a trigger, where the first is the default. If * 'isSticky' is 'true', the value is calculated relative to the previous value. If + * 'shouldFlip' is true, then the camera movement for the axis is reversed. If * 'sensitivity' is given then that value will affect the sensitivity of the axis together * with the global sensitivity. + * + * \param joystickName the name for the joystick or game controller that should be bound + * \param axis the axis of the joystick that should be bound + * \param axisType the type of movement that the axis should be mapped to + * \param shouldInvert if the joystick movement should be inverted or not + * \param joystickType what type of joystick or axis this is. Either + * "JoystickLike" or "TriggerLike". + * \param isSticky if true, the value is calculated relative to the previous value, + * if false the the value is used as is. + * \param shouldFlip reverses the movement of the camera that the joystick produces + * \param sensitivity sensitivity for this axis */ [[codegen::luawrap]] void bindJoystickAxis(std::string joystickName, int axis, std::string axisType, bool shouldInvert = false, std::string joystickType = "JoystickLike", bool isSticky = false, + bool shouldFlip = false, double sensitivity = 0.0) { using namespace openspace; @@ -186,6 +199,7 @@ namespace { JoystickCameraStates::AxisInvert(shouldInvert), ghoul::from_string(joystickType), isSticky, + JoystickCameraStates::AxisFlip(shouldFlip), sensitivity ); } @@ -197,6 +211,15 @@ namespace { * value is rescaled from [-1, 1] to [min, max], default is [0, 1]. If 'isInverted' is * 'true', the axis value is inverted. The last argument determines whether the property * change is going to be executed locally or remotely, where the latter is the default. + * + * \param joystickName the name for the joystick or game controller that should be bound + * \param axis the axis of the joystick that should be bound + * \param propertyUri the property that this joystick axis should modify + * \param min the minimum value that this axis can set for the property + * \param max the maximum value that this axis can set for the property + * \param shouldInvert if the joystick movement should be inverted or not + * \param isRemote if true, the property change will also be executed on connected nodes + * if false, the property change will only affect the master node */ [[codegen::luawrap]] void bindJoystickAxisProperty(std::string joystickName, int axis, std::string propertyUri, @@ -205,13 +228,14 @@ namespace { bool isRemote = true) { using namespace openspace; + using JoystickCameraStates = interaction::JoystickCameraStates; global::navigationHandler->setJoystickAxisMappingProperty( std::move(joystickName), axis, std::move(propertyUri), min, max, - interaction::JoystickCameraStates::AxisInvert(shouldInvert), + JoystickCameraStates::AxisInvert(shouldInvert), isRemote ); } @@ -226,7 +250,7 @@ namespace { * bool. */ [[codegen::luawrap]] -std::tuple +std::tuple joystickAxis(std::string joystickName, int axis) { using namespace openspace; @@ -239,6 +263,7 @@ joystickAxis(std::string joystickName, int axis) info.invert, ghoul::to_string(info.joystickType), info.isSticky, + info.flip, info.sensitivity, info.propertyUri, info.minValue,