Rename Input to input_system and move to prism namespace
This commit is contained in:
parent
bae6d05184
commit
653d5bb6ca
5 changed files with 103 additions and 124 deletions
|
@ -16,7 +16,6 @@ namespace ui {
|
||||||
}
|
}
|
||||||
|
|
||||||
class Scene;
|
class Scene;
|
||||||
class Input;
|
|
||||||
class Renderer;
|
class Renderer;
|
||||||
class RenderTarget;
|
class RenderTarget;
|
||||||
class Physics;
|
class Physics;
|
||||||
|
@ -25,6 +24,7 @@ struct Timer;
|
||||||
namespace prism {
|
namespace prism {
|
||||||
class app;
|
class app;
|
||||||
class imgui_backend;
|
class imgui_backend;
|
||||||
|
class input_system;
|
||||||
|
|
||||||
struct AnimationTarget {
|
struct AnimationTarget {
|
||||||
float current_time = 0.0f;
|
float current_time = 0.0f;
|
||||||
|
@ -114,7 +114,7 @@ namespace prism {
|
||||||
/** Get the input system.
|
/** Get the input system.
|
||||||
@return Instance of the input system. Will not be null.
|
@return Instance of the input system. Will not be null.
|
||||||
*/
|
*/
|
||||||
Input* get_input();
|
input_system* get_input();
|
||||||
|
|
||||||
/** Get the renderer for a window.
|
/** Get the renderer for a window.
|
||||||
@param index Index of the window. Default is 0.
|
@param index Index of the window. Default is 0.
|
||||||
|
@ -371,7 +371,7 @@ namespace prism {
|
||||||
app* app = nullptr;
|
app* app = nullptr;
|
||||||
GFX* gfx = nullptr;
|
GFX* gfx = nullptr;
|
||||||
|
|
||||||
std::unique_ptr<Input> input;
|
std::unique_ptr<input_system> input;
|
||||||
std::unique_ptr<Physics> physics;
|
std::unique_ptr<Physics> physics;
|
||||||
std::unique_ptr<Renderer> renderer;
|
std::unique_ptr<Renderer> renderer;
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,8 @@
|
||||||
|
|
||||||
#include "platform.hpp"
|
#include "platform.hpp"
|
||||||
|
|
||||||
enum class Axis {
|
namespace prism {
|
||||||
|
enum class axis {
|
||||||
MouseX,
|
MouseX,
|
||||||
MouseY,
|
MouseY,
|
||||||
|
|
||||||
|
@ -19,11 +20,11 @@ enum class Axis {
|
||||||
RightStickY
|
RightStickY
|
||||||
};
|
};
|
||||||
|
|
||||||
struct InputBindingData {
|
struct input_binding {
|
||||||
std::string name;
|
std::string name;
|
||||||
std::map<InputButton, float> buttons;
|
std::map<InputButton, float> buttons;
|
||||||
|
|
||||||
std::vector<Axis> axises;
|
std::vector<axis> axises;
|
||||||
|
|
||||||
float value = 0.0f;
|
float value = 0.0f;
|
||||||
|
|
||||||
|
@ -33,7 +34,7 @@ struct InputBindingData {
|
||||||
|
|
||||||
/** Input system designed for handling events in a cross platform manner and across different input types.
|
/** Input system designed for handling events in a cross platform manner and across different input types.
|
||||||
*/
|
*/
|
||||||
class Input {
|
class input_system {
|
||||||
public:
|
public:
|
||||||
/// Updates input bindings and their values.
|
/// Updates input bindings and their values.
|
||||||
void update();
|
void update();
|
||||||
|
@ -54,7 +55,7 @@ public:
|
||||||
@param name The binding name.
|
@param name The binding name.
|
||||||
@param button The axis to associate with.
|
@param button The axis to associate with.
|
||||||
*/
|
*/
|
||||||
void add_binding_axis(const std::string& name, Axis axis);
|
void add_binding_axis(const std::string &name, axis axis);
|
||||||
|
|
||||||
/** Gets the input value of a binding.
|
/** Gets the input value of a binding.
|
||||||
@param name The binding name.
|
@param name The binding name.
|
||||||
|
@ -78,9 +79,10 @@ public:
|
||||||
bool is_repeating(const std::string &name);
|
bool is_repeating(const std::string &name);
|
||||||
|
|
||||||
/// Returns all of the bindings registered with this Input system.
|
/// Returns all of the bindings registered with this Input system.
|
||||||
std::vector<InputBindingData> get_bindings() const;
|
[[nodiscard]] std::vector<input_binding> get_bindings() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::vector<InputBindingData> _input_bindings;
|
std::vector<input_binding> _input_bindings;
|
||||||
std::tuple<int, int> _last_cursor_position;
|
std::tuple<int, int> _last_cursor_position;
|
||||||
};
|
};
|
||||||
|
}
|
|
@ -42,7 +42,7 @@ engine::engine(const int argc, char* argv[]) {
|
||||||
for(int i = 0; i < argc; i++)
|
for(int i = 0; i < argc; i++)
|
||||||
command_line_arguments.emplace_back(argv[i]);
|
command_line_arguments.emplace_back(argv[i]);
|
||||||
|
|
||||||
input = std::make_unique<Input>();
|
input = std::make_unique<input_system>();
|
||||||
physics = std::make_unique<Physics>();
|
physics = std::make_unique<Physics>();
|
||||||
imgui = std::make_unique<prism::imgui_backend>();
|
imgui = std::make_unique<prism::imgui_backend>();
|
||||||
assetm = std::make_unique<AssetManager>();
|
assetm = std::make_unique<AssetManager>();
|
||||||
|
@ -108,7 +108,7 @@ GFX* engine::get_gfx() {
|
||||||
return gfx;
|
return gfx;
|
||||||
}
|
}
|
||||||
|
|
||||||
Input* engine::get_input() {
|
prism::input_system* engine::get_input() {
|
||||||
return input.get();
|
return input.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,8 @@
|
||||||
#include "engine.hpp"
|
#include "engine.hpp"
|
||||||
#include "log.hpp"
|
#include "log.hpp"
|
||||||
|
|
||||||
|
using prism::input_system;
|
||||||
|
|
||||||
bool is_in_range(int value, int cond, int range) {
|
bool is_in_range(int value, int cond, int range) {
|
||||||
int low = cond - range;
|
int low = cond - range;
|
||||||
int high = cond + range;
|
int high = cond + range;
|
||||||
|
@ -12,7 +14,7 @@ bool is_in_range(int value, int cond, int range) {
|
||||||
return value >= low && value <= high;
|
return value >= low && value <= high;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Input::update() {
|
void input_system::update() {
|
||||||
const auto& [x, y] = platform::get_cursor_position();
|
const auto& [x, y] = platform::get_cursor_position();
|
||||||
auto& [oldX, oldY] = _last_cursor_position;
|
auto& [oldX, oldY] = _last_cursor_position;
|
||||||
|
|
||||||
|
@ -72,28 +74,28 @@ void Input::update() {
|
||||||
float nextValue = 0.0f;
|
float nextValue = 0.0f;
|
||||||
|
|
||||||
switch (axis) {
|
switch (axis) {
|
||||||
case Axis::MouseX:
|
case axis::MouseX:
|
||||||
nextValue = xDelta;
|
nextValue = xDelta;
|
||||||
break;
|
break;
|
||||||
case Axis::MouseY:
|
case axis::MouseY:
|
||||||
nextValue = yDelta;
|
nextValue = yDelta;
|
||||||
break;
|
break;
|
||||||
case Axis::ScrollX:
|
case axis::ScrollX:
|
||||||
nextValue = sx;
|
nextValue = sx;
|
||||||
break;
|
break;
|
||||||
case Axis::ScrollY:
|
case axis::ScrollY:
|
||||||
nextValue = sy;
|
nextValue = sy;
|
||||||
break;
|
break;
|
||||||
case Axis::LeftStickX:
|
case axis::LeftStickX:
|
||||||
nextValue = lx;
|
nextValue = lx;
|
||||||
break;
|
break;
|
||||||
case Axis::LeftStickY:
|
case axis::LeftStickY:
|
||||||
nextValue = ly;
|
nextValue = ly;
|
||||||
break;
|
break;
|
||||||
case Axis::RightStickX:
|
case axis::RightStickX:
|
||||||
nextValue = rx;
|
nextValue = rx;
|
||||||
break;
|
break;
|
||||||
case Axis::RightStickY:
|
case axis::RightStickY:
|
||||||
nextValue = ry;
|
nextValue = ry;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -104,21 +106,21 @@ void Input::update() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Input::add_binding(const std::string& name) {
|
void input_system::add_binding(const std::string& name) {
|
||||||
InputBindingData data;
|
input_binding data;
|
||||||
data.name = name;
|
data.name = name;
|
||||||
|
|
||||||
_input_bindings.push_back(data);
|
_input_bindings.push_back(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Input::add_binding_button(const std::string& name, InputButton key, float value) {
|
void input_system::add_binding_button(const std::string& name, InputButton key, float value) {
|
||||||
for (auto& binding : _input_bindings) {
|
for (auto& binding : _input_bindings) {
|
||||||
if (binding.name == name)
|
if (binding.name == name)
|
||||||
binding.buttons[key] = value;
|
binding.buttons[key] = value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Input::add_binding_axis(const std::string& name, Axis axis) {
|
void input_system::add_binding_axis(const std::string& name, axis axis) {
|
||||||
for (auto& binding : _input_bindings) {
|
for (auto& binding : _input_bindings) {
|
||||||
if (binding.name == name) {
|
if (binding.name == name) {
|
||||||
binding.axises.push_back(axis);
|
binding.axises.push_back(axis);
|
||||||
|
@ -126,7 +128,7 @@ void Input::add_binding_axis(const std::string& name, Axis axis) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
float Input::get_value(const std::string& name) {
|
float input_system::get_value(const std::string& name) {
|
||||||
for (auto& binding : _input_bindings) {
|
for (auto& binding : _input_bindings) {
|
||||||
if (binding.name == name) {
|
if (binding.name == name) {
|
||||||
return binding.value;
|
return binding.value;
|
||||||
|
@ -136,11 +138,11 @@ float Input::get_value(const std::string& name) {
|
||||||
return 0.0f;
|
return 0.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Input::is_pressed(const std::string &name, bool repeating) {
|
bool input_system::is_pressed(const std::string &name, bool repeating) {
|
||||||
return get_value(name) == 1.0 && (repeating ? true : !is_repeating(name));
|
return get_value(name) == 1.0 && (repeating ? true : !is_repeating(name));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Input::is_repeating(const std::string& name) {
|
bool input_system::is_repeating(const std::string& name) {
|
||||||
for (auto& binding : _input_bindings) {
|
for (auto& binding : _input_bindings) {
|
||||||
if (binding.name == name) {
|
if (binding.name == name) {
|
||||||
return binding.repeat;
|
return binding.repeat;
|
||||||
|
@ -150,6 +152,6 @@ bool Input::is_repeating(const std::string& name) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<InputBindingData> Input::get_bindings() const {
|
std::vector<prism::input_binding> input_system::get_bindings() const {
|
||||||
return _input_bindings;
|
return _input_bindings;
|
||||||
}
|
}
|
||||||
|
|
|
@ -65,7 +65,7 @@ CommonEditor::CommonEditor(std::string id) : id(id) {
|
||||||
|
|
||||||
load_options();
|
load_options();
|
||||||
|
|
||||||
Input* input = engine->get_input();
|
auto input = engine->get_input();
|
||||||
input->add_binding("movementX");
|
input->add_binding("movementX");
|
||||||
input->add_binding("movementY");
|
input->add_binding("movementY");
|
||||||
|
|
||||||
|
@ -78,8 +78,8 @@ CommonEditor::CommonEditor(std::string id) : id(id) {
|
||||||
input->add_binding("lookX");
|
input->add_binding("lookX");
|
||||||
input->add_binding("lookY");
|
input->add_binding("lookY");
|
||||||
|
|
||||||
input->add_binding_axis("lookX", Axis::MouseX);
|
input->add_binding_axis("lookX", prism::axis::MouseX);
|
||||||
input->add_binding_axis("lookY", Axis::MouseY);
|
input->add_binding_axis("lookY", prism::axis::MouseY);
|
||||||
|
|
||||||
input->add_binding("cameraLook");
|
input->add_binding("cameraLook");
|
||||||
input->add_binding_button("cameraLook", InputButton::MouseRight);
|
input->add_binding_button("cameraLook", InputButton::MouseRight);
|
||||||
|
@ -96,31 +96,6 @@ static float yaw = 0.0f;
|
||||||
static float pitch = 0.0f;
|
static float pitch = 0.0f;
|
||||||
static bool willCaptureMouse = false;
|
static bool willCaptureMouse = false;
|
||||||
|
|
||||||
struct Ray {
|
|
||||||
Vector3 origin, direction;
|
|
||||||
float t;
|
|
||||||
};
|
|
||||||
|
|
||||||
// from https://nelari.us/post/gizmos/
|
|
||||||
float closest_distance_between_lines(Ray& l1, Ray& l2) {
|
|
||||||
const Vector3 dp = l2.origin - l1.origin;
|
|
||||||
const float v12 = dot(l1.direction, l1.direction);
|
|
||||||
const float v22 = dot(l2.direction, l2.direction);
|
|
||||||
const float v1v2 = dot(l1.direction, l2.direction);
|
|
||||||
|
|
||||||
const float det = v1v2 * v1v2 - v12 * v22;
|
|
||||||
|
|
||||||
const float inv_det = 10.f / det;
|
|
||||||
|
|
||||||
const float dpv1 = dot(dp, l1.direction);
|
|
||||||
const float dpv2 = dot(dp, l2.direction);
|
|
||||||
|
|
||||||
l1.t = inv_det * (v22 * dpv1 - v1v2 * dpv2);
|
|
||||||
l2.t = inv_det * (v1v2 * dpv1 - v12 * dpv2);
|
|
||||||
|
|
||||||
return length(dp + l2.direction * l2.t - l1.direction * l1.t);
|
|
||||||
}
|
|
||||||
|
|
||||||
static float previous_intersect = 0.0;
|
static float previous_intersect = 0.0;
|
||||||
|
|
||||||
void CommonEditor::update(float deltaTime) {
|
void CommonEditor::update(float deltaTime) {
|
||||||
|
@ -197,14 +172,14 @@ void CommonEditor::update(float deltaTime) {
|
||||||
Vector4 ray_end = view_proj_inverse * Vector4(n.x, n.y, 1.0f, 1.0f);
|
Vector4 ray_end = view_proj_inverse * Vector4(n.x, n.y, 1.0f, 1.0f);
|
||||||
ray_end *= 1.0f / ray_end.w;
|
ray_end *= 1.0f / ray_end.w;
|
||||||
|
|
||||||
Ray camera_ray;
|
ray camera_ray;
|
||||||
camera_ray.origin = ray_start.xyz;
|
camera_ray.origin = ray_start.xyz;
|
||||||
camera_ray.direction = normalize(ray_end.xyz - ray_start.xyz);
|
camera_ray.direction = normalize(ray_end.xyz - ray_start.xyz);
|
||||||
camera_ray.t = std::numeric_limits<float>::max();
|
camera_ray.t = std::numeric_limits<float>::max();
|
||||||
|
|
||||||
auto& transform = engine->get_scene()->get<Transform>(selected_object);
|
auto& transform = engine->get_scene()->get<Transform>(selected_object);
|
||||||
|
|
||||||
Ray transform_ray;
|
ray transform_ray;
|
||||||
transform_ray.origin = last_object_position;
|
transform_ray.origin = last_object_position;
|
||||||
transform_ray.t = std::numeric_limits<float>::max();
|
transform_ray.t = std::numeric_limits<float>::max();
|
||||||
|
|
||||||
|
|
Reference in a new issue