#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"
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;
}
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;
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) {
}
}
window.Flip();
+
+ last = now;
}
return 0;