namespace blank {
Camera::Camera()
-: fov(45.0f)
+: FPSController()
+, fov(45.0f)
, aspect(1.0f)
, near_clip(0.1f)
, far_clip(100.0f)
-, position(0, 0, 0)
-, target(0, 0, -1)
-, up(0, 1, 0)
, projection(glm::perspective(fov, aspect, near_clip, far_clip))
-, view(glm::lookAt(position, target, up))
-, vp(projection * view) {
-
-}
-
-Camera::~Camera() {
+, view(glm::inverse(Transform())) {
}
UpdateProjection();
}
+Ray Camera::Aim() const {
+ const glm::mat4 inv_vp(glm::inverse(projection * view));
+ 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::UpdateProjection() {
- projection = glm::perspective(fov, aspect, near_clip, far_clip);
- vp = projection * view;
+
+void Camera::Update(int dt) {
+ FPSController::Update(dt);
+ view = glm::inverse(Transform());
}
-void Camera::UpdateView() {
- view = glm::lookAt(position, target, up);
- vp = projection * view;
+void Camera::UpdateProjection() {
+ projection = glm::perspective(fov, aspect, near_clip, far_clip);
}
}