]> git.localhorst.tv Git - tacos.git/blobdiff - src/tacos.cpp
controllable camera
[tacos.git] / src / tacos.cpp
index 580becb9caa0e391a5b779de2010976a9609ad22..0e47e6e27af2baa545bbd961d1d0aab3f0887fcf 100644 (file)
@@ -1,6 +1,7 @@
 #include "app/assets.hpp"
 #include "app/config.hpp"
 #include "app/init.hpp"
+#include "app/keymap.hpp"
 #include "graphics/camera.hpp"
 #include "graphics/shader.hpp"
 #include "graphics/viewport.hpp"
@@ -24,6 +25,9 @@ int main(int argc, char *argv[]) {
        Window window(1440, 900);
        Viewport viewport(1440, 900);
 
+       Keymap keymap;
+       keymap.LoadDefault();
+
        constexpr float noise_scale = 1.0f/64.0f;
        constexpr float height_scale = 5.0f;
 
@@ -46,21 +50,123 @@ int main(int argc, char *argv[]) {
        }
        floor.GenerateVertices();
 
-       glm::vec3 focus(20.0f, 0.0f, 20.0f);
-       Camera camera(focus);
+       Camera camera;
+       camera.Warp(glm::vec3(20.0f, 0.0f, 20.0f));
 
        glm::mat4 M;
        glm::mat4 V;
        glm::mat4 MV;
        glm::mat4 MVP;
 
+       constexpr float cam_speed = 15.0f; // units per second
+       constexpr float cam_rot_speed = 2.0f; // radians per second
+
+       glm::vec3 cam_fwd(0.0f);
+       glm::vec3 cam_rev(0.0f);
+       float cam_near = 0.0f;
+       float cam_far = 0.0f;
+       glm::vec2 cam_rot_ccw(0.0f);
+       glm::vec2 cam_rot_cw(0.0f);
+
        floor_program.Use();
 
        bool running = true;
+       Uint32 last = SDL_GetTicks();
        SDL_Event event;
        while (running) {
+               Uint32 now = SDL_GetTicks();
+               // handle
                while (SDL_PollEvent(&event)) {
                        switch (event.type) {
+                               case SDL_KEYDOWN:
+                                       switch (keymap.Lookup(event.key)) {
+                                               case Keymap::CAMERA_RIGHT:
+                                                       cam_fwd.x = 1.0f;
+                                                       break;
+                                               case Keymap::CAMERA_LEFT:
+                                                       cam_rev.x = 1.0f;
+                                                       break;
+                                               case Keymap::CAMERA_UP:
+                                                       cam_fwd.y = 1.0f;
+                                                       break;
+                                               case Keymap::CAMERA_DOWN:
+                                                       cam_rev.y = 1.0f;
+                                                       break;
+                                               case Keymap::CAMERA_BACK:
+                                                       cam_fwd.z = 1.0f;
+                                                       break;
+                                               case Keymap::CAMERA_FORWARD:
+                                                       cam_rev.z = 1.0f;
+                                                       break;
+                                               case Keymap::CAMERA_NEARER:
+                                                       cam_near = 1.0f;
+                                                       break;
+                                               case Keymap::CAMERA_FARTHER:
+                                                       cam_far = 1.0f;
+                                                       break;
+                                               case Keymap::CAMERA_PITCH_CCW:
+                                                       cam_rot_ccw.x = 1.0f;
+                                                       break;
+                                               case Keymap::CAMERA_PITCH_CW:
+                                                       cam_rot_cw.x = 1.0f;
+                                                       break;
+                                               case Keymap::CAMERA_YAW_CCW:
+                                                       cam_rot_ccw.y = 1.0f;
+                                                       break;
+                                               case Keymap::CAMERA_YAW_CW:
+                                                       cam_rot_cw.y = 1.0f;
+                                                       break;
+                                               case Keymap::EXIT:
+                                                       running = false;
+                                                       break;
+                                               default:
+                                               case Keymap::NONE:
+                                                       break;
+                                       }
+                                       break;
+                               case SDL_KEYUP:
+                                       switch (keymap.Lookup(event.key)) {
+                                               case Keymap::CAMERA_RIGHT:
+                                                       cam_fwd.x = 0.0f;
+                                                       break;
+                                               case Keymap::CAMERA_LEFT:
+                                                       cam_rev.x = 0.0f;
+                                                       break;
+                                               case Keymap::CAMERA_UP:
+                                                       cam_fwd.y = 0.0f;
+                                                       break;
+                                               case Keymap::CAMERA_DOWN:
+                                                       cam_rev.y = 0.0f;
+                                                       break;
+                                               case Keymap::CAMERA_BACK:
+                                                       cam_fwd.z = 0.0f;
+                                                       break;
+                                               case Keymap::CAMERA_FORWARD:
+                                                       cam_rev.z = 0.0f;
+                                                       break;
+                                               case Keymap::CAMERA_NEARER:
+                                                       cam_near = 0.0f;
+                                                       break;
+                                               case Keymap::CAMERA_FARTHER:
+                                                       cam_far = 0.0f;
+                                                       break;
+                                               case Keymap::CAMERA_PITCH_CCW:
+                                                       cam_rot_ccw.x = 0.0f;
+                                                       break;
+                                               case Keymap::CAMERA_PITCH_CW:
+                                                       cam_rot_cw.x = 0.0f;
+                                                       break;
+                                               case Keymap::CAMERA_YAW_CCW:
+                                                       cam_rot_ccw.y = 0.0f;
+                                                       break;
+                                               case Keymap::CAMERA_YAW_CW:
+                                                       cam_rot_cw.y = 0.0f;
+                                                       break;
+                                               default:
+                                               case Keymap::NONE:
+                                                       break;
+                                       }
+                                       break;
                                case SDL_QUIT:
                                        running = false;
                                        break;
@@ -73,6 +179,14 @@ int main(int argc, char *argv[]) {
                                        break;
                        }
                }
+
+               // update
+               float dt = (now - last) * 0.001f;
+               camera.Move((cam_fwd - cam_rev) * cam_speed * dt);
+               camera.BackOff((cam_far - cam_near) * cam_speed * dt);
+               camera.Rotate((cam_rot_ccw - cam_rot_cw) * cam_rot_speed * dt);
+
+               // render
                V = camera.View();
                glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
                for (int z = 0; z < floor.VAODepth(); ++z) {
@@ -86,6 +200,8 @@ int main(int argc, char *argv[]) {
                        }
                }
                window.Flip();
+
+               last = now;
        }
 
        return 0;