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 ==============
|
=========== GENERAL ==============
|
||||||
|
|
||||||
|
- 640x480 with resolution subdiv has bad sized menu item highlight
|
||||||
- LOD blocks in lower res look too small
|
- LOD blocks in lower res look too small
|
||||||
- hitting ramps at higher speed still often bugs, try to fiddle with physics
|
- hitting ramps at higher speed still often bugs, try to fiddle with physics
|
||||||
again (reshape iterations, tension, ...)
|
again (reshape iterations, tension, ...)
|
||||||
|
|
120
frontend_sdl.c
120
frontend_sdl.c
|
@ -11,6 +11,15 @@
|
||||||
|
|
||||||
#define LCR_FPS_GET_MS SDL_GetTicks() // uncomment for FPS measuring
|
#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"
|
#include "game.h"
|
||||||
|
|
||||||
SDL_Window *window;
|
SDL_Window *window;
|
||||||
|
@ -18,6 +27,8 @@ SDL_Renderer *renderer;
|
||||||
SDL_Texture *texture;
|
SDL_Texture *texture;
|
||||||
SDL_Surface *screenSurface;
|
SDL_Surface *screenSurface;
|
||||||
|
|
||||||
|
uint8_t running = 1, fullscreen = 1;
|
||||||
|
|
||||||
#if LCR_SETTING_332_COLOR
|
#if LCR_SETTING_332_COLOR
|
||||||
uint8_t
|
uint8_t
|
||||||
#else
|
#else
|
||||||
|
@ -30,6 +41,9 @@ FILE *dataFile = 0;
|
||||||
|
|
||||||
char LCR_getNextDataFileChar(void)
|
char LCR_getNextDataFileChar(void)
|
||||||
{
|
{
|
||||||
|
#ifdef __EMSCRIPTEN__
|
||||||
|
return 0;
|
||||||
|
#else
|
||||||
if (!dataFile)
|
if (!dataFile)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
@ -42,10 +56,12 @@ char LCR_getNextDataFileChar(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
return c;
|
return c;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void LCR_appendDataStr(const char *str)
|
void LCR_appendDataStr(const char *str)
|
||||||
{
|
{
|
||||||
|
#ifndef __EMSCRIPTEN__
|
||||||
if (!dataFile)
|
if (!dataFile)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -68,6 +84,9 @@ void LCR_appendDataStr(const char *str)
|
||||||
dataFile = fopen(DATA_FILE_NAME,"r");
|
dataFile = fopen(DATA_FILE_NAME,"r");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
printf("%s",str);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void audioFillCallback(void *userdata, uint8_t *s, int l)
|
void audioFillCallback(void *userdata, uint8_t *s, int l)
|
||||||
|
@ -116,11 +135,26 @@ uint8_t LCR_keyPressed(uint8_t key)
|
||||||
return 0;
|
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)
|
void LCR_sleep(uint16_t timeMs)
|
||||||
{
|
{
|
||||||
|
#ifndef __EMSCRIPTEN__
|
||||||
SDL_Delay(timeMs);
|
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)
|
void LCR_drawPixel(unsigned long index, uint16_t color)
|
||||||
{
|
{
|
||||||
screen[index] = color;
|
screen[index] = color;
|
||||||
|
@ -140,10 +174,36 @@ void printHelp(void)
|
||||||
LCR_ARG_HELP_STR);
|
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[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
uint8_t running = 1, fullscreen = 1;
|
|
||||||
|
|
||||||
for (int i = 0; i < argc; ++i)
|
for (int i = 0; i < argc; ++i)
|
||||||
if (argv[i][0] == '-')
|
if (argv[i][0] == '-')
|
||||||
switch (argv[i][1])
|
switch (argv[i][1])
|
||||||
|
@ -160,11 +220,20 @@ int main(int argc, char *argv[])
|
||||||
default: break;
|
default: break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef __EMSCRIPTEN__
|
||||||
|
fullscreen = 0;
|
||||||
|
#else
|
||||||
dataFile = fopen(DATA_FILE_NAME,"r");
|
dataFile = fopen(DATA_FILE_NAME,"r");
|
||||||
|
|
||||||
if (!dataFile)
|
if (!dataFile)
|
||||||
LCR_log("couldn't open data file");
|
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_log("initializing game");
|
||||||
LCR_gameInit(argc,(const char **) argv);
|
LCR_gameInit(argc,(const char **) argv);
|
||||||
|
|
||||||
|
@ -173,23 +242,23 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
LCR_log("initializing audio");
|
LCR_log("initializing audio");
|
||||||
SDL_AudioSpec audioSpec;
|
SDL_AudioSpec audioSpec;
|
||||||
SDL_memset(&audioSpec, 0, sizeof(audioSpec));
|
SDL_memset(&audioSpec,0,sizeof(audioSpec));
|
||||||
audioSpec.callback = audioFillCallback;
|
audioSpec.callback = audioFillCallback;
|
||||||
|
audioSpec.channels = 1;
|
||||||
audioSpec.freq = 8000;
|
audioSpec.freq = 8000;
|
||||||
audioSpec.format = AUDIO_U8;
|
audioSpec.format = AUDIO_U8;
|
||||||
audioSpec.channels = 1;
|
|
||||||
|
#ifdef __EMSCRIPTEN__
|
||||||
|
audioSpec.samples = 1024;
|
||||||
|
#else
|
||||||
audioSpec.samples = 64;
|
audioSpec.samples = 64;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (SDL_OpenAudio(&audioSpec,NULL) < 0)
|
if (SDL_OpenAudio(&audioSpec,NULL) < 0)
|
||||||
fputs("could not initialize audio",stderr);
|
fputs("could not initialize audio",stderr);
|
||||||
|
|
||||||
SDL_PauseAudio(0);
|
SDL_PauseAudio(0);
|
||||||
|
|
||||||
musicFile = fopen("assets/music","rb");
|
|
||||||
|
|
||||||
if (!musicFile)
|
|
||||||
fputs("could not open music file",stderr);
|
|
||||||
|
|
||||||
window =
|
window =
|
||||||
SDL_CreateWindow("Licar", SDL_WINDOWPOS_UNDEFINED,
|
SDL_CreateWindow("Licar", SDL_WINDOWPOS_UNDEFINED,
|
||||||
SDL_WINDOWPOS_UNDEFINED, LCR_SETTING_RESOLUTION_X, LCR_SETTING_RESOLUTION_Y,
|
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");
|
LCR_log("starting game loop");
|
||||||
|
|
||||||
while (running)
|
#ifdef __EMSCRIPTEN__
|
||||||
{
|
emscripten_set_main_loop(mainLoopIteration,0,1);
|
||||||
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
|
#else
|
||||||
uint16_t
|
while (running)
|
||||||
|
mainLoopIteration();
|
||||||
#endif
|
#endif
|
||||||
));
|
|
||||||
|
|
||||||
SDL_RenderClear(renderer);
|
|
||||||
SDL_RenderCopy(renderer,texture,NULL,NULL);
|
|
||||||
SDL_RenderPresent(renderer);
|
|
||||||
}
|
|
||||||
|
|
||||||
LCR_log("ending");
|
LCR_log("ending");
|
||||||
|
|
||||||
if (musicFile)
|
if (musicFile)
|
||||||
fclose(musicFile);
|
fclose(musicFile);
|
||||||
|
|
||||||
|
#ifndef __EMSCRIPTEN__
|
||||||
if (dataFile)
|
if (dataFile)
|
||||||
fclose(dataFile);
|
fclose(dataFile);
|
||||||
|
#endif
|
||||||
|
|
||||||
SDL_PauseAudio(1);
|
SDL_PauseAudio(1);
|
||||||
SDL_CloseAudio();
|
SDL_CloseAudio();
|
||||||
|
|
12
make.sh
12
make.sh
|
@ -35,10 +35,14 @@ if [ $PLATFORM = "sdl" ]; then
|
||||||
# - SDL2 (dev) package
|
# - SDL2 (dev) package
|
||||||
|
|
||||||
SDL_FLAGS=`sdl2-config --cflags --libs`
|
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
|
fi
|
||||||
|
|
||||||
echo ${COMMAND}
|
|
||||||
${COMMAND}
|
|
||||||
|
|
||||||
echo "done"
|
echo "done"
|
||||||
|
|
Loading…
Reference in a new issue