using System;
using Steamworks.Data;
using System.Collections.Generic;
namespace Steamworks
{
///
/// Class for utilizing Steam Input.
///
public class SteamInput : SteamClientClass
{
internal static ISteamInput? Internal => Interface as ISteamInput;
internal override bool InitializeInterface( bool server )
{
SetInterface( server, new ISteamInput( server ) );
if ( Interface is null || Interface.Self == IntPtr.Zero ) return false;
return true;
}
internal const int STEAM_CONTROLLER_MAX_COUNT = 16;
///
/// You shouldn't really need to call this because it gets called by
/// but Valve think it might be a nice idea if you call it right before you get input info -
/// just to make sure the info you're getting is 100% up to date.
///
public static void RunFrame()
{
Internal?.RunFrame( false );
}
static readonly InputHandle_t[] queryArray = new InputHandle_t[STEAM_CONTROLLER_MAX_COUNT];
///
/// Gets a list of connected controllers.
///
public static IEnumerable Controllers
{
get
{
var num = Internal?.GetConnectedControllers( queryArray ) ?? 0;
for ( int i = 0; i < num; i++ )
{
yield return new Controller( queryArray[i] );
}
}
}
///
/// Return an absolute path to the PNG image glyph for the provided digital action name. The current
/// action set in use for the controller will be used for the lookup. You should cache the result and
/// maintain your own list of loaded PNG assets.
///
///
///
///
public static string? GetDigitalActionGlyph( Controller controller, string action )
{
if (Internal is null) { return null; }
InputActionOrigin origin = InputActionOrigin.None;
Internal.GetDigitalActionOrigins(
controller.Handle,
Internal.GetCurrentActionSet(controller.Handle),
GetDigitalActionHandle(action),
ref origin
);
return Internal.GetGlyphForActionOrigin_Legacy(origin);
}
///
/// Return an absolute path to the PNG image glyph for the provided digital action name. The current
/// action set in use for the controller will be used for the lookup. You should cache the result and
/// maintain your own list of loaded PNG assets.
///
public static string? GetPngActionGlyph( Controller controller, string action, GlyphSize size )
{
if ( Internal is null ) { return null; }
InputActionOrigin origin = InputActionOrigin.None;
Internal.GetDigitalActionOrigins( controller.Handle, Internal.GetCurrentActionSet( controller.Handle ), GetDigitalActionHandle( action ), ref origin );
return Internal.GetGlyphPNGForActionOrigin( origin, size, 0 );
}
///
/// Return an absolute path to the SVF image glyph for the provided digital action name. The current
/// action set in use for the controller will be used for the lookup. You should cache the result and
/// maintain your own list of loaded PNG assets.
///
public static string? GetSvgActionGlyph( Controller controller, string action )
{
if ( Internal is null ) { return null; }
InputActionOrigin origin = InputActionOrigin.None;
Internal.GetDigitalActionOrigins( controller.Handle, Internal.GetCurrentActionSet( controller.Handle ), GetDigitalActionHandle( action ), ref origin );
return Internal.GetGlyphSVGForActionOrigin( origin, 0 );
}
internal static Dictionary DigitalHandles = new Dictionary();
internal static InputDigitalActionHandle_t GetDigitalActionHandle( string name )
{
if (Internal is null) { return default; }
if ( DigitalHandles.TryGetValue( name, out var val ) )
return val;
val = Internal.GetDigitalActionHandle( name );
DigitalHandles.Add( name, val );
return val;
}
internal static Dictionary AnalogHandles = new Dictionary();
internal static InputAnalogActionHandle_t GetAnalogActionHandle( string name )
{
if (Internal is null) { return default; }
if ( AnalogHandles.TryGetValue( name, out var val ) )
return val;
val = Internal.GetAnalogActionHandle( name );
AnalogHandles.Add( name, val );
return val;
}
internal static Dictionary ActionSets = new Dictionary();
internal static InputActionSetHandle_t GetActionSetHandle( string name )
{
if (Internal is null) { return default; }
if ( ActionSets.TryGetValue( name, out var val ) )
return val;
val = Internal.GetActionSetHandle( name );
ActionSets.Add( name, val );
return val;
}
}
}