engine/include/input_manager.hpp

93 lines
2.5 KiB
C++
Raw Normal View History

2022-09-02 11:06:59 +00:00
#pragma once
2022-09-07 09:02:01 +00:00
#include "engine_api.h"
2022-09-02 23:02:09 +00:00
2022-09-02 11:06:59 +00:00
#include "inputs/mouse.hpp"
#include "inputs/keyboard.hpp"
#include <vector>
#include <array>
#include <string>
2022-10-02 15:34:51 +00:00
namespace engine {
2022-09-02 11:06:59 +00:00
2022-10-02 15:34:51 +00:00
class Window;
2022-09-02 11:06:59 +00:00
2022-10-02 15:34:51 +00:00
enum class InputDevice : int {
MOUSE,
KEYBOARD,
CONTROLLER,
SIZE
};
2022-09-02 11:06:59 +00:00
2022-10-02 15:34:51 +00:00
// This class should be used to get platform/input-device independent input
2022-11-29 14:22:03 +00:00
class ENGINE_API InputManager {
2022-09-02 11:06:59 +00:00
2022-10-02 15:34:51 +00:00
public:
2022-09-02 11:06:59 +00:00
2022-10-02 15:34:51 +00:00
// requires a window reference to get input from
2022-11-29 14:22:03 +00:00
InputManager(const Window* win);
InputManager(const InputManager&) = delete;
InputManager& operator=(const InputManager&) = delete;
~InputManager();
2022-09-02 11:06:59 +00:00
2022-10-02 15:34:51 +00:00
// Add a mouse input
void addInputButton(const std::string& name, inputs::MouseButton button);
void addInputAxis(const std::string& name, inputs::MouseAxis axis);
void addInputButtonAsAxis(const std::string& name, inputs::MouseButton high, inputs::MouseButton low);
// Add a keyboard input
void addInputButton(const std::string& name, inputs::Key button);
void addInputButtonAsAxis(const std::string& name, inputs::Key high, inputs::Key low);
2022-09-02 11:06:59 +00:00
2022-10-02 15:34:51 +00:00
void delInputButton(int index);
void delInputAxis(int index);
2022-09-02 11:06:59 +00:00
2022-10-02 15:34:51 +00:00
void setDeviceActive(enum InputDevice device, bool active);
bool getDeviceActive(enum InputDevice device) const;
2022-09-02 11:06:59 +00:00
2022-10-02 15:34:51 +00:00
float getAxis(const std::string& axisName) const;
bool getButton(const std::string& buttonName) const;
bool getButtonPress(const std::string& buttonName) const;
bool getButtonRelease(const std::string& buttonName) const;
2022-09-02 11:06:59 +00:00
2022-10-02 15:34:51 +00:00
private:
2022-09-02 11:06:59 +00:00
2022-10-02 15:34:51 +00:00
struct ButtonEntry {
std::string name;
enum InputDevice device;
int button; // enumeration of device buttons or axes
};
2022-09-02 11:06:59 +00:00
2022-10-02 15:34:51 +00:00
struct AxisEntry {
std::string name;
enum InputDevice device;
int axis;
bool isButtonAxis;
int high;
int low;
};
2022-09-02 11:06:59 +00:00
2022-11-29 14:22:03 +00:00
const Window* const m_win;
2022-09-02 11:06:59 +00:00
2022-10-02 15:34:51 +00:00
std::vector<struct ButtonEntry> m_buttonEntries;
std::vector<struct AxisEntry> m_axisEntries;
2022-09-02 11:06:59 +00:00
2022-10-02 15:34:51 +00:00
std::array<bool, static_cast<int>(InputDevice::SIZE)> m_enabledDevices;
2022-09-02 11:06:59 +00:00
2022-10-02 15:34:51 +00:00
// private methods
2022-09-02 11:06:59 +00:00
2022-10-02 15:34:51 +00:00
float getDeviceAxis(enum InputDevice device, int axis) const;
bool getDeviceButton(enum InputDevice device, int button) const;
bool getDeviceButtonDown(enum InputDevice device, int button) const;
bool getDeviceButtonUp(enum InputDevice device, int button) const;
2022-09-02 11:06:59 +00:00
2022-10-02 15:34:51 +00:00
float getButtonAxis(enum InputDevice device, int high, int low) const;
void addInputButton(const std::string& name, InputDevice device, int button);
void addInputAxis(const std::string& name, InputDevice device, int axis);
void addInputButtonAsAxis(const std::string& name, InputDevice device, int high, int low);
};
2022-09-02 11:06:59 +00:00
2022-10-02 15:34:51 +00:00
}