3 (defclass fenster
(window)
4 ((cursor-position :accessor cursor-position
5 :initform
(make-array 2 :element-type
'fixnum
)
6 :type
(simple-array fixnum
(2)))
7 (draw-func :accessor draw-func
10 (with-primitive :lines
11 (color 1 0 0) (vertex 0 0 0) (vertex 1 0 0)
12 (color 0 1 0) (vertex 0 0 0) (vertex 0 1 0)
13 (color 0 0 1) (vertex 0 0 0) (vertex 0 0 1)))
16 (defmethod set-view ((w fenster
) &key
(2d nil
) (view-center (v))
19 (viewport 0 0 (width w
) (height w
))
20 (matrix-mode :projection
)
23 (ortho 0 (width w
) (height w
) 0 -
1 1)
24 (let ((x (vec-x view-center
))
25 (y (vec-y view-center
))
26 (z (vec-z view-center
)))
27 (glu:perspective fov
(/ (width w
) (height w
)) .01 100)
31 (matrix-mode :modelview
)
34 (let ((field-of-view (list 30d0
))
35 (view-center (list (v))))
36 (defun update-view (&key
(center-list view-center
)
37 (fov-list field-of-view
))
38 "This function can be called from outside an OpenGL context. The
39 supplied lists will be used to set the viewpoint with glLookAt. It is
40 consumed from the front."
41 (declare (cons center-list fov-list
))
42 (assert (equal (type-of (car center-list
))
44 (assert (numberp (car fov-list
)))
45 (setf view-center center-list
46 field-of-view fov-list
))
48 (defmethod ensure-uptodate-view ((w fenster
))
49 (labels ((pop-until-last (l)
53 (set-view w
:view-center
(pop-until-last view-center
)
54 :fov
(pop-until-last field-of-view
))))
56 (defmethod display ((w fenster
))
57 (ensure-uptodate-view w
)
58 (clear :color-buffer-bit
:depth-buffer-bit
)
61 (funcall (draw-func w
))
67 (defmethod reshape ((w fenster
) x y
)
70 (ensure-uptodate-view w
))
72 (defmethod display-window :before
((w fenster
))
73 (ensure-uptodate-view w
))
75 (defmethod passive-motion ((w fenster
) x y
)
76 (setf (aref (cursor-position w
) 0) x
77 (aref (cursor-position w
) 1) (- (height w
) y
)))
79 (defmethod keyboard ((w fenster
) key x y
)
81 (#\Esc
(destroy-current-window))))
83 (defmacro with-gui
(&body body
)
85 (make-instance 'gui
:fenster
86 :mode
'(:double
:rgb
:depth
)
87 :draw-func
#'(lambda ()