Index: VulkanGame.vcxproj
===================================================================
--- VulkanGame.vcxproj	(revision 85b5fecdb1b2b3249583a225657b9a52d23bc726)
+++ VulkanGame.vcxproj	(revision 7865c5b0ff6fd16268522aa00c64569b2fd54092)
@@ -202,4 +202,10 @@
   </ItemGroup>
   <ItemGroup>
+    <Text Include="docs\DESIGN.txt" />
+    <Text Include="docs\notes.txt" />
+    <Text Include="docs\README.txt" />
+    <Text Include="docs\scene-notes.txt" />
+    <Text Include="docs\TODO.txt" />
+    <Text Include="docs\upgrade-TODO.txt" />
     <Text Include="scene-notes.txt" />
   </ItemGroup>
Index: VulkanGame.vcxproj.filters
===================================================================
--- VulkanGame.vcxproj.filters	(revision 85b5fecdb1b2b3249583a225657b9a52d23bc726)
+++ VulkanGame.vcxproj.filters	(revision 7865c5b0ff6fd16268522aa00c64569b2fd54092)
@@ -106,4 +106,22 @@
   <ItemGroup>
     <Text Include="scene-notes.txt" />
+    <Text Include="docs\DESIGN.txt">
+      <Filter>docs</Filter>
+    </Text>
+    <Text Include="docs\notes.txt">
+      <Filter>docs</Filter>
+    </Text>
+    <Text Include="docs\README.txt">
+      <Filter>docs</Filter>
+    </Text>
+    <Text Include="docs\scene-notes.txt">
+      <Filter>docs</Filter>
+    </Text>
+    <Text Include="docs\TODO.txt">
+      <Filter>docs</Filter>
+    </Text>
+    <Text Include="docs\upgrade-TODO.txt">
+      <Filter>docs</Filter>
+    </Text>
   </ItemGroup>
   <ItemGroup>
@@ -120,4 +138,7 @@
       <UniqueIdentifier>{2954212f-ed3d-45c5-b46a-bbb81a16ca78}</UniqueIdentifier>
     </Filter>
+    <Filter Include="docs">
+      <UniqueIdentifier>{7a1e3c9c-c984-4cf9-9c02-9a4332a7ce92}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
 </Project>
Index: docs/README.txt
===================================================================
--- docs/README.txt	(revision 85b5fecdb1b2b3249583a225657b9a52d23bc726)
+++ docs/README.txt	(revision 7865c5b0ff6fd16268522aa00c64569b2fd54092)
@@ -90,5 +90,7 @@
 
 Actually, I think now this should work, after following the online instructions for installing Vulkan:
-sudo apt-get install libglm-dev libsdl2-dev libsdl2-image-dev libsdl2-gfx-dev libsdl2-ttf-dev
+sudo apt-get install vulkan-sdk libsdl2-dev libsdl2-image-dev libsdl2-ttf-dev libglm-dev
+(Follow the instructions at https://vulkan.lunarg.com/sdk/home#linux to add the latest Vulkan SDK version to apt-get)
+(Verify that installing libvulkan-1 is not required)
 
 make vulkangame && ./vulkangame
Index: sdl-game.cpp
===================================================================
--- sdl-game.cpp	(revision 85b5fecdb1b2b3249583a225657b9a52d23bc726)
+++ sdl-game.cpp	(revision 7865c5b0ff6fd16268522aa00c64569b2fd54092)
@@ -40,21 +40,35 @@
 }
 
-VulkanGame::VulkanGame() {
-   // TODO: Double-check whether initialization should happen in the header, where the variables are declared, or here
-   // Also, decide whether to use this-> for all instance variables, or only when necessary
-
-   debugMessenger = VK_NULL_HANDLE;
-
-   gui = nullptr;
-   window = nullptr;
-
-   swapChainPresentMode = VK_PRESENT_MODE_MAX_ENUM_KHR;
-   swapChainMinImageCount = 0;
-   currentFrame = 0;
-   imageIndex = 0;
-   shouldRecreateSwapChain = false;
-
-   score = 0;
-   fps = 0.0f;
+VulkanGame::VulkanGame()
+                     : swapChainImageCount(0)
+                     , swapChainMinImageCount(0)
+                     , swapChainSurfaceFormat({})
+                     , swapChainPresentMode(VK_PRESENT_MODE_MAX_ENUM_KHR)
+                     , swapChainExtent{ 0, 0 }
+                     , swapChain(VK_NULL_HANDLE)
+                     , vulkanSurface(VK_NULL_HANDLE)
+                     , sdlVersion({ 0, 0, 0 })
+                     , instance(VK_NULL_HANDLE)
+                     , physicalDevice(VK_NULL_HANDLE)
+                     , device(VK_NULL_HANDLE)
+                     , debugMessenger(VK_NULL_HANDLE)
+                     , resourceCommandPool(VK_NULL_HANDLE)
+                     , renderPass(VK_NULL_HANDLE)
+                     , graphicsQueue(VK_NULL_HANDLE)
+                     , presentQueue(VK_NULL_HANDLE)
+                     , depthImage({})
+                     , shouldRecreateSwapChain(false)
+                     , frameCount(0)
+                     , currentFrame()
+                     , imageIndex(0)
+                     , fpsStartTime(0.0f)
+                     , curTime(0.0f)
+                     , done(false)
+                     , currentRenderScreenFn(nullptr)
+                     , descriptorPool(VK_NULL_HANDLE)
+                     , gui(nullptr)
+                     , window(nullptr)
+                     , score(0)
+                     , fps(0.0f) {
 }
 
@@ -104,5 +118,5 @@
 
    // TODO: Do this in one place and save it instead of redoing it every time I need a queue family index
-   QueueFamilyIndices indices = VulkanUtils::findQueueFamilies(physicalDevice, surface);
+   QueueFamilyIndices indices = VulkanUtils::findQueueFamilies(physicalDevice, vulkanSurface);
 
    // Setup Dear ImGui context
@@ -376,5 +390,5 @@
 
    vkDestroyDevice(device, nullptr);
-   vkDestroySurfaceKHR(instance, surface, nullptr);
+   vkDestroySurfaceKHR(instance, vulkanSurface, nullptr);
 
    if (ENABLE_VALIDATION_LAYERS) {
@@ -461,5 +475,5 @@
 
 void VulkanGame::createVulkanSurface() {
-   if (gui->createVulkanSurface(instance, &surface) == RTWO_ERROR) {
+   if (gui->createVulkanSurface(instance, &vulkanSurface) == RTWO_ERROR) {
       throw runtime_error("failed to create window surface!");
    }
@@ -507,11 +521,11 @@
    }
 
-   QueueFamilyIndices indices = VulkanUtils::findQueueFamilies(physicalDevice, surface);
+   QueueFamilyIndices indices = VulkanUtils::findQueueFamilies(physicalDevice, vulkanSurface);
    bool extensionsSupported = VulkanUtils::checkDeviceExtensionSupport(physicalDevice, deviceExtensions);
    bool swapChainAdequate = false;
 
    if (extensionsSupported) {
-      vector<VkSurfaceFormatKHR> formats = VulkanUtils::querySwapChainFormats(physicalDevice, surface);
-      vector<VkPresentModeKHR> presentModes = VulkanUtils::querySwapChainPresentModes(physicalDevice, surface);
+      vector<VkSurfaceFormatKHR> formats = VulkanUtils::querySwapChainFormats(physicalDevice, vulkanSurface);
+      vector<VkPresentModeKHR> presentModes = VulkanUtils::querySwapChainPresentModes(physicalDevice, vulkanSurface);
 
       swapChainAdequate = !formats.empty() && !presentModes.empty();
@@ -526,5 +540,5 @@
 void VulkanGame::createLogicalDevice(const vector<const char*>& validationLayers,
    const vector<const char*>& deviceExtensions) {
-   QueueFamilyIndices indices = VulkanUtils::findQueueFamilies(physicalDevice, surface);
+   QueueFamilyIndices indices = VulkanUtils::findQueueFamilies(physicalDevice, vulkanSurface);
 
    if (!indices.isComplete()) {
@@ -582,6 +596,6 @@
 
 void VulkanGame::chooseSwapChainProperties() {
-   vector<VkSurfaceFormatKHR> availableFormats = VulkanUtils::querySwapChainFormats(physicalDevice, surface);
-   vector<VkPresentModeKHR> availablePresentModes = VulkanUtils::querySwapChainPresentModes(physicalDevice, surface);
+   vector<VkSurfaceFormatKHR> availableFormats = VulkanUtils::querySwapChainFormats(physicalDevice, vulkanSurface);
+   vector<VkPresentModeKHR> availablePresentModes = VulkanUtils::querySwapChainPresentModes(physicalDevice, vulkanSurface);
 
    // Per Spec Format and View Format are expected to be the same unless VK_IMAGE_CREATE_MUTABLE_BIT was set at image creation
@@ -605,5 +619,5 @@
    cout << "[vulkan] Selected PresentMode = " << swapChainPresentMode << endl;
 
-   VkSurfaceCapabilitiesKHR capabilities = VulkanUtils::querySwapChainCapabilities(physicalDevice, surface);
+   VkSurfaceCapabilitiesKHR capabilities = VulkanUtils::querySwapChainCapabilities(physicalDevice, vulkanSurface);
 
    // If min image count was not specified, request different count of images dependent on selected present mode
@@ -632,5 +646,5 @@
 
 void VulkanGame::createSwapChain() {
-   VkSurfaceCapabilitiesKHR capabilities = VulkanUtils::querySwapChainCapabilities(physicalDevice, surface);
+   VkSurfaceCapabilitiesKHR capabilities = VulkanUtils::querySwapChainCapabilities(physicalDevice, vulkanSurface);
 
    swapChainExtent = VulkanUtils::chooseSwapExtent(capabilities, gui->getWindowWidth(), gui->getWindowHeight());
@@ -638,5 +652,5 @@
    VkSwapchainCreateInfoKHR createInfo = {};
    createInfo.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
-   createInfo.surface = surface;
+   createInfo.surface = vulkanSurface;
    createInfo.minImageCount = swapChainMinImageCount;
    createInfo.imageFormat = swapChainSurfaceFormat.format;
@@ -647,5 +661,5 @@
 
    // TODO: Maybe save this result so I don't have to recalculate it every time
-   QueueFamilyIndices indices = VulkanUtils::findQueueFamilies(physicalDevice, surface);
+   QueueFamilyIndices indices = VulkanUtils::findQueueFamilies(physicalDevice, vulkanSurface);
    uint32_t queueFamilyIndices[] = { indices.graphicsFamily.value(), indices.presentFamily.value() };
 
@@ -762,5 +776,5 @@
 
 void VulkanGame::createResourceCommandPool() {
-   QueueFamilyIndices indices = VulkanUtils::findQueueFamilies(physicalDevice, surface);
+   QueueFamilyIndices indices = VulkanUtils::findQueueFamilies(physicalDevice, vulkanSurface);
 
    VkCommandPoolCreateInfo poolInfo = {};
@@ -777,5 +791,5 @@
    commandPools.resize(swapChainImageCount);
 
-   QueueFamilyIndices indices = VulkanUtils::findQueueFamilies(physicalDevice, surface);
+   QueueFamilyIndices indices = VulkanUtils::findQueueFamilies(physicalDevice, vulkanSurface);
 
    for (size_t i = 0; i < swapChainImageCount; i++) {
Index: sdl-game.hpp
===================================================================
--- sdl-game.hpp	(revision 85b5fecdb1b2b3249583a225657b9a52d23bc726)
+++ sdl-game.hpp	(revision 7865c5b0ff6fd16268522aa00c64569b2fd54092)
@@ -66,7 +66,7 @@
 
       VkInstance instance;
-      VkDebugUtilsMessengerEXT debugMessenger = VK_NULL_HANDLE;
-      VkSurfaceKHR surface; // TODO: Change the variable name to vulkanSurface
-      VkPhysicalDevice physicalDevice = VK_NULL_HANDLE;
+      VkDebugUtilsMessengerEXT debugMessenger;
+      VkSurfaceKHR vulkanSurface;
+      VkPhysicalDevice physicalDevice;
       VkDevice device;
 
Index: vulkan-game.cpp
===================================================================
--- vulkan-game.cpp	(revision 85b5fecdb1b2b3249583a225657b9a52d23bc726)
+++ vulkan-game.cpp	(revision 7865c5b0ff6fd16268522aa00c64569b2fd54092)
@@ -50,19 +50,34 @@
 }
 
-VulkanGame::VulkanGame() {
-   // TODO: Double-check whether initialization should happen in the header, where the variables are declared, or here
-   // Also, decide whether to use this-> for all instance variables, or only when necessary
-
-   debugMessenger = VK_NULL_HANDLE;
-
-   gui = nullptr;
-   window = nullptr;
-
-   swapChainPresentMode = VK_PRESENT_MODE_MAX_ENUM_KHR;
-   swapChainMinImageCount = 0;
-   currentFrame = 0;
-   imageIndex = 0;
-   shouldRecreateSwapChain = false;
-
+VulkanGame::VulkanGame()
+                     : swapChainImageCount(0)
+                      , swapChainMinImageCount(0)
+                     , swapChainSurfaceFormat({})
+                     , swapChainPresentMode(VK_PRESENT_MODE_MAX_ENUM_KHR)
+                     , swapChainExtent{ 0, 0 }
+                     , swapChain(VK_NULL_HANDLE)
+                     , vulkanSurface(VK_NULL_HANDLE)
+                     , sdlVersion({ 0, 0, 0 })
+                     , instance(VK_NULL_HANDLE)
+                     , physicalDevice(VK_NULL_HANDLE)
+                     , device(VK_NULL_HANDLE)
+                     , debugMessenger(VK_NULL_HANDLE)
+                     , resourceCommandPool(VK_NULL_HANDLE)
+                     , renderPass(VK_NULL_HANDLE)
+                     , graphicsQueue(VK_NULL_HANDLE)
+                     , presentQueue(VK_NULL_HANDLE)
+                     , depthImage({})
+                     , shouldRecreateSwapChain(false)
+                     , frameCount(0)
+                     , currentFrame()
+                     , imageIndex(0)
+                     , fpsStartTime(0.0f)
+                     , curTime(0.0f)
+                     , done(false)
+                     , currentRenderScreenFn(nullptr)
+                     , gui(nullptr)
+                     , window(nullptr)
+                     , score(0)
+                     , fps(0.0f) {
    object_VP_mats = {};
    ship_VP_mats = {};
@@ -70,7 +85,4 @@
    laser_VP_mats = {};
    explosion_UBO = {};
-
-   score = 0;
-   fps = 0.0f;
 }
 
@@ -205,5 +217,5 @@
 
    // TODO: Maybe call this once and save the results since it's also called when creating the logical device
-   QueueFamilyIndices indices = VulkanUtils::findQueueFamilies(physicalDevice, surface);
+   QueueFamilyIndices indices = VulkanUtils::findQueueFamilies(physicalDevice, vulkanSurface);
 
    ImGui_ImplSDL2_InitForVulkan(window);
@@ -1149,5 +1161,5 @@
 
    vkDestroyDevice(device, nullptr);
-   vkDestroySurfaceKHR(instance, surface, nullptr);
+   vkDestroySurfaceKHR(instance, vulkanSurface, nullptr);
 
    if (ENABLE_VALIDATION_LAYERS) {
@@ -1244,5 +1256,5 @@
 
 void VulkanGame::createVulkanSurface() {
-   if (gui->createVulkanSurface(instance, &surface) == RTWO_ERROR) {
+   if (gui->createVulkanSurface(instance, &vulkanSurface) == RTWO_ERROR) {
       throw runtime_error("failed to create window surface!");
    }
@@ -1290,11 +1302,11 @@
    }
 
-   QueueFamilyIndices indices = VulkanUtils::findQueueFamilies(physicalDevice, surface);
+   QueueFamilyIndices indices = VulkanUtils::findQueueFamilies(physicalDevice, vulkanSurface);
    bool extensionsSupported = VulkanUtils::checkDeviceExtensionSupport(physicalDevice, deviceExtensions);
    bool swapChainAdequate = false;
 
    if (extensionsSupported) {
-      vector<VkSurfaceFormatKHR> formats = VulkanUtils::querySwapChainFormats(physicalDevice, surface);
-      vector<VkPresentModeKHR> presentModes = VulkanUtils::querySwapChainPresentModes(physicalDevice, surface);
+      vector<VkSurfaceFormatKHR> formats = VulkanUtils::querySwapChainFormats(physicalDevice, vulkanSurface);
+      vector<VkPresentModeKHR> presentModes = VulkanUtils::querySwapChainPresentModes(physicalDevice, vulkanSurface);
 
       swapChainAdequate = !formats.empty() && !presentModes.empty();
@@ -1309,5 +1321,5 @@
 void VulkanGame::createLogicalDevice(const vector<const char*>& validationLayers,
       const vector<const char*>& deviceExtensions) {
-   QueueFamilyIndices indices = VulkanUtils::findQueueFamilies(physicalDevice, surface);
+   QueueFamilyIndices indices = VulkanUtils::findQueueFamilies(physicalDevice, vulkanSurface);
 
    if (!indices.isComplete()) {
@@ -1364,6 +1376,6 @@
 
 void VulkanGame::chooseSwapChainProperties() {
-   vector<VkSurfaceFormatKHR> availableFormats = VulkanUtils::querySwapChainFormats(physicalDevice, surface);
-   vector<VkPresentModeKHR> availablePresentModes = VulkanUtils::querySwapChainPresentModes(physicalDevice, surface);
+   vector<VkSurfaceFormatKHR> availableFormats = VulkanUtils::querySwapChainFormats(physicalDevice, vulkanSurface);
+   vector<VkPresentModeKHR> availablePresentModes = VulkanUtils::querySwapChainPresentModes(physicalDevice, vulkanSurface);
 
    swapChainSurfaceFormat = VulkanUtils::chooseSwapSurfaceFormat(availableFormats,
@@ -1380,5 +1392,5 @@
    cout << "[vulkan] Selected PresentMode = " << swapChainPresentMode << endl;
 
-   VkSurfaceCapabilitiesKHR capabilities = VulkanUtils::querySwapChainCapabilities(physicalDevice, surface);
+   VkSurfaceCapabilitiesKHR capabilities = VulkanUtils::querySwapChainCapabilities(physicalDevice, vulkanSurface);
 
    if (swapChainPresentMode == VK_PRESENT_MODE_MAILBOX_KHR) {
@@ -1400,5 +1412,5 @@
 
 void VulkanGame::createSwapChain() {
-   VkSurfaceCapabilitiesKHR capabilities = VulkanUtils::querySwapChainCapabilities(physicalDevice, surface);
+   VkSurfaceCapabilitiesKHR capabilities = VulkanUtils::querySwapChainCapabilities(physicalDevice, vulkanSurface);
 
    swapChainExtent = VulkanUtils::chooseSwapExtent(capabilities, gui->getWindowWidth(), gui->getWindowHeight());
@@ -1406,5 +1418,5 @@
    VkSwapchainCreateInfoKHR createInfo = {};
    createInfo.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
-   createInfo.surface = surface;
+   createInfo.surface = vulkanSurface;
    createInfo.minImageCount = swapChainMinImageCount;
    createInfo.imageFormat = swapChainSurfaceFormat.format;
@@ -1415,5 +1427,5 @@
 
    // TODO: Maybe save this result so I don't have to recalculate it every time
-   QueueFamilyIndices indices = VulkanUtils::findQueueFamilies(physicalDevice, surface);
+   QueueFamilyIndices indices = VulkanUtils::findQueueFamilies(physicalDevice, vulkanSurface);
    uint32_t queueFamilyIndices[] = { indices.graphicsFamily.value(), indices.presentFamily.value() };
 
@@ -1525,5 +1537,5 @@
 
 void VulkanGame::createResourceCommandPool() {
-   QueueFamilyIndices indices = VulkanUtils::findQueueFamilies(physicalDevice, surface);
+   QueueFamilyIndices indices = VulkanUtils::findQueueFamilies(physicalDevice, vulkanSurface);
 
    VkCommandPoolCreateInfo poolInfo = {};
@@ -1540,5 +1552,5 @@
    commandPools.resize(swapChainImageCount);
 
-   QueueFamilyIndices indices = VulkanUtils::findQueueFamilies(physicalDevice, surface);
+   QueueFamilyIndices indices = VulkanUtils::findQueueFamilies(physicalDevice, vulkanSurface);
 
    for (size_t i = 0; i < swapChainImageCount; i++) {
Index: vulkan-game.hpp
===================================================================
--- vulkan-game.hpp	(revision 85b5fecdb1b2b3249583a225657b9a52d23bc726)
+++ vulkan-game.hpp	(revision 7865c5b0ff6fd16268522aa00c64569b2fd54092)
@@ -247,5 +247,5 @@
       VkInstance instance;
       VkDebugUtilsMessengerEXT debugMessenger;
-      VkSurfaceKHR surface; // TODO: Change the variable name to vulkanSurface
+      VkSurfaceKHR vulkanSurface;
       VkPhysicalDevice physicalDevice = VK_NULL_HANDLE;
       VkDevice device;
