X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fdesigner%2Fcameracontroller.cpp;h=7b7e5f1339672d0dac127d8a5931a76d6f54ef57;hb=5929b101ee38b5668b328e7b1eac4bf49c912412;hp=edebff75f375f7911499e38f7edafb3a592217ec;hpb=293bfd4d1a5dbd57c7d3c657e5f6467d9f2e3300;p=r2c2.git diff --git a/source/designer/cameracontroller.cpp b/source/designer/cameracontroller.cpp index edebff7..7b7e5f1 100644 --- a/source/designer/cameracontroller.cpp +++ b/source/designer/cameracontroller.cpp @@ -1,32 +1,28 @@ -/* $Id$ - -This file is part of the MSP Märklin suite -Copyright © 2010 Mikkosoft Productions, Mikko Rasa -Distributed under the GPL -*/ - #include #include +#include "3d/layout.h" #include "cameracontroller.h" -#include "designer.h" using namespace std; using namespace Msp; -using namespace Marklin; +using namespace R2C2; -CameraController::CameraController(Designer &d, Graphics::EventSource &es, GL::Camera &c): - designer(d), - event_source(es), - camera(c), +CameraController::CameraController(View3D &v, Input::Keyboard &k, Input::Mouse &m): + view(v), + 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() @@ -41,42 +37,21 @@ void CameraController::set_look_direction(const GL::Vector3 &look) GL::Vector3 focus = get_focus(); float dist = get_distance(); camera.set_look_direction(look); - camera.set_position(GL::Vector3(focus.x-look.x*dist, focus.y-look.y*dist, focus.z-look.z*dist)); + camera.set_position(focus-look*dist); } void CameraController::view_all() { - Point minp; - Point maxp; - - const Layout3D::TrackMap &tracks = designer.get_layout_3d().get_tracks(); - for(Layout3D::TrackMap::const_iterator i=tracks.begin(); i!=tracks.end(); ++i) - { - Point tmin; - Point tmax; - i->second->get_bounds(0, tmin, tmax); - minp.x = min(minp.x, tmin.x); - minp.y = min(minp.y, tmin.y); - maxp.x = max(maxp.x, tmax.x); - maxp.y = max(maxp.y, tmax.y); - } - - float t = tan(camera.get_field_of_view()/2)*2; - float size = max((maxp.y-minp.y+0.1), (maxp.x-minp.x+0.1)/camera.get_aspect()); - float dist = size/t+size*0.25; - GL::Vector3 center((minp.x+maxp.x)/2, (minp.y+maxp.y)/2, 0); - const GL::Vector3 &look = camera.get_look_direction(); - camera.set_position(GL::Vector3(center.x-look.x*dist, center.y-look.y*dist, center.z-look.z*dist)); + view.view_all(); } void CameraController::move(float x, float y) { const GL::Vector3 &pos = camera.get_position(); const GL::Vector3 &look = camera.get_look_direction(); - float xy_len = sqrt(look.x*look.x+look.y*look.y); - float dx = (look.x*y+look.y*x)/xy_len; - float dy = (look.y*y-look.x*x)/xy_len; - camera.set_position(GL::Vector3(pos.x+dx, pos.y+dy, pos.z)); + GL::Vector3 fwd_dir = normalize(GL::Vector3(look.x, look.y, 0)); + GL::Vector3 right_dir = cross(fwd_dir, GL::Vector3(0, 0, 1)); + camera.set_position(pos+fwd_dir*y+right_dir*x); } void CameraController::adjust_distance(float delta) @@ -84,23 +59,22 @@ void CameraController::adjust_distance(float delta) const GL::Vector3 &pos = camera.get_position(); const GL::Vector3 &look = camera.get_look_direction(); float dist = get_distance(); - float low = designer.get_layout().get_catalogue().get_gauge()*5; + // XXX This should probably depend on the layout contents in some way + float low = 0.1; if(dist+delta