Index: graphics-pipeline_vulkan.hpp
===================================================================
--- graphics-pipeline_vulkan.hpp	(revision 4a777d2b3a0f0dff81e2a81bb45124f3c448bf47)
+++ graphics-pipeline_vulkan.hpp	(revision e8445f0578a1239a58166837998c25fe3ab0ecc3)
@@ -32,5 +32,7 @@
 };
 
-// TODO: Use this struct for uniform buffers as well (maybe move it to VulkanUtils)
+// TODO: Use this struct for uniform buffers as well and rename it to VulkanBuffer (maybe move it to VulkanUtils)
+// Also, probably better to make this a vector of structs where each struct
+// has a VkBuffer, VkDeviceMemory, and VkDescriptorBufferInfo
 struct StorageBufferSet {
    vector<VkBuffer> buffers;
@@ -64,5 +66,7 @@
       void addStorageDescriptor(VkShaderStageFlags stageFlags);
 
-      void addDescriptorInfo(VkDescriptorType type, VkShaderStageFlags stageFlags, vector<VkDescriptorBufferInfo>* bufferData);
+      // TODO: I might be able to use a single VkDescriptorBufferInfo here and reuse it when creating the descriptor sets
+      void addDescriptorInfo(VkDescriptorType type, VkShaderStageFlags stageFlags,
+                             vector<VkDescriptorBufferInfo>* bufferData);
       void addDescriptorInfo(VkDescriptorType type, VkShaderStageFlags stageFlags, VkDescriptorImageInfo* imageData);
 
@@ -75,10 +79,10 @@
 
       bool addObject(const vector<VertexType>& vertices, vector<uint16_t> indices, SSBOType& ssbo,
-         VkCommandPool commandPool, VkQueue graphicsQueue);
+                     VkCommandPool commandPool, VkQueue graphicsQueue);
 
       void updateObject(size_t objIndex, SSBOType& ssbo);
 
       void updateObjectVertices(size_t objIndex, const vector<VertexType>& vertices, VkCommandPool commandPool,
-         VkQueue graphicsQueue);
+                                VkQueue graphicsQueue);
 
       void cleanup();
@@ -456,4 +460,5 @@
          switch (descriptorWrites[j].descriptorType) {
             case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
+            case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
             case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
                descriptorWrites[j].pBufferInfo = &(*this->descriptorInfoList[j].bufferDataList)[i];
@@ -474,5 +479,7 @@
 void GraphicsPipeline_Vulkan<VertexType, SSBOType>::createRenderCommands(VkCommandBuffer& commandBuffer,
       uint32_t currentImage) {
+
    vkCmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
+
    vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, 1,
       &descriptorSets[currentImage], 0, nullptr);
@@ -543,9 +550,11 @@
 }
 
+// TODO: Allow a swapchain index to be passed in instead of updating all of them
+// Actually, since I'm in the process of replacing SSBOs with dynamic UBOs, I can ignore that for this function
 template<class VertexType, class SSBOType>
 void GraphicsPipeline_Vulkan<VertexType, SSBOType>::updateObject(size_t objIndex, SSBOType& ssbo) {
    if (!is_same_v<SSBOType, void*>) {
       for (size_t i = 0; i < storageBufferSet.memory.size(); i++) {
-         VulkanUtils::copyDataToMemory(this->device, storageBufferSet.memory[i], objIndex * sizeof(SSBOType), ssbo);
+         VulkanUtils::copyDataToMemory(this->device, ssbo, storageBufferSet.memory[i], objIndex * sizeof(SSBOType));
       }
    }
Index: sdl-game.cpp
===================================================================
--- sdl-game.cpp	(revision 4a777d2b3a0f0dff81e2a81bb45124f3c448bf47)
+++ sdl-game.cpp	(revision e8445f0578a1239a58166837998c25fe3ab0ecc3)
@@ -446,5 +446,5 @@
    }
 
-   VulkanUtils::copyDataToMemory(device, uniformBuffersMemory_modelPipeline[imageIndex], 0, object_VP_mats);
+   VulkanUtils::copyDataToMemory(device, object_VP_mats, uniformBuffersMemory_modelPipeline[imageIndex], 0);
 }
 
Index: vulkan-game.cpp
===================================================================
--- vulkan-game.cpp	(revision 4a777d2b3a0f0dff81e2a81bb45124f3c448bf47)
+++ vulkan-game.cpp	(revision e8445f0578a1239a58166837998c25fe3ab0ecc3)
@@ -92,7 +92,7 @@
    seedRandomNums();
 
+   cout << "Vulkan Game" << endl;
+
    cout << "DEBUGGING IS " << (ENABLE_VALIDATION_LAYERS ? "ON" : "OFF") << endl;
-
-   cout << "Vulkan Game" << endl;
 
    if (initUI(width, height, guiFlags) == RTWO_ERROR) {
@@ -1049,13 +1049,13 @@
    explosion_UBO.cur_time = curTime;
 
-   VulkanUtils::copyDataToMemory(device, uniformBuffersMemory_modelPipeline[imageIndex], 0, object_VP_mats);
-
-   VulkanUtils::copyDataToMemory(device, uniformBuffersMemory_shipPipeline[imageIndex], 0, ship_VP_mats);
-
-   VulkanUtils::copyDataToMemory(device, uniformBuffersMemory_asteroidPipeline[imageIndex], 0, asteroid_VP_mats);
-
-   VulkanUtils::copyDataToMemory(device, uniformBuffersMemory_laserPipeline[imageIndex], 0, laser_VP_mats);
-
-   VulkanUtils::copyDataToMemory(device, uniformBuffersMemory_explosionPipeline[imageIndex], 0, explosion_UBO);
+   VulkanUtils::copyDataToMemory(device, object_VP_mats, uniformBuffersMemory_modelPipeline[imageIndex], 0);
+
+   VulkanUtils::copyDataToMemory(device, ship_VP_mats, uniformBuffersMemory_shipPipeline[imageIndex], 0);
+
+   VulkanUtils::copyDataToMemory(device, asteroid_VP_mats, uniformBuffersMemory_asteroidPipeline[imageIndex], 0);
+
+   VulkanUtils::copyDataToMemory(device, laser_VP_mats, uniformBuffersMemory_laserPipeline[imageIndex], 0);
+
+   VulkanUtils::copyDataToMemory(device, explosion_UBO, uniformBuffersMemory_explosionPipeline[imageIndex], 0);
 }
 
Index: vulkan-game.hpp
===================================================================
--- vulkan-game.hpp	(revision 4a777d2b3a0f0dff81e2a81bb45124f3c448bf47)
+++ vulkan-game.hpp	(revision e8445f0578a1239a58166837998c25fe3ab0ecc3)
@@ -198,4 +198,10 @@
    UIValue(UIValueType _type, string _label, void* _value) : type(_type), label(_label), value(_value) {}
 };
+
+/* TODO: The following syntax (note the const keyword) means the function will not modify
+ * its params. I should use this where appropriate
+ *
+ * [return-type] [func-name](params...) const { ... }
+ */
 
 class VulkanGame {
Index: vulkan-utils.hpp
===================================================================
--- vulkan-utils.hpp	(revision 4a777d2b3a0f0dff81e2a81bb45124f3c448bf47)
+++ vulkan-utils.hpp	(revision e8445f0578a1239a58166837998c25fe3ab0ecc3)
@@ -39,66 +39,74 @@
 
       static VkResult createDebugUtilsMessengerEXT(VkInstance instance,
-            const VkDebugUtilsMessengerCreateInfoEXT* pCreateInfo,
-            const VkAllocationCallbacks* pAllocator,
-            VkDebugUtilsMessengerEXT* pDebugMessenger);
+                                                   const VkDebugUtilsMessengerCreateInfoEXT* pCreateInfo,
+                                                   const VkAllocationCallbacks* pAllocator,
+                                                   VkDebugUtilsMessengerEXT* pDebugMessenger);
 
       static void destroyDebugUtilsMessengerEXT(VkInstance instance,
-            VkDebugUtilsMessengerEXT debugMessenger,
-            const VkAllocationCallbacks* pAllocator);
+                                                VkDebugUtilsMessengerEXT debugMessenger,
+                                                const VkAllocationCallbacks* pAllocator);
 
       static QueueFamilyIndices findQueueFamilies(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface);
       static bool checkDeviceExtensionSupport(VkPhysicalDevice physicalDevice,
-            const vector<const char*>& deviceExtensions);
+                                              const vector<const char*>& deviceExtensions);
       static VkSurfaceCapabilitiesKHR querySwapChainCapabilities(VkPhysicalDevice physicalDevice,
-         VkSurfaceKHR surface);
+                                                                 VkSurfaceKHR surface);
       static vector<VkSurfaceFormatKHR> querySwapChainFormats(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface);
       static vector<VkPresentModeKHR> querySwapChainPresentModes(VkPhysicalDevice physicalDevice,
-         VkSurfaceKHR surface);
+                                                                 VkSurfaceKHR surface);
       static VkSurfaceFormatKHR chooseSwapSurfaceFormat(const vector<VkSurfaceFormatKHR>& availableFormats,
-         const vector<VkFormat>& requestedFormats, VkColorSpaceKHR requestedColorSpace);
+                                                        const vector<VkFormat>& requestedFormats, VkColorSpaceKHR requestedColorSpace);
       static VkPresentModeKHR chooseSwapPresentMode(const vector<VkPresentModeKHR>& availablePresentModes,
-         const vector<VkPresentModeKHR>& requestedPresentModes);
+                                                    const vector<VkPresentModeKHR>& requestedPresentModes);
       static VkExtent2D chooseSwapExtent(const VkSurfaceCapabilitiesKHR& capabilities, int width, int height);
       static VkImageView createImageView(VkDevice device, VkImage image, VkFormat format,
-            VkImageAspectFlags aspectFlags);
+                                         VkImageAspectFlags aspectFlags);
       static VkFormat findSupportedFormat(VkPhysicalDevice physicalDevice, const vector<VkFormat>& candidates,
-            VkImageTiling tiling, VkFormatFeatureFlags features);
+                                          VkImageTiling tiling, VkFormatFeatureFlags features);
       static void createBuffer(VkDevice device, VkPhysicalDevice physicalDevice, VkDeviceSize size,
-            VkBufferUsageFlags usage, VkMemoryPropertyFlags properties, VkBuffer& buffer,
-            VkDeviceMemory& bufferMemory);
+                               VkBufferUsageFlags usage, VkMemoryPropertyFlags properties, VkBuffer& buffer,
+                               VkDeviceMemory& bufferMemory);
       static uint32_t findMemoryType(VkPhysicalDevice physicalDevice, uint32_t typeFilter,
-            VkMemoryPropertyFlags properties);
+                                     VkMemoryPropertyFlags properties);
 
       static void createVulkanImageFromFile(VkDevice device, VkPhysicalDevice physicalDevice,
-            VkCommandPool commandPool, string filename, VulkanImage& image, VkQueue graphicsQueue);
+                                            VkCommandPool commandPool, string filename, VulkanImage& image,
+                                            VkQueue graphicsQueue);
       static void createVulkanImageFromSDLTexture(VkDevice device, VkPhysicalDevice physicalDevice,
-            SDL_Texture* texture, VulkanImage& image);
+                                                  SDL_Texture* texture, VulkanImage& image);
       static void populateVulkanImageFromSDLTexture(VkDevice device, VkPhysicalDevice physicalDevice,
-            VkCommandPool commandPool, SDL_Texture* texture, SDL_Renderer* renderer, VulkanImage& image,
-            VkQueue graphicsQueue);
+                                                    VkCommandPool commandPool, SDL_Texture* texture,
+                                                    SDL_Renderer* renderer, VulkanImage& image, VkQueue graphicsQueue);
       static void createDepthImage(VkDevice device, VkPhysicalDevice physicalDevice, VkCommandPool commandPool,
-            VkFormat depthFormat, VkExtent2D extent, VulkanImage& image, VkQueue graphicsQueue);
+                                   VkFormat depthFormat, VkExtent2D extent, VulkanImage& image, VkQueue graphicsQueue);
       static void createImage(VkDevice device, VkPhysicalDevice physicalDevice, uint32_t width, uint32_t height,
-            VkFormat format, VkImageTiling tiling, VkImageUsageFlags usage, VkMemoryPropertyFlags properties,
-            VulkanImage& image);
+                              VkFormat format, VkImageTiling tiling, VkImageUsageFlags usage,
+                              VkMemoryPropertyFlags properties, VulkanImage& image);
 
       static void transitionImageLayout(VkDevice device, VkCommandPool commandPool, VkImage image,
-            VkFormat format, VkImageLayout oldLayout, VkImageLayout newLayout, VkQueue graphicsQueue);
+                                        VkFormat format, VkImageLayout oldLayout, VkImageLayout newLayout,
+                                        VkQueue graphicsQueue);
       static VkCommandBuffer beginSingleTimeCommands(VkDevice device, VkCommandPool commandPool);
       static void endSingleTimeCommands(VkDevice device, VkCommandPool commandPool,
-            VkCommandBuffer commandBuffer, VkQueue graphicsQueue);
+                                        VkCommandBuffer commandBuffer, VkQueue graphicsQueue);
       static void copyBufferToImage(VkDevice device, VkCommandPool commandPool, VkBuffer buffer, VkImage image,
-            uint32_t width, uint32_t height, VkQueue graphicsQueue);
+                                    uint32_t width, uint32_t height, VkQueue graphicsQueue);
 
       template<class DataType>
       static void copyDataToBuffer(VkDevice device, VkPhysicalDevice physicalDevice, VkCommandPool commandPool,
-            const vector<DataType>& srcData, VkBuffer dstBuffer, size_t dstVertexOffset, VkQueue graphicsQueue);
+                                   const vector<DataType>& srcData, VkBuffer dstBuffer, size_t dstVertexOffset,
+                                   VkQueue graphicsQueue);
 
       static void copyBuffer(VkDevice device, VkCommandPool commandPool, VkBuffer srcBuffer, VkBuffer dstBuffer,
-            VkDeviceSize srcOffset, VkDeviceSize dstOffset, VkDeviceSize size, VkQueue graphicsQueue);
+                             VkDeviceSize srcOffset, VkDeviceSize dstOffset, VkDeviceSize size,
+                             VkQueue graphicsQueue);
 
       template<class DataType>
-      static void copyDataToMemory(VkDevice device, VkDeviceMemory bufferMemory, VkDeviceSize offset,
-            const DataType& srcData);
+      static void copyDataToMemory(VkDevice device, const DataType& srcData, VkDeviceMemory bufferMemory,
+                                   VkDeviceSize offset);
+
+      template<class DataType>
+      static void copyDataToMemory(VkDevice device, const DataType& srcData, VkDeviceMemory bufferMemory,
+                                   VkDeviceSize offset, VkDeviceSize size);
 
       static bool hasStencilComponent(VkFormat format);
@@ -131,13 +139,20 @@
 
 template<class DataType>
-void VulkanUtils::copyDataToMemory(VkDevice device, VkDeviceMemory bufferMemory, VkDeviceSize offset,
-      const DataType& srcData) {
+void VulkanUtils::copyDataToMemory(VkDevice device, const DataType& srcData, VkDeviceMemory bufferMemory,
+   VkDeviceSize offset) {
+   copyDataToMemory(device, srcData, bufferMemory, offset, sizeof(DataType));
+}
+
+template<class DataType>
+void VulkanUtils::copyDataToMemory(VkDevice device, const DataType& srcData, VkDeviceMemory bufferMemory,
+                                   VkDeviceSize offset, VkDeviceSize size) {
    void* data;
 
-   vkMapMemory(device, bufferMemory, offset, sizeof(DataType), 0, &data);
-   memcpy(data, &srcData, sizeof(DataType));
+   vkMapMemory(device, bufferMemory, offset, size, 0, &data);
+   memcpy(data, &srcData, size);
    vkUnmapMemory(device, bufferMemory);
 }
 
+// TODO: Use this in vulkan-utils itself as well
 #define VKUTIL_CHECK_RESULT(f, msg) {                                                                                      \
    VkResult res = (f);                                                                                                     \
