Skip to content

Commit

Permalink
Implemented per-binding axis inversion
Browse files Browse the repository at this point in the history
Removed the m_Invert flag on AxisConfiguration and all XNegative
ContinuousActions
  • Loading branch information
ddfreiling committed Dec 16, 2014
1 parent 044cc09 commit 49fa0be
Show file tree
Hide file tree
Showing 8 changed files with 70 additions and 62 deletions.
3 changes: 1 addition & 2 deletions AxisConfiguration.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down Expand Up @@ -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));
}

}
Expand Down
3 changes: 0 additions & 3 deletions ControllerConfigurationWindow.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
43 changes: 35 additions & 8 deletions ControllerPreset.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,11 @@ namespace KSPAdvancedFlyByWire

using DiscreteActionsMap = Dictionary<DiscreteAction, Bitset>;
using ContinuousActionsMap = Dictionary<ContinuousAction, KeyValuePair<Bitset, int>>;
using ContinuousActionsInversionMap = Dictionary<ContinuousAction, bool>;

using SerializableDiscreteActionsMap = List<KeyValuePair<DiscreteAction, Bitset>>;
using SerializableContinuousActionsMap = List<KeyValuePair<ContinuousAction, KeyValuePair<Bitset, int>>>;
using SerializableContinuousActionsInvMap = List<KeyValuePair<ContinuousAction, bool>>;

public enum DiscreteAction
{
Expand Down Expand Up @@ -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,
Expand All @@ -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()
{
Expand All @@ -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)
{
Expand All @@ -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)
{
Expand Down Expand Up @@ -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<Bitset, int>(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<ContinuousAction> GetContinuousBinding(int axis, Bitset state)
Expand Down Expand Up @@ -355,6 +372,16 @@ public KeyValuePair<int, Bitset> GetBitsetForContinuousBinding(ContinuousAction
return new KeyValuePair<int,Bitset>(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<int, ContinuousAction> a, KeyValuePair<int, ContinuousAction> b)
{
return b.Key.CompareTo(a.Key);
Expand Down
22 changes: 11 additions & 11 deletions DefaultControllerPresets.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
27 changes: 6 additions & 21 deletions FlightManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down Expand Up @@ -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);
Expand Down
10 changes: 8 additions & 2 deletions PresetEditorWindow.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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 = "";
Expand All @@ -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;
}
}
Expand Down Expand Up @@ -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);
Expand Down
12 changes: 9 additions & 3 deletions PresetEditorWindowNG.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}
Expand Down Expand Up @@ -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 = "";
Expand All @@ -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;
}
}
Expand Down Expand Up @@ -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);
Expand Down
12 changes: 0 additions & 12 deletions Stringify.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down

0 comments on commit 49fa0be

Please sign in to comment.