diff --git a/examples/1-window.md b/examples/1-window.md index f717735..f32ff7f 100644 --- a/examples/1-window.md +++ b/examples/1-window.md @@ -1,7 +1,6 @@ # Empty window ```c -#include #include #include #include @@ -11,29 +10,22 @@ #include int main(void) { - SkrState state = SkrInit(&(SkrWindow){ - .Title = "Hello SKR", - .Width = 800, - .Height = 600, - }); + SkrState state = SkrInit( + &(SkrWindow){ + .Title = "Hello SKR", + .Width = 800, + .Height = 600, + }, + SKR_BACKEND_API_GL); - if (!SKR_OK) { - fprintf(stderr, "Failed to init window: %s\n", SKR_LAST_ERROR); - return 1; - } + glewInit(); - if (glewInit() != GLEW_OK) { - fprintf(stderr, "Failed to init GLEW\n"); - return 1; - } + SkrTriangle(&state); - // SkrTriangle(&state); - - while (!SkrWindowShouldClose(state.Window)) { + while (!SkrShouldClose(&state)) { SkrRendererRender(&state); } - SkrFinalize(&state); return 0; } ``` diff --git a/skr/skr.h b/skr/skr.h index f161569..7a54395 100644 --- a/skr/skr.h +++ b/skr/skr.h @@ -509,6 +509,8 @@ typedef struct SkrState { } Backend; } SkrState; +static bool m_skr_renderer_initialized = false; + /** * @internal * @brief Set the last error message with source metadata. @@ -1048,12 +1050,31 @@ static inline void m_skr_gl_renderer_finalize(SkrState* s) { glUseProgram(0); } +static inline void m_skr_renderer_finalize(SkrState* s) { + if (s->Backend.GL) { + m_skr_gl_renderer_finalize(s); + + if (s->Window->Backend.Type == SKR_BACKEND_WINDOW_GLFW) { + glfwTerminate(); + } + } + + s->Models = NULL; + s->ModelCount = 0; + s->Window = NULL; +} + /** * @internal * @brief GLFW check if a GLFW window should close. */ -static inline int m_skr_gl_glfw_should_close(SkrWindow* w) { - return glfwWindowShouldClose(w->Backend.Handler.GLFW); +static inline int m_skr_gl_glfw_should_close(SkrState* s) { + if (glfwWindowShouldClose(s->Window->Backend.Handler.GLFW)) { + m_skr_renderer_finalize(s); + return 1; + } + + return 0; } /** @@ -1177,9 +1198,9 @@ static inline SkrState SkrInit(SkrWindow* w, int backend) { return s; } -static inline int SkrWindowShouldClose(SkrWindow* w) { +static inline int SkrShouldClose(SkrState* s) { if (SKR_BACKEND_WINDOW == SKR_BACKEND_WINDOW_GLFW) { - return m_skr_gl_glfw_should_close(w); + return m_skr_gl_glfw_should_close(s); } return 0; @@ -1239,7 +1260,7 @@ static inline void m_skr_gl_renderer_init(SkrState* s) { } } -static inline void SkrRendererInit(SkrState* s) { +static inline void m_skr_renderer_init(SkrState* s) { if (!s) return; @@ -1251,6 +1272,11 @@ static inline void SkrRendererRender(SkrState* s) { if (!s || !s->Window) return; + if (!m_skr_renderer_initialized) { + m_skr_gl_renderer_init(s); + m_skr_renderer_initialized = true; + } + if (SKR_BACKEND_WINDOW == SKR_BACKEND_WINDOW_GLFW) { if (s->Backend.GL) { m_skr_gl_glfw_renderer_render(s); @@ -1258,20 +1284,6 @@ static inline void SkrRendererRender(SkrState* s) { } } -static inline void SkrFinalize(SkrState* s) { - if (s->Backend.GL) { - m_skr_gl_renderer_finalize(s); - - if (s->Window->Backend.Type == SKR_BACKEND_WINDOW_GLFW) { - glfwTerminate(); - } - } - - s->Models = NULL; - s->ModelCount = 0; - s->Window = NULL; -} - static inline void m_skr_gl_triangle(SkrState* s) { static const char* triangle_vert = "#version 330 core\n"