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(GL::Vector3(focus.x-look.x*dist, focus.y-look.y*dist, focus.z-look.z*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 float xy_len = sqrt(look.x*look.x+look.y*look.y);
53 float dx = (look.x*y+look.y*x)/xy_len;
54 float dy = (look.y*y-look.x*x)/xy_len;
55 camera.set_position(GL::Vector3(pos.x+dx, pos.y+dy, pos.z));
58 void CameraController::adjust_distance(float delta)
60 const GL::Vector3 &pos = camera.get_position();
61 const GL::Vector3 &look = camera.get_look_direction();
62 float dist = get_distance();
63 float low = view.get_layout().get_layout().get_catalogue().get_gauge()*5;
66 camera.set_position(GL::Vector3(pos.x-look.x*delta, pos.y-look.y*delta, pos.z-look.z*delta));
68 camera.set_depth_clip(dist*0.02, dist*50);
71 void CameraController::rotate(float angle)
73 GL::Vector3 look = camera.get_look_direction();
76 set_look_direction(GL::Vector3(look.x*c-look.y*s, look.x*s+look.y*c, look.z));
79 void CameraController::pitch(float angle)
81 GL::Vector3 look = camera.get_look_direction();
82 float xy_len = sqrt(look.x*look.x+look.y*look.y);
85 if(xy_len*c-look.z*s<0.01)
87 else if(xy_len*s+look.z*c>-0.01)
88 set_look_direction(GL::Vector3(look.x*0.99995/xy_len, look.y*0.99995/xy_len, -0.01));
91 float xy_scale = (xy_len*c-look.z*s)/xy_len;
92 set_look_direction(GL::Vector3(look.x*xy_scale, look.y*xy_scale, xy_len*s+look.z*c));
96 void CameraController::tick(float dt)
100 float scale = get_view_scale()*dt;
101 move(move_x*scale, move_y*scale);
105 void CameraController::button_press(unsigned btn)
110 drag_mode = DISTANCE;
112 drag_mode = ((btn==2)==shift_pressed ? ROTATE : PAN);
116 adjust_distance(-get_distance()*0.1);
120 adjust_distance(get_distance()*0.1);
124 void CameraController::button_release(unsigned btn)
130 void CameraController::axis_motion(unsigned axis, float, float change)
134 float dx = (axis==0 ? change : 0);
135 float dy = (axis==1 ? change : 0);
136 float scale = get_view_scale();
137 move(-dx*scale, -dy*scale);
139 else if(drag_mode==ROTATE)
142 rotate(-change*M_PI);
144 pitch(change*M_PI/2);
146 else if(drag_mode==DISTANCE && axis==1)
147 adjust_distance(-change*3*get_distance());
150 void CameraController::key_press(unsigned key)
152 if(key==Msp::Input::KEY_RIGHT)
154 else if(key==Msp::Input::KEY_LEFT)
156 else if(key==Msp::Input::KEY_UP)
158 else if(key==Msp::Input::KEY_DOWN)
160 else if(key==Msp::Input::KEY_HOME)
162 else if(key==Msp::Input::KEY_INSERT)
164 else if(key==Msp::Input::KEY_SHIFT_L || key==Msp::Input::KEY_SHIFT_R)
165 shift_pressed = true;
166 else if(key==Msp::Input::KEY_CTRL_L || key==Msp::Input::KEY_CTRL_R)
170 void CameraController::key_release(unsigned key)
172 if(key==Msp::Input::KEY_RIGHT || key==Msp::Input::KEY_LEFT)
174 else if(key==Msp::Input::KEY_UP || key==Msp::Input::KEY_DOWN)
176 else if(key==Msp::Input::KEY_SHIFT_L || key==Msp::Input::KEY_SHIFT_R)
177 shift_pressed = false;
178 else if(key==Msp::Input::KEY_CTRL_L || key==Msp::Input::KEY_CTRL_R)
179 ctrl_pressed = false;
182 GL::Vector3 CameraController::get_focus() const
184 const GL::Vector3 &pos = camera.get_position();
185 const GL::Vector3 &look = camera.get_look_direction();
186 float dist = get_distance();
187 return GL::Vector3(pos.x+look.x*dist, pos.y+look.y*dist, pos.z+look.z*dist);
190 float CameraController::get_distance() const
192 return -camera.get_position().z/camera.get_look_direction().z;
195 float CameraController::get_view_scale() const
197 float t = tan(camera.get_field_of_view()/2)*2;
198 return get_distance()*t;