2 #include <msp/input/keys.h>
4 #include "cameracontroller.h"
10 CameraController::CameraController(View3D &v, Graphics::EventSource &es):
13 camera(view.get_camera()),
18 event_source.signal_button_press.connect(sigc::mem_fun(this, &CameraController::button_press));
19 event_source.signal_button_release.connect(sigc::mem_fun(this, &CameraController::button_release));
20 event_source.signal_pointer_motion.connect(sigc::mem_fun(this, &CameraController::pointer_motion));
21 event_source.signal_key_press.connect(sigc::mem_fun(this, &CameraController::key_press));
22 event_source.signal_key_release.connect(sigc::mem_fun(this, &CameraController::key_release));
25 void CameraController::top_down()
27 const GL::Vector3 &look = camera.get_look_direction();
28 float xy_len = sqrt(look.x*look.x+look.y*look.y);
29 set_look_direction(GL::Vector3(look.x*0.01/xy_len, look.y*0.01/xy_len, -0.99995));
32 void CameraController::set_look_direction(const GL::Vector3 &look)
34 GL::Vector3 focus = get_focus();
35 float dist = get_distance();
36 camera.set_look_direction(look);
37 camera.set_position(GL::Vector3(focus.x-look.x*dist, focus.y-look.y*dist, focus.z-look.z*dist));
40 void CameraController::view_all()
45 void CameraController::move(float x, float y)
47 const GL::Vector3 &pos = camera.get_position();
48 const GL::Vector3 &look = camera.get_look_direction();
49 float xy_len = sqrt(look.x*look.x+look.y*look.y);
50 float dx = (look.x*y+look.y*x)/xy_len;
51 float dy = (look.y*y-look.x*x)/xy_len;
52 camera.set_position(GL::Vector3(pos.x+dx, pos.y+dy, pos.z));
55 void CameraController::adjust_distance(float delta)
57 const GL::Vector3 &pos = camera.get_position();
58 const GL::Vector3 &look = camera.get_look_direction();
59 float dist = get_distance();
60 float low = view.get_layout().get_layout().get_catalogue().get_gauge()*5;
63 camera.set_position(GL::Vector3(pos.x-look.x*delta, pos.y-look.y*delta, pos.z-look.z*delta));
65 camera.set_depth_clip(dist*0.02, dist*50);
68 void CameraController::rotate(float angle)
70 GL::Vector3 look = camera.get_look_direction();
73 set_look_direction(GL::Vector3(look.x*c-look.y*s, look.x*s+look.y*c, look.z));
76 void CameraController::pitch(float 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(int x, int y, unsigned btn, unsigned mod)
104 mod = Input::mod_from_sys(mod);
107 if(mod&Input::MOD_CONTROL)
108 drag_mode = DISTANCE;
110 drag_mode = ((btn==2)==((mod&Input::MOD_SHIFT)!=0) ? ROTATE : PAN);
117 adjust_distance(-get_distance()*0.1);
121 adjust_distance(get_distance()*0.1);
125 void CameraController::button_release(int, int, unsigned btn, unsigned)
131 void CameraController::pointer_motion(int x, int y)
135 int dx = x-pointer_x;
136 int dy = y-pointer_y;
140 float scale = get_view_scale()/event_source.get_height();
141 move(-dx*scale, dy*scale);
143 else if(drag_mode==ROTATE)
145 rotate(-dx*M_PI*2/event_source.get_width());
146 pitch(-dy*M_PI/event_source.get_height());
148 else if(drag_mode==DISTANCE)
149 adjust_distance(dy*3*get_distance()/event_source.get_height());
156 void CameraController::key_press(unsigned code, unsigned, wchar_t)
158 unsigned key = Msp::Input::key_from_sys(code);
160 if(key==Msp::Input::KEY_RIGHT)
162 else if(key==Msp::Input::KEY_LEFT)
164 else if(key==Msp::Input::KEY_UP)
166 else if(key==Msp::Input::KEY_DOWN)
168 else if(key==Msp::Input::KEY_HOME)
170 else if(key==Msp::Input::KEY_INSERT)
174 void CameraController::key_release(unsigned code, unsigned)
176 unsigned key = Msp::Input::key_from_sys(code);
178 if(key==Msp::Input::KEY_RIGHT || key==Msp::Input::KEY_LEFT)
180 else if(key==Msp::Input::KEY_UP || key==Msp::Input::KEY_DOWN)
184 GL::Vector3 CameraController::get_focus() const
186 const GL::Vector3 &pos = camera.get_position();
187 const GL::Vector3 &look = camera.get_look_direction();
188 float dist = get_distance();
189 return GL::Vector3(pos.x+look.x*dist, pos.y+look.y*dist, pos.z+look.z*dist);
192 float CameraController::get_distance() const
194 return -camera.get_position().z/camera.get_look_direction().z;
197 float CameraController::get_view_scale() const
199 float t = tan(camera.get_field_of_view()/2)*2;
200 return get_distance()*t;