aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndre Weissflog <floooh@gmail.com>2019-02-16 20:34:25 +0100
committerGitHub <noreply@github.com>2019-02-16 20:34:25 +0100
commit75a16e2ace39a5917a6296960f106d1223a9219a (patch)
treec44eff2cc39b230551dcd387f0759136a9eab258
parent6537e3ed151b7906fb0d84f05fe1ac740517c9cd (diff)
Emscripten platform updates (#116)
* preparations for MINIMAL_RUNTIME * better closure compiler compatibility * replace deprecated functions with 'modern' equivalents
-rw-r--r--sokol_app.h50
-rw-r--r--sokol_args.h2
-rw-r--r--sokol_audio.h4
-rw-r--r--sokol_time.h19
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);