X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fdesigner%2Fcameracontroller.h;h=5b6c3155314c74b2eb5b705aa90eabbeab67eee2;hb=91131237203bffe734219ab8b82b9d17f5d7a87d;hp=63ba2c13027f528f1c63a376c66bb70242c6e98d;hpb=e07c0d862a4d43b2585c93e79d25380d00675309;p=r2c2.git diff --git a/source/designer/cameracontroller.h b/source/designer/cameracontroller.h index 63ba2c1..5b6c315 100644 --- a/source/designer/cameracontroller.h +++ b/source/designer/cameracontroller.h @@ -1,34 +1,78 @@ -/* $Id$ - -This file is part of the MSP Märklin suite -Copyright © 2010 Mikkosoft Productions, Mikko Rasa -Distributed under the GPL -*/ - #ifndef CAMERACONTROLLER_H_ #define CAMERACONTROLLER_H_ -#include +#include #include +#include +#include +#include "3d/view.h" +/** +Moves the camera based on keyboard and mouse events. Controls are as follows: + +Arrow keys - pan +Home - view all +Insert - view from top down +Wheel - adjust viewing distance +RMB - rotate +MMB - pan +Shift + RMB - pan +Shift + MMB - rotate +Ctrl + RMB - adjust viewing distance +Ctrl + MMB - adjust viewing distance +*/ class CameraController { private: - Msp::Graphics::Window &window; + enum DragMode + { + NONE, + PAN, + ROTATE, + DISTANCE + }; + + R2C2::View3D &view; + Msp::Input::Keyboard &keyboard; + Msp::Input::Mouse &mouse; Msp::GL::Camera &camera; int move_x; int move_y; - int zoom; - int rotate; - int pitch; + int pointer_x; + int pointer_y; + bool shift_pressed; + bool ctrl_pressed; + DragMode drag_mode; public: - CameraController(Msp::Graphics::Window &, Msp::GL::Camera &); + CameraController(R2C2::View3D &, Msp::Input::Keyboard &, Msp::Input::Mouse &); + + void top_down(); + void set_look_direction(const Msp::GL::Vector3 &); + void view_all(); + + void move(float, float); + void adjust_distance(float); + void rotate(const R2C2::Angle &); + void pitch(const R2C2::Angle &); void tick(float); private: - void key_press(unsigned, unsigned, wchar_t); - void key_release(unsigned, unsigned); + void button_press(unsigned); + void button_release(unsigned); + void axis_motion(unsigned, float, float); + void key_press(unsigned); + void key_release(unsigned); + +public: + /** Return the focus point, i.e. where the look ray intersects with ground. */ + Msp::GL::Vector3 get_focus() const; + + /** Return distance from the focus point. */ + float get_distance() const; + + /** Return the viewport height at focus distance. */ + float get_view_scale() const; }; #endif