Index: sdl-game.cpp
===================================================================
--- sdl-game.cpp	(revision 6486ba8f42f8ee2b61912e3a96ac6921ee30292b)
+++ sdl-game.cpp	(revision 5ea0a37095f83aa1eb8ad853b90c9675730b6782)
@@ -465,7 +465,8 @@
       objData.model = obj.model_transform * obj.model_base;
       obj.center = vec3(objData.model * vec4(0.0f, 0.0f, 0.0f, 1.0f));
-
-      updateBufferSet(storageBuffers_modelPipeline, i, objData);
-   }
+   }
+
+   VulkanUtils::copyDataToMemory(device, objects_modelPipeline.data(), storageBuffers_modelPipeline.memory[imageIndex],
+                                 0, objects_modelPipeline.memorySize(), false);
 
    VulkanUtils::copyDataToMemory(device, &object_VP_mats, uniformBuffers_modelPipeline.memory[imageIndex], 0,
Index: sdl-game.hpp
===================================================================
--- sdl-game.hpp	(revision 6486ba8f42f8ee2b61912e3a96ac6921ee30292b)
+++ sdl-game.hpp	(revision 5ea0a37095f83aa1eb8ad853b90c9675730b6782)
@@ -300,7 +300,4 @@
                            bool copyData);
 
-      template<class SSBOType>
-      void updateBufferSet(BufferSet& set, size_t objIndex, SSBOType& ssbo);
-
       // TODO: Since addObject() returns a reference to the new object now,
       // stop using objects.back() to access the object that was just created
@@ -338,12 +335,4 @@
       void quitGame();
 };
-
-// TODO: See if it makes sense to pass in the current swapchain index instead of updating all of them
-template<class SSBOType>
-void VulkanGame::updateBufferSet(BufferSet& set, size_t objIndex, SSBOType& ssbo) {
-   for (size_t i = 0; i < set.memory.size(); i++) {
-      VulkanUtils::copyDataToMemory(device, &ssbo, set.memory[i], objIndex * sizeof(SSBOType), sizeof(ssbo), false);
-   }
-}
 
 // TODO: Right now, it's basically necessary to pass the identity matrix in for ssbo.model and to change
Index: vulkan-buffer.hpp
===================================================================
--- vulkan-buffer.hpp	(revision 6486ba8f42f8ee2b61912e3a96ac6921ee30292b)
+++ vulkan-buffer.hpp	(revision 5ea0a37095f83aa1eb8ad853b90c9675730b6782)
@@ -31,10 +31,12 @@
       VulkanBuffer<T>& operator=(VulkanBuffer<T>&& other) noexcept;
 
-      void resize();
+      size_t memorySize();
+
+      T* data();  // Not sure I need to expose this
 
       T& get(uint32_t index);
       void add(T obj);
 
-      size_t memorySize();
+      void resize();
 
    private:
@@ -114,4 +116,6 @@
       range = other.range;
 
+      mappedData = other.mappedData;
+
       if (rawData != nullptr) {
          free(rawData);
@@ -124,4 +128,5 @@
       other.range = 0;
 
+      other.mappedData.clear();
       other.rawData = nullptr;
    }
@@ -131,6 +136,11 @@
 
 template<class T>
-void VulkanBuffer<T>::resize() {
-   resized = false;
+size_t VulkanBuffer<T>::memorySize() {
+   return memRequirement(capacity);
+}
+
+template<class T>
+T* VulkanBuffer<T>::data() {
+   return rawData;
 }
 
@@ -145,4 +155,5 @@
 template<class T>
 void VulkanBuffer<T>::add(T obj) {
+   // TODO: Maybe copy this to the resize() function and call that function here
    if (numObjects == capacity) {
       // Once I add Vulkan buffer objects in here, make sure this doesn't overlap with resizeBufferSet
@@ -171,6 +182,6 @@
 
 template<class T>
-size_t VulkanBuffer<T>::memorySize() {
-   return memRequirement(capacity);
+void VulkanBuffer<T>::resize() {
+   resized = false;
 }
 
Index: vulkan-game.cpp
===================================================================
--- vulkan-game.cpp	(revision 6486ba8f42f8ee2b61912e3a96ac6921ee30292b)
+++ vulkan-game.cpp	(revision 5ea0a37095f83aa1eb8ad853b90c9675730b6782)
@@ -1022,6 +1022,4 @@
 
    // TODO: Probably move the resizing to the VulkanBuffer class
-
-   // 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
 
@@ -1046,7 +1044,8 @@
       objData.model = obj.model_transform * obj.model_base;
       obj.center = vec3(objData.model * vec4(0.0f, 0.0f, 0.0f, 1.0f));
-
-      updateBufferSet(storageBuffers_modelPipeline, i, objData);
-   }
+   }
+
+   VulkanUtils::copyDataToMemory(device, objects_modelPipeline.data(), storageBuffers_modelPipeline.memory[imageIndex],
+                                 0, objects_modelPipeline.memorySize(), false);
 
    if (objects_shipPipeline.resized) {
@@ -1066,7 +1065,8 @@
       objData.model = obj.model_transform * obj.model_base;
       obj.center = vec3(objData.model * vec4(0.0f, 0.0f, 0.0f, 1.0f));
-
-      updateBufferSet(storageBuffers_shipPipeline, i, objData);
-   }
+   }
+
+   VulkanUtils::copyDataToMemory(device, objects_shipPipeline.data(), storageBuffers_shipPipeline.memory[imageIndex],
+                                 0, objects_shipPipeline.memorySize(), false);
 
    if (objects_asteroidPipeline.resized) {
@@ -1108,8 +1108,9 @@
          objData.model = obj.model_transform * obj.model_base;
          obj.center = vec3(objData.model * vec4(0.0f, 0.0f, 0.0f, 1.0f));
-
-         updateBufferSet(storageBuffers_asteroidPipeline, i, objData);
       }
    }
+
+   VulkanUtils::copyDataToMemory(device, objects_asteroidPipeline.data(), storageBuffers_asteroidPipeline.memory[imageIndex],
+                                 0, objects_asteroidPipeline.memorySize(), false);
 
    if (objects_laserPipeline.resized) {
@@ -1135,7 +1136,8 @@
       objData.model = obj.model_transform * obj.model_base;
       obj.center = vec3(objData.model * vec4(0.0f, 0.0f, 0.0f, 1.0f));
-
-      updateBufferSet(storageBuffers_laserPipeline, i, objData);
-   }
+   }
+
+   VulkanUtils::copyDataToMemory(device, objects_laserPipeline.data(), storageBuffers_laserPipeline.memory[imageIndex],
+                                 0, objects_laserPipeline.memorySize(), false);
 
    if (objects_explosionPipeline.resized) {
@@ -1160,7 +1162,8 @@
       objData.model = obj.model_transform * obj.model_base;
       obj.center = vec3(objData.model * vec4(0.0f, 0.0f, 0.0f, 1.0f));
-
-      updateBufferSet(storageBuffers_explosionPipeline, i, objData);
-   }
+   }
+
+   VulkanUtils::copyDataToMemory(device, objects_explosionPipeline.data(), storageBuffers_explosionPipeline.memory[imageIndex],
+                                 0, objects_explosionPipeline.memorySize(), false);
 
    explosion_UBO.cur_time = curTime;
Index: vulkan-game.hpp
===================================================================
--- vulkan-game.hpp	(revision 6486ba8f42f8ee2b61912e3a96ac6921ee30292b)
+++ vulkan-game.hpp	(revision 5ea0a37095f83aa1eb8ad853b90c9675730b6782)
@@ -432,7 +432,4 @@
                            bool copyData);
 
-      template<class SSBOType>
-      void updateBufferSet(BufferSet& set, size_t objIndex, SSBOType& ssbo);
-
       // TODO: Since addObject() returns a reference to the new object now,
       // stop using objects.back() to access the object that was just created
@@ -490,12 +487,4 @@
 
 // End of specialized no-op functions
-
-// TODO: See if it makes sense to pass in the current swapchain index instead of updating all of them
-template<class SSBOType>
-void VulkanGame::updateBufferSet(BufferSet& set, size_t objIndex, SSBOType& ssbo) {
-   for (size_t i = 0; i < set.memory.size(); i++) {
-      VulkanUtils::copyDataToMemory(device, &ssbo, set.memory[i], objIndex * sizeof(SSBOType), sizeof(ssbo), false);
-   }
-}
 
 // TODO: Right now, it's basically necessary to pass the identity matrix in for ssbo.model and to change
