Index: graphics-pipeline_vulkan.hpp
===================================================================
--- graphics-pipeline_vulkan.hpp	(revision 2da64efeed527c21b6906cf773dcf113bbe77951)
+++ graphics-pipeline_vulkan.hpp	(revision 3b84bb6c891e1769362c69b5318e9f5284376cdf)
@@ -71,6 +71,6 @@
       void createRenderCommands(VkCommandBuffer& commandBuffer, uint32_t currentImage);
 
-      void addVertices(const vector<VertexType>& vertices, vector<uint16_t> indices, VkCommandPool commandPool,
-         VkQueue graphicsQueue);
+      bool addObject(const vector<VertexType>& vertices, vector<uint16_t> indices, SSBOType& ssbo,
+         VkCommandPool commandPool, VkQueue graphicsQueue);
 
       void updateObject(size_t objIndex, SSBOType& ssbo);
@@ -125,4 +125,6 @@
 
 // TODO: Verify that vertex capacity and index capacity are both > 0
+// TODO: See if it would be feasible to move code in the createPipeline method
+// into the constructor. That way, I can also put relevant cleanup code into the destructor
 template<class VertexType, class SSBOType>
 GraphicsPipeline_Vulkan<VertexType, SSBOType>::GraphicsPipeline_Vulkan(
@@ -473,6 +475,17 @@
 
 template<class VertexType, class SSBOType>
-void GraphicsPipeline_Vulkan<VertexType, SSBOType>::addVertices(const vector<VertexType>& vertices, vector<uint16_t> indices,
-      VkCommandPool commandPool, VkQueue graphicsQueue) {
+bool GraphicsPipeline_Vulkan<VertexType, SSBOType>::addObject(
+      const vector<VertexType>& vertices, vector<uint16_t> indices,
+      SSBOType& ssbo, VkCommandPool commandPool, VkQueue graphicsQueue) {
+
+   // TODO: When resizing the vertex or index buffer, take deleted objects into account.
+   // Remove their data from the buffer and determine the new size of the bufer based on # of remining objects
+
+   // If # non-deleted objects > currentCapacity / 2
+   //    - resize and double capacity
+   // else If # non-deleted objects < currentCapacity / 4
+   //    - resize amd halve capacity
+   // else
+   //    - don't resize, but rewrite data in the buffer to only have non-deleted objects
 
    if (numVertices + vertices.size() > vertexCapacity) {
@@ -490,4 +503,8 @@
       graphicsQueue);
    numIndices += indices.size();
+
+   bool resizedStorageBuffer = false;
+
+   return resizedStorageBuffer;
 }
 
Index: vulkan-game.cpp
===================================================================
--- vulkan-game.cpp	(revision 2da64efeed527c21b6906cf773dcf113bbe77951)
+++ vulkan-game.cpp	(revision 3b84bb6c891e1769362c69b5318e9f5284376cdf)
@@ -208,5 +208,5 @@
       }, {
          0, 1, 2, 2, 3, 0
-      }, {});
+      }, {}, false);
 
    overlayPipeline.createDescriptorSetLayout();
@@ -240,5 +240,5 @@
       }, {
          mat4(1.0f)
-      });
+      }, false);
 
    addObject(modelObjects, modelPipeline,
@@ -252,5 +252,5 @@
       }, {
          mat4(1.0f)
-      });
+      }, false);
 
    modelPipeline.createDescriptorSetLayout();
@@ -274,5 +274,4 @@
    // the same data. Add an option to make some pipelines not use indexing
    addObject(shipObjects, shipPipeline,
-      centerObject<ShipVertex>(
       addObjectIndex<ShipVertex>(shipObjects.size(),
       addVertexNormals<ShipVertex>({
@@ -473,5 +472,5 @@
          {{  1.5f,   0.0f,   0.0f}, {0.0f, 0.0f, 0.3f}},
          {{  1.3f,   0.0f,  -0.3f}, {0.0f, 0.0f, 0.3f}},
-      }))), {
+      })), {
            0,   1,   2,   3,   4,   5,
            6,   7,   8,   9,  10,  11,
@@ -505,5 +504,5 @@
       }, {
          mat4(1.0f)
-      });
+      }, false);
 
    shipPipeline.createDescriptorSetLayout();
@@ -619,7 +618,4 @@
                   float zOffset = -2.0f + (0.5f * modelObjects.size());
 
-                  vkDeviceWaitIdle(device);
-                  vkFreeCommandBuffers(device, commandPool, static_cast<uint32_t>(commandBuffers.size()), commandBuffers.data());
-
                   addObject(modelObjects, modelPipeline,
                      addObjectIndex<ModelVertex>(modelObjects.size(), {
@@ -632,11 +628,6 @@
                      }, {
                         mat4(1.0f)
-                     });
-
-                  createCommandBuffers();
+                     }, true);
                } else if (e.key.keycode == SDL_SCANCODE_Z) {
-                  vkDeviceWaitIdle(device);
-                  vkFreeCommandBuffers(device, commandPool, static_cast<uint32_t>(commandBuffers.size()), commandBuffers.data());
-
                   addObject(asteroidObjects, asteroidPipeline,
                      addObjectIndex<AsteroidVertex>(asteroidObjects.size(),
@@ -701,5 +692,5 @@
                         10.0f,
                         0
-                     });
+                     }, true);
 
                   // translate(mat4(1.0f), vec3(getRandomNum(-1.3f, 1.3f), -1.2f, getRandomNum(-5.5f, -4.5f))) *
@@ -710,5 +701,4 @@
 
                   updateObject(asteroidObjects, asteroidPipeline, asteroidObjects.size() - 1);
-                  createCommandBuffers();
                } else {
                   cout << "Key event detected" << endl;
@@ -750,4 +740,10 @@
       }
 
+      if (gui->keyPressed(SDL_SCANCODE_X)) {
+         if (asteroidObjects.size() > 0 && !asteroidObjects[0].ssbo.deleted) {
+            updateObject(asteroidObjects, asteroidPipeline, 0);
+         }
+      }
+
       renderUI();
       renderScene();
Index: vulkan-game.hpp
===================================================================
--- vulkan-game.hpp	(revision 2da64efeed527c21b6906cf773dcf113bbe77951)
+++ vulkan-game.hpp	(revision 3b84bb6c891e1769362c69b5318e9f5284376cdf)
@@ -58,4 +58,6 @@
    mat4 model_base;
    mat4 model_transform;
+   vec3 center;
+   float radius;
 };
 
@@ -217,5 +219,6 @@
       void addObject(vector<SceneObject<VertexType, SSBOType>>& objects,
          GraphicsPipeline_Vulkan<VertexType, SSBOType>& pipeline,
-         const vector<VertexType>& vertices, vector<uint16_t> indices, SSBOType ssbo);
+         const vector<VertexType>& vertices, vector<uint16_t> indices, SSBOType ssbo,
+         bool pipelinesCreated);
 
       template<class VertexType, class SSBOType>
@@ -229,6 +232,6 @@
       vector<VertexType> addObjectIndex(unsigned int objIndex, vector<VertexType> vertices);
 
-      template<class VertexType>
-      vector<VertexType> centerObject(vector<VertexType> vertices);
+      template<class VertexType, class SSBOType>
+      void centerObject(SceneObject<VertexType, SSBOType>& object);
 
       void createBufferSet(VkDeviceSize bufferSize, VkBufferUsageFlags flags,
@@ -246,8 +249,12 @@
 };
 
+// TODO: Right now, it's basically necessary to pass the identity matrix in for ssbo.model
+// and to change the model matrix later by setting model_transform and then calling updateObject()
+// Figure out a better way to allow the model matrix to be set during objecting creation
 template<class VertexType, class SSBOType>
 void VulkanGame::addObject(vector<SceneObject<VertexType, SSBOType>>& objects,
       GraphicsPipeline_Vulkan<VertexType, SSBOType>& pipeline,
-      const vector<VertexType>& vertices, vector<uint16_t> indices, SSBOType ssbo) {
+      const vector<VertexType>& vertices, vector<uint16_t> indices, SSBOType ssbo,
+      bool pipelinesCreated) {
    size_t numVertices = pipeline.getNumVertices();
 
@@ -257,6 +264,14 @@
 
    objects.push_back({ vertices, indices, ssbo, mat4(1.0f), mat4(1.0f) });
-
-   pipeline.addVertices(vertices, indices, commandPool, graphicsQueue);
+   centerObject(objects.back());
+
+   bool storageBufferResized = pipeline.addObject(vertices, indices, ssbo, commandPool, graphicsQueue);
+
+   if (pipelinesCreated) {
+      if (storageBufferResized) {
+      }
+
+      createCommandBuffers();
+   }
 }
 
@@ -302,6 +317,8 @@
 }
 
-template<class VertexType>
-vector<VertexType> VulkanGame::centerObject(vector<VertexType> vertices) {
+template<class VertexType, class SSBOType>
+void VulkanGame::centerObject(SceneObject<VertexType, SSBOType>& object) {
+   vector<VertexType>& vertices = object.vertices;
+
    float min_x = vertices[0].pos.x;
    float max_x = vertices[0].pos.x;
@@ -313,20 +330,22 @@
    // start from the second point
    for (unsigned int i = 1; i < vertices.size(); i++) {
-      if (min_x > vertices[i].pos.x) {
-         min_x = vertices[i].pos.x;
-      } else if (max_x < vertices[i].pos.x) {
-         max_x = vertices[i].pos.x;
+      vec3& pos = vertices[i].pos;
+
+      if (min_x > pos.x) {
+         min_x = pos.x;
+      } else if (max_x < pos.x) {
+         max_x = pos.x;
       }
 
-      if (min_y > vertices[i].pos.y) {
-         min_y = vertices[i].pos.y;
-      } else if (max_y < vertices[i].pos.y) {
-         max_y = vertices[i].pos.y;
+      if (min_y > pos.y) {
+         min_y = pos.y;
+      } else if (max_y < pos.y) {
+         max_y = pos.y;
       }
 
-      if (min_z > vertices[i].pos.z) {
-         min_z = vertices[i].pos.z;
-      } else if (max_z < vertices[i].pos.z) {
-         max_z = vertices[i].pos.z;
+      if (min_z > pos.z) {
+         min_z = pos.z;
+      } else if (max_z < pos.z) {
+         max_z = pos.z;
       }
    }
@@ -338,5 +357,7 @@
    }
 
-   return vertices;
+   object.radius = std::max(center.x, center.y);
+   object.radius = std::max(object.radius, center.z);
+   object.center = vec3(0.0f, 0.0f, 0.0f);
 }
 
