diff --git a/src/platforms/rcore_android.c b/src/platforms/rcore_android.c index 78abe9ed6..a51519858 100644 --- a/src/platforms/rcore_android.c +++ b/src/platforms/rcore_android.c @@ -1603,4 +1603,15 @@ static int android_close(void *cookie) return 0; } +extern void ProcessSingleFrame(); + +void PlatformRunGameLoop() +{ + while (CORE.Window.updateCallback != NULL) + { + ProcessSingleFrame(); + } +} + + // EOF diff --git a/src/platforms/rcore_desktop_glfw.c b/src/platforms/rcore_desktop_glfw.c index c5d1e3f4c..9d8761316 100644 --- a/src/platforms/rcore_desktop_glfw.c +++ b/src/platforms/rcore_desktop_glfw.c @@ -2249,4 +2249,22 @@ static void JoystickCallback(int jid, int event) # define WIN32_CLIPBOARD_IMPLEMENTATION # include "../external/win32_clipboard.h" #endif + +extern void ProcessSingleFrame(); +#if defined(PLATFORM_WEB) +#include +#endif + +void PlatformRunGameLoop() +{ +#if defined(PLATFORM_WEB) + emscripten_set_main_loop(ProcessSingleFrame, 0, 1); +#else + while (CORE.Window.updateCallback != NULL) + { + ProcessSingleFrame(); + } +#endif +} + // EOF diff --git a/src/platforms/rcore_desktop_rgfw.c b/src/platforms/rcore_desktop_rgfw.c index 211917359..a0447b8ea 100644 --- a/src/platforms/rcore_desktop_rgfw.c +++ b/src/platforms/rcore_desktop_rgfw.c @@ -2100,3 +2100,14 @@ double GetTimeSeconds(void) return currentTime; } + +extern void ProcessSingleFrame(); + +void PlatformRunGameLoop() +{ + while (CORE.Window.updateCallback != NULL) + { + ProcessSingleFrame(); + } +} + diff --git a/src/platforms/rcore_desktop_sdl.c b/src/platforms/rcore_desktop_sdl.c index 8ff17271f..f073336ee 100644 --- a/src/platforms/rcore_desktop_sdl.c +++ b/src/platforms/rcore_desktop_sdl.c @@ -2312,3 +2312,13 @@ static void UpdateTouchPointsSDL(SDL_TouchFingerEvent event) for (int i = CORE.Input.Touch.pointCount; i < MAX_TOUCH_POINTS; i++) CORE.Input.Touch.currentTouchState[i] = 0; } + +extern void ProcessSingleFrame(); + +void PlatformRunGameLoop() +{ + while (CORE.Window.updateCallback != NULL) + { + ProcessSingleFrame(); + } +} diff --git a/src/platforms/rcore_desktop_win32.c b/src/platforms/rcore_desktop_win32.c index ef40caa9e..b7e460834 100644 --- a/src/platforms/rcore_desktop_win32.c +++ b/src/platforms/rcore_desktop_win32.c @@ -2275,3 +2275,14 @@ static bool IsWglExtensionAvailable(HDC hdc, const char *extension) return result; } + +extern void ProcessSingleFrame(); + +void PlatformRunGameLoop() +{ + while (CORE.Window.updateCallback != NULL) + { + ProcessSingleFrame(); + } +} + diff --git a/src/platforms/rcore_drm.c b/src/platforms/rcore_drm.c index 659c80011..097b901a0 100644 --- a/src/platforms/rcore_drm.c +++ b/src/platforms/rcore_drm.c @@ -2732,4 +2732,15 @@ static void SetupFramebuffer(int width, int height) } } +extern void ProcessSingleFrame(); + +void PlatformRunGameLoop() +{ + while (CORE.Window.updateCallback != NULL) + { + ProcessSingleFrame(); + } +} + + // EOF \ No newline at end of file diff --git a/src/platforms/rcore_memory.c b/src/platforms/rcore_memory.c index 14c56a591..0b4be2125 100644 --- a/src/platforms/rcore_memory.c +++ b/src/platforms/rcore_memory.c @@ -592,4 +592,15 @@ static int kbhit(void) } #endif +extern void ProcessSingleFrame(); + +void PlatformRunGameLoop() +{ + while (CORE.Window.updateCallback != NULL) + { + ProcessSingleFrame(); + } +} + + // EOF diff --git a/src/platforms/rcore_template.c b/src/platforms/rcore_template.c index 353d32d11..14ede9905 100644 --- a/src/platforms/rcore_template.c +++ b/src/platforms/rcore_template.c @@ -532,4 +532,14 @@ void ClosePlatform(void) // TODO: De-initialize graphics, inputs and more } +extern void ProcessSingleFrame(); + +void PlatformRunGameLoop() +{ + while (CORE.Window.updateCallback != NULL) + { + ProcessSingleFrame(); + } +} + // EOF diff --git a/src/platforms/rcore_web.c b/src/platforms/rcore_web.c index 9d16c3e87..cf23fcb4a 100644 --- a/src/platforms/rcore_web.c +++ b/src/platforms/rcore_web.c @@ -1946,4 +1946,13 @@ static EM_BOOL EmscriptenVisibilityChangeCallback(int eventType, const Emscripte } //------------------------------------------------------------------------------------------------------- + +void void ProcessSingleFrame(); + +void RunGameLoop(bool(*processFrame)(void)) +{ + emscripten_set_main_loop(ProcessSingleFrame, 0, 1); +} + + // EOF diff --git a/src/rcore.c b/src/rcore.c index 209c4fa53..047c2bb60 100644 --- a/src/rcore.c +++ b/src/rcore.c @@ -739,8 +739,6 @@ void CloseWindow(void) TRACELOG(LOG_INFO, "Window closed successfully"); } -static bool RunLoop = false; - void ProcessSingleFrame(void) { // if the dirty callback rendered this frame, don't double render, skip it until the next frame @@ -751,7 +749,7 @@ void ProcessSingleFrame(void) } BeginDrawing(); - RunLoop = CORE.Window.updateCallback(); + if (!CORE.Window.updateCallback()) CORE.Window.updateCallback = NULL; EndDrawing(); #if SUPPORT_CUSTOM_FRAME_CONTROL @@ -760,23 +758,12 @@ void ProcessSingleFrame(void) #endif } -#if defined(PLATFORM_WEB) -#include -#endif +void PlatformRunGameLoop(); void RunGameLoop(bool(*processFrame)(void)) { - RunLoop = true; CORE.Window.updateCallback = processFrame; - -#if defined(PLATFORM_WEB) - emscripten_set_main_loop(ProcessSingleFrame, 0, 1); -#else - while (RunLoop) - { - ProcessSingleFrame(); - } -#endif + PlatformRunGameLoop(); } // Check if window has been initialized successfully