/* ----------------------------------------------------------------------------- GSFramework Copyright 2001-2013 Emmanuel Julien. All Rights Reserved. ----------------------------------------------------------------------------- */ #ifndef __INPUT_DEVICE__ #define __INPUT_DEVICE__ #include "ntypes.h" #include "memory/nshared_ptr.h" namespace GS { namespace Input { /* @short Input device. @author Emmanuel Julien (ejulien@nworks.fr) */ class Device : public SharedObject { public: enum Type { Type_Any = 0, Type_Keyboard, Type_Mouse, Type_Pad, Type_Touch }; // Binary value. enum KeyCode { Key_None = 0, // Keyboard. Key_LShift, Key_RShift, Key_LCtrl, Key_RCtrl, Key_LAlt, Key_RAlt, Key_LWin, Key_RWin, Key_Tab, Key_CapsLock, Key_Space, Key_Backspace, Key_Insert, Key_Suppr, Key_Home, Key_End, Key_PageUp, Key_PageDown, Key_Up, Key_Down, Key_Left, Key_Right, Key_Escape, Key_F1, Key_F2, Key_F3, Key_F4, Key_F5, Key_F6, Key_F7, Key_F8, Key_F9, Key_F10, Key_F11, Key_F12, Key_PrintScreen, Key_ScrollLock, Key_Pause, Key_NumLock, Key_Return, Key_Numpad0, Key_Numpad1, Key_Numpad2, Key_Numpad3, Key_Numpad4, Key_Numpad5, Key_Numpad6, Key_Numpad7, Key_Numpad8, Key_Numpad9, Key_Add, Key_Sub, Key_Mul, Key_Div, Key_Enter, Key_A, Key_B, Key_C, Key_D, Key_E, Key_F, Key_G, Key_H, Key_I, Key_J, Key_K, Key_L, Key_M, Key_N, Key_O, Key_P, Key_Q, Key_R, Key_S, Key_T, Key_U, Key_V, Key_W, Key_X, Key_Y, Key_Z, // Mouse/pad. Key_Button0, Key_Button1, Key_Button2, Key_Button3, Key_Button4, Key_Button5, Key_Button6, Key_Button7, Key_Button8, Key_Button9, Key_Button10, Key_Button11, Key_Button12, Key_Button13, Key_Button14, Key_Button15, Key_Button16, Key_Button17, Key_Button18, Key_Button19, Key_Button20, Key_Button21, Key_Button22, Key_Button23, Key_Button24, Key_Button25, Key_Button26, Key_Button27, Key_Button28, Key_Button29, Key_Button30, Key_Button31, Key_Button32, Key_Button33, Key_Button34, Key_Button35, Key_Button36, Key_Button37, Key_Button38, Key_Button39, Key_Button40, Key_Button41, Key_Button42, Key_Button43, Key_Button44, Key_Button45, Key_Button46, Key_Button47, Key_Button48, Key_Button49, Key_Button50, Key_Button51, Key_Button52, Key_Button53, Key_Button54, Key_Button55, Key_Button56, Key_Button57, Key_Button58, Key_Button59, Key_Button60, Key_Button61, Key_Button62, Key_Button63, Key_Button64, Key_Button65, Key_Button66, Key_Button67, Key_Button68, Key_Button69, Key_Button70, Key_Button71, Key_Button72, Key_Button73, Key_Button74, Key_Button75, Key_Button76, Key_Button77, Key_Button78, Key_Button79, Key_Button80, Key_Button81, Key_Button82, Key_Button83, Key_Button84, Key_Button85, Key_Button86, Key_Button87, Key_Button88, Key_Button89, Key_Button90, Key_Button91, Key_Button92, Key_Button93, Key_Button94, Key_Button95, Key_Button96, Key_Button97, Key_Button98, Key_Button99, Key_Button100, Key_Button101, Key_Button102, Key_Button103, Key_Button104, Key_Button105, Key_Button106, Key_Button107, Key_Button108, Key_Button109, Key_Button110, Key_Button111, Key_Button112, Key_Button113, Key_Button114, Key_Button115, Key_Button116, Key_Button117, Key_Button118, Key_Button119, Key_Button120, Key_Button121, Key_Button122, Key_Button123, Key_Button124, Key_Button125, Key_Button126, Key_Button127, Key_Back, Key_Start, Key_Select, Key_L1, Key_L2, Key_L3, Key_R1, Key_R2, Key_R3, Key_Cross_Up, Key_Cross_Down, Key_Cross_Left, Key_Cross_Right, Key_Last }; // Ranged-value. enum InputCode { Input_None = 0, Input_AxisX, Input_AxisY, Input_AxisZ, Input_AxisS, Input_AxisT, Input_AxisR, Input_RotX, Input_RotY, Input_RotZ, Input_RotS, Input_RotT, Input_RotR, Input_Button0, Input_Button1, Input_Button2, Input_Button3, Input_Button4, Input_Button5, Input_Button6, Input_Button7, Input_Button8, Input_Button9, Input_Button10, Input_Button11, Input_Button12, Input_Button13, Input_Button14, Input_Button15 }; // Input semantics. enum InputSemantic { // Mouse semantics. Semantic_LeftMouseButton, Semantic_RightMouseButton, Semantic_MiddleMouseButton, Semantic_MouseAxisX, Semantic_MouseAxisY, Semantic_MouseWheel, // Touch semantic. Semantic_TouchPressure, Semantic_TouchAxisX, Semantic_TouchAxisY, // Pad semantics. Semantic_StartButton, Semantic_SelectButton }; enum Effect { Vibrate, VibrateLeft, VibrateRight, ConstantForce }; /// Get device type. virtual Type GetType() const = 0; /// Get device name. virtual const char *GetName() const = 0; /// Pool state and refresh values. virtual void Update() = 0; /// Is device valid. virtual bool IsValid() const { return true; } /// Get input from semantic. virtual InputCode GetInputFromSemantic(InputSemantic) { return Input_None; } /// Test a key state. virtual bool IsDown(KeyCode) const { return false; } /// Test a key state during the previous update. virtual bool WasDown(KeyCode) const { return false; } /// Get input range. virtual bool GetInputRange(InputCode, float &min, float &max) const { return false; } /// Get input value. virtual float GetValue(InputCode) const { return 0; } /// Get input value during last update. virtual float GetLastValue(InputCode) const { return 0; } /// Set input value, return true if the device supports setting this value. virtual bool SetValue(InputCode, float) { return false; } /// Set device effect. virtual void SetEffect(Effect effect, float v) {} bool WasPressed(KeyCode key) const { return !WasDown(key) && IsDown(key); } }; } // Input } // GS #endif // __INPUT_DEVICE__