Index: sdl-game.cpp
===================================================================
--- sdl-game.cpp	(revision 8aa48888f88cc8071fc870d4d9ab944f29847cb0)
+++ sdl-game.cpp	(revision 8dcbf624056b3ad9e1cdd504b869654893929ee1)
@@ -136,9 +136,7 @@
       {
          0, 1, 2, 3, 4, 5
-      }, {
+      }, objects_modelPipeline, {
          mat4(1.0f)
       });
-
-   objects_modelPipeline.numObjects++;
 
    texturedSquare->model_base =
@@ -157,9 +155,7 @@
          })), {
             0, 1, 2, 3, 4, 5
-      }, {
+      }, objects_modelPipeline, {
          mat4(1.0f)
       });
-
-   objects_modelPipeline.numObjects++;
 
    texturedSquare->model_base =
@@ -381,9 +377,7 @@
                         {
                            0, 1, 2, 3, 4, 5
-                        }, {
+                        }, objects_modelPipeline, {
                            mat4(1.0f)
                         });
-
-                  objects_modelPipeline.numObjects++;
 
                   texturedSquare.model_base =
@@ -834,5 +828,5 @@
 void VulkanGame::createImageResources() {
    VulkanUtils::createDepthImage(device, physicalDevice, resourceCommandPool, findDepthFormat(), swapChainExtent,
-      depthImage, graphicsQueue);
+                                 depthImage, graphicsQueue);
 
    createTextureSampler();
@@ -1252,5 +1246,5 @@
    // and resizing the window is a common reason to recreate the swapchain
    VulkanUtils::createDepthImage(device, physicalDevice, resourceCommandPool, findDepthFormat(), swapChainExtent,
-      depthImage, graphicsQueue);
+                                 depthImage, graphicsQueue);
 
    createRenderPass();
Index: sdl-game.hpp
===================================================================
--- sdl-game.hpp	(revision 8aa48888f88cc8071fc870d4d9ab944f29847cb0)
+++ sdl-game.hpp	(revision 8dcbf624056b3ad9e1cdd504b869654893929ee1)
@@ -311,5 +311,5 @@
                                                    GraphicsPipeline_Vulkan<VertexType>& pipeline,
                                                    const vector<VertexType>& vertices, vector<uint16_t> indices,
-                                                   SSBOType ssbo);
+                                                   VulkanBuffer<SSBOType>& objectBuffer, SSBOType ssbo);
 
       template<class VertexType>
@@ -399,5 +399,5 @@
                                                          GraphicsPipeline_Vulkan<VertexType>& pipeline,
                                                          const vector<VertexType>& vertices, vector<uint16_t> indices,
-                                                         SSBOType ssbo) {
+                                                         VulkanBuffer<SSBOType>& objectBuffer, SSBOType ssbo) {
    // TODO: Use the model field of ssbo to set the object's model_base
    // currently, the passed in model is useless since it gets overridden in updateObject() anyway
@@ -409,4 +409,5 @@
 
    objects.push_back({ vertices, indices, ssbo, mat4(1.0f), mat4(1.0f), false });
+   objectBuffer.add(ssbo);
 
    SceneObject<VertexType, SSBOType>& obj = objects.back();
@@ -415,4 +416,6 @@
    // with a boolean being passed in here, so that I don't have to rely on checking the specific object
    // type
+   // TODO: Actually, I've already defined a no-op centerObject method for explosions
+   // Maybe I should do the same for lasers and remove this conditional altogether
    if (!is_same_v<VertexType, LaserVertex> && !is_same_v<VertexType, ExplosionVertex>) {
       centerObject(obj);
Index: vulkan-buffer.hpp
===================================================================
--- vulkan-buffer.hpp	(revision 8aa48888f88cc8071fc870d4d9ab944f29847cb0)
+++ vulkan-buffer.hpp	(revision 8dcbf624056b3ad9e1cdd504b869654893929ee1)
@@ -1,9 +1,4 @@
 #ifndef _VULKAN_BUFFER_H
 #define _VULKAN_BUFFER_H
-
-#include <iostream>
-#include <vector>
-
-using namespace std;
 
 /* 
@@ -16,5 +11,6 @@
    public:
 
-      size_t alignment;
+      // TODO: Make these private (maybe make a getter for numObjects)
+      // Externally, they are only used in resizeBufferSet
       size_t capacity;
       size_t numObjects;
@@ -22,15 +18,15 @@
       VulkanBuffer();
       VulkanBuffer(size_t capacity, size_t minOffsetAlignment);
-      VulkanBuffer(vector<T>* vData, size_t capacity);
       ~VulkanBuffer();
 
       VulkanBuffer<T>& operator=(const VulkanBuffer<T>& other);
 
-      T* data();
-      void* mappedData(); // TODO: Maybe rename this to just mapped()
+      void add(T obj);
 
       // TODO: Add a resize function
 
    private:
+
+      size_t alignment;
 
       T* srcData; // TODO: Rename this to something else probably and rename rawData to data
@@ -81,15 +77,4 @@
 
 template<class T>
-VulkanBuffer<T>::VulkanBuffer(vector<T>* vData, size_t capacity)
-                              : alignment(sizeof(T))
-                              , capacity(capacity)
-                              , numObjects(0)
-                              , srcData(nullptr)
-                              , rawData(nullptr)
-                              , vData(vData) {
-   // TODO: Allocate initial capacity in vector
-}
-
-template<class T>
 VulkanBuffer<T>::~VulkanBuffer() {
    if (srcData != nullptr) {
@@ -132,15 +117,6 @@
 
 template<class T>
-T* VulkanBuffer<T>::data() {
-   if (srcData != nullptr) {
-      return srcData;
-   } else {
-      return vData->data();
-   }
-}
-
-template<class T>
-void* VulkanBuffer<T>::mappedData() {
-   return rawData;
+void VulkanBuffer<T>::add(T obj) {
+   numObjects++;
 }
 
Index: vulkan-game.cpp
===================================================================
--- vulkan-game.cpp	(revision 8aa48888f88cc8071fc870d4d9ab944f29847cb0)
+++ vulkan-game.cpp	(revision 8dcbf624056b3ad9e1cdd504b869654893929ee1)
@@ -160,9 +160,7 @@
       {
          0, 1, 2, 3, 4, 5
-      }, {
+      }, objects_modelPipeline, {
          mat4(1.0f)
       });
-
-   objects_modelPipeline.numObjects++;
 
    texturedSquare->model_base =
@@ -182,9 +180,7 @@
       {
          0, 1, 2, 3, 4, 5
-      }, {
+      }, objects_modelPipeline, {
          mat4(1.0f)
       });
-
-   objects_modelPipeline.numObjects++;
 
    texturedSquare->model_base =
@@ -445,9 +441,7 @@
          132, 133, 134,
          135, 136, 137,
-      }, {
+      }, objects_shipPipeline, {
          mat4(1.0f)
       });
-
-   objects_shipPipeline.numObjects++;
 
    ship.model_base =
@@ -781,9 +775,7 @@
                         {
                            0, 1, 2, 3, 4, 5
-                        }, {
+                        }, objects_modelPipeline, {
                            mat4(1.0f)
                         });
-
-                  objects_modelPipeline.numObjects++;
 
                   texturedSquare.model_base =
@@ -1063,11 +1055,9 @@
                24, 25, 26, 27, 28, 29,
                30, 31, 32, 33, 34, 35,
-            }, {
+            }, objects_asteroidPipeline, {
                mat4(1.0f),
                10.0f,
                false
             });
-
-      objects_asteroidPipeline.numObjects++;
 
       // This accounts for the scaling in model_base.
@@ -1551,5 +1541,5 @@
 void VulkanGame::createImageResources() {
    VulkanUtils::createDepthImage(device, physicalDevice, resourceCommandPool, findDepthFormat(), swapChainExtent,
-      depthImage, graphicsQueue);
+                                 depthImage, graphicsQueue);
 
    createTextureSampler();
@@ -1979,11 +1969,9 @@
           4, 5, 1, 4, 1, 0,
           6, 7, 5, 6, 5, 4
-      }, {
+      }, objects_laserPipeline, {
          mat4(1.0f),
          color,
          false
       });
-
-   objects_laserPipeline.numObjects++;
 
    float xAxisRotation = asin(ray.y / length);
@@ -2187,6 +2175,6 @@
    iota(indices.begin(), indices.end(), 0);
 
-   SceneObject<ExplosionVertex, SSBO_Explosion>& explosion = addObject(
-      explosionObjects, explosionPipeline, addObjectIndex(explosionObjects.size(), vertices), indices, {
+   SceneObject<ExplosionVertex, SSBO_Explosion>& explosion = addObject(explosionObjects, explosionPipeline,
+      addObjectIndex(explosionObjects.size(), vertices), indices, objects_explosionPipeline, {
          mat4(1.0f),
          cur_time,
@@ -2195,6 +2183,4 @@
       });
 
-   objects_explosionPipeline.numObjects++;
-
    explosion.model_base = model_mat;
    explosion.model_transform = mat4(1.0f);
@@ -2216,5 +2202,5 @@
    // and resizing the window is a common reason to recreate the swapchain
    VulkanUtils::createDepthImage(device, physicalDevice, resourceCommandPool, findDepthFormat(), swapChainExtent,
-      depthImage, graphicsQueue);
+                                 depthImage, graphicsQueue);
 
    createRenderPass();
Index: vulkan-game.hpp
===================================================================
--- vulkan-game.hpp	(revision 8aa48888f88cc8071fc870d4d9ab944f29847cb0)
+++ vulkan-game.hpp	(revision 8dcbf624056b3ad9e1cdd504b869654893929ee1)
@@ -446,5 +446,5 @@
                                                    GraphicsPipeline_Vulkan<VertexType>& pipeline,
                                                    const vector<VertexType>& vertices, vector<uint16_t> indices,
-                                                   SSBOType ssbo);
+                                                   VulkanBuffer<SSBOType>& objectBuffer, SSBOType ssbo);
 
       template<class VertexType>
@@ -554,5 +554,5 @@
                                                          GraphicsPipeline_Vulkan<VertexType>& pipeline,
                                                          const vector<VertexType>& vertices, vector<uint16_t> indices,
-                                                         SSBOType ssbo) {
+                                                         VulkanBuffer<SSBOType>& objectBuffer, SSBOType ssbo) {
    // TODO: Use the model field of ssbo to set the object's model_base
    // currently, the passed in model is useless since it gets overridden in updateObject() anyway
@@ -564,4 +564,5 @@
 
    objects.push_back({ vertices, indices, ssbo, mat4(1.0f), mat4(1.0f), false });
+   objectBuffer.add(ssbo);
 
    SceneObject<VertexType, SSBOType>& obj = objects.back();
@@ -570,4 +571,6 @@
    // with a boolean being passed in here, so that I don't have to rely on checking the specific object
    // type
+   // TODO: Actually, I've already defined a no-op centerObject method for explosions
+   // Maybe I should do the same for lasers and remove this conditional altogether
    if (!is_same_v<VertexType, LaserVertex> && !is_same_v<VertexType, ExplosionVertex>) {
       centerObject(obj);
