- GL::Vector3 look_xy(look.x/xy_len, look.y/xy_len, 0);
- GL::Vector3 ground(pos.x-look.x*pos.z/look.z, pos.y-look.y*pos.z/look.z, 0);
+ float c = cos(angle);
+ float s = sin(angle);
+ if(xy_len*c-look.z*s<0.01)
+ top_down();
+ else if(xy_len*s+look.z*c>-0.01)
+ set_look_direction(GL::Vector3(look.x*0.99995/xy_len, look.y*0.99995/xy_len, -0.01));
+ else
+ {
+ float xy_scale = (xy_len*c-look.z*s)/xy_len;
+ set_look_direction(GL::Vector3(look.x*xy_scale, look.y*xy_scale, xy_len*s+look.z*c));
+ }
+}
+
+void CameraController::tick(float dt)
+{
+ if(move_x || move_y)
+ {
+ float scale = get_view_scale()*dt;
+ move(move_x*scale, move_y*scale);
+ }
+}
+
+void CameraController::button_press(int x, int y, unsigned btn, unsigned mod)
+{
+ mod = Input::mod_from_sys(mod);
+ if(btn==2 || btn==3)
+ {
+ if(mod&Input::MOD_CONTROL)
+ drag_mode = DISTANCE;
+ else
+ drag_mode = ((btn==2)==((mod&Input::MOD_SHIFT)!=0) ? ROTATE : PAN);