Implement camera movement
This commit is contained in:
parent
cb70f3b322
commit
d686644731
@ -4,5 +4,5 @@ Size=400,400
|
|||||||
|
|
||||||
[Window][Control]
|
[Window][Control]
|
||||||
Pos=50,64
|
Pos=50,64
|
||||||
Size=271,202
|
Size=393,284
|
||||||
|
|
||||||
|
|||||||
@ -11,8 +11,12 @@ Matrix4 get_camera_view_matrix(Camera *camera, Render_Data *render_data) {
|
|||||||
f32 cos_elevation = glm::cos(elevation_radians);
|
f32 cos_elevation = glm::cos(elevation_radians);
|
||||||
|
|
||||||
camera->view_direction = glm::normalize(Vector3(sin_azimuth * cos_elevation, sin_elevation, -cos_azimuth * cos_elevation));
|
camera->view_direction = glm::normalize(Vector3(sin_azimuth * cos_elevation, sin_elevation, -cos_azimuth * cos_elevation));
|
||||||
|
camera->right_direction = glm::normalize(glm::cross(camera->view_direction, camera->world_up_vector));
|
||||||
|
camera->up_direction = glm::normalize(glm::cross(camera->right_direction, camera->view_direction));
|
||||||
|
|
||||||
Matrix4 look_at = glm::lookAt(camera->world_position, camera->world_position + camera->view_direction, camera->world_up_vector);
|
render_data->camera_world_position += render_data->move_forward * render_data->tick_diff * camera->view_direction + render_data->move_right * render_data->tick_diff * camera->right_direction + render_data->move_up * render_data->tick_diff * camera->up_direction;
|
||||||
|
|
||||||
|
Matrix4 look_at = glm::lookAt(render_data->camera_world_position, render_data->camera_world_position + camera->view_direction, camera->world_up_vector);
|
||||||
|
|
||||||
return look_at;
|
return look_at;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -8,6 +8,8 @@ struct Camera {
|
|||||||
Vector3 world_position = Vector3(0.5f, 0.25f, 1.0f);
|
Vector3 world_position = Vector3(0.5f, 0.25f, 1.0f);
|
||||||
Vector3 view_direction = Vector3(0.0f, 0.0f, 0.0f);
|
Vector3 view_direction = Vector3(0.0f, 0.0f, 0.0f);
|
||||||
Vector3 world_up_vector = Vector3(0.0f, 1.0f, 0.0f);
|
Vector3 world_up_vector = Vector3(0.0f, 1.0f, 0.0f);
|
||||||
|
Vector3 right_direction = Vector3(0.0f, 0.0f, 0.0f);
|
||||||
|
Vector3 up_direction = Vector3(0.0f, 0.0f, 0.0f);
|
||||||
};
|
};
|
||||||
|
|
||||||
Matrix4 get_camera_view_matrix(Camera *camera, Render_Data *render_data);
|
Matrix4 get_camera_view_matrix(Camera *camera, Render_Data *render_data);
|
||||||
|
|||||||
@ -27,4 +27,11 @@ struct Render_Data {
|
|||||||
|
|
||||||
f32 view_azimuth = 320.0f;
|
f32 view_azimuth = 320.0f;
|
||||||
f32 view_elevation = -15.0f;
|
f32 view_elevation = -15.0f;
|
||||||
|
|
||||||
|
s32 move_forward = 0;
|
||||||
|
s32 move_right = 0;
|
||||||
|
s32 move_up = 0;
|
||||||
|
f32 tick_diff = 0.0f;
|
||||||
|
|
||||||
|
Vector3 camera_world_position = Vector3(0.5f, 0.25f, 1.0f);
|
||||||
};
|
};
|
||||||
|
|||||||
@ -91,10 +91,13 @@ void set_renderer_size(Renderer *renderer, u32 width, u32 height) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void draw_renderer(Renderer *renderer) {
|
void draw_renderer(Renderer *renderer) {
|
||||||
// FPS time
|
// @Todo why do we have two glfwGetTime() functions being called and setting to things that are relatively close in purpose?
|
||||||
static f32 previous_frame_start_time = 0.0;
|
static f32 previous_frame_start_time = 0.0;
|
||||||
f32 frame_start_time = glfwGetTime();
|
f32 frame_start_time = glfwGetTime();
|
||||||
|
|
||||||
|
f64 tick_time = glfwGetTime();
|
||||||
|
renderer->render_data.tick_diff = tick_time - renderer->last_tick_time;
|
||||||
|
|
||||||
while(renderer->render_data.width == 0 || renderer->render_data.height == 0) {
|
while(renderer->render_data.width == 0 || renderer->render_data.height == 0) {
|
||||||
glfwGetFramebufferSize(renderer->render_data.glfw_window, &renderer->render_data.width, &renderer->render_data.height);
|
glfwGetFramebufferSize(renderer->render_data.glfw_window, &renderer->render_data.width, &renderer->render_data.height);
|
||||||
glfwWaitEvents();
|
glfwWaitEvents();
|
||||||
@ -136,6 +139,9 @@ void draw_renderer(Renderer *renderer) {
|
|||||||
|
|
||||||
// Timer
|
// Timer
|
||||||
start_timer(&renderer->timer);
|
start_timer(&renderer->timer);
|
||||||
|
|
||||||
|
handle_movement_keys(renderer);
|
||||||
|
|
||||||
create_user_interface_frame(&renderer->user_interface, &renderer->render_data);
|
create_user_interface_frame(&renderer->user_interface, &renderer->render_data);
|
||||||
renderer->render_data.user_interface_generate_time = stop_timer(&renderer->timer);
|
renderer->render_data.user_interface_generate_time = stop_timer(&renderer->timer);
|
||||||
|
|
||||||
@ -144,6 +150,7 @@ void draw_renderer(Renderer *renderer) {
|
|||||||
// FPS time
|
// FPS time
|
||||||
renderer->render_data.frame_time = frame_start_time - previous_frame_start_time;
|
renderer->render_data.frame_time = frame_start_time - previous_frame_start_time;
|
||||||
previous_frame_start_time = frame_start_time;
|
previous_frame_start_time = frame_start_time;
|
||||||
|
renderer->last_tick_time = tick_time;
|
||||||
}
|
}
|
||||||
|
|
||||||
void upload_renderer_data(Renderer *renderer, Mesh *vertex_data) {
|
void upload_renderer_data(Renderer *renderer, Mesh *vertex_data) {
|
||||||
@ -166,6 +173,35 @@ void handle_key_events(Renderer *renderer, s32 key, s32 scancode, s32 action, s3
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void handle_movement_keys(Renderer *renderer) {
|
||||||
|
renderer->render_data.move_forward = 0;
|
||||||
|
if (glfwGetKey(renderer->render_data.glfw_window, GLFW_KEY_W) == GLFW_PRESS) {
|
||||||
|
renderer->render_data.move_forward += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (glfwGetKey(renderer->render_data.glfw_window, GLFW_KEY_S) == GLFW_PRESS) {
|
||||||
|
renderer->render_data.move_forward -= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
renderer->render_data.move_right = 0;
|
||||||
|
if (glfwGetKey(renderer->render_data.glfw_window, GLFW_KEY_D) == GLFW_PRESS) {
|
||||||
|
renderer->render_data.move_right += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (glfwGetKey(renderer->render_data.glfw_window, GLFW_KEY_A) == GLFW_PRESS) {
|
||||||
|
renderer->render_data.move_right -= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
renderer->render_data.move_up = 0;
|
||||||
|
if (glfwGetKey(renderer->render_data.glfw_window, GLFW_KEY_E) == GLFW_PRESS) {
|
||||||
|
renderer->render_data.move_up += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (glfwGetKey(renderer->render_data.glfw_window, GLFW_KEY_Q) == GLFW_PRESS) {
|
||||||
|
renderer->render_data.move_up -= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void handle_mouse_button_events(Renderer *renderer, s32 button, s32 action, s32 mods) {
|
void handle_mouse_button_events(Renderer *renderer, s32 button, s32 action, s32 mods) {
|
||||||
ImGuiIO& io = ImGui::GetIO();
|
ImGuiIO& io = ImGui::GetIO();
|
||||||
if (button >= 0 && button < ImGuiMouseButton_COUNT) {
|
if (button >= 0 && button < ImGuiMouseButton_COUNT) {
|
||||||
@ -228,4 +264,3 @@ 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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -31,6 +31,7 @@ struct Renderer {
|
|||||||
s32 mouse_x_position = 0;
|
s32 mouse_x_position = 0;
|
||||||
s32 mouse_y_position = 0;
|
s32 mouse_y_position = 0;
|
||||||
Timer timer;
|
Timer timer;
|
||||||
|
f64 last_tick_time = 0.0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -42,5 +43,6 @@ void cleanup_renderer(Renderer *renderer);
|
|||||||
|
|
||||||
// Event handling
|
// 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_movement_keys(Renderer *renderer);
|
||||||
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);
|
||||||
void handle_mouse_button_events(Renderer *renderer, s32 button, s32 action, s32 mods);
|
void handle_mouse_button_events(Renderer *renderer, s32 button, s32 action, s32 mods);
|
||||||
|
|||||||
@ -78,6 +78,17 @@ void create_user_interface_frame(User_Interface *user_interface, Render_Data *re
|
|||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
ImGui::SliderInt("##FOV", &render_data->field_of_view, 40, 150);
|
ImGui::SliderInt("##FOV", &render_data->field_of_view, 40, 150);
|
||||||
|
|
||||||
|
// Camera information
|
||||||
|
ImGui::Text("View Azimuth:");
|
||||||
|
ImGui::SameLine();
|
||||||
|
ImGui::Text("%s", std::to_string(render_data->view_azimuth).c_str());
|
||||||
|
ImGui::Text("View Elevation:");
|
||||||
|
ImGui::Text("%s", std::to_string(render_data->view_elevation).c_str());
|
||||||
|
ImGui::Separator();
|
||||||
|
ImGui::Text("Camera Position:");
|
||||||
|
ImGui::SameLine();
|
||||||
|
ImGui::Text("%f, %f, %f", render_data->camera_world_position.x, render_data->camera_world_position.y, render_data->camera_world_position.z);
|
||||||
|
|
||||||
ImGui::End();
|
ImGui::End();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user