Add emscripten
This commit is contained in:
		
							parent
							
								
									68df5326d7
								
							
						
					
					
						commit
						70d5e11719
					
				
					 4 changed files with 189 additions and 39 deletions
				
			
		
							
								
								
									
										95
									
								
								HTMLshell.html
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										95
									
								
								HTMLshell.html
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,95 @@
 | 
			
		|||
<!doctype html>
 | 
			
		||||
 | 
			
		||||
<!--
 | 
			
		||||
  HTML template for the emscripten page. Unlike emscipten's official minimal
 | 
			
		||||
  frontend, this one is really minimal.
 | 
			
		||||
 | 
			
		||||
  by Miloslav Ciz (drummyfish)
 | 
			
		||||
 | 
			
		||||
  Released under CC0 1.0 (https://creativecommons.org/publicdomain/zero/1.0/)
 | 
			
		||||
  plus a waiver of all other intellectual property. The goal of this work is
 | 
			
		||||
  be and remain completely in the public domain forever, available for any use
 | 
			
		||||
  whatsoever.
 | 
			
		||||
-->
 | 
			
		||||
 | 
			
		||||
<html>
 | 
			
		||||
 | 
			
		||||
<head>
 | 
			
		||||
  <meta charset="utf-8">
 | 
			
		||||
  <title>game</title>
 | 
			
		||||
 | 
			
		||||
  <style>
 | 
			
		||||
    table
 | 
			
		||||
    {
 | 
			
		||||
      width: 100%;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    td
 | 
			
		||||
    {
 | 
			
		||||
      width: 11%;
 | 
			
		||||
      padding: 0;
 | 
			
		||||
      margin: 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    button
 | 
			
		||||
    {
 | 
			
		||||
      width: 100%;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    canvas
 | 
			
		||||
    {
 | 
			
		||||
      display: block;
 | 
			
		||||
      margin: 10px auto 30px;
 | 
			
		||||
    }
 | 
			
		||||
  </style>
 | 
			
		||||
</head>
 | 
			
		||||
 | 
			
		||||
<body>
 | 
			
		||||
  <canvas class="emscripten" id="canvas" oncontextmenu="event.preventDefault()" tabindex=-1></canvas>
 | 
			
		||||
  
 | 
			
		||||
  <script type='text/javascript'>
 | 
			
		||||
    Module = {
 | 
			
		||||
      print:
 | 
			
		||||
        function(what) 
 | 
			
		||||
        {
 | 
			
		||||
          console.log(what);
 | 
			
		||||
        },
 | 
			
		||||
      printErr:
 | 
			
		||||
        function(what)
 | 
			
		||||
        {
 | 
			
		||||
          console.error(what);
 | 
			
		||||
        },
 | 
			
		||||
      canvas:
 | 
			
		||||
        (
 | 
			
		||||
          function()
 | 
			
		||||
          {
 | 
			
		||||
            return document.getElementById('canvas');
 | 
			
		||||
          }
 | 
			
		||||
        )(),
 | 
			
		||||
      onRuntimeInitialized: function()
 | 
			
		||||
        {
 | 
			
		||||
          pressFunc = Module.cwrap('webButton','', ['number','number']);
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    function down(button)
 | 
			
		||||
    {
 | 
			
		||||
      pressFunc(button,1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function up(button)
 | 
			
		||||
    {
 | 
			
		||||
      pressFunc(button,0);
 | 
			
		||||
    }
 | 
			
		||||
  </script>
 | 
			
		||||
 | 
			
		||||
  {{{ SCRIPT }}}
 | 
			
		||||
 | 
			
		||||
  <table style="user-select:none; -moz-user-select: none; -ms-user-select:none; -webkit-user-select: none; -o-user-select:none;" onselectstart="return false;" unselectable="on">
 | 
			
		||||
    <tr> <td></td> <td><button onmousedown="down(0)" ontouchstart="down(0)" onmouseup="up(0)" ontouchend="up(0)" onmouseout="up(0)" ontouchleave="(0)">U</button></td> <td></td> <td></td> <td><button onmousedown="down(4)" ontouchstart="down(4)" onmouseup="up(4)" ontouchend="up(4)" onmouseout="up(4)" ontouchleave="(4)">A</button></td> <td></td> <td></td> </tr>
 | 
			
		||||
    <tr> <td><button onmousedown="down(3)" ontouchstart="down(3)" onmouseup="up(3)" ontouchend="up(3)" onmouseout="up(3)" ontouchleave="(3)">L</button></td> <td></td> <td><button onmousedown="down(1)" ontouchstart="down(1)" onmouseup="up(1)" ontouchend="up(1)" onmouseout="up(1)" ontouchleave="(1)">R</button></td> <td></td> <td></td> <td><button onmousedown="down(5)" ontouchstart="down(5)" onmouseup="up(5)" ontouchend="up(5)" onmouseout="up(5)" ontouchleave="(5)">B</button></td> <td></td> </tr>
 | 
			
		||||
    <tr> <td></td> <td><button onmousedown="down(2)" ontouchstart="down(2)" onmouseup="up(2)" ontouchend="up(2)" onmouseout="up(2)" ontouchleave="(2)">D</button></td> <td></td> <td></td> <td></td> <td></td> <td></td> </tr>
 | 
			
		||||
  </table>
 | 
			
		||||
 | 
			
		||||
</body>
 | 
			
		||||
</html>
 | 
			
		||||
							
								
								
									
										1
									
								
								TODO.txt
									
										
									
									
									
								
							
							
						
						
									
										1
									
								
								TODO.txt
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -2,6 +2,7 @@ fuck issue trackers :D
 | 
			
		|||
 | 
			
		||||
=========== GENERAL ==============
 | 
			
		||||
 | 
			
		||||
- 640x480 with resolution subdiv has bad sized menu item highlight
 | 
			
		||||
- LOD blocks in lower res look too small
 | 
			
		||||
- hitting ramps at higher speed still often bugs, try to fiddle with physics
 | 
			
		||||
  again (reshape iterations, tension, ...)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										116
									
								
								frontend_sdl.c
									
										
									
									
									
								
							
							
						
						
									
										116
									
								
								frontend_sdl.c
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -11,6 +11,15 @@
 | 
			
		|||
 | 
			
		||||
#define LCR_FPS_GET_MS SDL_GetTicks() // uncomment for FPS measuring
 | 
			
		||||
 | 
			
		||||
#ifdef __EMSCRIPTEN__
 | 
			
		||||
  #define LCR_SETTING_RESOLUTION_X 640
 | 
			
		||||
  #define LCR_SETTING_RESOLUTION_Y 480
 | 
			
		||||
  #define LCR_SETTING_MUSIC 0
 | 
			
		||||
  #define LCR_SETTING_CAR_SHADOW 0
 | 
			
		||||
  #define LCR_SETTING_TEXTURE_SUBSAMPLE 4
 | 
			
		||||
  #define LCR_SETTING_RESOLUTION_SUBDIVIDE 2
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include "game.h"
 | 
			
		||||
 | 
			
		||||
SDL_Window *window;
 | 
			
		||||
| 
						 | 
				
			
			@ -18,6 +27,8 @@ SDL_Renderer *renderer;
 | 
			
		|||
SDL_Texture *texture;
 | 
			
		||||
SDL_Surface *screenSurface;
 | 
			
		||||
 | 
			
		||||
uint8_t running = 1, fullscreen = 1;
 | 
			
		||||
 | 
			
		||||
#if LCR_SETTING_332_COLOR
 | 
			
		||||
uint8_t
 | 
			
		||||
#else
 | 
			
		||||
| 
						 | 
				
			
			@ -30,6 +41,9 @@ FILE *dataFile = 0;
 | 
			
		|||
 | 
			
		||||
char LCR_getNextDataFileChar(void)
 | 
			
		||||
{
 | 
			
		||||
#ifdef __EMSCRIPTEN__
 | 
			
		||||
  return 0;
 | 
			
		||||
#else
 | 
			
		||||
  if (!dataFile)
 | 
			
		||||
    return 0;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -42,10 +56,12 @@ char LCR_getNextDataFileChar(void)
 | 
			
		|||
  }
 | 
			
		||||
 | 
			
		||||
  return c;
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void LCR_appendDataStr(const char *str)
 | 
			
		||||
{
 | 
			
		||||
#ifndef __EMSCRIPTEN__
 | 
			
		||||
  if (!dataFile)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -68,6 +84,9 @@ void LCR_appendDataStr(const char *str)
 | 
			
		|||
      dataFile = fopen(DATA_FILE_NAME,"r");
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
#else
 | 
			
		||||
  printf("%s",str);
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void audioFillCallback(void *userdata, uint8_t *s, int l)
 | 
			
		||||
| 
						 | 
				
			
			@ -116,11 +135,26 @@ uint8_t LCR_keyPressed(uint8_t key)
 | 
			
		|||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#ifdef __EMSCRIPTEN__
 | 
			
		||||
typedef void (*em_callback_func)(void);
 | 
			
		||||
void emscripten_set_main_loop(
 | 
			
		||||
  em_callback_func func, int fps, int simulate_infinite_loop);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
void LCR_sleep(uint16_t timeMs)
 | 
			
		||||
{
 | 
			
		||||
#ifndef __EMSCRIPTEN__
 | 
			
		||||
  SDL_Delay(timeMs);
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#ifdef __EMSCRIPTEN__
 | 
			
		||||
void webButton(uint8_t key, uint8_t down) // HTML button pressed
 | 
			
		||||
{
 | 
			
		||||
  // TODO
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
void LCR_drawPixel(unsigned long index, uint16_t color)
 | 
			
		||||
{
 | 
			
		||||
  screen[index] = color;
 | 
			
		||||
| 
						 | 
				
			
			@ -140,10 +174,36 @@ void printHelp(void)
 | 
			
		|||
    LCR_ARG_HELP_STR);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void mainLoopIteration(void)
 | 
			
		||||
{
 | 
			
		||||
  SDL_Event event;
 | 
			
		||||
 | 
			
		||||
  running = 1;
 | 
			
		||||
 | 
			
		||||
  while (SDL_PollEvent(&event))
 | 
			
		||||
    if (event.type == SDL_QUIT)
 | 
			
		||||
      running = 0;
 | 
			
		||||
 | 
			
		||||
  keyboardState = SDL_GetKeyboardState(NULL);
 | 
			
		||||
 | 
			
		||||
  running &= LCR_gameStep(SDL_GetTicks());
 | 
			
		||||
 | 
			
		||||
  SDL_UpdateTexture(texture,NULL,screen,
 | 
			
		||||
    LCR_SETTING_RESOLUTION_X * sizeof(
 | 
			
		||||
#if LCR_SETTING_332_COLOR
 | 
			
		||||
    uint8_t
 | 
			
		||||
#else
 | 
			
		||||
    uint16_t
 | 
			
		||||
#endif
 | 
			
		||||
    ));
 | 
			
		||||
 | 
			
		||||
  SDL_RenderClear(renderer);
 | 
			
		||||
  SDL_RenderCopy(renderer,texture,NULL,NULL);
 | 
			
		||||
  SDL_RenderPresent(renderer);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int main(int argc, char *argv[])
 | 
			
		||||
{
 | 
			
		||||
  uint8_t running = 1, fullscreen = 1;
 | 
			
		||||
 | 
			
		||||
  for (int i = 0; i < argc; ++i)
 | 
			
		||||
    if (argv[i][0] == '-')
 | 
			
		||||
      switch (argv[i][1])
 | 
			
		||||
| 
						 | 
				
			
			@ -160,11 +220,20 @@ int main(int argc, char *argv[])
 | 
			
		|||
        default: break;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
#ifdef __EMSCRIPTEN__
 | 
			
		||||
  fullscreen = 0;
 | 
			
		||||
#else
 | 
			
		||||
  dataFile = fopen(DATA_FILE_NAME,"r");
 | 
			
		||||
 | 
			
		||||
  if (!dataFile)
 | 
			
		||||
    LCR_log("couldn't open data file");
 | 
			
		||||
 | 
			
		||||
  musicFile = fopen("assets/music","rb");
 | 
			
		||||
 | 
			
		||||
  if (!musicFile)
 | 
			
		||||
    fputs("could not open music file",stderr);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  LCR_log("initializing game");
 | 
			
		||||
  LCR_gameInit(argc,(const char **) argv);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -175,21 +244,21 @@ int main(int argc, char *argv[])
 | 
			
		|||
  SDL_AudioSpec audioSpec;
 | 
			
		||||
  SDL_memset(&audioSpec,0,sizeof(audioSpec));
 | 
			
		||||
  audioSpec.callback = audioFillCallback;
 | 
			
		||||
  audioSpec.channels = 1;
 | 
			
		||||
  audioSpec.freq = 8000;
 | 
			
		||||
  audioSpec.format = AUDIO_U8;
 | 
			
		||||
  audioSpec.channels = 1;
 | 
			
		||||
 | 
			
		||||
#ifdef __EMSCRIPTEN__
 | 
			
		||||
  audioSpec.samples = 1024;
 | 
			
		||||
#else
 | 
			
		||||
  audioSpec.samples = 64;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  if (SDL_OpenAudio(&audioSpec,NULL) < 0)
 | 
			
		||||
    fputs("could not initialize audio",stderr);
 | 
			
		||||
 | 
			
		||||
  SDL_PauseAudio(0);
 | 
			
		||||
 | 
			
		||||
  musicFile = fopen("assets/music","rb");
 | 
			
		||||
 | 
			
		||||
  if (!musicFile)
 | 
			
		||||
    fputs("could not open music file",stderr);
 | 
			
		||||
 | 
			
		||||
  window =
 | 
			
		||||
    SDL_CreateWindow("Licar", SDL_WINDOWPOS_UNDEFINED,
 | 
			
		||||
    SDL_WINDOWPOS_UNDEFINED, LCR_SETTING_RESOLUTION_X, LCR_SETTING_RESOLUTION_Y,
 | 
			
		||||
| 
						 | 
				
			
			@ -237,41 +306,22 @@ int main(int argc, char *argv[])
 | 
			
		|||
 | 
			
		||||
  LCR_log("starting game loop");
 | 
			
		||||
 | 
			
		||||
  while (running)
 | 
			
		||||
  {
 | 
			
		||||
    SDL_Event event;
 | 
			
		||||
 | 
			
		||||
    running = 1;
 | 
			
		||||
 | 
			
		||||
    while (SDL_PollEvent(&event))
 | 
			
		||||
      if (event.type == SDL_QUIT)
 | 
			
		||||
        running = 0;
 | 
			
		||||
 | 
			
		||||
    keyboardState = SDL_GetKeyboardState(NULL);
 | 
			
		||||
 | 
			
		||||
    running &= LCR_gameStep(SDL_GetTicks());
 | 
			
		||||
 | 
			
		||||
    SDL_UpdateTexture(texture,NULL,screen,
 | 
			
		||||
      LCR_SETTING_RESOLUTION_X * sizeof(
 | 
			
		||||
#if LCR_SETTING_332_COLOR
 | 
			
		||||
      uint8_t
 | 
			
		||||
#ifdef __EMSCRIPTEN__
 | 
			
		||||
  emscripten_set_main_loop(mainLoopIteration,0,1);
 | 
			
		||||
#else
 | 
			
		||||
      uint16_t
 | 
			
		||||
  while (running)
 | 
			
		||||
    mainLoopIteration();
 | 
			
		||||
#endif
 | 
			
		||||
      ));
 | 
			
		||||
 | 
			
		||||
    SDL_RenderClear(renderer);
 | 
			
		||||
    SDL_RenderCopy(renderer,texture,NULL,NULL);
 | 
			
		||||
    SDL_RenderPresent(renderer);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  LCR_log("ending");
 | 
			
		||||
 | 
			
		||||
  if (musicFile)
 | 
			
		||||
    fclose(musicFile);
 | 
			
		||||
 | 
			
		||||
#ifndef __EMSCRIPTEN__
 | 
			
		||||
  if (dataFile)
 | 
			
		||||
    fclose(dataFile);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  SDL_PauseAudio(1);
 | 
			
		||||
  SDL_CloseAudio();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										12
									
								
								make.sh
									
										
									
									
									
								
							
							
						
						
									
										12
									
								
								make.sh
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -35,10 +35,14 @@ if [ $PLATFORM = "sdl" ]; then
 | 
			
		|||
  # - SDL2 (dev) package
 | 
			
		||||
 | 
			
		||||
  SDL_FLAGS=`sdl2-config --cflags --libs`
 | 
			
		||||
  COMMAND="${COMPILER} ${C_FLAGS} frontend_sdl.c -I/usr/local/include ${SDL_FLAGS}"
 | 
			
		||||
  ${COMPILER} ${C_FLAGS} frontend_sdl.c -I/usr/local/include ${SDL_FLAGS}
 | 
			
		||||
elif [ $PLATFORM = "emscripten" ]; then
 | 
			
		||||
  # emscripten (browser Javascript) build, requires:
 | 
			
		||||
  # - emscripten
 | 
			
		||||
#  COMMAND="../emsdk/upstream/emscripten/emcc ./frontend_sdl.c -s USE_SDL=2 -O3 -lopenal --shell-file HTMLshell.html -o licar.html -s EXPORTED_FUNCTIONS=\'[\"_main\",\"_webButton\"]\' -s EXPORTED_RUNTIME_METHODS=\'[\"ccall\",\"cwrap\"]\'"
 | 
			
		||||
  ../emsdk/upstream/emscripten/emcc ./frontend_sdl.c -s USE_SDL=2 -O3 -lopenal --shell-file HTMLshell.html -o licar.html -s EXPORTED_FUNCTIONS='["_main","_webButton"]' -s EXPORTED_RUNTIME_METHODS='["ccall","cwrap"]'
 | 
			
		||||
else
 | 
			
		||||
  echo "unknown frontend"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
echo ${COMMAND}
 | 
			
		||||
${COMMAND}
 | 
			
		||||
 | 
			
		||||
echo "done"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue