namespace {
constexpr GLfloat vtx_coords[] = {
- -1.0f, -1.0f, -5.0f,
- 1.0f, -1.0f, -5.0f,
- 0.0f, 1.0f, -5.0f,
+ -1.0f, -1.0f, 0.0f,
+ 1.0f, -1.0f, 0.0f,
+ 0.0f, 1.0f, 0.0f,
};
}
Application::Application()
: init_sdl()
+, init_img()
, init_gl()
, window()
, ctx(window.CreateContext())
, init_glew()
, program()
+, move_velocity(0.001f)
+, pitch_sensitivity(-0.0025f)
+, yaw_sensitivity(-0.001f)
, cam()
+, model()
, vtx_buf(0)
, mvp_handle(0)
-, running(false) {
+, running(false)
+, front(false)
+, back(false)
+, left(false)
+, right(false)
+, up(false)
+, down(false) {
GLContext::EnableVSync();
program.LoadShader(
GL_VERTEX_SHADER,
glBindBuffer(GL_ARRAY_BUFFER, vtx_buf);
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");
glClearColor(0.0, 0.0, 0.0, 1.0);
void Application::Run() {
running = true;
Uint32 last = SDL_GetTicks();
+ window.GrabMouse();
while (running) {
Uint32 now = SDL_GetTicks();
int delta = now - last;
void Application::Loop(int dt) {
HandleEvents();
+ Update(dt);
Render();
}
SDL_Event event;
while (SDL_PollEvent(&event)) {
switch (event.type) {
+ case SDL_KEYDOWN:
+ case SDL_KEYUP:
+ switch (event.key.keysym.sym) {
+ case SDLK_w:
+ front = event.key.state == SDL_PRESSED;
+ break;
+ case SDLK_s:
+ back = event.key.state == SDL_PRESSED;
+ break;
+ case SDLK_a:
+ left = event.key.state == SDL_PRESSED;
+ break;
+ case SDLK_d:
+ right = event.key.state == SDL_PRESSED;
+ break;
+ case SDLK_q:
+ up = event.key.state == SDL_PRESSED;
+ break;
+ case SDLK_e:
+ down = event.key.state == SDL_PRESSED;
+ break;
+ }
+ break;
+ case SDL_MOUSEMOTION:
+ cam.RotateYaw(event.motion.xrel * yaw_sensitivity);
+ cam.RotatePitch(event.motion.yrel * pitch_sensitivity);
+ break;
case SDL_QUIT:
running = false;
break;
}
}
+void Application::Update(int dt) {
+ glm::vec3 vel;
+ if (right && !left) {
+ vel.x = move_velocity;
+ } else if (left && !right) {
+ vel.x = -move_velocity;
+ }
+ if (up && !down) {
+ vel.y = move_velocity;
+ } else if (down && !up) {
+ vel.y = -move_velocity;
+ }
+ if (back && !front) {
+ vel.z = move_velocity;
+ } else if (front && !back) {
+ vel.z = -move_velocity;
+ }
+ cam.Velocity(vel);
+
+ cam.Update(dt);
+ model.Update(dt);
+}
+
void Application::Render() {
glClear(GL_COLOR_BUFFER_BIT);
program.Use();
- glm::mat4 model(1.0f); // identity: no transformation
- glm::mat4 mvp(cam.MakeMVP(model));
+ glm::mat4 mvp(cam.MakeMVP(model.Transform()));
glUniformMatrix4fv(mvp_handle, 1, GL_FALSE, &mvp[0][0]);
glEnableVertexAttribArray(0);