2 (asdf:oos
'asdf
:load-op
'#:cl-glfw
)
3 (asdf:oos
'asdf
:load-op
'#:cl-glfw-opengl
)
4 (asdf:oos
'asdf
:load-op
'#:cl-glfw-glu
)
12 ;; (display-list) ; compiled
15 (defun gl-geometry-type (keyword)
16 "Enumeration of the OpenGL geometric object types"
20 (:line-loop gl
:+line-loop
+)
21 (:line-strip gl
:+line-strip
+)
22 (:triangles gl
:+triangles
+)
23 (:triangle-strip gl
:+triangle-strip
+)
24 (:triangle-fan gl
:+triangle-fan
+)
26 (:quad-strip gl
:+quad-strip
+)
27 (:polygon gl
:+polygon
+)))
29 (defun render-gl-object (obj)
31 (gl:with-begin
(gl-geometry-type (gl-object-type obj
))
32 (let ((position (gl-object-position obj
))
33 (color (gl-object-color obj
)))
35 (dotimes (row (array-dimension position
0))
36 (gl:color-3f
(aref color row
0)
39 (gl:vertex-3f
(aref position row
0)
41 (aref position row
2)))
42 (dotimes (row (array-dimension position
0))
43 (gl:vertex-3f
(aref position row
0)
45 (aref position row
2)))))))
47 "set alternating vertices to red,green,blue"
48 (let* ((position (gl-object-position obj
))
49 (color (make-array (array-dimensions position
))))
50 (dotimes (row (array-dimension color
0))
52 (0 (setf (aref color row
0) 1
54 (aref color row
2) 0))
55 (1 (setf (aref color row
0) 0
57 (aref color row
2) 0))
58 (2 (setf (aref color row
0) 0
60 (aref color row
2) 1))))
61 (setf (gl-object-color obj
) color
)))
64 (defparameter *tetrahedron
*
67 :position
(make-array '(6 3)
68 :initial-contents
'((0 0 1)
74 (tricolor *tetrahedron
*)
79 :position
(make-array '(14 3)
80 :initial-contents
'((0 0 0)
96 (defparameter *cube-points
*
99 :position
(make-array '(8 3)
100 :initial-contents
'((0 0 0)
109 (defparameter *octahedron
*
111 :type
:triangle-strip
112 :position
(make-array '(12 3)
113 :initial-contents
'((0 0 1)
125 (tricolor *octahedron
*)
130 (defparameter *icosahedron
*
131 (let* ((phi (/ (+ 1 (sqrt 5))
147 :type
:triangle-strip
148 :position
(make-array
150 :initial-contents
`(;; up
185 (tricolor *icosahedron
*)
187 (defparameter *icosahedron-points
*
188 (let* ((phi (/ (+ 1 (sqrt 5))
193 :position
(make-array
195 :initial-contents
`((0 1 ,phi
)
209 (defparameter *view-rotx
* 0)
210 (defparameter *view-roty
* 0)
211 (defparameter *view-rotz
* 0)
213 (cffi:defcallback key-callback
:void
((key :int
) (action :int
))
214 (when (eql action glfw
:+press
+)
215 (cond ((eql key
(char-code #\Z
))
216 (if (eql (glfw:get-key glfw
:+key-lshift
+) glfw
:+press
+)
218 (incf *view-rotz
* 5)))
219 ((eql key glfw
:+key-esc
+) (glfw:close-window
))
220 ((eql key glfw
:+key-up
+) (incf *view-rotx
* 5))
221 ((eql key glfw
:+key-down
+) (decf *view-rotx
* 5))
222 ((eql key glfw
:+key-left
+) (incf *view-roty
* 5))
223 ((eql key glfw
:+key-right
+) (decf *view-roty
* 5)))))
225 (defun view-gl-object (obj)
231 (glfw:do-window
("Shape Viewer" 640 480)
232 ((glfw:enable glfw
:+sticky-keys
+)
233 (glfw:enable glfw
:+key-repeat
+)
234 (gl:enable gl
:+cull-face
+)
235 (glfw:swap-interval
0)
236 (glfw:set-key-callback
(cffi:callback key-callback
))
237 (setf t0
(glfw:get-time
)
240 (when (eql (glfw:get-key glfw
:+key-esc
+) glfw
:+press
+)
241 (return-from glfw
:do-window
))
243 (setf t1
(glfw:get-time
))
245 (when (> (- t1 t0
) 1)
246 (glfw:set-window-title
(format nil
"Shape Viewer (~,1f FPS)" (/ frames
(- t1 t0
))))
252 (destructuring-bind (width height
) (glfw:get-window-size
)
253 (setf height
(max height
1))
254 (gl:viewport
0 0 width height
)
256 (gl:clear-color
0 0 0 0)
257 (gl:clear gl
:+color-buffer-bit
+)
259 (gl:matrix-mode gl
:+projection
+)
261 (glu:perspective
65 (/ width height
) 1 100)
262 (gl:matrix-mode gl
:+modelview
+)
268 (gl:translate-f
0 14 0)
271 (gl:rotate-f
*view-rotx
* 1 0 0)
272 (gl:rotate-f
*view-roty
* 0 1 0)
273 (gl:rotate-f
*view-rotz
* 0 0 1)
275 (render-gl-object obj
))))))
277 (view-gl-object *cube
*)