                  (scalar-multiply d (/ (scroll-scale-for-state @current-state)))))
 
 (defn set-projection! [current-state projection animation-signaller]
-  (swap! current-state assoc :projection projection)
-  (sync-graph! @current-state :animation-signaller animation-signaller))
+  (swap-state-animated! animation-signaller
+                        current-state assoc :projection projection))
 
 (defn toggle-projection! [current-state animation-signaller]
   (let [projection (if (= (:projection @current-state) :fisheye)
                      :zoom-out
                      :fisheye)]
     (set-projection! current-state projection animation-signaller)))
+
+(defn zoom-in-to-pos! [current-state pos animation-signaller]
+  (swap-state-animated! animation-signaller
+                          current-state assoc
+                          :projection :fisheye
+                          :camera-pos pos))
 
 ;; Layout
 


(defn projectors-for-state [state]
  (if (= (:projection state) :fisheye) fisheye-projectors zoom-out-projectors))

(defn sync-graph! [state & {:keys [animation-signaller]}]
  (let [{:keys [svg nodes links camera-pos view-size]} state


;; Gestures - pinch

(defn pinch-observable [manager svg]
  (.map (gesture-observable manager svg "pinchmove")
        (fn [e] {:center (math-vec (-> e .-center .-x) (-> e .-center .-y))
                 :scale (.-scale e)})))

(defn zoom-on-pinch! [manager
                      current-state
                      animation-observable
                      animation-signaller]
  (let [pinches (pinch-observable manager (:svg @current-state))
        pinch-ins (-> pinches (.filter #(< (:scale %) 0.8))
                      (suppress-while-animating animation-observable))
        pinch-outs (-> pinches (.filter #(> (:scale %) 1.2))
                       (suppress-while-animating animation-observable))]
    (.subscribe
      pinch-ins
      #(if (= (:projection @current-state) :fisheye)
         (set-projection! current-state :zoom-out animation-signaller)))
    (.subscribe
      pinch-outs
      #(if (= (:projection @current-state) :zoom-out)
         (zoom-in-to-pos! current-state
                          (zoom-out->world-pos @current-state (:center %))
                          animation-signaller)))))

;; Exported function to do magic

