some events and a console
This commit is contained in:
parent
e09bc15d70
commit
531c86a899
@ -103,6 +103,141 @@ union U128
|
||||
#define Million(n) ((n)*1000000)
|
||||
#define Billion(n) ((n)*1000000000)
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
//~
|
||||
|
||||
global const U32 bitmask1 = 0x00000001;
|
||||
global const U32 bitmask2 = 0x00000003;
|
||||
global const U32 bitmask3 = 0x00000007;
|
||||
global const U32 bitmask4 = 0x0000000f;
|
||||
global const U32 bitmask5 = 0x0000001f;
|
||||
global const U32 bitmask6 = 0x0000003f;
|
||||
global const U32 bitmask7 = 0x0000007f;
|
||||
global const U32 bitmask8 = 0x000000ff;
|
||||
global const U32 bitmask9 = 0x000001ff;
|
||||
global const U32 bitmask10 = 0x000003ff;
|
||||
global const U32 bitmask11 = 0x000007ff;
|
||||
global const U32 bitmask12 = 0x00000fff;
|
||||
global const U32 bitmask13 = 0x00001fff;
|
||||
global const U32 bitmask14 = 0x00003fff;
|
||||
global const U32 bitmask15 = 0x00007fff;
|
||||
global const U32 bitmask16 = 0x0000ffff;
|
||||
global const U32 bitmask17 = 0x0001ffff;
|
||||
global const U32 bitmask18 = 0x0003ffff;
|
||||
global const U32 bitmask19 = 0x0007ffff;
|
||||
global const U32 bitmask20 = 0x000fffff;
|
||||
global const U32 bitmask21 = 0x001fffff;
|
||||
global const U32 bitmask22 = 0x003fffff;
|
||||
global const U32 bitmask23 = 0x007fffff;
|
||||
global const U32 bitmask24 = 0x00ffffff;
|
||||
global const U32 bitmask25 = 0x01ffffff;
|
||||
global const U32 bitmask26 = 0x03ffffff;
|
||||
global const U32 bitmask27 = 0x07ffffff;
|
||||
global const U32 bitmask28 = 0x0fffffff;
|
||||
global const U32 bitmask29 = 0x1fffffff;
|
||||
global const U32 bitmask30 = 0x3fffffff;
|
||||
global const U32 bitmask31 = 0x7fffffff;
|
||||
global const U32 bitmask32 = 0xffffffff;
|
||||
|
||||
global const U64 bitmask33 = 0x00000001ffffffffull;
|
||||
global const U64 bitmask34 = 0x00000003ffffffffull;
|
||||
global const U64 bitmask35 = 0x00000007ffffffffull;
|
||||
global const U64 bitmask36 = 0x0000000fffffffffull;
|
||||
global const U64 bitmask37 = 0x0000001fffffffffull;
|
||||
global const U64 bitmask38 = 0x0000003fffffffffull;
|
||||
global const U64 bitmask39 = 0x0000007fffffffffull;
|
||||
global const U64 bitmask40 = 0x000000ffffffffffull;
|
||||
global const U64 bitmask41 = 0x000001ffffffffffull;
|
||||
global const U64 bitmask42 = 0x000003ffffffffffull;
|
||||
global const U64 bitmask43 = 0x000007ffffffffffull;
|
||||
global const U64 bitmask44 = 0x00000fffffffffffull;
|
||||
global const U64 bitmask45 = 0x00001fffffffffffull;
|
||||
global const U64 bitmask46 = 0x00003fffffffffffull;
|
||||
global const U64 bitmask47 = 0x00007fffffffffffull;
|
||||
global const U64 bitmask48 = 0x0000ffffffffffffull;
|
||||
global const U64 bitmask49 = 0x0001ffffffffffffull;
|
||||
global const U64 bitmask50 = 0x0003ffffffffffffull;
|
||||
global const U64 bitmask51 = 0x0007ffffffffffffull;
|
||||
global const U64 bitmask52 = 0x000fffffffffffffull;
|
||||
global const U64 bitmask53 = 0x001fffffffffffffull;
|
||||
global const U64 bitmask54 = 0x003fffffffffffffull;
|
||||
global const U64 bitmask55 = 0x007fffffffffffffull;
|
||||
global const U64 bitmask56 = 0x00ffffffffffffffull;
|
||||
global const U64 bitmask57 = 0x01ffffffffffffffull;
|
||||
global const U64 bitmask58 = 0x03ffffffffffffffull;
|
||||
global const U64 bitmask59 = 0x07ffffffffffffffull;
|
||||
global const U64 bitmask60 = 0x0fffffffffffffffull;
|
||||
global const U64 bitmask61 = 0x1fffffffffffffffull;
|
||||
global const U64 bitmask62 = 0x3fffffffffffffffull;
|
||||
global const U64 bitmask63 = 0x7fffffffffffffffull;
|
||||
global const U64 bitmask64 = 0xffffffffffffffffull;
|
||||
|
||||
global const U32 bit1 = (1<<0);
|
||||
global const U32 bit2 = (1<<1);
|
||||
global const U32 bit3 = (1<<2);
|
||||
global const U32 bit4 = (1<<3);
|
||||
global const U32 bit5 = (1<<4);
|
||||
global const U32 bit6 = (1<<5);
|
||||
global const U32 bit7 = (1<<6);
|
||||
global const U32 bit8 = (1<<7);
|
||||
global const U32 bit9 = (1<<8);
|
||||
global const U32 bit10 = (1<<9);
|
||||
global const U32 bit11 = (1<<10);
|
||||
global const U32 bit12 = (1<<11);
|
||||
global const U32 bit13 = (1<<12);
|
||||
global const U32 bit14 = (1<<13);
|
||||
global const U32 bit15 = (1<<14);
|
||||
global const U32 bit16 = (1<<15);
|
||||
global const U32 bit17 = (1<<16);
|
||||
global const U32 bit18 = (1<<17);
|
||||
global const U32 bit19 = (1<<18);
|
||||
global const U32 bit20 = (1<<19);
|
||||
global const U32 bit21 = (1<<20);
|
||||
global const U32 bit22 = (1<<21);
|
||||
global const U32 bit23 = (1<<22);
|
||||
global const U32 bit24 = (1<<23);
|
||||
global const U32 bit25 = (1<<24);
|
||||
global const U32 bit26 = (1<<25);
|
||||
global const U32 bit27 = (1<<26);
|
||||
global const U32 bit28 = (1<<27);
|
||||
global const U32 bit29 = (1<<28);
|
||||
global const U32 bit30 = (1<<29);
|
||||
global const U32 bit31 = (1<<30);
|
||||
global const U32 bit32 = (1<<31);
|
||||
|
||||
global const U64 bit33 = (1ull<<32);
|
||||
global const U64 bit34 = (1ull<<33);
|
||||
global const U64 bit35 = (1ull<<34);
|
||||
global const U64 bit36 = (1ull<<35);
|
||||
global const U64 bit37 = (1ull<<36);
|
||||
global const U64 bit38 = (1ull<<37);
|
||||
global const U64 bit39 = (1ull<<38);
|
||||
global const U64 bit40 = (1ull<<39);
|
||||
global const U64 bit41 = (1ull<<40);
|
||||
global const U64 bit42 = (1ull<<41);
|
||||
global const U64 bit43 = (1ull<<42);
|
||||
global const U64 bit44 = (1ull<<43);
|
||||
global const U64 bit45 = (1ull<<44);
|
||||
global const U64 bit46 = (1ull<<45);
|
||||
global const U64 bit47 = (1ull<<46);
|
||||
global const U64 bit48 = (1ull<<47);
|
||||
global const U64 bit49 = (1ull<<48);
|
||||
global const U64 bit50 = (1ull<<49);
|
||||
global const U64 bit51 = (1ull<<50);
|
||||
global const U64 bit52 = (1ull<<51);
|
||||
global const U64 bit53 = (1ull<<52);
|
||||
global const U64 bit54 = (1ull<<53);
|
||||
global const U64 bit55 = (1ull<<54);
|
||||
global const U64 bit56 = (1ull<<55);
|
||||
global const U64 bit57 = (1ull<<56);
|
||||
global const U64 bit58 = (1ull<<57);
|
||||
global const U64 bit59 = (1ull<<58);
|
||||
global const U64 bit60 = (1ull<<59);
|
||||
global const U64 bit61 = (1ull<<60);
|
||||
global const U64 bit62 = (1ull<<61);
|
||||
global const U64 bit63 = (1ull<<62);
|
||||
global const U64 bit64 = (1ull<<63);
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
//~ Helper macros
|
||||
#define ArrayCount(a) (sizeof(a) / sizeof((a)[0]))
|
||||
@ -113,7 +248,7 @@ union U128
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
//~
|
||||
#define LOG OS_W32_log_debug
|
||||
#define LOG os_w32_log_debug
|
||||
|
||||
#endif /* BASE_CORE_H */
|
||||
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
//~
|
||||
#include "base_core.h"
|
||||
#include "base_arena.h"
|
||||
// #include "base_math.h"
|
||||
#include "base_math.h"
|
||||
// #include "base_entry_point.h"
|
||||
|
||||
#endif /* BASE_INC_H */
|
||||
18
src/base/base_math.h
Normal file
18
src/base/base_math.h
Normal file
@ -0,0 +1,18 @@
|
||||
#ifndef BASE_MATH_H
|
||||
#define BASE_MATH_H
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
//~
|
||||
|
||||
typedef union Vec3F32
|
||||
{
|
||||
struct
|
||||
{
|
||||
F32 x;
|
||||
F32 y;
|
||||
};
|
||||
}
|
||||
Vec3F32;
|
||||
|
||||
|
||||
#endif /* BASE_MATH_H */
|
||||
@ -34,6 +34,7 @@ entry_point()
|
||||
|
||||
// Init systems
|
||||
Arena *arena = arena_alloc();
|
||||
os_console_init();
|
||||
os_event_init();
|
||||
r_init();
|
||||
//test_arena(arena);
|
||||
@ -60,16 +61,16 @@ entry_point()
|
||||
OS_Event *event = &os_events.list[i];
|
||||
if(event->kind != OS_EventKind_Null)
|
||||
{
|
||||
LOG("%s ", os_key_display_string[event->key]);
|
||||
os_console_log_fmt("%s ", os_key_display_string[event->key]);
|
||||
if(event->kind == OS_EventKind_Release)
|
||||
{
|
||||
LOG(" RELEASE");
|
||||
os_console_log(" RELEASE");
|
||||
}
|
||||
if(event->kind == OS_EventKind_Press)
|
||||
{
|
||||
LOG(" PRESS");
|
||||
os_console_log(" PRESS");
|
||||
}
|
||||
LOG("\n");
|
||||
os_console_log("\n");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -31,6 +31,8 @@ struct OS_Event
|
||||
OS_Handle window;
|
||||
OS_EventKind kind;
|
||||
OS_Key key;
|
||||
Vec3F32 pos;
|
||||
B32 is_repeat;
|
||||
};
|
||||
|
||||
|
||||
@ -53,6 +55,12 @@ internal B32 os_commit(void *ptr, U64 size);
|
||||
internal void os_decommit(void *ptr, U64 size);
|
||||
internal void os_release(void *ptr, U64 size);
|
||||
|
||||
|
||||
internal void os_console_init();
|
||||
internal void os_console_log(const char *msg);
|
||||
internal void os_console_log_fmt(const char *msg, ...);
|
||||
internal void os_clear_console();
|
||||
|
||||
internal U64 os_events_idx();
|
||||
internal void os_event_init();
|
||||
internal U64 os_events_received_on_frame();
|
||||
|
||||
@ -5,7 +5,8 @@
|
||||
#pragma comment(lib, "user32.lib")
|
||||
#pragma comment(lib, "gdi32.lib")
|
||||
|
||||
|
||||
global U32 os_console_line_count;
|
||||
#define MAX_CONSOLE_LINES 64
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
//~
|
||||
|
||||
@ -38,10 +39,106 @@ os_release(void *ptr, U64 size)
|
||||
}
|
||||
|
||||
|
||||
internal void
|
||||
os_console_init()
|
||||
{
|
||||
os_console_line_count = 0;
|
||||
BOOL initd;
|
||||
if(!AllocConsole())
|
||||
{
|
||||
initd = FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
FILE *dummy;
|
||||
freopen_s(&dummy, "CONOUT$", "w", stdout);
|
||||
initd = TRUE;
|
||||
}
|
||||
|
||||
if(!initd)
|
||||
{
|
||||
LOG("Failed to allocate console!");
|
||||
Trap();
|
||||
}
|
||||
}
|
||||
|
||||
internal void
|
||||
os_console_log(const char *msg)
|
||||
{
|
||||
os_w32_console_clear_current_line();
|
||||
printf(msg);
|
||||
os_console_line_count += 1;
|
||||
if(os_console_line_count > MAX_CONSOLE_LINES)
|
||||
{
|
||||
os_w32_reset_console_to_top();
|
||||
os_console_line_count = 0;
|
||||
}
|
||||
}
|
||||
|
||||
internal void
|
||||
os_console_log_fmt(const char *fmt_string, ...)
|
||||
{
|
||||
os_w32_console_clear_current_line();
|
||||
char buffer[256];
|
||||
va_list args;
|
||||
va_start(args, fmt_string);
|
||||
_vsnprintf(buffer, sizeof(buffer) / sizeof(char), fmt_string, args);
|
||||
va_end(args);
|
||||
|
||||
printf(buffer);
|
||||
os_console_line_count += 1;
|
||||
if(os_console_line_count > MAX_CONSOLE_LINES)
|
||||
{
|
||||
os_w32_reset_console_to_top();
|
||||
os_console_line_count = 0;
|
||||
}
|
||||
}
|
||||
|
||||
internal void
|
||||
os_clear_console()
|
||||
{
|
||||
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
|
||||
CONSOLE_SCREEN_BUFFER_INFO csbi;
|
||||
DWORD written;
|
||||
COORD topLeft = {0, 0};
|
||||
|
||||
// Get the console buffer info
|
||||
GetConsoleScreenBufferInfo(hConsole, &csbi);
|
||||
DWORD bufferSize = csbi.dwSize.X * csbi.dwSize.Y;
|
||||
|
||||
// Fill the console with spaces to clear it
|
||||
FillConsoleOutputCharacter(hConsole, ' ', bufferSize, topLeft, &written);
|
||||
FillConsoleOutputAttribute(hConsole, csbi.wAttributes, bufferSize, topLeft, &written);
|
||||
|
||||
// Move the cursor to the top-left
|
||||
SetConsoleCursorPosition(hConsole, topLeft);
|
||||
}
|
||||
|
||||
internal void
|
||||
os_w32_reset_console_to_top()
|
||||
{
|
||||
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
|
||||
COORD topLeft = {0, 0};
|
||||
SetConsoleCursorPosition(hConsole, topLeft);
|
||||
}
|
||||
|
||||
internal void
|
||||
os_w32_console_clear_current_line()
|
||||
{
|
||||
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
|
||||
CONSOLE_SCREEN_BUFFER_INFO csbi;
|
||||
GetConsoleScreenBufferInfo(hConsole, &csbi);
|
||||
DWORD written;
|
||||
COORD cursorPos = csbi.dwCursorPosition;
|
||||
DWORD lineLength = csbi.dwSize.X - cursorPos.X; // Remaining width of the line
|
||||
FillConsoleOutputCharacter(hConsole, ' ', lineLength, cursorPos, &written);
|
||||
FillConsoleOutputAttribute(hConsole, csbi.wAttributes, lineLength, cursorPos, &written);
|
||||
SetConsoleCursorPosition(hConsole, cursorPos); // Restore cursor positio
|
||||
}
|
||||
|
||||
|
||||
internal void
|
||||
OS_W32_log_debug(const char *fmt_string, ...)
|
||||
os_w32_log_debug(const char *fmt_string, ...)
|
||||
{
|
||||
char buffer[1024];
|
||||
va_list args;
|
||||
@ -50,3 +147,5 @@ OS_W32_log_debug(const char *fmt_string, ...)
|
||||
va_end(args);
|
||||
OutputDebugStringA(buffer);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -7,6 +7,9 @@
|
||||
#define NOMINMAX
|
||||
#include <windows.h>
|
||||
|
||||
internal void OS_W32_log_debug(const char *fmt_string, ...);
|
||||
|
||||
internal void os_w32_console_clear_current_line();
|
||||
internal void os_w32_reset_console_to_top();
|
||||
internal void os_w32_log_debug(const char *fmt_string, ...);
|
||||
|
||||
#endif /* OS_CORE_WIN32_H */
|
||||
@ -51,6 +51,10 @@ os_event_reset()
|
||||
{
|
||||
os_events_free_idx = 0;
|
||||
os_events_reached_max = 0;
|
||||
for (U32 i = 0; i < OS_MAX_EVENTS; i += 1)
|
||||
{
|
||||
os_events.list[i].kind = OS_EventKind_Null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -79,15 +83,10 @@ DisplayWndProc(HWND Window, UINT Message, WPARAM WParam, LPARAM LParam)
|
||||
case WM_QUIT:
|
||||
case WM_DESTROY:
|
||||
case WM_CLOSE:
|
||||
{
|
||||
g_do_exit = 1;
|
||||
} break;
|
||||
// NOTE(casey): Anything you want the application to handle, forward to the main thread
|
||||
// here.
|
||||
case WM_MOUSEMOVE:
|
||||
{
|
||||
|
||||
g_do_exit = 1;
|
||||
} break;
|
||||
|
||||
case WM_LBUTTONUP:
|
||||
case WM_RBUTTONUP:
|
||||
case WM_MBUTTONUP:
|
||||
@ -114,7 +113,44 @@ DisplayWndProc(HWND Window, UINT Message, WPARAM WParam, LPARAM LParam)
|
||||
event->key = OS_Key_MiddleMouseButton;
|
||||
} break;
|
||||
}
|
||||
event->pos.x = (F32)(S16)LOWORD(LParam);
|
||||
event->pos.y = (F32)(S16)HIWORD(LParam);
|
||||
} break;
|
||||
|
||||
case WM_MOUSEMOVE:
|
||||
{
|
||||
OS_Event *event = os_event_push(OS_EventKind_MouseMove, window);
|
||||
event->pos.x = (F32)(S16)LOWORD(LParam);
|
||||
event->pos.y = (F32)(S16)HIWORD(LParam);
|
||||
} break;
|
||||
|
||||
case WM_SYSKEYDOWN: case WM_SYSKEYUP:
|
||||
{
|
||||
if(WParam != VK_MENU && (WParam < VK_F1 || VK_F24 < WParam || WParam == VK_F4))
|
||||
{
|
||||
result = DefWindowProcW(Window, Message, WParam, LParam);
|
||||
}
|
||||
} // Fallthrough
|
||||
case WM_KEYDOWN: case WM_KEYUP:
|
||||
{
|
||||
B32 was_down = (LParam & bit31);
|
||||
B32 is_down = !(LParam & bit32);
|
||||
|
||||
B32 is_repeat = 0;
|
||||
if(!is_down)
|
||||
{
|
||||
release = 1;
|
||||
}
|
||||
else if(was_down)
|
||||
{
|
||||
is_repeat = 1;
|
||||
}
|
||||
|
||||
OS_Event *event = os_event_push(release ? OS_EventKind_Release : OS_EventKind_Press, window);
|
||||
event->key = os_win32_os_key_from_vkey(WParam);
|
||||
event->is_repeat = is_repeat;
|
||||
} break;
|
||||
|
||||
default:
|
||||
{
|
||||
result = DefWindowProcW(Window, Message, WParam, LParam);
|
||||
@ -123,6 +159,49 @@ DisplayWndProc(HWND Window, UINT Message, WPARAM WParam, LPARAM LParam)
|
||||
return result;
|
||||
}
|
||||
|
||||
internal OS_Key
|
||||
os_win32_os_key_from_vkey(WPARAM vkey)
|
||||
{
|
||||
local_persist B32 first = 1;
|
||||
local_persist OS_Key key_table[256];
|
||||
if (first)
|
||||
{
|
||||
first = 0;
|
||||
MemoryZeroArray(key_table);
|
||||
|
||||
key_table[(unsigned int)'A'] = OS_Key_A;
|
||||
key_table[(unsigned int)'B'] = OS_Key_B;
|
||||
key_table[(unsigned int)'C'] = OS_Key_C;
|
||||
key_table[(unsigned int)'D'] = OS_Key_D;
|
||||
key_table[(unsigned int)'E'] = OS_Key_E;
|
||||
key_table[(unsigned int)'F'] = OS_Key_F;
|
||||
key_table[(unsigned int)'G'] = OS_Key_G;
|
||||
key_table[(unsigned int)'H'] = OS_Key_H;
|
||||
key_table[(unsigned int)'I'] = OS_Key_I;
|
||||
key_table[(unsigned int)'J'] = OS_Key_J;
|
||||
key_table[(unsigned int)'K'] = OS_Key_K;
|
||||
key_table[(unsigned int)'L'] = OS_Key_L;
|
||||
key_table[(unsigned int)'M'] = OS_Key_M;
|
||||
key_table[(unsigned int)'N'] = OS_Key_N;
|
||||
key_table[(unsigned int)'O'] = OS_Key_O;
|
||||
key_table[(unsigned int)'P'] = OS_Key_P;
|
||||
key_table[(unsigned int)'Q'] = OS_Key_Q;
|
||||
key_table[(unsigned int)'R'] = OS_Key_R;
|
||||
key_table[(unsigned int)'S'] = OS_Key_S;
|
||||
key_table[(unsigned int)'T'] = OS_Key_T;
|
||||
key_table[(unsigned int)'U'] = OS_Key_U;
|
||||
key_table[(unsigned int)'V'] = OS_Key_V;
|
||||
key_table[(unsigned int)'W'] = OS_Key_W;
|
||||
key_table[(unsigned int)'X'] = OS_Key_X;
|
||||
key_table[(unsigned int)'Y'] = OS_Key_Y;
|
||||
key_table[(unsigned int)'Z'] = OS_Key_Z;
|
||||
}
|
||||
|
||||
OS_Key key = key_table[vkey & bitmask8];
|
||||
|
||||
return key;
|
||||
}
|
||||
|
||||
internal DWORD WINAPI
|
||||
MainThreadEntryPoint()
|
||||
{
|
||||
|
||||
@ -23,5 +23,5 @@ struct OS_W32_WndParam
|
||||
LPVOID lpParam;
|
||||
};
|
||||
|
||||
|
||||
internal OS_Key os_win32_os_key_from_vkey(WPARAM vkey);
|
||||
#endif /* OS_GFX_WIN32_H */
|
||||
Loading…
Reference in New Issue
Block a user