Index: sdl-game.cpp
===================================================================
--- sdl-game.cpp	(revision 8dcbf624056b3ad9e1cdd504b869654893929ee1)
+++ sdl-game.cpp	(revision 6bac215ec93427a3dbbeb8263c0013f7fce2ab83)
@@ -269,7 +269,8 @@
 
    createBufferSet(objects_modelPipeline.capacity * sizeof(SSBO_ModelObject),
-      VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
-      VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
-      storageBuffers_modelPipeline);
+                   VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT
+                   | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
+                   VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
+                   storageBuffers_modelPipeline);
 }
 
@@ -456,8 +457,10 @@
 
    // TODO: Probably move the resizing to the VulkanBuffer class
-   if (objects_modelPipeline.numObjects > objects_modelPipeline.capacity) {
+   if (objects_modelPipeline.resized) {
       // TODO: Also resize the dynamic ubo
       resizeBufferSet(storageBuffers_modelPipeline, objects_modelPipeline, modelPipeline, resourceCommandPool,
                       graphicsQueue);
+
+      objects_modelPipeline.resize();
    }
 
Index: sdl-game.hpp
===================================================================
--- sdl-game.hpp	(revision 8dcbf624056b3ad9e1cdd504b869654893929ee1)
+++ sdl-game.hpp	(revision 6bac215ec93427a3dbbeb8263c0013f7fce2ab83)
@@ -348,33 +348,24 @@
                                  GraphicsPipeline_Vulkan<VertexType>& pipeline, VkCommandPool commandPool,
                                  VkQueue graphicsQueue) {
-   size_t numObjects = buffer.numObjects < buffer.capacity ? buffer.numObjects : buffer.capacity;
-
-   do {
-      buffer.capacity *= 2;
-   } while (buffer.capacity < buffer.numObjects);
-
-   VkDeviceSize bufferSize = buffer.capacity * sizeof(SSBOType);
+   VkDeviceSize newSize = buffer.capacity * sizeof(SSBOType);
 
    for (size_t i = 0; i < set.buffers.size(); i++) {
-      VkBuffer newStorageBuffer;
-      VkDeviceMemory newStorageBufferMemory;
-
-      VulkanUtils::createBuffer(device, physicalDevice, bufferSize,
-         VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
-         VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
-         newStorageBuffer, newStorageBufferMemory);
-
-      VulkanUtils::copyBuffer(device, commandPool, set.buffers[i], newStorageBuffer,
-         0, 0, numObjects * sizeof(SSBOType), graphicsQueue);
+      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] = newStorageBuffer;
-      set.memory[i] = newStorageBufferMemory;
+      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 = bufferSize; // Size of the update starting from offset, or VK_WHOLE_SIZE
+      set.infoSet[i].range = newSize; // Size of the update starting from offset, or VK_WHOLE_SIZE
    }
 
Index: vulkan-buffer.hpp
===================================================================
--- vulkan-buffer.hpp	(revision 8dcbf624056b3ad9e1cdd504b869654893929ee1)
+++ vulkan-buffer.hpp	(revision 6bac215ec93427a3dbbeb8263c0013f7fce2ab83)
@@ -14,11 +14,22 @@
       // Externally, they are only used in resizeBufferSet
       size_t capacity;
-      size_t numObjects;
+
+      // temp field to help with ubo+ssbo resizing until they are added to this class
+      // See if I need a separate field for this or if I can use other fields to check for this
+      // Maybe compare uniform or storage buffer size to the size of the memory allocated here
+      bool resized;
 
       VulkanBuffer();
       VulkanBuffer(size_t capacity, size_t minOffsetAlignment);
+
+      VulkanBuffer(const VulkanBuffer<T>&) = delete;
+      VulkanBuffer(VulkanBuffer<T>&& other);
+
       ~VulkanBuffer();
 
-      VulkanBuffer<T>& operator=(const VulkanBuffer<T>& other);
+      VulkanBuffer<T>& operator=(const VulkanBuffer<T>&) = delete;
+      VulkanBuffer<T>& operator=(VulkanBuffer<T>&& other) noexcept;
+
+      void resize();
 
       void add(T obj);
@@ -29,4 +40,5 @@
 
       size_t alignment;
+      size_t numObjects;
 
       T* srcData; // TODO: Rename this to something else probably and rename rawData to data
@@ -56,4 +68,5 @@
                               , capacity(0)
                               , numObjects(0)
+                              , resized(false)
                               , srcData(nullptr)
                               , rawData(nullptr)
@@ -66,4 +79,5 @@
                               , capacity(capacity)
                               , numObjects(0)
+                              , resized(false)
                               , srcData(nullptr)
                               , rawData(nullptr)
@@ -77,4 +91,9 @@
 
 template<class T>
+VulkanBuffer<T>::VulkanBuffer(VulkanBuffer<T>&& other) {
+   // TODO: Implement
+}
+
+template<class T>
 VulkanBuffer<T>::~VulkanBuffer() {
    if (srcData != nullptr) {
@@ -84,32 +103,24 @@
 
 template<class T>
-VulkanBuffer<T>& VulkanBuffer<T>::operator=(const VulkanBuffer<T>& other) {
-   if (this == &other) {
-      return *this;
+VulkanBuffer<T>& VulkanBuffer<T>::operator=(VulkanBuffer<T>&& other) noexcept {
+   if (this != &other) {
+      capacity = other.capacity;
+      numObjects = other.numObjects;
+      resized = other.resized;
+
+      alignment = other.alignment;
+
+      if (srcData != nullptr) {
+         free(srcData);
+      }
+
+      srcData = other.srcData;
+
+      other.capacity = 0;
+      other.numObjects = 0;
+      // TODO: Maybe set rnage to 0 as well
+
+      other.srcData = nullptr;
    }
-
-   /*
-   // assume *this manages a reusable resource, such as a heap-allocated buffer mArray
-   if (size != other.size) {        // resource in *this cannot be reused
-      delete[] mArray;              // release resource in *this
-      mArray = nullptr;
-      size = 0;                     // preserve invariants in case next line throws
-      mArray = new int[other.size]; // allocate resource in *this
-      size = other.size;
-   }
-   */
-
-   if (srcData != nullptr) {
-      free(srcData);
-      srcData = nullptr;
-   }
-
-   alignment = other.alignment;
-   capacity = other.capacity;
-
-   srcData = (T*)malloc(capacity * alignment);
-   // TODO: Check for failure
-
-   memcpy(srcData, other.srcData, capacity * alignment);
 
    return *this;
@@ -117,5 +128,17 @@
 
 template<class T>
+void VulkanBuffer<T>::resize() {
+   resized = false;
+}
+
+template<class T>
 void VulkanBuffer<T>::add(T obj) {
+   if (numObjects == capacity) {
+      // Once I add Vulkan buffer objects in here, make sure this doesn't overlap with resizeBufferSet
+      resized = true;
+
+      capacity *= 2;
+   }
+
    numObjects++;
 }
Index: vulkan-game.cpp
===================================================================
--- vulkan-game.cpp	(revision 8dcbf624056b3ad9e1cdd504b869654893929ee1)
+++ vulkan-game.cpp	(revision 6bac215ec93427a3dbbeb8263c0013f7fce2ab83)
@@ -616,7 +616,8 @@
 
    createBufferSet(objects_modelPipeline.capacity * sizeof(SSBO_ModelObject),
-      VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
-      VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
-      storageBuffers_modelPipeline);
+                   VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT
+                   | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
+                   VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
+                   storageBuffers_modelPipeline);
 
    shipPipeline = GraphicsPipeline_Vulkan<ModelVertex>(
@@ -625,7 +626,8 @@
 
    createBufferSet(objects_shipPipeline.capacity * sizeof(SSBO_ModelObject),
-      VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
-      VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
-      storageBuffers_shipPipeline);
+                   VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT
+                   | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
+                   VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
+                   storageBuffers_shipPipeline);
 
    asteroidPipeline = GraphicsPipeline_Vulkan<ModelVertex>(
@@ -634,7 +636,8 @@
 
    createBufferSet(objects_asteroidPipeline.capacity * sizeof(SSBO_Asteroid),
-      VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
-      VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
-      storageBuffers_asteroidPipeline);
+                   VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT
+                   | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
+                   VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
+                   storageBuffers_asteroidPipeline);
 
    laserPipeline = GraphicsPipeline_Vulkan<LaserVertex>(
@@ -643,7 +646,8 @@
 
    createBufferSet(objects_laserPipeline.capacity * sizeof(SSBO_Laser),
-      VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
-      VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
-      storageBuffers_laserPipeline);
+                   VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT
+                   | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
+                   VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
+                   storageBuffers_laserPipeline);
 
    explosionPipeline = GraphicsPipeline_Vulkan<ExplosionVertex>(
@@ -653,7 +657,8 @@
 
    createBufferSet(objects_explosionPipeline.capacity * sizeof(SSBO_Explosion),
-      VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
-      VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
-      storageBuffers_explosionPipeline);
+                   VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT
+                   | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
+                   VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
+                   storageBuffers_explosionPipeline);
 }
 
@@ -1085,7 +1090,9 @@
 
    // TODO: Probably move the resizing to the VulkanBuffer class
-   if (objects_modelPipeline.numObjects > objects_modelPipeline.capacity) {
+   if (objects_modelPipeline.resized) {
       resizeBufferSet(storageBuffers_modelPipeline, objects_modelPipeline, modelPipeline, resourceCommandPool,
                       graphicsQueue);
+
+      objects_modelPipeline.resize();
    }
 
@@ -1098,7 +1105,9 @@
 
    // TODO: Probably move the resizing to the VulkanBuffer class
-   if (objects_shipPipeline.numObjects > objects_shipPipeline.capacity) {
+   if (objects_shipPipeline.resized) {
       resizeBufferSet(storageBuffers_shipPipeline, objects_shipPipeline, shipPipeline, resourceCommandPool,
                       graphicsQueue);
+
+      objects_shipPipeline.resize();
    }
 
@@ -1111,7 +1120,9 @@
 
    // TODO: Probably move the resizing to the VulkanBuffer class
-   if (objects_asteroidPipeline.numObjects > objects_asteroidPipeline.capacity) {
+   if (objects_asteroidPipeline.resized) {
       resizeBufferSet(storageBuffers_asteroidPipeline, objects_asteroidPipeline, asteroidPipeline,
                       resourceCommandPool, graphicsQueue);
+
+      objects_asteroidPipeline.resize();
    }
 
@@ -1124,7 +1135,9 @@
 
    // TODO: Probably move the resizing to the VulkanBuffer class
-   if (objects_laserPipeline.numObjects > objects_laserPipeline.capacity) {
+   if (objects_laserPipeline.resized) {
       resizeBufferSet(storageBuffers_laserPipeline, objects_laserPipeline, laserPipeline, resourceCommandPool,
                       graphicsQueue);
+
+      objects_laserPipeline.resize();
    }
 
@@ -1137,7 +1150,9 @@
 
    // TODO: Probably move the resizing to the VulkanBuffer class
-   if (objects_explosionPipeline.numObjects > objects_explosionPipeline.capacity) {
+   if (objects_explosionPipeline.resized) {
       resizeBufferSet(storageBuffers_explosionPipeline, objects_explosionPipeline, explosionPipeline,
                      resourceCommandPool, graphicsQueue);
+
+      objects_explosionPipeline.resize();
    }
 
Index: vulkan-game.hpp
===================================================================
--- vulkan-game.hpp	(revision 8dcbf624056b3ad9e1cdd504b869654893929ee1)
+++ vulkan-game.hpp	(revision 6bac215ec93427a3dbbeb8263c0013f7fce2ab83)
@@ -503,33 +503,24 @@
                                  GraphicsPipeline_Vulkan<VertexType>& pipeline, VkCommandPool commandPool,
                                  VkQueue graphicsQueue) {
-   size_t numObjects = buffer.numObjects < buffer.capacity ? buffer.numObjects : buffer.capacity;
-
-   do {
-      buffer.capacity *= 2;
-   } while (buffer.capacity < buffer.numObjects);
-
-   VkDeviceSize bufferSize = buffer.capacity * sizeof(SSBOType);
+   VkDeviceSize newSize = buffer.capacity * sizeof(SSBOType);
 
    for (size_t i = 0; i < set.buffers.size(); i++) {
-      VkBuffer newStorageBuffer;
-      VkDeviceMemory newStorageBufferMemory;
-
-      VulkanUtils::createBuffer(device, physicalDevice, bufferSize,
-         VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
-         VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
-         newStorageBuffer, newStorageBufferMemory);
-
-      VulkanUtils::copyBuffer(device, commandPool, set.buffers[i], newStorageBuffer,
-         0, 0, numObjects * sizeof(SSBOType), graphicsQueue);
+      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] = newStorageBuffer;
-      set.memory[i] = newStorageBufferMemory;
+      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 = bufferSize; // Size of the update starting from offset, or VK_WHOLE_SIZE
+      set.infoSet[i].range = newSize; // Size of the update starting from offset, or VK_WHOLE_SIZE
    }
 
