Languages

Simple OpenGL sample using Gtkglext

Your rating: None Average: 5 (2 votes)
/*
 * For this samples we need to change this header file (/usr/include/gtkglext-1.0/gdk/gdkglconfig.h) because will have an compilation error.
 * replace 'GDK_IS_GL_CONFIG' with: 'GDK_GL_IS_CONFIG'
 * replace 'GDK_IS_GL_CONFIG_CLASS' with: 'GDK_GL_IS_CONFIG_CLASS'
 * I don't know if this is a bug of gtkglext.
 
 * This code do not work with compiz-fusion enabled!!!!!! 
 */
 
using GLib;
using Gtk;
using Gdk;
using GL;
 
public class Simple : Gtk.Window
{
 
        private bool on_configure_event (Gtk.DrawingArea widget, Gdk.EventConfigure event)
        {
                Gdk.GLContext glcontext   = Gtk.WidgetGL.get_gl_context (widget);
                Gdk.GLDrawable gldrawable = Gtk.WidgetGL.get_gl_drawable (widget);
 
                if (!gldrawable.gl_begin (glcontext))
                return false;
 
                glViewport (0, 0, (GLsizei)widget.allocation.width, (GLsizei)widget.allocation.height);
 
                gldrawable.gl_end ();
                return true;
        }
 
        private bool on_expose_event (Gtk.DrawingArea widget, Gdk.EventExpose event)
        {
                Gdk.GLContext glcontext   = Gtk.WidgetGL.get_gl_context (widget);
                Gdk.GLDrawable gldrawable = Gtk.WidgetGL.get_gl_drawable (widget);
 
                if (!gldrawable.gl_begin (glcontext))
                        return false;
 
                glClear (GL_COLOR_BUFFER_BIT);
 
                glBegin (GL_TRIANGLES);
                        glIndexi (0);
                        glColor3f (1.0f, 0.0f, 0.0f);
                        glVertex2i (0, 1);
                        glIndexi (0);
                        glColor3f (0.0f, 1.0f, 0.0f);
                        glVertex2i (-1, -1);
                        glIndexi (0);
                        glColor3f (0.0f, 0.0f, 1.0f);
                        glVertex2i (1, -1);
                glEnd ();
 
                if (gldrawable.is_double_buffered ())
                        gldrawable.swap_buffers ();
                else
                        glFlush ();
 
                gldrawable.gl_end ();
                return true;
        }
 
        construct
        {
                title = "simple";
                set_reallocate_redraws (true);
                destroy += Gtk.main_quit;
 
                Gdk.GLConfig glconfig = new Gdk.GLConfig.by_mode (Gdk.GLConfigMode.RGB | Gdk.GLConfigMode.DOUBLE);
 
                DrawingArea drawing_area = new DrawingArea ();
                drawing_area.set_size_request (200, 200);
 
                Gtk.WidgetGL.set_gl_capability (drawing_area, glconfig, null, true, Gdk.GLRenderType.RGBA_TYPE);
 
                drawing_area.configure_event += on_configure_event;
                drawing_area.expose_event += on_expose_event;
 
                add (drawing_area);
        }
 
        public static void main (string[] args)
        {
                Gtk.init (ref args);
                Gtk.gl_init (ref args);
 
                var simple = new Simple ();
                simple.show_all ();
 
                Gtk.main ();
        }
}