diff options
author | Robert Bragg <robert@linux.intel.com> | 2013-04-28 02:42:24 +0100 |
---|---|---|
committer | Robert Bragg <robert@linux.intel.com> | 2013-05-29 19:10:55 +0100 |
commit | a3bc2e7539391b074e697839dfae60b69c37cf10 (patch) | |
tree | 670a972b27b5b13687acd657e2c528f02fe2724f /examples | |
parent | ba79020e0f5b102e8b25cd831c408dd68d241297 (diff) | |
download | cogl-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.am | 20 | ||||
-rw-r--r-- | examples/cogl-emscripten-hello.c | 135 | ||||
-rw-r--r-- | examples/cogl-info.c | 4 |
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; |