Index: README.txt
===================================================================
--- README.txt	(revision 69dccfe34b6cde8a4c5753321f9d610fb25a1ee7)
+++ README.txt	(revision 5f3dba81b94a5d5b9d28c975dfa94dfa3b3529c3)
@@ -56,9 +56,14 @@
 
 Download GLM and copy the glm folder into /include
+
 Download the SDL2 pre-built Windows binaries
  - Copy the SDL2 include folder into /include and rename it SDL2
- - Add the location of the lib/x64 folder to the VS2019 project properties under Linker/General/Addition Library DIrectories
- - You can also just copy the contents of that folder to lib
- - TODO: Figure out how to do static compilation with SDL2
+ - Copy the contents of lib/x64 to lib
+
+Download the SDL_image Visual C++ development libraries from https://www.libsdl.org/projects/SDL_image/
+
+Download the SDL_ttf Visual C++ development libraries from https://www.libsdl.org/projects/SDL_ttf/
+
+TODO: Figure out how to do static compilation with SDL2
 
 Download the vulkan sdk
@@ -82,5 +87,7 @@
 Download the vulkan sdk (make sure VULKAN_SDK_PATH in the makefile points to it)
 
-brew install sdl2 (might need 'brew install sdl2 --HEAD')
+brew install sdl2
+brew install sdl2_image
+brew install sdl2_ttf
 
 make vulkangame && ./vulkangame
Index: VulkanGame.vcxproj
===================================================================
--- VulkanGame.vcxproj	(revision 69dccfe34b6cde8a4c5753321f9d610fb25a1ee7)
+++ VulkanGame.vcxproj	(revision 5f3dba81b94a5d5b9d28c975dfa94dfa3b3529c3)
@@ -86,5 +86,5 @@
       <SubSystem>Console</SubSystem>
       <AdditionalLibraryDirectories>D:\VulkanSDK\1.1.108.0\Lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
-      <AdditionalDependencies>SDL2.lib;SDL2main.lib;glfw3.lib;vulkan-1.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>SDL2.lib;SDL2main.lib;SDL2_image.lib;SDL2_ttf.lib;glfw3.lib;vulkan-1.lib;%(AdditionalDependencies)</AdditionalDependencies>
     </Link>
   </ItemDefinitionGroup>
@@ -134,5 +134,4 @@
   </ItemDefinitionGroup>
   <ItemGroup>
-    <ClCompile Include="blend-ref.cpp" />
     <ClCompile Include="game-gui-glfw.cpp" />
     <ClCompile Include="game-gui-sdl.cpp" />
Index: game-gui-sdl.cpp
===================================================================
--- game-gui-sdl.cpp	(revision 69dccfe34b6cde8a4c5753321f9d610fb25a1ee7)
+++ game-gui-sdl.cpp	(revision 5f3dba81b94a5d5b9d28c975dfa94dfa3b3529c3)
@@ -10,5 +10,19 @@
    // cout << "SDL could not initialize! SDL_Error: " << SDL_GetError() << endl;
 
-   return SDL_Init(SDL_INIT_EVERYTHING) < 0 ? RTWO_ERROR : RTWO_SUCCESS;
+   // TODO: Print out contextual error messages instead of just returning
+   if (SDL_Init(SDL_INIT_EVERYTHING) < 0) {
+      return RTWO_ERROR;
+   }
+
+   int imgFlags = IMG_INIT_PNG;
+   if (!(IMG_Init(imgFlags) & imgFlags)) {
+      return RTWO_ERROR;
+   }
+
+   if (TTF_Init() == -1) {
+      return RTWO_ERROR;
+   }
+
+   return RTWO_SUCCESS;
 }
 
Index: game-gui-sdl.hpp
===================================================================
--- game-gui-sdl.hpp	(revision 69dccfe34b6cde8a4c5753321f9d610fb25a1ee7)
+++ game-gui-sdl.hpp	(revision 5f3dba81b94a5d5b9d28c975dfa94dfa3b3529c3)
@@ -5,4 +5,6 @@
 
 #include <SDL2/SDL.h>
+#include <SDL2/SDL_image.h>
+#include <SDL2/SDL_ttf.h>
 #include <SDL2/SDL_vulkan.h>
 
Index: makefile
===================================================================
--- makefile	(revision 69dccfe34b6cde8a4c5753321f9d610fb25a1ee7)
+++ makefile	(revision 5f3dba81b94a5d5b9d28c975dfa94dfa3b3529c3)
@@ -42,5 +42,5 @@
 endif
 
-LIBS = `pkg-config --static --libs sdl2 glfw3`
+LIBS = `pkg-config --static --libs sdl2 sdl2_image sdl2_ttf glfw3`
 ifeq ($(OS),Darwin)
 	LIBS := $(VULKAN_SDK_PATH)/lib/libvulkan.dylib $(LIBS)
Index: vulkan-game.cpp
===================================================================
--- vulkan-game.cpp	(revision 69dccfe34b6cde8a4c5753321f9d610fb25a1ee7)
+++ vulkan-game.cpp	(revision 5f3dba81b94a5d5b9d28c975dfa94dfa3b3529c3)
@@ -19,5 +19,5 @@
 
 #define STB_IMAGE_IMPLEMENTATION
-#include "stb_image.h"
+#include "stb_image.h" // TODO: Probably switch to SDL_image
 
 #include <iostream>
@@ -170,7 +170,19 @@
       SDL_Window* window = nullptr;
 
+      // TODO: Come up with more descriptive names for these
+      SDL_Renderer* gRenderer = nullptr;
+      SDL_Texture* uiOverlay = nullptr;
+
+      TTF_Font* gFont = nullptr;
+      SDL_Texture* uiText = nullptr;
+      SDL_Texture* uiImage = nullptr;
+
       VkInstance instance;
       VkDebugUtilsMessengerEXT debugMessenger;
       VkSurfaceKHR surface;
+
+      // TODO: It seems that I can call all the same draw functions on an SDL_Renderer that I can
+      // on an SDL_Surface, so I should use gRenderer (probably after renaming it) instead of getting
+      // sdlSurface from the created window
       SDL_Surface* sdlSurface = nullptr;
 
@@ -230,18 +242,78 @@
       bool framebufferResized = false;
 
+      // TODO: Make make some more initi functions, or call this initUI if the
+      // amount of things initialized here keeps growing
       bool initWindow() {
+         // TODO: Put all fonts, textures, and images in the assets folder
+
          if (gui->Init() == RTWO_ERROR) {
             cout << "UI library could not be initialized!" << endl;
+            cout << SDL_GetError() << endl;
             return RTWO_ERROR;
-         } else {
-            window = (SDL_Window*) gui->CreateWindow("Vulkan Game", SCREEN_WIDTH, SCREEN_HEIGHT);
-
-            if (window == nullptr) {
-               cout << "Window could not be created!" << endl;
-               return RTWO_ERROR;
-            } else {
-               return RTWO_SUCCESS;
-            }
-         }
+         }
+         cout << "GUI init succeeded" << endl;
+
+         window = (SDL_Window*) gui->CreateWindow("Vulkan Game", SCREEN_WIDTH, SCREEN_HEIGHT);
+         if (window == nullptr) {
+            cout << "Window could not be created!" << endl;
+            return RTWO_ERROR;
+         }
+
+         // Might need SDL_RENDERER_TARGETTEXTURE to create the SDL view texture I want to show in
+         // a vulkan quad
+         gRenderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
+         if (gRenderer == nullptr) {
+            cout << "Renderer could not be created! SDL Error: " << SDL_GetError() << endl;
+            return RTWO_ERROR;
+         }
+
+         uiOverlay = SDL_CreateTexture(gRenderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, SCREEN_WIDTH, SCREEN_HEIGHT);
+         if (uiOverlay == nullptr) {
+            cout << "Unable to create blank texture! SDL Error: " << SDL_GetError() << endl;
+         }
+         if (SDL_SetTextureBlendMode(uiOverlay, SDL_BLENDMODE_BLEND) != 0) {
+            cout << "Unable to set texture blend mode! SDL Error: " << SDL_GetError() << endl;
+         }
+
+         gFont = TTF_OpenFont("fonts/lazy.ttf", 28);
+         if (gFont == nullptr) {
+            cout << "Failed to load lazy font! SDL_ttf Error: " << TTF_GetError() << endl;
+            return RTWO_ERROR;
+         }
+
+         SDL_Color textColor = { 0, 0, 0 };
+
+         SDL_Surface* textSurface = TTF_RenderText_Solid(gFont, "Great sucess!", textColor);
+         if (textSurface == nullptr) {
+            cout << "Unable to render text surface! SDL_ttf Error: " << TTF_GetError() << endl;
+            return RTWO_ERROR;
+         }
+
+         uiText = SDL_CreateTextureFromSurface(gRenderer, textSurface);
+         if (uiText == nullptr) {
+            cout << "Unable to create texture from rendered text! SDL Error: " << SDL_GetError() << endl;
+            SDL_FreeSurface(textSurface);
+            return RTWO_ERROR;
+         }
+
+         SDL_FreeSurface(textSurface);
+
+         // TODO: Load a PNG instead
+         SDL_Surface* uiImageSurface = SDL_LoadBMP("assets/images/spaceship.bmp");
+         if (uiImageSurface == nullptr) {
+            cout << "Unable to load image " << "spaceship.bmp" << "! SDL Error: " << SDL_GetError() << endl;
+            return RTWO_ERROR;
+         }
+
+         uiImage = SDL_CreateTextureFromSurface(gRenderer, uiImageSurface);
+         if (uiImage == nullptr) {
+            cout << "Unable to create texture from BMP surface! SDL Error: " << SDL_GetError() << endl;
+            SDL_FreeSurface(uiImageSurface);
+            return RTWO_ERROR;
+         }
+
+         SDL_FreeSurface(uiImageSurface);
+
+         return RTWO_SUCCESS;
       }
 
@@ -1523,8 +1595,7 @@
             }
 
-            drawFrame();
-
-            //SDL_FillRect(sdlSurface, nullptr, SDL_MapRGB(sdlSurface->format, 0x00, 0x99, 0x99));
-            //SDL_UpdateWindowSurface(window);
+            //drawFrame();
+
+            drawUI();
          }
 
@@ -1594,4 +1665,45 @@
          currentFrame = (currentFrame + 1) % MAX_FRAMES_IN_FLIGHT;
          currentFrame = (currentFrame + 1) % MAX_FRAMES_IN_FLIGHT;
+      }
+
+      /* NOTES:
+       *
+       * SDL can already render rects and lines. Rendering circles would be nice, but I can implement it myself
+       * and wouldn't use it that often anyway
+       */
+      void drawUI() {
+         SDL_SetRenderTarget(gRenderer, nullptr);
+
+         SDL_SetRenderDrawColor(gRenderer, 0x00, 0x9F, 0x9F, 0xFF);
+			SDL_RenderClear(gRenderer);
+
+         SDL_SetRenderTarget(gRenderer, uiOverlay);
+
+         SDL_SetRenderDrawColor(gRenderer, 0x00, 0x00, 0x00, 0x00);
+         SDL_RenderClear(gRenderer);
+
+         SDL_Rect rect;
+
+         rect = {280, 220, 100, 100};
+         SDL_SetRenderDrawColor(gRenderer, 0xFF, 0x00, 0x00, 0xFF);
+         SDL_RenderFillRect(gRenderer, &rect);
+         SDL_SetRenderDrawColor(gRenderer, 0x00, 0x9F, 0x9F, 0xFF);
+
+         rect = {10, 10, 0, 0};
+         SDL_QueryTexture(uiText, nullptr, nullptr, &(rect.w), &(rect.h));
+         SDL_RenderCopy(gRenderer, uiText, nullptr, &rect);
+
+         rect = {10, 80, 0, 0};
+         SDL_QueryTexture(uiImage, nullptr, nullptr, &(rect.w), &(rect.h));
+         SDL_RenderCopy(gRenderer, uiImage, nullptr, &rect);
+
+         SDL_SetRenderDrawColor(gRenderer, 0xFF, 0x00, 0x00, 0xFF);
+         SDL_RenderDrawLine(gRenderer, 50, 5, 150, 500);
+
+         SDL_SetRenderTarget(gRenderer, nullptr);
+
+         SDL_RenderCopy(gRenderer, uiOverlay, nullptr, nullptr);
+
+         SDL_RenderPresent(gRenderer);
       }
 
@@ -1679,4 +1791,28 @@
          vkDestroyInstance(instance, nullptr);
 
+         // TODO: Check if any of these functions accept null parameters
+         // If they do, I don't need to check for that
+
+         if (uiOverlay != nullptr) {
+            SDL_DestroyTexture(uiOverlay);
+            uiOverlay = nullptr;
+         }
+
+         TTF_CloseFont(gFont);
+	      gFont = nullptr;
+
+         if (uiText != nullptr) {
+            SDL_DestroyTexture(uiText);
+		      uiText = nullptr;
+         }
+
+         if (uiImage != nullptr) {
+            SDL_DestroyTexture(uiImage);
+            uiImage = nullptr;
+         }
+
+         SDL_DestroyRenderer(gRenderer);
+         gRenderer = nullptr;
+
          gui->DestroyWindow();
          gui->Shutdown();
