File: vertex-array.lisp

package info (click to toggle)
cl-sdl 0.2.2
  • links: PTS
  • area: main
  • in suites: sarge
  • size: 1,188 kB
  • ctags: 1,610
  • sloc: lisp: 8,278; ansic: 516; sh: 177; makefile: 163
file content (118 lines) | stat: -rw-r--r-- 3,311 bytes parent folder | download | duplicates (3)
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)