Index: sdl-game.cpp
===================================================================
--- sdl-game.cpp	(revision 6bac215ec93427a3dbbeb8263c0013f7fce2ab83)
+++ sdl-game.cpp	(revision bb76950f0466dd9cdf091f103572dec02c0f07c8)
@@ -459,8 +459,10 @@
    if (objects_modelPipeline.resized) {
       // TODO: Also resize the dynamic ubo
-      resizeBufferSet(storageBuffers_modelPipeline, objects_modelPipeline, modelPipeline, resourceCommandPool,
-                      graphicsQueue);
+      resizeBufferSet(storageBuffers_modelPipeline, objects_modelPipeline.capacity * sizeof(SSBO_ModelObject),
+                      resourceCommandPool, graphicsQueue, true);
 
       objects_modelPipeline.resize();
+
+      modelPipeline.updateDescriptorInfo(1, &storageBuffers_modelPipeline.infoSet, swapChainImages.size());
    }
 
@@ -1130,4 +1132,29 @@
 }
 
+void VulkanGame::resizeBufferSet(BufferSet& set, VkDeviceSize newSize, VkCommandPool commandPool,
+                                 VkQueue graphicsQueue, bool copyData) {
+   for (size_t i = 0; i < set.buffers.size(); i++) {
+      VkBuffer newBuffer;
+      VkDeviceMemory newMemory;
+
+      VulkanUtils::createBuffer(device, physicalDevice, newSize, set.usages, set.properties, newBuffer, newMemory);
+
+      if (copyData) {
+         VulkanUtils::copyBuffer(device, commandPool, set.buffers[i], newBuffer, 0, 0, set.infoSet[i].range,
+                                 graphicsQueue);
+      }
+
+      vkDestroyBuffer(device, set.buffers[i], nullptr);
+      vkFreeMemory(device, set.memory[i], nullptr);
+
+      set.buffers[i] = newBuffer;
+      set.memory[i] = newMemory;
+
+      set.infoSet[i].buffer = set.buffers[i];
+      set.infoSet[i].offset = 0; // This is the offset from the start of the buffer, so always 0 for now
+      set.infoSet[i].range = newSize; // Size of the update starting from offset, or VK_WHOLE_SIZE
+   }
+}
+
 void VulkanGame::renderFrame(ImDrawData* draw_data) {
    VkResult result = vkAcquireNextImageKHR(device, swapChain, numeric_limits<uint64_t>::max(),
Index: sdl-game.hpp
===================================================================
--- sdl-game.hpp	(revision 6bac215ec93427a3dbbeb8263c0013f7fce2ab83)
+++ sdl-game.hpp	(revision bb76950f0466dd9cdf091f103572dec02c0f07c8)
@@ -108,4 +108,7 @@
    vec3 center; // currently only matters for asteroids
    float radius; // currently only matters for asteroids
+
+   // Move the targetAsteroid stuff out of this class since it is very specific to lasers
+   // and makes moving SceneObject into its own header file more problematic
    SceneObject<ModelVertex, SSBO_Asteroid>* targetAsteroid; // currently only used for lasers
 };
@@ -297,8 +300,6 @@
                            BufferSet& set);
 
-      template<class VertexType, class SSBOType>
-      void resizeBufferSet(BufferSet& set, VulkanBuffer<SSBOType>& buffer,
-                           GraphicsPipeline_Vulkan<VertexType>& pipeline, VkCommandPool commandPool,
-                           VkQueue graphicsQueue);
+      void resizeBufferSet(BufferSet& set, VkDeviceSize newSize, VkCommandPool commandPool, VkQueue graphicsQueue,
+                           bool copyData);
 
       template<class SSBOType>
@@ -343,35 +344,4 @@
       void quitGame();
 };
-
-template<class VertexType, class SSBOType>
-void VulkanGame::resizeBufferSet(BufferSet& set, VulkanBuffer<SSBOType>& buffer,
-                                 GraphicsPipeline_Vulkan<VertexType>& pipeline, VkCommandPool commandPool,
-                                 VkQueue graphicsQueue) {
-   VkDeviceSize newSize = buffer.capacity * sizeof(SSBOType);
-
-   for (size_t i = 0; i < set.buffers.size(); i++) {
-      VkBuffer newBuffer;
-      VkDeviceMemory newMemory;
-
-      VulkanUtils::createBuffer(device, physicalDevice, newSize, set.usages, set.properties, newBuffer, newMemory);
-
-      VulkanUtils::copyBuffer(device, commandPool, set.buffers[i], newBuffer, 0, 0, set.infoSet[i].range,
-                              graphicsQueue);
-
-      vkDestroyBuffer(device, set.buffers[i], nullptr);
-      vkFreeMemory(device, set.memory[i], nullptr);
-
-      set.buffers[i] = newBuffer;
-      set.memory[i] = newMemory;
-
-      set.infoSet[i].buffer = set.buffers[i];
-      set.infoSet[i].offset = 0; // This is the offset from the start of the buffer, so always 0 for now
-      set.infoSet[i].range = newSize; // Size of the update starting from offset, or VK_WHOLE_SIZE
-   }
-
-   // Assume the SSBO is always the 2nd binding
-   // TODO: Figure out a way to make this more flexible
-   pipeline.updateDescriptorInfo(1, &set.infoSet, swapChainImages.size());
-}
 
 // TODO: See if it makes sense to pass in the current swapchain index instead of updating all of them
Index: vulkan-game.cpp
===================================================================
--- vulkan-game.cpp	(revision 6bac215ec93427a3dbbeb8263c0013f7fce2ab83)
+++ vulkan-game.cpp	(revision bb76950f0466dd9cdf091f103572dec02c0f07c8)
@@ -1089,10 +1089,15 @@
    }
 
+   // TODO: Replace updateBufferSet to one call to copyDataToMemory, using VulkanBuffer to provide the data source
+   // TODO: Figure out a way to make updateDescriptorInfo easier to use, maybe store the binding index in the buffer set
    // TODO: Probably move the resizing to the VulkanBuffer class
+
    if (objects_modelPipeline.resized) {
-      resizeBufferSet(storageBuffers_modelPipeline, objects_modelPipeline, modelPipeline, resourceCommandPool,
-                      graphicsQueue);
+      resizeBufferSet(storageBuffers_modelPipeline, objects_modelPipeline.capacity * sizeof(SSBO_ModelObject),
+                      resourceCommandPool, graphicsQueue, true);
 
       objects_modelPipeline.resize();
+
+      modelPipeline.updateDescriptorInfo(1, &storageBuffers_modelPipeline.infoSet, swapChainImages.size());
    }
 
@@ -1106,8 +1111,10 @@
    // TODO: Probably move the resizing to the VulkanBuffer class
    if (objects_shipPipeline.resized) {
-      resizeBufferSet(storageBuffers_shipPipeline, objects_shipPipeline, shipPipeline, resourceCommandPool,
-                      graphicsQueue);
+      resizeBufferSet(storageBuffers_shipPipeline, objects_shipPipeline.capacity * sizeof(SSBO_ModelObject),
+                      resourceCommandPool, graphicsQueue, true);
 
       objects_shipPipeline.resize();
+
+      shipPipeline.updateDescriptorInfo(1, &storageBuffers_shipPipeline.infoSet, swapChainImages.size());
    }
 
@@ -1121,8 +1128,10 @@
    // TODO: Probably move the resizing to the VulkanBuffer class
    if (objects_asteroidPipeline.resized) {
-      resizeBufferSet(storageBuffers_asteroidPipeline, objects_asteroidPipeline, asteroidPipeline,
-                      resourceCommandPool, graphicsQueue);
+      resizeBufferSet(storageBuffers_asteroidPipeline, objects_asteroidPipeline.capacity * sizeof(SSBO_Asteroid),
+                      resourceCommandPool, graphicsQueue, true);
 
       objects_asteroidPipeline.resize();
+
+      asteroidPipeline.updateDescriptorInfo(1, &storageBuffers_asteroidPipeline.infoSet, swapChainImages.size());
    }
 
@@ -1136,8 +1145,10 @@
    // TODO: Probably move the resizing to the VulkanBuffer class
    if (objects_laserPipeline.resized) {
-      resizeBufferSet(storageBuffers_laserPipeline, objects_laserPipeline, laserPipeline, resourceCommandPool,
-                      graphicsQueue);
+      resizeBufferSet(storageBuffers_laserPipeline, objects_laserPipeline.capacity * sizeof(SSBO_Laser),
+                      resourceCommandPool, graphicsQueue, true);
 
       objects_laserPipeline.resize();
+
+      laserPipeline.updateDescriptorInfo(1, &storageBuffers_laserPipeline.infoSet, swapChainImages.size());
    }
 
@@ -1151,8 +1162,10 @@
    // TODO: Probably move the resizing to the VulkanBuffer class
    if (objects_explosionPipeline.resized) {
-      resizeBufferSet(storageBuffers_explosionPipeline, objects_explosionPipeline, explosionPipeline,
-                     resourceCommandPool, graphicsQueue);
+      resizeBufferSet(storageBuffers_explosionPipeline, objects_explosionPipeline.capacity * sizeof(SSBO_Explosion),
+                      resourceCommandPool, graphicsQueue, true);
 
       objects_explosionPipeline.resize();
+
+      explosionPipeline.updateDescriptorInfo(1, &storageBuffers_explosionPipeline.infoSet, swapChainImages.size());
    }
 
@@ -1962,4 +1975,29 @@
       set.infoSet[i].offset = 0; // This is the offset from the start of the buffer, so always 0 for now
       set.infoSet[i].range = bufferSize; // Size of the update starting from offset, or VK_WHOLE_SIZE
+   }
+}
+
+void VulkanGame::resizeBufferSet(BufferSet& set, VkDeviceSize newSize, VkCommandPool commandPool,
+                                 VkQueue graphicsQueue, bool copyData) {
+   for (size_t i = 0; i < set.buffers.size(); i++) {
+      VkBuffer newBuffer;
+      VkDeviceMemory newMemory;
+
+      VulkanUtils::createBuffer(device, physicalDevice, newSize, set.usages, set.properties, newBuffer, newMemory);
+
+      if (copyData) {
+         VulkanUtils::copyBuffer(device, commandPool, set.buffers[i], newBuffer, 0, 0, set.infoSet[i].range,
+                                 graphicsQueue);
+      }
+
+      vkDestroyBuffer(device, set.buffers[i], nullptr);
+      vkFreeMemory(device, set.memory[i], nullptr);
+
+      set.buffers[i] = newBuffer;
+      set.memory[i] = newMemory;
+
+      set.infoSet[i].buffer = set.buffers[i];
+      set.infoSet[i].offset = 0; // This is the offset from the start of the buffer, so always 0 for now
+      set.infoSet[i].range = newSize; // Size of the update starting from offset, or VK_WHOLE_SIZE
    }
 }
Index: vulkan-game.hpp
===================================================================
--- vulkan-game.hpp	(revision 6bac215ec93427a3dbbeb8263c0013f7fce2ab83)
+++ vulkan-game.hpp	(revision bb76950f0466dd9cdf091f103572dec02c0f07c8)
@@ -124,4 +124,7 @@
    vec3 center; // currently only matters for asteroids
    float radius; // currently only matters for asteroids
+
+   // Move the targetAsteroid stuff out of this class since it is very specific to lasers
+   // and makes moving SceneObject into its own header file more problematic
    SceneObject<ModelVertex, SSBO_Asteroid>* targetAsteroid; // currently only used for lasers
 };
@@ -432,8 +435,6 @@
                            BufferSet& set);
 
-      template<class VertexType, class SSBOType>
-      void resizeBufferSet(BufferSet& set, VulkanBuffer<SSBOType>& buffer,
-                           GraphicsPipeline_Vulkan<VertexType>& pipeline, VkCommandPool commandPool,
-                           VkQueue graphicsQueue);
+      void resizeBufferSet(BufferSet& set, VkDeviceSize newSize, VkCommandPool commandPool, VkQueue graphicsQueue,
+                           bool copyData);
 
       template<class SSBOType>
@@ -498,35 +499,4 @@
 
 // End of specialized no-op functions
-
-template<class VertexType, class SSBOType>
-void VulkanGame::resizeBufferSet(BufferSet& set, VulkanBuffer<SSBOType>& buffer,
-                                 GraphicsPipeline_Vulkan<VertexType>& pipeline, VkCommandPool commandPool,
-                                 VkQueue graphicsQueue) {
-   VkDeviceSize newSize = buffer.capacity * sizeof(SSBOType);
-
-   for (size_t i = 0; i < set.buffers.size(); i++) {
-      VkBuffer newBuffer;
-      VkDeviceMemory newMemory;
-
-      VulkanUtils::createBuffer(device, physicalDevice, newSize, set.usages, set.properties, newBuffer, newMemory);
-
-      VulkanUtils::copyBuffer(device, commandPool, set.buffers[i], newBuffer, 0, 0, set.infoSet[i].range,
-                              graphicsQueue);
-
-      vkDestroyBuffer(device, set.buffers[i], nullptr);
-      vkFreeMemory(device, set.memory[i], nullptr);
-
-      set.buffers[i] = newBuffer;
-      set.memory[i] = newMemory;
-
-      set.infoSet[i].buffer = set.buffers[i];
-      set.infoSet[i].offset = 0; // This is the offset from the start of the buffer, so always 0 for now
-      set.infoSet[i].range = newSize; // Size of the update starting from offset, or VK_WHOLE_SIZE
-   }
-
-   // Assume the SSBO is always the 2nd binding
-   // TODO: Figure out a way to make this more flexible
-   pipeline.updateDescriptorInfo(1, &set.infoSet, swapChainImages.size());
-}
 
 // TODO: See if it makes sense to pass in the current swapchain index instead of updating all of them
