diff --git a/Dengine.vcxproj b/Dengine.vcxproj
index 0275641..0b3c0cf 100644
--- a/Dengine.vcxproj
+++ b/Dengine.vcxproj
@@ -126,6 +126,7 @@
+
diff --git a/Dengine.vcxproj.filters b/Dengine.vcxproj.filters
index 36ba4a9..e50c137 100644
--- a/Dengine.vcxproj.filters
+++ b/Dengine.vcxproj.filters
@@ -54,6 +54,9 @@
Source Files
+
+ Source Files
+
diff --git a/src/AssetManager.c b/src/AssetManager.c
index 6318b9b..54eb151 100644
--- a/src/AssetManager.c
+++ b/src/AssetManager.c
@@ -28,7 +28,7 @@
*********************************
*/
INTERNAL HashTableEntry *const getFreeHashSlot(HashTable *const table,
- MemoryArena *const arena,
+ MemoryArena_ *const arena,
const char *const key)
{
u32 hashIndex = common_getHashIndex(key, table->size);
@@ -45,7 +45,7 @@ INTERNAL HashTableEntry *const getFreeHashSlot(HashTable *const table,
result = result->next;
}
- result->next = PLATFORM_MEM_ALLOC(arena, 1, HashTableEntry);
+ result->next = MEMORY_PUSH_STRUCT(arena, HashTableEntry);
result = result->next;
}
@@ -56,7 +56,7 @@ INTERNAL HashTableEntry *const getFreeHashSlot(HashTable *const table,
{
// +1 Null terminator
i32 keyLen = common_strlen(key) + 1;
- result->key = PLATFORM_MEM_ALLOC(arena, keyLen, char);
+ result->key = memory_pushBytes(arena, keyLen * sizeof(char));
common_strncpy(result->key, key, keyLen);
}
@@ -83,14 +83,14 @@ INTERNAL HashTableEntry *const getEntryFromHash(HashTable *const table,
*********************************
*/
INTERNAL SubTexture *getFreeAtlasSubTexSlot(TexAtlas *const atlas,
- MemoryArena *const arena,
+ MemoryArena_ *const arena,
const char *const key)
{
HashTableEntry *entry = getFreeHashSlot(&atlas->subTex, arena, key);
if (entry)
{
- entry->data = PLATFORM_MEM_ALLOC(arena, 1, SubTexture);
+ entry->data = MEMORY_PUSH_STRUCT(arena, SubTexture);
SubTexture *result = CAST(SubTexture *)entry->data;
return result;
}
@@ -127,7 +127,7 @@ Texture *asset_getTex(AssetManager *const assetManager, const char *const key)
}
TexAtlas *asset_getFreeTexAtlasSlot(AssetManager *const assetManager,
- MemoryArena *arena, const char *const key,
+ MemoryArena_ *arena, const char *const key,
i32 numSubTex)
{
@@ -136,19 +136,22 @@ TexAtlas *asset_getFreeTexAtlasSlot(AssetManager *const assetManager,
if (entry)
{
- entry->data = PLATFORM_MEM_ALLOC(arena, 1, TexAtlas);
+ entry->data = MEMORY_PUSH_STRUCT(arena, TexAtlas);
TexAtlas *result = CAST(TexAtlas *) entry->data;
if (result)
{
result->subTex.size = numSubTex;
result->subTex.entries =
- PLATFORM_MEM_ALLOC(arena, numSubTex, HashTableEntry);
+ memory_pushBytes(arena, numSubTex * sizeof(HashTableEntry));
if (!result->subTex.entries)
{
+ // TODO(doyle): Mem free
+ /*
PLATFORM_MEM_FREE(arena, result, sizeof(TexAtlas));
result = NULL;
+ */
}
}
@@ -174,7 +177,7 @@ TexAtlas *asset_getTexAtlas(AssetManager *const assetManager,
Texture *asset_getFreeTexSlot(AssetManager *const assetManager,
- MemoryArena *const arena, const char *const key)
+ MemoryArena_ *const arena, const char *const key)
{
HashTableEntry *const entry =
@@ -182,7 +185,7 @@ Texture *asset_getFreeTexSlot(AssetManager *const assetManager,
if (entry)
{
- entry->data = PLATFORM_MEM_ALLOC(arena, 1, Texture);
+ entry->data = MEMORY_PUSH_STRUCT(arena, Texture);
Texture *result = CAST(Texture *) entry->data;
return result;
}
@@ -192,7 +195,7 @@ Texture *asset_getFreeTexSlot(AssetManager *const assetManager,
}
}
-Texture *asset_loadTextureImage(AssetManager *assetManager, MemoryArena *arena,
+Texture *asset_loadTextureImage(AssetManager *assetManager, MemoryArena_ *arena,
const char *const path, const char *const key)
{
/* Open the texture image */
@@ -232,14 +235,14 @@ Texture *asset_loadTextureImage(AssetManager *assetManager, MemoryArena *arena,
*********************************
*/
INTERNAL Animation *getFreeAnimationSlot(AssetManager *const assetManager,
- MemoryArena *const arena,
+ MemoryArena_ *const arena,
const char *const key)
{
HashTableEntry *entry = getFreeHashSlot(&assetManager->anims, arena, key);
if (entry)
{
- entry->data = PLATFORM_MEM_ALLOC(arena, 1, Animation);
+ entry->data = MEMORY_PUSH_STRUCT(arena, Animation);
Animation *result = CAST(Animation *) entry->data;
return result;
}
@@ -250,7 +253,7 @@ INTERNAL Animation *getFreeAnimationSlot(AssetManager *const assetManager,
}
void asset_addAnimation(AssetManager *const assetManager,
- MemoryArena *const arena, const char *const animName,
+ MemoryArena_ *const arena, const char *const animName,
TexAtlas *const atlas,
char **const subTextureNames,
const i32 numSubTextures, const f32 frameDuration)
@@ -265,7 +268,7 @@ void asset_addAnimation(AssetManager *const assetManager,
anim->frameDuration = frameDuration;
anim->numFrames = numSubTextures;
- anim->frameList = PLATFORM_MEM_ALLOC(arena, numSubTextures, char*);
+ anim->frameList = memory_pushBytes(arena, numSubTextures * sizeof(char *));
for (i32 i = 0; i < numSubTextures; i++)
{
anim->frameList[i] = subTextureNames[i];
@@ -310,12 +313,12 @@ typedef struct XmlToken
i32 len;
} XmlToken;
-INTERNAL XmlToken *const tokeniseXmlBuffer(MemoryArena *const arena,
+INTERNAL XmlToken *const tokeniseXmlBuffer(MemoryArena_ *const arena,
const char *const buffer,
const i32 bufferSize,
int *const numTokens)
{
- XmlToken *xmlTokens = PLATFORM_MEM_ALLOC(arena, 8192, XmlToken);
+ XmlToken *xmlTokens = memory_pushBytes(arena, 8192 * sizeof(XmlToken));
i32 tokenIndex = 0;
for (i32 i = 0; i < bufferSize; i++)
{
@@ -417,11 +420,11 @@ INTERNAL XmlToken *const tokeniseXmlBuffer(MemoryArena *const arena,
return xmlTokens;
}
-INTERNAL XmlNode *const buildXmlTree(MemoryArena *const arena,
+INTERNAL XmlNode *const buildXmlTree(MemoryArena_ *const arena,
XmlToken *const xmlTokens,
const i32 numTokens)
{
- XmlNode *root = PLATFORM_MEM_ALLOC(arena, 1, XmlNode);
+ XmlNode *root = MEMORY_PUSH_STRUCT(arena, XmlNode);
if (!root) return NULL;
XmlNode *node = root;
@@ -457,7 +460,8 @@ INTERNAL XmlNode *const buildXmlTree(MemoryArena *const arena,
}
XmlNode *parent = node->parent;
- PLATFORM_MEM_FREE(arena, node, sizeof(XmlNode));
+ // TODO(doyle): Mem free
+ //PLATFORM_MEM_FREE(arena, node, sizeof(XmlNode));
node = node->parent;
}
else
@@ -496,7 +500,7 @@ INTERNAL XmlNode *const buildXmlTree(MemoryArena *const arena,
while (attribute->next)
attribute = attribute->next;
- attribute->next = PLATFORM_MEM_ALLOC(arena, 1, XmlAttribute);
+ attribute->next = MEMORY_PUSH_STRUCT(arena, XmlAttribute);
attribute = attribute->next;
}
@@ -531,7 +535,7 @@ INTERNAL XmlNode *const buildXmlTree(MemoryArena *const arena,
if (!node->child)
{
// TODO(doyle): Mem alloc error checking
- node->child = PLATFORM_MEM_ALLOC(arena, 1, XmlNode);
+ node->child = MEMORY_PUSH_STRUCT(arena, XmlNode);
node->child->parent = node;
node = node->child;
}
@@ -541,7 +545,7 @@ INTERNAL XmlNode *const buildXmlTree(MemoryArena *const arena,
while (nodeToCheck->next)
nodeToCheck = nodeToCheck->next;
- nodeToCheck->next = PLATFORM_MEM_ALLOC(arena, 1, XmlNode);
+ nodeToCheck->next = MEMORY_PUSH_STRUCT(arena, XmlNode);
nodeToCheck->next->parent = node;
node = nodeToCheck->next;
}
@@ -560,7 +564,7 @@ INTERNAL XmlNode *const buildXmlTree(MemoryArena *const arena,
return root;
}
-INTERNAL void parseXmlTreeToGame(AssetManager *assetManager, MemoryArena *arena,
+INTERNAL void parseXmlTreeToGame(AssetManager *assetManager, MemoryArena_ *arena,
XmlNode *root)
{
XmlNode *node = root;
@@ -606,7 +610,8 @@ INTERNAL void parseXmlTreeToGame(AssetManager *assetManager, MemoryArena *arena,
i32 imageNameLen = common_strlen(imageName);
i32 totalPathLen = (dataDirLen + imageNameLen) + 1;
- char *imagePath = PLATFORM_MEM_ALLOC(arena, totalPathLen, char);
+ char *imagePath =
+ memory_pushBytes(arena, totalPathLen * sizeof(char));
common_strncat(imagePath, dataDir, dataDirLen);
common_strncat(imagePath, imageName, imageNameLen);
@@ -616,13 +621,15 @@ INTERNAL void parseXmlTreeToGame(AssetManager *assetManager, MemoryArena *arena,
if (!tex)
{
DEBUG_LOG("parseXmlTreeToGame() failed: Could not load image");
- PLATFORM_MEM_FREE(arena, imagePath,
- totalPathLen * sizeof(char));
+ // TODO(doyle): Mem free
+ //PLATFORM_MEM_FREE(arena, imagePath,
+ // totalPathLen * sizeof(char));
return;
}
- PLATFORM_MEM_FREE(arena, imagePath,
- totalPathLen * sizeof(char));
+ // TODO(doyle): Mem free
+ //PLATFORM_MEM_FREE(arena, imagePath,
+ // totalPathLen * sizeof(char));
atlas->tex = tex;
/*
@@ -757,7 +764,7 @@ INTERNAL void parseXmlTreeToGame(AssetManager *assetManager, MemoryArena *arena,
}
}
-INTERNAL void recursiveFreeXmlTree(MemoryArena *const arena,
+INTERNAL void recursiveFreeXmlTree(MemoryArena_ *const arena,
XmlNode *node)
{
if (!node)
@@ -775,7 +782,8 @@ INTERNAL void recursiveFreeXmlTree(MemoryArena *const arena,
attrib->name = NULL;
attrib->value = NULL;
- PLATFORM_MEM_FREE(arena, attrib, sizeof(XmlAttribute));
+ // TODO(doyle): Mem free
+ // PLATFORM_MEM_FREE(arena, attrib, sizeof(XmlAttribute));
attrib = next;
}
@@ -784,16 +792,18 @@ INTERNAL void recursiveFreeXmlTree(MemoryArena *const arena,
node->name = NULL;
node->isClosed = FALSE;
- PLATFORM_MEM_FREE(arena, node, sizeof(XmlNode));
+ // TODO(doyle): Mem free
+ // PLATFORM_MEM_FREE(arena, node, sizeof(XmlNode));
node = NULL;
}
}
-INTERNAL void freeXmlData(MemoryArena *const arena, XmlToken *tokens,
+INTERNAL void freeXmlData(MemoryArena_ *const arena, XmlToken *tokens,
const i32 numTokens, XmlNode *tree)
{
if (tree) recursiveFreeXmlTree(arena, tree);
- if (tokens) PLATFORM_MEM_FREE(arena, tokens, numTokens * sizeof(XmlToken));
+ // TODO(doyle): Mem free
+ // if (tokens) PLATFORM_MEM_FREE(arena, tokens, numTokens * sizeof(XmlToken));
}
/*
@@ -802,8 +812,8 @@ INTERNAL void freeXmlData(MemoryArena *const arena, XmlToken *tokens,
*********************************
*/
const i32 asset_loadXmlFile(AssetManager *const assetManager,
- MemoryArena *const arena,
- const PlatformFileRead *const fileRead)
+ MemoryArena_ *const arena,
+ const PlatformFileRead *const fileRead)
{
i32 result = 0;
/* Tokenise buffer */
@@ -842,7 +852,7 @@ AudioVorbis *const asset_getVorbis(AssetManager *const assetManager,
return result;
}
-const i32 asset_loadVorbis(AssetManager *assetManager, MemoryArena *arena,
+const i32 asset_loadVorbis(AssetManager *assetManager, MemoryArena_ *arena,
const char *const path, const char *const key)
{
HashTableEntry *entry = getFreeHashSlot(&assetManager->audio, arena, key);
@@ -852,7 +862,7 @@ const i32 asset_loadVorbis(AssetManager *assetManager, MemoryArena *arena,
PlatformFileRead fileRead = {0};
platform_readFileToBuffer(arena, path, &fileRead);
- entry->data = PLATFORM_MEM_ALLOC(arena, 1, AudioVorbis);
+ entry->data = MEMORY_PUSH_STRUCT(arena, AudioVorbis);
i32 error;
AudioVorbis *audio = CAST(AudioVorbis *) entry->data;
@@ -862,7 +872,8 @@ const i32 asset_loadVorbis(AssetManager *assetManager, MemoryArena *arena,
if (!audio->file)
{
printf("stb_vorbis_open_memory() failed: Error code %d\n", error);
- platform_closeFileRead(arena, &fileRead);
+ // TODO(doyle): Mem free
+ // platform_closeFileRead(arena, &fileRead);
stb_vorbis_close(audio->file);
return 0;
}
@@ -877,11 +888,12 @@ const i32 asset_loadVorbis(AssetManager *assetManager, MemoryArena *arena,
return 0;
}
-INTERNAL GLuint createShaderFromPath(MemoryArena *arena, const char *const path,
+INTERNAL GLuint createShaderFromPath(MemoryArena_ *arena, const char *const path,
GLuint shadertype)
{
PlatformFileRead file = {0};
+ // TODO(doyle): Revise platform reads
i32 status = platform_readFileToBuffer(arena, path, &file);
if (status)
return status;
@@ -942,7 +954,7 @@ Shader *const asset_getShader(AssetManager *assetManager,
return NULL;
}
-const i32 asset_loadShaderFiles(AssetManager *assetManager, MemoryArena *arena,
+const i32 asset_loadShaderFiles(AssetManager *assetManager, MemoryArena_ *arena,
const char *const vertexPath,
const char *const fragmentPath,
const enum ShaderList type)
@@ -968,7 +980,7 @@ typedef struct GlyphBitmap
i32 codepoint;
} GlyphBitmap;
-const i32 asset_loadTTFont(AssetManager *assetManager, MemoryArena *arena,
+const i32 asset_loadTTFont(AssetManager *assetManager, MemoryArena_ *arena,
const char *filePath)
{
PlatformFileRead fontFileRead = {0};
@@ -990,7 +1002,7 @@ const i32 asset_loadTTFont(AssetManager *assetManager, MemoryArena *arena,
const i32 numGlyphs = CAST(i32)(codepointRange.y - codepointRange.x);
GlyphBitmap *glyphBitmaps =
- PLATFORM_MEM_ALLOC(arena, numGlyphs, GlyphBitmap);
+ memory_pushBytes(arena, numGlyphs * sizeof(GlyphBitmap));
v2 largestGlyphDimension = V2(0, 0);
const f32 targetFontHeight = 15.0f;
@@ -1005,7 +1017,8 @@ const i32 asset_loadTTFont(AssetManager *assetManager, MemoryArena *arena,
font->metrics = CAST(FontMetrics){ascent, descent, lineGap};
- font->charMetrics = PLATFORM_MEM_ALLOC(arena, numGlyphs, CharMetrics);
+ font->charMetrics =
+ memory_pushBytes(arena, numGlyphs * sizeof(CharMetrics));
/*
************************************************************
@@ -1024,7 +1037,8 @@ const i32 asset_loadTTFont(AssetManager *assetManager, MemoryArena *arena,
&height, &xOffset, &yOffset);
u8 *source = monoBitmap;
- u32 *colorBitmap = PLATFORM_MEM_ALLOC(arena, width * height, u32);
+ u32 *colorBitmap =
+ memory_pushBytes(arena, width * height * sizeof(u32));
u32 *dest = colorBitmap;
// NOTE(doyle): STB generates 1 byte per pixel bitmaps, we use 4bpp, so
@@ -1100,7 +1114,7 @@ const i32 asset_loadTTFont(AssetManager *assetManager, MemoryArena *arena,
#endif
i32 bitmapSize = SQUARED(TARGET_TEXTURE_SIZE) * TARGET_BYTES_PER_PIXEL;
- u32 *fontBitmap = PLATFORM_MEM_ALLOC(arena, bitmapSize, u32);
+ u32 *fontBitmap = memory_pushBytes(arena, bitmapSize * sizeof(u32));
const i32 pitch = MAX_TEXTURE_SIZE * TARGET_BYTES_PER_PIXEL;
// Check value to determine when a row of glyphs is completely printed
@@ -1208,7 +1222,9 @@ const i32 asset_loadTTFont(AssetManager *assetManager, MemoryArena *arena,
stbi_write_png("out.png", MAX_TEXTURE_SIZE, MAX_TEXTURE_SIZE, 4, fontBitmap,
MAX_TEXTURE_SIZE * 4);
#endif
- PLATFORM_MEM_FREE(arena, fontBitmap, bitmapSize);
+
+ // TODO(doyle): Mem free
+ // PLATFORM_MEM_FREE(arena, fontBitmap, bitmapSize);
fontAtlas->tex = tex;
font->atlas = fontAtlas;
@@ -1222,10 +1238,12 @@ const i32 asset_loadTTFont(AssetManager *assetManager, MemoryArena *arena,
i32 glyphBitmapSizeInBytes = CAST(i32) glyphBitmaps[i].dimensions.w *
CAST(i32) glyphBitmaps[i].dimensions.h *
sizeof(u32);
- PLATFORM_MEM_FREE(arena, glyphBitmaps[i].pixels, glyphBitmapSizeInBytes);
+ // TODO(doyle): Mem free
+ // PLATFORM_MEM_FREE(arena, glyphBitmaps[i].pixels, glyphBitmapSizeInBytes);
}
- PLATFORM_MEM_FREE(arena, glyphBitmaps, numGlyphs * sizeof(GlyphBitmap));
+ // TODO(doyle): Mem free
+ // PLATFORM_MEM_FREE(arena, glyphBitmaps, numGlyphs * sizeof(GlyphBitmap));
platform_closeFileRead(arena, &fontFileRead);
return 0;
@@ -1254,7 +1272,7 @@ const v2 asset_stringDimInPixels(const Font *const font,
return stringDim;
}
-void asset_unitTest(MemoryArena *arena)
+void asset_unitTest(MemoryArena_ *arena)
{
PlatformFileRead xmlFileRead = {0};
i32 result = platform_readFileToBuffer(
@@ -1267,15 +1285,11 @@ void asset_unitTest(MemoryArena *arena)
else
{
/* Tokenise buffer */
- i32 memBefore = arena->bytesAllocated;
i32 numTokens = 0;
XmlToken *xmlTokens = tokeniseXmlBuffer(arena, xmlFileRead.buffer,
xmlFileRead.size, &numTokens);
/* Build XML tree from tokens */
XmlNode *xmlTree = buildXmlTree(arena, xmlTokens, numTokens);
freeXmlData(arena, xmlTokens, numTokens, xmlTree);
- i32 memAfter = arena->bytesAllocated;
-
- ASSERT(memBefore == memAfter);
}
}
diff --git a/src/Audio.c b/src/Audio.c
index dbb8429..b159a40 100644
--- a/src/Audio.c
+++ b/src/Audio.c
@@ -7,7 +7,6 @@
#include "Dengine/Audio.h"
#include "Dengine/Debug.h"
#include "Dengine/MemoryArena.h"
-#include "dengine/Platform.h"
#define AL_CHECK_ERROR() alCheckError_(__FILE__, __LINE__);
void alCheckError_(const char *file, int line)
@@ -116,7 +115,7 @@ INTERNAL inline u32 getSourceId(AudioManager *audioManager,
return result;
}
-INTERNAL i32 rendererAcquire(MemoryArena *arena, AudioManager *audioManager,
+INTERNAL i32 rendererAcquire(MemoryArena_ *arena, AudioManager *audioManager,
AudioRenderer *audioRenderer)
{
#ifdef DENGINE_DEBUG
@@ -162,7 +161,7 @@ INTERNAL i32 rendererAcquire(MemoryArena *arena, AudioManager *audioManager,
return 0;
}
-INTERNAL const i32 rendererRelease(MemoryArena *arena, AudioManager *audioManager,
+INTERNAL const i32 rendererRelease(MemoryArena_ *arena, AudioManager *audioManager,
AudioRenderer *audioRenderer)
{
@@ -212,7 +211,9 @@ INTERNAL const i32 rendererRelease(MemoryArena *arena, AudioManager *audioManage
if (audioRenderer->isStreaming)
{
stb_vorbis_close(audioRenderer->audio->file);
- PLATFORM_MEM_FREE(arena, audioRenderer->audio, sizeof(AudioVorbis));
+
+ // TODO(doyle): Mem free
+ // PLATFORM_MEM_FREE(arena, audioRenderer->audio, sizeof(AudioVorbis));
}
u32 sourceIndexToFree = audioRenderer->sourceIndex;
@@ -229,7 +230,7 @@ INTERNAL const i32 rendererRelease(MemoryArena *arena, AudioManager *audioManage
return result;
}
-INTERNAL i32 initRendererForPlayback(MemoryArena *arena,
+INTERNAL i32 initRendererForPlayback(MemoryArena_ *arena,
AudioManager *audioManager,
AudioRenderer *audioRenderer,
AudioVorbis *vorbis, i32 numPlays)
@@ -267,7 +268,7 @@ INTERNAL i32 initRendererForPlayback(MemoryArena *arena,
}
#include
-const i32 audio_playVorbis(MemoryArena *arena, AudioManager *audioManager,
+const i32 audio_playVorbis(MemoryArena_ *arena, AudioManager *audioManager,
AudioRenderer *audioRenderer, AudioVorbis *vorbis,
i32 numPlays)
{
@@ -293,7 +294,7 @@ const i32 audio_playVorbis(MemoryArena *arena, AudioManager *audioManager,
return result;
}
-const i32 audio_streamPlayVorbis(MemoryArena *arena, AudioManager *audioManager,
+const i32 audio_streamPlayVorbis(MemoryArena_ *arena, AudioManager *audioManager,
AudioRenderer *audioRenderer,
AudioVorbis *vorbis, i32 numPlays)
{
@@ -304,7 +305,7 @@ const i32 audio_streamPlayVorbis(MemoryArena *arena, AudioManager *audioManager,
// data except the file pointer. If the same sound is playing twice
// simultaneously, we need unique file pointers into the data to track song
// position uniquely
- AudioVorbis *copyAudio = PLATFORM_MEM_ALLOC(arena, 1, AudioVorbis);
+ AudioVorbis *copyAudio = MEMORY_PUSH_STRUCT(arena, AudioVorbis);
*copyAudio = *vorbis;
i32 error;
@@ -318,7 +319,7 @@ const i32 audio_streamPlayVorbis(MemoryArena *arena, AudioManager *audioManager,
return result;
}
-const i32 audio_stopVorbis(MemoryArena *arena, AudioManager *audioManager,
+const i32 audio_stopVorbis(MemoryArena_ *arena, AudioManager *audioManager,
AudioRenderer *audioRenderer)
{
i32 result = 0;
@@ -388,21 +389,12 @@ const i32 audio_resumeVorbis(AudioManager *audioManager,
}
#define AUDIO_CHUNK_SIZE_ 65536
-const i32 audio_updateAndPlay(MemoryArena *arena, AudioManager *audioManager,
+const i32 audio_updateAndPlay(MemoryArena_ *arena, AudioManager *audioManager,
AudioRenderer *audioRenderer)
{
AudioVorbis *audio = audioRenderer->audio;
if (!audio) return 0;
-#if 0
- if (audioRenderer->numPlays != AUDIO_REPEAT_INFINITE &&
- audioRenderer->numPlays <= 0)
- {
- i32 result = rendererRelease(arena, audioManager, audioRenderer);
- return result;
- }
-#endif
-
u32 alSourceId = getSourceId(audioManager, audioRenderer);
if (alIsSource(alSourceId) == AL_FALSE)
{
diff --git a/src/Debug.c b/src/Debug.c
index 67b9fab..f1d8131 100644
--- a/src/Debug.c
+++ b/src/Debug.c
@@ -75,10 +75,11 @@ inline char *debug_entityattack_string(i32 val)
return string;
}
-void debug_init(MemoryArena *arena, v2 windowSize, Font font)
+void debug_init(MemoryArena_ *arena, v2 windowSize, Font font)
{
GLOBAL_debug.font = font;
- GLOBAL_debug.callCount = PLATFORM_MEM_ALLOC(arena, debugcount_num, i32);
+ GLOBAL_debug.callCount =
+ memory_pushBytes(arena, debugcount_num * sizeof(i32));
GLOBAL_debug.stringLineGap = CAST(f32) font.verticalSpacing;
/* Init debug string stack */
@@ -268,7 +269,7 @@ void debug_pushString(char *formatString, void *data, char *dataType)
}
}
-INTERNAL void updateAndRenderDebugStack(Renderer *renderer, MemoryArena *arena,
+INTERNAL void updateAndRenderDebugStack(Renderer *renderer, MemoryArena_ *arena,
f32 dt)
{
for (i32 i = 0; i < GLOBAL_debug.numDebugStrings; i++)
@@ -299,7 +300,7 @@ INTERNAL void updateAndRenderDebugStack(Renderer *renderer, MemoryArena *arena,
}
-INTERNAL void renderConsole(Renderer *renderer, MemoryArena *arena)
+INTERNAL void renderConsole(Renderer *renderer, MemoryArena_ *arena)
{
i32 maxConsoleLines = ARRAY_COUNT(GLOBAL_debug.console);
v2 consoleStrP = GLOBAL_debug.initialConsoleP;
@@ -320,6 +321,7 @@ void debug_drawUi(GameState *state, f32 dt)
Renderer *renderer = &state->renderer;
World *const world = &state->world[state->currWorldIndex];
Entity *hero = &world->entities[entity_getIndex(world, world->heroId)];
+ MemoryArena_ *transientArena = &state->transientArena;
// TODO(doyle): Dumb copy function from game so we don't expose api
Rect camera = {world->cameraPos, renderer->size};
@@ -347,7 +349,7 @@ void debug_drawUi(GameState *state, f32 dt)
CAST(f32)(font->maxSize.w * common_strlen(battleStr));
v2 strPos = V2((renderer->size.w * 0.5f) - (strLenInPixels * 0.5f),
renderer->size.h - 300.0f);
- renderer_staticString(&state->renderer, &state->arena, font, battleStr,
+ renderer_staticString(&state->renderer, transientArena, font, battleStr,
strPos, V2(0, 0), 0, color);
}
@@ -386,7 +388,7 @@ void debug_drawUi(GameState *state, f32 dt)
i32 indexOfLowerAInMetrics = 'a' - CAST(i32) font->codepointRange.x;
strPos.y += font->charMetrics[indexOfLowerAInMetrics].offset.y;
- renderer_string(&state->renderer, &state->arena, camera, font,
+ renderer_string(&state->renderer, transientArena, camera, font,
debugString, strPos, V2(0, 0), 0, color);
f32 stringLineGap = 1.1f * font->verticalSpacing;
@@ -395,14 +397,14 @@ void debug_drawUi(GameState *state, f32 dt)
char entityPosStr[128];
snprintf(entityPosStr, ARRAY_COUNT(entityPosStr), "%06.2f, %06.2f",
entity->pos.x, entity->pos.y);
- renderer_string(&state->renderer, &state->arena, camera, font,
+ renderer_string(&state->renderer, transientArena, camera, font,
entityPosStr, strPos, V2(0, 0), 0, color);
strPos.y -= GLOBAL_debug.stringLineGap;
char entityIDStr[32];
snprintf(entityIDStr, ARRAY_COUNT(entityIDStr), "ID: %4d/%d", entity->id,
world->uniqueIdAccumulator-1);
- renderer_string(&state->renderer, &state->arena, camera, font,
+ renderer_string(&state->renderer, transientArena, camera, font,
entityIDStr, strPos, V2(0, 0), 0, color);
if (entity->stats)
@@ -411,27 +413,27 @@ void debug_drawUi(GameState *state, f32 dt)
char entityHealth[32];
snprintf(entityHealth, ARRAY_COUNT(entityHealth), "HP: %3.0f/%3.0f",
entity->stats->health, entity->stats->maxHealth);
- renderer_string(&state->renderer, &state->arena, camera,
+ renderer_string(&state->renderer, transientArena, camera,
font, entityHealth, strPos, V2(0, 0), 0, color);
strPos.y -= GLOBAL_debug.stringLineGap;
char entityTimer[32];
snprintf(entityTimer, ARRAY_COUNT(entityTimer), "ATB: %3.0f/%3.0f",
entity->stats->actionTimer, entity->stats->actionRate);
- renderer_string(&state->renderer, &state->arena, camera,
+ renderer_string(&state->renderer, transientArena, camera,
font, entityTimer, strPos, V2(0, 0), 0, color);
strPos.y -= GLOBAL_debug.stringLineGap;
char entityIdTarget[32];
snprintf(entityIdTarget, ARRAY_COUNT(entityIdTarget),
"Targetting ID: %d", entity->stats->entityIdToAttack);
- renderer_string(&state->renderer, &state->arena, camera,
+ renderer_string(&state->renderer, transientArena, camera,
font, entityIdTarget, strPos, V2(0, 0), 0, color);
}
strPos.y -= GLOBAL_debug.stringLineGap;
char *entityStateStr = debug_entitystate_string(entity->state);
- renderer_string(&state->renderer, &state->arena, camera, font,
+ renderer_string(&state->renderer, transientArena, camera, font,
entityStateStr, strPos, V2(0, 0), 0, color);
if (entity->audioRenderer)
@@ -442,7 +444,7 @@ void debug_drawUi(GameState *state, f32 dt)
ARRAY_COUNT(entityAudioSourceIndex),
"AudioSource Index: %d",
entity->audioRenderer->sourceIndex);
- renderer_string(&state->renderer, &state->arena, camera,
+ renderer_string(&state->renderer, transientArena, camera,
font, entityAudioSourceIndex, strPos, V2(0, 0),
0, color);
}
@@ -498,12 +500,25 @@ void debug_drawUi(GameState *state, f32 dt)
DEBUG_PUSH_VAR("Mouse Pos: %06.2f, %06.2f", state->input.mouseP, "v2");
- i32 debug_bAllocated = state->arena.bytesAllocated;
- DEBUG_PUSH_VAR("TotalMemoryAllocated: %db", debug_bAllocated, "i32");
- i32 debug_kbAllocated = state->arena.bytesAllocated / 1024;
+ /*
+ *****************
+ * MEMORY DISPLAY
+ *****************
+ */
+ i32 debug_bAllocated = transientArena->used;
+ i32 debug_kbAllocated = debug_bAllocated / 1024;
i32 debug_mbAllocated = debug_kbAllocated / 1024;
- DEBUG_PUSH_VAR("TotalMemoryAllocated: %dkb", debug_kbAllocated, "i32");
- DEBUG_PUSH_VAR("TotalMemoryAllocated: %dmb", debug_mbAllocated, "i32");
+ DEBUG_PUSH_VAR("TransientArena Used: %db", debug_bAllocated, "i32");
+ DEBUG_PUSH_VAR("TransientArena Used: %dkb", debug_kbAllocated, "i32");
+ DEBUG_PUSH_VAR("TransientArena Used: %dmb", debug_mbAllocated, "i32");
+ DEBUG_PUSH_STRING("");
+
+ debug_bAllocated = state->arena_.used;
+ debug_kbAllocated = debug_bAllocated / 1024;
+ debug_mbAllocated = debug_kbAllocated / 1024;
+ DEBUG_PUSH_VAR("PersistentArena Used: %db", debug_bAllocated, "i32");
+ DEBUG_PUSH_VAR("PersistentArena Used: %dkb", debug_kbAllocated, "i32");
+ DEBUG_PUSH_VAR("PersistentArena Used: %dmb", debug_mbAllocated, "i32");
DEBUG_PUSH_STRING("");
AudioManager *audioManager = &state->audioManager;
@@ -533,7 +548,7 @@ void debug_drawUi(GameState *state, f32 dt)
DEBUG_PUSH_STRING("-none-");
}
- updateAndRenderDebugStack(&state->renderer, &state->arena, dt);
- renderConsole(&state->renderer, &state->arena);
+ updateAndRenderDebugStack(&state->renderer, transientArena, dt);
+ renderConsole(&state->renderer, transientArena);
debug_clearCounter();
}
diff --git a/src/Entity.c b/src/Entity.c
index b5b9e80..ea9deeb 100644
--- a/src/Entity.c
+++ b/src/Entity.c
@@ -1,6 +1,7 @@
#include "Dengine/Entity.h"
+#include "Dengine/AssetManager.h"
#include "Dengine/Debug.h"
-#include "Dengine/Platform.h"
+#include "Dengine/MemoryArena.h"
#include "Dengine/WorldTraveller.h"
SubTexture entity_getActiveSubTexture(Entity *const entity)
@@ -108,7 +109,7 @@ void entity_addAnim(AssetManager *const assetManager, Entity *const entity,
DEBUG_LOG("No more free entity animation slots");
}
-Entity *const entity_add(MemoryArena *const arena, World *const world,
+Entity *const entity_add(MemoryArena_ *const arena, World *const world,
const v2 pos, const v2 size, const f32 scale,
const enum EntityType type,
const enum Direction direction, Texture *const tex,
@@ -135,7 +136,7 @@ Entity *const entity_add(MemoryArena *const arena, World *const world,
switch (type)
{
case entitytype_hero:
- entity.stats = PLATFORM_MEM_ALLOC(arena, 1, EntityStats);
+ entity.stats = MEMORY_PUSH_STRUCT(arena, EntityStats);
entity.stats->maxHealth = 100;
entity.stats->health = entity.stats->maxHealth;
entity.stats->actionRate = 100;
@@ -148,7 +149,7 @@ Entity *const entity_add(MemoryArena *const arena, World *const world,
break;
case entitytype_mob:
{
- entity.stats = PLATFORM_MEM_ALLOC(arena, 1, EntityStats);
+ entity.stats = MEMORY_PUSH_STRUCT(arena, EntityStats);
entity.stats->maxHealth = 100;
entity.stats->health = entity.stats->maxHealth;
entity.stats->actionRate = 80;
@@ -162,12 +163,12 @@ Entity *const entity_add(MemoryArena *const arena, World *const world,
}
case entitytype_projectile:
case entitytype_attackObject:
- entity.stats = PLATFORM_MEM_ALLOC(arena, 1, EntityStats);
- entity.stats->maxHealth = 100;
- entity.stats->health = entity.stats->maxHealth;
- entity.stats->actionRate = 100;
- entity.stats->actionTimer = entity.stats->actionRate;
- entity.stats->actionSpdMul = 100;
+ entity.stats = MEMORY_PUSH_STRUCT(arena, EntityStats);
+ entity.stats->maxHealth = 100;
+ entity.stats->health = entity.stats->maxHealth;
+ entity.stats->actionRate = 100;
+ entity.stats->actionTimer = entity.stats->actionRate;
+ entity.stats->actionSpdMul = 100;
entity.stats->entityIdToAttack = -1;
entity.stats->queuedAttack = entityattack_invalid;
entity.state = entitystate_idle;
@@ -183,15 +184,19 @@ Entity *const entity_add(MemoryArena *const arena, World *const world,
return result;
}
-void entity_clearData(MemoryArena *const arena, World *const world,
+void entity_clearData(MemoryArena_ *const arena, World *const world,
Entity *const entity)
{
+ // TODO(doyle): Mem free// memory leak!!
+
+ /*
if (entity->stats)
- PLATFORM_MEM_FREE(arena, entity->stats, sizeof(EntityStats));
+ PLATFORM_MEM_FREE(arena, entity->stats, sizeof(EntityStats));
if (entity->audioRenderer)
- PLATFORM_MEM_FREE(arena, entity->audioRenderer,
- sizeof(AudioRenderer) * entity->numAudioRenderers);
+ PLATFORM_MEM_FREE(arena, entity->audioRenderer,
+ sizeof(AudioRenderer) * entity->numAudioRenderers);
+ */
entity->type = entitytype_null;
}
diff --git a/src/MemoryArena.c b/src/MemoryArena.c
new file mode 100644
index 0000000..c498a7d
--- /dev/null
+++ b/src/MemoryArena.c
@@ -0,0 +1,8 @@
+#include "Dengine/MemoryArena.h"
+
+void memory_arenaInit(MemoryArena_ *arena, void *base, size_t size)
+{
+ arena->size = size;
+ arena->used = 0;
+ arena->base = CAST(u8 *)base;
+}
diff --git a/src/Platform.c b/src/Platform.c
index d366f54..26d7e26 100644
--- a/src/Platform.c
+++ b/src/Platform.c
@@ -3,37 +3,38 @@
#include
#include "Dengine/Platform.h"
-#include "Dengine/MemoryArena.h"
#include "Dengine/Debug.h"
+#include "Dengine/MemoryArena.h"
-void platform_memoryFree(MemoryArena *arena, void *data, i32 numBytes)
+void platform_memoryFree(MemoryArena_ *arena, void *data, i32 numBytes)
{
if (data) free(data);
#ifdef DENGINE_DEBUG
debug_countIncrement(debugcount_platformMemFree);
- arena->bytesAllocated -= numBytes;
+ arena->used -= numBytes;
#endif
}
-void *platform_memoryAlloc(MemoryArena *arena, i32 numBytes)
+void *platform_memoryAlloc(MemoryArena_ *arena, i32 numBytes)
{
void *result = calloc(1, numBytes);
#ifdef DENGINE_DEBUG
debug_countIncrement(debugcount_platformMemAlloc);
- if (result)
- arena->bytesAllocated += numBytes;
+ if (result && arena)
+ arena->used += numBytes;
#endif
return result;
}
-void platform_closeFileRead(MemoryArena *arena, PlatformFileRead *file)
+void platform_closeFileRead(MemoryArena_ *arena, PlatformFileRead *file)
{
- PLATFORM_MEM_FREE(arena, file->buffer, file->size);
+ // TODO(doyle): Mem free
+ // PLATFORM_MEM_FREE(arena, file->buffer, file->size);
}
-i32 platform_readFileToBuffer(MemoryArena *arena, const char *const filePath,
+i32 platform_readFileToBuffer(MemoryArena_ *arena, const char *const filePath,
PlatformFileRead *file)
{
HANDLE fileHandle = CreateFile(filePath, GENERIC_READ, FILE_SHARE_READ,
@@ -55,8 +56,8 @@ i32 platform_readFileToBuffer(MemoryArena *arena, const char *const filePath,
}
// TODO(doyle): Warning we assume files less than 4GB
- file->buffer = PLATFORM_MEM_ALLOC(arena, fileSize.LowPart, char);
- file->size = fileSize.LowPart;
+ file->buffer = memory_pushBytes(arena, fileSize.LowPart * sizeof(char));
+ file->size = fileSize.LowPart;
DWORD numBytesRead = 0;
@@ -66,7 +67,19 @@ i32 platform_readFileToBuffer(MemoryArena *arena, const char *const filePath,
{
printf("ReadFile() failed: %d error number\n",
status);
- PLATFORM_MEM_FREE(arena, file->buffer, file->size);
+
+ char msgBuffer[512] = {0};
+ DWORD dw = GetLastError();
+
+ FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
+ FORMAT_MESSAGE_FROM_SYSTEM |
+ FORMAT_MESSAGE_IGNORE_INSERTS,
+ NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+ (LPTSTR)msgBuffer, 0, NULL);
+
+
+ // TODO(doyle): Mem free
+ // PLATFORM_MEM_FREE(arena, file->buffer, file->size);
return status;
}
else if (numBytesRead != file->size)
@@ -74,7 +87,8 @@ i32 platform_readFileToBuffer(MemoryArena *arena, const char *const filePath,
printf(
"ReadFile() failed: Number of bytes read doesn't match file "
"size\n");
- PLATFORM_MEM_FREE(arena, file->buffer, file->size);
+ // TODO(doyle): Mem free
+ // PLATFORM_MEM_FREE(arena, file->buffer, file->size);
return -1;
}
diff --git a/src/Renderer.c b/src/Renderer.c
index 74c0b9d..90abc50 100644
--- a/src/Renderer.c
+++ b/src/Renderer.c
@@ -3,8 +3,8 @@
#include "Dengine/Assets.h"
#include "Dengine/Debug.h"
#include "Dengine/Entity.h"
+#include "Dengine/MemoryArena.h"
#include "Dengine/OpenGL.h"
-#include "Dengine/Platform.h"
#include "Dengine/Shader.h"
#include "Dengine/Texture.h"
@@ -301,7 +301,7 @@ void renderer_rect(Renderer *const renderer, Rect camera, v2 pos, v2 size,
addRenderQuadToRenderGroup(renderer, quad, renderTex.tex, color);
}
-void renderer_string(Renderer *const renderer, MemoryArena *arena, Rect camera,
+void renderer_string(Renderer *const renderer, MemoryArena_ *arena, Rect camera,
Font *const font, const char *const string, v2 pos,
v2 pivotPoint, f32 rotate, v4 color)
{
@@ -322,7 +322,7 @@ void renderer_string(Renderer *const renderer, MemoryArena *arena, Rect camera,
i32 numVertexPerQuad = 4;
i32 numVertexesToAlloc = (strLen * (numVertexPerQuad + 2));
Vertex *vertexList =
- PLATFORM_MEM_ALLOC(arena, numVertexesToAlloc, Vertex);
+ memory_pushBytes(arena, numVertexesToAlloc * sizeof(Vertex));
v2 posInCameraSpace = v2_sub(pos, camera.pos);
pos = posInCameraSpace;
@@ -362,8 +362,9 @@ void renderer_string(Renderer *const renderer, MemoryArena *arena, Rect camera,
addVertexToRenderGroup(renderer, tex, color, vertexList,
numVertexesToAlloc);
- PLATFORM_MEM_FREE(arena, vertexList,
- sizeof(Vertex) * numVertexesToAlloc);
+ // TODO(doyle): Mem free
+ // PLATFORM_MEM_FREE(arena, vertexList,
+ // sizeof(Vertex) * numVertexesToAlloc);
}
}
diff --git a/src/String.c b/src/String.c
index 0161f5d..9e63ee6 100644
--- a/src/String.c
+++ b/src/String.c
@@ -1,5 +1,5 @@
#include "Dengine/String.h"
-#include "Dengine/Platform.h"
+#include "Dengine/MemoryArena.h"
/*
* +-------------------------------------+
@@ -51,7 +51,7 @@ i32 string_len(String *const string)
return result;
}
-String *const string_append(MemoryArena *const arena, String *oldString,
+String *const string_append(MemoryArena_ *const arena, String *oldString,
char *appendString, i32 appendLen)
{
@@ -74,7 +74,7 @@ String *const string_append(MemoryArena *const arena, String *oldString,
return newString;
}
-void string_free(MemoryArena *arena, String *string)
+void string_free(MemoryArena_ *arena, String *string)
{
if (!string || !arena) return;
@@ -82,11 +82,14 @@ void string_free(MemoryArena *arena, String *string)
i32 bytesToFree = sizeof(StringHeader) + header->len;
common_memset((u8 *)header, 0, bytesToFree);
- PLATFORM_MEM_FREE(arena, header, bytesToFree);
+
+ // TODO(doyle): Mem free
+ // PLATFORM_MEM_FREE(arena, header, bytesToFree);
+
string = NULL;
}
-String *const string_make(MemoryArena *const arena, char *string)
+String *const string_make(MemoryArena_ *const arena, char *string)
{
if (!arena) return NULL;
@@ -97,7 +100,7 @@ String *const string_make(MemoryArena *const arena, char *string)
return result;
}
-String *const string_makeLen(MemoryArena *const arena, i32 len)
+String *const string_makeLen(MemoryArena_ *const arena, i32 len)
{
if (!arena) return NULL;
@@ -107,7 +110,7 @@ String *const string_makeLen(MemoryArena *const arena, i32 len)
// character. Whilst the len of a string counts up to the last character
// _not_ including null-terminator.
i32 bytesToAllocate = sizeof(StringHeader) + len;
- void *chunk = PLATFORM_MEM_ALLOC(arena, bytesToAllocate, u8);
+ void *chunk = memory_pushBytes(arena, bytesToAllocate * sizeof(u8));
if (!chunk) return NULL;
StringHeader *header = CAST(StringHeader *) chunk;
diff --git a/src/UserInterface.c b/src/UserInterface.c
index be27ca7..382132f 100644
--- a/src/UserInterface.c
+++ b/src/UserInterface.c
@@ -1,16 +1,14 @@
#include "Dengine/UserInterface.h"
#include "Dengine/AssetManager.h"
#include "Dengine/Assets.h"
-#include "Dengine/Renderer.h"
#include "Dengine/Debug.h"
+#include "Dengine/Renderer.h"
-i32 userInterface_button(UiState *const uiState,
- MemoryArena *const arena,
+i32 userInterface_button(UiState *const uiState, MemoryArena_ *const arena,
AssetManager *const assetManager,
- Renderer *const renderer,
- Font *const font,
- const KeyInput input,
- const i32 id, const Rect rect, const char *const label)
+ Renderer *const renderer, Font *const font,
+ const KeyInput input, const i32 id, const Rect rect,
+ const char *const label)
{
if (math_pointInRect(rect, input.mouseP))
{
@@ -251,7 +249,7 @@ i32 userInterface_scrollbar(UiState *const uiState,
return 0;
}
-i32 userInterface_textField(UiState *const uiState, MemoryArena *const arena,
+i32 userInterface_textField(UiState *const uiState, MemoryArena_ *const arena,
AssetManager *const assetManager,
Renderer *const renderer, Font *const font,
KeyInput input, const i32 id, const Rect rect,
@@ -352,7 +350,7 @@ i32 userInterface_textField(UiState *const uiState, MemoryArena *const arena,
return 0;
}
-i32 userInterface_window(UiState *const uiState, MemoryArena *const arena,
+i32 userInterface_window(UiState *const uiState, MemoryArena_ *const arena,
AssetManager *const assetManager,
Renderer *const renderer, Font *const font,
const KeyInput input, WindowState *window)
diff --git a/src/WorldTraveller.c b/src/WorldTraveller.c
index b61d6ff..7b80b0e 100644
--- a/src/WorldTraveller.c
+++ b/src/WorldTraveller.c
@@ -19,7 +19,7 @@ INTERNAL Entity *getHeroEntity(World *world)
return result;
}
-INTERNAL void addGenericMob(EventQueue *eventQueue, MemoryArena *arena,
+INTERNAL void addGenericMob(EventQueue *eventQueue, MemoryArena_ *arena,
AssetManager *assetManager, World *world, v2 pos)
{
#ifdef DENGINE_DEBUG
@@ -39,7 +39,7 @@ INTERNAL void addGenericMob(EventQueue *eventQueue, MemoryArena *arena,
mob->numAudioRenderers = 4;
mob->audioRenderer =
- PLATFORM_MEM_ALLOC(arena, mob->numAudioRenderers, AudioRenderer);
+ memory_pushBytes(arena, mob->numAudioRenderers * sizeof(AudioRenderer));
for (i32 i = 0; i < mob->numAudioRenderers; i++)
mob->audioRenderer[i].sourceIndex = AUDIO_SOURCE_UNASSIGNED;
@@ -104,8 +104,8 @@ INTERNAL void rendererInit(GameState *state, v2 windowSize)
renderer->groupCapacity = 4096;
for (i32 i = 0; i < ARRAY_COUNT(renderer->groups); i++)
{
- renderer->groups[i].vertexList =
- PLATFORM_MEM_ALLOC(&state->arena, renderer->groupCapacity, Vertex);
+ renderer->groups[i].vertexList = memory_pushBytes(
+ &state->arena_, renderer->groupCapacity * sizeof(Vertex));
}
#ifdef DENGINE_DEBUG
@@ -116,27 +116,27 @@ INTERNAL void rendererInit(GameState *state, v2 windowSize)
INTERNAL void assetInit(GameState *state)
{
AssetManager *assetManager = &state->assetManager;
- MemoryArena *arena = &state->arena;
+ MemoryArena_ *arena = &state->arena_;
i32 audioEntries = 32;
assetManager->audio.size = audioEntries;
assetManager->audio.entries =
- PLATFORM_MEM_ALLOC(arena, audioEntries, HashTableEntry);
+ memory_pushBytes(arena, audioEntries * sizeof(HashTableEntry));
i32 texAtlasEntries = 8;
assetManager->texAtlas.size = texAtlasEntries;
assetManager->texAtlas.entries =
- PLATFORM_MEM_ALLOC(arena, texAtlasEntries, HashTableEntry);
+ memory_pushBytes(arena, texAtlasEntries * sizeof(HashTableEntry));
i32 texEntries = 32;
assetManager->textures.size = texEntries;
assetManager->textures.entries =
- PLATFORM_MEM_ALLOC(arena, texEntries, HashTableEntry);
+ memory_pushBytes(arena, texEntries * sizeof(HashTableEntry));
i32 animEntries = 1024;
assetManager->anims.size = animEntries;
assetManager->anims.entries =
- PLATFORM_MEM_ALLOC(arena, animEntries, HashTableEntry);
+ memory_pushBytes(arena, animEntries * sizeof(HashTableEntry));
/* Create empty 1x1 4bpp black texture */
u32 bitmap = (0xFF << 24) | (0xFF << 16) | (0xFF << 8) | (0xFF << 0);
@@ -438,7 +438,7 @@ INTERNAL void assetInit(GameState *state)
/* Load sound */
- i32 before = arena->bytesAllocated;
+ i32 before = arena->used;
char *sfxListPath = "data/audio/sfx/sfx.txt";
PlatformFileRead sfxList = {0};
@@ -459,7 +459,7 @@ INTERNAL void assetInit(GameState *state)
{
i32 actualStrLen = common_strlen(string) + 1;
sfxAudioNames[sfxAudioIndex] =
- PLATFORM_MEM_ALLOC(arena, actualStrLen, char);
+ memory_pushBytes(arena, actualStrLen * sizeof(char));
common_strncpy(sfxAudioNames[sfxAudioIndex++], string,
actualStrLen);
@@ -490,7 +490,8 @@ INTERNAL void assetInit(GameState *state)
i32 sfxNameLen = common_strlen(sfxName);
i32 sfxFullPathLen = sfxDirLen + sfxExtensionLen + sfxNameLen + 1;
- char *sfxFullPath = PLATFORM_MEM_ALLOC(arena, sfxFullPathLen, char);
+ char *sfxFullPath =
+ memory_pushBytes(arena, sfxFullPathLen * sizeof(char));
common_strncat(sfxFullPath, sfxDir, sfxDirLen);
common_strncat(sfxFullPath, sfxName, sfxNameLen);
@@ -503,11 +504,13 @@ INTERNAL void assetInit(GameState *state)
// character, having to remember to +1 on allocation AND freeing since
// strlen only counts until null char is going to leave memory leaks
// everywhere
- PLATFORM_MEM_FREE(arena, sfxName, sfxNameLen * sizeof(char) + 1);
- PLATFORM_MEM_FREE(arena, sfxFullPath, sfxFullPathLen * sizeof(char));
+ // TODO(doyle): Free mem
+ // PLATFORM_MEM_FREE(arena, sfxName, sfxNameLen * sizeof(char) + 1);
+ // PLATFORM_MEM_FREE(arena, sfxFullPath, sfxFullPathLen * sizeof(char));
}
- platform_closeFileRead(arena, &sfxList);
+ // TODO(doyle): Free mem
+ // platform_closeFileRead(arena, &sfxList);
char *audioPath =
"data/audio/Motoi Sakuraba - Stab the sword of justice.ogg";
@@ -525,7 +528,7 @@ INTERNAL void assetInit(GameState *state)
INTERNAL void entityInit(GameState *state, v2 windowSize)
{
AssetManager *assetManager = &state->assetManager;
- MemoryArena *arena = &state->arena;
+ MemoryArena_ *arena = &state->arena_;
/* Init world */
const i32 targetWorldWidth = 100 * METERS_TO_PIXEL;
@@ -544,9 +547,10 @@ INTERNAL void entityInit(GameState *state, v2 windowSize)
{
World *const world = &state->world[i];
world->maxEntities = 16384;
- world->entities = PLATFORM_MEM_ALLOC(arena, world->maxEntities, Entity);
+ world->entities =
+ memory_pushBytes(arena, world->maxEntities * sizeof(Entity));
world->entityIdInBattle =
- PLATFORM_MEM_ALLOC(arena, world->maxEntities, i32);
+ memory_pushBytes(arena, world->maxEntities * sizeof(i32));
world->numEntitiesInBattle = 0;
world->bounds =
math_getRect(V2(0, 0), v2_scale(worldDimensionInTiles,
@@ -600,8 +604,8 @@ INTERNAL void entityInit(GameState *state, v2 windowSize)
world->soundscape = soundscape;
soundscape->numAudioRenderers = 1;
- soundscape->audioRenderer =
- PLATFORM_MEM_ALLOC(arena, soundscape->numAudioRenderers, AudioRenderer);
+ soundscape->audioRenderer = memory_pushBytes(
+ arena, soundscape->numAudioRenderers * sizeof(AudioRenderer));
for (i32 i = 0; i < soundscape->numAudioRenderers; i++)
soundscape->audioRenderer[i].sourceIndex = AUDIO_SOURCE_UNASSIGNED;
@@ -626,8 +630,8 @@ INTERNAL void entityInit(GameState *state, v2 windowSize)
hero->stats->weapon = heroWeapon;
hero->numAudioRenderers = 4;
- hero->audioRenderer =
- PLATFORM_MEM_ALLOC(arena, hero->numAudioRenderers, AudioRenderer);
+ hero->audioRenderer = memory_pushBytes(arena, hero->numAudioRenderers *
+ sizeof(AudioRenderer));
for (i32 i = 0; i < hero->numAudioRenderers; i++)
hero->audioRenderer[i].sourceIndex = AUDIO_SOURCE_UNASSIGNED;
@@ -725,7 +729,7 @@ INTERNAL v2 getPosRelativeToRect(Rect rect, v2 offset,
return result;
}
-INTERNAL void unitTest(MemoryArena *arena)
+INTERNAL void unitTest(MemoryArena_ *arena)
{
ASSERT(common_atoi("-2", common_strlen("-2")) == -2);
ASSERT(common_atoi("100", common_strlen("100")) == 100);
@@ -738,7 +742,7 @@ INTERNAL void unitTest(MemoryArena *arena)
ASSERT(common_atoi("+ 32", common_strlen("+ 32")) == 0);
asset_unitTest(arena);
- i32 memBefore = arena->bytesAllocated;
+ i32 memBefore = arena->used;
String *hello = string_make(arena, "hello, ");
String *world = string_make(arena, "world");
ASSERT(string_len(hello) == 7);
@@ -758,18 +762,23 @@ INTERNAL void unitTest(MemoryArena *arena)
string_free(arena, hello);
string_free(arena, world);
- i32 memAfter = arena->bytesAllocated;
-
- ASSERT(memBefore == memAfter);
+ i32 memAfter = arena->used;
}
// TODO(doyle): Remove and implement own random generator!
#include
#include
-void worldTraveller_gameInit(GameState *state, v2 windowSize)
+void worldTraveller_gameInit(GameState *state, v2 windowSize, Memory *memory)
{
+ state->memory = memory;
+ memory_arenaInit(&state->arena_, memory->persistent,
+ memory->persistentSize);
+
+ memory_arenaInit(&state->transientArena, memory->transient,
+ memory->transientSize);
+
#ifdef DENGINE_DEBUG
- unitTest(&state->arena);
+ unitTest(&state->arena_);
#endif
i32 result = audio_init(&state->audioManager);
@@ -1157,7 +1166,7 @@ typedef struct AttackSpec
i32 damage;
} AttackSpec;
-INTERNAL void beginAttack(AssetManager *assetManager, MemoryArena *arena,
+INTERNAL void beginAttack(AssetManager *assetManager, MemoryArena_ *arena,
EventQueue *eventQueue, World *world,
Entity *attacker)
{
@@ -1308,7 +1317,7 @@ INTERNAL void beginAttack(AssetManager *assetManager, MemoryArena *arena,
// TODO(doyle): MemArena here is temporary until we incorporate AttackSpec to
// battle in general!
-INTERNAL void endAttack(MemoryArena *arena, EventQueue *eventQueue,
+INTERNAL void endAttack(MemoryArena_ *arena, EventQueue *eventQueue,
World *world, Entity *attacker)
{
#ifdef DENGINE_DEBUG
@@ -1336,7 +1345,7 @@ INTERNAL void endAttack(MemoryArena *arena, EventQueue *eventQueue,
case entityattack_claudeEnergySword:
attacker->stats->health += 80;
- AttackSpec *attackSpec = PLATFORM_MEM_ALLOC(arena, 1, AttackSpec);
+ AttackSpec *attackSpec = MEMORY_PUSH_STRUCT(arena, AttackSpec);
attackSpec->attacker = attacker;
attackSpec->defender = attacker;
attackSpec->damage = 30;
@@ -1389,7 +1398,7 @@ INTERNAL void endAttack(MemoryArena *arena, EventQueue *eventQueue,
{
i32 damage = 25;
- AttackSpec *attackSpec = PLATFORM_MEM_ALLOC(arena, 1, AttackSpec);
+ AttackSpec *attackSpec = MEMORY_PUSH_STRUCT(arena, AttackSpec);
attackSpec->attacker = attacker;
attackSpec->defender = defender;
attackSpec->damage = damage;
@@ -1606,12 +1615,16 @@ void worldTraveller_gameUpdateAndRender(GameState *state, f32 dt)
if (dt >= 1.0f) dt = 1.0f;
GL_CHECK_ERROR();
- AssetManager *assetManager = &state->assetManager;
- Renderer *renderer = &state->renderer;
- World *const world = &state->world[state->currWorldIndex];
- Font *font = &assetManager->font;
- MemoryArena *arena = &state->arena;
- EventQueue *eventQueue = &state->eventQueue;
+ memory_arenaInit(&state->transientArena, state->memory->transient,
+ state->memory->transientSize);
+
+ AssetManager *assetManager = &state->assetManager;
+ Renderer *renderer = &state->renderer;
+ World *const world = &state->world[state->currWorldIndex];
+ Font *font = &assetManager->font;
+ MemoryArena_ *arena = &state->arena_;
+ MemoryArena_ *transientArena = &state->transientArena;
+ EventQueue *eventQueue = &state->eventQueue;
/*
**********************
@@ -1691,7 +1704,7 @@ void worldTraveller_gameUpdateAndRender(GameState *state, f32 dt)
v2 pos =
V2(renderer->size.w - (renderer->size.w / xModifier), yPos);
- addGenericMob(eventQueue, &state->arena, &state->assetManager, world, pos);
+ addGenericMob(eventQueue, &state->arena_, &state->assetManager, world, pos);
}
}
@@ -2050,7 +2063,7 @@ void worldTraveller_gameUpdateAndRender(GameState *state, f32 dt)
}
/* Launch up attack animation */
- beginAttack(assetManager, &state->arena, eventQueue, world,
+ beginAttack(assetManager, &state->arena_, eventQueue, world,
entity);
}
}
@@ -2062,7 +2075,7 @@ void worldTraveller_gameUpdateAndRender(GameState *state, f32 dt)
if (stats->busyDuration <= 0)
{
/* Apply attack damage */
- endAttack(&state->arena, eventQueue, world, entity);
+ endAttack(transientArena, eventQueue, world, entity);
}
}
}
@@ -2074,7 +2087,7 @@ void worldTraveller_gameUpdateAndRender(GameState *state, f32 dt)
*/
for (i32 i = 0; i < entity->numAudioRenderers; i++)
{
- audio_updateAndPlay(&state->arena, &state->audioManager,
+ audio_updateAndPlay(&state->arena_, &state->audioManager,
&entity->audioRenderer[i]);
}
@@ -2227,8 +2240,6 @@ void worldTraveller_gameUpdateAndRender(GameState *state, f32 dt)
break;
}
}
-
- PLATFORM_MEM_FREE(&state->arena, attackSpec, sizeof(AttackSpec));
break;
}
// NOTE(doyle): We delete dead entities at the end of the update
@@ -2244,10 +2255,10 @@ void worldTraveller_gameUpdateAndRender(GameState *state, f32 dt)
Entity *entity = (CAST(Entity *) event.data);
for (i32 i = 0; i < entity->numAudioRenderers; i++)
{
- audio_stopVorbis(&state->arena, audioManager,
+ audio_stopVorbis(&state->arena_, audioManager,
&entity->audioRenderer[i]);
}
- entity_clearData(&state->arena, world, entity);
+ entity_clearData(&state->arena_, world, entity);
numDeadEntities++;
for (i32 i = 0; i < entity->numChilds; i++)
@@ -2257,10 +2268,10 @@ void worldTraveller_gameUpdateAndRender(GameState *state, f32 dt)
{
for (i32 i = 0; i < child->numAudioRenderers; i++)
{
- audio_stopVorbis(&state->arena, audioManager,
+ audio_stopVorbis(&state->arena_, audioManager,
&child->audioRenderer[i]);
}
- entity_clearData(&state->arena, world, child);
+ entity_clearData(&state->arena_, world, child);
numDeadEntities++;
}
else
@@ -2332,7 +2343,7 @@ void worldTraveller_gameUpdateAndRender(GameState *state, f32 dt)
// TODO(doyle): Incorporate UI into entity list or it's own list
// with a rendering lifetime value
- renderer_string(renderer, &state->arena, camera, font,
+ renderer_string(renderer, transientArena, camera, font,
damageString, damagePos, V2(0, 0), 0,
V4(1, 1, 1, lifetime));
}
@@ -2351,14 +2362,14 @@ void worldTraveller_gameUpdateAndRender(GameState *state, f32 dt)
if (state->config.showStatMenu)
{
WindowState *statWindow = &state->uiState.statWindow;
- userInterface_window(&state->uiState, &state->arena, assetManager,
+ userInterface_window(&state->uiState, transientArena, assetManager,
renderer, font, state->input, statWindow);
}
/* Draw debug window */
WindowState *debugWindow = &state->uiState.debugWindow;
i32 activeId =
- userInterface_window(&state->uiState, &state->arena, assetManager,
+ userInterface_window(&state->uiState, transientArena, assetManager,
renderer, font, state->input, debugWindow);
// TODO(doyle): Name lookup to user interface id
@@ -2408,10 +2419,10 @@ void worldTraveller_gameUpdateAndRender(GameState *state, f32 dt)
CAST(f32)(font->maxSize.w * common_strlen(heroAvatarStr));
v2 strPos =
V2(heroAvatarP.x, heroAvatarP.y - (0.5f * heroAvatarRect.rect.size.h));
- renderer_staticString(&state->renderer, &state->arena, font, heroAvatarStr,
+ renderer_staticString(&state->renderer, transientArena, font, heroAvatarStr,
strPos, V2(0, 0), 0, V4(0, 0, 1, 1));
- renderer_staticString(&state->renderer, &state->arena, font, heroAvatarStr,
+ renderer_staticString(&state->renderer, transientArena, font, heroAvatarStr,
strPos, V2(0, 0), 0, V4(0, 0, 1, 1));
for (i32 i = 0; i < world->maxEntities; i++)
diff --git a/src/dengine.c b/src/dengine.c
index 10aff3e..a276c8f 100644
--- a/src/dengine.c
+++ b/src/dengine.c
@@ -160,11 +160,22 @@ i32 main(void)
* INITIALISE GAME
*******************
*/
+ Memory memory = {0};
+
+ size_t persistentSize = MEGABYTES(128);
+ size_t transientSize = MEGABYTES(128);
+
+ memory.persistentSize = persistentSize;
+ memory.persistent = PLATFORM_MEM_ALLOC_(NULL, persistentSize, u8);
+
+ memory.transientSize = transientSize;
+ memory.transient = PLATFORM_MEM_ALLOC_(NULL, transientSize, u8);
+
GameState worldTraveller = {0};
worldTraveller_gameInit(&worldTraveller,
- V2i(frameBufferWidth, frameBufferHeight));
+ V2i(frameBufferWidth, frameBufferHeight), &memory);
#ifdef DENGINE_DEBUG
- debug_init(&worldTraveller.arena, V2i(windowWidth, windowHeight),
+ debug_init(&worldTraveller.arena_, V2i(windowWidth, windowHeight),
worldTraveller.assetManager.font);
#endif
diff --git a/src/include/Dengine/AssetManager.h b/src/include/Dengine/AssetManager.h
index 41dc01a..12b3636 100644
--- a/src/include/Dengine/AssetManager.h
+++ b/src/include/Dengine/AssetManager.h
@@ -6,7 +6,7 @@
#include "Dengine/Texture.h"
/* Forward declaration */
-typedef struct MemoryArena MemoryArena;
+typedef struct MemoryArena MemoryArena_;
typedef struct PlatformFileRead PlatformFileRead;
typedef struct AssetManager
@@ -32,13 +32,13 @@ const SubTexture asset_getAtlasSubTex(TexAtlas *const atlas,
const char *const key);
Texture *asset_getTex(AssetManager *const assetManager, const char *const key);
TexAtlas *asset_getFreeTexAtlasSlot(AssetManager *const assetManager,
- MemoryArena *arena, const char *const key,
+ MemoryArena_ *arena, const char *const key,
i32 numSubTex);
TexAtlas *asset_getTexAtlas(AssetManager *const assetManager,
const char *const key);
Texture *asset_getFreeTexSlot(AssetManager *const assetManager,
- MemoryArena *const arena, const char *const key);
-Texture *asset_loadTextureImage(AssetManager *assetManager, MemoryArena *arena,
+ MemoryArena_ *const arena, const char *const key);
+Texture *asset_loadTextureImage(AssetManager *assetManager, MemoryArena_ *arena,
const char *const path, const char *const key);
/*
@@ -47,7 +47,7 @@ Texture *asset_loadTextureImage(AssetManager *assetManager, MemoryArena *arena,
*********************************
*/
void asset_addAnimation(AssetManager *const assetManager,
- MemoryArena *const arena, const char *const animName,
+ MemoryArena_ *const arena, const char *const animName,
TexAtlas *const atlas, char **const subTextureNames,
const i32 numSubTextures, const f32 frameDuration);
Animation *asset_getAnim(AssetManager *const assetManager,
@@ -60,7 +60,7 @@ Animation *asset_getAnim(AssetManager *const assetManager,
*/
AudioVorbis *const asset_getVorbis(AssetManager *const assetManager,
const char *const key);
-const i32 asset_loadVorbis(AssetManager *assetManager, MemoryArena *arena,
+const i32 asset_loadVorbis(AssetManager *assetManager, MemoryArena_ *arena,
const char *const path, const char *const key);
/*
@@ -69,20 +69,20 @@ const i32 asset_loadVorbis(AssetManager *assetManager, MemoryArena *arena,
*********************************
*/
const i32 asset_loadXmlFile(AssetManager *const assetManager,
- MemoryArena *const arena,
+ MemoryArena_ *const arena,
const PlatformFileRead *const fileRead);
Shader *const asset_getShader(AssetManager *assetManager, const enum ShaderList type);
-const i32 asset_loadShaderFiles(AssetManager *assetManager, MemoryArena *arena,
+const i32 asset_loadShaderFiles(AssetManager *assetManager, MemoryArena_ *arena,
const char *const vertexPath,
const char *const fragmentPath,
const enum ShaderList type);
-const i32 asset_loadTTFont(AssetManager *assetManager, MemoryArena *arena,
+const i32 asset_loadTTFont(AssetManager *assetManager, MemoryArena_ *arena,
const char *filePath);
const v2 asset_stringDimInPixels(const Font *const font,
const char *const string);
-void asset_unitTest(MemoryArena *arena);
+void asset_unitTest(MemoryArena_ *arena);
#endif
diff --git a/src/include/Dengine/Audio.h b/src/include/Dengine/Audio.h
index 3256b4d..f5fa0d7 100644
--- a/src/include/Dengine/Audio.h
+++ b/src/include/Dengine/Audio.h
@@ -6,7 +6,7 @@
#include "Dengine/Common.h"
/* Forward Declaration */
-typedef struct MemoryArena MemoryArena;
+typedef struct MemoryArena MemoryArena_;
#define AUDIO_NO_FREE_SOURCE -1
typedef struct AudioSourceEntry
@@ -49,18 +49,18 @@ typedef struct AudioRenderer
const i32 audio_init(AudioManager *audioManager);
-const i32 audio_playVorbis(MemoryArena *arena, AudioManager *audioManager,
+const i32 audio_playVorbis(MemoryArena_ *arena, AudioManager *audioManager,
AudioRenderer *audioRenderer, AudioVorbis *vorbis,
i32 numPlays);
-const i32 audio_streamPlayVorbis(MemoryArena *arena, AudioManager *audioManager,
+const i32 audio_streamPlayVorbis(MemoryArena_ *arena, AudioManager *audioManager,
AudioRenderer *audioRenderer,
AudioVorbis *vorbis, i32 numPlays);
-const i32 audio_stopVorbis(MemoryArena *arena, AudioManager *audioManager,
+const i32 audio_stopVorbis(MemoryArena_ *arena, AudioManager *audioManager,
AudioRenderer *audioRenderer);
const i32 audio_pauseVorbis(AudioManager *audioManager,
AudioRenderer *audioRenderer);
const i32 audio_resumeVorbis(AudioManager *audioManager,
AudioRenderer *audioRenderer);
-const i32 audio_updateAndPlay(MemoryArena *arena, AudioManager *audioManager,
+const i32 audio_updateAndPlay(MemoryArena_ *arena, AudioManager *audioManager,
AudioRenderer *audioRenderer);
#endif
diff --git a/src/include/Dengine/Common.h b/src/include/Dengine/Common.h
index 141e26c..5281a5c 100644
--- a/src/include/Dengine/Common.h
+++ b/src/include/Dengine/Common.h
@@ -26,6 +26,10 @@ typedef double f64;
#define ASSERT(expr) if (!(expr)) { *(int *)0 = 0; }
#define IS_EVEN(value) (((value) & 1) == 0)
+#define KILOBYTES(val) (val * 1024)
+#define MEGABYTES(val) ((KILOBYTES(val)) * 1024)
+#define GIGABYTES(val) ((MEGABYTES(val)) * 1024)
+
#define DENGINE_DEBUG
i32 common_strlen(const char *const string);
diff --git a/src/include/Dengine/Debug.h b/src/include/Dengine/Debug.h
index ac52e18..7c88e29 100644
--- a/src/include/Dengine/Debug.h
+++ b/src/include/Dengine/Debug.h
@@ -7,7 +7,7 @@
/* Forward Declaration */
typedef struct GameState GameState;
-typedef struct MemoryArena MemoryArena;
+typedef struct MemoryArena MemoryArena_;
#define INVALID_CODE_PATH 0
enum DebugCount
@@ -20,7 +20,7 @@ enum DebugCount
debugcount_num,
};
-void debug_init(MemoryArena *arena, v2 windowSize, Font font);
+void debug_init(MemoryArena_ *arena, v2 windowSize, Font font);
#define DEBUG_RECURSIVE_PRINT_XML_TREE(sig) debug_recursivePrintXmlTree(sig, 1)
void debug_recursivePrintXmlTree(XmlNode *root, i32 levelsDeep);
diff --git a/src/include/Dengine/Entity.h b/src/include/Dengine/Entity.h
index 123e34d..842d488 100644
--- a/src/include/Dengine/Entity.h
+++ b/src/include/Dengine/Entity.h
@@ -7,7 +7,7 @@
typedef struct AssetManager AssetManager;
typedef struct AudioRenderer AudioRenderer;
-typedef struct MemoryArena MemoryArena;
+typedef struct MemoryArena MemoryArena_;
typedef struct World World;
typedef struct EventQueue EventQueue;
@@ -135,12 +135,12 @@ void entity_updateAnim(EventQueue *eventQueue, Entity *const entity,
const f32 dt);
void entity_addAnim(AssetManager *const assetManager, Entity *const entity,
const char *const animName);
-Entity *const entity_add(MemoryArena *const arena, World *const world,
+Entity *const entity_add(MemoryArena_ *const arena, World *const world,
const v2 pos, const v2 size, const f32 scale,
const enum EntityType type,
const enum Direction direction, Texture *const tex,
const b32 collides);
-void entity_clearData(MemoryArena *const arena, World *const world,
+void entity_clearData(MemoryArena_ *const arena, World *const world,
Entity *const entity);
Entity *entity_get(World *const world, const i32 entityId);
i32 entity_getIndex(World *const world, const i32 entityId);
diff --git a/src/include/Dengine/MemoryArena.h b/src/include/Dengine/MemoryArena.h
index 255249b..17f60cd 100644
--- a/src/include/Dengine/MemoryArena.h
+++ b/src/include/Dengine/MemoryArena.h
@@ -3,9 +3,35 @@
#include "Dengine/Common.h"
-struct MemoryArena
+typedef struct MemoryArena
{
- i32 bytesAllocated;
-};
+ size_t size;
+ size_t used;
+ u8 *base;
+} MemoryArena_;
+
+typedef struct Memory
+{
+ void *persistent;
+ size_t persistentSize;
+
+ void *transient;
+ size_t transientSize;
+
+ b32 init;
+} Memory;
+
+#define MEMORY_PUSH_STRUCT(arena, type) (type *)memory_pushBytes(arena, sizeof(type))
+#define MEMORY_PUSH_ARRAY(arena, count, type) (type *)memory_pushBytes(arena, (count)*sizeof(type))
+inline void *memory_pushBytes(MemoryArena_ *arena, size_t size)
+{
+ ASSERT((arena->used + size) <= arena->size);
+ void *result = arena->base + arena->used;
+ arena->used += size;
+
+ return result;
+}
+
+void memory_arenaInit(MemoryArena_ *arena, void *base, size_t size);
#endif
diff --git a/src/include/Dengine/Platform.h b/src/include/Dengine/Platform.h
index 5366bd0..01e2eb6 100644
--- a/src/include/Dengine/Platform.h
+++ b/src/include/Dengine/Platform.h
@@ -5,7 +5,7 @@
#include "Dengine/Math.h"
/* Forward Declaration */
-typedef struct MemoryArena MemoryArena;
+typedef struct MemoryArena MemoryArena_;
// TODO(doyle): Revise key code system -- should we store the extraneous keys or
// have a mapping function to map it back to ascii?
@@ -140,17 +140,17 @@ typedef struct PlatformFileRead
} PlatformFileRead;
// TODO(doyle): Create own custom memory allocator
-#define PLATFORM_MEM_FREE(arena, ptr, bytes) platform_memoryFree(arena, CAST(void *) ptr, bytes)
+#define PLATFORM_MEM_FREE_(arena, ptr, bytes) platform_memoryFree(arena, CAST(void *) ptr, bytes)
// TODO(doyle): numBytes in mem free is temporary until we create custom
// allocator since we haven't put in a system to track memory usage per
// allocation
-void platform_memoryFree(MemoryArena *arena, void *data, i32 numBytes);
+void platform_memoryFree(MemoryArena_ *arena, void *data, i32 numBytes);
-#define PLATFORM_MEM_ALLOC(arena, num, type) CAST(type *) platform_memoryAlloc(arena, num * sizeof(type))
-void *platform_memoryAlloc(MemoryArena *arena, i32 numBytes);
+#define PLATFORM_MEM_ALLOC_(arena, num, type) CAST(type *) platform_memoryAlloc(arena, num * sizeof(type))
+void *platform_memoryAlloc(MemoryArena_ *arena, i32 numBytes);
-void platform_closeFileRead(MemoryArena *arena, PlatformFileRead *file);
-i32 platform_readFileToBuffer(MemoryArena *arena, const char *const filePath,
+void platform_closeFileRead(MemoryArena_ *arena, PlatformFileRead *file);
+i32 platform_readFileToBuffer(MemoryArena_ *arena, const char *const filePath,
PlatformFileRead *file);
#endif
diff --git a/src/include/Dengine/Renderer.h b/src/include/Dengine/Renderer.h
index 71b4196..aad3dee 100644
--- a/src/include/Dengine/Renderer.h
+++ b/src/include/Dengine/Renderer.h
@@ -8,7 +8,7 @@
typedef struct AssetManager AssetManager;
typedef struct Entity Entity;
typedef struct Font Font;
-typedef struct MemoryArena MemoryArena;
+typedef struct MemoryArena MemoryArena_;
typedef struct Shader Shader;
typedef struct Texture Texture;
@@ -68,12 +68,12 @@ inline void renderer_staticRect(Renderer *const renderer, v2 pos, v2 size,
renderTex, color);
}
-void renderer_string(Renderer *const renderer, MemoryArena *arena,
+void renderer_string(Renderer *const renderer, MemoryArena_ *arena,
Rect camera, Font *const font,
const char *const string, v2 pos, v2 pivotPoint,
f32 rotate, v4 color);
-inline void renderer_staticString(Renderer *const renderer, MemoryArena *arena,
+inline void renderer_staticString(Renderer *const renderer, MemoryArena_ *arena,
Font *const font, const char *const string,
v2 pos, v2 pivotPoint, f32 rotate, v4 color)
{
diff --git a/src/include/Dengine/String.h b/src/include/Dengine/String.h
index 07f1c17..8671745 100644
--- a/src/include/Dengine/String.h
+++ b/src/include/Dengine/String.h
@@ -3,15 +3,14 @@
#include "Dengine/Common.h"
-typedef struct MemoryArena MemoryArena;
-
+typedef struct MemoryArena MemoryArena_;
typedef char String;
i32 string_len(String *const string);
-String *const string_append(MemoryArena *const arena, String *oldString,
+String *const string_append(MemoryArena_ *const arena, String *oldString,
String *appendString, i32 appendLen);
-void string_free(MemoryArena *arena, String *string);
-String *const string_make(MemoryArena *const arena, char *string);
-String *const string_makeLen(MemoryArena *const arena, i32 len);
+void string_free(MemoryArena_ *arena, String *string);
+String *const string_make(MemoryArena_ *const arena, char *string);
+String *const string_makeLen(MemoryArena_ *const arena, i32 len);
#endif
diff --git a/src/include/Dengine/UserInterface.h b/src/include/Dengine/UserInterface.h
index 7fe36a7..e469514 100644
--- a/src/include/Dengine/UserInterface.h
+++ b/src/include/Dengine/UserInterface.h
@@ -8,7 +8,7 @@
/* Forward Declaration */
typedef struct AssetManager AssetManager;
typedef struct Font Font;
-typedef struct MemoryArena MemoryArena;
+typedef struct MemoryArena MemoryArena_;
typedef struct Renderer Renderer;
enum UiType
@@ -76,17 +76,13 @@ inline i32 userInterface_generateId(UiState *const uiState)
return result;
}
-i32 userInterface_button(UiState *const uiState,
- MemoryArena *const arena,
+i32 userInterface_button(UiState *const uiState, MemoryArena_ *const arena,
AssetManager *const assetManager,
- Renderer *const renderer,
- Font *const font,
- const KeyInput input,
- const i32 id, const Rect rect,
+ Renderer *const renderer, Font *const font,
+ const KeyInput input, const i32 id, const Rect rect,
const char *const label);
-i32 userInterface_textField(UiState *const uiState,
- MemoryArena *const arena,
+i32 userInterface_textField(UiState *const uiState, MemoryArena_ *const arena,
AssetManager *const assetManager,
Renderer *const renderer, Font *const font,
KeyInput input, const i32 id, const Rect rect,
@@ -98,7 +94,7 @@ i32 userInterface_scrollbar(UiState *const uiState,
const i32 id, const Rect scrollBarRect,
i32 *const value, const i32 maxValue);
-i32 userInterface_window(UiState *const uiState, MemoryArena *const arena,
+i32 userInterface_window(UiState *const uiState, MemoryArena_ *const arena,
AssetManager *const assetManager,
Renderer *const renderer, Font *const font,
const KeyInput input, WindowState *window);
diff --git a/src/include/Dengine/WorldTraveller.h b/src/include/Dengine/WorldTraveller.h
index 308346d..7f38bfc 100644
--- a/src/include/Dengine/WorldTraveller.h
+++ b/src/include/Dengine/WorldTraveller.h
@@ -81,6 +81,10 @@ typedef struct World
typedef struct GameState
{
+ Memory *memory;
+ MemoryArena_ arena_;
+ MemoryArena_ transientArena;
+
enum State state;
KeyInput input;
v2 mouse;
@@ -94,12 +98,11 @@ typedef struct GameState
AssetManager assetManager;
AudioManager audioManager;
Config config;
- MemoryArena arena;
UiState uiState;
EventQueue eventQueue;
} GameState;
-void worldTraveller_gameInit(GameState *state, v2 windowSize);
+void worldTraveller_gameInit(GameState *state, v2 windowSize, Memory *memory);
void worldTraveller_gameUpdateAndRender(GameState *state, f32 dt);
void worldTraveller_registerEvent(EventQueue *eventQueue, enum EventType type,
void *data);