/* * 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 Gtk; using Gdk; using GL; using GLU; public class Sample : Gtk.Window { static GLfloat xRot = 0.0f; static GLfloat yRot = 0.0f; static int iShade = 2; static int iTess = 3; static const GLfloat[] lightPos = { 0.0f, 0.0f, 75.0f, 1.0f }; static const GLfloat[] specular = { 1.0f, 1.0f, 1.0f, 1.0f}; static const GLfloat[] specref = { 1.0f, 1.0f, 1.0f, 1.0f }; static const GLfloat[] ambientLight = { 0.5f, 0.5f, 0.5f, 1.0f}; static const GLfloat[] spotDir = { 0.0f, 0.0f, -1.0f }; private void realize (DrawingArea widget) { Gdk.GL.Context glcontext = Gtk.GL.GtkWidgetExtension.get_gl_context (widget); Gdk.GL.Drawable gldrawable = Gtk.GL.GtkWidgetExtension.get_gl_drawable (widget); if (!gldrawable.gl_begin (glcontext)) return; glEnable (GL_DEPTH_TEST); glEnable (GL_CULL_FACE); glFrontFace (GL_CCW); glEnable(GL_LIGHTING); glLightModelfv (GL_LIGHT_MODEL_AMBIENT, ambientLight); glLightfv (GL_LIGHT0, GL_DIFFUSE, ambientLight); glLightfv (GL_LIGHT0, GL_SPECULAR, specular); glLightfv (GL_LIGHT0, GL_POSITION, lightPos); glLightf (GL_LIGHT0, GL_SPOT_CUTOFF, 50.0f); glEnable (GL_LIGHT0); glEnable (GL_COLOR_MATERIAL); glColorMaterial (GL_FRONT, GL_AMBIENT_AND_DIFFUSE); glMaterialfv (GL_FRONT, GL_SPECULAR, specref); glMateriali (GL_FRONT, GL_SHININESS,128); glClearColor (0.0f, 0.0f, 0.0f, 1.0f); gldrawable.gl_end (); } private bool configure_event (DrawingArea widget, Gdk.EventConfigure event) { Gdk.GL.Context glcontext = Gtk.GL.GtkWidgetExtension.get_gl_context (widget); Gdk.GL.Drawable gldrawable = Gtk.GL.GtkWidgetExtension.get_gl_drawable (widget); if (!gldrawable.gl_begin (glcontext)) return false; int w = widget.allocation.width; int h = widget.allocation.height; glViewport (0, 0, (GLsizei)w, (GLsizei)h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); GLfloat fAspect = (GLfloat)w / (GLfloat)h; gluPerspective (35.0f, fAspect, 1.0f, 500.0f); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef (0.0f, 0.0f, -250.0f); gldrawable.gl_end (); return true; } private bool expose_event (DrawingArea widget, Gdk.EventExpose event) { Gdk.GL.Context glcontext = Gtk.GL.GtkWidgetExtension.get_gl_context (widget); Gdk.GL.Drawable gldrawable = Gtk.GL.GtkWidgetExtension.get_gl_drawable (widget); if (!gldrawable.gl_begin (glcontext)) return false; if (iShade == 1) glShadeModel (GL_FLAT); else glShadeModel (GL_SMOOTH); glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix (); glRotatef (xRot, 1.0f, 0.0f, 0.0f); glRotatef (yRot, 0.0f, 1.0f, 0.0f); glLightfv (GL_LIGHT0, GL_POSITION, lightPos); glLightfv (GL_LIGHT0, GL_SPOT_DIRECTION, spotDir); glColor3ub(255,0,0); glTranslatef (lightPos[0], lightPos[1], lightPos[2]); Gdk.GL.Draw.cone (true, 4.0f, 6.0f, 15, 15); glPushAttrib (GL_LIGHTING_BIT); glDisable (GL_LIGHTING); glColor3ub (255,255,0); Gdk.GL.Draw.sphere (true, 3.0f, 15, 15); glPopAttrib (); glPopMatrix (); glColor3ub (0, 0, 255); if(iTess == 1) Gdk.GL.Draw.sphere (true, 30.0f, 7, 7); else if (iTess == 2) Gdk.GL.Draw.sphere (true, 30.0f, 15, 15); else Gdk.GL.Draw.sphere (true, 30.0f, 50, 50); if (gldrawable.is_double_buffered ()) gldrawable.swap_buffers (); else glFlush (); gldrawable.gl_end (); return true; } private bool key_press (DrawingArea drawing_area, Gdk.EventKey event) { string key = Gdk.keyval_name (event.keyval); if(key == "Up") xRot-= 5.0f; if(key == "Down") xRot += 5.0f; if(key == "Left") yRot -= 5.0f; if(key == "Right") yRot += 5.0f; if(xRot > 356.0f) xRot = 0.0f; if(xRot < -1.0f) xRot = 355.0f; if(yRot > 356.0f) yRot = 0.0f; if(yRot < -1.0f) yRot = 355.0f; queue_draw (); return true; } construct { title = "simple"; set_reallocate_redraws (true); destroy.connect (Gtk.main_quit); Gdk.GL.Config glconfig = new Gdk.GL.Config.by_mode (Gdk.GL.ConfigMode.RGB | Gdk.GL.ConfigMode.DOUBLE | Gdk.GL.ConfigMode.DEPTH); DrawingArea drawing_area = new DrawingArea (); drawing_area.set_size_request (800, 600); Gtk.GL.GtkWidgetExtension.set_gl_capability (drawing_area, glconfig, null, true, Gdk.GL.RenderType.RGBA_TYPE); drawing_area.realize.connect (realize); drawing_area.configure_event.connect (configure_event); drawing_area.expose_event.connect (expose_event); drawing_area.add_events (Gdk.EventMask.KEY_PRESS_MASK); drawing_area.can_focus = true; drawing_area.key_press_event.connect (key_press); add (drawing_area); } public static void main (string[] args) { Gtk.init (ref args); Gtk.GL.init (ref args); var sample = new Sample (); sample.show_all (); Gtk.main (); } }