2019-07-19 20:56:21 +00:00
|
|
|
#ifndef GS_PLATFORM_H
|
|
|
|
|
2019-07-22 06:30:53 +00:00
|
|
|
#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
|
2019-07-19 20:56:21 +00:00
|
|
|
struct platform_memory_result
|
|
|
|
{
|
|
|
|
u8* Base;
|
|
|
|
s32 Size;
|
|
|
|
s32 Error;
|
|
|
|
};
|
|
|
|
|
2019-07-22 06:30:53 +00:00
|
|
|
struct texture_buffer
|
|
|
|
{
|
|
|
|
u8* Memory;
|
|
|
|
s32 Width;
|
|
|
|
s32 Height;
|
|
|
|
s32 Pitch;
|
|
|
|
s32 BytesPerPixel;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct system_path
|
|
|
|
{
|
|
|
|
char* Path;
|
|
|
|
s32 PathLength;
|
|
|
|
s32 IndexOfLastSlash;
|
|
|
|
};
|
2019-07-19 20:56:21 +00:00
|
|
|
|
|
|
|
#define PLATFORM_ALLOC(name) platform_memory_result 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_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);
|
|
|
|
|
2019-07-22 06:30:53 +00:00
|
|
|
#define PLATFORM_GET_FILE_PATH(name) b32 name(char* PathBuffer, s32 BufferLength)
|
2019-07-19 20:56:21 +00:00
|
|
|
typedef PLATFORM_GET_FILE_PATH(platform_get_file_path);
|
|
|
|
|
2019-07-22 06:30:53 +00:00
|
|
|
#define PLATFORM_GET_GPU_TEXTURE_HANDLE(name) s32 name(u8* Memory, s32 Width, s32 Height)
|
2019-07-19 20:56:21 +00:00
|
|
|
typedef PLATFORM_GET_GPU_TEXTURE_HANDLE(platform_get_gpu_texture_handle);
|
|
|
|
|
2019-07-22 06:30:53 +00:00
|
|
|
typedef s32 platform_socket_handle;
|
|
|
|
typedef s32 platform_network_address_handle;
|
|
|
|
|
|
|
|
#define PLATFORM_GET_SOCKET_HANDLE(name) platform_socket_handle name(s32 AddressFamily, s32 Type, s32 Protocol)
|
2019-07-19 20:56:21 +00:00
|
|
|
typedef PLATFORM_GET_SOCKET_HANDLE(platform_get_socket_handle);
|
|
|
|
|
2019-07-22 06:30:53 +00:00
|
|
|
#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);
|
2019-07-19 20:56:21 +00:00
|
|
|
|
2019-07-22 06:30:53 +00:00
|
|
|
#define PLATFORM_SET_SOCKET_OPTION(name) s32 name(platform_socket_handle SocketHandle, s32 Level, s32 Option, const char* OptionValue, s32 OptionLength)
|
2019-07-19 20:56:21 +00:00
|
|
|
typedef PLATFORM_SET_SOCKET_OPTION(platform_set_socket_option);
|
|
|
|
|
2019-07-22 06:30:53 +00:00
|
|
|
#define PLATFORM_SEND_TO(name) s32 name(platform_socket_handle SocketHandle, platform_network_address_handle AddressHandle, const char* Buffer, s32 BufferLength, s32 Flags)
|
2019-07-19 20:56:21 +00:00
|
|
|
typedef PLATFORM_SEND_TO(platform_send_to);
|
|
|
|
|
2019-07-22 06:30:53 +00:00
|
|
|
#define PLATFORM_CLOSE_SOCKET(name) void name(platform_socket_handle SocketHandle)
|
2019-07-19 20:56:21 +00:00
|
|
|
typedef PLATFORM_CLOSE_SOCKET(platform_close_socket);
|
|
|
|
|
2019-07-22 06:30:53 +00:00
|
|
|
#ifndef GS_INPUT
|
|
|
|
#define GS_INPUT
|
2019-07-19 20:56:21 +00:00
|
|
|
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,
|
|
|
|
};
|
|
|
|
|
|
|
|
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];
|
2019-07-22 06:30:53 +00:00
|
|
|
s32 MouseX, MouseY, MouseScroll;
|
2019-07-19 20:56:21 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
struct input
|
|
|
|
{
|
|
|
|
input_frame Frames[2];
|
|
|
|
input_frame* New;
|
|
|
|
input_frame* Old;
|
2019-07-22 06:30:53 +00:00
|
|
|
s32 MouseDownX, MouseDownY;
|
2019-07-19 20:56:21 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
2019-07-28 21:31:05 +00:00
|
|
|
for (s32 Key = 0; Key < KeyCode_Count; Key++) { Input->New->KeysDown[Key] = Input->Old->KeysDown[Key]; }
|
2019-07-19 20:56:21 +00:00
|
|
|
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];
|
|
|
|
}
|
2019-07-22 06:30:53 +00:00
|
|
|
#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;
|
|
|
|
}
|
|
|
|
|
2019-07-19 20:56:21 +00:00
|
|
|
#define GS_PLATFORM_H
|
|
|
|
#endif // GS_PLATFORM_H
|