Input polling						{#inputPolling}
===============

Input polling refers to the process of querying the input system to check if user interacted with a input device in some way. This may include checking if the user pressed a keyboard, mouse or a gamepad button or moved the mouse or an analog axis. 

All the input in Banshee is handled though the @ref bs::Input "Input" class, which can always be accessed from the @ref bs::gInput "gInput" method.

# Button presses
Use the following methods to check if a button has been pressed, released or is currently being held down:
 - @ref bs::Input::isButtonDown "Input::isButtonDown" - Checks has the button been pressed this frame. Only valid for one frame.
 - @ref bs::Input::isButtonHeld "Input::isButtonHeld" - Checks is the button currently being held. This is valid for the first frame the button is pressed, and for any following frame until it is released.
 - @ref bs::Input::isButtonUp "Input::isButtonUp" - Checks has the button been released this frame. Only valid for one frame.
 
These methods work on any kind of input device buttons, including keyboard, gamepad and mouse. Use @ref bs::ButtonCode "ButtonCode" to choose which button to query for.

~~~~~~~~~~~~~{.cpp}
Vector3 position(BsZero);

// Move 5 units forward for every frame while W key is pressed
if(gInput().isButtonHeld(BC_W))
	position.z += 5.0f;
~~~~~~~~~~~~~

# Analog input
Moving the mouse, gamepad sticks or triggers results in an analog input. While buttons can only be toggled on or off, analog input is received in a specific range (for example, anywhere between -1 and 1). This allows more precise input for games that require it.

In Banshee analog input is represented through the concept of *axes*. Use @ref bs::Input::getAxisValue "Input::getAxisValue" to get a value for a specific axis. Check @ref bs::InputAxis "InputAxis" for a list of all supported axes.

~~~~~~~~~~~~~{.cpp}
Vector3 position(BsZero);

// Move forward or backwards depending on how much does the user move the left gamepad stick forward or backwards
position.z += gInput().getAxisValue(InputAxis::LeftStickY);
~~~~~~~~~~~~~

Most axes report their input in range [-1, 1], with the exception of mouse axes, which are unbound. 

# Mouse input
Often it is useful to receive mouse position directly, rather than dealing with raw mouse axis data. Use @ref bs::Input::getPointerPosition "Input::getPointerPosition" to retrieve the current position of the mouse cursor, in coordinates relative to the screen.

Use @ref bs::Input::getPointerDelta "Input::getPointerDelta" to get the difference in coordinates between the position of the mouse on the previous and current frame.

~~~~~~~~~~~~~{.cpp}
Vector2I screenPos = gInput().getPointerPosition();
~~~~~~~~~~~~~

You can also check if the left mouse button has been double-clicked by checking @ref bs::Input::isPointerDoubleClicked "Input::isPointerDoubleClicked".

~~~~~~~~~~~~~{.cpp}
if(gInput().isPointerDoubleClicked())
	gDebug().logDebug("Mouse double-clicked!");
~~~~~~~~~~~~~