mirror of
https://github.com/NoelFB/blah.git
synced 2024-11-25 16:18:57 +08:00
simplifying input calls & state
This commit is contained in:
parent
81e2de3553
commit
2447490033
|
@ -28,7 +28,6 @@
|
||||||
#include "blah/images/image.h"
|
#include "blah/images/image.h"
|
||||||
#include "blah/images/packer.h"
|
#include "blah/images/packer.h"
|
||||||
|
|
||||||
|
|
||||||
#include "blah/numerics/calc.h"
|
#include "blah/numerics/calc.h"
|
||||||
#include "blah/numerics/circle.h"
|
#include "blah/numerics/circle.h"
|
||||||
#include "blah/numerics/color.h"
|
#include "blah/numerics/color.h"
|
||||||
|
|
|
@ -275,22 +275,55 @@ namespace Blah
|
||||||
|
|
||||||
struct KeyboardState
|
struct KeyboardState
|
||||||
{
|
{
|
||||||
|
// whether a key was pressed this frame
|
||||||
bool pressed[Input::max_keyboard_keys];
|
bool pressed[Input::max_keyboard_keys];
|
||||||
|
|
||||||
|
// whether a key is currently held
|
||||||
bool down[Input::max_keyboard_keys];
|
bool down[Input::max_keyboard_keys];
|
||||||
|
|
||||||
|
// whether a key was released this frame
|
||||||
bool released[Input::max_keyboard_keys];
|
bool released[Input::max_keyboard_keys];
|
||||||
|
|
||||||
|
// the timestamp for the key being pressed
|
||||||
u64 timestamp[Input::max_keyboard_keys];
|
u64 timestamp[Input::max_keyboard_keys];
|
||||||
|
|
||||||
|
// current text input this frame
|
||||||
String text;
|
String text;
|
||||||
|
|
||||||
|
// Checks if the Left or Right Ctrl Key is down
|
||||||
|
bool ctrl();
|
||||||
|
|
||||||
|
// Checks if the Left or Right Shift Key is down
|
||||||
|
bool shift();
|
||||||
|
|
||||||
|
// Checks if the Left or Right Alt Key is down
|
||||||
|
bool alt();
|
||||||
};
|
};
|
||||||
|
|
||||||
struct MouseState
|
struct MouseState
|
||||||
{
|
{
|
||||||
|
// whether a button was pressed this frame
|
||||||
bool pressed[Input::max_mouse_buttons];
|
bool pressed[Input::max_mouse_buttons];
|
||||||
|
|
||||||
|
// whether a button was held this frame
|
||||||
bool down[Input::max_mouse_buttons];
|
bool down[Input::max_mouse_buttons];
|
||||||
|
|
||||||
|
// whether a button was released this frame
|
||||||
bool released[Input::max_mouse_buttons];
|
bool released[Input::max_mouse_buttons];
|
||||||
|
|
||||||
|
// the timestamp for the button being pressed
|
||||||
u64 timestamp[Input::max_mouse_buttons];
|
u64 timestamp[Input::max_mouse_buttons];
|
||||||
|
|
||||||
|
// mouse position in screen coordinates
|
||||||
Vec2 screen_position;
|
Vec2 screen_position;
|
||||||
|
|
||||||
|
// mouse position in pixel coordinates
|
||||||
Vec2 draw_position;
|
Vec2 draw_position;
|
||||||
|
|
||||||
|
// mouse position on the window
|
||||||
Vec2 position;
|
Vec2 position;
|
||||||
|
|
||||||
|
// mouse wheel value this frame
|
||||||
Point wheel;
|
Point wheel;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -306,48 +339,63 @@ namespace Blah
|
||||||
|
|
||||||
// The current Mouse state
|
// The current Mouse state
|
||||||
MouseState mouse;
|
MouseState mouse;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// Keyboard Keys
|
// Keyboard Keys
|
||||||
enum class Key
|
struct Keys
|
||||||
{
|
{
|
||||||
#define DEFINE_KEY(name, value) name = value,
|
enum Enumeration
|
||||||
BLAH_KEY_DEFINITIONS
|
{
|
||||||
#undef DEFINE_KEY
|
#define DEFINE_KEY(name, value) name = value,
|
||||||
|
BLAH_KEY_DEFINITIONS
|
||||||
|
#undef DEFINE_KEY
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
using Key = Keys::Enumeration;
|
||||||
|
|
||||||
// Game Controller Buttons
|
// Game Controller Buttons
|
||||||
enum class Button
|
struct Buttons
|
||||||
{
|
{
|
||||||
#define DEFINE_BTN(name, value) name = value,
|
enum Enumeration
|
||||||
BLAH_BUTTON_DEFINITIONS
|
{
|
||||||
#undef DEFINE_BTN
|
#define DEFINE_BTN(name, value) name = value,
|
||||||
|
BLAH_BUTTON_DEFINITIONS
|
||||||
|
#undef DEFINE_BTN
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
using Button = Buttons::Enumeration;
|
||||||
|
|
||||||
// Game Controller Axes
|
// Game Controller Axis
|
||||||
enum class Axis
|
struct Axes
|
||||||
{
|
{
|
||||||
None = -1,
|
enum Enumeration
|
||||||
LeftX = 0,
|
{
|
||||||
LeftY = 1,
|
None = -1,
|
||||||
RightX = 2,
|
LeftX = 0,
|
||||||
RightY = 3,
|
LeftY = 1,
|
||||||
LeftTrigger = 4,
|
RightX = 2,
|
||||||
RightTrigger = 5
|
RightY = 3,
|
||||||
|
LeftTrigger = 4,
|
||||||
|
RightTrigger = 5,
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
using Axis = Axes::Enumeration;
|
||||||
|
|
||||||
// Mouse Buttons
|
// Mouse Buttons
|
||||||
enum class MouseButton
|
struct MouseButtons
|
||||||
{
|
{
|
||||||
None = -1,
|
enum Enumeration
|
||||||
Left = 0,
|
{
|
||||||
Middle = 1,
|
None = -1,
|
||||||
Right = 2,
|
Left = 0,
|
||||||
|
Middle = 1,
|
||||||
|
Right = 2,
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
using MouseButton = MouseButtons::Enumeration;
|
||||||
|
|
||||||
class InputBinding;
|
class ButtonBinding;
|
||||||
using InputBindingRef = Ref<InputBinding>;
|
using ButtonBindingRef = Ref<ButtonBinding>;
|
||||||
|
|
||||||
class AxisBinding;
|
class AxisBinding;
|
||||||
using AxisBindingRef = Ref<AxisBinding>;
|
using AxisBindingRef = Ref<AxisBinding>;
|
||||||
|
@ -359,7 +407,7 @@ namespace Blah
|
||||||
// You must call Binding::update() every frame to poll the input state.
|
// You must call Binding::update() every frame to poll the input state.
|
||||||
// Alternatively, bindings can be registered to Input which will
|
// Alternatively, bindings can be registered to Input which will
|
||||||
// automatically update them.
|
// automatically update them.
|
||||||
class InputBinding
|
class ButtonBinding
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
@ -418,16 +466,16 @@ namespace Blah
|
||||||
// List of bound Mouse buttons
|
// List of bound Mouse buttons
|
||||||
StackVector<MouseButton, 16> mouse;
|
StackVector<MouseButton, 16> mouse;
|
||||||
|
|
||||||
InputBinding() = default;
|
ButtonBinding() = default;
|
||||||
|
|
||||||
InputBinding(float press_buffer)
|
ButtonBinding(float press_buffer)
|
||||||
: press_buffer(press_buffer)
|
: press_buffer(press_buffer)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename ... Args>
|
template<typename ... Args>
|
||||||
InputBinding(float press_buffer, const Args&... args)
|
ButtonBinding(float press_buffer, const Args&... args)
|
||||||
: press_buffer(press_buffer)
|
: press_buffer(press_buffer)
|
||||||
{
|
{
|
||||||
add(args...);
|
add(args...);
|
||||||
|
@ -461,20 +509,20 @@ namespace Blah
|
||||||
void consume_release();
|
void consume_release();
|
||||||
|
|
||||||
// adds a key to the binding
|
// adds a key to the binding
|
||||||
InputBinding& add(Key key);
|
ButtonBinding& add(Key key);
|
||||||
|
|
||||||
// adds a button to the binding
|
// adds a button to the binding
|
||||||
InputBinding& add(ButtonBind button);
|
ButtonBinding& add(ButtonBind button);
|
||||||
|
|
||||||
// adds an trigger to the binding
|
// adds an trigger to the binding
|
||||||
InputBinding& add(TriggerBind trigger);
|
ButtonBinding& add(TriggerBind trigger);
|
||||||
|
|
||||||
// adds a mouse button to the binding
|
// adds a mouse button to the binding
|
||||||
InputBinding& add(MouseButton mouse);
|
ButtonBinding& add(MouseButton mouse);
|
||||||
|
|
||||||
// adds an input to the binding
|
// adds an input to the binding
|
||||||
template<typename T, typename T2, typename ... Args>
|
template<typename T, typename T2, typename ... Args>
|
||||||
InputBinding& add(T first, T2 second, const Args&... args)
|
ButtonBinding& add(T first, T2 second, const Args&... args)
|
||||||
{
|
{
|
||||||
add(first);
|
add(first);
|
||||||
add(second, args...);
|
add(second, args...);
|
||||||
|
@ -482,13 +530,13 @@ namespace Blah
|
||||||
}
|
}
|
||||||
|
|
||||||
// adds the left trigger to the binding
|
// adds the left trigger to the binding
|
||||||
InputBinding& add_left_trigger(int controller, float threshold);
|
ButtonBinding& add_left_trigger(int controller, float threshold);
|
||||||
|
|
||||||
// adds the right trigger to the binding
|
// adds the right trigger to the binding
|
||||||
InputBinding& add_right_trigger(int controller, float threshold);
|
ButtonBinding& add_right_trigger(int controller, float threshold);
|
||||||
|
|
||||||
// assigns all the bindings to the specific controller
|
// assigns all the bindings to the specific controller
|
||||||
InputBinding& set_controller(int index);
|
ButtonBinding& set_controller(int index);
|
||||||
|
|
||||||
// removes all bindings
|
// removes all bindings
|
||||||
void clear();
|
void clear();
|
||||||
|
@ -526,17 +574,17 @@ namespace Blah
|
||||||
};
|
};
|
||||||
|
|
||||||
// Negative Value Binding
|
// Negative Value Binding
|
||||||
InputBinding negative;
|
ButtonBinding negative;
|
||||||
|
|
||||||
// Positive Value Binding
|
// Positive Value Binding
|
||||||
InputBinding positive;
|
ButtonBinding positive;
|
||||||
|
|
||||||
// How to handle overlaps (ex. Left and Right are both held)
|
// How to handle overlaps (ex. Left and Right are both held)
|
||||||
Overlap overlap = Overlap::Newer;
|
Overlap overlap = Overlap::Newer;
|
||||||
|
|
||||||
AxisBinding() = default;
|
AxisBinding() = default;
|
||||||
|
|
||||||
AxisBinding(const InputBinding& negative, const InputBinding& positive, Overlap overlap = Overlap::Newer)
|
AxisBinding(const ButtonBinding& negative, const ButtonBinding& positive, Overlap overlap = Overlap::Newer)
|
||||||
: negative(negative)
|
: negative(negative)
|
||||||
, positive(positive)
|
, positive(positive)
|
||||||
, overlap(overlap)
|
, overlap(overlap)
|
||||||
|
@ -648,13 +696,11 @@ namespace Blah
|
||||||
|
|
||||||
namespace Input
|
namespace Input
|
||||||
{
|
{
|
||||||
// Returns the Input State of the current frame.
|
// Input State for the current frame
|
||||||
// This pointer is only valid for the current frame and should not be stored.
|
extern InputState state;
|
||||||
const InputState* state();
|
|
||||||
|
|
||||||
// Returns the Input State of the previous frame.
|
// Input State for the previous frame
|
||||||
// This pointer is only valid for the current frame and should not be stored.
|
extern InputState last_state;
|
||||||
const InputState* last_state();
|
|
||||||
|
|
||||||
// Gets the Mouse Position
|
// Gets the Mouse Position
|
||||||
Vec2 mouse();
|
Vec2 mouse();
|
||||||
|
@ -695,42 +741,14 @@ namespace Blah
|
||||||
// Checks if the Left or Right Alt Key is down
|
// Checks if the Left or Right Alt Key is down
|
||||||
bool alt();
|
bool alt();
|
||||||
|
|
||||||
// Get the current Text Input
|
// returns a string name of the key
|
||||||
const char* text();
|
|
||||||
|
|
||||||
// Gets the controller info for the current controller index.
|
|
||||||
// If the controller is not connected or the index it out of range, this will set an unconnected controller.
|
|
||||||
const ControllerState* controller(int controller_index);
|
|
||||||
|
|
||||||
// Checks if the button on the controller was pressed this frame.
|
|
||||||
// If the controller is not connected, or the index is out of range, this will return false.
|
|
||||||
bool pressed(int controller_index, Button button);
|
|
||||||
|
|
||||||
// Checks if the button on the controller was held this frame.
|
|
||||||
// If the controller is not connected, or the index is out of range, this will return false.
|
|
||||||
bool down(int controller_index, Button button);
|
|
||||||
|
|
||||||
// Checks if the button on the controller was released this frame.
|
|
||||||
// If the controller is not connected, or the index is out of range, this will return false.
|
|
||||||
bool released(int controller_index, Button button);
|
|
||||||
|
|
||||||
// returns the value of the given axis
|
|
||||||
float axis_check(int controller_index, Axis axis);
|
|
||||||
|
|
||||||
// checks the given virtual axis, described by 2 keys. `fallback` is returned if both keys are held
|
|
||||||
int axis_check(int fallback, Key negative, Key positive);
|
|
||||||
|
|
||||||
// checks the given virtual axis, described by 2 buttons. `fallback` is returned if both buttons are held
|
|
||||||
int axis_check(int fallback, int controller_index, Button negative, Button positive);
|
|
||||||
|
|
||||||
// returns a string name of the given key
|
|
||||||
const char* name_of(Key key);
|
const char* name_of(Key key);
|
||||||
|
|
||||||
// returns a string name of the given button
|
// returns a string name of the button
|
||||||
const char* name_of(Button button);
|
const char* name_of(Button button);
|
||||||
|
|
||||||
// registers a new binding
|
// registers a new binding
|
||||||
InputBindingRef register_binding(const InputBinding& binding);
|
ButtonBindingRef register_binding(const ButtonBinding& binding);
|
||||||
|
|
||||||
// registers a new axis binding
|
// registers a new axis binding
|
||||||
AxisBindingRef register_binding(const AxisBinding& binding);
|
AxisBindingRef register_binding(const AxisBinding& binding);
|
||||||
|
|
|
@ -295,4 +295,4 @@ namespace
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
extern const TargetRef App::backbuffer = TargetRef(new BackBuffer());
|
const TargetRef App::backbuffer = TargetRef(new BackBuffer());
|
287
src/input.cpp
287
src/input.cpp
|
@ -11,26 +11,27 @@ using namespace Blah;
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
InputState g_last_state;
|
|
||||||
InputState g_curr_state;
|
|
||||||
InputState g_next_state;
|
InputState g_next_state;
|
||||||
InputState g_empty_state;
|
InputState g_empty_state;
|
||||||
ControllerState g_empty_controller;
|
ControllerState g_empty_controller;
|
||||||
Vector<WeakRef<InputBinding>> g_bindings;
|
Vector<WeakRef<ButtonBinding>> g_buttons;
|
||||||
Vector<WeakRef<AxisBinding>> g_axes;
|
Vector<WeakRef<AxisBinding>> g_axes;
|
||||||
Vector<WeakRef<StickBinding>> g_sticks;
|
Vector<WeakRef<StickBinding>> g_sticks;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
InputState Blah::Input::state;
|
||||||
|
InputState Blah::Input::last_state;
|
||||||
|
|
||||||
void InputBackend::init()
|
void InputBackend::init()
|
||||||
{
|
{
|
||||||
g_empty_controller.name = "Disconnected";
|
g_empty_controller.name = "Disconnected";
|
||||||
for (int i = 0; i < Blah::Input::max_controllers; i++)
|
for (int i = 0; i < Blah::Input::max_controllers; i++)
|
||||||
g_empty_state.controllers[i].name = g_empty_controller.name;
|
g_empty_state.controllers[i].name = g_empty_controller.name;
|
||||||
|
|
||||||
g_last_state = g_empty_state;
|
Input::last_state = g_empty_state;
|
||||||
g_curr_state = g_empty_state;
|
Input::state = g_empty_state;
|
||||||
g_next_state = g_empty_state;
|
g_next_state = g_empty_state;
|
||||||
g_bindings.dispose();
|
g_buttons.dispose();
|
||||||
g_axes.dispose();
|
g_axes.dispose();
|
||||||
g_sticks.dispose();
|
g_sticks.dispose();
|
||||||
}
|
}
|
||||||
|
@ -38,8 +39,8 @@ void InputBackend::init()
|
||||||
void InputBackend::frame()
|
void InputBackend::frame()
|
||||||
{
|
{
|
||||||
// cycle states
|
// cycle states
|
||||||
g_last_state = g_curr_state;
|
Input::last_state = Input::state;
|
||||||
g_curr_state = g_next_state;
|
Input::state = g_next_state;
|
||||||
|
|
||||||
// copy state, clear pressed / released values
|
// copy state, clear pressed / released values
|
||||||
{
|
{
|
||||||
|
@ -75,14 +76,14 @@ void InputBackend::frame()
|
||||||
|
|
||||||
// update bindings
|
// update bindings
|
||||||
|
|
||||||
for (int i = 0; i < g_bindings.size(); i++)
|
for (int i = 0; i < g_buttons.size(); i++)
|
||||||
{
|
{
|
||||||
if (g_bindings[i].use_count() <= 0)
|
if (g_buttons[i].use_count() <= 0)
|
||||||
{
|
{
|
||||||
g_bindings.erase(i);
|
g_buttons.erase(i);
|
||||||
i--;
|
i--;
|
||||||
}
|
}
|
||||||
else if (auto binding = g_bindings[i].lock())
|
else if (auto binding = g_buttons[i].lock())
|
||||||
{
|
{
|
||||||
binding->update();
|
binding->update();
|
||||||
}
|
}
|
||||||
|
@ -245,184 +246,84 @@ void InputBackend::on_axis_move(int index, int axis, float value)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const InputState* Input::state()
|
bool KeyboardState::ctrl()
|
||||||
{
|
{
|
||||||
return &g_curr_state;
|
return down[Key::LeftControl] || down[Key::RightControl];
|
||||||
}
|
}
|
||||||
|
|
||||||
const InputState* Input::last_state()
|
bool KeyboardState::shift()
|
||||||
{
|
{
|
||||||
return &g_last_state;
|
return down[Key::LeftShift] || down[Key::RightShift];
|
||||||
|
}
|
||||||
|
|
||||||
|
bool KeyboardState::alt()
|
||||||
|
{
|
||||||
|
return down[Key::LeftAlt] || down[Key::RightAlt];
|
||||||
}
|
}
|
||||||
|
|
||||||
Vec2 Input::mouse()
|
Vec2 Input::mouse()
|
||||||
{
|
{
|
||||||
return g_curr_state.mouse.position;
|
return state.mouse.position;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Vec2 Input::mouse_draw()
|
Vec2 Input::mouse_draw()
|
||||||
{
|
{
|
||||||
return Vec2(g_curr_state.mouse.draw_position);
|
return state.mouse.draw_position;
|
||||||
}
|
}
|
||||||
|
|
||||||
Vec2 Input::mouse_screen()
|
Vec2 Input::mouse_screen()
|
||||||
{
|
{
|
||||||
return Vec2(g_curr_state.mouse.screen_position);
|
return state.mouse.screen_position;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Input::pressed(MouseButton button)
|
bool Input::pressed(MouseButton button)
|
||||||
{
|
{
|
||||||
int i = (int)button;
|
return state.mouse.pressed[button];
|
||||||
return i >= 0 && i < Blah::Input::max_mouse_buttons&& g_curr_state.mouse.pressed[i];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Input::down(MouseButton button)
|
bool Input::down(MouseButton button)
|
||||||
{
|
{
|
||||||
int i = (int)button;
|
return state.mouse.down[button];
|
||||||
return i >= 0 && i < Blah::Input::max_mouse_buttons&& g_curr_state.mouse.down[i];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Input::released(MouseButton button)
|
bool Input::released(MouseButton button)
|
||||||
{
|
{
|
||||||
int i = (int)button;
|
return state.mouse.released[button];
|
||||||
return i >= 0 && i < Blah::Input::max_mouse_buttons&& g_curr_state.mouse.released[i];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Point Input::mouse_wheel()
|
Point Input::mouse_wheel()
|
||||||
{
|
{
|
||||||
return g_curr_state.mouse.wheel;
|
return state.mouse.wheel;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Input::pressed(Key key)
|
bool Input::pressed(Key key)
|
||||||
{
|
{
|
||||||
int i = (int)key;
|
return state.keyboard.pressed[key];
|
||||||
return i > 0 && i < Blah::Input::max_keyboard_keys&& g_curr_state.keyboard.pressed[i];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Input::down(Key key)
|
bool Input::down(Key key)
|
||||||
{
|
{
|
||||||
int i = (int)key;
|
return state.keyboard.down[key];
|
||||||
return i > 0 && i < Blah::Input::max_keyboard_keys&& g_curr_state.keyboard.down[i];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Input::released(Key key)
|
bool Input::released(Key key)
|
||||||
{
|
{
|
||||||
int i = (int)key;
|
return state.keyboard.released[key];
|
||||||
return i > 0 && i < Blah::Input::max_keyboard_keys&& g_curr_state.keyboard.released[i];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Input::ctrl()
|
bool Input::ctrl()
|
||||||
{
|
{
|
||||||
return down(Key::LeftControl) || down(Key::RightControl);
|
return state.keyboard.ctrl();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Input::shift()
|
bool Input::shift()
|
||||||
{
|
{
|
||||||
return down(Key::LeftShift) || down(Key::RightShift);
|
return state.keyboard.shift();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Input::alt()
|
bool Input::alt()
|
||||||
{
|
{
|
||||||
return down(Key::LeftAlt) || down(Key::RightAlt);
|
return state.keyboard.alt();
|
||||||
}
|
|
||||||
|
|
||||||
const char* Input::text()
|
|
||||||
{
|
|
||||||
return g_curr_state.keyboard.text;
|
|
||||||
}
|
|
||||||
|
|
||||||
const ControllerState* Input::controller(int controllerIndex)
|
|
||||||
{
|
|
||||||
if (controllerIndex >= Blah::Input::max_controllers)
|
|
||||||
{
|
|
||||||
Log::warn("Trying to access a out-of-range controller at %i", controllerIndex);
|
|
||||||
return &g_empty_controller;
|
|
||||||
}
|
|
||||||
else if (!g_curr_state.controllers[controllerIndex].is_connected)
|
|
||||||
{
|
|
||||||
return &g_empty_controller;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return &g_curr_state.controllers[controllerIndex];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Input::pressed(int controllerIndex, Button button)
|
|
||||||
{
|
|
||||||
int i = (int)button;
|
|
||||||
if (controllerIndex < Blah::Input::max_controllers && i >= 0 && i < Blah::Input::max_controller_buttons)
|
|
||||||
return g_curr_state.controllers[controllerIndex].pressed[i];
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Input::down(int controllerIndex, Button button)
|
|
||||||
{
|
|
||||||
int i = (int)button;
|
|
||||||
if (controllerIndex < Blah::Input::max_controllers && i >= 0 && i < Blah::Input::max_controller_buttons)
|
|
||||||
return g_curr_state.controllers[controllerIndex].down[i];
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Input::released(int controllerIndex, Button button)
|
|
||||||
{
|
|
||||||
int i = (int)button;
|
|
||||||
if (controllerIndex < Blah::Input::max_controllers && i >= 0 && i < Blah::Input::max_controller_buttons)
|
|
||||||
return g_curr_state.controllers[controllerIndex].released[i];
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
float Input::axis_check(int controllerIndex, Axis axis)
|
|
||||||
{
|
|
||||||
int i = (int)axis;
|
|
||||||
if (controllerIndex < Blah::Input::max_controllers && i >= 0 && i < Blah::Input::max_controller_axis)
|
|
||||||
return g_curr_state.controllers[controllerIndex].axis[i];
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int Input::axis_check(int fallback, Key negative, Key positive)
|
|
||||||
{
|
|
||||||
if (Input::pressed(positive))
|
|
||||||
return 1;
|
|
||||||
else if (Input::pressed(negative))
|
|
||||||
return -1;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
bool pos = Input::down(positive);
|
|
||||||
bool neg = Input::down(negative);
|
|
||||||
|
|
||||||
if (pos && neg)
|
|
||||||
return fallback;
|
|
||||||
else if (pos)
|
|
||||||
return 1;
|
|
||||||
else if (neg)
|
|
||||||
return -1;
|
|
||||||
else
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int Input::axis_check(int fallback, int controllerIndex, Button negative, Button positive)
|
|
||||||
{
|
|
||||||
if (Input::pressed(controllerIndex, positive))
|
|
||||||
return 1;
|
|
||||||
else if (Input::pressed(controllerIndex, negative))
|
|
||||||
return -1;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
bool pos = Input::down(controllerIndex, positive);
|
|
||||||
bool neg = Input::down(controllerIndex, negative);
|
|
||||||
|
|
||||||
if (pos && neg)
|
|
||||||
return fallback;
|
|
||||||
else if (pos)
|
|
||||||
return 1;
|
|
||||||
else if (neg)
|
|
||||||
return -1;
|
|
||||||
else
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* Input::name_of(Key key)
|
const char* Input::name_of(Key key)
|
||||||
|
@ -449,10 +350,10 @@ const char* Input::name_of(Button button)
|
||||||
return "Unknown";
|
return "Unknown";
|
||||||
}
|
}
|
||||||
|
|
||||||
InputBindingRef Input::register_binding(const InputBinding& binding)
|
ButtonBindingRef Input::register_binding(const ButtonBinding& binding)
|
||||||
{
|
{
|
||||||
auto result = std::make_shared<InputBinding>(binding);
|
auto result = std::make_shared<ButtonBinding>(binding);
|
||||||
g_bindings.push_back(WeakRef<InputBinding>(result));
|
g_buttons.push_back(WeakRef<ButtonBinding>(result));
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -471,19 +372,19 @@ StickBindingRef Input::register_binding(const StickBinding& binding)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
InputBinding::TriggerBind::TriggerBind(Axis axis)
|
ButtonBinding::TriggerBind::TriggerBind(Axis axis)
|
||||||
: axis(axis)
|
: axis(axis)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
InputBinding::TriggerBind::TriggerBind(int controller, Axis axis, float threshold, bool positive)
|
ButtonBinding::TriggerBind::TriggerBind(int controller, Axis axis, float threshold, bool positive)
|
||||||
: controller(controller), axis(axis), threshold(threshold), positive(positive)
|
: controller(controller), axis(axis), threshold(threshold), positive(positive)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool InputBinding::TriggerBind::is_down(float axis_value) const
|
bool ButtonBinding::TriggerBind::is_down(float axis_value) const
|
||||||
{
|
{
|
||||||
if ((axis_value > 0 && positive) || (axis_value < 0 && !positive))
|
if ((axis_value > 0 && positive) || (axis_value < 0 && !positive))
|
||||||
{
|
{
|
||||||
|
@ -494,13 +395,13 @@ bool InputBinding::TriggerBind::is_down(float axis_value) const
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
InputBinding::ButtonBind::ButtonBind(Button button)
|
ButtonBinding::ButtonBind::ButtonBind(Button button)
|
||||||
: button(button) {}
|
: button(button) {}
|
||||||
|
|
||||||
InputBinding::ButtonBind::ButtonBind(int controller, Button button)
|
ButtonBinding::ButtonBind::ButtonBind(int controller, Button button)
|
||||||
: controller(controller), button(button) {}
|
: controller(controller), button(button) {}
|
||||||
|
|
||||||
bool InputBinding::pressed() const
|
bool ButtonBinding::pressed() const
|
||||||
{
|
{
|
||||||
if (m_press_consumed)
|
if (m_press_consumed)
|
||||||
return false;
|
return false;
|
||||||
|
@ -511,7 +412,7 @@ bool InputBinding::pressed() const
|
||||||
return m_pressed;
|
return m_pressed;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool InputBinding::released() const
|
bool ButtonBinding::released() const
|
||||||
{
|
{
|
||||||
if (m_release_consumed)
|
if (m_release_consumed)
|
||||||
return false;
|
return false;
|
||||||
|
@ -522,27 +423,27 @@ bool InputBinding::released() const
|
||||||
return m_released;
|
return m_released;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool InputBinding::down() const
|
bool ButtonBinding::down() const
|
||||||
{
|
{
|
||||||
return m_down;
|
return m_down;
|
||||||
}
|
}
|
||||||
|
|
||||||
float InputBinding::value() const
|
float ButtonBinding::value() const
|
||||||
{
|
{
|
||||||
return m_value;
|
return m_value;
|
||||||
}
|
}
|
||||||
|
|
||||||
int InputBinding::sign() const
|
int ButtonBinding::sign() const
|
||||||
{
|
{
|
||||||
return (int)Calc::sign(m_value);
|
return (int)Calc::sign(m_value);
|
||||||
}
|
}
|
||||||
|
|
||||||
double InputBinding::timestamp() const
|
double ButtonBinding::timestamp() const
|
||||||
{
|
{
|
||||||
return m_last_timestamp;
|
return m_last_timestamp;
|
||||||
}
|
}
|
||||||
|
|
||||||
void InputBinding::update()
|
void ButtonBinding::update()
|
||||||
{
|
{
|
||||||
m_press_consumed = false;
|
m_press_consumed = false;
|
||||||
m_release_consumed = false;
|
m_release_consumed = false;
|
||||||
|
@ -572,55 +473,55 @@ void InputBinding::update()
|
||||||
m_value = get_value();
|
m_value = get_value();
|
||||||
}
|
}
|
||||||
|
|
||||||
void InputBinding::consume_press()
|
void ButtonBinding::consume_press()
|
||||||
{
|
{
|
||||||
m_press_consumed = true;
|
m_press_consumed = true;
|
||||||
m_last_press_time = -1;
|
m_last_press_time = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void InputBinding::consume_release()
|
void ButtonBinding::consume_release()
|
||||||
{
|
{
|
||||||
m_release_consumed = true;
|
m_release_consumed = true;
|
||||||
m_last_release_time = -1;
|
m_last_release_time = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
InputBinding& InputBinding::add(Key key)
|
ButtonBinding& ButtonBinding::add(Key key)
|
||||||
{
|
{
|
||||||
keys.push_back(key);
|
keys.push_back(key);
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
InputBinding& InputBinding::add(ButtonBind button)
|
ButtonBinding& ButtonBinding::add(ButtonBind button)
|
||||||
{
|
{
|
||||||
buttons.push_back(button);
|
buttons.push_back(button);
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
InputBinding& InputBinding::add(TriggerBind trigger)
|
ButtonBinding& ButtonBinding::add(TriggerBind trigger)
|
||||||
{
|
{
|
||||||
triggers.push_back(trigger);
|
triggers.push_back(trigger);
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
InputBinding& InputBinding::add(MouseButton button)
|
ButtonBinding& ButtonBinding::add(MouseButton button)
|
||||||
{
|
{
|
||||||
mouse.push_back(button);
|
mouse.push_back(button);
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
InputBinding& InputBinding::add_left_trigger(int controller, float threshold)
|
ButtonBinding& ButtonBinding::add_left_trigger(int controller, float threshold)
|
||||||
{
|
{
|
||||||
triggers.push_back(TriggerBind(controller, Axis::LeftTrigger, threshold, true));
|
triggers.push_back(TriggerBind(controller, Axis::LeftTrigger, threshold, true));
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
InputBinding& InputBinding::add_right_trigger(int controller, float threshold)
|
ButtonBinding& ButtonBinding::add_right_trigger(int controller, float threshold)
|
||||||
{
|
{
|
||||||
triggers.push_back(TriggerBind(controller, Axis::RightTrigger, threshold, true));
|
triggers.push_back(TriggerBind(controller, Axis::RightTrigger, threshold, true));
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
InputBinding& InputBinding::set_controller(int index)
|
ButtonBinding& ButtonBinding::set_controller(int index)
|
||||||
{
|
{
|
||||||
for (auto& it : buttons)
|
for (auto& it : buttons)
|
||||||
it.controller = index;
|
it.controller = index;
|
||||||
|
@ -630,7 +531,7 @@ InputBinding& InputBinding::set_controller(int index)
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
void InputBinding::clear()
|
void ButtonBinding::clear()
|
||||||
{
|
{
|
||||||
keys.clear();
|
keys.clear();
|
||||||
buttons.clear();
|
buttons.clear();
|
||||||
|
@ -638,18 +539,18 @@ void InputBinding::clear()
|
||||||
mouse.clear();
|
mouse.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool InputBinding::get_pressed() const
|
bool ButtonBinding::get_pressed() const
|
||||||
{
|
{
|
||||||
for (auto& it : keys)
|
for (auto& it : keys)
|
||||||
if (Input::pressed(it))
|
if (Input::state.keyboard.pressed[it])
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
for (auto& it : mouse)
|
for (auto& it : mouse)
|
||||||
if (Input::pressed(it))
|
if (Input::state.mouse.pressed[it])
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
for (auto& it : buttons)
|
for (auto& it : buttons)
|
||||||
if (Input::pressed(it.controller, it.button))
|
if (Input::state.controllers[it.controller].pressed[it.button])
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
for (auto& it : triggers)
|
for (auto& it : triggers)
|
||||||
|
@ -660,26 +561,26 @@ bool InputBinding::get_pressed() const
|
||||||
if ((int)it.axis < 0 || (int)it.axis >= Input::max_controller_axis)
|
if ((int)it.axis < 0 || (int)it.axis >= Input::max_controller_axis)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (it.is_down(Input::state()->controllers[it.controller].axis[(int)it.axis]) &&
|
if (it.is_down(Input::state.controllers[it.controller].axis[(int)it.axis]) &&
|
||||||
!it.is_down(Input::last_state()->controllers[it.controller].axis[(int)it.axis]))
|
!it.is_down(Input::last_state.controllers[it.controller].axis[(int)it.axis]))
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool InputBinding::get_released() const
|
bool ButtonBinding::get_released() const
|
||||||
{
|
{
|
||||||
for (auto& it : keys)
|
for (auto& it : keys)
|
||||||
if (Input::released(it))
|
if (Input::state.keyboard.released[it])
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
for (auto& it : mouse)
|
for (auto& it : mouse)
|
||||||
if (Input::released(it))
|
if (Input::state.mouse.released[it])
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
for (auto& it : buttons)
|
for (auto& it : buttons)
|
||||||
if (Input::released(it.controller, it.button))
|
if (Input::state.controllers[it.controller].released[it.button])
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
for (auto& it : triggers)
|
for (auto& it : triggers)
|
||||||
|
@ -690,26 +591,26 @@ bool InputBinding::get_released() const
|
||||||
if ((int)it.axis < 0 || (int)it.axis >= Input::max_controller_axis)
|
if ((int)it.axis < 0 || (int)it.axis >= Input::max_controller_axis)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!it.is_down(Input::state()->controllers[it.controller].axis[(int)it.axis]) &&
|
if (!it.is_down(Input::state.controllers[it.controller].axis[(int)it.axis]) &&
|
||||||
it.is_down(Input::last_state()->controllers[it.controller].axis[(int)it.axis]))
|
it.is_down(Input::last_state.controllers[it.controller].axis[(int)it.axis]))
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool InputBinding::get_down() const
|
bool ButtonBinding::get_down() const
|
||||||
{
|
{
|
||||||
for (auto& it : keys)
|
for (auto& it : keys)
|
||||||
if (Input::down(it))
|
if (Input::state.keyboard.down[it])
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
for (auto& it : mouse)
|
for (auto& it : mouse)
|
||||||
if (Input::down(it))
|
if (Input::state.mouse.down[it])
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
for (auto& it : buttons)
|
for (auto& it : buttons)
|
||||||
if (Input::down(it.controller, it.button))
|
if (Input::state.controllers[it.controller].down[it.button])
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
for (auto& it : triggers)
|
for (auto& it : triggers)
|
||||||
|
@ -720,25 +621,25 @@ bool InputBinding::get_down() const
|
||||||
if ((int)it.axis < 0 || (int)it.axis >= Input::max_controller_axis)
|
if ((int)it.axis < 0 || (int)it.axis >= Input::max_controller_axis)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (it.is_down(Input::state()->controllers[it.controller].axis[(int)it.axis]))
|
if (it.is_down(Input::state.controllers[it.controller].axis[(int)it.axis]))
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
float InputBinding::get_value() const
|
float ButtonBinding::get_value() const
|
||||||
{
|
{
|
||||||
for (auto& it : keys)
|
for (auto& it : keys)
|
||||||
if (Input::down(it))
|
if (Input::state.keyboard.down[it])
|
||||||
return 1.0f;
|
return 1.0f;
|
||||||
|
|
||||||
for (auto& it : mouse)
|
for (auto& it : mouse)
|
||||||
if (Input::down(it))
|
if (Input::state.mouse.down[it])
|
||||||
return 1.0f;
|
return 1.0f;
|
||||||
|
|
||||||
for (auto& it : buttons)
|
for (auto& it : buttons)
|
||||||
if (Input::down(it.controller, it.button))
|
if (Input::state.controllers[it.controller].down[it.button])
|
||||||
return 1.0f;
|
return 1.0f;
|
||||||
|
|
||||||
float highest = 0;
|
float highest = 0;
|
||||||
|
@ -751,7 +652,7 @@ float InputBinding::get_value() const
|
||||||
if ((int)it.axis < 0 || (int)it.axis >= Input::max_controller_axis)
|
if ((int)it.axis < 0 || (int)it.axis >= Input::max_controller_axis)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
float raw_value = Input::state()->controllers[it.controller].axis[(int)it.axis];
|
float raw_value = Input::state.controllers[it.controller].axis[(int)it.axis];
|
||||||
|
|
||||||
if (it.is_down(raw_value))
|
if (it.is_down(raw_value))
|
||||||
{
|
{
|
||||||
|
@ -828,29 +729,29 @@ void AxisBinding::consume_release()
|
||||||
|
|
||||||
AxisBinding& AxisBinding::add_left_stick_x(int controller, float threshold)
|
AxisBinding& AxisBinding::add_left_stick_x(int controller, float threshold)
|
||||||
{
|
{
|
||||||
negative.add(InputBinding::TriggerBind(controller, Axis::LeftX, threshold, false));
|
negative.add(ButtonBinding::TriggerBind(controller, Axis::LeftX, threshold, false));
|
||||||
positive.add(InputBinding::TriggerBind(controller, Axis::LeftX, threshold, true));
|
positive.add(ButtonBinding::TriggerBind(controller, Axis::LeftX, threshold, true));
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
AxisBinding& AxisBinding::add_left_stick_y(int controller, float threshold)
|
AxisBinding& AxisBinding::add_left_stick_y(int controller, float threshold)
|
||||||
{
|
{
|
||||||
negative.add(InputBinding::TriggerBind(controller, Axis::LeftY, threshold, false));
|
negative.add(ButtonBinding::TriggerBind(controller, Axis::LeftY, threshold, false));
|
||||||
positive.add(InputBinding::TriggerBind(controller, Axis::LeftY, threshold, true));
|
positive.add(ButtonBinding::TriggerBind(controller, Axis::LeftY, threshold, true));
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
AxisBinding& AxisBinding::add_right_stick_x(int controller, float threshold)
|
AxisBinding& AxisBinding::add_right_stick_x(int controller, float threshold)
|
||||||
{
|
{
|
||||||
negative.add(InputBinding::TriggerBind(controller, Axis::RightX, threshold, false));
|
negative.add(ButtonBinding::TriggerBind(controller, Axis::RightX, threshold, false));
|
||||||
positive.add(InputBinding::TriggerBind(controller, Axis::RightX, threshold, true));
|
positive.add(ButtonBinding::TriggerBind(controller, Axis::RightX, threshold, true));
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
AxisBinding& AxisBinding::add_right_stick_y(int controller, float threshold)
|
AxisBinding& AxisBinding::add_right_stick_y(int controller, float threshold)
|
||||||
{
|
{
|
||||||
negative.add(InputBinding::TriggerBind(controller, Axis::RightY, threshold, false));
|
negative.add(ButtonBinding::TriggerBind(controller, Axis::RightY, threshold, false));
|
||||||
positive.add(InputBinding::TriggerBind(controller, Axis::RightY, threshold, true));
|
positive.add(ButtonBinding::TriggerBind(controller, Axis::RightY, threshold, true));
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -901,10 +802,10 @@ void StickBinding::consume_release()
|
||||||
|
|
||||||
StickBinding& StickBinding::add_dpad(int controller)
|
StickBinding& StickBinding::add_dpad(int controller)
|
||||||
{
|
{
|
||||||
x.negative.add(InputBinding::ButtonBind(controller, Button::Left));
|
x.negative.add(ButtonBinding::ButtonBind(controller, Button::Left));
|
||||||
x.positive.add(InputBinding::ButtonBind(controller, Button::Right));
|
x.positive.add(ButtonBinding::ButtonBind(controller, Button::Right));
|
||||||
y.negative.add(InputBinding::ButtonBind(controller, Button::Up));
|
y.negative.add(ButtonBinding::ButtonBind(controller, Button::Up));
|
||||||
y.positive.add(InputBinding::ButtonBind(controller, Button::Down));
|
y.positive.add(ButtonBinding::ButtonBind(controller, Button::Down));
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user