diff --git a/AxisConfiguration.cs b/AxisConfiguration.cs index af246ff..b57244a 100644 --- a/AxisConfiguration.cs +++ b/AxisConfiguration.cs @@ -14,7 +14,6 @@ public struct AxisConfiguration public float m_Left; public float m_Identity; public float m_Right; - public bool m_Invert; public float Rescale(float value, Curve analogEvaluationCurve, bool manualDeadZones) { @@ -80,7 +79,7 @@ public float Rescale(float value, Curve analogEvaluationCurve, bool manualDeadZo value = Mathf.Clamp(value, -1.0f, 0.0f); } - return (m_Invert ? -1.0f : 1.0f) * Math.Sign(value) * analogEvaluationCurve.Evaluate(Math.Abs(value)); + return 1.0f * Math.Sign(value) * analogEvaluationCurve.Evaluate(Math.Abs(value)); } } diff --git a/ControllerConfigurationWindow.cs b/ControllerConfigurationWindow.cs index f8db957..c87f734 100644 --- a/ControllerConfigurationWindow.cs +++ b/ControllerConfigurationWindow.cs @@ -201,9 +201,6 @@ public void DoWindow(int window) GUILayout.HorizontalSlider(value, -1.0f, 1.0f, GUILayout.Width(150)); GUI.enabled = true; - GUILayout.Label("Invert"); - m_Controller.iface.axisStates[i].m_Invert = GUILayout.Toggle(m_Controller.iface.axisStates[i].m_Invert, ""); - GUILayout.EndHorizontal(); if (m_ShowOptions) diff --git a/ControllerPreset.cs b/ControllerPreset.cs index 62a53fc..87d9335 100644 --- a/ControllerPreset.cs +++ b/ControllerPreset.cs @@ -9,9 +9,11 @@ namespace KSPAdvancedFlyByWire using DiscreteActionsMap = Dictionary; using ContinuousActionsMap = Dictionary>; + using ContinuousActionsInversionMap = Dictionary; using SerializableDiscreteActionsMap = List>; using SerializableContinuousActionsMap = List>>; + using SerializableContinuousActionsInvMap = List>; public enum DiscreteAction { @@ -100,20 +102,14 @@ public enum ContinuousAction { None, Yaw, - NegativeYaw, YawTrim, Pitch, - NegativePitch, PitchTrim, Roll, - NegativeRoll, RollTrim, X, - NegativeX, Y, - NegativeY, Z, - NegativeZ, Throttle, ThrottleIncrement, ThrottleDecrement, @@ -135,12 +131,14 @@ public class ControllerPreset [XmlIgnore()] public DiscreteActionsMap discreteActionsMap = new DiscreteActionsMap(); - [XmlIgnore()] public ContinuousActionsMap continuousActionsMap = new ContinuousActionsMap(); + [XmlIgnore()] + public ContinuousActionsInversionMap continuousActionsInvMap = new ContinuousActionsInversionMap(); public SerializableDiscreteActionsMap serializableDiscreteActionMap = new SerializableDiscreteActionsMap(); public SerializableContinuousActionsMap serialiazableContinuousActionMap = new SerializableContinuousActionsMap(); + public SerializableContinuousActionsInvMap serializableContinuousActionInvMap = new SerializableContinuousActionsInvMap(); public void OnPreSerialize() { @@ -150,6 +148,12 @@ public void OnPreSerialize() serialiazableContinuousActionMap.Add(keyValue); } + serializableContinuousActionInvMap.Clear(); + foreach (var keyValue in continuousActionsInvMap) + { + serializableContinuousActionInvMap.Add(keyValue); + } + serializableDiscreteActionMap.Clear(); foreach(var keyValue in discreteActionsMap) { @@ -165,6 +169,12 @@ public void OnPostDeserialize() continuousActionsMap.Add(keyValue.Key, keyValue.Value); } + continuousActionsInvMap.Clear(); + foreach (var keyValue in serializableContinuousActionInvMap) + { + continuousActionsInvMap.Add(keyValue.Key, keyValue.Value); + } + discreteActionsMap.Clear(); foreach(var keyValue in serializableDiscreteActionMap) { @@ -266,14 +276,21 @@ public Bitset GetBitsetForDiscreteBinding(DiscreteAction action) return discreteActionsMap[action]; } - public void SetContinuousBinding(int axis, Bitset state, ContinuousAction action) + public void SetContinuousBinding(int axis, Bitset state, ContinuousAction action, bool isInverted) { + //Debug.Log("SetContBind: " + action.ToString() + " to axis " + axis + " and bitset " + state.ToString()); continuousActionsMap[action] = new KeyValuePair(state, axis); + if (isInverted) + { + continuousActionsInvMap[action] = true; + } + //TODO: Remove from map if false and containsKey? Saves a little space when serializing. } public void UnsetContinuousBinding(ContinuousAction action) { continuousActionsMap.Remove(action); + continuousActionsInvMap.Remove(action); } public List GetContinuousBinding(int axis, Bitset state) @@ -355,6 +372,16 @@ public KeyValuePair GetBitsetForContinuousBinding(ContinuousAction return new KeyValuePair(continuousActionsMap[action].Value, continuousActionsMap[action].Key); } + public bool IsContinuousBindingInverted(ContinuousAction action) + { + return continuousActionsInvMap.ContainsKey(action) ? continuousActionsInvMap[action] : false; + } + + public void SetContinuousBindingInverted(ContinuousAction action, bool isInverted) + { + continuousActionsInvMap[action] = isInverted; + } + private static int CompareKeys(KeyValuePair a, KeyValuePair b) { return b.Key.CompareTo(a.Key); diff --git a/DefaultControllerPresets.cs b/DefaultControllerPresets.cs index e5bdc27..355c4b7 100644 --- a/DefaultControllerPresets.cs +++ b/DefaultControllerPresets.cs @@ -47,20 +47,20 @@ public static ControllerPreset GetXInputDefaultRocketPreset(IController controll preset.SetDiscreteBinding(new Bitset(buttonsCount, (int)XInput.Button.Guide), DiscreteAction.OrbitMapToggle); - preset.SetContinuousBinding((int)XInput.AnalogInput.LeftStickX, new Bitset(buttonsCount), ContinuousAction.CameraX); - preset.SetContinuousBinding((int)XInput.AnalogInput.LeftStickY, new Bitset(buttonsCount), ContinuousAction.CameraY); - preset.SetContinuousBinding((int)XInput.AnalogInput.LeftStickY, new Bitset(buttonsCount, (int)XInput.Button.LB), ContinuousAction.CameraZoom); + preset.SetContinuousBinding((int)XInput.AnalogInput.LeftStickX, new Bitset(buttonsCount), ContinuousAction.CameraX, false); + preset.SetContinuousBinding((int)XInput.AnalogInput.LeftStickY, new Bitset(buttonsCount), ContinuousAction.CameraY, false); + preset.SetContinuousBinding((int)XInput.AnalogInput.LeftStickY, new Bitset(buttonsCount, (int)XInput.Button.LB), ContinuousAction.CameraZoom, false); - preset.SetContinuousBinding((int)XInput.AnalogInput.RightStickX, new Bitset(buttonsCount), ContinuousAction.Yaw); - preset.SetContinuousBinding((int)XInput.AnalogInput.RightStickY, new Bitset(buttonsCount), ContinuousAction.Pitch); - preset.SetContinuousBinding((int)XInput.AnalogInput.RightStickX, new Bitset(buttonsCount, (int)XInput.Button.LB), ContinuousAction.Roll); + preset.SetContinuousBinding((int)XInput.AnalogInput.RightStickX, new Bitset(buttonsCount), ContinuousAction.Yaw, false); + preset.SetContinuousBinding((int)XInput.AnalogInput.RightStickY, new Bitset(buttonsCount), ContinuousAction.Pitch, false); + preset.SetContinuousBinding((int)XInput.AnalogInput.RightStickX, new Bitset(buttonsCount, (int)XInput.Button.LB), ContinuousAction.Roll, false); - preset.SetContinuousBinding((int)XInput.AnalogInput.RightStickX, new Bitset(buttonsCount, (int)XInput.Button.RB), ContinuousAction.X); - preset.SetContinuousBinding((int)XInput.AnalogInput.RightStickY, new Bitset(buttonsCount, (int)XInput.Button.RB), ContinuousAction.Y); - preset.SetContinuousBinding((int)XInput.AnalogInput.RightStickX, new Bitset(buttonsCount, (int)XInput.Button.LB | (int)XInput.Button.RB), ContinuousAction.Z); + preset.SetContinuousBinding((int)XInput.AnalogInput.RightStickX, new Bitset(buttonsCount, (int)XInput.Button.RB), ContinuousAction.X, false); + preset.SetContinuousBinding((int)XInput.AnalogInput.RightStickY, new Bitset(buttonsCount, (int)XInput.Button.RB), ContinuousAction.Y, false); + preset.SetContinuousBinding((int)XInput.AnalogInput.RightStickX, new Bitset(buttonsCount, (int)XInput.Button.LB | (int)XInput.Button.RB), ContinuousAction.Z, false); - preset.SetContinuousBinding((int)XInput.AnalogInput.LeftTrigger, new Bitset(buttonsCount), ContinuousAction.ThrottleDecrement); - preset.SetContinuousBinding((int)XInput.AnalogInput.RightTrigger, new Bitset(buttonsCount), ContinuousAction.ThrottleIncrement); + preset.SetContinuousBinding((int)XInput.AnalogInput.LeftTrigger, new Bitset(buttonsCount), ContinuousAction.ThrottleDecrement, false); + preset.SetContinuousBinding((int)XInput.AnalogInput.RightTrigger, new Bitset(buttonsCount), ContinuousAction.ThrottleIncrement, false); #endif diff --git a/FlightManager.cs b/FlightManager.cs index fb94a15..f3ce897 100644 --- a/FlightManager.cs +++ b/FlightManager.cs @@ -65,12 +65,15 @@ private void UpdateAxes(ControllerConfiguration config, FlightCtrlState state) continue; } - var axisState = config.iface.GetAxisState(i); + float axisState = config.iface.GetAxisState(i); foreach (var action in actions) { - float input = config.iface.GetAxisState(i); - if (input != 0.0f || action == ContinuousAction.Throttle || action == ContinuousAction.WheelThrottle) + if (config.GetCurrentPreset().IsContinuousBindingInverted(action)) + { + axisState *= -1.0f; + } + if (axisState != 0.0f || action == ContinuousAction.Throttle || action == ContinuousAction.WheelThrottle) { EvaluateContinuousAction(config, action, axisState, state); } @@ -509,48 +512,30 @@ public void EvaluateContinuousAction(ControllerConfiguration controller, Continu case ContinuousAction.Yaw: m_Yaw.SetValue(value); return; - case ContinuousAction.NegativeYaw: - m_Yaw.SetValue(-value); - return; case ContinuousAction.YawTrim: m_Yaw.SetTrim(Utility.Clamp(m_Yaw.GetTrim() + value, -1.0f, 1.0f)); return; case ContinuousAction.Pitch: m_Pitch.SetValue(value); return; - case ContinuousAction.NegativePitch: - m_Pitch.SetValue(-value); - return; case ContinuousAction.PitchTrim: m_Pitch.SetTrim(Utility.Clamp(m_Pitch.GetTrim() + value, -1.0f, 1.0f)); return; case ContinuousAction.Roll: m_Roll.SetValue(value); return; - case ContinuousAction.NegativeRoll: - m_Roll.SetValue(-value); - return; case ContinuousAction.RollTrim: m_Roll.SetTrim(Utility.Clamp(m_Roll.GetTrim() + value, -1.0f, 1.0f)); return; case ContinuousAction.X: m_X.SetValue(value); return; - case ContinuousAction.NegativeX: - m_X.SetValue(-value); - return; case ContinuousAction.Y: m_Y.SetValue(value); return; - case ContinuousAction.NegativeY: - m_Y.SetValue(-value); - return; case ContinuousAction.Z: m_Z.SetValue(value); return; - case ContinuousAction.NegativeZ: - m_Z.SetValue(-value); - return; case ContinuousAction.Throttle: m_Throttle.SetMinMaxValues(-state.mainThrottle, 1.0f - state.mainThrottle); m_Throttle.SetValue(value - state.mainThrottle); diff --git a/PresetEditorWindow.cs b/PresetEditorWindow.cs index 9c06c60..6fef445 100644 --- a/PresetEditorWindow.cs +++ b/PresetEditorWindow.cs @@ -157,7 +157,9 @@ public virtual void DoWindow(int window) } GUILayout.BeginHorizontal(); - GUILayout.Label(Stringify.ContinuousActionToString(action)); + String continuousActionStr = Stringify.ContinuousActionToString(action); + if (currentPreset.IsContinuousBindingInverted(action)) continuousActionStr += " (Inverted)"; + GUILayout.Label(continuousActionStr); GUILayout.FlexibleSpace(); string label = ""; @@ -173,7 +175,7 @@ public virtual void DoWindow(int window) { if (Math.Abs(m_Controller.iface.GetAxisState(i) - axisSnapshot[i]) > 0.1 && m_ClickSleepTimer == 0.0f) { - currentPreset.SetContinuousBinding(i, buttonsMask, action); + currentPreset.SetContinuousBinding(i, buttonsMask, action, false); m_CurrentlyEditingContinuousAction = ContinuousAction.None; } } @@ -209,6 +211,10 @@ public virtual void DoWindow(int window) m_CurrentMask = null; } + GUILayout.Label("Invert"); + var inverted = GUILayout.Toggle(currentPreset.IsContinuousBindingInverted(action), ""); + currentPreset.SetContinuousBindingInverted(action, inverted); + if (GUILayout.Button("X")) { currentPreset.UnsetContinuousBinding(action); diff --git a/PresetEditorWindowNG.cs b/PresetEditorWindowNG.cs index b58f2c4..733b516 100644 --- a/PresetEditorWindowNG.cs +++ b/PresetEditorWindowNG.cs @@ -54,7 +54,7 @@ public void DoPressDesiredCombinationWindow(int index) { if (Math.Abs(m_Controller.iface.GetAxisState(i) - axisSnapshot[i]) > 0.1 && m_ClickSleepTimer == 0.0f) { - currentPreset.SetContinuousBinding(i, buttonsMask, m_CurrentlyEditingContinuousAction); + currentPreset.SetContinuousBinding(i, buttonsMask, m_CurrentlyEditingContinuousAction, false); m_CurrentlyEditingContinuousAction = ContinuousAction.None; } } @@ -322,7 +322,9 @@ public override void DoWindow(int window) } GUILayout.BeginHorizontal(); - GUILayout.Label(Stringify.ContinuousActionToString(action)); + String continuousActionStr = Stringify.ContinuousActionToString(action); + if (currentPreset.IsContinuousBindingInverted(action)) continuousActionStr += " (Inverted)"; + GUILayout.Label(continuousActionStr); GUILayout.FlexibleSpace(); string label = ""; @@ -336,7 +338,7 @@ public override void DoWindow(int window) { if (Math.Abs(m_Controller.iface.GetAxisState(i) - axisSnapshot[i]) > 0.1 && m_ClickSleepTimer == 0.0f) { - currentPreset.SetContinuousBinding(i, buttonsMask, action); + currentPreset.SetContinuousBinding(i, buttonsMask, action, false); m_CurrentlyEditingContinuousAction = ContinuousAction.None; } } @@ -372,6 +374,10 @@ public override void DoWindow(int window) m_CurrentMask = null; } + GUILayout.Label("Invert"); + var inverted = GUILayout.Toggle(currentPreset.IsContinuousBindingInverted(action), ""); + currentPreset.SetContinuousBindingInverted(action, inverted); + if (GUILayout.Button("X")) { currentPreset.UnsetContinuousBinding(action); diff --git a/Stringify.cs b/Stringify.cs index e1d1216..0ca21cb 100644 --- a/Stringify.cs +++ b/Stringify.cs @@ -151,34 +151,22 @@ public static string ContinuousActionToString(ContinuousAction action) return "None"; case ContinuousAction.Yaw: return "Yaw"; - case ContinuousAction.NegativeYaw: - return "Yaw (Negative)"; case ContinuousAction.YawTrim: return "Yaw (Trim)"; case ContinuousAction.Pitch: return "Pitch"; - case ContinuousAction.NegativePitch: - return "Pitch (Negative)"; case ContinuousAction.PitchTrim: return "Pitch (Trim)"; case ContinuousAction.Roll: return "Roll"; - case ContinuousAction.NegativeRoll: - return "Roll (Negative)"; case ContinuousAction.RollTrim: return "Roll (Trim)"; case ContinuousAction.X: return "Transl. X"; - case ContinuousAction.NegativeX: - return "Transl. X (Negative)"; case ContinuousAction.Y: return "Transl. Y"; - case ContinuousAction.NegativeY: - return "Transl. Y (Negative)"; case ContinuousAction.Z: return "Transl. Z"; - case ContinuousAction.NegativeZ: - return "Transl. Z (Negative)"; case ContinuousAction.Throttle: return "Throttle"; case ContinuousAction.ThrottleIncrement: