Index: IMGUI/imconfig.h
===================================================================
--- IMGUI/imconfig.h	(revision 187b0f51c66b33a3dd0fd0ca7bd655e77b75364a)
+++ IMGUI/imconfig.h	(revision 301c90acc8bb0ab81d5a848b74956cc61b6b1299)
@@ -108,2 +108,8 @@
 }
 */
+
+#include <glm/glm.hpp>
+
+#define IM_VEC2_CLASS_EXTRA                                                 \
+        ImVec2(const glm::vec2& f) { x = f.x; y = f.y; }                       \
+        operator glm::vec2() const { return glm::vec2(x,y); }
Index: VulkanGame.vcxproj
===================================================================
--- VulkanGame.vcxproj	(revision 187b0f51c66b33a3dd0fd0ca7bd655e77b75364a)
+++ VulkanGame.vcxproj	(revision 301c90acc8bb0ab81d5a848b74956cc61b6b1299)
@@ -142,4 +142,6 @@
     <ClCompile Include="FileStackWalker.cpp" />
     <ClCompile Include="game-gui-sdl.cpp" />
+    <ClCompile Include="gui\imgui\button-imgui.cpp" />
+    <ClCompile Include="gui\imgui\ui-wdget.cpp" />
     <ClCompile Include="IMGUI\imgui.cpp" />
     <ClCompile Include="IMGUI\imgui_demo.cpp" />
@@ -165,4 +167,6 @@
     <ClInclude Include="graphics-pipeline.hpp" />
     <ClInclude Include="graphics-pipeline_vulkan.hpp" />
+    <ClInclude Include="gui\imgui\button-imgui.hpp" />
+    <ClInclude Include="gui\imgui\ui-widget.hpp" />
     <ClInclude Include="IMGUI\imconfig.h" />
     <ClInclude Include="IMGUI\imgui.h" />
Index: VulkanGame.vcxproj.filters
===================================================================
--- VulkanGame.vcxproj.filters	(revision 187b0f51c66b33a3dd0fd0ca7bd655e77b75364a)
+++ VulkanGame.vcxproj.filters	(revision 301c90acc8bb0ab81d5a848b74956cc61b6b1299)
@@ -31,4 +31,10 @@
     <ClCompile Include="sdl-game.cpp">
       <Filter>IMGUI SDL Reference</Filter>
+    </ClCompile>
+    <ClCompile Include="gui\imgui\ui-wdget.cpp">
+      <Filter>gui\imgui</Filter>
+    </ClCompile>
+    <ClCompile Include="gui\imgui\button-imgui.cpp">
+      <Filter>gui\imgui</Filter>
     </ClCompile>
   </ItemGroup>
@@ -74,4 +80,10 @@
       <Filter>IMGUI SDL Reference</Filter>
     </ClInclude>
+    <ClInclude Include="gui\imgui\ui-widget.hpp">
+      <Filter>gui\imgui</Filter>
+    </ClInclude>
+    <ClInclude Include="gui\imgui\button-imgui.hpp">
+      <Filter>gui\imgui</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
@@ -102,4 +114,10 @@
       <UniqueIdentifier>{e540b46d-7c98-427d-a28d-4fc20d495826}</UniqueIdentifier>
     </Filter>
+    <Filter Include="gui">
+      <UniqueIdentifier>{79c30e01-25f8-48e6-894f-da73dea26f89}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="gui\imgui">
+      <UniqueIdentifier>{2954212f-ed3d-45c5-b46a-bbb81a16ca78}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
 </Project>
Index: compiler.hpp
===================================================================
--- compiler.hpp	(revision 187b0f51c66b33a3dd0fd0ca7bd655e77b75364a)
+++ compiler.hpp	(revision 301c90acc8bb0ab81d5a848b74956cc61b6b1299)
@@ -1,4 +1,4 @@
-#ifndef COMPILER_H
-#define COMPILER_H
+#ifndef _COMPILER_H
+#define _COMPILER_H
 
 #if defined _WIN64
@@ -16,3 +16,3 @@
 #endif
 
-#endif
+#endif // _COMPILER_H
Index: consts.hpp
===================================================================
--- consts.hpp	(revision 187b0f51c66b33a3dd0fd0ca7bd655e77b75364a)
+++ consts.hpp	(revision 301c90acc8bb0ab81d5a848b74956cc61b6b1299)
@@ -1,4 +1,6 @@
-#ifndef _RTWO_CONSTS_H
-#define _RTWO_CONSTS_H
+#ifndef _CONSTS_H
+#define _CONSTS_H
+
+// TODO: Move ScreenType somewhere else that's more UI-related
 
 #define GAME_VERSION "0.01.000"
@@ -18,3 +20,3 @@
 };
 
-#endif // _RTWO_CONSTS_H
+#endif // _CONSTS_H
Index: crash-logger.hpp
===================================================================
--- crash-logger.hpp	(revision 187b0f51c66b33a3dd0fd0ca7bd655e77b75364a)
+++ crash-logger.hpp	(revision 301c90acc8bb0ab81d5a848b74956cc61b6b1299)
@@ -1,4 +1,4 @@
-#ifndef CRASH_LOGGER_H
-#define CRASH_LOGGER_H
+#ifndef _CRASH_LOGGER_H
+#define _CRASH_LOGGER_H
 
 class CrashLogger {
@@ -8,3 +8,3 @@
 };
 
-#endif
+#endif // _CRASH_LOGGER_H
Index: game-gui-sdl.cpp
===================================================================
--- game-gui-sdl.cpp	(revision 187b0f51c66b33a3dd0fd0ca7bd655e77b75364a)
+++ game-gui-sdl.cpp	(revision 301c90acc8bb0ab81d5a848b74956cc61b6b1299)
@@ -154,7 +154,14 @@
 }
 
+// TODO: Check that this is only used where the drawable size is needed
+// Maybe create a separate refreshWindowSize funcion as well.
 void GameGui_SDL::refreshWindowSize() {
-   // TODO: Make sure this works on a mac (the analogous glfw function had issues on Mac retina displays)
-   SDL_GetWindowSize(window, &windowWidth, &windowHeight);
+   // TODO: Make sure this works on a Mac (the analogous glfw function had issues on Mac retina displays)
+
+#ifdef GAMEGUI_INCLUDE_VULKAN
+   SDL_Vulkan_GetDrawableSize(window, &windowWidth, &windowHeight);
+#else
+   SDL_GL_GetDrawableSize(window, &windowWidth, &windowHeight);
+#endif
 
    if (SDL_GetWindowFlags(window) & SDL_WINDOW_MINIMIZED) {
Index: gui/imgui/button-imgui.cpp
===================================================================
--- gui/imgui/button-imgui.cpp	(revision 301c90acc8bb0ab81d5a848b74956cc61b6b1299)
+++ gui/imgui/button-imgui.cpp	(revision 301c90acc8bb0ab81d5a848b74956cc61b6b1299)
@@ -0,0 +1,31 @@
+#include "button-imgui.hpp"
+
+#include "../IMGUI/imgui.h"
+#include "../IMGUI/imgui_internal.h" // For CalcItemSize
+
+ButtonImGui::ButtonImGui(string label) {
+   this->label = label;
+
+   calculateSize();
+}
+
+ButtonImGui::~ButtonImGui() {
+}
+
+bool ButtonImGui::draw(int offset) {
+   ImGui::InvisibleButton("", ImVec2(offset, 18));
+   ImGui::SameLine();
+
+   //ImGui::SetCursorPos(int x, int y);
+   return ImGui::Button(label.c_str());
+}
+
+void ButtonImGui::calculateSize() {
+   vec2 labelSize = ImGui::CalcTextSize(label.c_str());
+   ImGuiStyle& style = ImGui::GetStyle();
+
+   vec2 size = ImGui::CalcItemSize(vec2(0, 0), labelSize.x + style.FramePadding.x * 2.0f, labelSize.y + style.FramePadding.y * 2.0f);
+
+   width = size.x;
+   height = size.y;
+}
Index: gui/imgui/button-imgui.hpp
===================================================================
--- gui/imgui/button-imgui.hpp	(revision 301c90acc8bb0ab81d5a848b74956cc61b6b1299)
+++ gui/imgui/button-imgui.hpp	(revision 301c90acc8bb0ab81d5a848b74956cc61b6b1299)
@@ -0,0 +1,27 @@
+#ifndef _BUTTON_IMGUI_H
+#define _BUTTON_IMGUI_H
+
+#include <string>
+
+#include <glm/glm.hpp>
+
+#include "ui-widget.hpp"
+
+using namespace glm;
+using namespace std;
+
+class ButtonImGui : public UIWidget {
+   public:
+      ButtonImGui(string label);
+      virtual ~ButtonImGui();
+
+      bool draw(int offset);
+
+   protected:
+      void calculateSize();
+
+   private:
+      string label;
+};
+
+#endif // _BUTTON_IMGUI_H
Index: gui/imgui/ui-wdget.cpp
===================================================================
--- gui/imgui/ui-wdget.cpp	(revision 301c90acc8bb0ab81d5a848b74956cc61b6b1299)
+++ gui/imgui/ui-wdget.cpp	(revision 301c90acc8bb0ab81d5a848b74956cc61b6b1299)
@@ -0,0 +1,12 @@
+#include "ui-widget.hpp"
+
+UIWidget::~UIWidget() {
+}
+
+int UIWidget::getWidth() {
+   return width;
+}
+
+int UIWidget::getHeight() {
+   return height;
+}
Index: gui/imgui/ui-widget.hpp
===================================================================
--- gui/imgui/ui-widget.hpp	(revision 301c90acc8bb0ab81d5a848b74956cc61b6b1299)
+++ gui/imgui/ui-widget.hpp	(revision 301c90acc8bb0ab81d5a848b74956cc61b6b1299)
@@ -0,0 +1,23 @@
+#ifndef _WIDGET_H
+#define _WIDGET_H
+
+#include <glm/glm.hpp>
+
+using namespace glm;
+
+class UIWidget {
+   public:
+      virtual ~UIWidget();
+
+      int getWidth();
+      int getHeight();
+
+      virtual bool draw(int offset) = 0;
+
+   protected:
+      virtual void calculateSize() = 0;
+
+      int width, height;
+};
+
+#endif // _WIDGET_H
Index: main-vulkan.cpp
===================================================================
--- main-vulkan.cpp	(revision 187b0f51c66b33a3dd0fd0ca7bd655e77b75364a)
+++ main-vulkan.cpp	(revision 301c90acc8bb0ab81d5a848b74956cc61b6b1299)
@@ -24,6 +24,5 @@
 
    try {
-      game.run(800, 600, 0);
-      //game.run(800, 600, GUI_FLAGS_WINDOW_FULLSCREEN);
+      game.run(800, 600, GUI_FLAGS_WINDOW_FULLSCREEN);
    } catch (const exception& e) {
       cerr << e.what() << endl;
Index: vulkan-game.cpp
===================================================================
--- vulkan-game.cpp	(revision 187b0f51c66b33a3dd0fd0ca7bd655e77b75364a)
+++ vulkan-game.cpp	(revision 301c90acc8bb0ab81d5a848b74956cc61b6b1299)
@@ -8,8 +8,11 @@
 
 #include "IMGUI/imgui_impl_sdl.h"
+#include "IMGUI/imgui_internal.h" // For CalcItemSize
 
 #include "logger.hpp"
 
 #include "utils.hpp"
+
+#include "gui/imgui/button-imgui.hpp"
 
 using namespace std;
@@ -854,4 +857,7 @@
          }
 
+         // This was left ovedr from the previous SDL UI implementation.
+         // Might need something like this again when I start processing screen-specific UI events not related
+         // to the IMGUI ui, such as arrow keys for movement and other buttons for shotting or something
          // currentScreen->handleEvent(e);
       }
@@ -911,5 +917,5 @@
       ImGui::NewFrame();
 
-      (this->*currentRenderScreenFn)();
+      (this->*currentRenderScreenFn)(gui->getWindowWidth(), gui->getWindowHeight());
 
       ImGui::Render();
@@ -2187,12 +2193,9 @@
 }
 
-void VulkanGame::renderMainScreen() {
-   unsigned int windowWidth = 640;
-   unsigned int windowHeight = 480;
-
+void VulkanGame::renderMainScreen(int width, int height) {
    {
       int padding = 4;
-      ImGui::SetNextWindowPos(ImVec2(-padding, -padding), ImGuiCond_Once);
-      ImGui::SetNextWindowSize(ImVec2(windowWidth + 2 * padding, windowHeight + 2 * padding), ImGuiCond_Always);
+      ImGui::SetNextWindowPos(vec2(-padding, -padding), ImGuiCond_Once);
+      ImGui::SetNextWindowSize(vec2(width + 2 * padding, height + 2 * padding), ImGuiCond_Always);
       ImGui::Begin("WndMain", nullptr,
          ImGuiWindowFlags_NoTitleBar |
@@ -2200,15 +2203,15 @@
          ImGuiWindowFlags_NoMove);
 
-      ImGui::InvisibleButton("", ImVec2(10, 80));
-      ImGui::InvisibleButton("", ImVec2(285, 18));
-      ImGui::SameLine();
-      if (ImGui::Button("New Game")) {
+      ButtonImGui btn("New Game");
+
+      ImGui::InvisibleButton("", vec2(10, height / 6));
+      if (btn.draw((width - btn.getWidth()) / 2)) {
          goToScreen(&VulkanGame::renderGameScreen);
       }
 
-      ImGui::InvisibleButton("", ImVec2(10, 15));
-      ImGui::InvisibleButton("", ImVec2(300, 18));
-      ImGui::SameLine();
-      if (ImGui::Button("Quit")) {
+      ButtonImGui btn2("Quit");
+
+      ImGui::InvisibleButton("", vec2(10, 15));
+      if (btn2.draw((width - btn2.getWidth()) / 2)) {
          quitGame();
       }
@@ -2218,8 +2221,8 @@
 }
 
-void VulkanGame::renderGameScreen() {
+void VulkanGame::renderGameScreen(int width, int height) {
    {
-      ImGui::SetNextWindowSize(ImVec2(130, 65), ImGuiCond_Once);
-      ImGui::SetNextWindowPos(ImVec2(10, 50), ImGuiCond_Once);
+      ImGui::SetNextWindowSize(vec2(130, 65), ImGuiCond_Once);
+      ImGui::SetNextWindowPos(vec2(10, 50), ImGuiCond_Once);
       ImGui::Begin("WndStats", nullptr,
          ImGuiWindowFlags_NoTitleBar |
@@ -2234,11 +2237,11 @@
 
    {
-      ImGui::SetNextWindowSize(ImVec2(250, 35), ImGuiCond_Once);
-      ImGui::SetNextWindowPos(ImVec2(380, 10), ImGuiCond_Once);
+      ImGui::SetNextWindowSize(vec2(250, 35), ImGuiCond_Once);
+      ImGui::SetNextWindowPos(vec2(width - 260, 10), ImGuiCond_Always);
       ImGui::Begin("WndMenubar", nullptr,
          ImGuiWindowFlags_NoTitleBar |
          ImGuiWindowFlags_NoResize |
          ImGuiWindowFlags_NoMove);
-      ImGui::InvisibleButton("", ImVec2(155, 18));
+      ImGui::InvisibleButton("", vec2(155, 18));
       ImGui::SameLine();
       if (ImGui::Button("Main Menu")) {
@@ -2249,6 +2252,6 @@
 
    {
-      ImGui::SetNextWindowSize(ImVec2(200, 200), ImGuiCond_Once);
-      ImGui::SetNextWindowPos(ImVec2(430, 60), ImGuiCond_Once);
+      ImGui::SetNextWindowSize(vec2(200, 200), ImGuiCond_Once);
+      ImGui::SetNextWindowPos(vec2(width - 210, 60), ImGuiCond_Always);
       ImGui::Begin("WndDebug", nullptr,
          ImGuiWindowFlags_NoTitleBar |
@@ -2267,4 +2270,5 @@
 }
 
+// TODO: Probably turn this into a UI widget class
 void VulkanGame::renderGuiValueList(vector<UIValue>& values) {
    float maxWidth = 0.0f;
@@ -2304,5 +2308,5 @@
 }
 
-void VulkanGame::goToScreen(void (VulkanGame::* renderScreenFn)()) {
+void VulkanGame::goToScreen(void (VulkanGame::* renderScreenFn)(int width, int height)) {
    currentRenderScreenFn = renderScreenFn;
 
Index: vulkan-game.hpp
===================================================================
--- vulkan-game.hpp	(revision 187b0f51c66b33a3dd0fd0ca7bd655e77b75364a)
+++ vulkan-game.hpp	(revision 301c90acc8bb0ab81d5a848b74956cc61b6b1299)
@@ -243,4 +243,6 @@
       SDL_Window* window = nullptr;
 
+      int drawableWidth, drawableHeight;
+
       VkInstance instance;
       VkDebugUtilsMessengerEXT debugMessenger;
@@ -360,5 +362,6 @@
       /*** High-level vars ***/
 
-      void (VulkanGame::* currentRenderScreenFn)();
+      // TODO: Just typedef the type of this function to RenderScreenFn or something since it's used in a few places
+      void (VulkanGame::* currentRenderScreenFn)(int width, int height);
 
       map<string, vector<UIValue>> valueLists;
@@ -456,11 +459,11 @@
       /*** High-level functions ***/
 
-      void renderMainScreen();
-      void renderGameScreen();
+      void renderMainScreen(int width, int height);
+      void renderGameScreen(int width, int height);
 
       void initGuiValueLists(map<string, vector<UIValue>>& valueLists);
       void renderGuiValueList(vector<UIValue>& values);
 
-      void goToScreen(void (VulkanGame::* renderScreenFn)());
+      void goToScreen(void (VulkanGame::* renderScreenFn)(int width, int height));
       void quitGame();
 };
