Add base mouse capturing
This commit is contained in:
parent
f4328b0b6e
commit
fc45db4653
@ -1,5 +1,6 @@
|
|||||||
#include "renderer.h"
|
#include "renderer.h"
|
||||||
#include "logger.h"
|
#include "logger.h"
|
||||||
|
#include <imgui/imgui_impl_glfw.h>
|
||||||
|
|
||||||
|
|
||||||
bool init_renderer(Renderer *renderer, u32 width, u32 height) {
|
bool init_renderer(Renderer *renderer, u32 width, u32 height) {
|
||||||
@ -169,3 +170,65 @@ void handle_key_events(Renderer *renderer, s32 key, s32 scancode, s32 action, s3
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void handle_mouse_position_events(Renderer *renderer, f64 x_pos, f64 y_pos) {
|
||||||
|
ImGuiIO& io = ImGui::GetIO();
|
||||||
|
io.AddMousePosEvent((f32)x_pos, (f32)y_pos);
|
||||||
|
|
||||||
|
if (io.WantCaptureMouse) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
s32 mouse_move_rel_x = static_cast<s32>(x_pos) - renderer->mouse_x_position;
|
||||||
|
s32 mouse_move_rel_y = static_cast<s32>(y_pos) - renderer->mouse_y_position;
|
||||||
|
|
||||||
|
if (renderer->mouse_lock) {
|
||||||
|
renderer->render_data.view_azimuth += mouse_move_rel_x / 10.0;
|
||||||
|
|
||||||
|
if (renderer->render_data.view_azimuth < 0.0) {
|
||||||
|
renderer->render_data.view_azimuth += 360.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (renderer->render_data.view_azimuth >= 360.0) {
|
||||||
|
renderer->render_data.view_azimuth -= 360.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
renderer->render_data.view_elevation -= mouse_move_rel_y / 10.0;
|
||||||
|
|
||||||
|
if (renderer->render_data.view_elevation > 89.0) {
|
||||||
|
renderer->render_data.view_elevation = 89.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (renderer->render_data.view_elevation < -89.0) {
|
||||||
|
renderer->render_data.view_elevation = -89.0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
renderer->mouse_x_position = static_cast<s32>(x_pos);
|
||||||
|
renderer->mouse_y_position = static_cast<s32>(y_pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
void handle_mouse_button_events(Renderer *renderer, s32 button, s32 action, s32 mods) {
|
||||||
|
ImGuiIO& io = ImGui::GetIO();
|
||||||
|
if (button >= 0 && button < ImGuiMouseButton_COUNT) {
|
||||||
|
io.AddMouseButtonEvent(button, action == GLFW_PRESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (io.WantCaptureMouse) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (button == GLFW_MOUSE_BUTTON_RIGHT && action == GLFW_PRESS) {
|
||||||
|
renderer->mouse_lock = !renderer->mouse_lock;
|
||||||
|
|
||||||
|
if (renderer->mouse_lock) {
|
||||||
|
glfwSetInputMode(renderer->render_data.glfw_window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);
|
||||||
|
|
||||||
|
if (glfwRawMouseMotionSupported()) {
|
||||||
|
glfwSetInputMode(renderer->render_data.glfw_window, GLFW_RAW_MOUSE_MOTION, GLFW_TRUE);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
glfwSetInputMode(renderer->render_data.glfw_window, GLFW_CURSOR, GLFW_CURSOR_NORMAL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@ -26,6 +26,10 @@ struct Renderer {
|
|||||||
Matrix4 projection_matrix = Matrix4(1.0f);
|
Matrix4 projection_matrix = Matrix4(1.0f);
|
||||||
User_Interface user_interface;
|
User_Interface user_interface;
|
||||||
Render_Data render_data;
|
Render_Data render_data;
|
||||||
|
Camera camera;
|
||||||
|
bool mouse_lock = false;
|
||||||
|
s32 mouse_x_position = 0;
|
||||||
|
s32 mouse_y_position = 0;
|
||||||
Timer timer;
|
Timer timer;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -35,4 +39,8 @@ void set_renderer_size(Renderer *renderer, u32 width, u32 height);
|
|||||||
void draw_renderer(Renderer *renderer);
|
void draw_renderer(Renderer *renderer);
|
||||||
void upload_renderer_data(Renderer *renderer, Mesh *vertex_data);
|
void upload_renderer_data(Renderer *renderer, Mesh *vertex_data);
|
||||||
void cleanup_renderer(Renderer *renderer);
|
void cleanup_renderer(Renderer *renderer);
|
||||||
|
|
||||||
|
// Event handling
|
||||||
void handle_key_events(Renderer *renderer, s32 key, s32 scancode, s32 action, s32 mods);
|
void handle_key_events(Renderer *renderer, s32 key, s32 scancode, s32 action, s32 mods);
|
||||||
|
void handle_mouse_position_events(Renderer *renderer, f64 x_pos, f64 y_pos);
|
||||||
|
void handle_mouse_button_events(Renderer *renderer, s32 button, s32 action, s32 mods);
|
||||||
|
|||||||
@ -83,49 +83,6 @@ void cleanup(Window *window) {
|
|||||||
glfwTerminate();
|
glfwTerminate();
|
||||||
}
|
}
|
||||||
|
|
||||||
void handle_mouse_position_events(GLFWwindow *gl_window, f64 x_pos, f64 y_pos) {
|
|
||||||
Window *window = static_cast<Window *>(glfwGetWindowUserPointer(gl_window));
|
|
||||||
log(1, "%s: Mouse is at position %lf/%lf\n", __FUNCTION__, x_pos, y_pos);
|
|
||||||
}
|
|
||||||
|
|
||||||
void handle_mouse_button_events(GLFWwindow *gl_window, s32 button, s32 action, s32 mods) {
|
|
||||||
Window *window = static_cast<Window *>(glfwGetWindowUserPointer(gl_window));
|
|
||||||
|
|
||||||
string action_name;
|
|
||||||
switch(action) {
|
|
||||||
case GLFW_PRESS:
|
|
||||||
action_name = "pressed";
|
|
||||||
break;
|
|
||||||
case GLFW_RELEASE:
|
|
||||||
action_name = "released";
|
|
||||||
break;
|
|
||||||
case GLFW_REPEAT:
|
|
||||||
action_name = "repeated";
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
action_name = "invalid";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
string mouse_button_name;
|
|
||||||
switch(button) {
|
|
||||||
case GLFW_MOUSE_BUTTON_LEFT:
|
|
||||||
mouse_button_name = "left";
|
|
||||||
break;
|
|
||||||
case GLFW_MOUSE_BUTTON_RIGHT:
|
|
||||||
mouse_button_name = "right";
|
|
||||||
break;
|
|
||||||
case GLFW_MOUSE_BUTTON_MIDDLE:
|
|
||||||
mouse_button_name = "middle";
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
mouse_button_name = "other";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
log(1, "%s: %s mouse button (%i) %s\n", __FUNCTION__, mouse_button_name.c_str(), button, action_name.c_str());
|
|
||||||
}
|
|
||||||
|
|
||||||
void handle_window_resize_events(GLFWwindow *gl_window, s32 width, s32 height) {
|
void handle_window_resize_events(GLFWwindow *gl_window, s32 width, s32 height) {
|
||||||
Window *window = static_cast<Window *>(glfwGetWindowUserPointer(gl_window));
|
Window *window = static_cast<Window *>(glfwGetWindowUserPointer(gl_window));
|
||||||
|
|
||||||
|
|||||||
@ -13,7 +13,5 @@ bool init_window(Window *window, u32 width, u32 height, string title);
|
|||||||
void main_loop(Window *window);
|
void main_loop(Window *window);
|
||||||
void cleanup(Window *window);
|
void cleanup(Window *window);
|
||||||
void handle_close(GLFWwindow *gl_window);
|
void handle_close(GLFWwindow *gl_window);
|
||||||
void handle_mouse_position_events(GLFWwindow *gl_window, f64 x_pos, f64 y_pos);
|
|
||||||
void handle_mouse_button_events(GLFWwindow *gl_window, s32 button, s32 action, s32 mods);
|
|
||||||
void handle_window_resize_events(GLFWwindow *gl_window, s32 width, s32 height);
|
void handle_window_resize_events(GLFWwindow *gl_window, s32 width, s32 height);
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user