|
|
|
@ -48,9 +48,7 @@ struct RenderState |
|
|
|
transforms* xforms; // NOTE: would be part of camera in libTangerine
|
|
|
|
transforms* xforms; // NOTE: would be part of camera in libTangerine
|
|
|
|
SDLHandles* handles; |
|
|
|
SDLHandles* handles; |
|
|
|
GLContext* gl_ctx; |
|
|
|
GLContext* gl_ctx; |
|
|
|
|
|
|
|
Assets assets; |
|
|
|
MemoryArena* asset_arena; |
|
|
|
|
|
|
|
Assets* assets; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
MemoryArena* rg_arena; |
|
|
|
MemoryArena* rg_arena; |
|
|
|
u32 num_render_groups; |
|
|
|
u32 num_render_groups; |
|
|
|
@ -139,10 +137,10 @@ rotateEntity(Entity* e, glm::vec3 axis, float radians) |
|
|
|
model* |
|
|
|
model* |
|
|
|
getModelByPath(RenderState* rs, const char* filepath) |
|
|
|
getModelByPath(RenderState* rs, const char* filepath) |
|
|
|
{ |
|
|
|
{ |
|
|
|
model* mdl = assetGetCachedModel(rs->assets, utilFNV64a_str(filepath)); |
|
|
|
model* mdl = assetGetCachedModel(&rs->assets, utilFNV64a_str(filepath)); |
|
|
|
|
|
|
|
|
|
|
|
if (!mdl) |
|
|
|
if (!mdl) |
|
|
|
mdl = assetLoadFromFile(rs->assets, rs->asset_arena, filepath); |
|
|
|
mdl = assetLoadFromFile(&rs->assets, rs->assets.arena, filepath); |
|
|
|
|
|
|
|
|
|
|
|
return mdl; |
|
|
|
return mdl; |
|
|
|
} |
|
|
|
} |
|
|
|
@ -157,21 +155,7 @@ getFreeRenderGroup(RenderState* rs) |
|
|
|
return nullptr; |
|
|
|
return nullptr; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
#define DEFAULT_MODEL_COUNT 256 |
|
|
|
|
|
|
|
#define DEFAULT_TEXTURE_COUNT 64 |
|
|
|
#define DEFAULT_TEXTURE_COUNT 64 |
|
|
|
Assets* |
|
|
|
|
|
|
|
initAssets(MemoryArena* arena, |
|
|
|
|
|
|
|
u32 num_models = DEFAULT_MODEL_COUNT, |
|
|
|
|
|
|
|
u32 num_textures = DEFAULT_TEXTURE_COUNT) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
Assets* assets = ARENA_ALLOC(arena, Assets, 1); |
|
|
|
|
|
|
|
assets->max_models = num_models; |
|
|
|
|
|
|
|
assets->models = ARENA_ALLOC(arena, model, num_models); |
|
|
|
|
|
|
|
assets->max_textures = num_textures; |
|
|
|
|
|
|
|
assets->textures = ARENA_ALLOC(arena, util_image, num_textures); |
|
|
|
|
|
|
|
return assets; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define DEFAULT_SHADER_COUNT 64 |
|
|
|
#define DEFAULT_SHADER_COUNT 64 |
|
|
|
#define DEFAULT_UBO_COUNT 32 |
|
|
|
#define DEFAULT_UBO_COUNT 32 |
|
|
|
GLContext* |
|
|
|
GLContext* |
|
|
|
@ -188,23 +172,29 @@ initGLContext(MemoryArena* arena) |
|
|
|
return gl_ctx; |
|
|
|
return gl_ctx; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define DEFAULT_MODEL_COUNT 256 |
|
|
|
#define DEFAULT_RENDER_GROUP_COUNT 256 |
|
|
|
#define DEFAULT_RENDER_GROUP_COUNT 256 |
|
|
|
RenderState* |
|
|
|
RenderState* |
|
|
|
initRenderState() |
|
|
|
initRenderState(u32 max_models = DEFAULT_MODEL_COUNT, |
|
|
|
|
|
|
|
u32 max_textures = DEFAULT_TEXTURE_COUNT) |
|
|
|
{ |
|
|
|
{ |
|
|
|
RenderState* rs = UTIL_ALLOC(1, RenderState); |
|
|
|
RenderState* rs = UTIL_ALLOC(1, RenderState); |
|
|
|
|
|
|
|
|
|
|
|
if (rs) { |
|
|
|
if (rs) { |
|
|
|
rs->asset_arena = arenaInit(DEFAULT_ARENA_SIZE); |
|
|
|
rs->assets.arena = arenaInit(DEFAULT_ARENA_SIZE); |
|
|
|
rs->assets = initAssets(rs->asset_arena); |
|
|
|
rs->assets.max_models = max_models; |
|
|
|
|
|
|
|
rs->assets.models = ARENA_ALLOC(rs->assets.arena, model, max_models); |
|
|
|
|
|
|
|
rs->assets.max_textures = max_textures; |
|
|
|
|
|
|
|
rs->assets.textures = |
|
|
|
|
|
|
|
ARENA_ALLOC(rs->assets.arena, util_image, max_textures); |
|
|
|
|
|
|
|
|
|
|
|
rs->rg_arena = arenaInit(DEFAULT_ARENA_SIZE); |
|
|
|
rs->rg_arena = arenaInit(DEFAULT_ARENA_SIZE); |
|
|
|
rs->max_render_groups = DEFAULT_RENDER_GROUP_COUNT; |
|
|
|
rs->max_render_groups = DEFAULT_RENDER_GROUP_COUNT; |
|
|
|
rs->render_groups = ARENA_ALLOC(rs->rg_arena, RenderGroup, |
|
|
|
rs->render_groups = ARENA_ALLOC(rs->rg_arena, RenderGroup, |
|
|
|
DEFAULT_RENDER_GROUP_COUNT); |
|
|
|
DEFAULT_RENDER_GROUP_COUNT); |
|
|
|
|
|
|
|
|
|
|
|
rs->gl_ctx = initGLContext(rs->asset_arena); |
|
|
|
rs->gl_ctx = initGLContext(rs->assets.arena); |
|
|
|
rs->xforms = ARENA_ALLOC(rs->asset_arena, transforms, 1); |
|
|
|
rs->xforms = ARENA_ALLOC(rs->assets.arena, transforms, 1); |
|
|
|
rs->handles = UTIL_ALLOC(1, SDLHandles); |
|
|
|
rs->handles = UTIL_ALLOC(1, SDLHandles); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ -215,7 +205,7 @@ void |
|
|
|
freeRenderState(RenderState*& rs) |
|
|
|
freeRenderState(RenderState*& rs) |
|
|
|
{ |
|
|
|
{ |
|
|
|
if (rs) { |
|
|
|
if (rs) { |
|
|
|
arenaFree(rs->asset_arena); |
|
|
|
arenaFree(rs->assets.arena); |
|
|
|
utilSafeFree(rs->handles); |
|
|
|
utilSafeFree(rs->handles); |
|
|
|
utilSafeFree(rs); |
|
|
|
utilSafeFree(rs); |
|
|
|
rs = nullptr; |
|
|
|
rs = nullptr; |
|
|
|
@ -279,7 +269,7 @@ initGraphics(SDLHandles* handles) |
|
|
|
bool |
|
|
|
bool |
|
|
|
addShaders(RenderState* rs) |
|
|
|
addShaders(RenderState* rs) |
|
|
|
{ |
|
|
|
{ |
|
|
|
if (!addShaderProgram(rs->asset_arena, |
|
|
|
if (!addShaderProgram(rs->assets.arena, |
|
|
|
rs->gl_ctx, |
|
|
|
rs->gl_ctx, |
|
|
|
"../data/shader.vert", |
|
|
|
"../data/shader.vert", |
|
|
|
"../data/shader.frag", |
|
|
|
"../data/shader.frag", |
|
|
|
@ -289,7 +279,7 @@ addShaders(RenderState* rs) |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (!addShaderProgram(rs->asset_arena, |
|
|
|
if (!addShaderProgram(rs->assets.arena, |
|
|
|
rs->gl_ctx, |
|
|
|
rs->gl_ctx, |
|
|
|
"../data/colored_vertices.vert", |
|
|
|
"../data/colored_vertices.vert", |
|
|
|
"../data/colored_vertices.frag", |
|
|
|
"../data/colored_vertices.frag", |
|
|
|
@ -299,7 +289,7 @@ addShaders(RenderState* rs) |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (!addShaderProgram(rs->asset_arena, |
|
|
|
if (!addShaderProgram(rs->assets.arena, |
|
|
|
rs->gl_ctx, |
|
|
|
rs->gl_ctx, |
|
|
|
"../data/debug.vert", |
|
|
|
"../data/debug.vert", |
|
|
|
"../data/debug.frag", |
|
|
|
"../data/debug.frag", |
|
|
|
@ -439,7 +429,7 @@ main() |
|
|
|
|
|
|
|
|
|
|
|
// FIXME: need to test this with another shader that has another UBO
|
|
|
|
// FIXME: need to test this with another shader that has another UBO
|
|
|
|
gl_buffer& ubo = rs->gl_ctx->uniform_buffers[rs->gl_ctx->num_ubos++]; |
|
|
|
gl_buffer& ubo = rs->gl_ctx->uniform_buffers[rs->gl_ctx->num_ubos++]; |
|
|
|
initTransforms(rs->asset_arena, rs->xforms, &ubo, rs->gl_ctx); |
|
|
|
initTransforms(rs->assets.arena, rs->xforms, &ubo, rs->gl_ctx); |
|
|
|
|
|
|
|
|
|
|
|
if (!addShaders(rs)) { |
|
|
|
if (!addShaders(rs)) { |
|
|
|
LOG(Error) << "error loading shaders\n"; |
|
|
|
LOG(Error) << "error loading shaders\n"; |
|
|
|
|