]> git.localhorst.tv Git - blank.git/commitdiff
mouse controlled camera pitch/yaw
authorDaniel Karbach <daniel.karbach@localhorst.tv>
Thu, 12 Feb 2015 21:13:25 +0000 (22:13 +0100)
committerDaniel Karbach <daniel.karbach@localhorst.tv>
Thu, 12 Feb 2015 21:13:25 +0000 (22:13 +0100)
src/app.cpp
src/app.hpp
src/camera.cpp
src/camera.hpp
src/init.cpp
src/init.hpp
src/model.hpp

index 038aa1aebbcd16a7ad4a1ae4a50830e4b41b59d1..ff5a3bef59f1a3081b2a5c93ceae49953670ee03 100644 (file)
@@ -24,6 +24,8 @@ Application::Application()
 , ctx(window.CreateContext())
 , init_glew()
 , program()
+, pitch_sensitivity(-0.0025f)
+, yaw_sensitivity(-0.001f)
 , cam()
 , model()
 , vtx_buf(0)
@@ -63,6 +65,7 @@ Application::Application()
        glBufferData(GL_ARRAY_BUFFER, sizeof(vtx_coords), vtx_coords, GL_STATIC_DRAW);
 
        model.Position(glm::vec3(0, 0, -4));
+       cam.Position(glm::vec3(0, 0, 4));
 
        mvp_handle = program.UniformLocation("MVP");
 
@@ -77,6 +80,7 @@ Application::~Application() {
 void Application::Run() {
        running = true;
        Uint32 last = SDL_GetTicks();
+       window.GrabMouse();
        while (running) {
                Uint32 now = SDL_GetTicks();
                int delta = now - last;
@@ -95,6 +99,12 @@ void Application::HandleEvents() {
        SDL_Event event;
        while (SDL_PollEvent(&event)) {
                switch (event.type) {
+                       case SDL_MOUSEMOTION:
+                               cam.RotateYaw(event.motion.xrel * yaw_sensitivity);
+                               cam.RotatePitch(event.motion.yrel * pitch_sensitivity);
+                               std::cout << "x: " << event.motion.xrel << ", y: " << event.motion.yrel
+                                               << ", pitch: " << cam.Pitch() << ", yaw: " << cam.Yaw() << std::endl;
+                               break;
                        case SDL_QUIT:
                                running = false;
                                break;
index 4e381a2a2fa6d7e388ab3884ad7dc33f0227eaf5..8bafb2368d4f685c7b60f629e5bcd39e6b883fca 100644 (file)
@@ -36,6 +36,9 @@ private:
        InitGLEW init_glew;
        Program program;
 
+       float pitch_sensitivity;
+       float yaw_sensitivity;
+
        Camera cam;
        Model model;
 
index 8309fe6414965b2a67d7c560f7c30e3d34227db6..21df87414cee2ce382a3e2014efb94187c602240 100644 (file)
@@ -11,11 +11,9 @@ Camera::Camera()
 , aspect(1.0f)
 , near_clip(0.1f)
 , far_clip(100.0f)
-, position(0, 0, 0)
-, target(0, 0, -1)
-, up(0, 1, 0)
+, model()
 , projection(glm::perspective(fov, aspect, near_clip, far_clip))
-, view(glm::lookAt(position, target, up))
+, view(model.Transform())
 , vp(projection * view) {
 
 }
@@ -61,7 +59,7 @@ void Camera::UpdateProjection() {
 }
 
 void Camera::UpdateView() {
-       view = glm::lookAt(position, target, up);
+       view = glm::inverse(model.Transform());
        vp = projection * view;
 }
 
index 5be71e24295a7142f0bc2db146d1a3f3c2065ea8..88da8caf858aff87a3aacada9bd8cf865d2c300e 100644 (file)
@@ -3,6 +3,8 @@
 
 #include <glm/glm.hpp>
 
+#include "model.hpp"
+
 
 namespace blank {
 
@@ -25,10 +27,16 @@ public:
        void Aspect(float w, float h);
        void Clip(float near, float far);
 
-       void Position(glm::vec3 pos) { position = pos; UpdateView(); }
-       void Move(glm::vec3 delta) { position += delta; UpdateView(); }
+       void Position(glm::vec3 pos) { model.Position(pos); UpdateView(); }
+       void Move(glm::vec3 delta) { model.Move(delta); UpdateView(); }
 
-       void LookAt(glm::vec3 tgt) { target = tgt; UpdateView(); }
+       // all angles in radians (full circle = 2π)
+       float Pitch() const { return model.Pitch(); }
+       void Pitch(float p) { model.Pitch(p); UpdateView(); }
+       void RotatePitch(float delta) { model.RotatePitch(delta); UpdateView(); }
+       float Yaw() const { return model.Yaw(); }
+       void Yaw(float y) { model.Yaw(y); UpdateView(); }
+       void RotateYaw(float delta) { model.RotateYaw(delta); UpdateView(); }
 
 private:
        void UpdateProjection();
@@ -40,9 +48,7 @@ private:
        float near_clip;
        float far_clip;
 
-       glm::vec3 position;
-       glm::vec3 target;
-       glm::vec3 up;
+       Model model;
 
        glm::mat4 projection;
        glm::mat4 view;
index 20f4fe4e6c0693b7e2e235eabc4173a316ed9215..4772898fb364119cb53f469b32984c445bf0e722 100644 (file)
@@ -83,6 +83,26 @@ Window::~Window() {
        SDL_DestroyWindow(handle);
 }
 
+void Window::GrabInput() {
+       SDL_SetWindowGrab(handle, SDL_TRUE);
+}
+
+void Window::ReleaseInput() {
+       SDL_SetWindowGrab(handle, SDL_FALSE);
+}
+
+void Window::GrabMouse() {
+       if (SDL_SetRelativeMouseMode(SDL_TRUE) != 0) {
+               sdl_error("SDL_SetRelativeMouseMode");
+       }
+}
+
+void Window::ReleaseMouse() {
+       if (SDL_SetRelativeMouseMode(SDL_FALSE) != 0) {
+               sdl_error("SDL_SetRelativeMouseMode");
+       }
+}
+
 GLContext Window::CreateContext() {
        return GLContext(handle);
 }
index bf6191b1daf6e1c3e7a8afacb13b3c5d87d0d532..a2f2de7779ec94ddb20d7a1664ab2ef2e873c0b5 100644 (file)
@@ -54,6 +54,12 @@ public:
        Window(const Window &) = delete;
        Window &operator =(const Window &) = delete;
 
+       void GrabInput();
+       void ReleaseInput();
+
+       void GrabMouse();
+       void ReleaseMouse();
+
        GLContext CreateContext();
 
        void Flip();
index c0bda4112fe052231340dbcd3a30ce7857e4c3df..938fd4453d6f700d51391509ab07a97b305a1676 100644 (file)
@@ -18,8 +18,10 @@ public:
        void Move(glm::vec3 delta) { position += delta; }
 
        // all angles in radians (full circle = 2π)
+       float Pitch() const { return pitch; }
        void Pitch(float p) { pitch = p; }
        void RotatePitch(float delta) { pitch += delta; }
+       float Yaw() const { return yaw; }
        void Yaw(float y) { yaw = y; }
        void RotateYaw(float delta) { yaw += delta; }