Source
Demo source code
Crappy FFI code for reading jpegs:
image.cpp
image.lisp
Tori
(defun test1 ()
(let* ((camera-1 (camera (point-of-interest)))
(scene (scene camera-1
(lighting t
(group
(light1)
(light2-red)
(translate 0.0 0.0 15.0 camera-1)
(material :diffuse v-med :specular v-med :ambient v-lo :shininess 10.0 :child
(group (translate 4.5 0.0 0.0
(rotate -30.0 1.0 0.0 0.0 (torus 1d0 3d0 40 50)))
(translate -4.5 0.0 0.0
(rotate -30.0 1.0 0.0 0.0 (torus 1d0 3d0 40 50)))
(rotate 30.0 1.0 0.0 0.0
(torus 1d0 4.5d0 40 50)))))))))
(animate scene)))
Light - Diffuse, Specular, and Ambient
(defun test1a ()
(labels ((make-torus () (torus 0.4d0 1.2d0 40 40))
(make-line (f)
(group-l (mapcar (lambda (l x)
(funcall f l (translate x 0.0 0.0 (rotate -30.0 1.0 0.0 0.0 (make-torus)))))
(list v-off v-lo v-med v-hi v-on)
'( -7.0 -3.5 0.0 3.5 7.0)))))
(let* ((camera-1 (camera (point-of-interest) :fov 5.0d0))
(scene (scene camera-1
(lighting t
(group
(translate -100.0 0.0 10.0 (light :specular v-on :ambient v-on :diffuse v-on))
(translate 0.0 0.0 150.0 camera-1)
(material :specular v-lo :diffuse v-lo :ambient v-lo :child
(shade-model GL_SMOOTH
(compile-list
(group
(translate 0.0 0.0 0.0 (make-line #'mat-diffuse))
(translate 0.0 4.0 0.0 (make-line #'mat-specular))
(translate 0.0 -4.0 0.0 (make-line #'mat-ambient)))))))))))
(animate scene))))
Rotating Things
(defun rotating-sphere ()
(let* ((sphere
(rotate 90.0 1.0 0.0 0.0
(sphere 1d0 30 30 :normals GLU_SMOOTH :texture GL_TRUE )))
(rotator (rotate 0.0 0.0 1.0 0.0 sphere))
(spinner (ticker rotator (lambda (node delta-time)
(incf (angle node) (* 30.0 delta-time))))))
(group rotator spinner)))
(defun rotating-cylinder ()
(let* ((obj (cylinder 1d0 0d0 (* 2 PI) 30 30 :normals GLU_SMOOTH :texture GL_TRUE ))
(rotator (rotate 0.0 0.0 0.0 1.0 obj))
(spinner (ticker rotator (lambda (node delta-time)
(incf (angle node) (* 30.0 delta-time))))))
(group rotator spinner)))
(defun rotating-disk ()
(let* ((obj (partial-disk 1d0 3d0 10 10 0d0 270d0 :normals GLU_SMOOTH :texture GL_TRUE ))
(rotator (rotate 0.0 1.0 0.0 0.0 obj))
(spinner (ticker rotator (lambda (node delta-time)
(incf (angle node) (* 30.0 delta-time))))))
(group rotator spinner)))
(defun test2 ()
(let* ((poi-1 (point-of-interest))
(camera-1 (camera poi-1))
(scene (scene camera-1
(lighting nil
(texture 'girls
(group
(translate 0.0 0.0 9.0 camera-1)
(translate 2.5 2.5 0.0 (rotating-sphere))
(translate 0.0 2.5 0.0 (rotating-sphere))
(translate -2.5 2.5 0.0 (rotating-sphere))
(translate 2.5 0.0 0.0 (rotating-cylinder))
(translate 0.0 0.0 0.0 (rotating-cylinder))
(translate -2.5 0.0 0.0 (rotating-cylinder))
(translate 2.5 -2.5 0.0 (scale .3 .3 .3 (rotating-disk)))
(translate 0.0 -2.5 0.0 (scale .4 .4 .4 (rotating-disk)))
(translate -2.5 -2.5 0.0 (scale .3 .3 .3 (rotating-disk)))
poi-1))))))
(animate scene)))
Rotations
(defun test3 ()
(let* ((poi (point-of-interest))
(camera-1 (camera poi))
(day-rot (rotate 0.0 0.0 1.0 0.0
(rotate 90.0 1.0 0.0 0.0
(sphere 4d0 30 30 :normals GLU_SMOOTH :texture GL_TRUE ))))
(rotator (rotate 0.0 0.0 1.0 0.0
(translate 15.0 0.0 0.0
day-rot)))
(day-spinner (ticker day-rot (lambda (node delta-time)
(incf (angle node) (* 30.0 delta-time)))))
(year-spinner (ticker rotator (lambda (node delta-time)
(incf (angle node) (* 15.0 delta-time)))))
(scene (scene camera-1
(texture 'earth
(texture-transform 1.0 0.0 -1.0 1.0
(group camera-1
year-spinner
day-spinner
(translate 0.0 0.0 -30.0
(group poi rotator))))))))
(animate scene)))
The Sixth Platonic Solid
(defun test5 ()
(let* ((camera-1 (camera (point-of-interest) :fov 5.0d0))
(scene (scene camera-1
(lighting t
(shade-model GL_SMOOTH
(group
(light1)
(light2)
(translate 0.0 0.0 200.0 camera-1)
(material :ambient v-lo :shininess 100.0 :child
(group-l
(mapcar (lambda (specular y)
(translate 0.0 y 0.0
(mat-specular specular
(group-l
(mapcar (lambda (diffuse x)
(translate x 0.0 0.0
(mat-diffuse diffuse
(compile-list
(teapot 1d0)))))
(list v-off v-lo v-med v-hi v-on)
'(-8.0 -4.0 0.0 4.0 8.0))))))
(list v-off v-lo v-med v-hi v-on)
'(-6.0 -3.0 0.0 3.0 6.0))))))))))
(animate scene)))