+(define screen-title "")
+
+(define (set-screen-title! title)
+ (set! screen-title title)
+ (SDL_WM_SetCaption title ""))
+
+(define (get-screen-title)
+ screen-title)
+
+
+(define mode '2d)
+
+(define (set-2d-mode)
+ (set! mode '2d)
+ (glDisable GL_DEPTH_TEST)
+ (resize-screen-GL (get-screen-width) (get-screen-height)))
+
+(define (set-3d-mode)
+ (set! mode '3d)
+ (glClearDepth 1)
+ (glEnable GL_DEPTH_TEST)
+ (glDepthFunc GL_LEQUAL)
+ (resize-screen-GL (get-screen-width) (get-screen-height)))
+
+(define (3d-mode?)
+ (eq? mode '3d))
+
+
+(define (init-gl)
+ (glShadeModel GL_SMOOTH)
+ (glClearColor 0 0 0 0)
+ (glEnable GL_BLEND)
+ (glBlendFunc GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA)
+ (glHint GL_PERSPECTIVE_CORRECTION_HINT GL_NICEST))
+
+(define (resize-screen-GL width height)
+ (glViewport 0 0 width height)
+ (glMatrixMode GL_PROJECTION)
+ (glLoadIdentity)
+ (cond ((3d-mode?)
+ (let ((ratio (if (= height 0) width (/ width height))))
+ (gluPerspective 45 ratio 0.1 100)))
+ (else
+ (let* ((w (/ width 2)) (h (/ height 2)))
+ (glOrtho (- w) w (- h) h 0 1))))
+ (glMatrixMode GL_MODELVIEW)
+ (glLoadIdentity))
+
+
+;;; Frames per second
+
+(define time 0)
+(define frames-per-second 20)
+(define time-per-frame 50) ;in ms
+
+(define (get-frames-per-second)
+ frames-per-second)
+
+(define (set-frames-per-second! fps)
+ (set! frames-per-second fps)
+ (set! time-per-frame (/ 1000.0 fps)))
+
+(define (init-frame-time)
+ (set! time (SDL_GetTicks)))
+
+(define (get-frame-time)
+ time)
+
+(define (delay-frame)
+ (let ((frame-time (- (SDL_GetTicks) time)))
+ (cond ((< frame-time time-per-frame)
+ (SDL_Delay (- time-per-frame frame-time))))))
+
+
+;;; 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))
+ (glColor4f red green blue alpha))