diff options
| author | Andre Weissflog <floooh@gmail.com> | 2019-02-16 20:34:25 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-02-16 20:34:25 +0100 |
| commit | 75a16e2ace39a5917a6296960f106d1223a9219a (patch) | |
| tree | c44eff2cc39b230551dcd387f0759136a9eab258 | |
| parent | 6537e3ed151b7906fb0d84f05fe1ac740517c9cd (diff) | |
Emscripten platform updates (#116)
* preparations for MINIMAL_RUNTIME
* better closure compiler compatibility
* replace deprecated functions with 'modern' equivalents
| -rw-r--r-- | sokol_app.h | 50 | ||||
| -rw-r--r-- | sokol_args.h | 2 | ||||
| -rw-r--r-- | sokol_audio.h | 4 | ||||
| -rw-r--r-- | sokol_time.h | 19 |
4 files changed, 46 insertions, 29 deletions
diff --git a/sokol_app.h b/sokol_app.h index 25a512e0..6c77211d 100644 --- a/sokol_app.h +++ b/sokol_app.h @@ -780,7 +780,7 @@ _SOKOL_PRIVATE void _sapp_init_state(sapp_desc* desc, int argc, char* argv[]) { _sapp.framebuffer_height = _sapp.window_height; _sapp.sample_count = _sapp_def(_sapp.desc.sample_count, 1); _sapp.swap_interval = _sapp_def(_sapp.desc.swap_interval, 1); - _sapp.html5_canvas_name = _sapp_def(_sapp.desc.html5_canvas_name, "#canvas"); + _sapp.html5_canvas_name = _sapp_def(_sapp.desc.html5_canvas_name, "canvas"); _sapp.html5_canvas_resize = _sapp.desc.html5_canvas_resize; if (_sapp.desc.window_title) { _sapp_strcpy(_sapp.desc.window_title, _sapp.window_title, sizeof(_sapp.window_title)); @@ -1663,23 +1663,23 @@ EMSCRIPTEN_KEEPALIVE void _sapp_emsc_notify_keyboard_hidden(void) { #endif /* Javascript helper functions for mobile virtual keyboard input */ -EM_JS(void, _sapp_js_create_textfield, (), { - var inp = document.createElement("input"); - inp.type = "text"; - inp.id = "_sokol_app_input_element"; - inp.autocapitalize = "none"; - inp.addEventListener("focusout", function(e) { +EM_JS(void, _sapp_js_create_textfield, (void), { + var _sapp_inp = document.createElement("input"); + _sapp_inp.type = "text"; + _sapp_inp.id = "_sokol_app_input_element"; + _sapp_inp.autocapitalize = "none"; + _sapp_inp.addEventListener("focusout", function(_sapp_event) { __sapp_emsc_notify_keyboard_hidden() }); - document.body.append(x); + document.body.append(_sapp_inp); }); -EM_JS(void, _sapp_js_focus_textfield, (), { +EM_JS(void, _sapp_js_focus_textfield, (void), { document.getElementById("_sokol_app_input_element").focus(); }); -EM_JS(void, _sapp_js_unfocus_textfield, (), { +EM_JS(void, _sapp_js_unfocus_textfield, (void), { document.getElementById("_sokol_app_input_element").blur(); }); @@ -1773,11 +1773,11 @@ _SOKOL_PRIVATE EM_BOOL _sapp_emsc_size_changed(int event_type, const EmscriptenU return true; } -_SOKOL_PRIVATE void _sapp_emsc_frame(void) { - if (_sapp.first_frame) { - emscripten_set_main_loop_timing(EM_TIMING_RAF, _sapp.swap_interval); - } +_SOKOL_PRIVATE EM_BOOL _sapp_emsc_frame(double time, void* userData) { + _SOKOL_UNUSED(time); + _SOKOL_UNUSED(userData); _sapp_frame(); + return EM_TRUE; } _SOKOL_PRIVATE EM_BOOL _sapp_emsc_context_cb(int emsc_type, const void* reserved, void* user_data) { @@ -1795,8 +1795,8 @@ _SOKOL_PRIVATE EM_BOOL _sapp_emsc_context_cb(int emsc_type, const void* reserved } _SOKOL_PRIVATE EM_BOOL _sapp_emsc_mouse_cb(int emsc_type, const EmscriptenMouseEvent* emsc_event, void* user_data) { - _sapp.mouse_x = (emsc_event->canvasX * _sapp.dpi_scale); - _sapp.mouse_y = (emsc_event->canvasY * _sapp.dpi_scale); + _sapp.mouse_x = (emsc_event->targetX * _sapp.dpi_scale); + _sapp.mouse_y = (emsc_event->targetY * _sapp.dpi_scale); if (_sapp_events_enabled() && (emsc_event->button >= 0) && (emsc_event->button < SAPP_MAX_MOUSEBUTTONS)) { sapp_event_type type; bool is_button_event = false; @@ -2032,8 +2032,8 @@ _SOKOL_PRIVATE EM_BOOL _sapp_emsc_touch_cb(int emsc_type, const EmscriptenTouchE const EmscriptenTouchPoint* src = &emsc_event->touches[i]; sapp_touchpoint* dst = &_sapp.event.touches[i]; dst->identifier = src->identifier; - dst->pos_x = src->canvasX * _sapp.dpi_scale; - dst->pos_y = src->canvasY * _sapp.dpi_scale; + dst->pos_x = src->targetX * _sapp.dpi_scale; + dst->pos_y = src->targetY * _sapp.dpi_scale; dst->changed = src->isChanged; } _sapp.desc.event_cb(&_sapp.event); @@ -2158,7 +2158,7 @@ int main(int argc, char* argv[]) { } else { emscripten_get_element_css_size(_sapp.html5_canvas_name, &w, &h); - emscripten_set_resize_callback(0, 0, false, _sapp_emsc_size_changed); + emscripten_set_resize_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, 0, false, _sapp_emsc_size_changed); } if (_sapp.desc.high_dpi) { _sapp.dpi_scale = emscripten_get_device_pixel_ratio(); @@ -2186,10 +2186,10 @@ int main(int argc, char* argv[]) { attrs.majorVersion = 2; } #endif - EMSCRIPTEN_WEBGL_CONTEXT_HANDLE ctx = emscripten_webgl_create_context(0, &attrs); + EMSCRIPTEN_WEBGL_CONTEXT_HANDLE ctx = emscripten_webgl_create_context(_sapp.html5_canvas_name, &attrs); if (!ctx) { attrs.majorVersion = 1; - ctx = emscripten_webgl_create_context(0, &attrs); + ctx = emscripten_webgl_create_context(_sapp.html5_canvas_name, &attrs); _sapp.gles2_fallback = true; } emscripten_webgl_make_context_current(ctx); @@ -2200,16 +2200,16 @@ int main(int argc, char* argv[]) { emscripten_set_mouseenter_callback(_sapp.html5_canvas_name, 0, true, _sapp_emsc_mouse_cb); emscripten_set_mouseleave_callback(_sapp.html5_canvas_name, 0, true, _sapp_emsc_mouse_cb); emscripten_set_wheel_callback(_sapp.html5_canvas_name, 0, true, _sapp_emsc_wheel_cb); - emscripten_set_keydown_callback(0, 0, true, _sapp_emsc_key_cb); - emscripten_set_keyup_callback(0, 0, true, _sapp_emsc_key_cb); - emscripten_set_keypress_callback(0, 0, true, _sapp_emsc_key_cb); + emscripten_set_keydown_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, 0, true, _sapp_emsc_key_cb); + emscripten_set_keyup_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, 0, true, _sapp_emsc_key_cb); + emscripten_set_keypress_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, 0, true, _sapp_emsc_key_cb); emscripten_set_touchstart_callback(_sapp.html5_canvas_name, 0, true, _sapp_emsc_touch_cb); emscripten_set_touchmove_callback(_sapp.html5_canvas_name, 0, true, _sapp_emsc_touch_cb); emscripten_set_touchend_callback(_sapp.html5_canvas_name, 0, true, _sapp_emsc_touch_cb); emscripten_set_touchcancel_callback(_sapp.html5_canvas_name, 0, true, _sapp_emsc_touch_cb); emscripten_set_webglcontextlost_callback(_sapp.html5_canvas_name, 0, true, _sapp_emsc_context_cb); emscripten_set_webglcontextrestored_callback(_sapp.html5_canvas_name, 0, true, _sapp_emsc_context_cb); - emscripten_set_main_loop(_sapp_emsc_frame, 0, 1); + emscripten_request_animation_frame_loop(_sapp_emsc_frame, 0); return 0; } #endif /* __EMSCRIPTEN__ */ diff --git a/sokol_args.h b/sokol_args.h index 2577f4cf..c170fced 100644 --- a/sokol_args.h +++ b/sokol_args.h @@ -632,7 +632,7 @@ EM_JS(void, sargs_js_parse_url, (), { for (var p = params.next(); !p.done; p = params.next()) { var key = p.value[0]; var val = p.value[1]; - var res = Module.ccall('_sargs_add_kvp', 'void', ['string','string'], [key,val]); + var res = ccall('_sargs_add_kvp', 'void', ['string','string'], [key,val]); } }); diff --git a/sokol_audio.h b/sokol_audio.h index a63de802..982f3de5 100644 --- a/sokol_audio.h +++ b/sokol_audio.h @@ -1247,7 +1247,7 @@ EM_JS(int, _saudio_js_init, (int sample_rate, int num_channels, int buffer_size) }); /* get the actual sample rate back from the WebAudio context */ -EM_JS(int, _saudio_js_sample_rate, (), { +EM_JS(int, _saudio_js_sample_rate, (void), { if (Module._saudio_context) { return Module._saudio_context.sampleRate; } @@ -1257,7 +1257,7 @@ EM_JS(int, _saudio_js_sample_rate, (), { }); /* get the actual buffer size in number of frames */ -EM_JS(int, _saudio_js_buffer_frames, (), { +EM_JS(int, _saudio_js_buffer_frames, (void), { if (Module._saudio_node) { return Module._saudio_node.bufferSize; } diff --git a/sokol_time.h b/sokol_time.h index 85b74c42..76dba68c 100644 --- a/sokol_time.h +++ b/sokol_time.h @@ -53,7 +53,7 @@ Windows: QueryPerformanceFrequency() / QueryPerformanceCounter() MacOS/iOS: mach_absolute_time() - emscripten: clock_gettime(CLOCK_MONOTONIC) + emscripten: performance.now() Linux+others: clock_gettime(CLOCK_MONOTONIC) zlib/libpng license @@ -139,6 +139,11 @@ typedef struct { mach_timebase_info_data_t timebase; uint64_t start; } _stm_state_t; +#elif defined(__EMSCRIPTEN__) +typedef struct { + uint32_t initialized; + double start; +} _stm_state_t; #else /* anything else, this will need more care for non-Linux platforms */ #include <time.h> typedef struct { @@ -159,6 +164,12 @@ _SOKOL_PRIVATE int64_t int64_muldiv(int64_t value, int64_t numer, int64_t denom) } #endif +#if defined(__EMSCRIPTEN__) +EM_JS(double, _stm_js_perfnow, (void), { + return performance.now(); +}); +#endif + SOKOL_API_IMPL void stm_setup(void) { memset(&_stm, 0, sizeof(_stm)); _stm.initialized = 0xABCDABCD; @@ -168,6 +179,8 @@ SOKOL_API_IMPL void stm_setup(void) { #elif defined(__APPLE__) && defined(__MACH__) mach_timebase_info(&_stm.timebase); _stm.start = mach_absolute_time(); + #elif defined(__EMSCRIPTEN__) + _stm.start = _stm_js_perfnow(); #else struct timespec ts; clock_gettime(CLOCK_MONOTONIC, &ts); @@ -185,6 +198,10 @@ SOKOL_API_IMPL uint64_t stm_now(void) { #elif defined(__APPLE__) && defined(__MACH__) const uint64_t mach_now = mach_absolute_time() - _stm.start; now = int64_muldiv(mach_now, _stm.timebase.numer, _stm.timebase.denom); + #elif defined(__EMSCRIPTEN__) + double js_now = _stm_js_perfnow() - _stm.start; + SOKOL_ASSERT(js_now >= 0.0); + now = (uint64_t) (js_now * 1000000.0); #else struct timespec ts; clock_gettime(CLOCK_MONOTONIC, &ts); |