Program Listing for File keyboard_mouse_data.hpp

Return to documentation for file (inexor/vulkan-renderer/input/keyboard_mouse_data.hpp)

#pragma once

#include <GLFW/glfw3.h>

#include <array>
#include <shared_mutex>

namespace inexor::vulkan_renderer::input {

class KeyboardMouseInputData {
private:
    std::array<std::int64_t, 2> m_previous_cursor_pos{0, 0};
    std::array<std::int64_t, 2> m_current_cursor_pos{0, 0};
    std::array<bool, GLFW_KEY_LAST> m_pressed_keys{false};
    std::array<bool, GLFW_MOUSE_BUTTON_LAST> m_pressed_mouse_buttons{false};
    bool m_keyboard_updated{false};
    bool m_mouse_buttons_updated{false};
    mutable std::shared_mutex m_input_mutex;

public:
    KeyboardMouseInputData() = default;
    KeyboardMouseInputData(const KeyboardMouseInputData &) = delete;
    KeyboardMouseInputData(KeyboardMouseInputData &&) = delete;
    ~KeyboardMouseInputData() = default;

    KeyboardMouseInputData &operator=(const KeyboardMouseInputData &) = delete;
    KeyboardMouseInputData &operator=(KeyboardMouseInputData &&) = delete;

    void press_key(std::int32_t key);

    void release_key(std::int32_t key);

    [[nodiscard]] bool is_key_pressed(std::int32_t key) const;

    [[nodiscard]] bool was_key_pressed_once(std::int32_t key);

    void press_mouse_button(std::int32_t button);

    void release_mouse_button(std::int32_t button);

    [[nodiscard]] bool is_mouse_button_pressed(std::int32_t button) const;

    [[nodiscard]] bool was_mouse_button_pressed_once(std::int32_t button);

    void set_cursor_pos(double pos_x, double pos_y);

    [[nodiscard]] std::array<std::int64_t, 2> get_cursor_pos() const;

    [[nodiscard]] std::array<double, 2> calculate_cursor_position_delta();
};

} // namespace inexor::vulkan_renderer::input