[cogl] Add an example combining SDL and Cogl



commit 8304ad8992e63eaaf48ef06c0c6337a05b69f3cb
Author: Neil Roberts <neil linux intel com>
Date:   Wed Dec 14 14:09:00 2011 +0000

    Add an example combining SDL and Cogl
    
    This adds a simple example based on the hello example but that forces
    the SDL winsys and listens for mouse motion events to move the
    triangle.
    
    Reviewed-by: Robert Bragg <robert linux intel com>

 examples/Makefile.am      |    6 ++
 examples/cogl-sdl-hello.c |  118 +++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 124 insertions(+), 0 deletions(-)
---
diff --git a/examples/Makefile.am b/examples/Makefile.am
index 8403a46..f96ae65 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 0000000..315adf2
--- /dev/null
+++ b/examples/cogl-sdl-hello.c
@@ -0,0 +1,118 @@
+#include <cogl/cogl.h>
+#include <glib.h>
+#include <stdio.h>
+#include <SDL.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
+{
+  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;
+}



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]