emscripten works
This commit is contained in:
parent
65ce26d93c
commit
17cad0a9eb
2
Makefile
2
Makefile
|
@ -313,7 +313,7 @@ $(STUDIO_DLL): $(DEMO_ASSETS) $(TIC80_DLL) $(TIC_O) bin/html.o
|
|||
$(CC) $(TIC_O) bin/html.o $(TIC80_A) $(OPT) -shared $(INCLUDES) -L$(PRE_BUILT)/mingw -llua -lz -lgif -Wl,--out-implib,$(STUDIO_A) -o $@
|
||||
|
||||
emscripten:
|
||||
$(EMS_CC) $(SOURCES) $(TIC80_SRC) $(OPT) $(INCLUDES) $(EMS_OPT) $(EMS_LINKER_FLAGS) -o build/html/tic.js
|
||||
$(EMS_CC) $(SOURCES) src/main.c $(TIC80_SRC) $(OPT) $(INCLUDES) $(EMS_OPT) $(EMS_LINKER_FLAGS) -o build/html/tic.js
|
||||
|
||||
wasm:
|
||||
$(EMS_CC) $(SOURCES) $(TIC80_SRC) $(OPT) $(INCLUDES) $(EMS_OPT) -s WASM=1 $(EMS_LINKER_FLAGS) -o build/html/tic.js
|
||||
|
|
|
@ -764,7 +764,7 @@ static void initOutlineMode(Code* code)
|
|||
char filter[STUDIO_TEXT_BUFFER_WIDTH] = {0};
|
||||
strncpy(filter, code->popup.text, sizeof(filter));
|
||||
|
||||
_strlwr(filter);
|
||||
strlwr(filter);
|
||||
|
||||
const tic_script_config* config = tic->api.get_script_config(tic);
|
||||
|
||||
|
@ -787,7 +787,7 @@ static void initOutlineMode(Code* code)
|
|||
{
|
||||
strncpy(buffer, out->name, sizeof(buffer));
|
||||
|
||||
_strlwr(buffer);
|
||||
strlwr(buffer);
|
||||
|
||||
if(strstr(buffer, filter)) out++;
|
||||
else out->pos = NULL;
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
#include <zlib.h>
|
||||
#include <ctype.h>
|
||||
#include <string.h>
|
||||
#include <stddef.h>
|
||||
|
||||
#define CONSOLE_CURSOR_COLOR ((tic_color_red))
|
||||
#define CONSOLE_BACK_TEXT_COLOR ((tic_color_dark_gray))
|
||||
|
|
58
src/fs.c
58
src/fs.c
|
@ -553,10 +553,12 @@ void* fsReadFile(const char* path, s32* size)
|
|||
|
||||
static void makeDir(const char* name)
|
||||
{
|
||||
tic_mkdir(UTF8ToString(name));
|
||||
|
||||
#if defined(__EMSCRIPTEN__)
|
||||
mkdir(name, 0700);
|
||||
|
||||
EM_ASM(FS.syncfs(function(){}));
|
||||
#else
|
||||
tic_mkdir(UTF8ToString(name));
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -779,7 +781,7 @@ void fsOpenWorkingFolder(FileSystem* fs)
|
|||
openSystemPath(path);
|
||||
}
|
||||
|
||||
void createFileSystem(const char* path, void(*callback)(FileSystem*))
|
||||
FileSystem* createFileSystem(const char* path)
|
||||
{
|
||||
FileSystem* fs = (FileSystem*)malloc(sizeof(FileSystem));
|
||||
memset(fs, 0, sizeof(FileSystem));
|
||||
|
@ -787,54 +789,6 @@ void createFileSystem(const char* path, void(*callback)(FileSystem*))
|
|||
fs->net = _createNet();
|
||||
|
||||
strcpy(fs->dir, path);
|
||||
callback(fs);
|
||||
|
||||
// else
|
||||
// {
|
||||
|
||||
// #if defined(__EMSCRIPTEN__)
|
||||
|
||||
// strcpy(fs->dir, "/" TIC_PACKAGE "/" TIC_NAME "/");
|
||||
|
||||
// #elif defined(__ANDROID__)
|
||||
|
||||
// strcpy(fs->dir, SDL_AndroidGetExternalStoragePath());
|
||||
// const char AppFolder[] = "/" TIC_NAME "/";
|
||||
// strcat(fs->dir, AppFolder);
|
||||
// mkdir(fs->dir, 0700);
|
||||
|
||||
// #else
|
||||
|
||||
// char* path = SDL_GetPrefPath(TIC_PACKAGE, TIC_NAME);
|
||||
// strcpy(fs->dir, path);
|
||||
// free(path);
|
||||
|
||||
// #endif
|
||||
|
||||
// #if defined(__EMSCRIPTEN__)
|
||||
// EM_ASM_
|
||||
// (
|
||||
// {
|
||||
// var dir = "";
|
||||
// Module.Pointer_stringify($0).split("/").forEach(function(val)
|
||||
// {
|
||||
// if(val.length)
|
||||
// {
|
||||
// dir += "/" + val;
|
||||
// FS.mkdir(dir);
|
||||
// }
|
||||
// });
|
||||
|
||||
// FS.mount(IDBFS, {}, dir);
|
||||
// FS.syncfs(true, function(error)
|
||||
// {
|
||||
// if(error) console.log(error);
|
||||
// else Runtime.dynCall('vi', $1, [$2]);
|
||||
// });
|
||||
// }, fs->dir, callback, fs
|
||||
// );
|
||||
// #else
|
||||
// callback(fs);
|
||||
// #endif
|
||||
// }
|
||||
return fs;
|
||||
}
|
2
src/fs.h
2
src/fs.h
|
@ -47,7 +47,7 @@ typedef void(*OpenCallback)(const char* name, const void* buffer, size_t size, v
|
|||
|
||||
typedef struct FileSystem FileSystem;
|
||||
|
||||
void createFileSystem(const char* path, void(*callback)(FileSystem*));
|
||||
FileSystem* createFileSystem(const char* path);
|
||||
|
||||
void fsEnumFiles(FileSystem* fs, ListCallback callback, void* data);
|
||||
void fsAddFile(FileSystem* fs, AddCallback callback, void* data);
|
||||
|
|
202
src/main.c
202
src/main.c
|
@ -835,17 +835,13 @@ static void tick()
|
|||
{
|
||||
pollEvent();
|
||||
|
||||
// if(!platform.fs) return;
|
||||
|
||||
// if(platform.quit)
|
||||
// {
|
||||
// #if defined __EMSCRIPTEN__
|
||||
// platform.studio->tic->api.clear(platform.studio->tic, TIC_COLOR_BG);
|
||||
// blitTexture();
|
||||
// emscripten_cancel_main_loop();
|
||||
// #endif
|
||||
// return;
|
||||
// }
|
||||
if(platform.studio->quit)
|
||||
{
|
||||
#if defined __EMSCRIPTEN__
|
||||
emscripten_cancel_main_loop();
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
|
||||
SDL_RenderClear(platform.renderer);
|
||||
|
||||
|
@ -858,7 +854,6 @@ static void tick()
|
|||
blitSound();
|
||||
}
|
||||
|
||||
// should work async with callback
|
||||
static const char* getAppFolder()
|
||||
{
|
||||
static char appFolder[FILENAME_MAX];
|
||||
|
@ -878,32 +873,8 @@ static const char* getAppFolder()
|
|||
|
||||
char* path = SDL_GetPrefPath(TIC_PACKAGE, TIC_NAME);
|
||||
strcpy(appFolder, path);
|
||||
free(path);
|
||||
SDL_free(path);
|
||||
|
||||
#endif
|
||||
|
||||
#if defined(__EMSCRIPTEN__)
|
||||
EM_ASM_
|
||||
(
|
||||
{
|
||||
var dir = "";
|
||||
Module.Pointer_stringify($0).split("/").forEach(function(val)
|
||||
{
|
||||
if(val.length)
|
||||
{
|
||||
dir += "/" + val;
|
||||
FS.mkdir(dir);
|
||||
}
|
||||
});
|
||||
|
||||
FS.mount(IDBFS, {}, dir);
|
||||
FS.syncfs(true, function(error)
|
||||
{
|
||||
if(error) console.log(error);
|
||||
else Runtime.dynCall('vi', $1, [$2]);
|
||||
});
|
||||
}, appFolder, callback, fs
|
||||
);
|
||||
#endif
|
||||
|
||||
return appFolder;
|
||||
|
@ -1008,7 +979,82 @@ static System sysHandlers =
|
|||
.openSystemPath = _openSystemPath,
|
||||
};
|
||||
|
||||
s32 main(s32 argc, char **argv)
|
||||
#if defined(__EMSCRIPTEN__)
|
||||
|
||||
static void emstick()
|
||||
{
|
||||
static double nextTick = -1.0;
|
||||
|
||||
platform.missedFrame = false;
|
||||
|
||||
if(nextTick < 0.0)
|
||||
nextTick = emscripten_get_now();
|
||||
|
||||
nextTick += 1000.0/TIC_FRAMERATE;
|
||||
tick();
|
||||
double delay = nextTick - emscripten_get_now();
|
||||
|
||||
if(delay < 0.0)
|
||||
{
|
||||
nextTick -= delay;
|
||||
platform.missedFrame = true;
|
||||
}
|
||||
else
|
||||
emscripten_set_main_loop_timing(EM_TIMING_SETTIMEOUT, delay);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
// else
|
||||
// {
|
||||
|
||||
// #if defined(__EMSCRIPTEN__)
|
||||
|
||||
// strcpy(fs->dir, "/" TIC_PACKAGE "/" TIC_NAME "/");
|
||||
|
||||
// #elif defined(__ANDROID__)
|
||||
|
||||
// strcpy(fs->dir, SDL_AndroidGetExternalStoragePath());
|
||||
// const char AppFolder[] = "/" TIC_NAME "/";
|
||||
// strcat(fs->dir, AppFolder);
|
||||
// mkdir(fs->dir, 0700);
|
||||
|
||||
// #else
|
||||
|
||||
// char* path = SDL_GetPrefPath(TIC_PACKAGE, TIC_NAME);
|
||||
// strcpy(fs->dir, path);
|
||||
// free(path);
|
||||
|
||||
// #endif
|
||||
|
||||
// #if defined(__EMSCRIPTEN__)
|
||||
// EM_ASM_
|
||||
// (
|
||||
// {
|
||||
// var dir = "";
|
||||
// Module.Pointer_stringify($0).split("/").forEach(function(val)
|
||||
// {
|
||||
// if(val.length)
|
||||
// {
|
||||
// dir += "/" + val;
|
||||
// FS.mkdir(dir);
|
||||
// }
|
||||
// });
|
||||
|
||||
// FS.mount(IDBFS, {}, dir);
|
||||
// FS.syncfs(true, function(error)
|
||||
// {
|
||||
// if(error) console.log(error);
|
||||
// else Runtime.dynCall('vi', $1, [$2]);
|
||||
// });
|
||||
// }, fs->dir, callback, fs
|
||||
// );
|
||||
// #else
|
||||
// callback(fs);
|
||||
// #endif
|
||||
// }
|
||||
|
||||
static s32 start(s32 argc, char **argv, const char* folder)
|
||||
{
|
||||
SDL_SetHint(SDL_HINT_WINRT_HANDLE_BACK_BUTTON, "1");
|
||||
SDL_SetHint(SDL_HINT_ACCELEROMETER_AS_JOYSTICK, "0");
|
||||
|
@ -1026,7 +1072,7 @@ s32 main(s32 argc, char **argv)
|
|||
#endif
|
||||
);
|
||||
|
||||
platform.studio = studioInit(argc, argv, platform.audio.spec.freq, getAppFolder(), &sysHandlers);
|
||||
platform.studio = studioInit(argc, argv, platform.audio.spec.freq, folder, &sysHandlers);
|
||||
|
||||
// set the window icon before renderer is created (issues on Linux)
|
||||
setWindowIcon();
|
||||
|
@ -1034,11 +1080,8 @@ s32 main(s32 argc, char **argv)
|
|||
platform.renderer = SDL_CreateRenderer(platform.window, -1,
|
||||
#if defined(__CHIP__)
|
||||
SDL_RENDERER_SOFTWARE
|
||||
#elif defined(__EMSCRIPTEN__)
|
||||
SDL_RENDERER_ACCELERATED
|
||||
#else
|
||||
// TODO: uncomment this later, also init FS before read config
|
||||
SDL_RENDERER_ACCELERATED// | (getConfig()->useVsync ? SDL_RENDERER_PRESENTVSYNC : 0)
|
||||
SDL_RENDERER_ACCELERATED | (getConfig()->useVsync ? SDL_RENDERER_PRESENTVSYNC : 0)
|
||||
#endif
|
||||
);
|
||||
|
||||
|
@ -1048,8 +1091,8 @@ s32 main(s32 argc, char **argv)
|
|||
|
||||
#if defined(__EMSCRIPTEN__)
|
||||
|
||||
// call this after FS is initialized
|
||||
emscripten_set_main_loop(getConfig()->useVsync ? tick : emstick, TIC_FRAMERATE, 1);
|
||||
emscripten_set_main_loop(getConfig()->useVsync ? tick : emstick, 0, 1);
|
||||
|
||||
#else
|
||||
{
|
||||
u64 nextTick = SDL_GetPerformanceCounter();
|
||||
|
@ -1096,3 +1139,72 @@ s32 main(s32 argc, char **argv)
|
|||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if defined(__EMSCRIPTEN__)
|
||||
|
||||
#define DEFAULT_CART "cart.tic"
|
||||
|
||||
static struct
|
||||
{
|
||||
s32 argc;
|
||||
char **argv;
|
||||
const char* folder;
|
||||
} startVars;
|
||||
|
||||
static void onEmscriptenWget(const char* file)
|
||||
{
|
||||
startVars.argv[1] = DEFAULT_CART;
|
||||
start(startVars.argc, startVars.argv, startVars.folder);
|
||||
}
|
||||
|
||||
static void onEmscriptenWgetError(const char* error) {}
|
||||
|
||||
static void emsStart(s32 argc, char **argv, const char* folder)
|
||||
{
|
||||
if(argc == 2)
|
||||
{
|
||||
startVars.argc = argc;
|
||||
startVars.argv = argv;
|
||||
startVars.folder = folder;
|
||||
|
||||
emscripten_async_wget(argv[1], DEFAULT_CART, onEmscriptenWget, onEmscriptenWgetError);
|
||||
}
|
||||
else start(argc, argv, folder);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
s32 main(s32 argc, char **argv)
|
||||
{
|
||||
const char* folder = getAppFolder();
|
||||
|
||||
#if defined(__EMSCRIPTEN__)
|
||||
|
||||
EM_ASM_
|
||||
(
|
||||
{
|
||||
var dir = "";
|
||||
Module.Pointer_stringify($0).split("/").forEach(function(val)
|
||||
{
|
||||
if(val.length)
|
||||
{
|
||||
dir += "/" + val;
|
||||
FS.mkdir(dir);
|
||||
}
|
||||
});
|
||||
|
||||
FS.mount(IDBFS, {}, dir);
|
||||
FS.syncfs(true, function()
|
||||
{
|
||||
Runtime.dynCall('viii', $1, [$2, $3, $0]);
|
||||
});
|
||||
|
||||
}, folder, emsStart, argc, argv
|
||||
);
|
||||
|
||||
#else
|
||||
|
||||
return start(argc, argv, folder);
|
||||
|
||||
#endif
|
||||
}
|
||||
|
|
129
src/studio.c
129
src/studio.c
|
@ -1717,9 +1717,70 @@ static void initKeymap()
|
|||
}
|
||||
}
|
||||
|
||||
static void onFSInitialized(FileSystem* fs)
|
||||
// #if defined(__EMSCRIPTEN__)
|
||||
|
||||
// #define DEFAULT_CART "cart.tic"
|
||||
|
||||
// static void onEmscriptenWget(const char* file)
|
||||
// {
|
||||
// studioImpl.argv[1] = DEFAULT_CART;
|
||||
// createFileSystem(NULL, onFSInitialized);
|
||||
// }
|
||||
|
||||
// static void onEmscriptenWgetError(const char* error) {}
|
||||
|
||||
// static void emstick()
|
||||
// {
|
||||
// static double nextTick = -1.0;
|
||||
|
||||
// studioImpl.missedFrame = false;
|
||||
|
||||
// if(nextTick < 0.0)
|
||||
// nextTick = emscripten_get_now();
|
||||
|
||||
// nextTick += 1000.0/TIC_FRAMERATE;
|
||||
// tick();
|
||||
// double delay = nextTick - emscripten_get_now();
|
||||
|
||||
// if(delay < 0.0)
|
||||
// {
|
||||
// nextTick -= delay;
|
||||
// studioImpl.missedFrame = true;
|
||||
// }
|
||||
// else
|
||||
// emscripten_set_main_loop_timing(EM_TIMING_SETTIMEOUT, delay);
|
||||
// }
|
||||
|
||||
// #endif
|
||||
|
||||
// #if defined(__EMSCRIPTEN__)
|
||||
|
||||
// if(studioImpl.argc == 2)
|
||||
// {
|
||||
// emscripten_async_wget(studioImpl.argv[1], DEFAULT_CART, onEmscriptenWget, onEmscriptenWgetError);
|
||||
// }
|
||||
// else createFileSystem(NULL, onFSInitialized);
|
||||
|
||||
// // emscripten_set_main_loop(emstick, TIC_FRAMERATE, 1);
|
||||
|
||||
// #else
|
||||
|
||||
// FileSystem* fs = createFileSystem(argc > 1 && fsExists(argv[1]) ? fsBasename(argv[1]) : folder);
|
||||
// onFSInitialized(fs);
|
||||
|
||||
// #endif
|
||||
|
||||
|
||||
Studio* studioInit(s32 argc, char **argv, s32 samplerate, const char* folder, System* system)
|
||||
{
|
||||
studioImpl.fs = fs;
|
||||
setbuf(stdout, NULL);
|
||||
studioImpl.argc = argc;
|
||||
studioImpl.argv = argv;
|
||||
studioImpl.samplerate = samplerate;
|
||||
|
||||
studioImpl.system = system;
|
||||
|
||||
studioImpl.fs = createFileSystem(argc > 1 && fsExists(argv[1]) ? fsBasename(argv[1]) : folder);
|
||||
|
||||
studioImpl.tic80local = (tic80_local*)tic80_create(studioImpl.samplerate);
|
||||
studioImpl.studio.tic = studioImpl.tic80local->memory;
|
||||
|
@ -1744,7 +1805,7 @@ static void onFSInitialized(FileSystem* fs)
|
|||
studioImpl.surf = calloc(1, sizeof(Surf));
|
||||
}
|
||||
|
||||
fsMakeDir(fs, TIC_LOCAL);
|
||||
fsMakeDir(studioImpl.fs, TIC_LOCAL);
|
||||
initConfig(studioImpl.config, studioImpl.studio.tic, studioImpl.fs);
|
||||
|
||||
initKeymap();
|
||||
|
@ -1766,68 +1827,6 @@ static void onFSInitialized(FileSystem* fs)
|
|||
{
|
||||
goFullscreen();
|
||||
}
|
||||
}
|
||||
|
||||
#if defined(__EMSCRIPTEN__)
|
||||
|
||||
#define DEFAULT_CART "cart.tic"
|
||||
|
||||
static void onEmscriptenWget(const char* file)
|
||||
{
|
||||
studioImpl.argv[1] = DEFAULT_CART;
|
||||
createFileSystem(NULL, onFSInitialized);
|
||||
}
|
||||
|
||||
static void onEmscriptenWgetError(const char* error) {}
|
||||
|
||||
static void emstick()
|
||||
{
|
||||
static double nextTick = -1.0;
|
||||
|
||||
studioImpl.missedFrame = false;
|
||||
|
||||
if(nextTick < 0.0)
|
||||
nextTick = emscripten_get_now();
|
||||
|
||||
nextTick += 1000.0/TIC_FRAMERATE;
|
||||
tick();
|
||||
double delay = nextTick - emscripten_get_now();
|
||||
|
||||
if(delay < 0.0)
|
||||
{
|
||||
nextTick -= delay;
|
||||
studioImpl.missedFrame = true;
|
||||
}
|
||||
else
|
||||
emscripten_set_main_loop_timing(EM_TIMING_SETTIMEOUT, delay);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
Studio* studioInit(s32 argc, char **argv, s32 samplerate, const char* folder, System* system)
|
||||
{
|
||||
setbuf(stdout, NULL);
|
||||
studioImpl.argc = argc;
|
||||
studioImpl.argv = argv;
|
||||
studioImpl.samplerate = samplerate;
|
||||
|
||||
studioImpl.system = system;
|
||||
|
||||
#if defined(__EMSCRIPTEN__)
|
||||
|
||||
if(studioImpl.argc == 2)
|
||||
{
|
||||
emscripten_async_wget(studioImpl.argv[1], DEFAULT_CART, onEmscriptenWget, onEmscriptenWgetError);
|
||||
}
|
||||
else createFileSystem(NULL, onFSInitialized);
|
||||
|
||||
// emscripten_set_main_loop(emstick, TIC_FRAMERATE, 1);
|
||||
|
||||
#else
|
||||
|
||||
createFileSystem(argc > 1 && fsExists(argv[1]) ? fsBasename(argv[1]) : folder, onFSInitialized);
|
||||
|
||||
#endif
|
||||
|
||||
return &studioImpl.studio;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue