Browse Source

add aspect ratio option to cameraInitPerspective()

render_group_fix
cinnaboot 5 years ago
parent
commit
44acbc91cd
  1. 2
      README
  2. 35
      include/camera.h
  3. 3
      include/renderer.h
  4. 20
      src/camera.cpp
  5. 9
      src/renderer.cpp

2
README

@ -13,7 +13,7 @@ TODO:
add input abstraction for SDL add input abstraction for SDL
store meshes separately from entities for reuse store meshes separately from entities for reuse
add a function to update camera transforms only once per frame, per shader 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: Dependencies:
assimp >= 5.0.0 assimp >= 5.0.0

35
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);

3
include/renderer.h

@ -92,3 +92,6 @@ renAddLight(render_state* rs,
glm::vec3 color = glm::vec3(1, 1, 1), glm::vec3 color = glm::vec3(1, 1, 1),
float intensity = 1.0); float intensity = 1.0);
glm::vec2
renGetWindowDims(render_state* rs);

20
src/camera.cpp

@ -1,4 +1,6 @@
#include <cassert>
#include <GL/glew.h> #include <GL/glew.h>
#include "camera.h" #include "camera.h"
@ -8,7 +10,6 @@
#define ROTATE_SPEED 0.005f #define ROTATE_SPEED 0.005f
#define CAMERA_Z_CLAMP_ANGLE 85.f #define CAMERA_Z_CLAMP_ANGLE 85.f
#define FOV 60.f #define FOV 60.f
#define ASPECT_RATIO 16.f/9.f
#define NEAR_CLIP_PLANE 20.f #define NEAR_CLIP_PLANE 20.f
@ -19,20 +20,29 @@ inline glm::vec3 convertv3f(v3f v);
// interface // interface
void 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.position = position;
cam.target = target; cam.target = target;
cam.world_up = world_up; 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.forward = glm::normalize(target - position);
cam.left = glm::normalize(glm::cross(cam.world_up, cam.forward)); cam.left = glm::normalize(glm::cross(cam.world_up, cam.forward));
cam.up = glm::normalize(glm::cross(cam.forward, cam.left)); cam.up = glm::normalize(glm::cross(cam.forward, cam.left));
cam.hAngle = glm::atan(cam.forward.x, cam.forward.y); cam.hAngle = glm::atan(cam.forward.x, cam.forward.y);
// NOTE: using pythagoras' to get absolute value of relative axis for vAngle component // 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)); 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.vAngle = glm::atan(cam.forward.z, len);
cam.view = glm::lookAt(cam.position, cam.position + cam.forward, cam.up); cam.view = glm::lookAt(cam.position, cam.position + cam.forward, cam.up);

9
src/renderer.cpp

@ -164,6 +164,15 @@ renAddLight(render_state* rs, glm::vec3 pos, glm::vec3 color, float intensity)
return true; 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 // internal

Loading…
Cancel
Save