summaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
authorRobert Bragg <robert@linux.intel.com>2013-04-28 02:42:24 +0100
committerRobert Bragg <robert@linux.intel.com>2013-05-29 19:10:55 +0100
commita3bc2e7539391b074e697839dfae60b69c37cf10 (patch)
tree670a972b27b5b13687acd657e2c528f02fe2724f /examples
parentba79020e0f5b102e8b25cd831c408dd68d241297 (diff)
downloadcogl-a3bc2e7539391b074e697839dfae60b69c37cf10.tar.gz
Adds initial Emscripten support to Cogl
This enables basic Emscripten support in Cogl via the SDL winsys. Assuming you have setup an emscripten toolchain you can configure Cogl like this: emconfigure ./configure --enable-debug --enable-emscripten Building the examples will build .html files that can be loaded directly by a WebGL enabled browser. Note: at this point the emscripten support has just barely been smoke tested so it's expected that as we continue to build on this we will learn about more things we need to change in Cogl to full support this environment. Reviewed-by: Neil Roberts <neil@linux.intel.com>
Diffstat (limited to 'examples')
-rw-r--r--examples/Makefile.am20
-rw-r--r--examples/cogl-emscripten-hello.c135
-rw-r--r--examples/cogl-info.c4
3 files changed, 159 insertions, 0 deletions
diff --git a/examples/Makefile.am b/examples/Makefile.am
index 87deb28c..cb79172d 100644
--- a/examples/Makefile.am
+++ b/examples/Makefile.am
@@ -82,18 +82,38 @@ endif
endif #USE_GLIB
+# XXX although emscripten "supports sdl" we can't build cogl-sdl-hello
+# un-modified for emscripten since emscripten doesn't support
+# SDL_WaitEvent() and we need to use some special emscripten apis
+# to create a mainloop....
+if USING_EMSCRIPTEN
+
+programs += cogl-emscripten-hello
+cogl_emscripten_hello_SOURCES = cogl-emscripten-hello.c
+cogl_emscripten_hello_LDADD = $(common_ldadd)
+
+else # USING_EMSCRIPTEN
+
if SUPPORT_SDL
programs += cogl-sdl-hello
cogl_sdl_hello_SOURCES = cogl-sdl-hello.c
cogl_sdl_hello_LDADD = $(common_ldadd)
endif
+endif # USING_EMSCRIPTEN
+
if SUPPORT_SDL2
programs += cogl-sdl2-hello
cogl_sdl2_hello_SOURCES = cogl-sdl2-hello.c
cogl_sdl2_hello_LDADD = $(common_ldadd)
endif
+if USING_EMSCRIPTEN
+%.html: %.o $(top_builddir)/cogl/.libs/libcogl2.so $(top_builddir)/deps/glib/.libs/libglib.a
+ $(CC) $(AM_CFLAGS) $(CFLAGS) -o $@ $^
+
+all-local: $(addsuffix .html, $(programs))
+endif
if INSTALL_EXAMPLES
bin_PROGRAMS = $(programs)
diff --git a/examples/cogl-emscripten-hello.c b/examples/cogl-emscripten-hello.c
new file mode 100644
index 00000000..de3821f8
--- /dev/null
+++ b/examples/cogl-emscripten-hello.c
@@ -0,0 +1,135 @@
+#include <cogl/cogl.h>
+#include <stdio.h>
+#include <SDL.h>
+#include <emscripten.h>
+
+/* This short example is just to demonstrate mixing SDL with Cogl as a
+ simple way to get portable support for events */
+
+typedef struct Data
+{
+ CoglPrimitive *triangle;
+ CoglPipeline *pipeline;
+ float center_x, center_y;
+ CoglFramebuffer *fb;
+ CoglBool redraw_queued;
+ CoglBool ready_to_draw;
+} Data;
+
+static Data data;
+static CoglContext *ctx;
+
+static void
+redraw (Data *data)
+{
+ CoglFramebuffer *fb = data->fb;
+
+ cogl_framebuffer_clear4f (fb, COGL_BUFFER_BIT_COLOR, 0, 0, 0, 1);
+
+ cogl_framebuffer_push_matrix (fb);
+ cogl_framebuffer_translate (fb, data->center_x, -data->center_y, 0.0f);
+
+ cogl_framebuffer_draw_primitive (fb, data->pipeline, data->triangle);
+ cogl_framebuffer_pop_matrix (fb);
+
+ cogl_onscreen_swap_buffers (COGL_ONSCREEN (fb));
+}
+
+static void
+handle_event (Data *data, SDL_Event *event)
+{
+ switch (event->type)
+ {
+ case SDL_VIDEOEXPOSE:
+ data->redraw_queued = TRUE;
+ break;
+
+ case SDL_MOUSEMOTION:
+ {
+ int width =
+ cogl_framebuffer_get_width (COGL_FRAMEBUFFER (data->fb));
+ int height =
+ cogl_framebuffer_get_height (COGL_FRAMEBUFFER (data->fb));
+
+ data->center_x = event->motion.x * 2.0f / width - 1.0f;
+ data->center_y = event->motion.y * 2.0f / height - 1.0f;
+
+ data->redraw_queued = TRUE;
+ }
+ break;
+ }
+}
+
+static void
+frame_cb (CoglOnscreen *onscreen,
+ CoglFrameEvent event,
+ CoglFrameInfo *info,
+ void *user_data)
+{
+ Data *data = user_data;
+
+ if (event == COGL_FRAME_EVENT_SYNC)
+ data->ready_to_draw = TRUE;
+}
+
+static void
+mainloop (void)
+{
+ SDL_Event event;
+ while (SDL_PollEvent (&event))
+ {
+ handle_event (&data, &event);
+ cogl_sdl_handle_event (ctx, &event);
+ }
+
+ redraw (&data);
+ data.redraw_queued = FALSE;
+ data.ready_to_draw = FALSE;
+
+ cogl_sdl_idle (ctx);
+}
+
+int
+main (int argc, char **argv)
+{
+ CoglOnscreen *onscreen;
+ CoglError *error = NULL;
+ CoglVertexP2C4 triangle_vertices[] = {
+ {0, 0.7, 0xff, 0x00, 0x00, 0xff},
+ {-0.7, -0.7, 0x00, 0xff, 0x00, 0xff},
+ {0.7, -0.7, 0x00, 0x00, 0xff, 0xff}
+ };
+
+ ctx = cogl_sdl_context_new (SDL_USEREVENT, &error);
+ if (!ctx)
+ {
+ fprintf (stderr, "Failed to create context: %s\n", error->message);
+ return 1;
+ }
+
+ onscreen = cogl_onscreen_new (ctx, 800, 600);
+ data.fb = COGL_FRAMEBUFFER (onscreen);
+
+ cogl_onscreen_add_frame_callback (onscreen,
+ frame_cb,
+ &data,
+ NULL /* destroy callback */);
+
+ data.center_x = 0.0f;
+ data.center_y = 0.0f;
+
+ cogl_onscreen_show (onscreen);
+
+ data.triangle = cogl_primitive_new_p2c4 (ctx, COGL_VERTICES_MODE_TRIANGLES,
+ 3, triangle_vertices);
+ data.pipeline = cogl_pipeline_new (ctx);
+
+ data.redraw_queued = TRUE;
+ data.ready_to_draw = TRUE;
+
+ emscripten_set_main_loop (mainloop, -1, TRUE);
+
+ cogl_object_unref (ctx);
+
+ return 0;
+}
diff --git a/examples/cogl-info.c b/examples/cogl-info.c
index 1680f7d5..0a29d99c 100644
--- a/examples/cogl-info.c
+++ b/examples/cogl-info.c
@@ -222,7 +222,11 @@ main (int argc, char **argv)
const char *winsys_name;
OutputState output_state;
+#ifdef COGL_HAS_EMSCRIPTEN_SUPPORT
+ ctx = cogl_sdl_context_new (SDL_USEREVENT, &error);
+#else
ctx = cogl_context_new (NULL, &error);
+#endif
if (!ctx) {
fprintf (stderr, "Failed to create context: %s\n", error->message);
return 1;