2 (asdf:oos
'asdf
:load-op
'#:cl-glfw
)
3 (asdf:oos
'asdf
:load-op
'#:cl-glfw-opengl-version_1_0
)
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
)
208 (defun make-grid (rows cols
)
209 "makes a triangle-strip with 1+r+2rc vertices;
210 fills (0 to rows, 0 to cols, 0)"
211 (let ((v (make-array (list (+ 1 rows
(* 2 rows cols
))
214 (i 1) ; first vertex is (0, 0)
221 (if (= (mod row
2) 0)
222 (loop for col from
0 below cols
226 finally
(put (1+ row
) cols
))
227 (loop for col from cols above
0
231 finally
(put (1+ row
) 0)))))
233 :type
:triangle-strip
236 (defparameter *grid
* (make-grid 4 5))
240 (defparameter *view-rotx
* 0)
241 (defparameter *view-roty
* 0)
242 (defparameter *view-rotz
* 0)
244 (defun key-callback (key action
)
245 (when (eql action glfw
:+press
+)
248 (if (eql (glfw:get-key glfw
:+key-lshift
+) glfw
:+press
+)
250 (incf *view-rotz
* 5)))
251 (:esc
(glfw:close-window
))
252 (:up
(incf *view-rotx
* 5))
253 (:down
(decf *view-rotx
* 5))
254 (:left
(incf *view-roty
* 5))
255 (:right
(decf *view-roty
* 5)))))
257 (defun view-gl-object (obj)
263 (glfw:do-window
(:title
"Shape Viewer" :width
640 :height
480)
264 ((glfw:enable glfw
:+sticky-keys
+)
265 (glfw:enable glfw
:+key-repeat
+)
266 (gl:enable gl
:+cull-face
+)
267 (glfw:swap-interval
0)
268 (glfw:set-key-callback
'key-callback
)
269 (setf t0
(glfw:get-time
)
272 (when (eql (glfw:get-key glfw
:+key-esc
+) glfw
:+press
+)
273 (return-from glfw
:do-window
))
275 (setf t1
(glfw:get-time
))
277 (when (> (- t1 t0
) 1)
278 (glfw:set-window-title
(format nil
"Shape Viewer (~,1f FPS)" (/ frames
(- t1 t0
))))
284 (destructuring-bind (width height
) (glfw:get-window-size
)
285 (setf height
(max height
1))
286 (gl:viewport
0 0 width height
)
288 (gl:clear-color
0 0 0 0)
289 (gl:clear gl
:+color-buffer-bit
+)
291 (gl:matrix-mode gl
:+projection
+)
293 (glu:perspective
65 (/ width height
) 1 100)
294 (gl:matrix-mode gl
:+modelview
+)
300 (gl:translate-f
0 14 0)
303 (gl:rotate-f
*view-rotx
* 1 0 0)
304 (gl:rotate-f
*view-roty
* 0 1 0)
305 (gl:rotate-f
*view-rotz
* 0 0 1)
307 (render-gl-object obj
))))))
309 (view-gl-object *tetrahedron
*)