]> git.tdb.fi Git - r2c2.git/blobdiff - source/designer/cameracontroller.h
Rename the project to R²C²
[r2c2.git] / source / designer / cameracontroller.h
index 63ba2c13027f528f1c63a376c66bb70242c6e98d..b18e2519d25aadecaff80eb4e8c345b7bc7ffb85 100644 (file)
@@ -1,6 +1,6 @@
 /* $Id$
 
-This file is part of the MSP Märklin suite
+This file is part of R²C²
 Copyright © 2010 Mikkosoft Productions, Mikko Rasa
 Distributed under the GPL
 */
@@ -11,24 +11,71 @@ Distributed under the GPL
 #include <msp/gbase/window.h>
 #include <msp/gl/camera.h>
 
+class Designer;
+
+/**
+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
+       };
+
+       Designer &designer;
+       Msp::Graphics::EventSource &event_source;
        Msp::GL::Camera &camera;
        int move_x;
        int move_y;
-       int zoom;
-       int rotate;
-       int pitch;
+       int pointer_x;
+       int pointer_y;
+       DragMode drag_mode;
 
 public:
-       CameraController(Msp::Graphics::Window &, Msp::GL::Camera &);
+       CameraController(Designer &, Msp::Graphics::EventSource &, Msp::GL::Camera &);
+
+       void top_down();
+       void set_look_direction(const Msp::GL::Vector3 &);
+       void view_all();
+
+       void move(float, float);
+       void adjust_distance(float);
+       void rotate(float);
+       void pitch(float);
 
        void tick(float);
 private:
+       void button_press(int, int, unsigned, unsigned);
+       void button_release(int, int, unsigned, unsigned);
+       void pointer_motion(int, int);
        void key_press(unsigned, unsigned, wchar_t);
        void key_release(unsigned, 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