3 #include <gdk/gdkkeysyms.h>
9 gboolean on_key_press(GtkWidget *widget, GdkEventKey *event, gpointer _)
11 if (event->keyval == GDK_q)
16 gboolean on_expose(GtkWidget *drawing, GdkEventExpose *event, gpointer _)
18 //glClearColor(0.5, 0.5, 1.0, 1.0);
19 glClearColor(0.0, 0.0, 0.0, 0.0);
20 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
24 /* Blend, but broken sorting */
25 //glEnable(GL_DEPTH_TEST);
26 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
28 /* No sorting, just add */
29 //glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
30 //glBlendFunc(GL_ONE, GL_ONE);
33 float light_ambient[] = {0.1f, 0.1f, 0.0f, 1.0f};
34 float light_diffuse[] = {0.9f, 0.9f, 0.9f, 1.0f};
35 float light_position[] = {-30.0f, 50.0f, 40.0f, 1.0f};
36 glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
37 glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
38 glLightfv(GL_LIGHT0, GL_POSITION, light_position);
39 glEnable(GL_COLOR_MATERIAL);
40 glEnable(GL_LIGHTING);
43 /* Set up projection */
44 glMatrixMode(GL_PROJECTION);
46 glOrtho(1,-1, -1,1, -10,10);
49 glMatrixMode(GL_MODELVIEW);
52 glTranslatef(-0.2, -0.2, -2);
53 glRotatef(30, 1, -1, -0.2);
54 glColor4f(0.6, 0.6, 0.4, 0.5);
55 gdk_gl_draw_teapot(TRUE, 0.5);
58 glTranslatef(0.2, 0.2, -2);
59 glRotatef(30, 1, -1, -0.2);
60 glColor4f(0.6, 0.6, 0.4, 0.5);
61 gdk_gl_draw_teapot(TRUE, 0.5);
64 GdkGLDrawable *gldrawable = gdk_gl_drawable_get_current();
65 if (gdk_gl_drawable_is_double_buffered(gldrawable))
66 gdk_gl_drawable_swap_buffers(gldrawable);
72 gboolean on_configure(GtkWidget *drawing, GdkEventConfigure *event, gpointer _)
75 drawing->allocation.width,
76 drawing->allocation.height);
80 int main(int argc, char **argv)
82 gtk_init(&argc, &argv);
84 GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
85 GtkWidget *drawing = gtk_drawing_area_new();
86 GdkGLConfig *glconfig = gdk_gl_config_new_by_mode((GdkGLConfigMode)(
87 GDK_GL_MODE_RGBA | GDK_GL_MODE_DEPTH |
88 GDK_GL_MODE_DOUBLE | GDK_GL_MODE_ALPHA));
89 g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
90 g_signal_connect(window, "key-press-event", G_CALLBACK(on_key_press), NULL);
91 g_signal_connect(drawing, "expose-event", G_CALLBACK(on_expose), NULL);
92 g_signal_connect(drawing, "configure-event", G_CALLBACK(on_configure), NULL);
93 gtk_widget_set_gl_capability(drawing, glconfig, NULL, TRUE, GDK_GL_RGBA_TYPE);
94 gtk_container_add(GTK_CONTAINER(window), drawing);
95 gtk_widget_show_all(window);
98 GdkGLContext *glcontext = gtk_widget_get_gl_context(GTK_WIDGET(drawing));
99 GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable(GTK_WIDGET(drawing));
100 gdk_gl_drawable_gl_begin(gldrawable, glcontext);
104 gdk_gl_drawable_gl_end(gldrawable);