light/modules/input/private/input.cpp
light7734 2b96a85b62
Some checks reported errors
continuous-integration/drone/push Build was killed
feat: systems
feat: surface system

This commit puts the project in major jeopardy as it overhauls the
architecture such as removing the layer stack completely, etc.

I am filled with determination.
2025-07-26 18:01:27 +03:30

159 lines
3 KiB
C++

#include <imgui.h>
#include <input/input.hpp>
#include <logger/logger.hpp>
namespace lt {
Input::Input(): m_mouse_position {}, m_mouse_delta {}
{
restart_input_state();
}
void Input::receive_user_interface_events_impl(bool receive, bool toggle /* = false */)
{
m_user_interface_events = toggle ? !m_user_interface_events : receive;
}
void Input::receieve_game_events_impl(bool receive, bool toggle /*= false*/)
{
auto prev = m_game_events;
m_game_events = toggle ? !m_user_interface_events : receive;
if (m_game_events != prev)
{
restart_input_state();
}
}
void Input::restart_input_state()
{
m_keyboad_keys.fill(false);
m_mouse_buttons.fill(false);
m_mouse_position = math::vec2(0.0f);
m_mouse_delta = math::vec2(0.0f);
m_mouse_wheel_delta = 0.0f;
}
void Input::on_event(const Event &inputEvent)
{
auto &io = ImGui::GetIO();
switch (inputEvent.get_event_type())
{
//** MOUSE_EVENTS **//
case EventType::MouseMoved:
{
const auto &event = dynamic_cast<const MouseMovedEvent &>(inputEvent);
if (m_game_events)
{
m_mouse_delta = event.get_position() - m_mouse_position;
m_mouse_position = event.get_position();
}
if (m_user_interface_events)
{
io.MousePos = ImVec2(event.get_x(), event.get_y());
}
return;
}
case EventType::ButtonPressed:
{
const auto &event = dynamic_cast<const ButtonPressedEvent &>(inputEvent);
if (m_game_events)
{
m_mouse_buttons[event.get_button()] = true;
}
if (m_user_interface_events)
{
io.MouseDown[event.get_button()] = true;
}
return;
}
case EventType::ButtonReleased:
{
const auto &event = dynamic_cast<const ButtonReleasedEvent &>(inputEvent);
if (m_game_events)
{
m_mouse_buttons[event.get_button()] = false;
}
if (m_user_interface_events)
{
io.MouseDown[event.get_button()] = false;
}
return;
}
case EventType::WheelScrolled:
{
const auto &event = dynamic_cast<const WheelScrolledEvent &>(inputEvent);
if (m_game_events)
{
m_mouse_wheel_delta = event.get_offset();
}
if (m_user_interface_events)
{
io.MouseWheel = event.get_offset();
}
return;
}
//** KEYBOARD_EVENTS **//
case EventType::KeyPressed:
{
const auto &event = dynamic_cast<const KeyPressedEvent &>(inputEvent);
if (m_game_events)
{
m_keyboad_keys[event.get_key()] = true;
}
if (m_user_interface_events)
{
// io.AddKeyEvent(event.get_key(), true);
// if (event.get_key() == Key::BackSpace)
// io.AddInputCharacter(Key::BackSpace);
}
return;
}
case EventType::KeyReleased:
{
const auto &event = dynamic_cast<const KeyReleasedEvent &>(inputEvent);
if (m_game_events)
{
m_keyboad_keys[event.get_key()] = false;
}
if (m_user_interface_events)
{
// io.AddKeyEvent(event.get_key(), false);
}
return;
}
case EventType::SetChar:
{
if (m_user_interface_events)
{
const auto &event = dynamic_cast<const SetCharEvent &>(inputEvent);
io.AddInputCharacter(event.get_character());
}
return;
}
default: log_trc("Dropped event");
}
}
} // namespace lt