anchor.diff:                                        :dimensions 6))
       (setf *vertex-stream* (make-buffer-stream *gpu-array*))
       (setf running t)
  -    (loop :while running :do
  -       (case-events (event) (:quit () (setf running nil)))
  -       (update-swank)
  -       (continuable (draw *vertex-stream*))))
  +    (loop :while running :do (continuable (draw))))
     (defun stop-demo () (setf running nil)))
   
  -(defun draw (gstream)
  +(evt:observe (|sys|) (when (typep e 'evt.sdl:will-quit) (stop-demo)))
  +
  +(defun draw ()
  +  (evt.sdl:pump-events)
  +  (update-swank)
     (setf *loop* (+ 0.01 *loop*))
  -  (gl:clear :color-buffer-bit)
  -  (gmap #'prog-1 gstream :loop *loop* :eye-pos (v! 0 0 -5))
  +  (gl:clear :color-buffer-bit :depth-buffer-bit)
  +  (gmap #'raymarcher *vertex-stream* :loop *loop* :eye-pos (v! 0 0 -5))
     (gl:flush)
     (cgl:update-display))
  -
  -
  -(defsmacro density-normal (object-call position-arg-num)
  -  (when (not (listp object-call)) (error "object-call form must a list"))
  -  (let ((p (1+ position-arg-num))
  -        (oc object-call))
  -    `(normalize
  -      (v! (- ,(utils:replace-nth oc p `(+ ,(nth p oc) (v! 0.01  0.0  0.0)))
  -             ,(utils:replace-nth oc p `(- ,(nth p oc) (v! 0.01  0.0  0.0))))
  -          (- ,(utils:replace-nth oc p `(+ ,(nth p oc) (v!  0.0 0.01  0.0)))
  -             ,(utils:replace-nth oc p `(- ,(nth p oc) (v!  0.0 0.01  0.0))))
  -          (- ,(utils:replace-nth oc p `(+ ,(nth p oc) (v!  0.0  0.0 0.01)))
  -             ,(utils:replace-nth oc p `(- ,(nth p oc) (v!  0.0  0.0 0.01))))))))
  
positive.code:                  (break)))
             (setf d (max d 0.01))
             (setf e (+ e (* eye-dir d)))))
      (out output-color (v! output 1.0))))
  
  (defpipeline prog-1 ((position :vec4) &uniform (loop :float) (eye-pos :vec3))
    (:vertex (setf gl-position position) (out posxy (swizzle position :xy)))
    frag)
  
  (let ((running nil))
    (defun run-demo ()
  
negative.code: (defparameter *vertex-stream* nil)
  (defparameter *loop* 0.0)
  
  (defmacro-g density-normal (object-call position-arg-num)
    (when (not (listp object-call)) (error "object-call form must a list"))
    (let ((p (1+ position-arg-num))
          (oc object-call))
      `(normalize
        (v! (- ,(utils:replace-nth oc p `(+ ,(nth p oc) (v! 0.01  0.0  0.0)))
               ,(utils:replace-nth oc p `(- ,(nth p oc) (v! 0.01  0.0  0.0))))
            (- ,(utils:replace-nth oc p `(+ ,(nth p oc) (v!  0.0 0.01  0.0)))
               ,(utils:replace-nth oc p `(- ,(nth p oc) (v!  0.0 0.01  0.0))))
            (- ,(utils:replace-nth oc p `(+ ,(nth p oc) (v!  0.0  0.0 0.01)))
               ,(utils:replace-nth oc p `(- ,(nth p oc) (v!  0.0  0.0 0.01))))))))
  
  (defun-g sphere ((p :vec3) (r :float))
    (- (length p) r))
  
  (defun-g box ((p :vec3) (b :vec3))
    (let ((d (- (abs p) b)))
      (+ (min (max (x d) (max (y d) (z d))) 0.0)
         (length (max d 0.0)))))
  
  (defun-g thing2 ((p :vec3) (r :float) (l :float))
    (+ (* 0.2 (+ (y p)
                 (sin (+ (* (+ (cos l) 8.0)
                            (* 2 (x p))) l))))
       (- (length p) r)))
  
  (defun-g ray-vert ((position :vec4))
    (values position
            (swizzle position :xy)))
  
  (defun-g ray-frag ((posxy :vec2) &uniform (loop :float) (eye-pos :vec3))
    (let* ((eye-pos (v! 0.0 0.0 -5.0))
           (eye-dir (normalize (v! (x posxy) (y posxy) 1.0)))
           (e eye-pos)
  