anchor.diff:  		  ret)
   	(values ret origin ray)))))
   
  +(defun memoized-check-intersect (quad node x y viewport projection hash)
  +  (let* ((key (list quad node x y viewport projection))
  +	 (ret (or (when hash 
  +		    (gethash key hash))
  +		  (setf (gethash key hash)
  +			(multiple-value-list 
  +			 (check-intersect quad node x y viewport projection))))))
  +    (values (first ret)
  +	    (second ret)
  +	    (third ret))))
  +  
  +
   
   (defun draw-inactive (quad text)
      (draw-button quad text
  
positive.code: 		 (:x-relative ,xrel)
  		 (:y-relative . ,yrel)
  		 (:timestamp . ,ts))) 
  	(cached-collisions (make-hash-table)))
  
      (map-event (lambda (k v)
  		 (let ((collisions (check-intersect (car (children k)) k x y *viewport* *projection*)))
  		   (if collisions
  		       (progn
  			  (setf (gethash k cached-collisions) collisions)
  			  (unless (eq k *last-hover-target*)
  			    (setf *last-hover-target* k)
  			    (funcall v k collisions (acons :event :mouse-hover event))))
  		       (when (eq k *last-hover-target*)
  			 (let ((f (gethash k (gethash :mouse-exit *event-hash*))))
  			   (when f (funcall f k nil (acons :event :mouse-exit event)))
  			   (setf *last-hover-target* nil))))))
  	       :mouse-hover)
  
      (map-event (lambda (k v)
  		 (let ((collisions (or (gethash k cached-collisions)
  				       (check-intersect (car (children k)) k x y *viewport* *projection*))))
  		   (when collisions
  		       (funcall v k collisions (acons :event :mouse-move event)))))
  	       :mouse-move)))
  
      
  
negative.code: 	     (gethash e *event-hash*))
      ret))
  
  (clinch:defevent clinch:*on-mouse-down* (win mouse x y button state clicks ts)
  
    ;;(format t "win: ~A mouse: ~A x: ~A y: ~A button: ~A state: ~A clicks: ~A ts: ~A~%" win mouse x y button state clicks ts)
  