diff --git a/examples/Makefile.am b/examples/Makefile.am index 8403a4602..f96ae653b 100644 --- a/examples/Makefile.am +++ b/examples/Makefile.am @@ -51,6 +51,12 @@ cogland_SOURCES = cogland.c cogland_LDADD = $(common_ldadd) endif +if SUPPORT_SDL +programs += cogl-sdl-hello +cogl_sdl_hello_SOURCES = cogl-sdl-hello.c +cogl_sdl_hello_LDADD = $(common_ldadd) +endif + if INSTALL_EXAMPLES bin_PROGRAMS = $(programs) else diff --git a/examples/cogl-sdl-hello.c b/examples/cogl-sdl-hello.c new file mode 100644 index 000000000..315adf2e9 --- /dev/null +++ b/examples/cogl-sdl-hello.c @@ -0,0 +1,118 @@ +#include +#include +#include +#include + +/* This short example is just to demonstrate mixing SDL with Cogl as a + simple way to get portable support for events */ + +typedef struct Data +{ + CoglColor black; + CoglPrimitive *triangle; + float center_x, center_y; + CoglFramebuffer *fb; +} Data; + +static void +redraw (Data *data) +{ + cogl_clear (&data->black, COGL_BUFFER_BIT_COLOR); + + cogl_push_matrix (); + cogl_translate (data->center_x, -data->center_y, 0.0f); + + cogl_primitive_draw (data->triangle); + cogl_pop_matrix (); + + cogl_framebuffer_swap_buffers (data->fb); +} + +int +main (int argc, char **argv) +{ + CoglRenderer *renderer; + CoglDisplay *display; + CoglContext *ctx; + CoglOnscreen *onscreen; + GError *error = NULL; + CoglVertexP2C4 triangle_vertices[] = { + {0, 0.7, 0xff, 0x00, 0x00, 0x80}, + {-0.7, -0.7, 0x00, 0xff, 0x00, 0xff}, + {0.7, -0.7, 0x00, 0x00, 0xff, 0xff} + }; + Data data; + SDL_Event event; + + /* Force the SDL winsys */ + renderer = cogl_renderer_new (); + cogl_renderer_set_winsys_id (renderer, COGL_WINSYS_ID_SDL); + display = cogl_display_new (renderer, NULL); + ctx = cogl_context_new (display, &error); + if (!ctx) + { + fprintf (stderr, "Failed to create context: %s\n", error->message); + return 1; + } + + onscreen = cogl_onscreen_new (ctx, 800, 600); + /* Eventually there will be an implicit allocate on first use so this + * will become optional... */ + data.fb = COGL_FRAMEBUFFER (onscreen); + if (!cogl_framebuffer_allocate (data.fb, &error)) + { + fprintf (stderr, "Failed to allocate framebuffer: %s\n", + error->message); + return 1; + } + + cogl_color_set_from_4ub (&data.black, 0, 0, 0, 255); + data.center_x = 0.0f; + data.center_y = 0.0f; + + cogl_onscreen_show (onscreen); + + cogl_push_framebuffer (data.fb); + + data.triangle = cogl_primitive_new_p2c4 (COGL_VERTICES_MODE_TRIANGLES, + 3, triangle_vertices); + while (SDL_WaitEvent (&event)) + { + switch (event.type) + { + case SDL_VIDEOEXPOSE: + redraw (&data); + 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; + + redraw (&data); + } + break; + + case SDL_QUIT: + goto done; + } + } + + fprintf (stderr, "Error waiting for an event: %s\n", + SDL_GetError ()); + + done: + + cogl_pop_framebuffer (); + + cogl_object_unref (ctx); + cogl_object_unref (display); + cogl_object_unref (renderer); + + return 0; +}