     return bbox.box
   getBBox: getBBox
 
+  ###########################################################################
+  ###########################################################################
+  # ACTIONS
+
   panCameraToPosition3: (target, duration, ignoreGlobal) =>
     z_offset = if ignoreGlobal? then 0 else CAMERA_Z
+    dur = (duration || 1000) * @speedMultiplier
     new Promise (resolve) =>
       d3.transition()
-        .duration duration || 1000
+        .duration dur
         .tween "moveCamera", =>
           current = @camera.position
           x = d3.interpolate(current.x, target.x)

      h_fov = Math.atan( Math.tan(v_fov/2) * @camera.aspect )

      return -(height / 2) / Math.tan(h_fov) * distance_scale



  getWordIndex = (line, word) ->
    expression = if word is "—" then word else "\\b#{word}\\b"


  wait: (duration) =>
    return new Promise (resolve) =>
      setTimeout(resolve, duration * @speedMultiplier)

  zoomCameraToPosition: (target, duration) =>
    new Promise (resolve) =>
      d3.transition()
        .duration duration * @speedMultiplier
        .tween "zoomCamera", =>
          current = @camera.position
          z = d3.interpolate current.z, target.z
