+void CameraController::top_down()
+{
+ const GL::Vector3 &look = camera.get_look_direction();
+ float xy_len = sqrt(look.x*look.x+look.y*look.y);
+ set_look_direction(GL::Vector3(look.x*0.01/xy_len, look.y*0.01/xy_len, -0.99995));
+}
+
+void CameraController::set_look_direction(const GL::Vector3 &look)
+{
+ GL::Vector3 focus = get_focus();
+ float dist = get_distance();
+ camera.set_look_direction(look);
+ camera.set_position(focus-look*dist);
+}
+
+void CameraController::view_all()
+{
+ view.view_all();
+}
+
+void CameraController::move(float x, float y)
+{
+ const GL::Vector3 &pos = camera.get_position();
+ const GL::Vector3 &look = camera.get_look_direction();
+ GL::Vector3 fwd_dir = normalize(GL::Vector3(look.x, look.y, 0));
+ GL::Vector3 right_dir = cross(fwd_dir, GL::Vector3(0, 0, 1));
+ camera.set_position(pos+fwd_dir*y+right_dir*x);
+}
+
+void CameraController::adjust_distance(float delta)