Index: new-game.cpp
===================================================================
--- new-game.cpp	(revision 5c403fecfed31f9b005c8678b6ca61548f968d4b)
+++ new-game.cpp	(revision 809ce169f0d59f7ae6c3baf93229105b1ef66cb9)
@@ -475,4 +475,5 @@
    float cam_speed = 1.0f;
    float cam_yaw_speed = 60.0f*ONE_DEG_IN_RAD;
+   float cam_pitch_speed = 60.0f*ONE_DEG_IN_RAD;
 
    // glm::lookAt can create the view matrix
@@ -481,4 +482,5 @@
    cam_pos = vec3(0.0f, 0.0f, 2.0f);
    float cam_yaw = 0.0f * 2.0f * 3.14159f / 360.0f;
+   float cam_pitch = 0.0f * 2.0f * 3.14159f / 360.0f;
 
    mat4 T = translate(mat4(), vec3(-cam_pos.x, -cam_pos.y, -cam_pos.z));
@@ -636,24 +638,24 @@
       float dist = cam_speed * elapsed_seconds;
       if (glfwGetKey(window, GLFW_KEY_A)) {
-         cam_pos.x -= cos(cam_yaw)*dist;
-         cam_pos.z += sin(cam_yaw)*dist;
+         vec3 dir = (inverse(R) * vec4(-1.0f, 0.0f, 0.0f, 1.0f)).xyz();
+         cam_pos += dir * dist;
 
          cam_moved = true;
       }
       if (glfwGetKey(window, GLFW_KEY_D)) {
-         cam_pos.x += cos(cam_yaw)*dist;
-         cam_pos.z -= sin(cam_yaw)*dist;
+         vec3 dir = (inverse(R) * vec4(1.0f, 0.0f, 0.0f, 1.0f)).xyz();
+         cam_pos += dir * dist;
 
          cam_moved = true;
       }
       if (glfwGetKey(window, GLFW_KEY_W)) {
-         cam_pos.x -= sin(cam_yaw)*dist;
-         cam_pos.z -= cos(cam_yaw)*dist;
+         vec3 dir = (inverse(R) * vec4(0.0f, 0.0f, -1.0f, 1.0f)).xyz();
+         cam_pos += dir * dist;
 
          cam_moved = true;
       }
       if (glfwGetKey(window, GLFW_KEY_S)) {
-         cam_pos.x += sin(cam_yaw)*dist;
-         cam_pos.z += cos(cam_yaw)*dist;
+         vec3 dir = (inverse(R) * vec4(0.0f, 0.0f, 1.0f, 1.0f)).xyz();
+         cam_pos += dir * dist;
 
          cam_moved = true;
@@ -667,9 +669,22 @@
          cam_moved = true;
       }
+      if (glfwGetKey(window, GLFW_KEY_UP)) {
+         cam_pitch += cam_pitch_speed * elapsed_seconds;
+         cam_moved = true;
+      }
+      if (glfwGetKey(window, GLFW_KEY_DOWN)) {
+         cam_pitch -= cam_pitch_speed * elapsed_seconds;
+         cam_moved = true;
+      }
       if (cam_moved) {
          T = translate(mat4(), vec3(-cam_pos.x, -cam_pos.y, -cam_pos.z));
-         R = rotate(mat4(), -cam_yaw, vec3(0.0f, 1.0f, 0.0f));
+
+         mat4 yaw_mat = rotate(mat4(), -cam_yaw, vec3(0.0f, 1.0f, 0.0f));
+         mat4 pitch_mat = rotate(mat4(), -cam_pitch, vec3(1.0f, 0.0f, 0.0f));
+         R = pitch_mat * yaw_mat;
 
          view_mat = R*T;
+
+         printVector("cam pos", cam_pos);
 
          glUseProgram(color_sp);
