.
authorksg <ken@mihrtec.com>
Thu, 30 Jun 2016 16:54:08 +0000 (09:54 -0700)
committerksg <ken@mihrtec.com>
Thu, 30 Jun 2016 16:54:08 +0000 (09:54 -0700)
src/Makefile
src/core/main.c
src/core/util.c [deleted file]

index 7cf0c1f..2fb24c9 100644 (file)
@@ -16,19 +16,20 @@ APP_RULES += move
 HTML      := index.html js/the_march.config.js
 CC        := emcc
 EXPORTS   := '_em_main'
 HTML      := index.html js/the_march.config.js
 CC        := emcc
 EXPORTS   := '_em_main'
-EMOPTS    := --separate-asm -s ALLOW_MEMORY_GROWTH=1 -s FORCE_FILESYSTEM=1 --pre-js html/js/pre.js
+EMOPTS    := --verbose --separate-asm -s ALLOW_MEMORY_GROWTH=1 -s FORCE_FILESYSTEM=1 --pre-js html/js/pre.js
 LIBS      += -s USE_SDL=2 -s USE_SDL_TTF=2 -s USE_SDL_IMAGE=2 -s SDL2_IMAGE_FORMATS='["png"]'
 EXEPATH   := ../dist/bin/jasm/js
 EXE       := $(APPNAME).js
 OBJFILE   :=bc
 LIBS      += -s USE_SDL=2 -s USE_SDL_TTF=2 -s USE_SDL_IMAGE=2 -s SDL2_IMAGE_FORMATS='["png"]'
 EXEPATH   := ../dist/bin/jasm/js
 EXE       := $(APPNAME).js
 OBJFILE   :=bc
-EMFLAGS   := $(EMOPTS) $(LIBS) -s EXPORTED_FUNCTIONS="[$(EXPORTS)]"
+EMFLAGS   := $(EMOPTS) -s EXPORTED_FUNCTIONS="[$(EXPORTS)]"
 EMFLAGS   += -I/usr/include/google
 BYPRODUCT := $(APPNAME).asm.js $(APPNAME).js.mem
 else
 #Native Build Environment
 CC        := gcc
 EMFLAGS   += -I/usr/include/google
 BYPRODUCT := $(APPNAME).asm.js $(APPNAME).js.mem
 else
 #Native Build Environment
 CC        := gcc
-LIBS      := -lprotobuf-c
-LIBS      += -lSDL2_ttf -lSDL2_image -lSDL2main -lSDL2 -lopengl32
+CFLAGS    += -v
+#LIBS      := -lprotobuf-c
+LIBS      += -lSDL2_ttf -lSDL2_image -lSDL2main -lSDL2
 EXEPATH   := ../dist/bin/$(shell uname -m)
 #windows mingw build rules
 ifeq ($(OS), Windows_NT)
 EXEPATH   := ../dist/bin/$(shell uname -m)
 #windows mingw build rules
 ifeq ($(OS), Windows_NT)
@@ -84,7 +85,7 @@ dox doc:
 
 #clean up intermediate dependency files and binaries
 clean: $(CLEAN_RULES)
 
 #clean up intermediate dependency files and binaries
 clean: $(CLEAN_RULES)
-       @echo "Cleaning - Recompiling .d (deps) and .$(OBJFILE) (obj)"
+       @echo "Cleaning .d (deps) and .$(OBJFILE) (obj)"
        @rm -f $(EXEPATH)/$(EXE) $(patsubst %,$(EXEPATH)/%, $(BYPRODUCT))
        @rm -f $(patsubst %,%/*.$(OBJFILE), $(MODULES))
        @rm -f $(patsubst %,%/*.d, $(MODULES))
        @rm -f $(EXEPATH)/$(EXE) $(patsubst %,$(EXEPATH)/%, $(BYPRODUCT))
        @rm -f $(patsubst %,%/*.$(OBJFILE), $(MODULES))
        @rm -f $(patsubst %,%/*.d, $(MODULES))
@@ -106,7 +107,7 @@ move: $(HTML)
 
 #new default .o for .c files
 %.bc %.o: %.c %.d
 
 #new default .o for .c files
 %.bc %.o: %.c %.d
-       $(CC) -c $(EMFLAGS) $(CPPFLAGS) $(CFLAGS) $< -o $@
+       $(CC) -c $(EMFLAGS) $(CPPFLAGS) $(CFLAGS) $< -o $@ $(LIBS)
 
 #default for .d dependency files (output from gcc -M)
 %.d: %.c
 
 #default for .d dependency files (output from gcc -M)
 %.d: %.c
index b8a8e12..f067df7 100644 (file)
@@ -3,46 +3,35 @@
   \details initializes necessary subsystems before invoking the preloader,
            which loads initial game data, before finally invoking the
            main loop gameloop(void)
   \details initializes necessary subsystems before invoking the preloader,
            which loads initial game data, before finally invoking the
            main loop gameloop(void)
-  \author  Ken
+  \author  K
   \date    2016
 ------------------------------------------------------------------------------*/
   \date    2016
 ------------------------------------------------------------------------------*/
-#ifdef __Win32
-#include <windows.h>
-#endif
 #ifdef __EMSCRIPTEN__
 #ifdef __EMSCRIPTEN__
+/* Web Environment */
 #define main em_main
 #define main em_main
+#include <SDL_ttf.h>
 #include <emscripten/emscripten.h>
 #else
 #include <emscripten/emscripten.h>
 #else
-#define INFINITE_MAINLOOP
+/* Traditional Environment */
+#ifdef __Win32
+#include <windows.h>
+#endif //__Win32
+#include <SDL2/SDL_ttf.h>
 #endif
 #endif
+/* ENVIRONMENT-AGNOSTIC DEFINES */
 #include <SDL2/SDL.h>
 #include <SDL2/SDL_image.h>
 #include <SDL2/SDL.h>
 #include <SDL2/SDL_image.h>
-#include <SDL_ttf.h>
 #include <stdint.h>
 #include <setjmp.h>
 #include <stdio.h>
 #include <stdint.h>
 #include <setjmp.h>
 #include <stdio.h>
+#define TRIGGERS quit_trigger
+#include <core/trigger.h>
+#include <core/engine.h>
 
 
-/* debug level */
-#define DEBUG 1
+/* private functions */
+static int main_init(void);
 
 
-/* Exit Codes */
-#define EXIT_GRACEFUL 1
-#define EXIT_DEBUG 2
-#define EXIT_PANIC 3
-
-/* Target frames per second */
-#ifndef TARGET_FPS
-#define TARGET_FPS 60
-#endif
-
-/* Target milliseconds per frame */
-#define TARGET_DT (1000 / TARGET_FPS)
-
-/* precompiler round-up division */
-#define DIV_UP(x,y) ((x + (y / 2)) / y)
-
-/* internally exposed functions */
-int  main_init(void);
+/* exposed functions */
 void main_loop(void);
 
 /* unexposed externs *
 void main_loop(void);
 
 /* unexposed externs *
@@ -54,39 +43,31 @@ extern void        state_handle_event(SDL_Event event);
 extern int         io_init(void);
 extern const char* io_get_error(void);
 extern void        io_quit(void);*/
 extern int         io_init(void);
 extern const char* io_get_error(void);
 extern void        io_quit(void);*/
-
-/* Function trigger stack for "unwinding" initialization of modules */
-#define MAX_TRIGGERS 16
-struct call_trigger
-{ int num_funcs;
-  void (*func[MAX_TRIGGERS])(void);
-} quit_trigger = {0};
-
-#define TRIGGER_SET(TARG, FUNC) TARG.func[TARG.num_funcs++] = FUNC
-#define TRIGGER(TARG) while(TARG.num_funcs) (TARG.func[--TARG.num_funcs])()
-
 /* main jump buffer */
 jmp_buf jmp_main;
 
 /* main jump buffer */
 jmp_buf jmp_main;
 
-/** initializes subsystems and calls main_loop(void)
-  @return (exit_status - 1), where a normal shutdown's exit_status = 1.
+/* Main Entry
+
+   initializes subsystems and calls main_loop(void)
 
 
-  main sets a jump buffer for its primary switch, which may be jumped to
-  at any time.  Jumping with a 0 return value is equivalent to calling
-  setjmp directly, which initializes the system and begins the main loop.
-  Jumping with any other value will process one of the directives associated
-  with the exit codes in core.h
+   main sets a jump buffer for its primary switch, which may be jumped to
+   at any time.  Jumping with a 0 return value is equivalent to calling
+   setjmp directly, which initializes the system and begins the main loop.
+   Jumping with any other value will process one of the directives associated
+   with the exit codes in core.h
 *******************************************************************************/
 *******************************************************************************/
-int main (int argc, char** argv)
+#ifdef __EMSCRIPTEN__
+#define main_loop()\
+  emscripten_set_main_loop(main_loop,0,0);\
+  TRIGGER_SET(quit_trigger, emscripten_cancel_main_loop);\
+  return 0;
+int
+main (int argc, char** argv)
 { switch(setjmp(jmp_main))
     { case 0:
         if (main_init())
           return -1;
 { switch(setjmp(jmp_main))
     { case 0:
         if (main_init())
           return -1;
-        main_loop(); /* no return during native execution */
-#ifdef __EMSCRIPTEN__
-        emscripten_set_main_loop(main_loop,0,0);
-        return 0;
-#endif
+        main_loop();
       case EXIT_GRACEFUL:
         break;
       default:
       case EXIT_GRACEFUL:
         break;
       default:
@@ -98,64 +79,59 @@ int main (int argc, char** argv)
   return 0;
 }
 
   return 0;
 }
 
-/** initializer
+#undef main_loop
+#endif //EMSCRIPTEN
+
+/** subsystem initializer
+    Calling main_init() bootstraps 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
   @return 0 if successful, -1 SDL, -2 IMG, -3 TTF, -4 STATE.
   SDL and logging is available after this is called
-*******************************************************************************/
-int main_init()
+ ******************************************************************************/
+#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 SDL_FLAGS SDL_INIT_EVERYTHING & ~(SDL_INIT_TIMER | SDL_INIT_HAPTIC)
+
+static
+int
+main_init()
 { static char bInitialized = 0;
   if (bInitialized++)
 { static char bInitialized = 0;
   if (bInitialized++)
-    { SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "Resetting [%d]\n", bInitialized);
-      return 0;
+    { TRIGGER(quit_trigger);
+      SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "Resetting [%d]\n",
+                  bInitialized);
     }
 
     }
 
-  if (SDL_Init(SDL_INIT_EVERYTHING & ~(SDL_INIT_TIMER | SDL_INIT_HAPTIC)) < 0)
-    { fprintf(stderr, "SDL_Init failed: %s\n", SDL_GetError());
-      return - 1;
-    }
-  TRIGGER_SET(quit_trigger, SDL_Quit);
+  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);
 
 
-  if (IMG_Init(IMG_INIT_PNG) != IMG_INIT_PNG)
-    { fprintf(stderr, "IMG_Init failed: %s\n", IMG_GetError());
-      return -2;
-    }
-  TRIGGER_SET(quit_trigger, IMG_Quit);
+/*TODO:
+  INIT(4, io_init(), io_get_error, io_quit);
+  INIT(5, state_init(), state_get_error, state_quit);
+*/
 
 
-  if (TTF_Init() == -1)
-    { fprintf(stderr, "TTF_Init failed: %s\n", TTF_GetError());
-      return -3;
-    }
-  TRIGGER_SET(quit_trigger, TTF_Quit);
-  /*
-  if (state_init())
-  { printf("state_init failed: %s\n", state_get_error());
-    return -4;
-  }
-  TRIGGER_SET(quit_trigger, state_quit);
-  if (renderer_init())
-  { printf("state_init failed: %s\n", renderer_get_error());
-    return -5;
-  }
-  TRIGGER_SET(quit_trigger, renderer_quit);
-  if (io_init())
-  { printf("io_init failed: %s\n", io_get_error());
-    return -6;
-  }
-  TRIGGER_SET(quit_trigger, io_quit);
-  */
   SDL_Log("Initialization Complete.");
   return 0;
 }
 
 /** main loop.
   SDL_Log("Initialization Complete.");
   return 0;
 }
 
 /** main loop.
-  exits only during core_shutdown and core_panic if in an infinite loop
-*******************************************************************************/
-void main_loop()
+ *******************************************************************************/
+void
+main_loop()
 { static uint32_t main_loop_last_ticks = 0;
 { static uint32_t main_loop_last_ticks = 0;
-  static SDL_Event event;
+  SDL_Event event;
   uint32_t delta_ticks;
   uint32_t delta_ticks;
+
+#ifdef LOOP_YIELD_OPTIONAL
 loop:
 loop:
-  /* Poll events */
+#endif
+  /* Poll events (user/system inputs) */
   while (SDL_PollEvent(&event))
     //state_handle_event(&event);
     ;
   while (SDL_PollEvent(&event))
     //state_handle_event(&event);
     ;
@@ -165,24 +141,25 @@ loop:
 
   /* handle breakpoints (long pause likely a breakpoint) */
   if (delta_ticks > 1000)
 
   /* 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;
-  }
+    { 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 */
 
   /* 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...
+////TODO: state_tick(delta_ticks);
   /* swap in the backbuffer for display */
   /* swap in the backbuffer for display */
-////todo...
+////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) */
 
   /* 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) */
-  printf("%d\n", main_loop_last_ticks);
-#ifdef INFINITE_MAINLOOP
   delta_ticks = SDL_GetTicks() - main_loop_last_ticks;
   if ((delta_ticks + DIV_UP(TARGET_DT, 10)) < TARGET_DT)
     SDL_Delay(TARGET_DT - delta_ticks);
   delta_ticks = SDL_GetTicks() - main_loop_last_ticks;
   if ((delta_ticks + DIV_UP(TARGET_DT, 10)) < TARGET_DT)
     SDL_Delay(TARGET_DT - delta_ticks);
@@ -190,3 +167,4 @@ loop:
   goto loop;
 #endif
 }
   goto loop;
 #endif
 }
+
diff --git a/src/core/util.c b/src/core/util.c
deleted file mode 100644 (file)
index f0c26fc..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-/*!@file
-  \brief   The March Init
-  \details Initialization of subsystems and third party software
-  \author  Ken
-  \date    2016
-  ------------------------------------------------------------------------------*/
-#include <stdio.h>
-#include <unistd.h>
-#include <ctype.h>
-#include <string.h>
-#ifdef __Win32
-#include <windows.h>
-#endif
-#ifdef __EMSCRIPTEN__
-#include <emscripten/emscripten.h>
-#endif
-
-