2 #include <msp/input/keys.h>
4 #include "cameracontroller.h"
10 CameraController::CameraController(View3D &v, Input::Keyboard &k, Input::Mouse &m):
14 camera(view.get_camera()),
21 mouse.signal_button_press.connect(sigc::bind_return(sigc::mem_fun(this, &CameraController::button_press), false));
22 mouse.signal_button_release.connect(sigc::bind_return(sigc::mem_fun(this, &CameraController::button_release), false));
23 mouse.signal_axis_motion.connect(sigc::bind_return(sigc::mem_fun(this, &CameraController::axis_motion), false));
24 keyboard.signal_button_press.connect(sigc::bind_return(sigc::mem_fun(this, &CameraController::key_press), false));
25 keyboard.signal_button_release.connect(sigc::bind_return(sigc::mem_fun(this, &CameraController::key_release), false));
28 void CameraController::top_down()
30 const GL::Vector3 &look = camera.get_look_direction();
31 float xy_len = sqrt(look.x*look.x+look.y*look.y);
32 set_look_direction(GL::Vector3(look.x*0.01/xy_len, look.y*0.01/xy_len, -0.99995));
35 void CameraController::set_look_direction(const GL::Vector3 &look)
37 GL::Vector3 focus = get_focus();
38 float dist = get_distance();
39 camera.set_look_direction(look);
40 camera.set_position(focus-look*dist);
43 void CameraController::view_all()
48 void CameraController::move(float x, float y)
50 const GL::Vector3 &pos = camera.get_position();
51 const GL::Vector3 &look = camera.get_look_direction();
52 GL::Vector3 fwd_dir = normalize(GL::Vector3(look.x, look.y, 0));
53 GL::Vector3 right_dir = cross(fwd_dir, GL::Vector3(0, 0, 1));
54 camera.set_position(pos+fwd_dir*y+right_dir*x);
57 void CameraController::adjust_distance(float delta)
59 const GL::Vector3 &pos = camera.get_position();
60 const GL::Vector3 &look = camera.get_look_direction();
61 float dist = get_distance();
62 float low = view.get_layout().get_layout().get_catalogue().get_gauge()*5;
65 camera.set_position(pos-look*delta);
67 camera.set_depth_clip(dist*0.02, dist*50);
70 void CameraController::rotate(const Angle &angle)
72 GL::Vector3 look = camera.get_look_direction();
73 set_look_direction(rotated_vector(look, angle));
76 void CameraController::pitch(const Angle &angle)
78 GL::Vector3 look = camera.get_look_direction();
79 float xy_len = sqrt(look.x*look.x+look.y*look.y);
82 if(xy_len*c-look.z*s<0.01)
84 else if(xy_len*s+look.z*c>-0.01)
85 set_look_direction(GL::Vector3(look.x*0.99995/xy_len, look.y*0.99995/xy_len, -0.01));
88 float xy_scale = (xy_len*c-look.z*s)/xy_len;
89 set_look_direction(GL::Vector3(look.x*xy_scale, look.y*xy_scale, xy_len*s+look.z*c));
93 void CameraController::tick(float dt)
97 float scale = get_view_scale()*dt;
98 move(move_x*scale, move_y*scale);
102 void CameraController::button_press(unsigned btn)
107 drag_mode = DISTANCE;
109 drag_mode = ((btn==2)==shift_pressed ? ROTATE : PAN);
113 adjust_distance(-get_distance()*0.1);
117 adjust_distance(get_distance()*0.1);
121 void CameraController::button_release(unsigned btn)
127 void CameraController::axis_motion(unsigned axis, float, float change)
131 float dx = (axis==0 ? change : 0);
132 float dy = (axis==1 ? change : 0);
133 float scale = get_view_scale();
134 move(-dx*scale, -dy*scale);
136 else if(drag_mode==ROTATE)
139 rotate(Angle::from_turns(-change/2));
141 pitch(Angle::from_turns(change/4));
143 else if(drag_mode==DISTANCE && axis==1)
144 adjust_distance(-change*3*get_distance());
147 void CameraController::key_press(unsigned key)
149 if(key==Msp::Input::KEY_RIGHT)
151 else if(key==Msp::Input::KEY_LEFT)
153 else if(key==Msp::Input::KEY_UP)
155 else if(key==Msp::Input::KEY_DOWN)
157 else if(key==Msp::Input::KEY_HOME)
159 else if(key==Msp::Input::KEY_INSERT)
161 else if(key==Msp::Input::KEY_SHIFT_L || key==Msp::Input::KEY_SHIFT_R)
162 shift_pressed = true;
163 else if(key==Msp::Input::KEY_CTRL_L || key==Msp::Input::KEY_CTRL_R)
167 void CameraController::key_release(unsigned key)
169 if(key==Msp::Input::KEY_RIGHT || key==Msp::Input::KEY_LEFT)
171 else if(key==Msp::Input::KEY_UP || key==Msp::Input::KEY_DOWN)
173 else if(key==Msp::Input::KEY_SHIFT_L || key==Msp::Input::KEY_SHIFT_R)
174 shift_pressed = false;
175 else if(key==Msp::Input::KEY_CTRL_L || key==Msp::Input::KEY_CTRL_R)
176 ctrl_pressed = false;
179 GL::Vector3 CameraController::get_focus() const
181 const GL::Vector3 &pos = camera.get_position();
182 const GL::Vector3 &look = camera.get_look_direction();
183 float dist = get_distance();
184 return GL::Vector3(pos.x+look.x*dist, pos.y+look.y*dist, pos.z+look.z*dist);
187 float CameraController::get_distance() const
189 return -camera.get_position().z/camera.get_look_direction().z;
192 float CameraController::get_view_scale() const
194 float t = tan(camera.get_field_of_view()/2.0f)*2.0f;
195 return get_distance()*t;