Index: vulkan-game.cpp
===================================================================
--- vulkan-game.cpp	(revision 4994692c43ddba22f532c23a33d0e66fa41c6ece)
+++ vulkan-game.cpp	(revision 5ba732adf847f4b1e8aacbde7dc7c7c2de313697)
@@ -248,5 +248,5 @@
    texturedSquare->model_base =
       translate(mat4(1.0f), vec3(0.0f, 0.0f, -2.0f));
-   updateObject(modelObjects, modelPipeline, modelObjects.size() - 1);
+   texturedSquare->modified = true;
 
    texturedSquare = &addObject(modelObjects, modelPipeline,
@@ -264,5 +264,5 @@
    texturedSquare->model_base =
       translate(mat4(1.0f), vec3(0.0f, 0.0f, -1.5f));
-   updateObject(modelObjects, modelPipeline, modelObjects.size() - 1);
+   texturedSquare->modified = true;
 
    modelPipeline.createDescriptorSetLayout();
@@ -549,5 +549,5 @@
       translate(mat4(1.0f), vec3(0.0f, -1.2f, 1.65f)) *
       scale(mat4(1.0f), vec3(0.1f, 0.1f, 0.1f));
-   updateObject(shipObjects, shipPipeline, 0);
+   ship.modified = true;
 }
 
@@ -650,5 +650,5 @@
                   texturedSquare.model_base =
                      translate(mat4(1.0f), vec3(0.0f, 0.0f, zOffset));
-                  updateObject(modelObjects, modelPipeline, modelObjects.size() - 1);
+                  texturedSquare.modified = true;
                } else {
                   cout << "Key event detected" << endl;
@@ -682,6 +682,5 @@
          ship.model_transform = translate(mat4(1.0f), vec3(distance, 0.0f, 0.0f))
             * shipObjects[0].model_transform;
-
-         updateObject(shipObjects, shipPipeline, 0);
+         ship.modified = true;
       } else if (gui->keyPressed(SDL_SCANCODE_RIGHT)) {
          float distance = this->shipSpeed * this->elapsedTime;
@@ -689,6 +688,5 @@
          ship.model_transform = translate(mat4(1.0f), vec3(distance, 0.0f, 0.0f))
             * shipObjects[0].model_transform;
-
-         updateObject(shipObjects, shipPipeline, 0);
+         ship.modified = true;
       }
 
@@ -704,25 +702,26 @@
 // where it will run just once per frame
 void VulkanGame::updateScene(uint32_t currentImage) {
-   for (int i = 0; i < modelObjects.size(); i++) {
-      modelObjects[i].model_transform =
+   for (SceneObject<ModelVertex, SSBO_ModelObject>& model : this->modelObjects) {
+      model.model_transform =
          translate(mat4(1.0f), vec3(0.0f, -2.0f, -0.0f)) *
          rotate(mat4(1.0f), this->curTime * radians(90.0f), vec3(0.0f, 0.0f, 1.0f));
-
-      updateObject(modelObjects, modelPipeline, i);
-   }
-
-   for (int i = 0; i < this->asteroidObjects.size(); i++) {
-      if (!this->asteroidObjects[i].ssbo.deleted) {
-         vec3 objCenter = vec3(viewMat * vec4(this->asteroidObjects[i].center, 1.0f));
-
-         if ((objCenter.z - this->asteroidObjects[i].radius) > -NEAR_CLIP) {
-            this->asteroidObjects[i].ssbo.deleted = true;
+      model.modified = true;
+   }
+
+   for (SceneObject<AsteroidVertex, SSBO_Asteroid>& asteroid : this->asteroidObjects) {
+      if (!asteroid.ssbo.deleted) {
+         vec3 objCenter = vec3(viewMat * vec4(asteroid.center, 1.0f));
+
+         if ((objCenter.z - asteroid.radius) > -NEAR_CLIP) {
+            asteroid.ssbo.deleted = true;
+
+            // TODO: Create explosion here
          } else {
-            this->asteroidObjects[i].model_transform =
+            asteroid.model_transform =
                translate(mat4(1.0f), vec3(0.0f, 0.0f, this->asteroidSpeed * this->elapsedTime)) *
-               this->asteroidObjects[i].model_transform;
+               asteroid.model_transform;
          }
 
-         updateObject(asteroidObjects, asteroidPipeline, i);
+         asteroid.modified = true;
       }
    }
@@ -807,6 +806,23 @@
          rotate(mat4(1.0f), radians(60.0f), vec3(1.0f, 1.0f, -1.0f)) *
          scale(mat4(1.0f), vec3(0.1f, 0.1f, 0.1f));
-
-      updateObject(asteroidObjects, asteroidPipeline, asteroidObjects.size() - 1);
+      asteroid.modified = true;
+   }
+
+   for (size_t i = 0; i < shipObjects.size(); i++) {
+      if (shipObjects[i].modified) {
+         updateObject(shipObjects, shipPipeline, i);
+      }
+   }
+
+   for (size_t i = 0; i < modelObjects.size(); i++) {
+      if (modelObjects[i].modified) {
+         updateObject(modelObjects, modelPipeline, i);
+      }
+   }
+
+   for (size_t i = 0; i < asteroidObjects.size(); i++) {
+      if (asteroidObjects[i].modified) {
+         updateObject(asteroidObjects, asteroidPipeline, i);
+      }
    }
 
Index: vulkan-game.hpp
===================================================================
--- vulkan-game.hpp	(revision 4994692c43ddba22f532c23a33d0e66fa41c6ece)
+++ vulkan-game.hpp	(revision 5ba732adf847f4b1e8aacbde7dc7c7c2de313697)
@@ -77,4 +77,6 @@
    mat4 model_base;
    mat4 model_transform;
+
+   bool modified;
 
    // TODO: Figure out if I should make child classes that have these fields instead of putting them in the
@@ -295,5 +297,5 @@
    }
 
-   objects.push_back({ vertices, indices, ssbo, mat4(1.0f), mat4(1.0f) });
+   objects.push_back({ vertices, indices, ssbo, mat4(1.0f), mat4(1.0f), false });
 
    SceneObject<VertexType, SSBOType>& obj = objects.back();
@@ -333,4 +335,6 @@
 
    pipeline.updateObject(index, obj.ssbo);
+
+   obj.modified = false;
 }
 
