Browse Source

add using directives for glm types

remotes/bxxa/master
cinnaboot 4 years ago
parent
commit
3c61bf4ace
  1. 47
      include/camera.h
  2. 78
      src/camera.cpp

47
include/camera.h

@ -5,46 +5,51 @@
#include "types.h" #include "types.h"
using glm::ivec2;
using glm::vec2;
using glm::vec3;
using glm::mat4;
struct Camera struct Camera
{ {
float hAngle; float hAngle;
float vAngle; float vAngle;
glm::vec3 position; vec3 position;
glm::vec3 forward; vec3 forward;
glm::vec3 up; vec3 up;
glm::vec3 left; vec3 left;
glm::vec3 target; vec3 target;
glm::vec3 world_up; vec3 world_up;
glm::mat4 model; mat4 model;
glm::mat4 view; mat4 view;
glm::mat4 projection; mat4 projection;
glm::mat4 MVP; mat4 MVP;
}; };
// FIXME: we should keep to our convention of passing pointers to structs in // FIXME: we should keep to our convention of passing pointers to structs in
// these interface functions // these interface functions
glm::vec2 vec2
cameraUnproject(Camera& cam, int x, int y, int vp_width, int vp_height); cameraUnproject(Camera& cam, int x, int y, int vp_width, int vp_height);
glm::vec3 vec3
cameraCreateRay(Camera& cam, glm::ivec2 vp_coords, glm::ivec2 vp_dims); cameraCreateRay(Camera& cam, ivec2 vp_coords, ivec2 vp_dims);
bool bool
cameraIntersectPlane(Camera& cam, cameraIntersectPlane(Camera& cam,
glm::vec3 ray, vec3 ray,
glm::vec3 plane_origin, vec3 plane_origin,
glm::vec3 plane_normal, vec3 plane_normal,
glm::vec3& intersection); vec3& intersection);
void void
cameraInitPerspective(Camera* cam, cameraInitPerspective(Camera* cam,
glm::vec3 position, vec3 position,
glm::vec3 target, vec3 target,
glm::vec3 world_up, vec3 world_up,
float aspect_ratio = 16.f / 9.f); float aspect_ratio = 16.f / 9.f);
void void

78
src/camera.cpp

@ -7,6 +7,12 @@
#include "camera.h" #include "camera.h"
using glm::ivec2;
using glm::vec2;
using glm::vec3;
using glm::mat4;
// TODO: add these props to scene json // TODO: add these props to scene json
#define MOVE_SPEED 5.f #define MOVE_SPEED 5.f
#define ROTATE_SPEED 0.005f #define ROTATE_SPEED 0.005f
@ -22,9 +28,9 @@
void void
cameraInitPerspective(Camera* cam, cameraInitPerspective(Camera* cam,
glm::vec3 position, vec3 position,
glm::vec3 target, vec3 target,
glm::vec3 world_up, vec3 world_up,
float aspect_ratio) float aspect_ratio)
{ {
assert(aspect_ratio > 0); assert(aspect_ratio > 0);
@ -48,7 +54,7 @@ cameraInitPerspective(Camera* cam,
cam->view = cam->view =
glm::lookAt(cam->position, cam->position + cam->forward, cam->up); glm::lookAt(cam->position, cam->position + cam->forward, cam->up);
cam->model = glm::mat4(1.0f); cam->model = mat4(1.0f);
cam->MVP = cam->projection * cam->view * cam->model; cam->MVP = cam->projection * cam->view * cam->model;
} }
@ -60,49 +66,49 @@ cameraInitOrthographic(/*camera& cam, */)
// left, right, bottom, top, zNear, zFar // left, right, bottom, top, zNear, zFar
cam.projection = glm::ortho(0.f, 1280.0f, 0.f, 720.0f, 0.1f, 100.0f); cam.projection = glm::ortho(0.f, 1280.0f, 0.f, 720.0f, 0.1f, 100.0f);
cam.view = glm::lookAt( cam.view = glm::lookAt(
glm::vec3(0.0f, 0.0f, 1.0f), // camera position vec3(0.0f, 0.0f, 1.0f), // camera position
glm::vec3(0.0f, 0.0f, 0.0f), // look at position vec3(0.0f, 0.0f, 0.0f), // look at position
glm::vec3(0,1,0) // "up" vector vec3(0,1,0) // "up" vector
); );
cam.model = glm::mat4(1.0f); cam.model = mat4(1.0f);
cam.MVP = cam.projection * cam.view * cam.model; cam.MVP = cam.projection * cam.view * cam.model;
#endif #endif
} }
glm::vec2 vec2
cameraUnproject(Camera& cam, int x, int y, int vp_width, int vp_height) cameraUnproject(Camera& cam, int x, int y, int vp_width, int vp_height)
{ {
// NOTE: using depth buffer may not be as accurate as doing ray-cast // NOTE: using depth buffer may not be as accurate as doing ray-cast
GLfloat depth; GLfloat depth;
glReadPixels(x, y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &depth); glReadPixels(x, y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &depth);
glm::vec4 viewport = glm::vec4(0, 0, vp_width, vp_height); vec4 viewport = vec4(0, 0, vp_width, vp_height);
glm::vec3 wincoord = glm::vec3(x, y, depth); vec3 wincoord = vec3(x, y, depth);
glm::vec3 vU = glm::unProject(wincoord, cam.view, cam.projection, viewport); vec3 vU = glm::unProject(wincoord, cam.view, cam.projection, viewport);
return glm::vec2(vU.x, vU.y); return vec2(vU.x, vU.y);
} }
glm::vec3 vec3
cameraCreateRay(Camera& cam, glm::ivec2 vp_coords, glm::ivec2 vp_dims) cameraCreateRay(Camera& cam, ivec2 vp_coords, ivec2 vp_dims)
{ {
// NOTE: http://antongerdelan.net/opengl/raycasting.html // NOTE: http://antongerdelan.net/opengl/raycasting.html
float x = 2.f * vp_coords.x / vp_dims.x - 1.f; float x = 2.f * vp_coords.x / vp_dims.x - 1.f;
float y = 2.f * vp_coords.y / vp_dims.y - 1.f; float y = 2.f * vp_coords.y / vp_dims.y - 1.f;
glm::vec4 ray_clip = glm::vec4(x, y, -1.f, 1.f); vec4 ray_clip = vec4(x, y, -1.f, 1.f);
glm::vec4 ray_eye = glm::inverse(cam.projection) * ray_clip; vec4 ray_eye = glm::inverse(cam.projection) * ray_clip;
ray_eye = glm::vec4(ray_eye.x, ray_eye.y, -1.f, 0); // NOTE: reset as ray ray_eye = vec4(ray_eye.x, ray_eye.y, -1.f, 0); // NOTE: reset as ray
glm::vec4 ray_world = glm::normalize(glm::inverse(cam.view) * ray_eye); vec4 ray_world = glm::normalize(glm::inverse(cam.view) * ray_eye);
return glm::vec3(ray_world.x, ray_world.y, ray_world.z); return vec3(ray_world.x, ray_world.y, ray_world.z);
} }
bool bool
cameraIntersectPlane(Camera& cam, cameraIntersectPlane(Camera& cam,
glm::vec3 ray, vec3 ray,
glm::vec3 plane_origin, vec3 plane_origin,
glm::vec3 plane_normal, vec3 plane_normal,
glm::vec3& intersection) vec3& intersection)
{ {
// NOTE: https://www.scratchapixel.com/lessons/3d-basic-rendering/minimal-ray-tracer-rendering-simple-shapes/ray-plane-and-ray-disk-intersection // NOTE: https://www.scratchapixel.com/lessons/3d-basic-rendering/minimal-ray-tracer-rendering-simple-shapes/ray-plane-and-ray-disk-intersection
float divisor = glm::dot(ray, plane_normal); float divisor = glm::dot(ray, plane_normal);
@ -112,8 +118,8 @@ cameraIntersectPlane(Camera& cam,
float distance = float distance =
glm::dot((plane_origin - cam.position), plane_normal) / divisor; glm::dot((plane_origin - cam.position), plane_normal) / divisor;
glm::vec3 xsect = cam.position + (ray * distance); vec3 xsect = cam.position + (ray * distance);
intersection = glm::vec3(xsect.x, xsect.y, xsect.z); intersection = vec3(xsect.x, xsect.y, xsect.z);
return true; return true;
} }
@ -130,11 +136,11 @@ cameraMove(Camera& cam,
if (!up && !left && !down && !right && !forward && !backward) if (!up && !left && !down && !right && !forward && !backward)
return; return;
glm::vec3 f = cam.forward; vec3 f = cam.forward;
glm::vec3 u = cam.up; vec3 u = cam.up;
glm::vec3 old = cam.position; vec3 old = cam.position;
glm::vec3 &p = cam.position; vec3 &p = cam.position;
glm::vec3 v(0.f); // normalized direction vec3 v(0.f); // normalized direction
// TODO: still seems like we're adding magnitude when moving in 2 directions // TODO: still seems like we're adding magnitude when moving in 2 directions
#if 0 #if 0
@ -154,7 +160,7 @@ cameraMove(Camera& cam,
#endif #endif
p += (v * MOVE_SPEED); p += (v * MOVE_SPEED);
glm::vec3 diff = old - p; vec3 diff = old - p;
cam.view = glm::translate(cam.view, diff); cam.view = glm::translate(cam.view, diff);
cam.MVP = cam.projection * cam.view * cam.model; cam.MVP = cam.projection * cam.view * cam.model;
} }
@ -172,7 +178,7 @@ cameraRotate(Camera& cam, i32 xrel, i32 yrel)
if (v < (-1 * a)) v = (-1 * a); if (v < (-1 * a)) v = (-1 * a);
if (v > a) v = a; if (v > a) v = a;
cam.forward = glm::vec3( cam.forward = vec3(
glm::cos(v) * glm::sin(h), glm::cos(v) * glm::sin(h),
glm::cos(v) * glm::cos(h), glm::cos(v) * glm::cos(h),
glm::sin(v) glm::sin(v)
@ -195,10 +201,10 @@ cameraRoll(Camera& cam, bool CW, bool CCW)
float a = 0.005f; float a = 0.005f;
if (CW) a *= 1; if (CW) a *= 1;
if (CCW) a *= -1; if (CCW) a *= -1;
glm::mat4 m = glm::rotate(glm::mat4(1.f), a, cam.forward); mat4 m = glm::rotate(mat4(1.f), a, cam.forward);
glm::vec4 v(cam.up.x, cam.up.y, cam.up.z, 0); vec4 v(cam.up.x, cam.up.y, cam.up.z, 0);
v = v * m; v = v * m;
cam.up = glm::vec3(v.x, v.y, v.z); cam.up = vec3(v.x, v.y, v.z);
cam.view *= m; cam.view *= m;
cam.MVP = cam.projection * cam.view * cam.model; cam.MVP = cam.projection * cam.view * cam.model;
} }

Loading…
Cancel
Save