|
|
|
|
@ -25,12 +25,20 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// forward declarations
|
|
|
|
|
|
|
|
|
|
struct SDL_Handles |
|
|
|
|
{ |
|
|
|
|
SDL_Window *window; |
|
|
|
|
SDL_GLContext glContext; |
|
|
|
|
SDL_DisplayMode currentDisplayMode; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
bool createWindow(const char* title, |
|
|
|
|
SDL_Handles& handles, |
|
|
|
|
SDL_Handles* handles, |
|
|
|
|
glm::vec2& viewport_dims); |
|
|
|
|
bool initContext(SDL_Handles& handles); |
|
|
|
|
bool initContext(SDL_Handles* handles); |
|
|
|
|
bool initGlOptions(); |
|
|
|
|
bool initSDL(SDL_Handles& handles); |
|
|
|
|
bool initSDL(SDL_Handles* handles); |
|
|
|
|
bool initShaders(render_state* rs); |
|
|
|
|
void openglDebugCallback(GLenum source, GLenum type, GLuint id, GLenum severity, |
|
|
|
|
GLsizei length, const GLchar* message, const void* userParam); |
|
|
|
|
@ -43,6 +51,7 @@ render_state*
|
|
|
|
|
renInit(const char* title, glm::vec2 viewport_dims) |
|
|
|
|
{ |
|
|
|
|
render_state* rs = UTIL_ALLOC(1, render_state); |
|
|
|
|
rs->handles = UTIL_ALLOC(1, SDL_Handles); |
|
|
|
|
setDefaults(rs, viewport_dims); |
|
|
|
|
|
|
|
|
|
if (initSDL(rs->handles) && |
|
|
|
|
@ -75,9 +84,10 @@ renShutdown(render_state* rs)
|
|
|
|
|
utilSafeFree(rs->render_groups); |
|
|
|
|
utilSafeFree(rs->default_shader); |
|
|
|
|
meShutdownAssimp(); |
|
|
|
|
SDL_GL_DeleteContext(rs->handles.glContext); |
|
|
|
|
SDL_DestroyWindow(rs->handles.window); |
|
|
|
|
SDL_GL_DeleteContext(rs->handles->glContext); |
|
|
|
|
SDL_DestroyWindow(rs->handles->window); |
|
|
|
|
SDL_Quit(); |
|
|
|
|
utilSafeFree(rs->handles); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
render_group* |
|
|
|
|
@ -112,7 +122,7 @@ renDoRenderLoop(render_state* rs, uint framerate, frame_callback_fn cb_func)
|
|
|
|
|
|
|
|
|
|
if (cb_func != nullptr) cb_func(rs); |
|
|
|
|
renRenderFrame(rs); |
|
|
|
|
SDL_GL_SwapWindow(rs->handles.window); |
|
|
|
|
SDL_GL_SwapWindow(rs->handles->window); |
|
|
|
|
frameTime = SDL_GetTicks() - frameStart; |
|
|
|
|
|
|
|
|
|
if (delay > frameTime) |
|
|
|
|
@ -132,7 +142,7 @@ renRenderFrame(render_state* rs)
|
|
|
|
|
for (uint i = 0; i < rs->render_group_count; i++) { |
|
|
|
|
render_group& rg = rs->render_groups[i]; |
|
|
|
|
|
|
|
|
|
if (rg.shader.type == SIMPLE_SHADER) { |
|
|
|
|
if (rg.shader.shader_type == SIMPLE_SHADER) { |
|
|
|
|
for (uint j = 0; j < rg.entity_count; j++) { |
|
|
|
|
entity& e = rg.entities[j]; |
|
|
|
|
|
|
|
|
|
@ -143,7 +153,8 @@ renRenderFrame(render_state* rs)
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (rg.shader.type == DEFAULT_SHADER) { |
|
|
|
|
#if 0 |
|
|
|
|
if (rg.shader.shader_type == DEFAULT_SHADER) { |
|
|
|
|
for (uint j = 0; j < rg.entity_count; j++) { |
|
|
|
|
entity& e = rg.entities[j]; |
|
|
|
|
|
|
|
|
|
@ -155,6 +166,7 @@ renRenderFrame(render_state* rs)
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -173,13 +185,13 @@ renAddLight(render_state* rs, glm::vec3 pos, glm::vec3 color, float intensity)
|
|
|
|
|
// internal
|
|
|
|
|
|
|
|
|
|
bool |
|
|
|
|
createWindow(const char* title, SDL_Handles& handles, glm::vec2& viewport_dims) |
|
|
|
|
createWindow(const char* title, SDL_Handles* handles, glm::vec2& viewport_dims) |
|
|
|
|
{ |
|
|
|
|
uint display_id = 0; |
|
|
|
|
if (USE_SECOND_MONITOR && SDL_GetNumVideoDisplays() > 1) |
|
|
|
|
display_id = 1; |
|
|
|
|
|
|
|
|
|
handles.window = SDL_CreateWindow( |
|
|
|
|
handles->window = SDL_CreateWindow( |
|
|
|
|
title, |
|
|
|
|
SDL_WINDOWPOS_CENTERED_DISPLAY(display_id), |
|
|
|
|
SDL_WINDOWPOS_CENTERED_DISPLAY(display_id), |
|
|
|
|
@ -188,7 +200,7 @@ createWindow(const char* title, SDL_Handles& handles, glm::vec2& viewport_dims)
|
|
|
|
|
SDL_WINDOW_OPENGL|SDL_WINDOW_RESIZABLE |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
if (!handles.window) { |
|
|
|
|
if (!handles->window) { |
|
|
|
|
LOG(Error) << "Error creating window: " << SDL_GetError() << "\n"; |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
@ -197,11 +209,11 @@ createWindow(const char* title, SDL_Handles& handles, glm::vec2& viewport_dims)
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool |
|
|
|
|
initContext(SDL_Handles& handles) |
|
|
|
|
initContext(SDL_Handles* handles) |
|
|
|
|
{ |
|
|
|
|
handles.glContext = SDL_GL_CreateContext(handles.window); |
|
|
|
|
handles->glContext = SDL_GL_CreateContext(handles->window); |
|
|
|
|
|
|
|
|
|
if (!handles.glContext) { |
|
|
|
|
if (!handles->glContext) { |
|
|
|
|
LOG(Error) << "Error creating glContext: " << SDL_GetError() << "\n"; |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
@ -247,7 +259,7 @@ initGlOptions()
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool |
|
|
|
|
initSDL(SDL_Handles& handles) |
|
|
|
|
initSDL(SDL_Handles* handles) |
|
|
|
|
{ |
|
|
|
|
if (SDL_Init(SDL_INIT_VIDEO) != 0) { |
|
|
|
|
LOG(Error) << "Error, SDL_Init: " << SDL_GetError() << "\n"; |
|
|
|
|
@ -261,7 +273,7 @@ initSDL(SDL_Handles& handles)
|
|
|
|
|
SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8); |
|
|
|
|
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); |
|
|
|
|
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3); |
|
|
|
|
SDL_GetCurrentDisplayMode(0, &handles.currentDisplayMode); |
|
|
|
|
SDL_GetCurrentDisplayMode(0, &handles->currentDisplayMode); |
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|