Index: new-game.cpp
===================================================================
--- new-game.cpp	(revision f7d35dac677240a84b5a5c21202fc406d3227a0a)
+++ new-game.cpp	(revision 5c403fecfed31f9b005c8678b6ca61548f968d4b)
@@ -39,8 +39,9 @@
 struct SceneObject {
    unsigned int id;
-   mat4 model_mat;
+   mat4 model_mat, model_base, model_transform;
    GLuint shader_program;
    unsigned int num_points;
    GLint vertex_vbo_offset;
+   GLint ubo_offset;
    vector<GLfloat> points;
    vector<GLfloat> colors;
@@ -123,4 +124,6 @@
                      map<GLuint, unsigned int>& shaderCounts,
                      map<GLuint, unsigned int>& curShaderBase);
+
+void transformObject(SceneObject& obj, const mat4& transform, GLuint ubo);
 
 void renderMainMenu();
@@ -324,5 +327,5 @@
    T_model = translate(mat4(), vec3(0.45f, 0.0f, 0.0f));
    R_model = rotate(mat4(), 0.0f, vec3(0.0f, 1.0f, 0.0f));
-   obj.model_mat = T_model*R_model;
+   obj.model_base = T_model*R_model;
 
    addObjectToScene(obj);
@@ -366,5 +369,5 @@
    T_model = translate(mat4(), vec3(-0.5f, 0.0f, -1.00f));
    R_model = rotate(mat4(), 0.5f, vec3(0.0f, 1.0f, 0.0f));
-   obj.model_mat = T_model*R_model;
+   obj.model_base = T_model*R_model;
 
    addObjectToScene(obj);
@@ -408,5 +411,5 @@
    T_model = translate(mat4(), vec3(0.0f, -0.9f, 0.0f));
    R_model = rotate(mat4(), -1.0f, vec3(1.0f, 0.0f, 0.0f));
-   obj.model_mat = T_model; //T_model * R_model;
+   obj.model_base = T_model; //T_model * R_model;
 
    addObjectToScene(obj);
@@ -480,5 +483,5 @@
 
    mat4 T = translate(mat4(), vec3(-cam_pos.x, -cam_pos.y, -cam_pos.z));
-   mat4 R = rotate(mat4(), -cam_yaw, vec3(0.0f, 1.0f, 0.0f));
+   mat4 R = mat4();
    view_mat = R*T;
 
@@ -593,5 +596,5 @@
          /*
          if (key_state[GLFW_KEY_SPACE] == GLFW_PRESS) {
-            //transformObject(objects[1], translate(mat4(), vec3(0.3f, 0.0f, 0.0f)), ubo);
+            transformObject(objects[1], translate(mat4(), vec3(0.3f, 0.0f, 0.0f)), ubo);
          }
          if (key_pressed[GLFW_KEY_RIGHT]) {
@@ -885,4 +888,5 @@
    obj.id = objects.size(); // currently unused
    obj.num_points = obj.points.size() / 3;
+   obj.model_transform = mat4();
 
    obj.normals.reserve(obj.points.size());
@@ -1009,8 +1013,7 @@
    glBufferData(GL_ARRAY_BUFFER, model_mat_idx_buffer_size, NULL, GL_DYNAMIC_DRAW);
 
-   GLint vertex_ubo_offset;
    for (it = objects.begin(); it != objects.end(); it++) {
       it->vertex_vbo_offset = curShaderBase[it->shader_program] + curShaderOffset[it->shader_program];
-      vertex_ubo_offset = curShaderUboBase[it->shader_program] + curShaderUboOffset[it->shader_program];
+      it->ubo_offset = curShaderUboBase[it->shader_program] + curShaderUboOffset[it->shader_program];
 
       glBindBuffer(GL_ARRAY_BUFFER, *points_vbo);
@@ -1031,14 +1034,23 @@
       glBindBuffer(GL_ARRAY_BUFFER, *model_mat_idx_vbo);
       for (int i = 0; i < it->num_points; i++) {
-         glBufferSubData(GL_ARRAY_BUFFER, (it->vertex_vbo_offset + i) * sizeof(GLuint), sizeof(GLuint), &vertex_ubo_offset);
+         glBufferSubData(GL_ARRAY_BUFFER, (it->vertex_vbo_offset + i) * sizeof(GLuint), sizeof(GLuint), &it->ubo_offset);
       }
 
       curShaderOffset[it->shader_program] += it->num_points;
 
+      it->model_mat = it->model_base * it->model_transform;
       glBindBuffer(GL_UNIFORM_BUFFER, *ubo);
-      glBufferSubData(GL_UNIFORM_BUFFER, vertex_ubo_offset * sizeof(mat4), sizeof(mat4), value_ptr(it->model_mat));
+      glBufferSubData(GL_UNIFORM_BUFFER, it->ubo_offset * sizeof(mat4), sizeof(mat4), value_ptr(it->model_mat));
 
       curShaderUboOffset[it->shader_program]++;
    }
+}
+
+void transformObject(SceneObject& obj, const mat4& transform, GLuint ubo) {
+   obj.model_transform = obj.model_transform * transform;
+   obj.model_mat = obj.model_transform * obj.model_base;
+
+   glBindBuffer(GL_UNIFORM_BUFFER, ubo);
+   glBufferSubData(GL_UNIFORM_BUFFER, obj.ubo_offset * sizeof(mat4), sizeof(mat4), value_ptr(obj.model_mat));
 }
 
