freed the cursor while camera is locked
This commit is contained in:
parent
127726ec23
commit
5449b912dd
|
@ -2,6 +2,7 @@
|
||||||
#include "focus.hpp"
|
#include "focus.hpp"
|
||||||
#include "../camera.hpp"
|
#include "../camera.hpp"
|
||||||
#include "../../util/math.hpp"
|
#include "../../util/math.hpp"
|
||||||
|
#include "mouse.hpp"
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
|
@ -11,13 +12,23 @@
|
||||||
using namespace sim::graphics;
|
using namespace sim::graphics;
|
||||||
|
|
||||||
static std::unique_ptr<focus::focus_t> state = nullptr;
|
static std::unique_ptr<focus::focus_t> state = nullptr;
|
||||||
|
static bool mouse_visible = false;
|
||||||
|
static bool mouse_locked = false;
|
||||||
static bool triggered = false;
|
static bool triggered = false;
|
||||||
|
|
||||||
void focus::on_keypress(int key, int sc, int action, int mods)
|
void focus::on_keypress(int key, int sc, int action, int mods)
|
||||||
{
|
{
|
||||||
if(key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
|
if(key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
|
||||||
{
|
{
|
||||||
state = nullptr;
|
if(is_mouse_locked())
|
||||||
|
{
|
||||||
|
clear_mouse_locked();
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mouse_locked = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(state)
|
if(state)
|
||||||
|
@ -59,6 +70,23 @@ void focus::update()
|
||||||
{
|
{
|
||||||
triggered = false;
|
triggered = false;
|
||||||
|
|
||||||
|
bool locked = is_mouse_locked();
|
||||||
|
|
||||||
|
if(locked != mouse_visible)
|
||||||
|
{
|
||||||
|
if(locked)
|
||||||
|
{
|
||||||
|
mouse::show_cursor();
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mouse::hide_cursor();
|
||||||
|
}
|
||||||
|
|
||||||
|
mouse_visible = locked;
|
||||||
|
}
|
||||||
|
|
||||||
if(state)
|
if(state)
|
||||||
{
|
{
|
||||||
state->update();
|
state->update();
|
||||||
|
@ -70,11 +98,22 @@ bool focus::is_focused()
|
||||||
return (state != nullptr);
|
return (state != nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void focus::clear()
|
void focus::clear_focus()
|
||||||
{
|
{
|
||||||
state = nullptr;
|
state = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool focus::is_mouse_locked()
|
||||||
|
{
|
||||||
|
return is_focused() || mouse_locked;
|
||||||
|
}
|
||||||
|
|
||||||
|
void focus::clear_mouse_locked()
|
||||||
|
{
|
||||||
|
mouse_locked = false;
|
||||||
|
state = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
void focus::set(std::unique_ptr<focus_t> f)
|
void focus::set(std::unique_ptr<focus_t> f)
|
||||||
{
|
{
|
||||||
state = std::move(f);
|
state = std::move(f);
|
||||||
|
|
|
@ -16,9 +16,11 @@ struct focus_t
|
||||||
virtual void update() { }
|
virtual void update() { }
|
||||||
};
|
};
|
||||||
|
|
||||||
void clear();
|
|
||||||
bool is_focused();
|
bool is_focused();
|
||||||
|
void clear_focus();
|
||||||
bool is_triggered();
|
bool is_triggered();
|
||||||
|
bool is_mouse_locked();
|
||||||
|
void clear_mouse_locked();
|
||||||
void set(std::unique_ptr<focus_t> f);
|
void set(std::unique_ptr<focus_t> f);
|
||||||
void on_keypress(int key, int sc, int action, int mods);
|
void on_keypress(int key, int sc, int action, int mods);
|
||||||
void on_mouse_button(int button, int action, int mods);
|
void on_mouse_button(int button, int action, int mods);
|
||||||
|
|
|
@ -13,7 +13,7 @@ static double xpos = 0, ypos = 0;
|
||||||
|
|
||||||
static void cb_cursor_pos(GLFWwindow* win, double x, double y)
|
static void cb_cursor_pos(GLFWwindow* win, double x, double y)
|
||||||
{
|
{
|
||||||
if(focus::is_focused())
|
if(focus::is_mouse_locked())
|
||||||
{
|
{
|
||||||
focus::on_cursor_pos(x - xpos, y - ypos);
|
focus::on_cursor_pos(x - xpos, y - ypos);
|
||||||
}
|
}
|
||||||
|
@ -38,6 +38,24 @@ void mouse::get(double& x, double& y)
|
||||||
y = ypos;
|
y = ypos;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void mouse::show_cursor()
|
||||||
|
{
|
||||||
|
double x, y;
|
||||||
|
GLFWwindow* win = window::get_window();
|
||||||
|
glfwSetInputMode(win, GLFW_CURSOR, GLFW_CURSOR_NORMAL);
|
||||||
|
glfwGetCursorPos(win, &x, &y);
|
||||||
|
cb_cursor_pos(win, x, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
void mouse::hide_cursor()
|
||||||
|
{
|
||||||
|
double x, y;
|
||||||
|
GLFWwindow* win = window::get_window();
|
||||||
|
glfwSetInputMode(win, GLFW_CURSOR, GLFW_CURSOR_DISABLED);
|
||||||
|
glfwGetCursorPos(win, &x, &y);
|
||||||
|
cb_cursor_pos(win, x, y);
|
||||||
|
}
|
||||||
|
|
||||||
void mouse::init()
|
void mouse::init()
|
||||||
{
|
{
|
||||||
GLFWwindow* win = window::get_window();
|
GLFWwindow* win = window::get_window();
|
||||||
|
|
|
@ -6,6 +6,8 @@ namespace sim::graphics::mouse
|
||||||
|
|
||||||
void init();
|
void init();
|
||||||
void get(double& x, double& y);
|
void get(double& x, double& y);
|
||||||
|
void show_cursor();
|
||||||
|
void hide_cursor();
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue