Index: graphics-pipeline_vulkan.hpp
===================================================================
--- graphics-pipeline_vulkan.hpp	(revision cd1cb0f1c15960f0a67081b76e0ee969574e8114)
+++ graphics-pipeline_vulkan.hpp	(revision 0fe84333f0e448837677f6a2bd0c3f62b0a1d8c8)
@@ -29,15 +29,4 @@
    vector<VkDescriptorBufferInfo>* bufferDataList;
    VkDescriptorImageInfo* imageData;
-};
-
-// TODO: Change the index type to uint32_t and check the Vulkan Tutorial loading model section as a reference
-// TODO: Create a typedef for index type so I can easily change uin16_t to something else later
-template<class VertexType>
-struct SceneObject {
-   vector<VertexType> vertices;
-   vector<uint16_t> indices;
-
-   mat4 model_base;
-   mat4 model_transform;
 };
 
@@ -50,4 +39,6 @@
       ~GraphicsPipeline_Vulkan();
 
+      size_t getNumVertices();
+
       void updateRenderPass(VkRenderPass renderPass);
 
@@ -66,6 +57,5 @@
       void createRenderCommands(VkCommandBuffer& commandBuffer, uint32_t currentImage);
 
-      vector<SceneObject<VertexType>>& getObjects();
-      void addObject(const vector<VertexType>& vertices, vector<uint16_t> indices, VkCommandPool commandPool,
+      void addVertices(const vector<VertexType>& vertices, vector<uint16_t> indices, VkCommandPool commandPool,
          VkQueue graphicsQueue);
 
@@ -100,9 +90,4 @@
       VkDeviceMemory indexBufferMemory;
 
-      // TODO: The objects vector isn't used at all in this class, except in the method that returns
-      // the number of objects. Move this vector and the SceneObject declaration into VulkanGame, esp.
-      // since I'll be adding other object-specific fields such as transforms to SceneObject later
-      vector<SceneObject<VertexType>> objects;
-
       VkShaderModule createShaderModule(const vector<char>& code);
       vector<char> readFile(const string& filename);
@@ -151,4 +136,9 @@
 template<class VertexType>
 GraphicsPipeline_Vulkan<VertexType>::~GraphicsPipeline_Vulkan() {
+}
+
+template<class VertexType>
+size_t GraphicsPipeline_Vulkan<VertexType>::getNumVertices() {
+   return numVertices;
 }
 
@@ -422,10 +412,5 @@
 
 template<class VertexType>
-vector<SceneObject<VertexType>>& GraphicsPipeline_Vulkan<VertexType>::getObjects() {
-   return objects;
-}
-
-template<class VertexType>
-void GraphicsPipeline_Vulkan<VertexType>::addObject(const vector<VertexType>& vertices, vector<uint16_t> indices,
+void GraphicsPipeline_Vulkan<VertexType>::addVertices(const vector<VertexType>& vertices, vector<uint16_t> indices,
       VkCommandPool commandPool, VkQueue graphicsQueue) {
 
@@ -436,9 +421,4 @@
       resizeIndexBuffer(commandPool, graphicsQueue);
    }
-
-   for (uint16_t& idx : indices) {
-      idx += numVertices;
-   }
-   objects.push_back({ vertices, indices, mat4(1.0f), mat4(1.0f) });
 
    VulkanUtils::copyDataToBuffer(device, physicalDevice, commandPool, vertices, vertexBuffer, numVertices,
Index: vulkan-game.cpp
===================================================================
--- vulkan-game.cpp	(revision cd1cb0f1c15960f0a67081b76e0ee969574e8114)
+++ vulkan-game.cpp	(revision 0fe84333f0e448837677f6a2bd0c3f62b0a1d8c8)
@@ -207,5 +207,6 @@
       VK_SHADER_STAGE_FRAGMENT_BIT, &floorTextureImageDescriptor);
 
-   modelPipeline.addObject({
+   addObject(modelObjects, modelPipeline,
+      {
          {{-0.5f, -0.5f, -2.0f}, {1.0f, 0.0f, 0.0f}, {0.0f, 1.0f}},
          {{ 0.5f, -0.5f, -2.0f}, {0.0f, 1.0f, 0.0f}, {1.0f, 1.0f}},
@@ -214,7 +215,8 @@
       }, {
          0, 1, 2, 2, 3, 0
-      }, commandPool, graphicsQueue);
-
-   modelPipeline.addObject({
+      });
+
+   addObject(modelObjects, modelPipeline,
+      {
          {{-0.5f, -0.5f, -1.5f}, {1.0f, 0.0f, 0.0f}, {0.0f, 1.0f}},
          {{ 0.5f, -0.5f, -1.5f}, {0.0f, 1.0f, 0.0f}, {1.0f, 1.0f}},
@@ -223,5 +225,5 @@
       }, {
          0, 1, 2, 2, 3, 0
-      }, commandPool, graphicsQueue);
+      });
 
    modelPipeline.createDescriptorSetLayout();
@@ -236,5 +238,6 @@
       VK_SHADER_STAGE_FRAGMENT_BIT, &sdlOverlayImageDescriptor);
 
-   overlayPipeline.addObject({
+   addObject(overlayObjects, overlayPipeline,
+      {
          {{-1.0f,  1.0f,  0.0f}, {0.0f, 1.0f}},
          {{ 1.0f,  1.0f,  0.0f}, {1.0f, 1.0f}},
@@ -243,5 +246,5 @@
       }, {
          0, 1, 2, 2, 3, 0
-      }, commandPool, graphicsQueue);
+      });
 
    overlayPipeline.createDescriptorSetLayout();
@@ -267,7 +270,7 @@
    // TODO: With the normals, indexing basically becomes pointless since no vertices will have exactly
    // the same data. Add an option to make some pipelines not use indexing
-   shipPipeline.addObject(
+   addObject(shipObjects, shipPipeline,
       centerObject<ShipVertex>(
-      addObjectIndex<ShipVertex>(shipPipeline.getObjects().size(),
+      addObjectIndex<ShipVertex>(shipObjects.size(),
       addVertexNormals<ShipVertex>({
          //back
@@ -496,5 +499,5 @@
          132, 133, 134,
          135, 136, 137,
-      }, commandPool, graphicsQueue);
+      });
 
    shipPipeline.createDescriptorSetLayout();
@@ -509,5 +512,5 @@
    createSyncObjects();
 
-   shipPipeline.getObjects()[0].model_base =
+   shipObjects[0].model_base =
       translate(mat4(1.0f), vec3(0.0f, -1.2f, 1.65f)) *
       scale(mat4(1.0f), vec3(0.1f, 0.1f, 0.1f));
@@ -575,17 +578,18 @@
                } else if (e.key.keycode == SDL_SCANCODE_SPACE) {
                   cout << "Adding a plane" << endl;
-                  float zOffset = -2.0f + (0.5f * modelPipeline.getObjects().size());
+                  float zOffset = -2.0f + (0.5f * modelObjects.size());
 
                   vkDeviceWaitIdle(device);
                   vkFreeCommandBuffers(device, commandPool, static_cast<uint32_t>(commandBuffers.size()), commandBuffers.data());
 
-                  modelPipeline.addObject({
-                     {{-0.5f, -0.5f,  zOffset}, {1.0f, 0.0f, 0.0f}, {0.0f, 1.0f}},
-                     {{ 0.5f, -0.5f,  zOffset}, {0.0f, 1.0f, 0.0f}, {1.0f, 1.0f}},
-                     {{ 0.5f,  0.5f,  zOffset}, {0.0f, 0.0f, 1.0f}, {1.0f, 0.0f}},
-                     {{-0.5f,  0.5f,  zOffset}, {1.0f, 1.0f, 1.0f}, {0.0f, 0.0f}}
-                  }, {
-                     0, 1, 2, 2, 3, 0
-                  }, commandPool, graphicsQueue);
+                  addObject(modelObjects, modelPipeline,
+                     {
+                        {{-0.5f, -0.5f,  zOffset}, {1.0f, 0.0f, 0.0f}, {0.0f, 1.0f}},
+                        {{ 0.5f, -0.5f,  zOffset}, {0.0f, 1.0f, 0.0f}, {1.0f, 1.0f}},
+                        {{ 0.5f,  0.5f,  zOffset}, {0.0f, 0.0f, 1.0f}, {1.0f, 0.0f}},
+                        {{-0.5f,  0.5f,  zOffset}, {1.0f, 1.0f, 1.0f}, {0.0f, 0.0f}}
+                     }, {
+                        0, 1, 2, 2, 3, 0
+                     });
 
                   createCommandBuffers();
@@ -615,7 +619,7 @@
 
       if (gui->keyPressed(SDL_SCANCODE_LEFT)) {
-         transformObject(shipPipeline.getObjects()[0], translate(mat4(1.0f), vec3(-0.01f, 0.0f, 0.0f)));
+         transformObject(shipObjects[0], translate(mat4(1.0f), vec3(-0.01f, 0.0f, 0.0f)));
       } else if (gui->keyPressed(SDL_SCANCODE_RIGHT)) {
-         transformObject(shipPipeline.getObjects()[0], translate(mat4(1.0f), vec3(0.01f, 0.0f, 0.0f)));
+         transformObject(shipObjects[0], translate(mat4(1.0f), vec3(0.01f, 0.0f, 0.0f)));
       }
 
@@ -641,5 +645,5 @@
       rotate(mat4(1.0f), time * radians(90.0f), vec3(0.0f, 0.0f, 1.0f));
 
-   so_Ship.model = shipPipeline.getObjects()[0].model_transform * shipPipeline.getObjects()[0].model_base;
+   so_Ship.model = shipObjects[0].model_transform * shipObjects[0].model_base;
 
    VulkanUtils::copyDataToMemory(device, uniformBuffersMemory_scenePipeline[currentImage], object_VP_mats);
Index: vulkan-game.hpp
===================================================================
--- vulkan-game.hpp	(revision cd1cb0f1c15960f0a67081b76e0ee969574e8114)
+++ vulkan-game.hpp	(revision 0fe84333f0e448837677f6a2bd0c3f62b0a1d8c8)
@@ -40,4 +40,15 @@
 };
 
+// TODO: Change the index type to uint32_t and check the Vulkan Tutorial loading model section as a reference
+// TODO: Create a typedef for index type so I can easily change uin16_t to something else later
+template<class VertexType>
+struct SceneObject {
+   vector<VertexType> vertices;
+   vector<uint16_t> indices;
+
+   mat4 model_base;
+   mat4 model_transform;
+};
+
 struct UBO_VP_mats {
    alignas(16) mat4 view;
@@ -65,15 +76,5 @@
       vec3 cam_pos;
 
-      UBO_VP_mats object_VP_mats;
-      SBO_SceneObject so_Object;
-
-      UBO_VP_mats ship_VP_mats;
-      SBO_SceneObject so_Ship;
-
       GameGui* gui;
-
-      GraphicsPipeline_Vulkan<ModelVertex> modelPipeline;
-      GraphicsPipeline_Vulkan<OverlayVertex> overlayPipeline;
-      GraphicsPipeline_Vulkan<ShipVertex> shipPipeline;
 
       SDL_version sdlVersion;
@@ -107,27 +108,4 @@
       VkSampler textureSampler;
 
-      // TODO: I should probably rename the uniformBuffer* and storageBuffer*
-      // variables to better reflect the data they hold
-
-      vector<VkBuffer> uniformBuffers_scenePipeline;
-      vector<VkDeviceMemory> uniformBuffersMemory_scenePipeline;
-
-      vector<VkDescriptorBufferInfo> uniformBufferInfoList_scenePipeline;
-
-      vector<VkBuffer> storageBuffers_scenePipeline;
-      vector<VkDeviceMemory> storageBuffersMemory_scenePipeline;
-
-      vector<VkDescriptorBufferInfo> storageBufferInfoList_scenePipeline;
-
-      vector<VkBuffer> uniformBuffers_shipPipeline;
-      vector<VkDeviceMemory> uniformBuffersMemory_shipPipeline;
-
-      vector<VkDescriptorBufferInfo> uniformBufferInfoList_shipPipeline;
-
-      vector<VkBuffer> storageBuffers_shipPipeline;
-      vector<VkDeviceMemory> storageBuffersMemory_shipPipeline;
-
-      vector<VkDescriptorBufferInfo> storageBufferInfoList_shipPipeline;
-
       VulkanImage floorTextureImage;
       VkDescriptorImageInfo floorTextureImageDescriptor;
@@ -148,4 +126,47 @@
 
       bool framebufferResized;
+
+      // TODO: I should probably rename the uniformBuffer* and storageBuffer*
+      // variables to better reflect the data they hold
+
+      GraphicsPipeline_Vulkan<OverlayVertex> overlayPipeline;
+
+      vector<SceneObject<OverlayVertex>> overlayObjects;
+
+      // TODO: Rename all the variables related to modelPipeline to use the same pipelie name
+
+      GraphicsPipeline_Vulkan<ModelVertex> modelPipeline;
+
+      vector<SceneObject<ModelVertex>> modelObjects;
+
+      vector<VkBuffer> uniformBuffers_scenePipeline;
+      vector<VkDeviceMemory> uniformBuffersMemory_scenePipeline;
+
+      vector<VkDescriptorBufferInfo> uniformBufferInfoList_scenePipeline;
+
+      vector<VkBuffer> storageBuffers_scenePipeline;
+      vector<VkDeviceMemory> storageBuffersMemory_scenePipeline;
+
+      vector<VkDescriptorBufferInfo> storageBufferInfoList_scenePipeline;
+
+      UBO_VP_mats object_VP_mats;
+      SBO_SceneObject so_Object;
+
+      GraphicsPipeline_Vulkan<ShipVertex> shipPipeline;
+
+      vector<SceneObject<ShipVertex>> shipObjects;
+
+      vector<VkBuffer> uniformBuffers_shipPipeline;
+      vector<VkDeviceMemory> uniformBuffersMemory_shipPipeline;
+
+      vector<VkDescriptorBufferInfo> uniformBufferInfoList_shipPipeline;
+
+      vector<VkBuffer> storageBuffers_shipPipeline;
+      vector<VkDeviceMemory> storageBuffersMemory_shipPipeline;
+
+      vector<VkDescriptorBufferInfo> storageBufferInfoList_shipPipeline;
+
+      UBO_VP_mats ship_VP_mats;
+      SBO_SceneObject so_Ship;
 
       bool initWindow(int width, int height, unsigned char guiFlags);
@@ -181,4 +202,8 @@
 
       template<class VertexType>
+      void addObject(vector<SceneObject<VertexType>>& objects, GraphicsPipeline_Vulkan<VertexType>& pipeline,
+         const vector<VertexType>& vertices, vector<uint16_t> indices);
+
+      template<class VertexType>
       vector<VertexType> addVertexNormals(vector<VertexType> vertices);
 
@@ -205,4 +230,18 @@
             void* pUserData);
 };
+
+template<class VertexType>
+void VulkanGame::addObject(vector<SceneObject<VertexType>>& objects, GraphicsPipeline_Vulkan<VertexType>& pipeline,
+      const vector<VertexType>& vertices, vector<uint16_t> indices) {
+   size_t numVertices = pipeline.getNumVertices();
+
+   for (uint16_t& idx : indices) {
+      idx += numVertices;
+   }
+
+   objects.push_back({ vertices, indices, mat4(1.0f), mat4(1.0f) });
+
+   pipeline.addVertices(vertices, indices, commandPool, graphicsQueue);
+}
 
 template<class VertexType>
