Index: viewer-draw-leds.lisp
===================================================================
--- viewer-draw-leds.lisp	(revision 98)
+++ viewer-draw-leds.lisp	(working copy)
@@ -72,25 +72,48 @@
   (destructuring-bind (x y z)
       position
     (gl:translate-f (- (* y *led-distance*)) (* z *led-distance*) (- (* x *led-distance*)))
-    (let* ((LED-intensity (ensure-intensity-to-be-of-number (aref (current-cube) x y z)))
-           (grey-value  (- .9f0 (* (- 5 LED-intensity)
-                                   (/ 0.8 5))))
-           (alpha-value  (- .9f0 (* (- 5 LED-intensity)
-                                    (/ 0.5 5))))
-           (old-grey-value (* (- 5 LED-intensity)
-                              (/ 0.9 5))))
-      (if (eq LED-intensity 0)
-          (sgum:with-single-float-values (emission 0f0 0f0 0f0 0f0)
-            (gl:material-fv gl:+front+ gl:+emission+ emission))
-          (sgum:with-single-float-values (emission .1f0 0f0 0f0 0f0)
-            (gl:material-fv gl:+front+ gl:+emission+ emission)))
-      (if *dark-mode*
-          (sgum:with-single-float-values (diffuse grey-value 0f0 0f0 alpha-value)
+    (let ((LED-intensity (ensure-intensity-to-be-of-number (aref (current-cube) x y z))))
+      ;;(draw-untranslated-led LED-intensity))
+      (gl:call-list (get-led-display-list LED-intensity)))
+    (gl:pop-matrix)))
+
+(defun draw-untranslated-led (LED-intensity)
+  (let ((grey-value  (- .9f0 (* (- 5 LED-intensity)
+                                (/ 0.8 5))))
+        (alpha-value  (- .9f0 (* (- 5 LED-intensity)
+                                 (/ 0.5 5))))
+        (old-grey-value (* (- 5 LED-intensity)
+                           (/ 0.9 5))))
+    (if (eq LED-intensity 0)
+        (sgum:with-single-float-values (emission 0f0 0f0 0f0 0f0)
+          (gl:material-fv gl:+front+ gl:+emission+ emission))
+        (sgum:with-single-float-values (emission .1f0 0f0 0f0 0f0)
+          (gl:material-fv gl:+front+ gl:+emission+ emission)))
+    (if *dark-mode*
+        (sgum:with-single-float-values (diffuse grey-value 0f0 0f0 alpha-value)
             (gl:material-fv gl:+front+ gl:+diffuse+ diffuse))
-          (sgum:with-single-float-values (diffuse 0.9f0 old-grey-value old-grey-value 1f0)
-            (gl:material-fv gl:+front+ gl:+diffuse+ diffuse))))
+        (sgum:with-single-float-values (diffuse 0.9f0 old-grey-value old-grey-value 1f0)
+          (gl:material-fv gl:+front+ gl:+diffuse+ diffuse))))
+  
+  ;; (gl:enable gl:+depth-test+)
+  (draw-sphere *LED-DIAMETER*)
+  ;; (gl:disable gl:+depth-test+)
+  )
+  
+(defvar *led-display-lists*)
 
-;;     (gl:enable gl:+depth-test+)
-      (draw-sphere *LED-DIAMETER*)
-;;     (gl:disable gl:+depth-test+)
-    (gl:pop-matrix)))
+(defun get-led-display-list (intensity)
+  (nth intensity *led-display-lists*))
+
+(defun create-led-display-lists ()
+  (setf *led-display-lists* (loop for i from 0 to 5
+                               collect (gl:gen-lists 1)))
+  (dotimes (intensity 6)
+    (gl:new-list (get-led-display-list intensity) gl:+compile+)
+    (draw-untranslated-led intensity)
+    (gl:end-list)))
+
+(defun destroy-led-display-lists ()
+  (dotimes (intensity 6)
+    (gl:delete-lists (get-led-display-list intensity) 1))
+  (setf *led-display-lists* nil))
Index: viewer.lisp
===================================================================
--- viewer.lisp	(revision 97)
+++ viewer.lisp	(working copy)
@@ -463,8 +463,10 @@
 	     (init-gl)
              ;; (goto-cube :first)
 	     ;; (write-cube-to-device)
+             (create-led-display-lists)
 	     (run-sdl-event-loop))
 	(progn
+          (destroy-led-display-lists)
 	  (sdl:quit)
           (close-cube-device)
 	  (setf *modeller-window-shown* nil))))))
