;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;

;; A trivial little compiled opengl example

;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


;; create opengl context

(define gl (gl:make-opengl))

(gl:open-opengl gl '(0 0 800 600))


;; compile opengl code

(definec gltest

   (lambda (ctx time:double)

      (CGLSetCurrentContext ctx)

      (CGLLockContext ctx)

      (glClear (+ GL_DEPTH_BUFFER_BIT GL_COLOR_BUFFER_BIT))

      (glLoadIdentity)

      (dotimes (i 100)

         (glRotated (* 0.25 (i64tod i)) 0.0 1.0 1.0)                   

         (glTranslated (* .05 (cos time)) 0.0 0.0)

         (glutWireCube 0.05))

      (CGLFlushDrawable ctx)

      (CGLUnlockContext ctx)))



;; get CGLContext from Impromptu OpenGL context

(define *cglctx* (objc:call (objc:call gl "openGLContext") "CGLContextObj"))


;; repeatedly call compiled code in loop

(define loop

   (lambda (beat) 

      (gltest *cglctx* beat)

      (callback (*metro* (+ beat (* 1/2 1/12))) 'loop (+ beat 1/12))))


;; start loop

(loop (*metro* 'get-beat 4))