Cleanup, crash fixes

This commit is contained in:
Garry Newman 2019-06-20 11:39:13 +01:00
parent fa48a1ce33
commit bddac0ccc9
6 changed files with 58 additions and 29 deletions

View File

@ -21,7 +21,8 @@ namespace Steamworks
{
Console.Write( $"Controller: {controller}" );
var state = controller.GetDigitalState( "fire" );
var dstate = controller.GetDigitalState( "fire" );
var astate = controller.GetAnalogState( "Move" );
}
}
}

View File

@ -26,14 +26,17 @@ namespace Steamworks
_GetActiveActionSetLayers = Marshal.GetDelegateForFunctionPointer<FGetActiveActionSetLayers>( Marshal.ReadIntPtr( VTable, 80) );
_GetDigitalActionHandle = Marshal.GetDelegateForFunctionPointer<FGetDigitalActionHandle>( Marshal.ReadIntPtr( VTable, 88) );
_GetDigitalActionData = Marshal.GetDelegateForFunctionPointer<FGetDigitalActionData>( Marshal.ReadIntPtr( VTable, 96) );
_GetDigitalActionData_Windows = Marshal.GetDelegateForFunctionPointer<FGetDigitalActionData_Windows>( Marshal.ReadIntPtr( VTable, 96) );
_GetDigitalActionOrigins = Marshal.GetDelegateForFunctionPointer<FGetDigitalActionOrigins>( Marshal.ReadIntPtr( VTable, 104) );
_GetAnalogActionHandle = Marshal.GetDelegateForFunctionPointer<FGetAnalogActionHandle>( Marshal.ReadIntPtr( VTable, 112) );
_GetAnalogActionData = Marshal.GetDelegateForFunctionPointer<FGetAnalogActionData>( Marshal.ReadIntPtr( VTable, 120) );
_GetAnalogActionData_Windows = Marshal.GetDelegateForFunctionPointer<FGetAnalogActionData_Windows>( Marshal.ReadIntPtr( VTable, 120) );
_GetAnalogActionOrigins = Marshal.GetDelegateForFunctionPointer<FGetAnalogActionOrigins>( Marshal.ReadIntPtr( VTable, 128) );
_GetGlyphForActionOrigin = Marshal.GetDelegateForFunctionPointer<FGetGlyphForActionOrigin>( Marshal.ReadIntPtr( VTable, 136) );
_GetStringForActionOrigin = Marshal.GetDelegateForFunctionPointer<FGetStringForActionOrigin>( Marshal.ReadIntPtr( VTable, 144) );
_StopAnalogActionMomentum = Marshal.GetDelegateForFunctionPointer<FStopAnalogActionMomentum>( Marshal.ReadIntPtr( VTable, 152) );
_GetMotionData = Marshal.GetDelegateForFunctionPointer<FGetMotionData>( Marshal.ReadIntPtr( VTable, 160) );
_GetMotionData_Windows = Marshal.GetDelegateForFunctionPointer<FGetMotionData_Windows>( Marshal.ReadIntPtr( VTable, 160) );
_TriggerVibration = Marshal.GetDelegateForFunctionPointer<FTriggerVibration>( Marshal.ReadIntPtr( VTable, 168) );
_SetLEDColor = Marshal.GetDelegateForFunctionPointer<FSetLEDColor>( Marshal.ReadIntPtr( VTable, 176) );
_TriggerHapticPulse = Marshal.GetDelegateForFunctionPointer<FTriggerHapticPulse>( Marshal.ReadIntPtr( VTable, 184) );
@ -64,14 +67,17 @@ namespace Steamworks
_GetActiveActionSetLayers = null;
_GetDigitalActionHandle = null;
_GetDigitalActionData = null;
_GetDigitalActionData_Windows = null;
_GetDigitalActionOrigins = null;
_GetAnalogActionHandle = null;
_GetAnalogActionData = null;
_GetAnalogActionData_Windows = null;
_GetAnalogActionOrigins = null;
_GetGlyphForActionOrigin = null;
_GetStringForActionOrigin = null;
_StopAnalogActionMomentum = null;
_GetMotionData = null;
_GetMotionData_Windows = null;
_TriggerVibration = null;
_SetLEDColor = null;
_TriggerHapticPulse = null;
@ -224,10 +230,20 @@ namespace Steamworks
[UnmanagedFunctionPointer( CallingConvention.ThisCall )]
private delegate DigitalState FGetDigitalActionData( IntPtr self, InputHandle_t inputHandle, InputDigitalActionHandle_t digitalActionHandle );
private FGetDigitalActionData _GetDigitalActionData;
[UnmanagedFunctionPointer( CallingConvention.ThisCall )]
private delegate void FGetDigitalActionData_Windows( IntPtr self, ref DigitalState retVal, InputHandle_t inputHandle, InputDigitalActionHandle_t digitalActionHandle );
private FGetDigitalActionData_Windows _GetDigitalActionData_Windows;
#endregion
internal DigitalState GetDigitalActionData( InputHandle_t inputHandle, InputDigitalActionHandle_t digitalActionHandle )
{
if ( Config.Os == OsType.Windows )
{
var retVal = default( DigitalState );
_GetDigitalActionData_Windows( Self, ref retVal, inputHandle, digitalActionHandle );
return retVal;
}
return _GetDigitalActionData( Self, inputHandle, digitalActionHandle );
}
@ -257,10 +273,20 @@ namespace Steamworks
[UnmanagedFunctionPointer( CallingConvention.ThisCall )]
private delegate AnalogState FGetAnalogActionData( IntPtr self, InputHandle_t inputHandle, InputAnalogActionHandle_t analogActionHandle );
private FGetAnalogActionData _GetAnalogActionData;
[UnmanagedFunctionPointer( CallingConvention.ThisCall )]
private delegate void FGetAnalogActionData_Windows( IntPtr self, ref AnalogState retVal, InputHandle_t inputHandle, InputAnalogActionHandle_t analogActionHandle );
private FGetAnalogActionData_Windows _GetAnalogActionData_Windows;
#endregion
internal AnalogState GetAnalogActionData( InputHandle_t inputHandle, InputAnalogActionHandle_t analogActionHandle )
{
if ( Config.Os == OsType.Windows )
{
var retVal = default( AnalogState );
_GetAnalogActionData_Windows( Self, ref retVal, inputHandle, analogActionHandle );
return retVal;
}
return _GetAnalogActionData( Self, inputHandle, analogActionHandle );
}
@ -312,10 +338,20 @@ namespace Steamworks
[UnmanagedFunctionPointer( CallingConvention.ThisCall )]
private delegate MotionState FGetMotionData( IntPtr self, InputHandle_t inputHandle );
private FGetMotionData _GetMotionData;
[UnmanagedFunctionPointer( CallingConvention.ThisCall )]
private delegate void FGetMotionData_Windows( IntPtr self, ref MotionState retVal, InputHandle_t inputHandle );
private FGetMotionData_Windows _GetMotionData_Windows;
#endregion
internal MotionState GetMotionData( InputHandle_t inputHandle )
{
if ( Config.Os == OsType.Windows )
{
var retVal = default( MotionState );
_GetMotionData_Windows( Self, ref retVal, inputHandle );
return retVal;
}
return _GetMotionData( Self, inputHandle );
}

View File

@ -86,13 +86,15 @@ namespace Steamworks
return val;
}
/// <summary>
/// Lookup the handle for an Action Set. Best to do this once on startup, and store the handles for all future API calls.
/// </summary>
public static ActionSet GetActionSet( string name )
internal static Dictionary<string, InputActionSetHandle_t> ActionSets = new Dictionary<string, InputActionSetHandle_t>();
internal static InputActionSetHandle_t GetActionSetHandle( string name )
{
return new ActionSet( Internal.GetActionSetHandle( name ) );
}
if ( ActionSets.TryGetValue( name, out var val ) )
return val;
val = Internal.GetActionSetHandle( name );
ActionSets.Add( name, val );
return val;
}
}
}

View File

@ -1,15 +0,0 @@
using Steamworks.Data;
using System.Collections.Generic;
namespace Steamworks
{
public struct ActionSet
{
internal InputActionSetHandle_t Handle;
internal ActionSet( InputActionSetHandle_t handle )
{
this.Handle = handle;
}
}
}

View File

@ -21,15 +21,14 @@ namespace Steamworks
/// This is cheap, and can be safely called repeatedly. It's often easier to repeatedly call it in
/// our state loops, instead of trying to place it in all of your state transitions.
/// </summary>
public ActionSet ActionSet
public string ActionSet
{
get => new ActionSet( SteamInput.Internal.GetCurrentActionSet( Handle ) );
set => SteamInput.Internal.ActivateActionSet( Handle, value.Handle );
set => SteamInput.Internal.ActivateActionSet( Handle, SteamInput.Internal.GetActionSetHandle( value ) );
}
public void DeactivateLayer( ActionSet layer ) => SteamInput.Internal.DeactivateActionSetLayer( Handle, layer.Handle );
public void ActivateLayer( ActionSet layer ) => SteamInput.Internal.ActivateActionSetLayer( Handle, layer.Handle );
public void ClearLayers( ActionSet layer ) => SteamInput.Internal.DeactivateAllActionSetLayers( Handle );
public void DeactivateLayer( string layer ) => SteamInput.Internal.DeactivateActionSetLayer( Handle, SteamInput.Internal.GetActionSetHandle( layer ) );
public void ActivateLayer( string layer ) => SteamInput.Internal.ActivateActionSetLayer( Handle, SteamInput.Internal.GetActionSetHandle( layer ) );
public void ClearLayers() => SteamInput.Internal.DeactivateAllActionSetLayers( Handle );
/// <summary>
@ -87,7 +86,9 @@ namespace Steamworks
[StructLayout( LayoutKind.Sequential, Pack = 1 )]
public struct DigitalState
{
[MarshalAs( UnmanagedType.I1 )]
internal byte BState; // bState byte
[MarshalAs( UnmanagedType.I1 )]
internal byte BActive; // bActive byte
public bool Pressed => BState != 0;

View File

@ -57,6 +57,9 @@ internal class BaseType
if ( basicType == "NetIdentity" ) return new StructType { NativeType = type, VarName = varname, StructName = basicType };
if ( basicType == "NetAddress" ) return new StructType { NativeType = type, VarName = varname, StructName = basicType };
if ( basicType == "ConnectionInfo" ) return new StructType { NativeType = type, VarName = varname, StructName = basicType };
if ( basicType == "DigitalState" ) return new StructType { NativeType = type, VarName = varname, StructName = basicType };
if ( basicType == "AnalogState" ) return new StructType { NativeType = type, VarName = varname, StructName = basicType };
if ( basicType == "MotionState" ) return new StructType { NativeType = type, VarName = varname, StructName = basicType };
if ( basicType.StartsWith( "E" ) && char.IsUpper( basicType[1] ) ) return new EnumType { NativeType = type.Substring( 1 ), VarName = varname };
return new BaseType { NativeType = type, VarName = varname };
@ -164,9 +167,10 @@ internal class StructType : BaseType
{
"DigitalState",
"AnalogState",
"MotionState",
};
public override bool IsReturnedWeird => SpecialTypes.Contains( TypeName );
public override bool IsReturnedWeird => SpecialTypes.Contains( StructName );
}
internal class SteamApiCallType : BaseType