diff options
author | David Thompson <dthompson2@worcester.edu> | 2014-11-29 13:39:16 -0500 |
---|---|---|
committer | David Thompson <dthompson2@worcester.edu> | 2014-11-29 13:39:16 -0500 |
commit | 8d4bc7f387eadbd7379fbfb19484acd7985989b9 (patch) | |
tree | 040e8c64d06143441cd60c9cab29ca18c816e9b7 | |
parent | 35dc8aa24f7062a22e088d62e7ee8a47ec781f97 (diff) |
render: Rename vertex-array to mesh.
* sly/render/vertex-array.scm: Delete.
* Makefile.am (SOURCES): Delete it.
* sly/render/mesh.scm: Move vertex-array code and rename to mesh.
* sly/render/model.scm (draw-model): s/vertex-array/mesh/
* sly/render/context.scm: Likewise.
* sly/render/shape.scm (make-cube): Return a model object.
* sly/render/font.scm (make-label): Likewise.
* sly/render/sprite.scm (make-sprite): Likewise. Remove 'color'
parameter.
(load-sprite): Likewise.
-rw-r--r-- | Makefile.am | 1 | ||||
-rw-r--r-- | sly/render/context.scm | 18 | ||||
-rw-r--r-- | sly/render/font.scm | 4 | ||||
-rw-r--r-- | sly/render/mesh.scm | 158 | ||||
-rw-r--r-- | sly/render/model.scm | 8 | ||||
-rw-r--r-- | sly/render/shape.scm | 165 | ||||
-rw-r--r-- | sly/render/sprite.scm | 39 | ||||
-rw-r--r-- | sly/render/vertex-array.scm | 173 |
8 files changed, 258 insertions, 308 deletions
diff --git a/Makefile.am b/Makefile.am index c43415e..68805f6 100644 --- a/Makefile.am +++ b/Makefile.am @@ -55,7 +55,6 @@ SOURCES = \ sly/render/shape.scm \ sly/render/sprite.scm \ sly/render/tileset.scm \ - sly/render/vertex-array.scm \ sly/render/context.scm \ $(WRAPPER_SOURCES) diff --git a/sly/render/context.scm b/sly/render/context.scm index d3bd0c3..fb28eda 100644 --- a/sly/render/context.scm +++ b/sly/render/context.scm @@ -33,7 +33,7 @@ #:use-module (sly render shader) #:use-module (sly render texture) #:use-module (sly render utils) - #:use-module (sly render vertex-array) + #:use-module (sly render mesh) #:export (make-render-context render-context? with-render-context with-temp-transform @@ -41,17 +41,17 @@ render-context-depth-test? set-render-context-depth-test?! render-context-texture set-render-context-texture! render-context-shader set-render-context-shader! - render-context-vertex-array set-render-context-vertex-array!)) + render-context-mesh set-render-context-mesh!)) (define-record-type <render-context> (%make-render-context blend-mode depth-test? texture shader - vertex-array transform-stack) + mesh transform-stack) render-context? (blend-mode render-context-blend-mode %set-render-context-blend-mode!) (depth-test? render-context-depth-test? %set-render-context-depth-test?!) (texture render-context-texture %set-render-context-texture!) (shader render-context-shader %set-render-context-shader!) - (vertex-array render-context-vertex-array %set-render-context-vertex-array!) + (mesh render-context-mesh %set-render-context-mesh!) (transform-stack render-context-transform-stack)) (define (make-null-transform) @@ -79,7 +79,7 @@ (glUseProgram 0) (%set-render-context-shader! context #f) (glBindVertexArray 0) - (%set-render-context-vertex-array! context #f)) + (%set-render-context-mesh! context #f)) (define-syntax-rule (with-render-context context body ...) (begin (render-context-reset! context) body ...)) @@ -118,10 +118,10 @@ (apply-shader-program shader) (%set-render-context-shader! context shader))) -(define (set-render-context-vertex-array! context vertex-array) - (unless (equal? (render-context-vertex-array context) vertex-array) - (apply-vertex-array vertex-array) - (%set-render-context-vertex-array! context vertex-array))) +(define (set-render-context-mesh! context mesh) + (unless (equal? (render-context-mesh context) mesh) + (apply-mesh mesh) + (%set-render-context-mesh! context mesh))) ;; emacs: (put 'with-temp-transform 'scheme-indent-function 2) (define-syntax-rule (with-temp-transform context name body ...) diff --git a/sly/render/font.scm b/sly/render/font.scm index 6be7353..e50c96a 100644 --- a/sly/render/font.scm +++ b/sly/render/font.scm @@ -116,7 +116,7 @@ HEIGHT, 32 bit color bytevector." 0 0 1 1))) (define* (make-label font text #:optional #:key - (anchor 'top-left) (color white) + (anchor 'top-left) (shader (load-default-shader))) (let ((texture (render-text font text))) - (make-sprite texture #:shader shader #:anchor anchor #:color color))) + (make-sprite texture #:shader shader #:anchor anchor))) diff --git a/sly/render/mesh.scm b/sly/render/mesh.scm index 992ef85..98510d3 100644 --- a/sly/render/mesh.scm +++ b/sly/render/mesh.scm @@ -17,29 +17,157 @@ ;;; Commentary: ;; -;; A mesh is a 2D/3D model comprised of a shader and vertex buffers. +;; Meshes encapsulate the geometry for a single OpenGL draw call. ;; ;;; Code: (define-module (sly render mesh) - #:use-module (oop goops) + #:use-module (system foreign) #:use-module (ice-9 match) #:use-module (srfi srfi-9) - #:use-module (system foreign) + #:use-module (srfi srfi-43) + #:use-module (rnrs bytevectors) #:use-module (gl) #:use-module (gl low-level) #:use-module (sly wrappers gl) + #:use-module (sly math vector) #:use-module (sly render color) #:use-module (sly render shader) - #:use-module (sly render texture) - #:use-module (sly math vector) - #:use-module (sly signal) - #:use-module (sly math transform) - #:use-module (sly render utils) - #:use-module (sly render vertex-array) - #:use-module (sly render model) - #:export (make-mesh)) - -(define* (make-mesh #:optional #:key shader texture indices positions textures) - (make-model #:shader shader #:texture texture - #:mesh (make-vertex-array indices positions textures))) + #:export (make-mesh + mesh? + mesh-id mesh-length + apply-mesh with-mesh)) + +;;; +;;; Vertex Buffer +;;; + +(define-record-type <vertex-buffer> + (%make-vertex-buffer id type attr-size length) + vertex-buffer? + (id vertex-buffer-id) + (type vertex-buffer-type) + (attr-size vertex-buffer-attr-size) + (length vertex-buffer-length)) + +(define (generate-vertex-buffer) + (let ((bv (u32vector 1))) + (glGenBuffers 1 (bytevector->pointer bv)) + (u32vector-ref bv 0))) + +(define (bind-vertex-buffer vbo) + (glBindBuffer (vertex-buffer-type vbo) + (vertex-buffer-id vbo))) + +(define-syntax-rule (with-vertex-buffer vbo body ...) + (let ((type (vertex-buffer-type vbo))) + (glBindBuffer type (vertex-buffer-id vbo)) + body ... + (glBindBuffer type 0))) + +(define (vertices-bytevector vertices index?) + (let* ((elem (vector-ref vertices 0)) + (bv (if index? + (make-u32vector (vector-length vertices)) + (make-f32vector (* (vector-length vertices) + (attribute-size elem))))) + (setter (if index? u32vector-set! f32vector-set!))) + (vector-for-each + (match-lambda* + ((i (? number? k)) + (setter bv i k)) + ((i ($ <vector2> x y)) + (let ((offset (* i 2))) + (setter bv offset x) + (setter bv (1+ offset) y))) + ((i ($ <vector3> x y z)) + (let ((offset (* i 3))) + (setter bv offset x) + (setter bv (1+ offset) y) + (setter bv (+ offset 2) z))) + ((i ($ <vector4> x y z w)) + (let ((offset (* i 4))) + (setter bv offset x) + (setter bv (1+ offset) y) + (setter bv (+ offset 2) z) + (setter bv (+ offset 3) w))) + ((i (color? c)) + (let ((offset (* i 4))) + (setter bv offset (color-r c)) + (setter bv (1+ offset) (color-g c)) + (setter bv (+ offset 2) (color-b c)) + (setter bv (+ offset 3) (color-a c))))) + vertices) + bv)) + +(define attribute-size + (match-lambda + ((? number? _) 1) + ((? vector2? _) 2) + ((? vector3? _) 3) + ((or (? vector4? _) + (? color? _)) + 4) + (attr + (error "Unsupported vertex buffer attribute: " attr)))) + +(define (gl-buffer-type index?) + (if index? + (arb-vertex-buffer-object element-array-buffer-arb) + (arb-vertex-buffer-object array-buffer-arb))) + +(define* (make-vertex-buffer vertices #:optional (index? #f)) + (let ((bv (vertices-bytevector vertices index?)) + (vbo (%make-vertex-buffer (generate-vertex-buffer) + (gl-buffer-type index?) + (attribute-size (vector-ref vertices 0)) + (vector-length vertices)))) + (with-vertex-buffer vbo + (glBufferData (vertex-buffer-type vbo) + (bytevector-length bv) + (bytevector->pointer bv) + (arb-vertex-buffer-object static-draw-arb))) + vbo)) + +;;; +;;; Mesh +;;; + +(define-record-type <mesh> + (%make-mesh id length) + mesh? + (id mesh-id) + (length mesh-length)) + +(define (generate-vertex-array) + (let ((bv (u32vector 1))) + (glGenVertexArrays 1 (bytevector->pointer bv)) + (u32vector-ref bv 0))) + +(define (apply-mesh vao) + (glBindVertexArray (mesh-id vao))) + +;; emacs: (put 'with-mesh 'scheme-indent-function 1) +(define-syntax-rule (with-mesh vao body ...) + (begin + (apply-mesh vao) + body ... + (glBindVertexArray 0))) + +(define (vertex-attrib-pointer location vbo) + (glEnableVertexAttribArray location) + (with-vertex-buffer vbo + (glVertexAttribPointer location (vertex-buffer-attr-size vbo) + (data-type float) #f 0 %null-pointer))) + +(define (make-mesh indices positions textures) + (let ((mesh (%make-mesh (generate-vertex-array) + (vector-length indices))) + (positions (make-vertex-buffer positions)) + (textures (make-vertex-buffer textures))) + (with-mesh mesh + (vertex-attrib-pointer vertex-position-location positions) + (if textures + (vertex-attrib-pointer vertex-texture-location textures)) + (bind-vertex-buffer (make-vertex-buffer indices #t))) + mesh)) diff --git a/sly/render/model.scm b/sly/render/model.scm index c766b76..7f9ead9 100644 --- a/sly/render/model.scm +++ b/sly/render/model.scm @@ -37,7 +37,7 @@ #:use-module (sly render camera) #:use-module (sly render color) #:use-module (sly render context) - #:use-module (sly render vertex-array) + #:use-module (sly render mesh) #:export (make-model model model-inherit model? model-mesh model-texture model-shader model-color @@ -49,8 +49,6 @@ (define-record-type <model> (%make-model mesh texture shader color blend-mode depth-test?) model? - ;; This is a vertex array. - ;; TODO: Rename <vertex-array> to mesh and remove old mesh type. (mesh model-mesh) (texture model-texture) (shader model-shader) @@ -103,13 +101,13 @@ CONTEXT." (set-render-context-depth-test?! context depth-test?) (set-render-context-blend-mode! context blend-mode) (set-render-context-shader! context shader) - (set-render-context-vertex-array! context mesh) + (set-render-context-mesh! context mesh) (set-render-context-texture! context texture) ;; TODO: Support user-defined uniforms. (uniform-set! shader "mvp" mvp) (uniform-set! shader "color" color) (glDrawElements (begin-mode triangles) - (vertex-array-length mesh) + (mesh-length mesh) (data-type unsigned-int) %null-pointer))))) diff --git a/sly/render/shape.scm b/sly/render/shape.scm index d6d9bf3..2df6b93 100644 --- a/sly/render/shape.scm +++ b/sly/render/shape.scm @@ -24,6 +24,7 @@ (define-module (sly render shape) #:use-module (sly math) #:use-module (sly render mesh) + #:use-module (sly render model) #:use-module (sly render shader) #:use-module (sly render texture) #:use-module (sly math vector) @@ -31,86 +32,84 @@ (define* (make-cube size #:optional #:key (texture #f) (shader (load-default-shader))) - (let ((half-size (half size))) - (make-mesh - #:shader shader - #:texture texture - #:indices #( - ;; Front - 0 3 2 0 2 1 - ;; Back - 4 6 7 4 5 6 - ;; Top - 8 11 10 8 10 9 - ;; Bottom - 12 14 15 12 13 14 - ;; Left - 16 19 18 16 18 17 - ;; Right - 20 22 23 20 21 22) - #:positions (vector - ;; Front - (vector3 (- half-size) (- half-size) (- half-size)) - (vector3 half-size (- half-size) (- half-size)) - (vector3 half-size half-size (- half-size)) - (vector3 (- half-size) half-size (- half-size)) - ;; Back - (vector3 (- half-size) (- half-size) half-size) - (vector3 half-size (- half-size) half-size) - (vector3 half-size half-size half-size) - (vector3 (- half-size) half-size half-size) - ;; Top - (vector3 (- half-size) half-size (- half-size)) - (vector3 half-size half-size (- half-size)) - (vector3 half-size half-size half-size) - (vector3 (- half-size) half-size half-size) - ;; Bottom - (vector3 (- half-size) (- half-size) (- half-size)) - (vector3 half-size (- half-size) (- half-size)) - (vector3 half-size (- half-size) half-size) - (vector3 (- half-size) (- half-size) half-size) - ;; Left - (vector3 (- half-size) (- half-size) (- half-size)) - (vector3 (- half-size) half-size (- half-size)) - (vector3 (- half-size) half-size half-size) - (vector3 (- half-size) (- half-size) half-size) - ;; Right - (vector3 half-size (- half-size) (- half-size)) - (vector3 half-size half-size (- half-size)) - (vector3 half-size half-size half-size) - (vector3 half-size (- half-size) half-size)) - #:textures (let ((s1 (texture-s1 texture)) - (t1 (texture-t1 texture)) - (s2 (texture-s2 texture)) - (t2 (texture-t2 texture))) - (vector - ;; Front - (vector2 s1 t1) - (vector2 s2 t1) - (vector2 s2 t2) - (vector2 s1 t2) - ;; Back - (vector2 s1 t1) - (vector2 s2 t1) - (vector2 s2 t2) - (vector2 s1 t2) - ;; Top - (vector2 s1 t1) - (vector2 s2 t1) - (vector2 s2 t2) - (vector2 s1 t2) - ;; Bottom - (vector2 s1 t1) - (vector2 s2 t1) - (vector2 s2 t2) - (vector2 s1 t2) - ;; Left - (vector2 s1 t1) - (vector2 s2 t1) - (vector2 s2 t2) - (vector2 s1 t2) - ;; Right - (vector2 s1 t1) - (vector2 s2 t1) - (vector2 s2 t2) - (vector2 s1 t2)))))) + (let* ((half-size (half size)) + (mesh (make-mesh #( + ;; Front + 0 3 2 0 2 1 + ;; Back + 4 6 7 4 5 6 + ;; Top + 8 11 10 8 10 9 + ;; Bottom + 12 14 15 12 13 14 + ;; Left + 16 19 18 16 18 17 + ;; Right + 20 22 23 20 21 22) + (vector + ;; Front + (vector3 (- half-size) (- half-size) (- half-size)) + (vector3 half-size (- half-size) (- half-size)) + (vector3 half-size half-size (- half-size)) + (vector3 (- half-size) half-size (- half-size)) + ;; Back + (vector3 (- half-size) (- half-size) half-size) + (vector3 half-size (- half-size) half-size) + (vector3 half-size half-size half-size) + (vector3 (- half-size) half-size half-size) + ;; Top + (vector3 (- half-size) half-size (- half-size)) + (vector3 half-size half-size (- half-size)) + (vector3 half-size half-size half-size) + (vector3 (- half-size) half-size half-size) + ;; Bottom + (vector3 (- half-size) (- half-size) (- half-size)) + (vector3 half-size (- half-size) (- half-size)) + (vector3 half-size (- half-size) half-size) + (vector3 (- half-size) (- half-size) half-size) + ;; Left + (vector3 (- half-size) (- half-size) (- half-size)) + (vector3 (- half-size) half-size (- half-size)) + (vector3 (- half-size) half-size half-size) + (vector3 (- half-size) (- half-size) half-size) + ;; Right + (vector3 half-size (- half-size) (- half-size)) + (vector3 half-size half-size (- half-size)) + (vector3 half-size half-size half-size) + (vector3 half-size (- half-size) half-size)) + (let ((s1 (texture-s1 texture)) + (t1 (texture-t1 texture)) + (s2 (texture-s2 texture)) + (t2 (texture-t2 texture))) + (vector + ;; Front + (vector2 s1 t1) + (vector2 s2 t1) + (vector2 s2 t2) + (vector2 s1 t2) + ;; Back + (vector2 s1 t1) + (vector2 s2 t1) + (vector2 s2 t2) + (vector2 s1 t2) + ;; Top + (vector2 s1 t1) + (vector2 s2 t1) + (vector2 s2 t2) + (vector2 s1 t2) + ;; Bottom + (vector2 s1 t1) + (vector2 s2 t1) + (vector2 s2 t2) + (vector2 s1 t2) + ;; Left + (vector2 s1 t1) + (vector2 s2 t1) + (vector2 s2 t2) + (vector2 s1 t2) + ;; Right + (vector2 s1 t1) + (vector2 s2 t1) + (vector2 s2 t2) + (vector2 s1 t2)))))) + (make-model #:mesh mesh #:texture texture #:shader shader))) diff --git a/sly/render/sprite.scm b/sly/render/sprite.scm index 950a81b..a4e4cd4 100644 --- a/sly/render/sprite.scm +++ b/sly/render/sprite.scm @@ -34,6 +34,7 @@ #:use-module (sly utils) #:use-module (sly math) #:use-module (sly render mesh) + #:use-module (sly render model) #:use-module (sly render shader) #:use-module (sly signal) #:use-module (sly render texture) @@ -48,8 +49,7 @@ (define* (make-sprite texture #:optional #:key (shader (load-default-shader)) - (anchor 'center) - (color white)) + (anchor 'center)) "Return a 2D rectangular mesh that displays the image TEXTURE. The size of the mesh is the size of TEXTURE, in pixels. Optionally, a custom SHADER can be specified." @@ -61,28 +61,27 @@ custom SHADER can be specified." (s1 (texture-s1 texture)) (t1 (texture-t1 texture)) (s2 (texture-s2 texture)) - (t2 (texture-t2 texture))) - (make-mesh - #:shader shader - #:texture texture - #:indices #(0 3 2 0 2 1) - #:positions (vector - (vector3 x1 y1 0) - (vector3 x2 y1 0) - (vector3 x2 y2 0) - (vector3 x1 y2 0)) - #:textures (vector - (vector2 s1 t1) - (vector2 s2 t1) - (vector2 s2 t2) - (vector2 s1 t2))))) + (t2 (texture-t2 texture)) + (mesh (make-mesh #(0 3 2 0 2 1) + (vector + (vector3 x1 y1 0) + (vector3 x2 y1 0) + (vector3 x2 y2 0) + (vector3 x1 y2 0)) + (vector + (vector2 s1 t1) + (vector2 s2 t1) + (vector2 s2 t2) + (vector2 s1 t2))))) + (make-model #:shader shader + #:texture texture + #:mesh mesh))) (define* (load-sprite file-name #:optional #:key (shader (load-default-shader)) - (anchor 'center) (color white)) + (anchor 'center)) "Return a sprite mesh for the texture loaded from FILE-NAME. Optionally, a custom SHADER can be specified." - (make-sprite (load-texture file-name) #:shader shader - #:anchor anchor #:color color)) + (make-sprite (load-texture file-name) #:shader shader #:anchor anchor)) (define* (make-animated-sprite textures frame-duration #:optional #:key (loop? #t) diff --git a/sly/render/vertex-array.scm b/sly/render/vertex-array.scm deleted file mode 100644 index 45fcdd7..0000000 --- a/sly/render/vertex-array.scm +++ /dev/null @@ -1,173 +0,0 @@ -;;; Sly -;;; Copyright (C) 2014 David Thompson <davet@gnu.org> -;;; -;;; Sly is free software: you can redistribute it and/or modify it -;;; under the terms of the GNU General Public License as published by -;;; the Free Software Foundation, either version 3 of the License, or -;;; (at your option) any later version. -;;; -;;; Sly is distributed in the hope that it will be useful, but WITHOUT -;;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -;;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public -;;; License for more details. -;;; -;;; You should have received a copy of the GNU General Public License -;;; along with this program. If not, see -;;; <http://www.gnu.org/licenses/>. - -;;; Commentary: -;; -;; Vertex arrays encapsulate the geometry for a single OpenGL draw -;; call. -;; -;;; Code: - -(define-module (sly render vertex-array) - #:use-module (system foreign) - #:use-module (ice-9 match) - #:use-module (srfi srfi-9) - #:use-module (srfi srfi-43) - #:use-module (rnrs bytevectors) - #:use-module (gl) - #:use-module (gl low-level) - #:use-module (sly wrappers gl) - #:use-module (sly math vector) - #:use-module (sly render color) - #:use-module (sly render shader) - #:export (make-vertex-array - vertex-array? - vertex-array-id vertex-array-length - apply-vertex-array with-vertex-array)) - -;;; -;;; Vertex Buffers -;;; - -(define-record-type <vertex-buffer> - (%make-vertex-buffer id type attr-size length) - vertex-buffer? - (id vertex-buffer-id) - (type vertex-buffer-type) - (attr-size vertex-buffer-attr-size) - (length vertex-buffer-length)) - -(define (generate-vertex-buffer) - (let ((bv (u32vector 1))) - (glGenBuffers 1 (bytevector->pointer bv)) - (u32vector-ref bv 0))) - -(define (bind-vertex-buffer vbo) - (glBindBuffer (vertex-buffer-type vbo) - (vertex-buffer-id vbo))) - -(define-syntax-rule (with-vertex-buffer vbo body ...) - (let ((type (vertex-buffer-type vbo))) - (glBindBuffer type (vertex-buffer-id vbo)) - body ... - (glBindBuffer type 0))) - -(define (vertices-bytevector vertices index?) - (let* ((elem (vector-ref vertices 0)) - (bv (if index? - (make-u32vector (vector-length vertices)) - (make-f32vector (* (vector-length vertices) - (attribute-size elem))))) - (setter (if index? u32vector-set! f32vector-set!))) - (vector-for-each - (match-lambda* - ((i (? number? k)) - (setter bv i k)) - ((i ($ <vector2> x y)) - (let ((offset (* i 2))) - (setter bv offset x) - (setter bv (1+ offset) y))) - ((i ($ <vector3> x y z)) - (let ((offset (* i 3))) - (setter bv offset x) - (setter bv (1+ offset) y) - (setter bv (+ offset 2) z))) - ((i ($ <vector4> x y z w)) - (let ((offset (* i 4))) - (setter bv offset x) - (setter bv (1+ offset) y) - (setter bv (+ offset 2) z) - (setter bv (+ offset 3) w))) - ((i (color? c)) - (let ((offset (* i 4))) - (setter bv offset (color-r c)) - (setter bv (1+ offset) (color-g c)) - (setter bv (+ offset 2) (color-b c)) - (setter bv (+ offset 3) (color-a c))))) - vertices) - bv)) - -(define attribute-size - (match-lambda - ((? number? _) 1) - ((? vector2? _) 2) - ((? vector3? _) 3) - ((or (? vector4? _) - (? color? _)) - 4) - (attr - (error "Unsupported vertex buffer attribute: " attr)))) - -(define (gl-buffer-type index?) - (if index? - (arb-vertex-buffer-object element-array-buffer-arb) - (arb-vertex-buffer-object array-buffer-arb))) - -(define* (make-vertex-buffer vertices #:optional (index? #f)) - (let ((bv (vertices-bytevector vertices index?)) - (vbo (%make-vertex-buffer (generate-vertex-buffer) - (gl-buffer-type index?) - (attribute-size (vector-ref vertices 0)) - (vector-length vertices)))) - (with-vertex-buffer vbo - (glBufferData (vertex-buffer-type vbo) - (bytevector-length bv) - (bytevector->pointer bv) - (arb-vertex-buffer-object static-draw-arb))) - vbo)) - -;;; -;;; Vertex Arrays -;;; - -(define-record-type <vertex-array> - (%make-vertex-array id length) - vertex-array? - (id vertex-array-id) - (length vertex-array-length)) - -(define (generate-vertex-array) - (let ((bv (u32vector 1))) - (glGenVertexArrays 1 (bytevector->pointer bv)) - (u32vector-ref bv 0))) - -(define (apply-vertex-array vao) - (glBindVertexArray (vertex-array-id vao))) - -(define-syntax-rule (with-vertex-array vao body ...) - (begin - (apply-vertex-array vao) - body ... - (glBindVertexArray 0))) - -(define (vertex-attrib-pointer location vbo) - (glEnableVertexAttribArray location) - (with-vertex-buffer vbo - (glVertexAttribPointer location (vertex-buffer-attr-size vbo) - (data-type float) #f 0 %null-pointer))) - -(define (make-vertex-array indices positions textures) - (let ((vao (%make-vertex-array (generate-vertex-array) - (vector-length indices))) - (positions (make-vertex-buffer positions)) - (textures (make-vertex-buffer textures))) - (with-vertex-array vao - (vertex-attrib-pointer vertex-position-location positions) - (if textures - (vertex-attrib-pointer vertex-texture-location textures)) - (bind-vertex-buffer (make-vertex-buffer indices #t))) - vao)) |