summaryrefslogtreecommitdiff
path: root/inc/opengl/camera.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'inc/opengl/camera.hpp')
-rw-r--r--inc/opengl/camera.hpp57
1 files changed, 57 insertions, 0 deletions
diff --git a/inc/opengl/camera.hpp b/inc/opengl/camera.hpp
new file mode 100644
index 0000000..62ae837
--- /dev/null
+++ b/inc/opengl/camera.hpp
@@ -0,0 +1,57 @@
+#ifndef camera_h
+#define camera_h
+
+struct Camera
+{
+ public:
+ Camera(const glm::vec3& pos, float fov, float aspect, float zNear, float zFar){
+ this->pos = pos;
+ this->forward = glm::vec3(0.0f, 0.0f, -1.0f);
+ this->up = glm::vec3(0.0f, 1.0f, 0.0f);
+ this->projection = glm::perspective(fov, aspect, zNear, zFar);
+ }
+
+ inline glm::mat4 GetViewProjection() const {
+ return projection * glm::lookAt(pos, pos + forward, up);
+ }
+
+ void MoveForward(){
+ pos += forward * amt;
+ }
+
+ void MoveBackward(){
+ pos += forward * -amt;
+ }
+
+ void MoveRight(){
+ pos += -glm::cross(up, forward) * amt;
+ }
+
+ void MoveLeft(){
+ pos += glm::cross(up, forward) * amt;
+ }
+
+ void MoveUp(){
+ pos += glm::vec3(0,.2,0);
+ }
+
+ void MoveDown(){
+ pos -= glm::vec3(0,.2,0);
+ }
+
+ void Pitch(float angle){
+ glm::vec3 right = glm::normalize(glm::cross(up, forward));
+
+ forward = glm::vec3(glm::normalize(glm::rotate(angle, right) * glm::vec4(forward, 0.0)));
+ up = glm::normalize(glm::cross(forward, right));
+ }
+
+ private:
+ float amt = .2;
+ glm::mat4 projection;
+ glm::vec3 pos;
+ glm::vec3 forward;
+ glm::vec3 up;
+};
+
+#endif