1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
|
(in-package #:nehe-tutorials)
(defparameter *rtri-vertex-array* 0f0)
(defparameter *rquad-vertex-array* 0f0)
(defparameter *tri-vertex-array*
(coerce '(1.0 0.0 0.0 0.0 1.0 0.0
0.0 1.0 0.0 -1.0 -1.0 1.0
0.0 0.0 1.0 1.0 -1.0 1.0
0.0 1.0 0.0 1.0 -1.0 -1.0
0.0 0.0 1.0 -1.0 -1.0 -1.0)
'(vector single-float)))
(defparameter *tri-indices-vertex-array*
(coerce '(0 1 2
0 2 3
0 3 4
0 4 1)
'(vector (unsigned-byte 8))))
(defparameter *quad-vertices-vertex-array*
'((-1f0 1f0 1f0)
(1f0 1f0 1f0)
(1f0 -1f0 1f0)
(-1f0 -1f0 1f0)
(1f0 1f0 -1f0)
(1f0 -1f0 -1f0)
(-1f0 -1f0 -1f0)
(-1f0 1f0 -1f0)))
;; A color cube!
(defparameter *quad-colors-vertex-array*
'((0f0 1f0 1f0)
(1f0 1f0 1f0)
(1f0 0f0 1f0)
(0f0 0f0 1f0)
(1f0 1f0 0f0)
(1f0 0f0 0f0)
(0f0 0f0 0f0)
(0f0 1f0 0f0)))
(defparameter *quad-indices-vertex-array*
(coerce '(0 3 2 1
1 2 5 4
4 5 6 7
0 7 6 3
0 1 4 7
2 3 6 5)
'(vector (unsigned-byte 8))))
(defparameter *quad-vertex-array*
(coerce (loop for color in *quad-colors-vertex-array*
and vertex in *quad-vertices-vertex-array*
append color
append vertex)
'(vector single-float)))
(defun draw-triangles-vertex-array ()
(gl:with-vertex-array-in-use (va *tri-vertex-array* :float)
(gl:interleaved-arrays gl:+c3f-v3f+ 0 va)
(sgum:with-octet-vector (indices *tri-indices-vertex-array*)
(gl:draw-elements gl:+triangles+
(length *tri-indices-vertex-array*)
gl:+unsigned-byte+
indices))))
(defun draw-quads-vertex-array (quad)
(gl:with-vertex-array-in-use (va quad :float)
(gl:interleaved-arrays gl:+c3f-v3f+ 0 va)
(sgum:with-octet-vector (indices *quad-indices-vertex-array*)
(gl:draw-elements gl:+quads+
(length *quad-indices-vertex-array*)
gl:+unsigned-byte+
indices))))
(defun draw-gl-scene-vertex-array (surface)
(declare (ignorable surface))
(gl:clear (logior gl:+color-buffer-bit+
gl:+depth-buffer-bit+))
(gl:load-identity)
(gl:translate-f -1.5f0 0.0f0 -6.0f0)
(gl:rotate-f *rtri-vertex-array* 0f0 1f0 0f0)
(draw-triangles-vertex-array)
(gl:load-identity)
(gl:translate-f 1.5f0 0f0 -6f0)
(gl:rotate-f *rquad-vertex-array* 1f0 1f0 1f0)
(gl:color-3f 0.5f0 0.5f0 1.0f0)
(draw-quads-vertex-array *quad-vertex-array*)
(sdl:gl-swap-buffers)
(incf *rtri-vertex-array* 0.2f0)
(decf *rquad-vertex-array* 0.15f0)
t)
(defun initgl-vertex-array ()
(gl:shade-model gl:+smooth+)
(gl:clear-color 0.0f0 0.0f0 0.0f0 0.0f0)
(gl:clear-depth 1.0d0)
(gl:enable gl:+depth-test+)
(gl:depth-func gl:+lequal+)
(gl:hint gl:+perspective-correction-hint+ gl:+nicest+)
(gl:enable-client-state gl:+vertex-array+)
(gl:enable-client-state gl:+color-array+)
t)
(register-tutorial :vertex-array
:init-gl-fn #'initgl-vertex-array
:event-loop-fn #'event-loop0
:update-fn #'draw-gl-scene-vertex-array)
|