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 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
21 glMatrixMode(GL_PROJECTION);
23 glOrtho(-1,1, -1,1, 10,-10);
24 glMatrixMode(GL_MODELVIEW);
26 glTranslatef(0, 0, -5);
28 glEnable(GL_COLOR_MATERIAL);
29 glDisable(GL_TEXTURE_2D);
30 glColor3f(1.0, 1.0, 1.0);
32 glVertex3f(-0.25, -0.75, 0.0);
33 glVertex3f(-0.25, 0.75, 0.0);
34 glVertex3f( 0.25, 0.75, 0.0);
35 glVertex3f( 0.25, -0.75, 0.0);
39 glDisable(GL_COLOR_MATERIAL);
40 glEnable(GL_TEXTURE_2D);
46 glBlendFunc(GL_ONE, GL_ZERO);
47 glBindTexture(GL_TEXTURE_2D, texl);
49 glTexCoord2f(0.0, y); glVertex3f(-0.75, 0.0, 0.0);
50 glTexCoord2f(0.0, 1.0); glVertex3f(-0.75, 0.5, 0.0);
51 glTexCoord2f(2.0, 1.0); glVertex3f( 0.75, 0.5, 0.0);
52 glTexCoord2f(2.0, y); glVertex3f( 0.75, 0.0, 0.0);
56 glBlendFunc(GL_ONE, GL_ONE);
57 glBindTexture(GL_TEXTURE_2D, texr);
59 glTexCoord2f(-1.0, y); glVertex3f(-0.75, 0.0, 0.0);
60 glTexCoord2f(-1.0, 1.0); glVertex3f(-0.75, 0.5, 0.0);
61 glTexCoord2f( 1.0, 1.0); glVertex3f( 0.75, 0.5, 0.0);
62 glTexCoord2f( 1.0, y); glVertex3f( 0.75, 0.0, 0.0);
66 glBlendFunc(GL_ONE, GL_ZERO);
67 glBindTexture(GL_TEXTURE_2D, tex);
69 glTexCoord2f(0.0, 0.0); glVertex3f(-0.75, -0.5, 0.0);
70 glTexCoord2f(0.0, 1.0-y); glVertex3f(-0.75, -0.0, 0.0);
71 glTexCoord2f(1.0, 1.0-y); glVertex3f( 0.75, -0.0, 0.0);
72 glTexCoord2f(1.0, 0.0); glVertex3f( 0.75, -0.5, 0.0);
77 GdkGLDrawable *gldrawable = gdk_gl_drawable_get_current();
78 if (gdk_gl_drawable_is_double_buffered(gldrawable))
79 gdk_gl_drawable_swap_buffers(gldrawable);
84 gboolean on_configure(GtkWidget *drawing, GdkEventConfigure *event, gpointer _)
87 drawing->allocation.width,
88 drawing->allocation.height);
92 guint load_tex(gchar *filename)
94 GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file(filename, NULL);
95 guchar *pixels = gdk_pixbuf_get_pixels(pixbuf);
96 int width = gdk_pixbuf_get_width(pixbuf);
97 int height = gdk_pixbuf_get_height(pixbuf);
98 int alpha = gdk_pixbuf_get_has_alpha(pixbuf);
100 glGenTextures(1, &tex);
101 glBindTexture(GL_TEXTURE_2D, tex);
102 glTexImage2D(GL_TEXTURE_2D, 0, 4, width, height, 0,
103 (alpha ? GL_RGBA : GL_RGB), GL_UNSIGNED_BYTE, pixels);
104 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
105 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
107 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
108 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
109 g_object_unref(pixbuf);
113 int main(int argc, char **argv)
115 gtk_init(&argc, &argv);
117 GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
118 GtkWidget *drawing = gtk_drawing_area_new();
119 GdkGLConfig *glconfig = gdk_gl_config_new_by_mode((GdkGLConfigMode)(
120 GDK_GL_MODE_RGBA | GDK_GL_MODE_DEPTH |
121 GDK_GL_MODE_DOUBLE | GDK_GL_MODE_ALPHA));
122 g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
123 g_signal_connect(window, "key-press-event", G_CALLBACK(on_key_press), NULL);
124 g_signal_connect(drawing, "expose-event", G_CALLBACK(on_expose), NULL);
125 g_signal_connect(drawing, "configure-event", G_CALLBACK(on_configure), NULL);
126 gtk_widget_set_gl_capability(drawing, glconfig, NULL, TRUE, GDK_GL_RGBA_TYPE);
127 gtk_container_add(GTK_CONTAINER(window), drawing);
128 gtk_widget_show_all(window);
131 GdkGLContext *glcontext = gtk_widget_get_gl_context(GTK_WIDGET(drawing));
132 GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable(GTK_WIDGET(drawing));
133 gdk_gl_drawable_gl_begin(gldrawable, glcontext);
136 texl = load_tex("texls.png");
137 texr = load_tex("texrs.png");
138 tex = load_tex("tex.png");
142 gdk_gl_drawable_gl_end(gldrawable);