Implement base camera
This commit is contained in:
parent
fc45db4653
commit
cb70f3b322
@ -3,6 +3,6 @@ Pos=60,60
|
|||||||
Size=400,400
|
Size=400,400
|
||||||
|
|
||||||
[Window][Control]
|
[Window][Control]
|
||||||
Pos=60,60
|
Pos=50,64
|
||||||
Size=213,82
|
Size=271,202
|
||||||
|
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
#include "camera.h"
|
#include "camera.h"
|
||||||
|
#include <glm/ext/matrix_transform.hpp>
|
||||||
|
|
||||||
Matrix4 get_camera_view_matrix(Camera *camera, Render_Data *render_data) {
|
Matrix4 get_camera_view_matrix(Camera *camera, Render_Data *render_data) {
|
||||||
f32 azimuth_radians = glm::radians(render_data->view_azimuth);
|
f32 azimuth_radians = glm::radians(render_data->view_azimuth);
|
||||||
|
|||||||
@ -2,7 +2,6 @@
|
|||||||
|
|
||||||
#include "basic.h"
|
#include "basic.h"
|
||||||
#include <glm/glm.hpp>
|
#include <glm/glm.hpp>
|
||||||
#include "renderer.h"
|
|
||||||
#include "render_data.h"
|
#include "render_data.h"
|
||||||
|
|
||||||
struct Camera {
|
struct Camera {
|
||||||
|
|||||||
@ -106,10 +106,6 @@ void draw_renderer(Renderer *renderer) {
|
|||||||
glClearDepth(1.0f);
|
glClearDepth(1.0f);
|
||||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
|
|
||||||
Vector3 camera_position = Vector3(0.4f, 0.3f, 1.0f);
|
|
||||||
Vector3 camera_look_at_position = Vector3(0.0f, 0.0f, 0.0f);
|
|
||||||
Vector3 camera_up_vector = Vector3(0.0f, 1.0f, 0.0f);
|
|
||||||
|
|
||||||
renderer->projection_matrix = glm::perspective(glm::radians(static_cast<f32>(renderer->render_data.field_of_view)), static_cast<f32>(renderer->render_data.width) / static_cast<f32>(renderer->render_data.height), 0.1f, 10.0f);
|
renderer->projection_matrix = glm::perspective(glm::radians(static_cast<f32>(renderer->render_data.field_of_view)), static_cast<f32>(renderer->render_data.width) / static_cast<f32>(renderer->render_data.height), 0.1f, 10.0f);
|
||||||
|
|
||||||
f32 dt = glfwGetTime();
|
f32 dt = glfwGetTime();
|
||||||
@ -123,7 +119,7 @@ void draw_renderer(Renderer *renderer) {
|
|||||||
model = glm::rotate(Matrix4(1.0f), -dt, Vector3(0.0f, 0.0f, 1.0f));
|
model = glm::rotate(Matrix4(1.0f), -dt, Vector3(0.0f, 0.0f, 1.0f));
|
||||||
}
|
}
|
||||||
|
|
||||||
renderer->view_matrix = glm::lookAt(camera_position, camera_look_at_position, camera_up_vector) * model;
|
renderer->view_matrix = get_camera_view_matrix(&renderer->camera, &renderer->render_data);
|
||||||
|
|
||||||
upload_uniform_buffer_data(&renderer->uniform_buffer, renderer->view_matrix, renderer->projection_matrix);
|
upload_uniform_buffer_data(&renderer->uniform_buffer, renderer->view_matrix, renderer->projection_matrix);
|
||||||
|
|
||||||
@ -170,6 +166,31 @@ void handle_key_events(Renderer *renderer, s32 key, s32 scancode, s32 action, s3
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void handle_mouse_position_events(Renderer *renderer, f64 x_pos, f64 y_pos) {
|
void handle_mouse_position_events(Renderer *renderer, f64 x_pos, f64 y_pos) {
|
||||||
ImGuiIO& io = ImGui::GetIO();
|
ImGuiIO& io = ImGui::GetIO();
|
||||||
io.AddMousePosEvent((f32)x_pos, (f32)y_pos);
|
io.AddMousePosEvent((f32)x_pos, (f32)y_pos);
|
||||||
@ -207,28 +228,4 @@ void handle_mouse_position_events(Renderer *renderer, f64 x_pos, f64 y_pos) {
|
|||||||
renderer->mouse_y_position = static_cast<s32>(y_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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|||||||
@ -52,9 +52,15 @@ bool init_window(Window *window, u32 width, u32 height, string title) {
|
|||||||
handle_key_events(renderer, key, scancode, action, mods);
|
handle_key_events(renderer, key, scancode, action, mods);
|
||||||
});
|
});
|
||||||
|
|
||||||
// Have to disable so ImGui will accept mouse events
|
glfwSetMouseButtonCallback(window->glfw_window, [](GLFWwindow *glfw_window, s32 button, s32 action, s32 mods) {
|
||||||
// glfwSetCursorPosCallback(window->glfw_window, handle_mouse_position_events);
|
Renderer* renderer = static_cast<Renderer*>(glfwGetWindowUserPointer(glfw_window));
|
||||||
// glfwSetMouseButtonCallback(window->glfw_window, handle_mouse_button_events);
|
handle_mouse_button_events(renderer, button, action, mods);
|
||||||
|
});
|
||||||
|
|
||||||
|
glfwSetCursorPosCallback(window->glfw_window, [](GLFWwindow *glfw_window, f64 x_pos, f64 y_pos) {
|
||||||
|
Renderer* renderer = static_cast<Renderer*>(glfwGetWindowUserPointer(glfw_window));
|
||||||
|
handle_mouse_position_events(renderer, x_pos, y_pos);
|
||||||
|
});
|
||||||
|
|
||||||
window->model = new Model();
|
window->model = new Model();
|
||||||
init_model(window->model);
|
init_model(window->model);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user