Files
FC1/CryCommon/IInput.h
romkazvo 34d6c5d489 123
2023-08-07 19:29:24 +08:00

912 lines
25 KiB
C++

#ifndef _IINPUT_H_
#define _IINPUT_H_
#ifdef WIN32
#ifdef CRYINPUT_EXPORTS
#define CRYINPUT_API __declspec(dllexport)
#else
#define CRYINPUT_API __declspec(dllimport)
#endif
#else
#define CRYINPUT_API
#endif
#ifndef KEYS_DEF
#define KEYS_DEF
#include "platform.h"
#include "Cry_Math.h"
#include <vector>
////////////////////////////////////////////////////////////////////////////////////////////////
//! Keys' code names
////////////////////////////////////////////////////////////////////////////////////////////////
//#ifndef _XBOX
#define IS_NULL_KEY(key) ((key)==XKEY_NULL)
#define IS_MOUSE_KEY(key) ((key)&0x00FF0000)
#define IS_JOYPAD_KEY(key) ((key)&0xFF000000)
#define IS_GAMEPAD_KEY(key) ((key)&0xFF000000)
#define IS_KEYBOARD_KEY(key) ((key)&0x0000FFFF)
//////////////////////////////////////////////////////////////////////////
enum EKeyModifiersFlags
{
XKEY_MOD_NONE = 0,
XKEY_MOD_LCONTROL = 0x01,
XKEY_MOD_RCONTROL = 0x02,
XKEY_MOD_LALT = 0x04,
XKEY_MOD_RALT = 0x08,
XKEY_MOD_LSHIFT = 0x010,
XKEY_MOD_RSHIFT = 0x020,
XKEY_MOD_CAPSLOCK = 0x040,
XKEY_MOD_NUMLOCK = 0x080,
XKEY_MOD_CONTROL = (0x01 | 0x02),
XKEY_MOD_ALT = (0x04 | 0x08),
XKEY_MOD_SHIFT = (0x010 | 0x020),
};
//JOYPAD MOUSE KEYBOARD
// 00 00 0000
enum KeyCodes {
XKEY_NULL = 0x00000000, //forbidden
XKEY_BACKSPACE = 0x00000001,
XKEY_TAB = 0x00000002,
XKEY_RETURN = 0x00000003,
XKEY_CONTROL = 0x00000004,
XKEY_ALT = 0x00000005,
XKEY_SHIFT = 0x00000006,
XKEY_PAUSE = 0x00000007,
XKEY_CAPSLOCK = 0x00000008,
XKEY_ESCAPE = 0x00000009,
XKEY_SPACE = 0x0000000a,
XKEY_PAGE_DOWN = 0x0000000b,
XKEY_PAGE_UP = 0x0000000c,
XKEY_END = 0x0000000d,
XKEY_HOME = 0x0000000e,
XKEY_LEFT = 0x0000000f,
XKEY_UP = 0x00000010,
XKEY_RIGHT = 0x00000011,
XKEY_DOWN = 0x00000012,
XKEY_PRINT = 0x00000013,
XKEY_INSERT = 0x00000014,
XKEY_DELETE = 0x00000015,
XKEY_HELP = 0x00000016,
XKEY_0 = 0x00000017,
XKEY_1 = 0x00000018,
XKEY_2 = 0x00000019,
XKEY_3 = 0x0000001a,
XKEY_4 = 0x0000001b,
XKEY_5 = 0x0000001c,
XKEY_6 = 0x0000001d,
XKEY_7 = 0x0000001e,
XKEY_8 = 0x0000001f,
XKEY_9 = 0x00000020,
XKEY_A = 0x00000021,
XKEY_B = 0x00000022,
XKEY_C = 0x00000023,
XKEY_D = 0x00000024,
XKEY_E = 0x00000025,
XKEY_F = 0x00000026,
XKEY_G = 0x00000027,
XKEY_H = 0x00000028,
XKEY_I = 0x00000029,
XKEY_J = 0x0000002a,
XKEY_K = 0x0000002b,
XKEY_L = 0x0000002c,
XKEY_M = 0x0000002d,
XKEY_N = 0x0000002e,
XKEY_O = 0x0000002f,
XKEY_P = 0x00000030,
XKEY_Q = 0x00000031,
XKEY_R = 0x00000032,
XKEY_S = 0x00000033,
XKEY_T = 0x00000034,
XKEY_U = 0x00000035,
XKEY_V = 0x00000036,
XKEY_W = 0x00000037,
XKEY_X = 0x00000038,
XKEY_Y = 0x00000039,
XKEY_Z = 0x0000003a,
XKEY_TILDE = 0x0000003b,
XKEY_MINUS = 0x0000003c,
XKEY_EQUALS = 0x0000003d,
XKEY_LBRACKET = 0x0000003e,
XKEY_RBRACKET = 0x0000003f,
XKEY_BACKSLASH = 0x00000040,
XKEY_SEMICOLON = 0x00000041,
XKEY_APOSTROPHE = 0x00000042,
XKEY_COMMA = 0x00000043,
XKEY_PERIOD = 0x00000044,
XKEY_SLASH = 0x00000045,
XKEY_NUMPAD0 = 0x00000046,
XKEY_NUMPAD1 = 0x00000047,
XKEY_NUMPAD2 = 0x00000048,
XKEY_NUMPAD3 = 0x00000049,
XKEY_NUMPAD4 = 0x0000004a,
XKEY_NUMPAD5 = 0x0000004b,
XKEY_NUMPAD6 = 0x0000004c,
XKEY_NUMPAD7 = 0x0000004d,
XKEY_NUMPAD8 = 0x0000004e,
XKEY_NUMPAD9 = 0x0000004f,
XKEY_MULTIPLY = 0x00000050,
XKEY_ADD = 0x00000051,
XKEY_SEPARATOR = 0x00000052,
XKEY_SUBTRACT = 0x00000053,
XKEY_DECIMAL = 0x00000054,
XKEY_DIVIDE = 0x00000055,
XKEY_NUMPADENTER = 0x00000056,
XKEY_F1 = 0x00000057,
XKEY_F2 = 0x00000058,
XKEY_F3 = 0x00000059,
XKEY_F4 = 0x0000005a,
XKEY_F5 = 0x0000005b,
XKEY_F6 = 0x0000005c,
XKEY_F7 = 0x0000005d,
XKEY_F8 = 0x0000005e,
XKEY_F9 = 0x0000005f,
XKEY_F10 = 0x00000060,
XKEY_F11 = 0x00000061,
XKEY_F12 = 0x00000062,
XKEY_F13 = 0x00000063,
XKEY_F14 = 0x00000064,
XKEY_F15 = 0x00000065,
XKEY_F16 = 0x00000066,
XKEY_F17 = 0x00000067,
XKEY_F18 = 0x00000068,
XKEY_F19 = 0x00000069,
XKEY_F20 = 0x0000006a,
XKEY_F21 = 0x0000006b,
XKEY_F22 = 0x0000006c,
XKEY_F23 = 0x0000006d,
XKEY_F24 = 0x0000006e,
XKEY_NUMLOCK = 0x0000006f,
XKEY_SCROLLLOCK = 0x00000070,
XKEY_LCONTROL = 0x00000071,
XKEY_RCONTROL = 0x00000072,
XKEY_LALT = 0x00000073,
XKEY_RALT = 0x00000074,
XKEY_LSHIFT = 0x00000075,
XKEY_RSHIFT = 0x00000076,
XKEY_WIN_LWINDOW = 0x00000077,
XKEY_WIN_RWINDOW = 0x00000078,
XKEY_WIN_APPS = 0x00000079,
XKEY_OEM_102 = 0x00000080,
XKEY_BUTTON0 = 0x00000100,
XKEY_BUTTON1 = 0x00000101,
XKEY_BUTTON2 = 0x00000102,
XKEY_BUTTON3 = 0x00000103,
XKEY_BUTTON4 = 0x00000104,
XKEY_BUTTON5 = 0x00000105,
XKEY_BUTTON6 = 0x00000106,
XKEY_BUTTON7 = 0x00000107,
XKEY_BUTTON8 = 0x00000108,
XKEY_BUTTON9 = 0x00000109,
XKEY_BUTTON10 = 0x0000010A,
XKEY_BUTTON11 = 0x0000010B,
XKEY_BUTTON12 = 0x0000010C,
XKEY_BUTTON13 = 0x0000010D,
XKEY_BUTTON14 = 0x0000010E,
XKEY_BUTTON15 = 0x0000010F,
XKEY_BUTTON16 = 0x00000110,
XKEY_BUTTON17 = 0x00000111,
XKEY_BUTTON18 = 0x00000112,
XKEY_BUTTON19 = 0x00000113,
XKEY_BUTTON20 = 0x00000114,
XKEY_BUTTON21 = 0x00000115,
XKEY_BUTTON22 = 0x00000116,
XKEY_BUTTON23 = 0x00000117,
XKEY_BUTTON24 = 0x00000118,
XKEY_BUTTON25 = 0x00000119,
XKEY_BUTTON26 = 0x0000011A,
XKEY_BUTTON27 = 0x0000011B,
XKEY_BUTTON28 = 0x0000011C,
XKEY_BUTTON29 = 0x0000011D,
XKEY_BUTTON30 = 0x0000011E,
XKEY_BUTTON31 = 0x0000011F,
//MOUSE
XKEY_MOUSE1 = 0x00010000,
XKEY_MOUSE2 = 0x00020000,
XKEY_MOUSE3 = 0x00030000,
XKEY_MOUSE4 = 0x00040000,
XKEY_MOUSE5 = 0x00050000,
XKEY_MOUSE6 = 0x00060000,
XKEY_MOUSE7 = 0x00070000,
XKEY_MOUSE8 = 0x00080000,
XKEY_MWHEEL_UP = 0x00090000,
XKEY_MWHEEL_DOWN = 0x000A0000,
XKEY_MAXIS_X = 0x000B0000,
XKEY_MAXIS_Y = 0x000C0000,
//JOYPAD
//GAMEPAD
XKEY_GP_A = 0x01000000,
XKEY_GP_B = 0x02000000,
XKEY_GP_X = 0x03000000,
XKEY_GP_Y = 0x04000000,
XKEY_GP_BLACK = 0x05000000,
XKEY_GP_WHITE = 0x06000000,
XKEY_GP_LEFT_TRIGGER = 0x07000000,
XKEY_GP_RIGHT_TRIGGER = 0x08000000,
XKEY_GP_DPAD_UP = 0x11000000,
XKEY_GP_DPAD_DOWN = 0x12000000,
XKEY_GP_DPAD_LEFT = 0x13000000,
XKEY_GP_DPAD_RIGHT = 0x14000000,
XKEY_GP_START = 0x15000000,
XKEY_GP_BACK = 0x16000000,
XKEY_GP_LEFT_THUMB = 0x17000000,
XKEY_GP_RIGHT_THUMB = 0x18000000,
XKEY_GP_STHUMBLUP = 0x19000000,
XKEY_GP_STHUMBLDOWN = 0x1a000000,
XKEY_GP_STHUMBLLEFT = 0x1b000000,
XKEY_GP_STHUMBLRIGHT = 0x1c000000,
XKEY_GP_STHUMBLX = 0x21000000,
XKEY_GP_STHUMBLY = 0x22000000,
XKEY_GP_STHUMBRX = 0x23000000,
XKEY_GP_STHUMBRY = 0x24000000,
};
#ifndef _XBOX
#else
/////////XBOX VK_MAPPING
#define kSYSREQ 0x54
#define kCAPSLOCK 0x3A
#define kNUMLOCK 0x45
#define kSCROLLLOCK 0x46
#define kLEFTCTRL 0x1D
#define kLEFTALT 0x38
#define kLEFTSHIFT 0x2A
#define kRIGHTCTRL 0x9D
#define kRIGHTALT 0xB8
#define kRIGHTSHIFT 0x36
#define kESC 29
#define kBACKSPACE 0x0E
#define kENTER 0x1C
#define kSPACE ' '
#define kTAB 0x0F
#define kF1 0x3B
#define kF2 0x3C
#define kF3 0x3D
#define kF4 0x3E
#define kF5 0x3F
#define kF6 0x40
#define kF7 0x41
#define kF8 0x42
#define kF9 0x43
#define kF10 0x44
#define kF11 0x57
#define kF12 0x58
#define kA 65
#define kB 'b'
#define kC 'c'
#define kD 'd'
#define kE 'e'
#define kF 'f'
#define kG 'g'
#define kH 'h'
#define kI 0x17
#define kJ 0x24
#define kK 0x25
#define kL 0x26
#define kM 0x32
#define kN 0x31
#define kO 0x18
#define kP 0x19
#define kQ 'q'
#define kR 0x13
#define kS 0x1F
#define kT 0x14
#define kU 0x16
#define kV 0x2F
#define kW 'w'
#define kX 'x'
#define kY 'y'
#define kZ 'z'
#define k1 0x02
#define k2 0x03
#define k3 0x04
#define k4 0x05
#define k5 0x06
#define k6 0x07
#define k7 0x08
#define k8 0x09
#define k9 0x0A
#define k0 0x0B
#define kMINUS '-'
#define kEQUAL '='
#define kLBRACKET 0x1A
#define kRBRACKET 0x1B
#define kSEMICOLON 0x27
#define kTICK 29
#define kAPOSTROPHE 0x29
#define kBACKSLASH 0x2B
#define kCOMMA 0x33
#define kPERIOD '.'
#define kSLASH 0x35
#define kINS 0xD2
#define kDEL 0xD3
#define kHOME 0xC7
#define kEND 0xCF
#define kPGUP 0xC9
#define kPGDN 0xD1
#define kLARROW 0xCB
#define kRARROW 0xCD
#define kUARROW 0xC8
#define kDARROW 0xD0
#define kKEYPAD0 0x52
#define kKEYPAD1 0x4F
#define kKEYPAD2 0x50
#define kKEYPAD3 0x51
#define kKEYPAD4 0x4B
#define kKEYPAD5 0x4C
#define kKEYPAD6 0x4D
#define kKEYPAD7 0x47
#define kKEYPAD8 0x48
#define kKEYPAD9 0x49
#define kKEYPADDEL 0x53
#define kKEYPADSTAR 0x37
#define kKEYPADMINUS 0x4A
#define kKEYPADPLUS 0x4E
#define kKEYPADENTER 0x9C
#define kCTRLPRTSC 0xB7
#define kSHIFTPRTSC 0xB7
#define kKEYPADSLASH 0xB5
#endif //_XBOX
#endif
/*! Interface to the Keyboard system.
*/
////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////
struct IKeyboard
{
virtual void ShutDown() = 0;
//! allow to force a key code value
/// virtual void SetKey(int p_key, int value) = 0;
//! allow to force a key code value
//virtual inline void SetPrevKey(int p_key, int value) = 0;
//! check for key pressed and held
virtual bool KeyDown(int p_key) = 0;
//! check for key pressed only once
virtual bool KeyPressed(int p_key) = 0;
//! check if the key has been released
virtual bool KeyReleased(int p_key) = 0;
//! clear the key status
virtual void ClearKey(int p_key) =0 ;
//! return the code of the key pressed
virtual int GetKeyPressedCode() = 0;
//! return the name of the key pressed
virtual const char *GetKeyPressedName() = 0;
//! return the code of the key down
virtual int GetKeyDownCode() = 0;
//! return the name of the key down
virtual const char *GetKeyDownName() = 0;
//! set/unset directinput to exclusive mode
virtual void SetExclusive(bool value,void *hwnd=0) = 0;
//! wait for a key pressed
virtual void WaitForKey() = 0;
//! clear the key (pressed) state
virtual void ClearKeyState() = 0;
};
/*! Interface to the Mouse system.
*/
////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////
struct IMouse
{
virtual void Shutdown() = 0;
//! check for a mouse button pressed and held
virtual bool MouseDown(int p_numButton) = 0;
//! check for a mouse button pressed only once
virtual bool MousePressed(int p_numButton) = 0;
//! check if the mouse button has been released
virtual bool MouseReleased(int p_numButton) = 0;
//! force the mouse wheel rotation to a certain value
virtual void SetMouseWheelRotation(int value) = 0;
//! set/reset Directinput to exclusive mode
virtual bool SetExclusive(bool value,void *hwnd=0) = 0;
//! get mouse X delta (left-right)
virtual float GetDeltaX() = 0;
//! get mouse Y delta (up-down)
virtual float GetDeltaY() = 0;
//! get mouse Z delta (mouse wheel)
virtual float GetDeltaZ() = 0;
//! set mouse inertia
virtual void SetInertia(float) = 0;
//! set mouse X screen corrdinate
virtual void SetVScreenX(float fX) = 0;
//! set mouse Y screen corrdinate
virtual void SetVScreenY(float fY) = 0;
//! get mouse X screen corrdinate
virtual float GetVScreenX() = 0;
//! get mouse Y screen corrdinate
virtual float GetVScreenY() = 0;
//! set the mouse sensitivity
virtual void SetSensitvity(float fSensitivity) = 0;
//! get the mouse sensitivity
virtual float GetSensitvity() = 0;
//! set the mouse sensitivity scale (from 0 to 1)
virtual void SetSensitvityScale(float fSensScale) = 0;
//! get the mouse sensitivity scale
virtual float GetSensitvityScale() = 0;
//! clear the key states
virtual void ClearKeyState() = 0;
};
//////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////
typedef int XACTIONID;
#define BEGIN_INPUTACTIONMAP() void OnAction(XACTIONID nActionID, float fValue,XActivationEvent ae) { switch(nActionID) {
#define END_INPUTACTIONMAP() default: break; } }
#define REGISTER_INPUTACTIONMAP(actionid, handler) case actionid: handler(fValue,ae); break;
#ifdef _XBOX
#define MAX_BINDS_PER_ACTION 3
#else
#define MAX_BINDS_PER_ACTION 2
#endif
enum XActionActivationMode
{
aamOnPress,
aamOnDoublePress,
aamOnPressAndRelease,
aamOnRelease,
aamOnHold
};
enum XActivationEvent
{
etPressing,
etHolding,
etReleasing,
etDoublePressing
};
struct XBind
{
XBind()
{
nKey=XKEY_NULL;
nModifier=XKEY_NULL;
// aam=aamOnPress;
// bConfigurable=false;
// bReplicate=false;
}
int nKey;
int nModifier;
// XActionActivationMode aam;
// bool bConfigurable;
// bool bReplicate;
};
struct IActionMapSink
{
virtual void OnAction(XACTIONID nActionID, float fValue, XActivationEvent ae) = 0;
};
struct IActionMap
{
virtual void ResetAllBindings() = 0;
virtual void ResetBinding(XACTIONID nActionID) = 0;
virtual void RemoveBind(XACTIONID nActionID, XBind &NewBind, XActionActivationMode aam) = 0;
virtual void BindAction(XACTIONID nActionID,XBind &NewBind, int iKeyPos = -1)=0;//int nKey,int nModifier=XKEY_NULL) = 0;
virtual void BindAction(XACTIONID nActionID,int nKey, int nModifier=XKEY_NULL, int iKeyPos = -1) = 0;//, bool bConfigurable=false, bool bReplicate=false) = 0;
virtual void BindAction(XACTIONID nActionID,const char *sKey,const char *sModifier=NULL, int iKeyPos = -1) = 0;
virtual void GetBinding(XACTIONID nActionID, int nKeyPos, XBind &Bind) = 0;
virtual void GetBinding(XACTIONID nActionID, int nKeyPos, int &nKey, int &nModifier) = 0;
virtual void GetBinding(XACTIONID nActionID, int nKeyPos, char *pszKey, char *pszModifier) = 0;
// compare this action map with the one passed and store the key differences in keys
virtual void GetBindDifferences(IActionMap *pActionMap, std::vector<int>& keys) = 0;
};
struct IActionMapDumpSink
{
virtual void OnElementFound(const char *pszActionMapName, IActionMap *pActionMap) = 0;
};
struct IActionMapManager
{
virtual void SetInvertedMouse(bool bEnable)=0;
virtual bool GetInvertedMouse()=0;;
virtual void RemoveBind(XACTIONID nActionID, XBind &NewBind, XActionActivationMode aam) = 0;
virtual void SetSink(IActionMapSink *pSink) = 0;
virtual void CreateAction(XACTIONID nActionID,const char *sActionName,XActionActivationMode aam=aamOnPress) = 0;
virtual IActionMap *CreateActionMap(const char *s) = 0;
virtual IActionMap *GetActionMap(const char *s) = 0;
virtual void ResetAllBindings() = 0;
virtual void GetActionMaps(IActionMapDumpSink *pCallback) = 0;
virtual void SetActionMap(const char *s) = 0;
virtual bool CheckActionMap(XACTIONID nActionID) = 0;
virtual bool CheckActionMap(const char *sActionName) = 0;
virtual void Reset() = 0;
virtual void Update(unsigned int nTimeMSec) = 0;
virtual void Release() = 0;
virtual void Enable() = 0;
virtual void Disable() = 0;
virtual bool IsEnabled() = 0;
};
//////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////
typedef unsigned char INPUTACTIONID;
//@{ Helper macros to implement the action triggers callback interface
#define BEGIN_INPUTACTIONTRIGGERS() void OnAction(INPUTACTIONID nActionID, float fValue) { switch(nActionID) {
#define END_INPUTACTIONTRIGGERS() default: break; } }
#define REGISTER_INPUTACTIONTRIGGER(actionid, handler) case actionid: handler(fValue); break;
//@}
// Action triggers callback interface
struct IInputActionTriggerSink
{
virtual void OnAction(INPUTACTIONID nActionID, float fValue) = 0;
};
//! Action map interface
struct IInputActionMap
{
virtual void SetSink(IInputActionTriggerSink *pIActionTrigger) = 0;
virtual void Release() = 0;
//! Check all actions
virtual void Update() = 0;
// Call the action trigger
virtual void CallActionTrigger(INPUTACTIONID nActionID, float fValue) = 0;
//! Return the amount of pressing of the action input if the action is
//! currently done
virtual float CheckAction(const INPUTACTIONID nActionID) = 0;
/*! Set a new action
@param nActionID id that identity the action[eg. ACTION_JUMP]
@param bCheckPressed if true the action event is triggered only once when a button is pressed
else the action is send every frame until the button is released
@param szCodes key identifiers [eg. "MBT_1" mouse button]
@param szMods key modifier [eg. "SHIFT"]
@return true=succeded,false=failed*/
virtual bool SetAction(const INPUTACTIONID nActionID,bool bCheckPressed, const char *szCodes, const char *szMods=NULL) = 0;
virtual void ClearAction(const INPUTACTIONID nActionID) = 0;
};
//////////////////////////////////////////////////////////////////////
// Input interface for the XBox controller
//////////////////////////////////////////////////////////////////////
#ifdef _XBOX
//@{ XBox Input code enumerations and constants
enum eController
{
eOne = 0,
eTwo = 1,
eThree = 2,
eFour = 3,
ePrimary = 10,
eAll = 11,
};
enum eDigitalButton
{
eDigitalUp = XINPUT_GAMEPAD_DPAD_UP,
eDigitalDown = XINPUT_GAMEPAD_DPAD_DOWN,
eDigitalLeft = XINPUT_GAMEPAD_DPAD_LEFT,
eDigitalRight = XINPUT_GAMEPAD_DPAD_RIGHT,
eStart = XINPUT_GAMEPAD_START,
eBack = XINPUT_GAMEPAD_BACK,
eLeftStick = XINPUT_GAMEPAD_LEFT_THUMB,
eRightStick = XINPUT_GAMEPAD_RIGHT_THUMB,
};
enum eAnalogButton
{
eA = XINPUT_GAMEPAD_A,
eB = XINPUT_GAMEPAD_B,
eX = XINPUT_GAMEPAD_X,
eY = XINPUT_GAMEPAD_Y,
eBlack = XINPUT_GAMEPAD_BLACK,
eWhite = XINPUT_GAMEPAD_WHITE,
eLeftTrigger = XINPUT_GAMEPAD_LEFT_TRIGGER,
eRightTrigger = XINPUT_GAMEPAD_RIGHT_TRIGGER,
};
enum eSide
{
eLeft,
eRight,
};
const unsigned int MAX_XBOX_CONTROLLERS = 4;
const unsigned int XBOX_ANALOGSTICK_DEADZONE = 8000;
//@}
struct IGamepad
{
virtual void ShutDown() = 0;
//! check for a mouse button pressed and held
virtual bool KeyDown(int p_numButton) = 0;
//! check for a mouse button pressed only once
virtual bool KeyPressed(int p_numButton) = 0;
//! check if the mouse button has been released
virtual bool KeyReleased(int p_numButton) = 0;
//! get mouse X delta (left-right)
virtual float GetDeltaX() = 0;
//! get mouse Y delta (up-down)
virtual float GetDeltaY() = 0;
};
#endif //_XBOX
/*! InputEvents are generated by input system and broadcasted to all event listeners.
*/
struct SInputEvent
{
//! Input Event types.
enum EType
{
UNKNOWN,
KEY_PRESS,
KEY_RELEASE,
MOUSE_MOVE,
};
//! Type of input event.
EType type;
//! Key which was pressed or released, one of the XKeys.
//! @see KeyCodes
int key;
//! Timestamp of the event, (GetTickCount compatable).
unsigned int timestamp;
//! Key modifiers enabled at the time of this event.
//! @see EKeyModifiersFlags
int moidifiers;
//! Name of the event key.
const char *keyname;
//! For mouse axises.
float value;
SInputEvent()
{
moidifiers = XKEY_MOD_NONE;
key = 0;
type = UNKNOWN;
timestamp = 0;
keyname = 0;
value = 0;
}
};
//////////////////////////////////////////////////////////////////////////
/* Input event listeners registered to input system and recieve input events when they are generated.
*/
struct IInputEventListener
{
//! Called every time input event is generated.
//! @return if return True then broadcasting of this event should be aborted and the rest of input
//! listeners should not recieve this event.
virtual bool OnInputEvent( const SInputEvent &event ) = 0;
};
/*! Interface to the Input system.
The input system give access and initialize Keyboard,Mouse and Joystick SubSystems.
*/
////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////
/*! Main Input system interface.
*/
struct IInput
{
//////////////////////////////////////////////////////////////////////////
//! Register new input events listener.
virtual void AddEventListener( IInputEventListener *pListener ) = 0;
virtual void RemoveEventListener( IInputEventListener *pListener ) = 0;
virtual void EnableEventPosting ( bool bEnable ) = 0;
//! Register new console input event listeners. console input listeners receive all events, no matter what.
virtual void AddConsoleEventListener( IInputEventListener *pListener ) = 0;
virtual void RemoveConsoleEventListener( IInputEventListener *pListener ) = 0;
virtual void SetExclusiveListener( IInputEventListener *pListener ) = 0;
virtual IInputEventListener *GetExclusiveListener() = 0;
//////////////////////////////////////////////////////////////////////////
//! update Keyboard, Mouse and Joystick. Set bFocus to true if window has focus and input is enabled.
virtual void Update(bool bFocus) = 0;
//! clear all subsystems
virtual void ShutDown() = 0;
//! @see IMouse::SetExclusive
virtual void SetMouseExclusive(bool exclusive,void *hwnd=0) = 0;
//! @see IKeyboard::SetExclusive
virtual void SetKeyboardExclusive(bool exclusive,void *hwnd=0) = 0;
//! @see IKeyBoard::KeyDown
virtual bool KeyDown(int p_key) = 0;
//! @see IKeyBoard::KeyPressed
virtual bool KeyPressed(int p_key) = 0;
//! @see IKeyBoard::KeyRelease
virtual bool KeyReleased(int p_key) = 0;
//! @see IMouse::MouseDown
virtual bool MouseDown(int p_numButton) = 0;
//! @see IMouse::MousePressed
virtual bool MousePressed(int p_numButton) = 0;
//! @see IMouse::MouseDblClick
virtual bool MouseDblClick(int p_numButton) = 0;
//! @see IMouse::MouseReleased
virtual bool MouseReleased(int p_numButton) = 0;
//! @see IMouse::GetDeltaX
virtual float MouseGetDeltaX() = 0;
//! @see IMouse::GetDeltaY
virtual float MouseGetDeltaY() = 0;
//! @see IMouse::GetDeltaZ
virtual float MouseGetDeltaZ() = 0;
//! @see IMouse::GetVScreenX
virtual float MouseGetVScreenX() = 0;
//! @see IMouse::GetVScreenY
virtual float MouseGetVScreenY() = 0;
//! Converts a key-name to the key-id
virtual int GetKeyID(const char *sName) = 0;
virtual void EnableBufferedInput(bool bEnable) = 0;
virtual void FeedVirtualKey(int nVirtualKey,long lParam,bool bDown)=0;
virtual int GetBufferedKey() = 0;
virtual const char* GetBufferedKeyName() = 0;
virtual void PopBufferedKey() = 0;
//! @see IMouse::SetInertia
virtual void SetMouseInertia(float) = 0;
//! check if the joystick button has been pressed
virtual bool JoyButtonPressed(int p_numButton) = 0;
//! check the joystick direction
virtual int JoyGetDir() = 0;
//! check the joy hat direction
virtual int JoyGetHatDir() = 0;
virtual Vec3 JoyGetAnalog1Dir(unsigned int joystickID) const = 0;
virtual Vec3 JoyGetAnalog2Dir(unsigned int joystickID) const = 0;
//! return the keyboard interface
virtual IKeyboard *GetIKeyboard() = 0;
//! return the mouse interface
virtual IMouse * GetIMouse() = 0;
#ifdef _XBOX
//! return the Xbox gamepad interface
virtual IGamepad * GetIGamepad() = 0;
#endif
//! Convert key code to the key name.
//! @param nKey one of xkey codes.
//! @param modifiers current modifiers (shift,ctrl,..).
//! @see KeyCodes.
virtual const char *GetKeyName(int nKey,int modifiers=0, bool bGUI = 0) = 0;
virtual bool GetOSKeyName(int nKey, wchar_t *szwKeyName, int iBufSize) = 0;
//! @see IKeyBoard::GetKeyPressedCode
virtual int GetKeyPressedCode() = 0;
//! @see IKeyBoard::GetKeyPressedName
virtual const char *GetKeyPressedName() = 0;
//! @see IKeyBoard::GetKeyDownCode
virtual int GetKeyDownCode() = 0;
//! @see IKeyBoard::GetKeyDownName
virtual const char *GetKeyDownName() = 0;
//! @see IKeyBoard::WaitForKey
virtual void WaitForKey() = 0;
//! action mapper
virtual struct IActionMapManager* CreateActionMapManager() = 0;
//! return the name of the current XKEY(both mouse and keyboard excluding mouse delta)
//! useful for the GUI to retrieve the first key pressed during the key configuration
virtual const char *GetXKeyPressedName() = 0;
//! clear key states of all devices
virtual void ClearKeyState() = 0;
virtual unsigned char GetKeyState(int nKey) = 0;
};
#ifdef __cplusplus
extern "C" {
#endif
struct ILog;
struct IInput;
struct ISystem;
typedef IInput (* CRY_PTRCREATEINPUTFNC(ISystem *pSystem,void* hinst, void* hwnd, bool usedinput));
CRYINPUT_API IInput *CreateInput(ISystem *pSystem,void* hinst, void* hwnd, bool usedinput);
#ifdef __cplusplus
};
#endif
#endif //_IINPUT_H_