+++ /dev/null
-#include <gtk/gtk.h>
-#include <gtk/gtkgl.h>
-#include <gdk/gdkkeysyms.h>
-#include <GL/gl.h>
-#include <GL/glu.h>
-
-guint tex, texl, texr;
-
-gboolean on_key_press(GtkWidget *widget, GdkEventKey *event, gpointer _)
-{
- if (event->keyval == GDK_q)
- gtk_main_quit();
- return FALSE;
-}
-
-gboolean on_expose(GtkWidget *drawing, GdkEventExpose *event, gpointer _)
-{
- glClearColor(0.5, 0.5, 1.0, 1.0);
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- glOrtho(-1,1, -1,1, 10,-10);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- glTranslatef(0, 0, -5);
-
- glEnable(GL_COLOR_MATERIAL);
- glDisable(GL_TEXTURE_2D);
- glColor3f(1.0, 1.0, 1.0);
- glBegin(GL_QUADS);
- glVertex3f(-0.25, -0.75, 0.0);
- glVertex3f(-0.25, 0.75, 0.0);
- glVertex3f( 0.25, 0.75, 0.0);
- glVertex3f( 0.25, -0.75, 0.0);
- glEnd();
-
- /* Textures */
- glDisable(GL_COLOR_MATERIAL);
- glEnable(GL_TEXTURE_2D);
- glEnable(GL_BLEND);
-
- gdouble y = 0.875;
-
- /* Left */
- glBlendFunc(GL_ONE, GL_ZERO);
- glBindTexture(GL_TEXTURE_2D, texl);
- glBegin(GL_QUADS);
- glTexCoord2f(0.0, y); glVertex3f(-0.75, 0.0, 0.0);
- glTexCoord2f(0.0, 1.0); glVertex3f(-0.75, 0.5, 0.0);
- glTexCoord2f(2.0, 1.0); glVertex3f( 0.75, 0.5, 0.0);
- glTexCoord2f(2.0, y); glVertex3f( 0.75, 0.0, 0.0);
- glEnd();
-
- /* Right */
- glBlendFunc(GL_ONE, GL_ONE);
- glBindTexture(GL_TEXTURE_2D, texr);
- glBegin(GL_QUADS);
- glTexCoord2f(-1.0, y); glVertex3f(-0.75, 0.0, 0.0);
- glTexCoord2f(-1.0, 1.0); glVertex3f(-0.75, 0.5, 0.0);
- glTexCoord2f( 1.0, 1.0); glVertex3f( 0.75, 0.5, 0.0);
- glTexCoord2f( 1.0, y); glVertex3f( 0.75, 0.0, 0.0);
- glEnd();
-
- /* Bottom */
- glBlendFunc(GL_ONE, GL_ZERO);
- glBindTexture(GL_TEXTURE_2D, tex);
- glBegin(GL_QUADS);
- glTexCoord2f(0.0, 0.0); glVertex3f(-0.75, -0.5, 0.0);
- glTexCoord2f(0.0, 1.0-y); glVertex3f(-0.75, -0.0, 0.0);
- glTexCoord2f(1.0, 1.0-y); glVertex3f( 0.75, -0.0, 0.0);
- glTexCoord2f(1.0, 0.0); glVertex3f( 0.75, -0.5, 0.0);
- glEnd();
-
-
- /* Flush */
- GdkGLDrawable *gldrawable = gdk_gl_drawable_get_current();
- if (gdk_gl_drawable_is_double_buffered(gldrawable))
- gdk_gl_drawable_swap_buffers(gldrawable);
- else
- glFlush();
- return FALSE;
-}
-gboolean on_configure(GtkWidget *drawing, GdkEventConfigure *event, gpointer _)
-{
- glViewport(0, 0,
- drawing->allocation.width,
- drawing->allocation.height);
- return FALSE;
-}
-
-guint load_tex(gchar *filename)
-{
- GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file(filename, NULL);
- guchar *pixels = gdk_pixbuf_get_pixels(pixbuf);
- int width = gdk_pixbuf_get_width(pixbuf);
- int height = gdk_pixbuf_get_height(pixbuf);
- int alpha = gdk_pixbuf_get_has_alpha(pixbuf);
- guint tex;
- glGenTextures(1, &tex);
- glBindTexture(GL_TEXTURE_2D, tex);
- glTexImage2D(GL_TEXTURE_2D, 0, 4, width, height, 0,
- (alpha ? GL_RGBA : GL_RGB), GL_UNSIGNED_BYTE, pixels);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
- g_object_unref(pixbuf);
- return tex;
-}
-
-int main(int argc, char **argv)
-{
- gtk_init(&argc, &argv);
-
- GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
- GtkWidget *drawing = gtk_drawing_area_new();
- GdkGLConfig *glconfig = gdk_gl_config_new_by_mode((GdkGLConfigMode)(
- GDK_GL_MODE_RGBA | GDK_GL_MODE_DEPTH |
- GDK_GL_MODE_DOUBLE | GDK_GL_MODE_ALPHA));
- g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
- g_signal_connect(window, "key-press-event", G_CALLBACK(on_key_press), NULL);
- g_signal_connect(drawing, "expose-event", G_CALLBACK(on_expose), NULL);
- g_signal_connect(drawing, "configure-event", G_CALLBACK(on_configure), NULL);
- gtk_widget_set_gl_capability(drawing, glconfig, NULL, TRUE, GDK_GL_RGBA_TYPE);
- gtk_container_add(GTK_CONTAINER(window), drawing);
- gtk_widget_show_all(window);
-
- /* OpenGL setup */
- GdkGLContext *glcontext = gtk_widget_get_gl_context(GTK_WIDGET(drawing));
- GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable(GTK_WIDGET(drawing));
- gdk_gl_drawable_gl_begin(gldrawable, glcontext);
-
- /* Load texture */
- texl = load_tex("texls.png");
- texr = load_tex("texrs.png");
- tex = load_tex("tex.png");
-
- gtk_main();
-
- gdk_gl_drawable_gl_end(gldrawable);
-}