;; This example illustrates streaming mesh data using mesh-vertex-set! (import scheme (chicken bitwise) (prefix glfw3 #:glfw) (prefix epoxy #:gl) gl-math gl-utils srfi-4) (define *vertex* #<gl (mesh-mode rect)) (mesh-n-indices rect) (type->gl (mesh-index-type rect)) #f 0) (check-error) (gl:bind-vertex-array 0)) (define (cycle-colors) (define (cycle-chanel v i) (let ((val (u8vector-ref v i))) (u8vector-set! v i (cond ((= val 255) 64) ((= val 0) 0) (else (add1 val)))))) (with-mesh rect (lambda () (do ((i 0 (add1 i))) ((= i (mesh-n-vertices rect))) (let ((color (mesh-vertex-ref rect 'color i))) (cycle-chanel color 0) (cycle-chanel color 1) (cycle-chanel color 2) (mesh-vertex-set! rect 'color i color)))))) (glfw:with-window (640 480 "Example" resizable: #f context-version-major: 3 context-version-minor: 3) (set! *vertex* (make-shader gl:+vertex-shader+ *vertex*)) (set! *fragment* (make-shader gl:+fragment-shader+ *fragment*)) (program (make-program (list *vertex* *fragment*))) (mesh-make-vao! rect `((position . ,(gl:get-attrib-location (program) "position")) (color . ,(gl:get-attrib-location (program) "color"))) #:stream) (let loop () (cycle-colors) (glfw:swap-buffers (glfw:window)) (gl:clear (bitwise-ior gl:+color-buffer-bit+ gl:+depth-buffer-bit+)) (render) (glfw:poll-events) ; Because of the context version, initializing GLEW results in a harmless invalid enum (unless (glfw:window-should-close (glfw:window)) (loop))))