diff options
Diffstat (limited to 'code/win32_main.cpp')
-rw-r--r-- | code/win32_main.cpp | 205 |
1 files changed, 48 insertions, 157 deletions
diff --git a/code/win32_main.cpp b/code/win32_main.cpp index 4ea173d..208e85a 100644 --- a/code/win32_main.cpp +++ b/code/win32_main.cpp @@ -23,8 +23,8 @@ typedef u8 b8; typedef u16 b16; typedef u32 b32; -typedef float r32; -typedef double r64; +typedef float f32; +typedef double f64; #include "math.h" @@ -33,11 +33,10 @@ typedef double r64; #define internal static /** - * Text rendering todos: + * Font rendering todos: * - Look into font-packing, what is that? why is it needed? * - Look into generating a single bitmap and then extracting characters from the * bitmap as needed - * - Same thing as what I do now, but not using all the bitmaps * - SDF font rendering * */ internal i64 GlobalPerfCountFrequency; @@ -67,6 +66,16 @@ i8 PlatformDebugReadFile(char *FileName, void *FileBuffer, u32 MaxSize, LPDWORD } } +void PlatformCopyMemory(void *NewMem, void *OldMem, size_t CopySize) +{ + CopyMemory(NewMem, OldMem, CopySize); +} + +void PlatformZeroMemory(void *Ptr, size_t Size) +{ + ZeroMemory(Ptr, Size); +} + void framebuffer_size_callback(GLFWwindow *window, i32 width, i32 height) { glViewport(0, 0, width, height); @@ -81,143 +90,24 @@ Win32GetWallClock(void) return Result; } -inline r32 +inline f32 Win32GetSecondsElapsed(LARGE_INTEGER Start, LARGE_INTEGER End) { - r32 Result = (r32)(End.QuadPart - Start.QuadPart)/(r32)GlobalPerfCountFrequency; + f32 Result = (f32)(End.QuadPart - Start.QuadPart)/(f32)GlobalPerfCountFrequency; return(Result); } -#ifndef DEFAULT_ALIGNMENT -#define DEFAULT_ALIGNMENT (2*sizeof(void *)) -#endif - -typedef struct DebugArena { - u8 *Buffer; - size_t Size; - size_t CurrOffset; - size_t PrevOffset; -} DebugArena; - -bool IsPowerOfTwo(uintptr_t x) -{ - return (x & (x-1)) == 0; -} - -uintptr_t AlignForward(uintptr_t ptr, size_t align) -{ - uintptr_t p, a, modulo; - - assert(IsPowerOfTwo(align)); - p = ptr; - a = (uintptr_t)align; - modulo = p & (a-1); - - if (modulo != 0) - { - p += a - modulo; - } - return p; -} - -void *ArenaAllocAlign(DebugArena *Alloc, size_t Size, size_t Align) -{ - uintptr_t CurrOffset = (uintptr_t)Alloc->Buffer + (uintptr_t)Alloc->CurrOffset; - uintptr_t AlignedOffset = AlignForward(CurrOffset, Align); - AlignedOffset -= (uintptr_t)(Alloc->Buffer); - - if (AlignedOffset + Size < Alloc->Size) - { - void *Ptr = &Alloc->Buffer[AlignedOffset]; - Alloc->PrevOffset = AlignedOffset; - Alloc->CurrOffset = AlignedOffset + Size; - - ZeroMemory(Ptr, Size); - return Ptr; - } - return NULL; -} - -void ArenaInit(DebugArena *Alloc, void* BackingBuffer, size_t Size) -{ - Alloc->Buffer = (u8 *)BackingBuffer; - Alloc->Size = Size; - Alloc->CurrOffset = 0; - Alloc->PrevOffset = 0; -} - -void *ArenaAlloc(DebugArena *Alloc, size_t Size) -{ - return ArenaAllocAlign(Alloc, Size, DEFAULT_ALIGNMENT); -} - -void ArenaFree(DebugArena *Alloc, void *Ptr) -{ - // do nothing -} - -void *ArenaResizeAlign(DebugArena *Alloc, void *OldMem, size_t OldSize, - size_t NewSize, size_t Align) -{ - assert(IsPowerOfTwo(Align)); - if (OldMem == NULL || OldSize == 0) - { - return ArenaAllocAlign(Alloc, NewSize, Align); - } - else if (Alloc->Buffer < OldMem && OldMem < Alloc->Buffer + Alloc->Size) - { - // check if old_memory falls on prev_offset - if (Alloc->Buffer + Alloc->PrevOffset == OldMem) - { - // re-use prev_offset and resize from there - size_t _CurrOffset = Alloc->CurrOffset; - Alloc->CurrOffset = Alloc->PrevOffset + NewSize; - if (NewSize > OldSize) - { - ZeroMemory(&Alloc->Buffer[_CurrOffset], NewSize - OldSize); - } - return OldMem; - } - else - { - // generate new memory - // will have some fragmentation - void *NewMem = ArenaAllocAlign(Alloc, NewSize, Align); - size_t CopySize = OldSize < NewSize ? OldSize : NewSize; - - // copy old memory to new memory location - CopyMemory(NewMem, OldMem, CopySize); - return NewMem; - } - } - else - { - assert(0 && "Memory is out of bounds of the buffer in this arena"); - return NULL; - } -} - -void *ArenaResize(DebugArena *Alloc, void *OldMem, size_t OldSize, size_t NewSize) -{ - return ArenaResizeAlign(Alloc, OldMem, OldSize, NewSize, DEFAULT_ALIGNMENT); -} - -void ArenaFreeAll(DebugArena *Alloc) -{ - Alloc->CurrOffset = 0; - Alloc->PrevOffset = 0; -} - -#include "game_main.h" +#include "amr_memory.c" #include "gl_graphics.cpp" +#include "game_main.h" -typedef struct glyph_info { +typedef struct amr_glyph_info { u32 charset_start_index; u32 charset_end_index; -} glyph_info; +} amr_glyph_info; -u32 GetGlyphIdFromCodepoint(glyph_info glyph, u32 *GlyphIndexArray, u32 Codepoint) +u32 amr_GetGlyphIdFromCodepoint(amr_glyph_info glyph, u32 *GlyphIndexArray, u32 Codepoint) { u32 glyph_id = *(GlyphIndexArray + (Codepoint - glyph.charset_start_index)); return glyph_id; @@ -238,7 +128,7 @@ int main() // TODO(talha): how to use a library to query this i32 MonitorRefreshHz = 60; i32 GameUpdateHz = MonitorRefreshHz; - r32 TargetSecondsPerFrame = 1.0f / (r32)GameUpdateHz; + f32 TargetSecondsPerFrame = 1.0f / (f32)GameUpdateHz; GameState State = {0}; State.Input.LastMouseX = WIN_WIDTH/2.0f; @@ -288,19 +178,19 @@ int main() State.Memory.PermanentStorage = PermanentStorage; State.Memory.PermanentStorageSize = PermanentStorageSize; - ArenaInit(&State.Memory.Arena, State.Memory.PermanentStorage, State.Memory.PermanentStorageSize); + amr_ArenaInit(&State.Memory.Arena, State.Memory.PermanentStorage, State.Memory.PermanentStorageSize); // ======================= SHADER PROGRAM LOADING ======== DWORD BytesRead = 0; u32 max_fsz = MB((u64)5); - u8 *vs_file = (u8 *)ArenaAlloc(&State.Memory.Arena, max_fsz); + u8 *vs_file = (u8 *)amr_ArenaAlloc(&State.Memory.Arena, max_fsz); if (PlatformDebugReadFile("./code/shaders/text.vs.glsl", vs_file, max_fsz, &BytesRead) != 1) { printf("ERROR: failed to open text vertex shader"); return -1; } - u8 *fs_file = (u8 *)ArenaAlloc(&State.Memory.Arena, max_fsz); + u8 *fs_file = (u8 *)amr_ArenaAlloc(&State.Memory.Arena, max_fsz); if (PlatformDebugReadFile("./code/shaders/text.fs.glsl", fs_file, max_fsz, &BytesRead) != 1) { printf("ERROR: failed to open text vertex shader"); @@ -311,11 +201,11 @@ int main() u32 fs = CreateFragmentShader((char *)fs_file); u32 sp = CreateShaderProgram(vs, fs); - ArenaFreeAll(&State.Memory.Arena); + amr_ArenaFreeAll(&State.Memory.Arena); // =================== FONT RENDERING =================== u32 font_fz = MB(2); - u8 *ArialBuffer = (u8 *)ArenaAlloc(&State.Memory.Arena, font_fz); + u8 *ArialBuffer = (u8 *)amr_ArenaAlloc(&State.Memory.Arena, font_fz); // @todo: change to PlatformDebugFileRead fread(ArialBuffer, 1, font_fz, fopen("c:/windows/fonts/arial.ttf", "rb")); @@ -328,16 +218,16 @@ int main() } // get a SF (scale factor) - r32 SF = stbtt_ScaleForPixelHeight(&font_info, 32.0f); + f32 SF = stbtt_ScaleForPixelHeight(&font_info, 32.0f); // get vertical metrics i32 f_ascent, f_descent, f_line_gap; stbtt_GetFontVMetrics(&font_info, &f_ascent, &f_descent, &f_line_gap); // ========================= GLYPH AND FONT INFO STORAGE ================ - glyph_info latin_basic = {32, 126}; + amr_glyph_info latin_basic = {32, 126}; u32 glyph_count = latin_basic.charset_end_index - latin_basic.charset_start_index; - u32 *GlyphIndexArray = (u32 *)ArenaAlloc(&State.Memory.Arena, sizeof(glyph_count) * glyph_count); + u32 *GlyphIndexArray = (u32 *)amr_ArenaAlloc(&State.Memory.Arena, sizeof(glyph_count) * glyph_count); u32 *glyph_array_iter = GlyphIndexArray; for (u32 i = 0; i < glyph_count; i++) { @@ -350,10 +240,10 @@ int main() u32 fd_sz = sizeof(debug_font_details)*char_sz; - debug_font_details *fd_arr = (debug_font_details *)ArenaAlloc(&State.Memory.Arena, fd_sz); + debug_font_details *fd_arr = (debug_font_details *)amr_ArenaAlloc(&State.Memory.Arena, fd_sz); debug_font_details *_fi = fd_arr; - r32 lx = 0.0f, max_lx = 0.0f; + f32 lx = 0.0f, max_lx = 0.0f; i32 baseline = (i32)roundf(f_ascent * SF); // convert str to font for (i32 i = 0; i < char_sz; ++i) @@ -370,18 +260,19 @@ int main() continue; } - stbtt_GetGlyphHMetrics(&font_info, GetGlyphIdFromCodepoint(latin_basic, GlyphIndexArray, text[i]), &_fi->advance, &_fi->lsb); - stbtt_GetGlyphBitmapBox(&font_info, GetGlyphIdFromCodepoint(latin_basic, GlyphIndexArray, text[i]), SF, SF, &_fi->x0, &_fi->y0, &_fi->x1, &_fi->y1); + stbtt_GetGlyphHMetrics(&font_info, amr_GetGlyphIdFromCodepoint(latin_basic, GlyphIndexArray, text[i]), &_fi->advance, &_fi->lsb); + stbtt_GetGlyphBitmapBox(&font_info, amr_GetGlyphIdFromCodepoint(latin_basic, GlyphIndexArray, text[i]), SF, SF, &_fi->x0, &_fi->y0, &_fi->x1, &_fi->y1); - _fi->ly = (r32)(_fi->baseline + _fi->y0); + _fi->ly = (f32)(_fi->baseline + _fi->y0); lx += (_fi->advance * SF); i32 kern; if (i < char_sz - 1 && text[i+1] != '\n') { - kern = stbtt_GetGlyphKernAdvance(&font_info, GetGlyphIdFromCodepoint(latin_basic, GlyphIndexArray, text[i]), GetGlyphIdFromCodepoint(latin_basic, GlyphIndexArray, text[i])); + kern = stbtt_GetGlyphKernAdvance(&font_info, amr_GetGlyphIdFromCodepoint(latin_basic, GlyphIndexArray, text[i]), amr_GetGlyphIdFromCodepoint(latin_basic, GlyphIndexArray, text[i+1])); lx += roundf(kern * SF); } + if (lx > max_lx) { max_lx = lx; @@ -395,7 +286,7 @@ int main() u32 bitmap_height_from_text_info = (u32)(baseline - roundf(SF * f_descent)); i32 bmp_sz = sizeof(u8)*bitmap_width_from_text_info*bitmap_height_from_text_info; - u8 *Bitmap = (u8 *)ArenaAlloc(&State.Memory.Arena, bmp_sz); + u8 *Bitmap = (u8 *)amr_ArenaAlloc(&State.Memory.Arena, bmp_sz); _fi = fd_arr; for (int i=0; i<char_sz; i++) @@ -406,14 +297,14 @@ int main() } _fi->byte_offset = (i32)(_fi->lx + roundf(_fi->lsb * SF) + (_fi->ly * bitmap_width_from_text_info)) ; // store image data in bitmap - stbtt_MakeGlyphBitmap(&font_info, Bitmap + _fi->byte_offset, _fi->x1 - _fi->x0, _fi->y1 - _fi->y0, bitmap_width_from_text_info, SF, SF, GetGlyphIdFromCodepoint(latin_basic, GlyphIndexArray, text[i])); + stbtt_MakeGlyphBitmap(&font_info, Bitmap + _fi->byte_offset, _fi->x1 - _fi->x0, _fi->y1 - _fi->y0, bitmap_width_from_text_info, SF, SF, amr_GetGlyphIdFromCodepoint(latin_basic, GlyphIndexArray, text[i])); _fi++; } // ---------- prepare bitmap texture and buffer objects ----------- glPixelStorei(GL_UNPACK_ALIGNMENT, 1); - r32 bmp_vertices[] = { + f32 bmp_vertices[] = { // positions // texture coords 1.0f, 1.0f, 0.0f, 1.0f, 1.0f,// top right 1.0f, -1.0f, 0.0f, 1.0f, 0.0f,// bottom right @@ -482,12 +373,12 @@ int main() State.ScreenCoords.br = ScreenMidCoords + ScreenMidPx; // ====================== TEXT POSITIONING AND SCALING ====== - Vec2 text_dims = {((r32)bitmap_width_from_text_info)/2.0f, ((r32)bitmap_height_from_text_info)/2.0f}; + Vec2 text_dims = {((f32)bitmap_width_from_text_info)/2.0f, ((f32)bitmap_height_from_text_info)/2.0f}; Vec2 text_scaled_dims = State.px_ratio * text_dims; Vec2 text_scaled_mid = text_scaled_dims/2.0f; Vec2 text_pos = {0.0f, 0.0f}; - Vec2 text_offset = {text_dims.x/2.0f, (r32)fd_arr->baseline}; + Vec2 text_offset = {text_dims.x/2.0f, (f32)fd_arr->baseline}; text_pos = text_offset + text_pos; Vec2 text_scaled_pos = State.px_ratio*(State.ScreenCoords.tl + text_pos) + text_scaled_mid; @@ -502,9 +393,9 @@ int main() while (!glfwWindowShouldClose(Window)) { LARGE_INTEGER WorkCounter = Win32GetWallClock(); - r32 WorkSecondsElapsed = Win32GetSecondsElapsed(LastCounter, WorkCounter); + f32 WorkSecondsElapsed = Win32GetSecondsElapsed(LastCounter, WorkCounter); - r32 SecondsElapsedForFrame = WorkSecondsElapsed; + f32 SecondsElapsedForFrame = WorkSecondsElapsed; // @note: this caps the framerate // also prevents, for now, incorrect speeds based on timings // @todo: fix framerate capping and speed timings being affected by framerate @@ -560,11 +451,11 @@ int main() // far value is the max z-index value. Will be useful for layering textures Mat4 Projection = CreateOrthographicWithRatio(WIN_WIDTH, WIN_HEIGHT, -5.0f, 5.0f); - const r32 view[16] = {View.x0, View.x1, View.x2, View.x3, + const f32 view[16] = {View.x0, View.x1, View.x2, View.x3, View.y0, View.y1, View.y2, View.y3, View.z0, View.z1, View.z2, View.z3, View.w0, View.w1, View.w2, View.w3}; - const r32 projection[16] = {Projection.x0, Projection.x1, Projection.x2, Projection.x3, + const f32 projection[16] = {Projection.x0, Projection.x1, Projection.x2, Projection.x3, Projection.y0, Projection.y1, Projection.y2, Projection.y3, Projection.z0, Projection.z1, Projection.z2, Projection.z3, Projection.w0, Projection.w1, Projection.w2, Projection.w3}; @@ -587,7 +478,7 @@ int main() Mat4 Tx1 = CreateTranslationMat(InitVec4(container_pos.x, container_pos.y, -1.0f, 0)); Model = Mul_Mat4Mat4(Tx1, Model); - const r32 container_model[16] = {Model.x0, Model.x1, Model.x2, Model.x3, + const f32 container_model[16] = {Model.x0, Model.x1, Model.x2, Model.x3, Model.y0, Model.y1, Model.y2, Model.y3, Model.z0, Model.z1, Model.z2, Model.z3, Model.w0, Model.w1, Model.w2, Model.w3}; @@ -602,7 +493,7 @@ int main() Model = Mul_Mat4Mat4(Scale2, Model); Model = Mul_Mat4Mat4(Tx, Model); - const r32 field_model[16] = {Model.x0, Model.x1, Model.x2, Model.x3, + const f32 field_model[16] = {Model.x0, Model.x1, Model.x2, Model.x3, Model.y0, Model.y1, Model.y2, Model.y3, Model.z0, Model.z1, Model.z2, Model.z3, Model.w0, Model.w1, Model.w2, Model.w3}; @@ -618,7 +509,7 @@ int main() Mat4 Tx = CreateTranslationMat(InitVec4(text_scaled_pos.x, text_scaled_pos.y, 0, 0)); Model = Mul_Mat4Mat4(Tx, Model); - const r32 text_model[16] = {Model.x0, Model.x1, Model.x2, Model.x3, + const f32 text_model[16] = {Model.x0, Model.x1, Model.x2, Model.x3, Model.y0, Model.y1, Model.y2, Model.y3, Model.z0, Model.z1, Model.z2, Model.z3, Model.w0, Model.w1, Model.w2, Model.w3}; |