+
+;;; Drawing
+
+(define current-color '(1 1 1 1))
+
+(define (get-current-color)
+ current-color)
+
+(define* (set-current-color red green blue #:optional (alpha 1))
+ (set! current-color (list red green blue alpha))
+ (gl-color red green blue alpha))
+
+(define-macro (with-color color . code)
+ `(cond (,color
+ (let ((original-color (get-current-color))
+ (result #f))
+ (apply set-current-color ,color)
+ (set! result (begin ,@code))
+ (apply set-current-color original-color)
+ result))
+ (else (begin ,@code))))
+
+(define (draw . vertexes)
+ (gl-begin
+ (let ((number-of-points (length vertexes)))
+ (cond ((= number-of-points 2) (begin-mode lines))
+ ((= number-of-points 3) (begin-mode triangles))
+ ((= number-of-points 4) (begin-mode quads))
+ ((> number-of-points 4) (begin-mode polygon))))
+ (draw-vertexes vertexes)))
+
+(define (draw-vertexes vertexes)
+ (cond ((not (null? vertexes))
+ (apply draw-vertex (if (list? (caar vertexes)) (car vertexes) (list (car vertexes))))
+ (draw-vertexes (cdr vertexes)))))
+
+(define* (draw-vertex vertex #:key texture-coord)
+ (cond (texture-coord (apply gl-texture-coordinates texture-coord)))
+ (apply gl-vertex vertex))