X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fcamera.cpp;h=c5283bd7f77bf86729b688342265dc4919bab47f;hb=6af76d9e1a6499ebdab405c1d679d24b9e19fded;hp=239ddb2b429887ada5970dbe560acbfc14e003a6;hpb=49c81f76b80e0de99ca57db49510eb5e3385e1d1;p=blank.git diff --git a/src/camera.cpp b/src/camera.cpp index 239ddb2..c5283bd 100644 --- a/src/camera.cpp +++ b/src/camera.cpp @@ -7,20 +7,17 @@ namespace blank { Camera::Camera() -: Model() +: FPSController() , fov(45.0f) , aspect(1.0f) , near_clip(0.1f) , far_clip(100.0f) , projection(glm::perspective(fov, aspect, near_clip, far_clip)) +, view(glm::inverse(Transform())) , vp(projection) { } -Camera::~Camera() { - -} - void Camera::Viewport(int width, int height) { Viewport(0, 0, width, height); @@ -51,10 +48,20 @@ void Camera::Clip(float near, float far) { UpdateProjection(); } +Ray Camera::Aim() const { + const glm::mat4 inv_vp(glm::inverse(vp)); + glm::vec4 from = inv_vp * glm::vec4(0.0f, 0.0f, -1.0f, 1.0f); + from /= from.w; + glm::vec4 to = inv_vp * glm::vec4(0.0f, 0.0f, 1.0f, 1.0f); + to /= to.w; + return Ray{ glm::vec3(from), glm::normalize(glm::vec3(to - from)) }; +} + void Camera::Update(int dt) { - Model::Update(dt); - vp = projection * glm::inverse(Transform()); + FPSController::Update(dt); + view = glm::inverse(Transform()); + vp = projection * view; } void Camera::UpdateProjection() {