Got rotations working with quaternions(probably more steps than necessary)

main
noah metz 2024-01-09 10:32:22 -07:00
parent fc68698ac7
commit 256980435e
1 changed files with 83 additions and 29 deletions

@ -11,6 +11,7 @@
#include <cglm/mat4.h>
#include <cglm/vec3.h>
#include <cglm/affine.h>
#include <cglm/quat.h>
#include <cglm/cam.h>
#include <stdio.h>
#include <string.h>
@ -77,7 +78,7 @@ typedef struct MaterialStruct {
VkPipelineLayout pipeline_layout;
VkPipeline pipeline;
VkDescriptorSet material_descriptors;
VkDescriptorPool descriptor_pool;
} Material;
typedef struct VulkanContextStruct {
@ -1265,7 +1266,7 @@ Texture load_texture(VkPhysicalDevice physical_device, VkDevice device, VkComman
.addressModeV = VK_SAMPLER_ADDRESS_MODE_REPEAT,
.addressModeW = VK_SAMPLER_ADDRESS_MODE_REPEAT,
.anisotropyEnable = VK_TRUE,
.maxAnisotropy = 2,
.maxAnisotropy = 2.0f,
.borderColor = VK_BORDER_COLOR_INT_OPAQUE_BLACK,
.unnormalizedCoordinates = VK_FALSE,
.compareEnable = VK_FALSE,
@ -2098,19 +2099,19 @@ VulkanContext* init_vulkan(GLFWwindow* window, uint32_t max_frames_in_flight) {
return context;
}
vec3 world_position = {0.0f, 0.0f, 0.0f};
float rotation = 0.0f;
struct {
bool forward: 1;
bool backward: 1;
bool left: 1;
bool right: 1;
bool up: 1;
bool down: 1;
bool turn_left: 1;
bool turn_right: 1;
bool turn_up: 1;
bool turn_down: 1;
bool forward;
bool backward;
bool left;
bool right;
bool up;
bool down;
bool turn_left;
bool turn_right;
bool turn_up;
bool turn_down;
bool roll_left;
bool roll_right;
} key_flags = {
.forward = false,
.backward = false,
@ -2121,6 +2122,8 @@ struct {
.turn_right = false,
.turn_up = false,
.turn_down = false,
.roll_left = false,
.roll_right = false,
};
void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) {
@ -2208,18 +2211,37 @@ void key_callback(GLFWwindow* window, int key, int scancode, int action, int mod
key_flags.turn_down = false;
}
break;
case GLFW_KEY_Q:
if(action == GLFW_PRESS) {
key_flags.roll_left = true;
} else if(action == GLFW_RELEASE) {
key_flags.roll_left = false;
}
break;
case GLFW_KEY_E:
if(action == GLFW_PRESS) {
key_flags.roll_right = true;
} else if(action == GLFW_RELEASE) {
key_flags.roll_right = false;
}
break;
}
}
VkResult update_scene_ubo(void** buffers, uint32_t frame_index, vec3 world_position, float* rotation, float aspect_ratio, float time_delta) {
vec3 world_position = {0.0f, 0.0f, 0.0f};
versor world_rotation = {-1.0f, 0.0f, 0.0f, 0.0f};
VkResult update_scene_ubo(void** buffers, uint32_t frame_index, vec3 world_position, versor world_rotation, float aspect_ratio, float time_delta) {
vec3 movement_sum = {0.0f, 0.0f, 0.0f};
if(key_flags.forward) {
movement_sum[2] += 1 * time_delta;
movement_sum[2] -= 1 * time_delta;
}
if(key_flags.backward) {
movement_sum[2] -= 1 * time_delta;
movement_sum[2] += 1 * time_delta;
}
if(key_flags.left) {
@ -2231,36 +2253,68 @@ VkResult update_scene_ubo(void** buffers, uint32_t frame_index, vec3 world_posit
}
if(key_flags.up) {
movement_sum[1] += 1 * time_delta;
movement_sum[1] -= 1 * time_delta;
}
if(key_flags.down) {
movement_sum[1] -= 1 * time_delta;
movement_sum[1] += 1 * time_delta;
}
vec3 eular_rotation = {0.0f, 0.0f, 0.0f};
if(key_flags.turn_right) {
*rotation -= 1 * time_delta;
eular_rotation[0] += 1 * time_delta;
}
if(key_flags.turn_left) {
*rotation += 1 * time_delta;
eular_rotation[0] -= 1 * time_delta;
}
vec3 forward = {0.0f, 0.0f, 1.0f};
if(key_flags.turn_up) {
eular_rotation[1] -= 1 * time_delta;
}
if(key_flags.turn_down) {
eular_rotation[1] += 1 * time_delta;
}
if(key_flags.roll_right) {
eular_rotation[2] += 1 * time_delta;
}
if(key_flags.roll_left) {
eular_rotation[2] -= 1 * time_delta;
}
vec3 left = {1.0f, 0.0f, 0.0f};
vec3 up = {0.0f, -1.0f, 0.0f};
vec3 forward = {0.0f, 0.0f, 1.0f};
glm_quat_rotatev(world_rotation, left, left);
glm_quat_rotatev(world_rotation, up, up);
glm_quat_rotatev(world_rotation, forward, forward);
vec3 dir;
mat4 rot;
glm_rotate_make(rot, *rotation, up);
glm_mat4_mulv3(rot, forward, 1.0f, dir);
versor relative_rotation_y;
glm_quatv(relative_rotation_y, eular_rotation[1], left);
versor relative_rotation_x;
glm_quatv(relative_rotation_x, eular_rotation[0], up);
versor relative_rotation_z;
glm_quatv(relative_rotation_z, eular_rotation[2], forward);
glm_quat_mul(relative_rotation_x, world_rotation, world_rotation);
glm_quat_mul(relative_rotation_y, world_rotation, world_rotation);
glm_quat_mul(relative_rotation_z, world_rotation, world_rotation);
vec3 movement_rot;
glm_mat4_mulv3(rot, movement_sum, 1.0f, movement_rot);
glm_quat_rotatev(world_rotation, movement_sum, movement_rot);
glm_vec3_add(movement_rot, world_position, world_position);
struct SceneUBO ubo = {};
glm_perspective(90.0f, aspect_ratio, 0.1, 100, ubo.proj);
glm_look(world_position, dir, up, ubo.view);
glm_quat_look(world_position, world_rotation, ubo.view);
//glm_look(world_position, dir, up, ubo.view);
memcpy(buffers[frame_index], (void*)&ubo, sizeof(ubo));
@ -2268,7 +2322,7 @@ VkResult update_scene_ubo(void** buffers, uint32_t frame_index, vec3 world_posit
}
VkResult draw_frame(VulkanContext* context) {
update_scene_ubo(context->scene_ubo_ptrs, context->current_frame, world_position, &rotation, (float)context->swapchain_extent.width/(float)context->swapchain_extent.height, 0.01);
update_scene_ubo(context->scene_ubo_ptrs, context->current_frame, world_position, world_rotation, (float)context->swapchain_extent.width/(float)context->swapchain_extent.height, 0.01);
VkResult result;
result = vkWaitForFences(context->device, 1, &context->in_flight_fences[context->current_frame], VK_TRUE, UINT64_MAX);