Index: graphics-pipeline_vulkan.hpp
===================================================================
--- graphics-pipeline_vulkan.hpp	(revision 996dd3efcf576a5eaf4f04878167c007d853dbac)
+++ graphics-pipeline_vulkan.hpp	(revision a3cefaa6294c97206ade08805f4ff1b8c13d2d4e)
@@ -36,8 +36,4 @@
    public:
       string vertShaderFile, fragShaderFile;
-
-      // Both of these are only used for managing the SSBO, so move them out as well
-      size_t objectCapacity;
-      size_t numObjects;
 
       GraphicsPipeline_Vulkan();
@@ -48,5 +44,5 @@
       GraphicsPipeline_Vulkan(VkPrimitiveTopology topology, VkPhysicalDevice physicalDevice, VkDevice device,
          VkRenderPass renderPass, Viewport viewport, vector<VkImage>& swapChainImages,
-         size_t vertexCapacity, size_t indexCapacity, size_t objectCapacity);
+         size_t vertexCapacity, size_t indexCapacity);
       ~GraphicsPipeline_Vulkan();
 
@@ -64,5 +60,6 @@
       void addDescriptorInfo(VkDescriptorType type, VkShaderStageFlags stageFlags, VkDescriptorImageInfo* imageData);
 
-      void updateDescriptorInfo(uint32_t index, vector<VkDescriptorBufferInfo>* bufferData);
+      void updateDescriptorInfo(uint32_t index, vector<VkDescriptorBufferInfo>* bufferData,
+                                vector<VkImage>& swapChainImages);
       // TODO: Maybe make an analogous one for updating image info
 
@@ -128,12 +125,17 @@
 // into the constructor. That way, I can also put relevant cleanup code into the destructor
 template<class VertexType>
-GraphicsPipeline_Vulkan<VertexType>::GraphicsPipeline_Vulkan(
-      VkPrimitiveTopology topology, VkPhysicalDevice physicalDevice, VkDevice device,
-      VkRenderPass renderPass, Viewport viewport, vector<VkImage>& swapChainImages,
-      size_t vertexCapacity, size_t indexCapacity, size_t objectCapacity) {
-   this->topology = topology;
-   this->physicalDevice = physicalDevice;
-   this->device = device;
-   this->renderPass = renderPass;
+GraphicsPipeline_Vulkan<VertexType>::GraphicsPipeline_Vulkan(VkPrimitiveTopology topology,
+                                                             VkPhysicalDevice physicalDevice, VkDevice device,
+                                                             VkRenderPass renderPass, Viewport viewport,
+                                                             vector<VkImage>& swapChainImages, size_t vertexCapacity,
+                                                             size_t indexCapacity)
+                                                            : topology(topology)
+                                                            , physicalDevice(physicalDevice)
+                                                            , device(device)
+                                                            , renderPass(renderPass) {
+   // This is a member of the base GraphicsPipeline class
+   // It currently is not used for the OpenGL pipeline. Either figure out why (since OpenGL certainly has the concept of
+   // viewports) and use it there too and add viewport the the base class constructor, or create a second base class
+   // constructor which takes the viewport
    this->viewport = viewport;
 
@@ -158,7 +160,4 @@
       VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT,
       VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, indexBuffer, indexBufferMemory);
-
-   this->numObjects = 0;
-   this->objectCapacity = objectCapacity;
 }
 
@@ -204,6 +203,44 @@
 template<class VertexType>
 void GraphicsPipeline_Vulkan<VertexType>::updateDescriptorInfo(uint32_t index,
-                                                                         vector<VkDescriptorBufferInfo>* bufferData) {
+                                                               vector<VkDescriptorBufferInfo>* bufferData,
+                                                               vector<VkImage>& swapChainImages) {
    this->descriptorInfoList[index].bufferDataList = bufferData;
+
+   // TODO: This code was mostly copied from createDescriptorSets. I should make some common function they both use
+   // for updating descriptor sets
+   for (size_t i = 0; i < swapChainImages.size(); i++) {
+      VkWriteDescriptorSet descriptorWrite = {};
+
+      descriptorWrite.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
+      descriptorWrite.dstSet = this->descriptorSets[i];
+      descriptorWrite.dstBinding = index;
+      descriptorWrite.dstArrayElement = 0;
+      descriptorWrite.descriptorType = this->descriptorInfoList[index].type;
+      descriptorWrite.descriptorCount = 1;
+      descriptorWrite.pBufferInfo = nullptr;
+      descriptorWrite.pImageInfo = nullptr;
+      descriptorWrite.pTexelBufferView = nullptr;
+
+      // This method is only intended for updated descriptor sets of type VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
+      // but I'm leaving that in here for completeness
+      switch (descriptorWrite.descriptorType) {
+         case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
+         case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
+         case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
+            descriptorWrite.pBufferInfo = &(*this->descriptorInfoList[index].bufferDataList)[i];
+            break;
+         case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
+            descriptorWrite.pImageInfo = this->descriptorInfoList[index].imageData;
+            break;
+         default:
+            throw runtime_error("Unknown descriptor type: " + to_string(descriptorWrite.descriptorType));
+      }
+
+      if (bufferData->size() != swapChainImages.size()) {
+         cout << "ALERT ALERT ALERT: SIZE MISMATCH!!!!!!!" << endl;
+      }
+
+      vkUpdateDescriptorSets(this->device, 1, &descriptorWrite, 0, nullptr);
+   }
 }
 
