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

;;

;; OpenGL Star Burst (or 3d potpuri :)

;;

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


(define width 640)

(define height 480)


(define *gl* (gl:make-opengl width height))


(define *size* 200)

(define x (make-vector *size*))

(define y (make-vector *size*))

(define z (make-vector *size*))

(define green (make-vector *size*))

(define rand (make-vector *size*))

(math:vector= x 0.0)

(math:vector= y 0.0)

(math:vector= z 0.0)

(math:vector-rand green)


(define init

   (lambda ()

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

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

      (gl:light *gl* *gl:light0* *gl:diffuse* (vector 1 .3 0 1))

      (gl:light *gl* *gl:light0* *gl:specular* (vector 1 1 1 1))

      (gl:light *gl* *gl:light0* *gl:position* (vector 0.0 1.0 3.0 0.0))

      

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

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

      (gl:depth-mask *gl* *gl:false*)

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

      (gl:enable *gl* *gl:blend*)

      (gl:blend-color *gl* 1.0 1.0 1.0 1.0)

      (gl:blend-equation *gl* *gl:func-add*)

      (gl:blend-func *gl* *gl:one* *gl:src-alpha*)))


(define view

   (lambda ()

      (gl:viewport *gl* 0 0 width height)

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

      (gl:load-identity *gl*)

      (glu:perspective *gl* 50.0 (/ width height) 1.0 100.0)

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

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


(define draw

   (lambda ()

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

      (gl:push-matrix *gl*)

      (glu:look-at *gl* 7.5 7.5 15.0 0.0 0.0 0.0 0.0 1.0 0.0)

      

      (gl:depth-mask *gl* *gl:false*)

      (let loop ((i 0))         

         (gl:push-matrix *gl*)         

         (gl:color *gl* 1.0 (vector-ref green i) 0.0 1.0)

         (gl:material *gl* *gl:front-and-back* *gl:shininess* (vector 1.0))

         (gl:material *gl* *gl:front-and-back* *gl:diffuse* (vector 1.0 (vector-ref green i) 0 1))      

         

         (gl:translate *gl* (vector-ref x i) (vector-ref y i) (vector-ref z i))         

         (glut:solid-cube *gl* 1.0)

         (if (> (random) 0.95)

             (glut:wire-cube *gl* 1.2))

         (gl:pop-matrix *gl*)

         (if (< i (- *size* 1)) (loop (+ i 1))))      

      (gl:depth-mask *gl* *gl:true*)

            

      (gl:pop-matrix *gl*)      

      (gl:flush *gl*)

      

      (math:vector-rand rand)

      (math:vector- rand 0.5)

      (math:vector* rand 0.2)

      (math:vector+ x rand)


      (math:vector-rand rand)

      (math:vector- rand 0.5)

      (math:vector* rand 0.2)            

      (math:vector+ y rand)


      (math:vector-rand rand)

      (math:vector- rand 0.5)

      (math:vector* rand 0.2)            

      (math:vector+ z rand)

      

      (callback (+ (now) 2000) 'draw)))


(init)

(view)

(draw)