mutter/examples/cogl-sdl-hello.c

119 lines
2.8 KiB
C
Raw Normal View History

#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;
}