summaryrefslogtreecommitdiff
path: root/reduced_system_layer.c
diff options
context:
space:
mode:
Diffstat (limited to 'reduced_system_layer.c')
-rwxr-xr-xreduced_system_layer.c70
1 files changed, 50 insertions, 20 deletions
diff --git a/reduced_system_layer.c b/reduced_system_layer.c
index 522d672..cc150e9 100755
--- a/reduced_system_layer.c
+++ b/reduced_system_layer.c
@@ -184,8 +184,12 @@ extern "C" {
#endif
#ifndef MAX_NUM_SOCKETS
+#if defined(__wasm__)
+#define MAX_NUM_SOCKETS 0
+#else
#define MAX_NUM_SOCKETS 64
#endif
+#endif
#ifndef MAX_NUM_KEYS
#define MAX_NUM_KEYS 512
@@ -204,7 +208,11 @@ extern "C" {
#endif
#ifndef MAX_FRAME_DURATION
-#define MAX_FRAME_DURATION 38
+#if defined(__wasm__)
+#define MAX_FRAME_DURATION 83
+#else
+#define MAX_FRAME_DURATION 41
+#endif
#endif
#ifndef NUM_SOUND_CHANNELS
@@ -441,9 +449,8 @@ i64 p_send(u16 slot, IP_Address address, i64 size, u8 *data, u16 *local_port);
extern Platform g_platform;
-#ifdef __wasm__
+#if defined(__wasm__)
i32 main(i32 argc, c8 **argv);
-
f64 floor(f64 x);
f64 ceil(f64 x);
f64 sqrt(f64 x);
@@ -460,6 +467,7 @@ f64 asin(f64 x);
f64 acos(f64 x);
f64 atan(f64 x);
f64 atan2(f64 y, f64 x);
+#endif // defined(__wasm__)
#ifndef NULL
#define NULL ((void *) 0)
@@ -468,7 +476,6 @@ f64 atan2(f64 y, f64 x);
#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif
-#endif
#ifdef __cplusplus
}
@@ -695,8 +702,8 @@ typedef struct {
IP_Address address;
} Socket_Slot;
-b8 _sockets_ready = 0;
-Socket_Slot _sockets[MAX_NUM_SOCKETS] = {0};
+static b8 _sockets_ready = 0;
+static Socket_Slot _sockets[MAX_NUM_SOCKETS] = {0};
static void sockets_init(void) {
if (_sockets_ready)
@@ -1712,11 +1719,12 @@ void p_clipboard_write(i64 size, c8 *data) {
//
// ================================================================
-#ifdef __wasm__
+#if defined(__wasm__)
+static c8 _href[512] = {0};
static i32 _frame_width = 0;
static i32 _frame_height = 0;
-static vec3_f32 _pixels[MAX_NUM_PIXELS] = {0};
+static vec4_f32 _pixels[MAX_NUM_PIXELS] = {0};
static i32 _pixel_size = 0;
static u32 _pixels_scaled[MAX_NUM_PIXELS] = {0};
static u32 _pixels_internal[MAX_NUM_PIXELS] = {0};
@@ -1726,10 +1734,19 @@ static i32 _num_events = 0;
static i32 _input_size = 0;
static b8 _key_pressed[MAX_NUM_KEYS] = {0};
static b8 _wait_events = 0;
-i64 _sound_position = 0;
-i64 _sound_read = 0;
-f32 _sound_ring[MAX_NUM_SOUND_FRAMES] = {0};
-f32 _sound_buffer[MAX_NUM_SOUND_FRAMES] = {0};
+static i64 _timeout = 0;
+static i64 _sound_position = 0;
+static i64 _sound_read = 0;
+static f32 _sound_ring[MAX_NUM_SOUND_FRAMES] = {0};
+static f32 _sound_buffer[MAX_NUM_SOUND_FRAMES] = {0};
+
+i64 p_recv(u16 slot, IP_Address address, i64 size, u8 *data, u16 *local_port, IP_Address *remote_address) {
+ return 0;
+}
+
+i64 p_send(u16 slot, IP_Address address, i64 size, u8 *data, u16 *local_port) {
+ return 0;
+}
i32 p_time_impl(void);
@@ -1738,7 +1755,12 @@ i64 p_time(void) {
}
void p_sleep_for(i64 duration) {
- // TODO
+ i64 t = p_time();
+
+ if (_timeout < t)
+ _timeout = t + duration;
+ else
+ _timeout += duration;
}
void p_init(void) {
@@ -1775,11 +1797,11 @@ void p_render_frame(void) {
if (_frame_width == g_platform.frame_width && _frame_height == g_platform.frame_height) {
i64 size = g_platform.frame_width * g_platform.frame_height;
for (i64 i = 0; i < size; ++i)
- _pixels_internal[i] = 0xff000000u | rgb_u32_from_f32((vec3_f32) { _pixels[i].x, _pixels[i].y, _pixels[i].z });
+ _pixels_internal[i] = 0xff000000u | rgb_u32_from_f32((vec3_f32) { _pixels[i].z, _pixels[i].y, _pixels[i].x });
} else {
i64 size = g_platform.frame_width * g_platform.frame_height;
for (i64 i = 0; i < size; ++i)
- _pixels_scaled[i] = rgb_u32_from_f32((vec3_f32) { _pixels[i].x, _pixels[i].y, _pixels[i].z });
+ _pixels_scaled[i] = rgb_u32_from_f32((vec3_f32) { _pixels[i].z, _pixels[i].y, _pixels[i].x });
for (i64 j = 0; j < _frame_height; ++j) {
i64 j0 = (j * g_platform.frame_height) / _frame_height;
@@ -1846,8 +1868,16 @@ void p_queue_sound(i64 delay_in_samples, i64 num_samples, f32 *frames) {
}
}
-__attribute__((export_name("js_main"))) void js_main(c8 *href) {
- main(1, &href);
+__attribute__((export_name("js_href"))) void *js_href(void) {
+ return _href;
+}
+
+__attribute__((export_name("js_href_size"))) i32 js_href_size(void) {
+ return (sizeof _href) - 1;
+}
+
+__attribute__((export_name("js_main"))) void js_main(void) {
+ main(1, &_href);
}
__attribute__((export_name("js_title"))) void *js_title(void) {
@@ -1877,7 +1907,7 @@ __attribute__((export_name("js_frame"))) void js_frame(i32 frame_width, i32 fram
}
if (g_platform.real_width != _frame_width || g_platform.real_height != _frame_height) {
- ++num_events;
+ ++_num_events;
g_platform.real_width = frame_width;
g_platform.real_height = frame_height;
}
@@ -1891,7 +1921,7 @@ __attribute__((export_name("js_frame"))) void js_frame(i32 frame_width, i32 fram
g_platform.done = 0;
- b8 do_render = _num_events > 0 || !_wait_events;
+ b8 do_render = (frame_time >= _timeout) && (_num_events > 0 || !_wait_events);
if (do_render) {
_wait_events = 0;
@@ -2000,7 +2030,7 @@ __attribute__((export_name("js_clipboard_buffer"))) void *js_clipboard_buffer(i3
return g_platform.clipboard;
}
-#endif // __wasm__
+#endif // defined(__wasm__)
// ================================================================