Index: shaders/scene.vert
===================================================================
--- shaders/scene.vert	(revision 4ece3bfc62afe6a3c7f1ddff0e98daed33f106aa)
+++ shaders/scene.vert	(revision 5a1ace07fab99988e1cc16659663dd54921b15f4)
@@ -18,4 +18,5 @@
 layout(location = 1) in vec3 inColor;
 layout(location = 2) in vec2 inTexCoord;
+layout(location = 3) in uint obj_index;
 
 layout(location = 0) out vec3 fragColor;
@@ -26,4 +27,4 @@
    fragTexCoord = inTexCoord;
 
-   gl_Position = ubo.proj * ubo.view * sbo.objects[0].model * vec4(inPosition, 1.0);
+   gl_Position = ubo.proj * ubo.view * sbo.objects[obj_index].model * vec4(inPosition, 1.0);
 }
Index: vulkan-game.cpp
===================================================================
--- vulkan-game.cpp	(revision 4ece3bfc62afe6a3c7f1ddff0e98daed33f106aa)
+++ vulkan-game.cpp	(revision 5a1ace07fab99988e1cc16659663dd54921b15f4)
@@ -197,4 +197,5 @@
    modelPipeline.addAttribute(VK_FORMAT_R32G32B32_SFLOAT, offset_of(&ModelVertex::color));
    modelPipeline.addAttribute(VK_FORMAT_R32G32_SFLOAT, offset_of(&ModelVertex::texCoord));
+   modelPipeline.addAttribute(VK_FORMAT_R32_UINT, offset_of(&ModelVertex::objIndex));
 
    createBufferSet(sizeof(UBO_VP_mats), VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
@@ -213,20 +214,20 @@
 
    addObject(modelObjects, modelPipeline,
-      {
+      addObjectIndex<ModelVertex>(modelObjects.size(), {
          {{-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}},
          {{ 0.5f,  0.5f, -2.0f}, {0.0f, 0.0f, 1.0f}, {1.0f, 0.0f}},
          {{-0.5f,  0.5f, -2.0f}, {1.0f, 1.0f, 1.0f}, {0.0f, 0.0f}}
-      }, {
+      }), {
          0, 1, 2, 2, 3, 0
       });
 
    addObject(modelObjects, modelPipeline,
-      {
+      addObjectIndex<ModelVertex>(modelObjects.size(), {
          {{-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}},
          {{ 0.5f,  0.5f, -1.5f}, {0.0f, 0.0f, 1.0f}, {1.0f, 0.0f}},
          {{-0.5f,  0.5f, -1.5f}, {1.0f, 1.0f, 1.0f}, {0.0f, 0.0f}}
-      }, {
+      }), {
          0, 1, 2, 2, 3, 0
       });
@@ -699,10 +700,10 @@
 
                   addObject(modelObjects, modelPipeline,
-                     {
+                     addObjectIndex<ModelVertex>(modelObjects.size(), {
                         {{-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
                      });
@@ -774,15 +775,18 @@
    so_Asteroid.model = asteroidObjects[0].model_transform * asteroidObjects[0].model_base;
 
-   VulkanUtils::copyDataToMemory(device, uniformBuffersMemory_scenePipeline[currentImage], object_VP_mats);
-
-   VulkanUtils::copyDataToMemory(device, storageBuffersMemory_scenePipeline[currentImage], so_Object);
-
-   VulkanUtils::copyDataToMemory(device, uniformBuffersMemory_shipPipeline[currentImage], ship_VP_mats);
-
-   VulkanUtils::copyDataToMemory(device, storageBuffersMemory_shipPipeline[currentImage], so_Ship);
-
-   VulkanUtils::copyDataToMemory(device, uniformBuffersMemory_asteroidPipeline[currentImage], asteroid_VP_mats);
-
-   VulkanUtils::copyDataToMemory(device, storageBuffersMemory_asteroidPipeline[currentImage], so_Asteroid);
+   VulkanUtils::copyDataToMemory(device, uniformBuffersMemory_scenePipeline[currentImage], 0, object_VP_mats);
+
+   for (size_t i = 0; i < modelObjects.size(); i++) {
+      VulkanUtils::copyDataToMemory(device, storageBuffersMemory_scenePipeline[currentImage],
+         i, so_Object);
+   }
+
+   VulkanUtils::copyDataToMemory(device, uniformBuffersMemory_shipPipeline[currentImage], 0, ship_VP_mats);
+
+   VulkanUtils::copyDataToMemory(device, storageBuffersMemory_shipPipeline[currentImage], 0, so_Ship);
+
+   VulkanUtils::copyDataToMemory(device, uniformBuffersMemory_asteroidPipeline[currentImage], 0, asteroid_VP_mats);
+
+   VulkanUtils::copyDataToMemory(device, storageBuffersMemory_asteroidPipeline[currentImage], 0, so_Asteroid);
 }
 
Index: vulkan-game.hpp
===================================================================
--- vulkan-game.hpp	(revision 4ece3bfc62afe6a3c7f1ddff0e98daed33f106aa)
+++ vulkan-game.hpp	(revision 5a1ace07fab99988e1cc16659663dd54921b15f4)
@@ -22,13 +22,14 @@
 #endif
 
+struct OverlayVertex {
+   vec3 pos;
+   vec2 texCoord;
+};
+
 struct ModelVertex {
    vec3 pos;
    vec3 color;
    vec2 texCoord;
-};
-
-struct OverlayVertex {
-   vec3 pos;
-   vec2 texCoord;
+   unsigned int objIndex;
 };
 
Index: vulkan-utils.hpp
===================================================================
--- vulkan-utils.hpp	(revision 4ece3bfc62afe6a3c7f1ddff0e98daed33f106aa)
+++ vulkan-utils.hpp	(revision 5a1ace07fab99988e1cc16659663dd54921b15f4)
@@ -95,5 +95,6 @@
 
       template<class DataType>
-      static void copyDataToMemory(VkDevice device, VkDeviceMemory bufferMemory, const DataType& srcData);
+      static void copyDataToMemory(VkDevice device, VkDeviceMemory bufferMemory, VkDeviceSize offset,
+            const DataType& srcData);
 
       static bool hasStencilComponent(VkFormat format);
@@ -125,9 +126,10 @@
 }
 
-// TODO: Change copyDataToMemory so it can accept offsets for the data source and destination
 template<class DataType>
-void VulkanUtils::copyDataToMemory(VkDevice device, VkDeviceMemory bufferMemory, const DataType& srcData) {
+void VulkanUtils::copyDataToMemory(VkDevice device, VkDeviceMemory bufferMemory, VkDeviceSize offset,
+      const DataType& srcData) {
    void* data;
-   vkMapMemory(device, bufferMemory, 0, sizeof(DataType), 0, &data);
+
+   vkMapMemory(device, bufferMemory, offset * sizeof(DataType), sizeof(DataType), 0, &data);
    memcpy(data, &srcData, sizeof(DataType));
    vkUnmapMemory(device, bufferMemory);
