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

;;

;; OpenGL Texture examples

;;

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


(define *gl* (gl:make-opengl 640 480))

(gfx:start-live-video)

(define *texture* (gl:gen-textures *gl*))


(define init

   (lambda ()

      (gl:clear-color *gl* 0.0 0.0 0.0 0.0)

      (gl:shade-model *gl* *gl:flat*)

      (gl:enable *gl* *gl:lighting*)

      (gl:enable *gl* *gl:light0*)

      (gl:enable *gl* *gl:depth-test*)))


(define view

   (lambda ()

      (gl:viewport *gl* 0 0 640 480)

      (gl:matrix-mode *gl* *gl:projection*)

      (gl:load-identity *gl*)

      (glu:perspective *gl* 60.0 (/ 640.0 480.0) 0.1 30.0)

      (gl:matrix-mode *gl* *gl:modelview*)

      (gl:load-identity *gl*)))

      

(define load-texture

   (lambda ()      

      (define *image* (gfx:convert-image (gfx:get-live-frame)))

      (define *image2* (gfx:make-image 128 128))

      (gfx:image2image *image* *image2* 1.0 '(0 0 128 128))

      (define *image-size* (gfx:get-image-size *image2*))

      (define *data* (gl:get-image-texture-data *image2*))

      

      (gl:pixel-store *gl* *gl:unpack-row-length* (car *image-size*))

      (gl:pixel-store *gl* *gl:unpack-alignment* 1)

      

      (gl:tex-parameter *gl* *gl:texture-2d* *gl:texture-wrap-s* *gl:repeat*)

      (gl:tex-parameter *gl* *gl:texture-2d* *gl:texture-wrap-t* *gl:repeat*)

      (gl:tex-parameter *gl* *gl:texture-2d* *gl:texture-mag-filter* *gl:nearest*)

      (gl:tex-parameter *gl* *gl:texture-2d* *gl:texture-min-filter* *gl:nearest*)

      

      (gl:bind-texture *gl* *gl:texture-2d* *texture*)

      (gl:tex-image-2d *gl* *gl:texture-2d* 0 *gl:rgba8* 

                       (car *image-size*) 

                       (cdr *image-size*) 

                       0 *gl:rgba* *gl:unsigned-byte*

                       *data*)

      (callback (+ (now) 5000) 'load-texture)))


(define draw

   (lambda (angle)

      (gl:clear *gl* (io:binary-or *gl:color-buffer-bit* *gl:depth-buffer-bit*))

      (gl:push-matrix *gl*)

      (glu:look-at *gl* -2.0 -1.0 2.0 0.0 0.0 0.0 0.0 1.0 0.0)

      (gl:rotate *gl* angle 1 1 1)      

      (gl:enable *gl* *gl:texture-2d*)                  

      (glut:solid-teapot *gl* 1.0)      

      (gl:disable *gl* *gl:texture-2d*)                        

      (gl:pop-matrix *gl*)      

      (gl:flush *gl*)

      (callback (+ (now) 1000) 'draw (fmod (+ angle 3) 360))))


(define start

   (lambda ()

      (init)

      (view)

      (load-texture)

      (draw 0)))


(callback (+ (now) (* *second* 5)) 'start)