3 Show
3 color planes
(+x
=red
, +y
=green
, and
+z
=blue
);
4 select the color at their intersection.
7 (asdf:oos
'asdf
:load-op
'#:cl-glfw
)
8 (asdf:oos
'asdf
:load-op
'#:cl-glfw-opengl-version_1_0
)
9 (asdf:oos
'asdf
:load-op
'#:cl-glfw-glu
)
12 (defparameter *red
* 0)
13 (defparameter *green
* 0)
14 (defparameter *blue
* 0)
16 (defun key-callback (key action
)
17 (when (eql action glfw
:+press
+)
20 (if (eql (glfw:get-key glfw
:+key-lshift
+) glfw
:+press
+)
23 (:esc
(glfw:close-window
))
26 (:left
(decf *green
*))
27 (:right
(incf *green
*)))))
29 (defun color-selector ()
35 (glfw:do-window
(:title
"Color Selector" :width
640 :height
480)
36 ((glfw:enable glfw
:+sticky-keys
+)
37 (glfw:enable glfw
:+key-repeat
+)
38 (gl:disable gl
:+cull-face
+)
39 (gl:enable gl
:+depth-test
+)
40 (gl:depth-mask gl
:+true
+)
41 (glfw:swap-interval
0)
42 (glfw:set-key-callback
'key-callback
)
43 (setf t0
(glfw:get-time
)
46 (when (eql (glfw:get-key glfw
:+key-esc
+) glfw
:+press
+)
47 (return-from glfw
:do-window
))
49 (setf t1
(glfw:get-time
))
52 (glfw:set-window-title
(format nil
"Color Selector (~,1f FPS)" (/ frames
(- t1 t0
))))
58 (destructuring-bind (width height
) (glfw:get-window-size
)
59 (setf height
(max height
1))
60 (gl:viewport
0 0 width height
)
62 (gl:clear-color
0 0 0 0)
63 (gl:clear
(logior gl
:+color-buffer-bit
+
64 gl
:+depth-buffer-bit
+))
66 (gl:matrix-mode gl
:+projection
+)
68 (glu:perspective
65 (/ width height
) 1 100)
69 (gl:matrix-mode gl
:+modelview
+)
75 (gl:translate-f
0 14 0)
78 (gl:rotate-f
20 1 0 0)
80 (gl:rotate-f -
135 0 0 1)
83 (gl:with-begin gl
:+quads
+
86 (gl:vertex-3f r g b
)))
87 (macrolet ((bound (axis)
88 `(cond ((< ,axis
0) (setf ,axis
0) 0)
89 ((> ,axis
255) (setf ,axis
255) 1)
91 (let ((red (bound *red
*))
92 (green (bound *green
*))
93 (blue (bound *blue
*)))
94 ;; red (green-blue plane)
99 ;; green (blue-red plane)
104 ;; blue (red-green plane)
108 (show 1 0 blue
))))))))))