From d3467a2fd2ce5b7a73c34ec0cd24f7a7de0396e8 Mon Sep 17 00:00:00 2001
From: Peter Slattery <slattery.peter.j@gmail.com>
Date: Wed, 5 Feb 2020 20:33:12 -0800
Subject: [PATCH] Consolidated platform code into one file.

---
 gs_libs/gs_input.h      | 253 +++++++++++++++++++++++++
 gs_libs/gs_platform.h   | 407 ----------------------------------------
 gs_libs/gs_win32.h      |   9 -
 meta/gs_meta.cpp        |   2 +-
 src/foldhaus_app.cpp    |   2 +-
 src/foldhaus_platform.h | 111 ++++++++++-
 src/win32_foldhaus.cpp  |   6 +-
 7 files changed, 364 insertions(+), 426 deletions(-)
 delete mode 100644 gs_libs/gs_platform.h

diff --git a/gs_libs/gs_input.h b/gs_libs/gs_input.h
index f30d06c..5b60de5 100644
--- a/gs_libs/gs_input.h
+++ b/gs_libs/gs_input.h
@@ -4,6 +4,219 @@
 // Creation Date: 2020-01-01
 //
 #ifndef GS_INPUT_H
+enum key_code
+{
+    KeyCode_Invalid,
+    
+    KeyCode_Esc,
+    
+    KeyCode_Space,
+    KeyCode_Tab,
+    KeyCode_CapsLock,
+    KeyCode_LeftShift, KeyCode_RightShift,
+    KeyCode_LeftCtrl, KeyCode_RightCtrl,
+    KeyCode_Fn, 
+    KeyCode_Alt, 
+    KeyCode_PageUp, KeyCode_PageDown,
+    KeyCode_Backspace, KeyCode_Delete,
+    KeyCode_Enter,
+    
+    // Function Keys
+    KeyCode_F0, KeyCode_F1, KeyCode_F2, KeyCode_F3, KeyCode_F4, KeyCode_F5, KeyCode_F6, KeyCode_F7,
+    KeyCode_F8, KeyCode_F9, KeyCode_F10, KeyCode_F11, KeyCode_F12, 
+    
+    // Letters
+    KeyCode_a, KeyCode_b, KeyCode_c, KeyCode_d, KeyCode_e, KeyCode_f, KeyCode_g, KeyCode_h,
+    KeyCode_i, KeyCode_j, KeyCode_k, KeyCode_l, KeyCode_m, KeyCode_n, KeyCode_o, KeyCode_p, 
+    KeyCode_q, KeyCode_r, KeyCode_s, KeyCode_t, KeyCode_u, KeyCode_v, KeyCode_w, KeyCode_x, 
+    KeyCode_y, KeyCode_z,
+    
+    KeyCode_A, KeyCode_B, KeyCode_C, KeyCode_D, KeyCode_E, KeyCode_F, KeyCode_G, KeyCode_H,
+    KeyCode_I, KeyCode_J, KeyCode_K, KeyCode_L, KeyCode_M, KeyCode_N, KeyCode_O, KeyCode_P, 
+    KeyCode_Q, KeyCode_R, KeyCode_S, KeyCode_T, KeyCode_U, KeyCode_V, KeyCode_W, KeyCode_X, 
+    KeyCode_Y, KeyCode_Z,
+    
+    // Numbers
+    KeyCode_0, KeyCode_1, KeyCode_2, KeyCode_3, KeyCode_4, KeyCode_5, KeyCode_6, KeyCode_7,
+    KeyCode_8, KeyCode_9,
+    
+    KeyCode_Num0, KeyCode_Num1, KeyCode_Num2, KeyCode_Num3, KeyCode_Num4, KeyCode_Num5, 
+    KeyCode_Num6, KeyCode_Num7, KeyCode_Num8, KeyCode_Num9,
+    
+    // Symbols
+    KeyCode_Bang, KeyCode_At, KeyCode_Pound, KeyCode_Dollar, KeyCode_Percent, KeyCode_Carrot,
+    KeyCode_Ampersand, KeyCode_Star, KeyCode_LeftParen, KeyCode_RightParen, KeyCode_Minus, KeyCode_Plus,
+    KeyCode_Equals, KeyCode_Underscore, KeyCode_LeftBrace, KeyCode_RightBrace, KeyCode_LeftBracket,
+    KeyCode_RightBracket, KeyCode_Colon, KeyCode_SemiColon, KeyCode_SingleQuote, KeyCode_DoubleQuote,
+    KeyCode_ForwardSlash, KeyCode_Backslash, KeyCode_Pipe, KeyCode_Comma, KeyCode_Period, 
+    KeyCode_QuestionMark, KeyCode_LessThan, KeyCode_GreaterThan, KeyCode_Tilde, KeyCode_BackQuote,
+    
+    // Arrows
+    KeyCode_UpArrow,
+    KeyCode_DownArrow,
+    KeyCode_LeftArrow,
+    KeyCode_RightArrow,
+    
+    // Mouse
+    // NOTE(Peter): Including this here so we can utilize the same KeyDown, KeyUp etc. functions
+    KeyCode_MouseLeftButton,
+    KeyCode_MouseMiddleButton,
+    KeyCode_MouseRightButton,
+    
+    KeyCode_Count,
+};
+
+internal char
+CharacterFromKeyCode (key_code Code)
+{
+    char Result = 0;
+    
+    switch (Code)
+    {
+        case KeyCode_Space: { Result = ' '; }break;
+        case KeyCode_Tab: { Result = '\t'; }break;
+        
+        // Letters
+        case KeyCode_a: { Result = 'a'; }break; 
+        case KeyCode_b: { Result = 'b'; }break; 
+        case KeyCode_c: { Result = 'c'; }break; 
+        case KeyCode_d: { Result = 'd'; }break;
+        case KeyCode_e: { Result = 'e'; }break;
+		case KeyCode_f: { Result = 'f'; }break;
+		case KeyCode_g: { Result = 'g'; }break;
+		case KeyCode_h: { Result = 'h'; }break;
+        case KeyCode_i: { Result = 'i'; }break;
+		case KeyCode_j: { Result = 'j'; }break;
+		case KeyCode_k: { Result = 'k'; }break;
+		case KeyCode_l: { Result = 'l'; }break;
+		case KeyCode_m: { Result = 'm'; }break;
+		case KeyCode_n: { Result = 'n'; }break;
+		case KeyCode_o: { Result = 'o'; }break;
+		case KeyCode_p: { Result = 'p'; }break; 
+        case KeyCode_q: { Result = 'q'; }break;
+		case KeyCode_r: { Result = 'r'; }break;
+		case KeyCode_s: { Result = 's'; }break;
+		case KeyCode_t: { Result = 't'; }break;
+		case KeyCode_u: { Result = 'u'; }break;
+		case KeyCode_v: { Result = 'v'; }break;
+		case KeyCode_w: { Result = 'w'; }break;
+		case KeyCode_x: { Result = 'x'; }break; 
+        case KeyCode_y: { Result = 'y'; }break;
+		case KeyCode_z: { Result = 'z'; }break;
+        
+        case KeyCode_A: { Result = 'A'; }break;
+		case KeyCode_B: { Result = 'B'; }break;
+		case KeyCode_C: { Result = 'C'; }break;
+		case KeyCode_D: { Result = 'D'; }break;
+		case KeyCode_E: { Result = 'E'; }break;
+		case KeyCode_F: { Result = 'F'; }break;
+		case KeyCode_G: { Result = 'G'; }break;
+		case KeyCode_H: { Result = 'H'; }break;
+        case KeyCode_I: { Result = 'I'; }break;
+		case KeyCode_J: { Result = 'J'; }break;
+		case KeyCode_K: { Result = 'K'; }break;
+		case KeyCode_L: { Result = 'L'; }break;
+		case KeyCode_M: { Result = 'M'; }break;
+		case KeyCode_N: { Result = 'N'; }break;
+		case KeyCode_O: { Result = 'O'; }break;
+		case KeyCode_P: { Result = 'P'; }break; 
+        case KeyCode_Q: { Result = 'Q'; }break;
+		case KeyCode_R: { Result = 'R'; }break;
+		case KeyCode_S: { Result = 'S'; }break;
+		case KeyCode_T: { Result = 'T'; }break;
+		case KeyCode_U: { Result = 'U'; }break;
+		case KeyCode_V: { Result = 'V'; }break;
+		case KeyCode_W: { Result = 'W'; }break;
+		case KeyCode_X: { Result = 'X'; }break; 
+        case KeyCode_Y: { Result = 'Y'; }break;
+		case KeyCode_Z: { Result = 'Z'; }break;
+        
+        // Numbers
+        case KeyCode_0: { Result = '0'; }break;
+		case KeyCode_1: { Result = '1'; }break;
+		case KeyCode_2: { Result = '2'; }break;
+		case KeyCode_3: { Result = '3'; }break;
+		case KeyCode_4: { Result = '4'; }break;
+		case KeyCode_5: { Result = '5'; }break;
+		case KeyCode_6: { Result = '6'; }break;
+		case KeyCode_7: { Result = '7'; }break;
+        case KeyCode_8: { Result = '8'; }break;
+		case KeyCode_9: { Result = '9'; }break;
+        
+        case KeyCode_Num0: { Result = '0'; }break;
+		case KeyCode_Num1: { Result = '1'; }break;
+		case KeyCode_Num2: { Result = '2'; }break;
+		case KeyCode_Num3: { Result = '3'; }break;
+		case KeyCode_Num4: { Result = '4'; }break;
+		case KeyCode_Num5: { Result = '5'; }break; 
+        case KeyCode_Num6: { Result = '6'; }break;
+		case KeyCode_Num7: { Result = '7'; }break;
+		case KeyCode_Num8: { Result = '8'; }break;
+		case KeyCode_Num9: { Result = '9'; }break;
+        
+        // Symbols
+        case KeyCode_Bang: { Result = '!'; }break;
+		case KeyCode_At: { Result = '@'; }break;
+		case KeyCode_Pound: { Result = '#'; }break;
+		case KeyCode_Dollar: { Result = '$'; }break;
+		case KeyCode_Percent: { Result = '%'; }break;
+		case KeyCode_Carrot: { Result = '^'; }break;
+        case KeyCode_Ampersand: { Result = '&'; }break;
+		case KeyCode_Star: { Result = '*'; }break;
+		case KeyCode_LeftParen: { Result = '('; }break;
+		case KeyCode_RightParen: { Result = ')'; }break;
+		case KeyCode_Minus: { Result = '-'; }break;
+		case KeyCode_Plus: { Result = '+'; }break;
+        case KeyCode_Equals: { Result = '='; }break;
+		case KeyCode_Underscore: { Result = '_'; }break;
+		case KeyCode_LeftBrace: { Result = '['; }break;
+		case KeyCode_RightBrace: { Result = ']'; }break;
+		case KeyCode_LeftBracket: { Result = '{'; }break;
+        case KeyCode_RightBracket: { Result = '}'; }break;
+		case KeyCode_Colon: { Result = ':'; }break;
+		case KeyCode_SemiColon: { Result = ';'; }break;
+		case KeyCode_SingleQuote: { Result = '\''; }break;
+		case KeyCode_DoubleQuote: { Result = '"'; }break;
+        case KeyCode_ForwardSlash: { Result = '/'; }break;
+		case KeyCode_Backslash: { Result = '\\'; }break;
+		case KeyCode_Pipe: { Result = '|'; }break;
+		case KeyCode_Comma: { Result = ','; }break;
+		case KeyCode_Period: { Result = '.'; }break; 
+        case KeyCode_QuestionMark: { Result = '?'; }break;
+		case KeyCode_LessThan: { Result = '<'; }break;
+		case KeyCode_GreaterThan: { Result = '>'; }break;
+		case KeyCode_Tilde: { Result = '~'; }break;
+		case KeyCode_BackQuote: { Result = '`'; }break;
+    }
+    
+    Assert(Result != 0);
+    return Result;
+}
+
+enum modifier_flags
+{
+    Modifier_Shift = 1 << 0,
+    Modifier_Ctrl = 1 << 1,
+    Modifier_Alt = 1 << 2,
+    Modifier_Sys = 1 << 3, // NOTE(Peter): this is the windows key
+};
+
+#define INPUT_FRAME_STRING_LENGTH 32
+struct input_frame
+{
+    b32 KeysDown[(int)KeyCode_Count];
+    s32 StringInputUsed;
+    char StringInput[INPUT_FRAME_STRING_LENGTH];
+    s32 MouseX, MouseY, MouseScroll;
+};
+
+struct input
+{
+    input_frame Frames[2];
+    input_frame* New;
+    input_frame* Old;
+    s32 MouseDownX, MouseDownY;
+};
 
 enum key_state_flags
 {
@@ -59,6 +272,46 @@ ResetInputQueue (input_queue* Queue)
     Queue->QueueUsed = 0;
 }
 
+internal void InitializeInput (input* Input);
+internal void SwapInputBuffers (input* Input);
+
+internal void
+InitializeInput (input* Input)
+{
+    *(Input) = {};
+    Input->New = &Input->Frames[0];
+    Input->Old = &Input->Frames[1];
+}
+
+internal void
+SwapInputBuffers (input* Input)
+{
+    input_frame* NowOld = Input->New;
+    Input->New = Input->Old;
+    Input->Old = NowOld;
+    
+    for (s32 Key = 0; Key < KeyCode_Count; Key++) { Input->New->KeysDown[Key] = Input->Old->KeysDown[Key]; }
+    Input->New->StringInputUsed = 0;
+}
+
+internal b32
+KeyDown (input Input, key_code Key)
+{
+    return Input.New->KeysDown[Key];
+}
+
+internal b32
+KeyTransitionedDown (input Input, key_code Key)
+{
+    return Input.New->KeysDown[Key] && !Input.Old->KeysDown[Key];
+}
+
+internal b32
+KeyTransitionedUp (input Input, key_code Key)
+{
+    return !Input.New->KeysDown[Key] && Input.Old->KeysDown[Key];
+}
+
 internal void
 AddInputEventEntry (input_queue* Queue, key_code Key, 
                     b32 WasDown, b32 IsDown, b32 ShiftDown, b32 AltDown, b32 CtrlDown, b32 SysDown)
diff --git a/gs_libs/gs_platform.h b/gs_libs/gs_platform.h
deleted file mode 100644
index 19e0162..0000000
--- a/gs_libs/gs_platform.h
+++ /dev/null
@@ -1,407 +0,0 @@
-//
-// File: gs_platform.h
-// Author: Peter Slattery
-// Creation Date: 2020-01-01
-//
-#ifndef GS_PLATFORM_H
-
-#ifndef GS_PLATFORM_H
-
-#ifndef GS_LANGUAGE_H
-// Types
-typedef signed char    b8;
-typedef short int      b16;
-typedef int            b32;
-typedef long long int  b64;
-
-typedef unsigned char          u8;
-typedef unsigned short int     u16;
-typedef unsigned int           u32;
-typedef unsigned long long int u64;
-
-typedef signed char   s8;
-typedef short int     s16;
-typedef int           s32;
-typedef long long int s64;
-
-typedef float  r32;
-typedef double r64;
-
-#define internal static
-#define local_persist static
-#define global_variable static
-
-#ifdef DEBUG
-#define Assert(condition) if(!(condition)) { *((int *)0) = 5; }
-#define InvalidCodePath Assert(0)
-#define InvalidDefaultCase default: { InvalidCodePath; }
-#endif
-
-#endif
-
-#ifdef PLATFORM_WINDOWS
-#include "gs_win32.h"
-#endif
-
-struct window_info
-{
-    char* Name;
-    s32 Width;
-    s32 Height;
-};
-
-typedef struct window window;
-
-#define PLATFORM_MEMORY_NO_ERROR 0
-enum platform_memory_error
-{
-    PlatformMemory_NoError,
-    PlatformMemory_FileNotFound,
-    
-    PlatformMemory_UnknownError, // You should implement handling this when you see it
-};
-
-struct platform_memory_result
-{
-    u8* Base;
-    s32 Size;
-    platform_memory_error Error;
-};
-
-struct texture_buffer
-{
-    u8* Memory;
-    s32 Width;
-    s32 Height;
-    s32 Pitch;
-    s32 BytesPerPixel;
-};
-
-struct system_path
-{
-    char* Path;
-    s32 PathLength;
-    s32 IndexOfLastSlash;
-};
-
-#define PLATFORM_ALLOC(name) u8* name(s32 Size)
-typedef PLATFORM_ALLOC(platform_alloc);
-
-#define PLATFORM_FREE(name) b32 name(u8* Base, s32 Size)
-typedef PLATFORM_FREE(platform_free);
-
-#define PLATFORM_REALLOC(name) u8* name(u8* Base, u32 OldSize, u32 NewSize)
-typedef PLATFORM_REALLOC(platform_realloc);
-
-#define PLATFORM_READ_ENTIRE_FILE(name) platform_memory_result name(char* Path)
-typedef PLATFORM_READ_ENTIRE_FILE(platform_read_entire_file);
-
-#define PLATFORM_WRITE_ENTIRE_FILE(name) b32 name(char* Path, u8* Contents, s32 Size)
-typedef PLATFORM_WRITE_ENTIRE_FILE(platform_write_entire_file);
-
-#define PLATFORM_GET_FILE_PATH(name) b32 name(char* PathBuffer, s32 BufferLength, const char* FilterStrings)
-typedef PLATFORM_GET_FILE_PATH(platform_get_file_path);
-
-#define PLATFORM_GET_GPU_TEXTURE_HANDLE(name) s32 name(u8* Memory, s32 Width, s32 Height)
-typedef PLATFORM_GET_GPU_TEXTURE_HANDLE(platform_get_gpu_texture_handle);
-
-struct platform_network_address
-{
-    s32 Family;
-    u16 Port;
-    u32 Address;
-};
-
-typedef s32 platform_socket_handle;
-typedef s32 platform_network_address_handle;
-
-#define PLATFORM_GET_SOCKET_HANDLE(name) platform_socket_handle name(s32 Multicast_TimeToLive) 
-typedef PLATFORM_GET_SOCKET_HANDLE(platform_get_socket_handle);
-
-#define PLATFORM_GET_SEND_ADDRESS_HANDLE(name) platform_network_address_handle name(s32 AddressFamily, u16 Port, u32 Address)
-typedef PLATFORM_GET_SEND_ADDRESS_HANDLE(platform_get_send_address);
-
-#define PLATFORM_SET_SOCKET_OPTION(name) s32 name(platform_socket_handle SocketHandle, s32 Level, s32 Option, const char* OptionValue, s32 OptionLength) 
-typedef PLATFORM_SET_SOCKET_OPTION(platform_set_socket_option);
-
-#define PLATFORM_SEND_TO(name) s32 name(platform_socket_handle SocketHandle, u32 Address, u32 Port, const char* Buffer, s32 BufferLength, s32 Flags)
-typedef PLATFORM_SEND_TO(platform_send_to);
-
-#define PLATFORM_CLOSE_SOCKET(name) void name(platform_socket_handle SocketHandle)
-typedef PLATFORM_CLOSE_SOCKET(platform_close_socket);
-
-#ifndef GS_INPUT
-#define GS_INPUT
-enum key_code
-{
-    KeyCode_Invalid,
-    
-    KeyCode_Esc,
-    
-    KeyCode_Space,
-    KeyCode_Tab,
-    KeyCode_CapsLock,
-    KeyCode_LeftShift, KeyCode_RightShift,
-    KeyCode_LeftCtrl, KeyCode_RightCtrl,
-    KeyCode_Fn, 
-    KeyCode_Alt, 
-    KeyCode_PageUp, KeyCode_PageDown,
-    KeyCode_Backspace, KeyCode_Delete,
-    KeyCode_Enter,
-    
-    // Function Keys
-    KeyCode_F0, KeyCode_F1, KeyCode_F2, KeyCode_F3, KeyCode_F4, KeyCode_F5, KeyCode_F6, KeyCode_F7,
-    KeyCode_F8, KeyCode_F9, KeyCode_F10, KeyCode_F11, KeyCode_F12, 
-    
-    // Letters
-    KeyCode_a, KeyCode_b, KeyCode_c, KeyCode_d, KeyCode_e, KeyCode_f, KeyCode_g, KeyCode_h,
-    KeyCode_i, KeyCode_j, KeyCode_k, KeyCode_l, KeyCode_m, KeyCode_n, KeyCode_o, KeyCode_p, 
-    KeyCode_q, KeyCode_r, KeyCode_s, KeyCode_t, KeyCode_u, KeyCode_v, KeyCode_w, KeyCode_x, 
-    KeyCode_y, KeyCode_z,
-    
-    KeyCode_A, KeyCode_B, KeyCode_C, KeyCode_D, KeyCode_E, KeyCode_F, KeyCode_G, KeyCode_H,
-    KeyCode_I, KeyCode_J, KeyCode_K, KeyCode_L, KeyCode_M, KeyCode_N, KeyCode_O, KeyCode_P, 
-    KeyCode_Q, KeyCode_R, KeyCode_S, KeyCode_T, KeyCode_U, KeyCode_V, KeyCode_W, KeyCode_X, 
-    KeyCode_Y, KeyCode_Z,
-    
-    // Numbers
-    KeyCode_0, KeyCode_1, KeyCode_2, KeyCode_3, KeyCode_4, KeyCode_5, KeyCode_6, KeyCode_7,
-    KeyCode_8, KeyCode_9,
-    
-    KeyCode_Num0, KeyCode_Num1, KeyCode_Num2, KeyCode_Num3, KeyCode_Num4, KeyCode_Num5, 
-    KeyCode_Num6, KeyCode_Num7, KeyCode_Num8, KeyCode_Num9,
-    
-    // Symbols
-    KeyCode_Bang, KeyCode_At, KeyCode_Pound, KeyCode_Dollar, KeyCode_Percent, KeyCode_Carrot,
-    KeyCode_Ampersand, KeyCode_Star, KeyCode_LeftParen, KeyCode_RightParen, KeyCode_Minus, KeyCode_Plus,
-    KeyCode_Equals, KeyCode_Underscore, KeyCode_LeftBrace, KeyCode_RightBrace, KeyCode_LeftBracket,
-    KeyCode_RightBracket, KeyCode_Colon, KeyCode_SemiColon, KeyCode_SingleQuote, KeyCode_DoubleQuote,
-    KeyCode_ForwardSlash, KeyCode_Backslash, KeyCode_Pipe, KeyCode_Comma, KeyCode_Period, 
-    KeyCode_QuestionMark, KeyCode_LessThan, KeyCode_GreaterThan, KeyCode_Tilde, KeyCode_BackQuote,
-    
-    // Arrows
-    KeyCode_UpArrow,
-    KeyCode_DownArrow,
-    KeyCode_LeftArrow,
-    KeyCode_RightArrow,
-    
-    // Mouse
-    // NOTE(Peter): Including this here so we can utilize the same KeyDown, KeyUp etc. functions
-    KeyCode_MouseLeftButton,
-    KeyCode_MouseMiddleButton,
-    KeyCode_MouseRightButton,
-    
-    KeyCode_Count,
-};
-
-internal char
-CharacterFromKeyCode (key_code Code)
-{
-    char Result = 0;
-    
-    switch (Code)
-    {
-        case KeyCode_Space: { Result = ' '; }break;
-        case KeyCode_Tab: { Result = '\t'; }break;
-        
-        // Letters
-        case KeyCode_a: { Result = 'a'; }break; 
-        case KeyCode_b: { Result = 'b'; }break; 
-        case KeyCode_c: { Result = 'c'; }break; 
-        case KeyCode_d: { Result = 'd'; }break;
-        case KeyCode_e: { Result = 'e'; }break;
-		case KeyCode_f: { Result = 'f'; }break;
-		case KeyCode_g: { Result = 'g'; }break;
-		case KeyCode_h: { Result = 'h'; }break;
-        case KeyCode_i: { Result = 'i'; }break;
-		case KeyCode_j: { Result = 'j'; }break;
-		case KeyCode_k: { Result = 'k'; }break;
-		case KeyCode_l: { Result = 'l'; }break;
-		case KeyCode_m: { Result = 'm'; }break;
-		case KeyCode_n: { Result = 'n'; }break;
-		case KeyCode_o: { Result = 'o'; }break;
-		case KeyCode_p: { Result = 'p'; }break; 
-        case KeyCode_q: { Result = 'q'; }break;
-		case KeyCode_r: { Result = 'r'; }break;
-		case KeyCode_s: { Result = 's'; }break;
-		case KeyCode_t: { Result = 't'; }break;
-		case KeyCode_u: { Result = 'u'; }break;
-		case KeyCode_v: { Result = 'v'; }break;
-		case KeyCode_w: { Result = 'w'; }break;
-		case KeyCode_x: { Result = 'x'; }break; 
-        case KeyCode_y: { Result = 'y'; }break;
-		case KeyCode_z: { Result = 'z'; }break;
-        
-        case KeyCode_A: { Result = 'A'; }break;
-		case KeyCode_B: { Result = 'B'; }break;
-		case KeyCode_C: { Result = 'C'; }break;
-		case KeyCode_D: { Result = 'D'; }break;
-		case KeyCode_E: { Result = 'E'; }break;
-		case KeyCode_F: { Result = 'F'; }break;
-		case KeyCode_G: { Result = 'G'; }break;
-		case KeyCode_H: { Result = 'H'; }break;
-        case KeyCode_I: { Result = 'I'; }break;
-		case KeyCode_J: { Result = 'J'; }break;
-		case KeyCode_K: { Result = 'K'; }break;
-		case KeyCode_L: { Result = 'L'; }break;
-		case KeyCode_M: { Result = 'M'; }break;
-		case KeyCode_N: { Result = 'N'; }break;
-		case KeyCode_O: { Result = 'O'; }break;
-		case KeyCode_P: { Result = 'P'; }break; 
-        case KeyCode_Q: { Result = 'Q'; }break;
-		case KeyCode_R: { Result = 'R'; }break;
-		case KeyCode_S: { Result = 'S'; }break;
-		case KeyCode_T: { Result = 'T'; }break;
-		case KeyCode_U: { Result = 'U'; }break;
-		case KeyCode_V: { Result = 'V'; }break;
-		case KeyCode_W: { Result = 'W'; }break;
-		case KeyCode_X: { Result = 'X'; }break; 
-        case KeyCode_Y: { Result = 'Y'; }break;
-		case KeyCode_Z: { Result = 'Z'; }break;
-        
-        // Numbers
-        case KeyCode_0: { Result = '0'; }break;
-		case KeyCode_1: { Result = '1'; }break;
-		case KeyCode_2: { Result = '2'; }break;
-		case KeyCode_3: { Result = '3'; }break;
-		case KeyCode_4: { Result = '4'; }break;
-		case KeyCode_5: { Result = '5'; }break;
-		case KeyCode_6: { Result = '6'; }break;
-		case KeyCode_7: { Result = '7'; }break;
-        case KeyCode_8: { Result = '8'; }break;
-		case KeyCode_9: { Result = '9'; }break;
-        
-        case KeyCode_Num0: { Result = '0'; }break;
-		case KeyCode_Num1: { Result = '1'; }break;
-		case KeyCode_Num2: { Result = '2'; }break;
-		case KeyCode_Num3: { Result = '3'; }break;
-		case KeyCode_Num4: { Result = '4'; }break;
-		case KeyCode_Num5: { Result = '5'; }break; 
-        case KeyCode_Num6: { Result = '6'; }break;
-		case KeyCode_Num7: { Result = '7'; }break;
-		case KeyCode_Num8: { Result = '8'; }break;
-		case KeyCode_Num9: { Result = '9'; }break;
-        
-        // Symbols
-        case KeyCode_Bang: { Result = '!'; }break;
-		case KeyCode_At: { Result = '@'; }break;
-		case KeyCode_Pound: { Result = '#'; }break;
-		case KeyCode_Dollar: { Result = '$'; }break;
-		case KeyCode_Percent: { Result = '%'; }break;
-		case KeyCode_Carrot: { Result = '^'; }break;
-        case KeyCode_Ampersand: { Result = '&'; }break;
-		case KeyCode_Star: { Result = '*'; }break;
-		case KeyCode_LeftParen: { Result = '('; }break;
-		case KeyCode_RightParen: { Result = ')'; }break;
-		case KeyCode_Minus: { Result = '-'; }break;
-		case KeyCode_Plus: { Result = '+'; }break;
-        case KeyCode_Equals: { Result = '='; }break;
-		case KeyCode_Underscore: { Result = '_'; }break;
-		case KeyCode_LeftBrace: { Result = '['; }break;
-		case KeyCode_RightBrace: { Result = ']'; }break;
-		case KeyCode_LeftBracket: { Result = '{'; }break;
-        case KeyCode_RightBracket: { Result = '}'; }break;
-		case KeyCode_Colon: { Result = ':'; }break;
-		case KeyCode_SemiColon: { Result = ';'; }break;
-		case KeyCode_SingleQuote: { Result = '\''; }break;
-		case KeyCode_DoubleQuote: { Result = '"'; }break;
-        case KeyCode_ForwardSlash: { Result = '/'; }break;
-		case KeyCode_Backslash: { Result = '\\'; }break;
-		case KeyCode_Pipe: { Result = '|'; }break;
-		case KeyCode_Comma: { Result = ','; }break;
-		case KeyCode_Period: { Result = '.'; }break; 
-        case KeyCode_QuestionMark: { Result = '?'; }break;
-		case KeyCode_LessThan: { Result = '<'; }break;
-		case KeyCode_GreaterThan: { Result = '>'; }break;
-		case KeyCode_Tilde: { Result = '~'; }break;
-		case KeyCode_BackQuote: { Result = '`'; }break;
-    }
-    
-    Assert(Result != 0);
-    return Result;
-}
-
-enum modifier_flags
-{
-    Modifier_Shift = 1 << 0,
-    Modifier_Ctrl = 1 << 1,
-    Modifier_Alt = 1 << 2,
-    Modifier_Sys = 1 << 3, // NOTE(Peter): this is the windows key
-};
-
-#define INPUT_FRAME_STRING_LENGTH 32
-struct input_frame
-{
-    b32 KeysDown[(int)KeyCode_Count];
-    s32 StringInputUsed;
-    char StringInput[INPUT_FRAME_STRING_LENGTH];
-    s32 MouseX, MouseY, MouseScroll;
-};
-
-struct input
-{
-    input_frame Frames[2];
-    input_frame* New;
-    input_frame* Old;
-    s32 MouseDownX, MouseDownY;
-};
-
-internal void InitializeInput (input* Input);
-internal void SwapInputBuffers (input* Input);
-
-internal void
-InitializeInput (input* Input)
-{
-    *(Input) = {};
-    Input->New = &Input->Frames[0];
-    Input->Old = &Input->Frames[1];
-}
-
-internal void
-SwapInputBuffers (input* Input)
-{
-    input_frame* NowOld = Input->New;
-    Input->New = Input->Old;
-    Input->Old = NowOld;
-    
-    for (s32 Key = 0; Key < KeyCode_Count; Key++) { Input->New->KeysDown[Key] = Input->Old->KeysDown[Key]; }
-    Input->New->StringInputUsed = 0;
-}
-
-internal b32
-KeyDown (input Input, key_code Key)
-{
-    return Input.New->KeysDown[Key];
-}
-
-internal b32
-KeyTransitionedDown (input Input, key_code Key)
-{
-    return Input.New->KeysDown[Key] && !Input.Old->KeysDown[Key];
-}
-
-internal b32
-KeyTransitionedUp (input Input, key_code Key)
-{
-    return !Input.New->KeysDown[Key] && Input.Old->KeysDown[Key];
-}
-
-#endif // GS_INPUT
-
-internal window PlatformCreateWindow (char* Name, s32 Width, s32 Height);
-
-
-// Time
-
-internal r32
-GetSecondsElapsed (s64 Start, s64 End, s64 PerformanceCountFrequency)
-{
-    r32 Result = ((r32)(End - Start) / (r32) PerformanceCountFrequency);
-    return Result;
-}
-
-#define GS_PLATFORM_H
-#endif // GS_PLATFORM_H
-
-#define GS_PLATFORM_H
-#endif // GS_PLATFORM_H
\ No newline at end of file
diff --git a/gs_libs/gs_win32.h b/gs_libs/gs_win32.h
index d23d0cc..4a0a24b 100644
--- a/gs_libs/gs_win32.h
+++ b/gs_libs/gs_win32.h
@@ -7,15 +7,6 @@
 
 #ifndef GS_WIN32_H
 
-struct platform_font_info
-{
-    s32 PixelHeight;
-    s32 Ascent, Descent, Leading;
-    s32 MaxCharWidth;
-    s32 CodepointStart;
-    s32 CodepointOnePastLast;
-};
-
 #define GS_WIN32_H
 #endif // GS_WIN32_H
 
diff --git a/meta/gs_meta.cpp b/meta/gs_meta.cpp
index b4a4e41..88d8bf9 100644
--- a/meta/gs_meta.cpp
+++ b/meta/gs_meta.cpp
@@ -22,7 +22,7 @@
 
 #include "..\gs_libs\gs_language.h"
 #include "..\gs_libs\gs_bucket.h"
-#include "..\gs_libs\gs_platform.h"
+
 #include "..\gs_libs\gs_memory_arena.h"
 #include "..\gs_libs\gs_string.h"
 
diff --git a/src/foldhaus_app.cpp b/src/foldhaus_app.cpp
index 48b8977..b7afdc7 100644
--- a/src/foldhaus_app.cpp
+++ b/src/foldhaus_app.cpp
@@ -180,7 +180,7 @@ INITIALIZE_APPLICATION(InitializeApplication)
     
     GlobalDebugServices->Interface.RenderSculpture = true;
     
-    ReloadStaticData(Context, GlobalDebugServices, Alloc, Free);
+    ReloadStaticData(Context, GlobalDebugServices);
     
     // Setup Operation Modes
     State->Modes.ActiveModesCount = 0;
diff --git a/src/foldhaus_platform.h b/src/foldhaus_platform.h
index decf64d..eea087e 100644
--- a/src/foldhaus_platform.h
+++ b/src/foldhaus_platform.h
@@ -9,7 +9,6 @@
 
 #define GS_LANGUAGE_NO_PROFILER_DEFINES
 #include "..\gs_libs\gs_language.h"
-#include "..\gs_libs\gs_platform.h"
 
 #include "..\gs_libs\gs_radix_sort.h"
 #include "..\gs_libs\gs_list.h"
@@ -30,16 +29,15 @@ global_variable debug_services* GlobalDebugServices;
 
 typedef struct context context;
 
-
 // Application Functions
 
-#define INITIALIZE_APPLICATION(name) void name(context Context, platform_alloc* Alloc, platform_free* Free)
+#define INITIALIZE_APPLICATION(name) void name(context Context)
 typedef INITIALIZE_APPLICATION(initialize_application);
 
 #define UPDATE_AND_RENDER(name) void name(context Context, input_queue InputQueue, mouse_state Mouse, render_command_buffer* RenderBuffer)
 typedef UPDATE_AND_RENDER(update_and_render);
 
-#define RELOAD_STATIC_DATA(name) void name(context Context, debug_services* DebugServices, platform_alloc* Alloc, platform_free* Free)
+#define RELOAD_STATIC_DATA(name) void name(context Context, debug_services* DebugServices)
 typedef RELOAD_STATIC_DATA(reload_static_data);
 
 #define CLEANUP_APPLICATION(name) void name(context Context)
@@ -47,6 +45,93 @@ typedef CLEANUP_APPLICATION(cleanup_application);
 
 // Platform Functions
 
+struct window_info
+{
+    char* Name;
+    s32 Width;
+    s32 Height;
+};
+
+typedef struct window window;
+
+#define PLATFORM_MEMORY_NO_ERROR 0
+enum platform_memory_error
+{
+    PlatformMemory_NoError,
+    PlatformMemory_FileNotFound,
+    
+    PlatformMemory_UnknownError, // You should implement handling this when you see it
+};
+
+struct platform_memory_result
+{
+    u8* Base;
+    s32 Size;
+    platform_memory_error Error;
+};
+
+struct texture_buffer
+{
+    u8* Memory;
+    s32 Width;
+    s32 Height;
+    s32 Pitch;
+    s32 BytesPerPixel;
+};
+
+struct system_path
+{
+    char* Path;
+    s32 PathLength;
+    s32 IndexOfLastSlash;
+};
+
+#define PLATFORM_ALLOC(name) u8* name(s32 Size)
+typedef PLATFORM_ALLOC(platform_alloc);
+
+#define PLATFORM_FREE(name) b32 name(u8* Base, s32 Size)
+typedef PLATFORM_FREE(platform_free);
+
+#define PLATFORM_REALLOC(name) u8* name(u8* Base, u32 OldSize, u32 NewSize)
+typedef PLATFORM_REALLOC(platform_realloc);
+
+#define PLATFORM_READ_ENTIRE_FILE(name) platform_memory_result name(char* Path)
+typedef PLATFORM_READ_ENTIRE_FILE(platform_read_entire_file);
+
+#define PLATFORM_WRITE_ENTIRE_FILE(name) b32 name(char* Path, u8* Contents, s32 Size)
+typedef PLATFORM_WRITE_ENTIRE_FILE(platform_write_entire_file);
+
+#define PLATFORM_GET_FILE_PATH(name) b32 name(char* PathBuffer, s32 BufferLength, const char* FilterStrings)
+typedef PLATFORM_GET_FILE_PATH(platform_get_file_path);
+
+#define PLATFORM_GET_GPU_TEXTURE_HANDLE(name) s32 name(u8* Memory, s32 Width, s32 Height)
+typedef PLATFORM_GET_GPU_TEXTURE_HANDLE(platform_get_gpu_texture_handle);
+
+struct platform_network_address
+{
+    s32 Family;
+    u16 Port;
+    u32 Address;
+};
+
+typedef s32 platform_socket_handle;
+typedef s32 platform_network_address_handle;
+
+#define PLATFORM_GET_SOCKET_HANDLE(name) platform_socket_handle name(s32 Multicast_TimeToLive) 
+typedef PLATFORM_GET_SOCKET_HANDLE(platform_get_socket_handle);
+
+#define PLATFORM_GET_SEND_ADDRESS_HANDLE(name) platform_network_address_handle name(s32 AddressFamily, u16 Port, u32 Address)
+typedef PLATFORM_GET_SEND_ADDRESS_HANDLE(platform_get_send_address);
+
+#define PLATFORM_SET_SOCKET_OPTION(name) s32 name(platform_socket_handle SocketHandle, s32 Level, s32 Option, const char* OptionValue, s32 OptionLength) 
+typedef PLATFORM_SET_SOCKET_OPTION(platform_set_socket_option);
+
+#define PLATFORM_SEND_TO(name) s32 name(platform_socket_handle SocketHandle, u32 Address, u32 Port, const char* Buffer, s32 BufferLength, s32 Flags)
+typedef PLATFORM_SEND_TO(platform_send_to);
+
+#define PLATFORM_CLOSE_SOCKET(name) void name(platform_socket_handle SocketHandle)
+typedef PLATFORM_CLOSE_SOCKET(platform_close_socket);
+
 // File IO
 
 // TODO(Peter): 
@@ -57,7 +142,14 @@ struct directory_listing
 };
 
 // Font
-typedef struct platform_font_info platform_font_info;
+struct platform_font_info
+{
+    s32 PixelHeight;
+    s32 Ascent, Descent, Leading;
+    s32 MaxCharWidth;
+    s32 CodepointStart;
+    s32 CodepointOnePastLast;
+};
 
 enum font_weight
 {
@@ -132,6 +224,15 @@ RESET_WORK_QUEUE(ResetWorkQueue)
     Queue->JobsCompleted = 0;
 }
 
+// Time
+
+internal r32
+GetSecondsElapsed (s64 Start, s64 End, s64 PerformanceCountFrequency)
+{
+    r32 Result = ((r32)(End - Start) / (r32) PerformanceCountFrequency);
+    return Result;
+}
+
 struct context
 {
     u8* MemoryBase;
diff --git a/src/win32_foldhaus.cpp b/src/win32_foldhaus.cpp
index 08f9360..58e385e 100644
--- a/src/win32_foldhaus.cpp
+++ b/src/win32_foldhaus.cpp
@@ -637,7 +637,7 @@ WinMain (
     if (HotLoadDLL(&DLLRefresh))
     {
         SetApplicationLinks(&Context, DLLRefresh, &WorkQueue);
-        Context.ReloadStaticData(Context, GlobalDebugServices, Win32Alloc, Win32Free);
+        Context.ReloadStaticData(Context, GlobalDebugServices);
     }
     else
     {
@@ -652,7 +652,7 @@ WinMain (
     u8* RenderMemory = Win32Alloc(RenderMemorySize);
     render_command_buffer RenderBuffer = AllocateRenderCommandBuffer(RenderMemory, RenderMemorySize, Win32Realloc);
     
-    Context.InitializeApplication(Context, Win32Alloc, Win32Free);
+    Context.InitializeApplication(Context);
     
     Running = true;
     Context.WindowIsVisible = true;
@@ -668,7 +668,7 @@ WinMain (
         if (HotLoadDLL(&DLLRefresh))
         {
             SetApplicationLinks(&Context, DLLRefresh, &WorkQueue);
-            Context.ReloadStaticData(Context, GlobalDebugServices, Win32Alloc, Win32Free);
+            Context.ReloadStaticData(Context, GlobalDebugServices);
         }
         
         { // Mouse Position