X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fdesigner%2Fcameracontroller.cpp;h=f8d1a53b8b1b6279cfc97441d417eaa0ad877e18;hb=0b75458245997b9df6da47cc4534341c8426084b;hp=4706ceefeeec2c742b97e4ce8cd0bc12fe571922;hpb=495c54e187ddbb7514c983e1829a69d82ccad5f3;p=r2c2.git diff --git a/source/designer/cameracontroller.cpp b/source/designer/cameracontroller.cpp index 4706cee..f8d1a53 100644 --- a/source/designer/cameracontroller.cpp +++ b/source/designer/cameracontroller.cpp @@ -1,10 +1,3 @@ -/* $Id$ - -This file is part of R²C² -Copyright © 2010-2011 Mikkosoft Productions, Mikko Rasa -Distributed under the GPL -*/ - #include #include #include "3d/layout.h" @@ -14,19 +7,22 @@ using namespace std; using namespace Msp; using namespace R2C2; -CameraController::CameraController(View3D &v, Graphics::EventSource &es): +CameraController::CameraController(View3D &v, Input::Keyboard &k, Input::Mouse &m): view(v), - event_source(es), + keyboard(k), + mouse(m), camera(view.get_camera()), move_x(0), move_y(0), + shift_pressed(false), + ctrl_pressed(false), drag_mode(NONE) { - event_source.signal_button_press.connect(sigc::mem_fun(this, &CameraController::button_press)); - event_source.signal_button_release.connect(sigc::mem_fun(this, &CameraController::button_release)); - event_source.signal_pointer_motion.connect(sigc::mem_fun(this, &CameraController::pointer_motion)); - event_source.signal_key_press.connect(sigc::mem_fun(this, &CameraController::key_press)); - event_source.signal_key_release.connect(sigc::mem_fun(this, &CameraController::key_release)); + mouse.signal_button_press.connect(sigc::bind_return(sigc::mem_fun(this, &CameraController::button_press), false)); + mouse.signal_button_release.connect(sigc::bind_return(sigc::mem_fun(this, &CameraController::button_release), false)); + mouse.signal_axis_motion.connect(sigc::bind_return(sigc::mem_fun(this, &CameraController::axis_motion), false)); + keyboard.signal_button_press.connect(sigc::bind_return(sigc::mem_fun(this, &CameraController::key_press), false)); + keyboard.signal_button_release.connect(sigc::bind_return(sigc::mem_fun(this, &CameraController::key_release), false)); } void CameraController::top_down() @@ -106,18 +102,14 @@ void CameraController::tick(float dt) } } -void CameraController::button_press(int x, int y, unsigned btn, unsigned mod) +void CameraController::button_press(unsigned btn) { - mod = Input::mod_from_sys(mod); if(btn==2 || btn==3) { - if(mod&Input::MOD_CONTROL) + if(ctrl_pressed) drag_mode = DISTANCE; else - drag_mode = ((btn==2)==((mod&Input::MOD_SHIFT)!=0) ? ROTATE : PAN); - - pointer_x = x; - pointer_y = y; + drag_mode = ((btn==2)==shift_pressed ? ROTATE : PAN); } else if(btn==4) { @@ -129,41 +121,34 @@ void CameraController::button_press(int x, int y, unsigned btn, unsigned mod) } } -void CameraController::button_release(int, int, unsigned btn, unsigned) +void CameraController::button_release(unsigned btn) { if(btn==2 || btn==3) drag_mode = NONE; } -void CameraController::pointer_motion(int x, int y) +void CameraController::axis_motion(unsigned axis, float, float change) { - if(drag_mode!=NONE) + if(drag_mode==PAN) { - int dx = x-pointer_x; - int dy = y-pointer_y; - - if(drag_mode==PAN) - { - float scale = get_view_scale()/event_source.get_height(); - move(-dx*scale, dy*scale); - } - else if(drag_mode==ROTATE) - { - rotate(-dx*M_PI*2/event_source.get_width()); - pitch(-dy*M_PI/event_source.get_height()); - } - else if(drag_mode==DISTANCE) - adjust_distance(dy*3*get_distance()/event_source.get_height()); - - pointer_x = x; - pointer_y = y; + float dx = (axis==0 ? change : 0); + float dy = (axis==1 ? change : 0); + float scale = get_view_scale(); + move(-dx*scale, -dy*scale); } + else if(drag_mode==ROTATE) + { + if(axis==0) + rotate(-change*M_PI); + else if(axis==1) + pitch(change*M_PI/2); + } + else if(drag_mode==DISTANCE && axis==1) + adjust_distance(-change*3*get_distance()); } -void CameraController::key_press(unsigned code, unsigned, wchar_t) +void CameraController::key_press(unsigned key) { - unsigned key = Msp::Input::key_from_sys(code); - if(key==Msp::Input::KEY_RIGHT) move_x = 1; else if(key==Msp::Input::KEY_LEFT) @@ -176,16 +161,22 @@ void CameraController::key_press(unsigned code, unsigned, wchar_t) view_all(); else if(key==Msp::Input::KEY_INSERT) top_down(); + else if(key==Msp::Input::KEY_SHIFT_L || key==Msp::Input::KEY_SHIFT_R) + shift_pressed = true; + else if(key==Msp::Input::KEY_CTRL_L || key==Msp::Input::KEY_CTRL_R) + ctrl_pressed = true; } -void CameraController::key_release(unsigned code, unsigned) +void CameraController::key_release(unsigned key) { - unsigned key = Msp::Input::key_from_sys(code); - if(key==Msp::Input::KEY_RIGHT || key==Msp::Input::KEY_LEFT) move_x = 0; else if(key==Msp::Input::KEY_UP || key==Msp::Input::KEY_DOWN) move_y = 0; + else if(key==Msp::Input::KEY_SHIFT_L || key==Msp::Input::KEY_SHIFT_R) + shift_pressed = false; + else if(key==Msp::Input::KEY_CTRL_L || key==Msp::Input::KEY_CTRL_R) + ctrl_pressed = false; } GL::Vector3 CameraController::get_focus() const