;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; 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)