#include #include "asset/asset_cache.h" #include "core/core_impl.h" #include "renderer/imm_renderer_impl.h" #include "renderer/renderer_impl.h" #include "scene/scene_memory.h" #include #include #include typedef struct Gfx { AssetCache asset_cache; GfxCore gfxcore; Renderer renderer; ImmRenderer imm_renderer; } Gfx; Gfx* gfx_init(void) { Gfx* gfx = calloc(1, sizeof(Gfx)); if (!gfx) { return 0; } gfx_init_gfxcore(&gfx->gfxcore); if (!renderer_make(&gfx->renderer, &gfx->gfxcore)) { gfx_destroy(&gfx); return 0; } if (!imm_renderer_make(&gfx->imm_renderer, &gfx->gfxcore)) { // TODO: Add error logs to the initialization failure cases here and inside // the renderers. gfx_destroy(&gfx); return 0; } gfx_init_asset_cache(&gfx->asset_cache); scene_mem_init(); return gfx; } void gfx_destroy(Gfx** gfx) { if (!gfx) { return; } scene_mem_destroy(); gfx_destroy_asset_cache(&(*gfx)->asset_cache); renderer_destroy(&(*gfx)->renderer); imm_renderer_destroy(&(*gfx)->imm_renderer); gfx_del_gfxcore(&(*gfx)->gfxcore); free(*gfx); *gfx = 0; } GfxCore* gfx_get_core(Gfx* gfx) { assert(gfx); return &gfx->gfxcore; } Renderer* gfx_get_renderer(Gfx* gfx) { assert(gfx); return &gfx->renderer; } ImmRenderer* gfx_get_imm_renderer(Gfx* gfx) { assert(gfx); return &gfx->imm_renderer; } AssetCache* gfx_get_asset_cache(Gfx* gfx) { assert(gfx); return &gfx->asset_cache; }