+#include <config.h>
+#include <gtk/gtk.h>
+#include <gtk/gtkgl.h>
+#include <gdk/gdkkeysyms.h>
+#include <GL/gl.h>
+#include <math.h>
+
+float boxv[][3] = {
+ { -0.5, -0.5, -0.5 },
+ { 0.5, -0.5, -0.5 },
+ { 0.5, 0.5, -0.5 },
+ { -0.5, 0.5, -0.5 },
+ { -0.5, -0.5, 0.5 },
+ { 0.5, -0.5, 0.5 },
+ { 0.5, 0.5, 0.5 },
+ { -0.5, 0.5, 0.5 }
+};
+#define ALPHA 0.5
+
+static float ang = 30.;
+
+gboolean expose (GtkWidget *da, GdkEventExpose *event, gpointer user_data)
+{
+ GdkGLContext *glcontext = gtk_widget_get_gl_context (da);
+ GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable (da);
+
+ // g_print (" :: expose\n");
+
+ if (!gdk_gl_drawable_gl_begin (gldrawable, glcontext))
+ {
+ g_assert_not_reached ();
+ }
+
+ /* draw in here */
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ glPushMatrix();
+
+ glRotatef (ang, 1, 0, 1);
+
+ glShadeModel(GL_FLAT);
+
+ glBegin (GL_LINES);
+ glColor3f (1., 0., 0.);
+ glVertex3f (0., 0., 0.);
+ glVertex3f (1., 0., 0.);
+ glEnd ();
+
+ glBegin (GL_LINES);
+ glColor3f (0., 1., 0.);
+ glVertex3f (0., 0., 0.);
+ glVertex3f (0., 1., 0.);
+ glEnd ();
+
+ glBegin (GL_LINES);
+ glColor3f (0., 0., 1.);
+ glVertex3f (0., 0., 0.);
+ glVertex3f (0., 0., 1.);
+ glEnd ();
+
+ glBegin(GL_LINES);
+ glColor3f (1., 1., 1.);
+ glVertex3fv(boxv[0]);
+ glVertex3fv(boxv[1]);
+
+ glVertex3fv(boxv[1]);
+ glVertex3fv(boxv[2]);
+
+ glVertex3fv(boxv[2]);
+ glVertex3fv(boxv[3]);
+
+ glVertex3fv(boxv[3]);
+ glVertex3fv(boxv[0]);
+
+ glVertex3fv(boxv[4]);
+ glVertex3fv(boxv[5]);
+
+ glVertex3fv(boxv[5]);
+ glVertex3fv(boxv[6]);
+
+ glVertex3fv(boxv[6]);
+ glVertex3fv(boxv[7]);
+
+ glVertex3fv(boxv[7]);
+ glVertex3fv(boxv[4]);
+
+ glVertex3fv(boxv[0]);
+ glVertex3fv(boxv[4]);
+
+ glVertex3fv(boxv[1]);
+ glVertex3fv(boxv[5]);
+
+ glVertex3fv(boxv[2]);
+ glVertex3fv(boxv[6]);
+
+ glVertex3fv(boxv[3]);
+ glVertex3fv(boxv[7]);
+ glEnd();
+
+ glPopMatrix ();
+
+ if (gdk_gl_drawable_is_double_buffered (gldrawable))
+ gdk_gl_drawable_swap_buffers (gldrawable);
+
+ else
+ glFlush ();
+
+ gdk_gl_drawable_gl_end (gldrawable);
+
+ return TRUE;
+}
+
+gboolean configure(GtkWidget *da, GdkEventConfigure *event, gpointer user_data)
+{
+ GdkGLContext *glcontext = gtk_widget_get_gl_context (da);
+ GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable (da);
+
+ if (!gdk_gl_drawable_gl_begin (gldrawable, glcontext))
+ {
+ g_assert_not_reached ();
+ }
+
+ glLoadIdentity();
+ glViewport (0, 0, da->allocation.width, da->allocation.height);
+ glOrtho (-10,10,-10,10,-20050,10000);
+ glEnable (GL_BLEND);
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+ glScalef (10., 10., 10.);
+
+ gdk_gl_drawable_gl_end (gldrawable);
+
+ return TRUE;
+}
+
+gboolean rotate (gpointer user_data)
+{
+ GtkWidget *da = GTK_WIDGET (user_data);
+
+ ang++;
+
+ gdk_window_invalidate_rect (da->window, &da->allocation, FALSE);
+ gdk_window_process_updates (da->window, FALSE);
+
+ return TRUE;
+}