Added cl-gtk2-gtk-glext (initial patch by Vitaly Mayatskikh adopted from cells-gtk3)
[cl-gtk2.git] / gtk-glext / demo.lisp
diff --git a/gtk-glext/demo.lisp b/gtk-glext/demo.lisp
new file mode 100644 (file)
index 0000000..2a9e893
--- /dev/null
@@ -0,0 +1,58 @@
+(defpackage :gtk-glext-demo
+  (:use :cl :gtk :gtkglext :gobject :glib)
+  (:export :run))
+
+(in-package :gtk-glext-demo)
+
+(defvar *theta* 30)
+
+(defun draw (widget event)
+  (declare (ignore event))
+  (with-gl-context (widget)
+    (gl:clear-color 0 0 0 0)
+    (gl:cull-face :back)
+    (gl:depth-func :less)
+    (gl:disable :dither)
+    (gl:shade-model :smooth)
+    (gl:light-model :light-model-local-viewer 1)
+    (gl:color-material :front :ambient-and-diffuse)
+    (gl:enable :light0 :lighting :cull-face :depth-test)
+    (gl:load-identity)
+    (gl:translate 0 0 -5)
+    (gl:rotate *theta* 1 1 0)
+    (gl:light :light0 :position '(0 1 1 0))
+    (gl:light :light0 :diffuse '(0.2 0.4 0.6 0))
+    (gl:clear :color-buffer-bit :depth-buffer-bit)
+    (gl:color 1 1 1)
+    (gl:front-face :cw)
+    (glut:solid-teapot 1.5)
+    (gl:front-face :ccw)
+    (gl:flush)))
+
+(defun run ()
+  (with-main-loop
+    (setf *theta* 30)
+    (let ((window (make-instance 'gtk-window
+                                :type :toplevel
+                                :window-position :center
+                                :title "Hello world!"
+                                :default-width 320
+                                :default-height 240))
+          (v-box (make-instance 'v-box))
+          (label (make-instance 'label :label "Click me!"))
+         (drawing (make-instance 'gl-drawing-area :on-draw #'draw)))
+      (box-pack-start v-box drawing)
+      (box-pack-start v-box label :expand nil)
+      (container-add window v-box)
+      (let ((source-id (gtk-main-add-timeout 100 (lambda ()
+                                                  (setf *theta*
+                                                        (mod (+ *theta* 0.5) 360))
+                                                  (widget-queue-draw drawing)
+                                                  (setf (label-label label)
+                                                        (format nil "Theta = ~A" *theta*))
+                                                  t))))
+        (connect-signal window "delete-event" (lambda (w e)
+                                                (declare (ignore w e))
+                                                (g-source-remove source-id)
+                                                nil)))
+      (widget-show window :all t))))