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

;;

;; OpenGL Constellation Video

;;

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


(gfx:start-live-video)


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

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

(define *gl:texture-rectangle-arb* 34037)


(define init

   (lambda ()

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

      (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* 40.0 (/ 640 480) 1.0 500.0)

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


(define load-texture

   (lambda (time)      

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

      (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-rectangle-arb* *gl:texture-mag-filter* *gl:nearest*)

      (gl:tex-parameter *gl* *gl:texture-rectangle-arb* *gl:texture-min-filter* *gl:nearest*)

      

      (gl:bind-texture *gl* *gl:texture-rectangle-arb* *texture*)

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

                       (car *image-size*) 

                       (cdr *image-size*) 

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

                       *data*)

      (callback (+ time 1000) 'load-texture (+ time 2000))))


(define draw-rect

   (lambda (x y d)

      (gl:tex-coord-2d *gl* 0 0)

      (gl:vertex *gl* x y d)  

      (gl:tex-coord-2d *gl* 0 480)                

      (gl:vertex *gl* x (+ y 2.0) d)

      (gl:tex-coord-2d *gl* 640 480)      

      (gl:vertex *gl* (+ x 3.0) (+ y 2.0) d)

      (gl:tex-coord-2d *gl* 640 0)      

      (gl:vertex *gl* (+ x 3.0) y d)

      (gl:tex-coord-2d *gl* 0 0)))      


(define xv (make-vector 200 0))

(define yv (make-vector 200 0))

(define dv (make-vector 200 0))


(define rand (make-vector 200 0))


(math:vector-rand xv)

(math:vector-rand yv)

(math:vector-rand dv)


(math:vector* xv 30)

(math:vector* yv 30)

(math:vector* dv 50)


(define draw

   (lambda (time angle)

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

      (gl:push-matrix *gl*)

      (glu:look-at *gl* (cos angle) (cos angle) (+ 0 (* 80 (cos angle))) 15 15 0 0 1 0)            

      (gl:enable *gl* *gl:texture-rectangle-arb*)                        

      (dotimes (i 200)

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

         (gl:begin *gl* *gl:quads*)         

         (draw-rect (vector-ref xv i) (vector-ref yv i) (vector-ref dv i))

         (gl:end *gl*))

      (gl:disable *gl* *gl:texture-rectangle-arb*)

      (gl:pop-matrix *gl*)      

      (gl:flush *gl*)

      (callback (+ time 500) 'draw (+ time 2000) (fmod (+ angle .01) 360))))


(define start

   (lambda ()

      (init)

      (view)

      (load-texture (now))

      (draw (now) 0)))


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