Index: game-gui-sdl.cpp
===================================================================
--- game-gui-sdl.cpp	(revision a79be34adfe13383d4a6091a3e3e7b7a6055febc)
+++ game-gui-sdl.cpp	(revision cd1cb0f1c15960f0a67081b76e0ee969574e8114)
@@ -10,4 +10,7 @@
 
 string GameGui_SDL::s_errorMessage;
+
+GameGui_SDL::GameGui_SDL() : keyState(SDL_GetKeyboardState(NULL)) {
+}
 
 string& GameGui_SDL::getError() {
@@ -140,4 +143,8 @@
 }
 
+bool GameGui_SDL::keyPressed(unsigned int key) {
+   return keyState[key];
+}
+
 void GameGui_SDL::refreshWindowSize() {
    SDL_GetWindowSize(window, &windowWidth, &windowHeight);
Index: game-gui-sdl.hpp
===================================================================
--- game-gui-sdl.hpp	(revision a79be34adfe13383d4a6091a3e3e7b7a6055febc)
+++ game-gui-sdl.hpp	(revision cd1cb0f1c15960f0a67081b76e0ee969574e8114)
@@ -14,4 +14,6 @@
 class GameGui_SDL : public GameGui {
    public:
+      GameGui_SDL();
+
       string& getError();
 
@@ -24,4 +26,5 @@
       void processEvents();
       int pollEvent(UIEvent* event);
+      bool keyPressed(unsigned int key);
 
       void refreshWindowSize();
@@ -37,4 +40,5 @@
       SDL_Window* window;
       int windowWidth, windowHeight;
+      const Uint8* keyState;
 
       static string s_errorMessage;
Index: game-gui.hpp
===================================================================
--- game-gui.hpp	(revision a79be34adfe13383d4a6091a3e3e7b7a6055febc)
+++ game-gui.hpp	(revision cd1cb0f1c15960f0a67081b76e0ee969574e8114)
@@ -76,4 +76,5 @@
       virtual void processEvents() = 0;
       virtual int pollEvent(UIEvent* event) = 0;
+      virtual bool keyPressed(unsigned int key) = 0;
 
       virtual void refreshWindowSize() = 0;
Index: graphics-pipeline_vulkan.hpp
===================================================================
--- graphics-pipeline_vulkan.hpp	(revision a79be34adfe13383d4a6091a3e3e7b7a6055febc)
+++ graphics-pipeline_vulkan.hpp	(revision cd1cb0f1c15960f0a67081b76e0ee969574e8114)
@@ -10,5 +10,14 @@
 #include <vulkan/vulkan.h>
 
+#define GLM_FORCE_RADIANS
+#define GLM_FORCE_DEPTH_ZERO_TO_ONE // Since, in Vulkan, the depth range is 0 to 1 instead of -1 to 1
+#define GLM_FORCE_RIGHT_HANDED
+
+#include <glm/glm.hpp>
+#include <glm/gtc/matrix_transform.hpp>
+
 #include "vulkan-utils.hpp"
+
+using namespace glm;
 
 // TODO: Maybe change the name of this struct so I can call the list something other than descriptorInfoList
@@ -28,4 +37,7 @@
    vector<VertexType> vertices;
    vector<uint16_t> indices;
+
+   mat4 model_base;
+   mat4 model_transform;
 };
 
@@ -54,5 +66,5 @@
       void createRenderCommands(VkCommandBuffer& commandBuffer, uint32_t currentImage);
 
-      const vector<SceneObject<VertexType>>& getObjects();
+      vector<SceneObject<VertexType>>& getObjects();
       void addObject(const vector<VertexType>& vertices, vector<uint16_t> indices, VkCommandPool commandPool,
          VkQueue graphicsQueue);
@@ -88,7 +100,7 @@
       VkDeviceMemory indexBufferMemory;
 
-      // TODO: THe objects vector isn't used at all in this class, except in the method that returns
+      // 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 sich as transforms to SceneObject later
+      // since I'll be adding other object-specific fields such as transforms to SceneObject later
       vector<SceneObject<VertexType>> objects;
 
@@ -410,5 +422,5 @@
 
 template<class VertexType>
-const vector<SceneObject<VertexType>>& GraphicsPipeline_Vulkan<VertexType>::getObjects() {
+vector<SceneObject<VertexType>>& GraphicsPipeline_Vulkan<VertexType>::getObjects() {
    return objects;
 }
@@ -428,5 +440,5 @@
       idx += numVertices;
    }
-   objects.push_back({ vertices, indices });
+   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 a79be34adfe13383d4a6091a3e3e7b7a6055febc)
+++ vulkan-game.cpp	(revision cd1cb0f1c15960f0a67081b76e0ee969574e8114)
@@ -508,4 +508,8 @@
 
    createSyncObjects();
+
+   shipPipeline.getObjects()[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));
 }
 
@@ -608,4 +612,12 @@
       }
 
+      // Check which keys are held down
+
+      if (gui->keyPressed(SDL_SCANCODE_LEFT)) {
+         transformObject(shipPipeline.getObjects()[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)));
+      }
+
       renderUI();
       renderScene();
@@ -623,11 +635,11 @@
    float time = chrono::duration<float, chrono::seconds::period>(currentTime - startTime).count();
 
+   // TODO: Will need to change this to go through all objects of all pipelines and update their model mats
+
    so_Object.model =
       translate(mat4(1.0f), vec3(0.0f, -2.0f, -0.0f)) *
       rotate(mat4(1.0f), time * radians(90.0f), vec3(0.0f, 0.0f, 1.0f));
 
-   so_Ship.model =
-      translate(mat4(1.0f), vec3(0.0f, -1.2f, 1.65f)) *
-      scale(mat4(1.0f), vec3(0.1f, 0.1f, 0.1f));
+   so_Ship.model = shipPipeline.getObjects()[0].model_transform * shipPipeline.getObjects()[0].model_base;
 
    VulkanUtils::copyDataToMemory(device, uniformBuffersMemory_scenePipeline[currentImage], object_VP_mats);
Index: vulkan-game.hpp
===================================================================
--- vulkan-game.hpp	(revision a79be34adfe13383d4a6091a3e3e7b7a6055febc)
+++ vulkan-game.hpp	(revision cd1cb0f1c15960f0a67081b76e0ee969574e8114)
@@ -189,4 +189,7 @@
       vector<VertexType> centerObject(vector<VertexType> vertices);
 
+      template<class VertexType>
+      void transformObject(SceneObject<VertexType>& obj, mat4 mat);
+
       void createBufferSet(VkDeviceSize bufferSize, VkBufferUsageFlags flags,
          vector<VkBuffer>& buffers, vector<VkDeviceMemory>& buffersMemory, vector<VkDescriptorBufferInfo>& bufferInfoList);
@@ -269,3 +272,8 @@
 }
 
+template<class VertexType>
+void VulkanGame::transformObject(SceneObject<VertexType>& obj, mat4 mat) {
+   obj.model_transform = mat * obj.model_transform;
+}
+
 #endif // _VULKAN_GAME_H
