, 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,
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);
- std::cout << "x: " << event.motion.xrel << ", y: " << event.motion.yrel
- << ", pitch: " << cam.Pitch() << ", yaw: " << cam.Yaw() << std::endl;
break;
case SDL_QUIT:
running = false;
}
}
+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);
void Loop(int dt);
void HandleEvents();
+ void Update(int dt);
void Render();
private:
InitGLEW init_glew;
Program program;
+ float move_velocity;
float pitch_sensitivity;
float yaw_sensitivity;
bool running;
+ bool front, back, left, right, up, down;
+
};
}
namespace blank {
Camera::Camera()
-: fov(45.0f)
+: Model()
+, fov(45.0f)
, aspect(1.0f)
, near_clip(0.1f)
, far_clip(100.0f)
-, model()
, projection(glm::perspective(fov, aspect, near_clip, far_clip))
-, view(model.Transform())
-, vp(projection * view) {
+, vp(projection) {
}
}
-void Camera::UpdateProjection() {
- projection = glm::perspective(fov, aspect, near_clip, far_clip);
- vp = projection * view;
+void Camera::Update(int dt) {
+ Model::Update(dt);
+ vp = projection * glm::inverse(Transform());
}
-void Camera::UpdateView() {
- view = glm::inverse(model.Transform());
- vp = projection * view;
+void Camera::UpdateProjection() {
+ projection = glm::perspective(fov, aspect, near_clip, far_clip);
}
}
namespace blank {
-class Camera {
+class Camera
+: public Model {
public:
Camera();
void Aspect(float w, float h);
void Clip(float near, float far);
- void Position(glm::vec3 pos) { model.Position(pos); UpdateView(); }
- void Move(glm::vec3 delta) { model.Move(delta); 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(); }
+ void Update(int dt);
private:
void UpdateProjection();
- void UpdateView();
private:
float fov;
float near_clip;
float far_clip;
- Model model;
-
glm::mat4 projection;
- glm::mat4 view;
glm::mat4 vp;
};
namespace blank {
Model::Model()
-: position(0, 0, 0)
+: velocity(0, 0, 0)
+, position(0, 0, 0)
, pitch(0)
, yaw(0) {
return glm::translate(position) * glm::eulerAngleYX(yaw, pitch);
}
+
+void Model::Update(int dt) {
+ position += velocity * float(dt);
+}
+
}
glm::mat4 Transform() const;
+ void Velocity(glm::vec3 vel) { velocity = vel; }
void Position(glm::vec3 pos) { position = pos; }
void Move(glm::vec3 delta) { position += delta; }
void Yaw(float y) { yaw = y; }
void RotateYaw(float delta) { yaw += delta; }
+ void Update(int dt);
+
private:
+ glm::vec3 velocity;
glm::vec3 position;
float pitch;
float yaw;