   (let [width     (.-clientWidth node)
         height    (.-clientHeight node)
         driver    (make-driver gl)
-        program   (dp/program driver program-source)
+        program   program-source
         state (app-state width height)]
-    
+
     (reset-gl-canvas! node)
     (.enable gl (.-DEPTH_TEST gl))
     (.clearColor gl 0 0 0 1)

   {:vertex-shader   {(g/gl-position) (-> u-p-matrix
                                          (g/* u-mv-matrix)
                                          (g/* (g/vec4 a-position 1)))
                      v-texture-coord a-texture-coord
                      }
    :fragment-shader {(g/gl-frag-color)
                      (g/texture2D u-sampler (g/vec2 (g/swizzle v-texture-coord :st)))
                      }}))

(defn get-perspective-matrix
  "Be sure to 

                   (geom/rotate-around-axis [1 0 0] cube-rotation)
                   (geom/rotate-around-axis [0 1 0] cube-rotation)
                   (geom/rotate-around-axis [0 0 1] cube-rotation))]
        (gd/draw-elements driver (gd/bind driver program
                                          (assoc (get-data p mv cube-vertices texture cube-texture-coords)
                                                 {:tag :element-index} cube-indices))
                          {:draw-mode :triangles
                           :first     0
                           ;; Hard-coded
                           :count     36})))))

(defn animate [draw-fn step-fn current-value]
  (js/requestAnimationFrame
   (fn [time]
     (let [next-value (step-fn time current-value)]
       (draw-fn next-value)
       (animate draw-fn step-fn next-value)))))

(defn tick
  "Takes the old world value and produces a new world value, suitable
