diff --git a/README b/README index 4d39492..d0a27e9 100644 --- a/README +++ b/README @@ -13,7 +13,7 @@ TODO: add input abstraction for SDL store meshes separately from entities for reuse add a function to update camera transforms only once per frame, per shader - fix example Makefile dependenies + update camera to use quaternions for rotation Dependencies: assimp >= 5.0.0 diff --git a/include/camera.h b/include/camera.h index b545645..8346416 100644 --- a/include/camera.h +++ b/include/camera.h @@ -30,16 +30,37 @@ enum projection_type }; -v2f cameraUnproject(camera& cam, int x, int y, int vp_width, int vp_height); +v2f +cameraUnproject(camera& cam, int x, int y, int vp_width, int vp_height); -v3f cameraCreateRay(camera& cam, v2i vp_coords, v2i vp_dims); +v3f +cameraCreateRay(camera& cam, v2i vp_coords, v2i vp_dims); -bool cameraIntersectPlane(camera& cam, v3f ray, v3f plane_origin, v3f plane_normal, v3f& intersection); +bool +cameraIntersectPlane(camera& cam, + v3f ray, + v3f plane_origin, + v3f plane_normal, + v3f& intersection); -void cameraInitPerspective(camera& cam, glm::vec3 position, glm::vec3 target, glm::vec3 world_up); +void +cameraInitPerspective(camera& cam, + glm::vec3 position, + glm::vec3 target, + glm::vec3 world_up, + float aspect_ratio = 16.f / 9.f); -void cameraMove(camera& cam, bool up, bool left, bool down, bool right, bool forward, bool backward); +void +cameraMove(camera& cam, + bool up, + bool left, + bool down, + bool right, + bool forward, + bool backward); -void cameraRotate(camera& cam, int32 xrel, int32 yrel); +void +cameraRotate(camera& cam, int32 xrel, int32 yrel); -void cameraRoll(camera& cam, bool CW, bool CCW); +void +cameraRoll(camera& cam, bool CW, bool CCW); diff --git a/include/renderer.h b/include/renderer.h index cf7916c..52b3388 100644 --- a/include/renderer.h +++ b/include/renderer.h @@ -92,3 +92,6 @@ renAddLight(render_state* rs, glm::vec3 color = glm::vec3(1, 1, 1), float intensity = 1.0); +glm::vec2 +renGetWindowDims(render_state* rs); + diff --git a/src/camera.cpp b/src/camera.cpp index 0fa34f0..e89b563 100644 --- a/src/camera.cpp +++ b/src/camera.cpp @@ -1,4 +1,6 @@ +#include + #include #include "camera.h" @@ -8,7 +10,6 @@ #define ROTATE_SPEED 0.005f #define CAMERA_Z_CLAMP_ANGLE 85.f #define FOV 60.f -#define ASPECT_RATIO 16.f/9.f #define NEAR_CLIP_PLANE 20.f @@ -19,20 +20,29 @@ inline glm::vec3 convertv3f(v3f v); // interface void -cameraInitPerspective(camera& cam, glm::vec3 position, glm::vec3 target, glm::vec3 world_up) +cameraInitPerspective(camera& cam, + glm::vec3 position, + glm::vec3 target, + glm::vec3 world_up, + float aspect_ratio) { + assert(aspect_ratio > 0); + cam.position = position; cam.target = target; cam.world_up = world_up; - cam.projection = glm::infinitePerspective(glm::radians(FOV), ASPECT_RATIO, NEAR_CLIP_PLANE); + cam.projection = glm::infinitePerspective(glm::radians(FOV), + aspect_ratio, + NEAR_CLIP_PLANE); cam.forward = glm::normalize(target - position); cam.left = glm::normalize(glm::cross(cam.world_up, cam.forward)); cam.up = glm::normalize(glm::cross(cam.forward, cam.left)); cam.hAngle = glm::atan(cam.forward.x, cam.forward.y); - // NOTE: using pythagoras' to get absolute value of relative axis for vAngle component - real32 len = glm::sqrt(glm::pow(cam.forward.y, 2) + glm::pow(cam.forward.x, 2)); + // NOTE: get absolute value of relative axis for vAngle component + real32 len = glm::sqrt(glm::pow(cam.forward.y, 2) + + glm::pow(cam.forward.x, 2)); cam.vAngle = glm::atan(cam.forward.z, len); cam.view = glm::lookAt(cam.position, cam.position + cam.forward, cam.up); diff --git a/src/renderer.cpp b/src/renderer.cpp index d287e47..064f243 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -164,6 +164,15 @@ renAddLight(render_state* rs, glm::vec3 pos, glm::vec3 color, float intensity) return true; } +glm::vec2 +renGetWindowDims(render_state* rs) +{ + int x = 0, y = 0; + SDL_GetWindowSize(rs->handles->window, &x, &y); + glm::vec2 dims(x, y); + return dims; +} + // internal