|
|
|
|
@ -19,7 +19,7 @@ using glm::mat4;
|
|
|
|
|
#define ROTATE_SPEED 0.005f |
|
|
|
|
#define CAMERA_Z_CLAMP_ANGLE 85.f |
|
|
|
|
#define FOV 60.f |
|
|
|
|
#define NEAR_CLIP_PLANE 20.f |
|
|
|
|
#define NEAR_CLIP_PLANE 5.f |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// forward declarations
|
|
|
|
|
@ -39,7 +39,7 @@ cameraInitPerspective(Camera* cam,
|
|
|
|
|
cam->position = position; |
|
|
|
|
cam->target = target; |
|
|
|
|
cam->world_up = world_up; |
|
|
|
|
cam->projection = glm::infinitePerspective(glm::radians(FOV), |
|
|
|
|
cam->xforms.projection = glm::infinitePerspective(glm::radians(FOV), |
|
|
|
|
aspect_ratio, |
|
|
|
|
NEAR_CLIP_PLANE); |
|
|
|
|
|
|
|
|
|
@ -53,10 +53,8 @@ cameraInitPerspective(Camera* cam,
|
|
|
|
|
glm::pow(cam->forward.x, 2)); |
|
|
|
|
cam->vAngle = glm::atan(cam->forward.z, len); |
|
|
|
|
|
|
|
|
|
cam->view = |
|
|
|
|
cam->xforms.view= |
|
|
|
|
glm::lookAt(cam->position, cam->position + cam->forward, cam->up); |
|
|
|
|
cam->model = mat4(1.0f); |
|
|
|
|
cam->MVP = cam->projection * cam->view * cam->model; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// TODO: re-add orthographic camera
|
|
|
|
|
@ -80,6 +78,7 @@ cameraInitOrthographic(/*camera& cam, */)
|
|
|
|
|
vec2 |
|
|
|
|
cameraUnproject(Camera& cam, int x, int y, int vp_width, int vp_height) |
|
|
|
|
{ |
|
|
|
|
#if 0 |
|
|
|
|
// NOTE: using depth buffer may not be as accurate as doing ray-cast
|
|
|
|
|
GLfloat depth; |
|
|
|
|
glReadPixels(x, y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &depth); |
|
|
|
|
@ -88,11 +87,14 @@ cameraUnproject(Camera& cam, int x, int y, int vp_width, int vp_height)
|
|
|
|
|
vec3 vU = glm::unProject(wincoord, cam.view, cam.projection, viewport); |
|
|
|
|
|
|
|
|
|
return vec2(vU.x, vU.y); |
|
|
|
|
#endif |
|
|
|
|
return vec2(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
vec3 |
|
|
|
|
cameraCreateRay(Camera& cam, ivec2 vp_coords, ivec2 vp_dims) |
|
|
|
|
{ |
|
|
|
|
#if 0 |
|
|
|
|
// NOTE: http://antongerdelan.net/opengl/raycasting.html
|
|
|
|
|
float x = 2.f * vp_coords.x / vp_dims.x - 1.f; |
|
|
|
|
float y = 2.f * vp_coords.y / vp_dims.y - 1.f; |
|
|
|
|
@ -102,6 +104,8 @@ cameraCreateRay(Camera& cam, ivec2 vp_coords, ivec2 vp_dims)
|
|
|
|
|
vec4 ray_world = glm::normalize(glm::inverse(cam.view) * ray_eye); |
|
|
|
|
|
|
|
|
|
return vec3(ray_world.x, ray_world.y, ray_world.z); |
|
|
|
|
#endif |
|
|
|
|
return vec3(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool |
|
|
|
|
@ -162,8 +166,9 @@ cameraMove(Camera& cam,
|
|
|
|
|
|
|
|
|
|
p += (v * MOVE_SPEED); |
|
|
|
|
vec3 diff = old - p; |
|
|
|
|
cam.view = glm::translate(cam.view, diff); |
|
|
|
|
cam.MVP = cam.projection * cam.view * cam.model; |
|
|
|
|
cam.xforms.view = glm::translate(cam.xforms.view, diff); |
|
|
|
|
//cam.view = glm::translate(cam.view, diff);
|
|
|
|
|
//cam.MVP = cam.projection * cam.view * cam.model;
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void |
|
|
|
|
@ -189,13 +194,16 @@ cameraRotate(Camera& cam, i32 xrel, i32 yrel)
|
|
|
|
|
cam.left = glm::normalize(glm::cross(cam.forward, cam.world_up)); |
|
|
|
|
cam.up = glm::normalize(glm::cross(cam.left, cam.forward)); |
|
|
|
|
|
|
|
|
|
cam.view = glm::lookAt(cam.position, cam.position + cam.forward, cam.up); |
|
|
|
|
cam.MVP = cam.projection * cam.view * cam.model; |
|
|
|
|
cam.xforms.view = glm::lookAt(cam.position, |
|
|
|
|
cam.position + cam.forward, |
|
|
|
|
cam.up); |
|
|
|
|
//cam.MVP = cam.projection * cam.view * cam.model;
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void |
|
|
|
|
cameraRoll(Camera& cam, bool CW, bool CCW) |
|
|
|
|
{ |
|
|
|
|
#if 0 |
|
|
|
|
if ((!CW && !CCW) || (CW && CCW)) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
@ -208,6 +216,7 @@ cameraRoll(Camera& cam, bool CW, bool CCW)
|
|
|
|
|
cam.up = vec3(v.x, v.y, v.z); |
|
|
|
|
cam.view *= m; |
|
|
|
|
cam.MVP = cam.projection * cam.view * cam.model; |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// internal
|
|
|
|
|
|