summaryrefslogtreecommitdiff
path: root/code/win32_main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'code/win32_main.cpp')
-rw-r--r--code/win32_main.cpp205
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};