anchor.diff:                   (break)))
              (setf d (max d 0.01))
              (setf e (+ e (* eye-dir d)))))
  -    (out output-color (v! output 1.0))))
  +    (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)
  +(defpipeline raymarcher () (g-> #'ray-vert #'ray-frag))
   
   (let ((running nil))
     (defun run-demo ()
  
positive.code:                                       :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*))))
    (defun stop-demo () (setf running nil)))
  
  (defun draw (gstream)
    (setf *loop* (+ 0.01 *loop*))
    (gl:clear :color-buffer-bit)
    (gmap #'prog-1 gstream :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))))))))
  
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)
  