Added cl-gtk2-gtk-glext (initial patch by Vitaly Mayatskikh adopted from cells-gtk3)
[cl-gtk2.git] / gtk-glext / demo.lisp
1 (defpackage :gtk-glext-demo
2   (:use :cl :gtk :gtkglext :gobject :glib)
3   (:export :run))
4
5 (in-package :gtk-glext-demo)
6
7 (defvar *theta* 30)
8
9 (defun draw (widget event)
10   (declare (ignore event))
11   (with-gl-context (widget)
12     (gl:clear-color 0 0 0 0)
13     (gl:cull-face :back)
14     (gl:depth-func :less)
15     (gl:disable :dither)
16     (gl:shade-model :smooth)
17     (gl:light-model :light-model-local-viewer 1)
18     (gl:color-material :front :ambient-and-diffuse)
19     (gl:enable :light0 :lighting :cull-face :depth-test)
20     (gl:load-identity)
21     (gl:translate 0 0 -5)
22     (gl:rotate *theta* 1 1 0)
23     (gl:light :light0 :position '(0 1 1 0))
24     (gl:light :light0 :diffuse '(0.2 0.4 0.6 0))
25     (gl:clear :color-buffer-bit :depth-buffer-bit)
26     (gl:color 1 1 1)
27     (gl:front-face :cw)
28     (glut:solid-teapot 1.5)
29     (gl:front-face :ccw)
30     (gl:flush)))
31
32 (defun run ()
33   (with-main-loop
34     (setf *theta* 30)
35     (let ((window (make-instance 'gtk-window
36                                  :type :toplevel
37                                  :window-position :center
38                                  :title "Hello world!"
39                                  :default-width 320
40                                  :default-height 240))
41           (v-box (make-instance 'v-box))
42           (label (make-instance 'label :label "Click me!"))
43           (drawing (make-instance 'gl-drawing-area :on-draw #'draw)))
44       (box-pack-start v-box drawing)
45       (box-pack-start v-box label :expand nil)
46       (container-add window v-box)
47       (let ((source-id (gtk-main-add-timeout 100 (lambda ()
48                                                   (setf *theta*
49                                                         (mod (+ *theta* 0.5) 360))
50                                                   (widget-queue-draw drawing)
51                                                   (setf (label-label label)
52                                                         (format nil "Theta = ~A" *theta*))
53                                                   t))))
54         (connect-signal window "delete-event" (lambda (w e)
55                                                 (declare (ignore w e))
56                                                 (g-source-remove source-id)
57                                                 nil)))
58       (widget-show window :all t))))