X-Git-Url: https://www.kengrimes.com/gitweb/?p=henge%2Fwebcc.git;a=blobdiff_plain;f=src%2Fcore%2Fmain.c;h=5e18ac5b49804f247ea114aaf0dada6be8970f2e;hp=6da220172b9dbbcd027a92ef67985f0e32176c71;hb=47ef7f075603faf78809252b03b7d4e99b14e00f;hpb=b339ecf22e987a0d6ac3ddae3511edef47c7869a diff --git a/src/core/main.c b/src/core/main.c index 6da2201..5e18ac5 100644 --- a/src/core/main.c +++ b/src/core/main.c @@ -2,8 +2,9 @@ \brief engine entry \details initializes necessary subsystems before invoking the preloader, which loads initial game data, before finally invoking the - main loop gameloop(void) - \author K + main loop main_loop(void), which may be run in either blocking + or non-blocking mode. + \author Mihrtec \date 2016 ------------------------------------------------------------------------------*/ #ifdef __EMSCRIPTEN__ @@ -27,7 +28,6 @@ #define TRIGGERS quit_trigger #include #include -#include /* exposed functions */ void main_loop(void); @@ -35,15 +35,17 @@ void main_loop(void); /* private functions */ static int main_init(void); -/* unexposed externs * +/* unexposed externs */ extern int state_init(void); extern void state_tick(uint32_t delta_ticks); extern const char* state_get_error(void); extern void state_quit(void); -extern void state_handle_event(SDL_Event event); +extern void state_handle_event(SDL_Event *event); +#if 0 extern int io_init(void); extern const char* io_get_error(void); -extern void io_quit(void);*/ +extern void io_quit(void); +#endif //TODO /* main jump buffer */ jmp_buf jmp_main; @@ -58,20 +60,17 @@ jmp_buf jmp_main; with the exit codes in core.h */ #ifdef __EMSCRIPTEN__ -#define main_loop()\ - emscripten_set_main_loop(main_loop,0,0);\ - TRIGGER_SET(quit_trigger, emscripten_cancel_main_loop);\ - return 0; +#define main_loop() \ + do { \ + emscripten_set_main_loop(main_loop,0,0); \ + TRIGGER_SET(quit_trigger, emscripten_cancel_main_loop); \ + return 0; \ + } while (0) #endif int main (int argc, char** argv) -{ Sha256 shstr = {0}; - wc_InitSha256(&shstr); - - printf("%d %d\n", sizeof(long), sizeof(long long)); - - switch(setjmp(jmp_main)) +{ switch(setjmp(jmp_main)) { case 0: if (main_init()) return -1; @@ -92,37 +91,39 @@ main (int argc, char** argv) #endif /** subsystem initializer - Calling main_init() bootstraps the system, and may be called multiple + Calling main_init() boots the system, and may be called multiple times to cause a system-wide reboot. @return 0 if successful, -1 SDL, -2 IMG, -3 TTF, -4 STATE. SDL and logging is available after this is called ******************************************************************************/ -#define INIT(_subsys_id,_cond,_errorstring,_quit)\ - if (_cond)\ - { fprintf(stderr, #_cond " failed: %s\n", _errorstring());\ - return -_subsys_id;\ - }\ - TRIGGER_SET(quit_trigger, _quit) +#define INIT(_cond,_errorstring,_quit) \ + do { \ + if (_cond) \ + { fprintf(stderr, #_cond " failed: %s\n", _errorstring()); \ + return -1; \ + } \ + TRIGGER_SET(quit_trigger, _quit); \ + } while (0) #define SDL_FLAGS SDL_INIT_EVERYTHING & ~(SDL_INIT_TIMER | SDL_INIT_HAPTIC) -static -int +static int main_init() -{ static char bInitialized = 0; +{ static uint32_t bInitialized = 0; if (bInitialized++) { TRIGGER(quit_trigger); SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "Resetting [%d]\n", bInitialized); } - INIT(1, SDL_Init(SDL_FLAGS) < 0, SDL_GetError, SDL_Quit); - INIT(2, IMG_Init(IMG_INIT_PNG) != IMG_INIT_PNG, IMG_GetError, IMG_Quit); - INIT(3, TTF_Init() == -1, TTF_GetError, TTF_Quit); + INIT(SDL_Init(SDL_FLAGS) < 0, SDL_GetError, SDL_Quit); + INIT(IMG_Init(IMG_INIT_PNG) != IMG_INIT_PNG, IMG_GetError, IMG_Quit); + INIT(TTF_Init() == -1, TTF_GetError, TTF_Quit); + INIT(state_init(), state_get_error, state_quit); /*TODO: - INIT(4, io_init(), io_get_error, io_quit); - INIT(5, state_init(), state_get_error, state_quit); + INIT(io_init(), io_get_error, io_quit); + INIT(render_init(), io_get_error, io_quit); */ SDL_Log("Initialization Complete."); @@ -133,46 +134,37 @@ main_init() *******************************************************************************/ void main_loop() -{ static uint32_t main_loop_last_ticks = 0; +{ static uint32_t state_last_ticks = 0; SDL_Event event; uint32_t delta_ticks; -#ifdef LOOP_YIELD_OPTIONAL +#ifndef NON_BLOCKING_LOOPS loop: #endif - /* Poll events (user/system inputs) */ + /* user/system inputs */ while (SDL_PollEvent(&event)) - //state_handle_event(&event); - ; + state_handle_event(&event); /* change in time since last loop */ - delta_ticks = SDL_GetTicks() - main_loop_last_ticks; - + delta_ticks = SDL_GetTicks() - state_last_ticks; /* handle breakpoints (long pause likely a breakpoint) */ if (delta_ticks > 1000) { SDL_LogWarn(SDL_LOG_CATEGORY_SYSTEM, "Recovering from long pause."); delta_ticks = TARGET_DT; } - - /* tick the state manager forward by the change in time */ - //state_tick(delta_ticks); - main_loop_last_ticks = SDL_GetTicks(); - - /* render the scene to backbuffer */ -////TODO: state_tick(delta_ticks); - /* swap in the backbuffer for display */ -////TODO: state_render(); - -#ifdef LOOP_YIELD_OPTIONAL -#define DIV_UP(x,y) ((x + (y / 2)) / y) - - /* cap the framerate if we're handling the loop mechanism directly, but only - yield if we have a substantial portion of time to yield (1/10th of the - target delta) */ - delta_ticks = SDL_GetTicks() - main_loop_last_ticks; - if ((delta_ticks + DIV_UP(TARGET_DT, 10)) < TARGET_DT) + /* tick the state manager and immediately save the time */ + state_tick(delta_ticks); + state_last_ticks = SDL_GetTicks(); + + //TODO: render(screen) + //TODO: SDL_Flip(screen)::sdl_geterror + +#ifndef NON_BLOCKING_LOOPS +#define DIV_UP(x,y) (((x) + ((y) / 2)) / (x)) + /* yield if we have a substantial portion of time leftover */ + delta_ticks += SDL_GetTicks() - state_last_ticks; + if (delta_ticks < (TARGET_DT - DIV_UP(TARGET_DT, 10))) SDL_Delay(TARGET_DT - delta_ticks); - goto loop; #endif }