Index: explosion.vert
===================================================================
--- explosion.vert	(revision 8fbd34fe2a8e84732b061505c1dd7b4e9217b8f3)
+++ explosion.vert	(revision fe5e3ca6a77a5b0bca064bb258065b3bd70d7e7a)
@@ -1,5 +1,14 @@
 #version 410 core
 
-// TODO: Pass the explosion center in as a uniform
+#define MAX_NUM_OBJECTS 1024
+
+uniform mat4 view, proj;
+uniform mat4 model_mat;
+
+/*
+layout (std140) uniform models {
+  mat4 model_mats[MAX_NUM_OBJECTS];
+};
+*/
 
 uniform float explosion_start_time;
@@ -8,4 +17,5 @@
 layout (location = 0) in vec3 v_i; // initial velocity
 layout (location = 1) in float start_time;
+//layout(location = 2) in uint ubo_index;
 
 out float opacity;
@@ -33,5 +43,6 @@
    p += normalize(v_i) * mod(t, duration) / duration * 0.3; // allow time to loop around so particle emitter keeps going
 
-   gl_Position = vec4(p, 1.0);
+   //gl_Position = proj * view * model_mats[0] * vec4(p, 1.0);
+   gl_Position = proj * view * model_mat * vec4(p, 1.0);
    gl_PointSize = 15.0; // size in pixels
 }
Index: new-game.cpp
===================================================================
--- new-game.cpp	(revision 8fbd34fe2a8e84732b061505c1dd7b4e9217b8f3)
+++ new-game.cpp	(revision fe5e3ca6a77a5b0bca064bb258065b3bd70d7e7a)
@@ -157,5 +157,5 @@
                   GLuint* model_mat_idx_vbo);
 
-GLuint initializeParticleEffectBuffers();
+GLuint initializeParticleEffectBuffers(vec3 origin, mat4 proj, mat4 view, GLuint explosion_sp);
 
 void populateBuffers(vector<SceneObject*>& objects,
@@ -565,6 +565,4 @@
    glVertexAttribIPointer(2, 1, GL_UNSIGNED_INT, 0, 0);
 
-   GLuint explosion_vao = initializeParticleEffectBuffers();
-
    float cam_speed = 1.0f;
    float cam_yaw_speed = 60.0f*ONE_DEG_IN_RAD;
@@ -598,4 +596,6 @@
    };
    proj_mat = make_mat4(proj_arr);
+
+   GLuint explosion_vao = initializeParticleEffectBuffers(vec3(0.0f, -1.2f, 0.65f), proj_mat, view_mat, explosion_sp);
 
    GLuint ub_binding_point = 0;
@@ -1912,5 +1912,7 @@
 }
 
-GLuint initializeParticleEffectBuffers() {
+GLuint initializeParticleEffectBuffers(vec3 origin, mat4 proj, mat4 view, GLuint explosion_sp) {
+   //unsigned int num_explosions = 1;
+
    float vv[EXPLOSION_PARTICLE_COUNT * 3]; // initial velocities vec3
    float vt[EXPLOSION_PARTICLE_COUNT]; // initial times
@@ -1927,4 +1929,29 @@
       vv[i*3 + 2] = 0.0f;
    }
+
+   mat4 model_mat = translate(mat4(1.0f), origin);
+
+   glUseProgram(explosion_sp);
+
+   GLuint proj_mat_loc = glGetUniformLocation(explosion_sp, "proj");
+   GLuint view_mat_loc = glGetUniformLocation(explosion_sp, "view");
+
+   glUniformMatrix4fv(proj_mat_loc, 1, GL_FALSE, value_ptr(proj));
+   glUniformMatrix4fv(view_mat_loc, 1, GL_FALSE, value_ptr(view));
+
+   GLuint model_mat_loc = glGetUniformLocation(explosion_sp, "model_mat");
+
+   glUniformMatrix4fv(model_mat_loc, 1, GL_FALSE, value_ptr(model_mat));
+
+   /*
+   GLuint model_ubo = 0;
+   glGenBuffers(1, &model_ubo);
+
+   glBindBuffer(GL_UNIFORM_BUFFER, model_ubo);
+   glBufferData(GL_UNIFORM_BUFFER, num_explosions * sizeof(mat4), NULL, GL_DYNAMIC_DRAW);
+
+   //glBindBuffer(GL_UNIFORM_BUFFER, ubo);
+   glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(mat4), value_ptr(model_mat));
+   */
 
    GLuint velocity_vbo;
