1 /* -*-c++-*-
2 *
3 *  OpenSceneGraph example, osgimpostor.
4 *
5 *  Permission is hereby granted, free of charge, to any person obtaining a copy
6 *  of this software and associated documentation files (the "Software"), to deal
7 *  in the Software without restriction, including without limitation the rights
8 *  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 *  copies of the Software, and to permit persons to whom the Software is
10 *  furnished to do so, subject to the following conditions:
11 *
12 *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
13 *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
14 *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
15 *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
16 *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
17 *  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
18 *  THE SOFTWARE.
19 */
20 
21 #ifndef OSGGA_TESTMANIPULATOR
22 #define OSGGA_TESTMANIPULATOR 1
23 
24 #include <osgGA/CameraManipulator>
25 #include <osg/Quat>
26 
27 class TestManipulator : public osgGA::CameraManipulator
28 {
29     public:
30 
31         TestManipulator();
32         virtual ~TestManipulator();
33 
34         /** set the position of the matrix manipulator using a 4x4 Matrix.*/
35         virtual void setByMatrix(const osg::Matrixd& matrix);
36 
37         /** set the position of the matrix manipulator using a 4x4 Matrix.*/
setByInverseMatrix(const osg::Matrixd & matrix)38         virtual void setByInverseMatrix(const osg::Matrixd& matrix) { setByMatrix(osg::Matrixd::inverse(matrix)); }
39 
40         /** get the position of the manipulator as 4x4 Matrix.*/
41         virtual osg::Matrixd getMatrix() const;
42 
43         /** get the position of the manipulator as a inverse matrix of the manipulator, typically used as a model view matrix.*/
44         virtual osg::Matrixd getInverseMatrix() const;
45 
46         /** Attach a node to the manipulator.
47             Automatically detaches previously attached node.
48             setNode(NULL) detaches previously nodes.
49             Is ignored by manipulators which do not require a reference model.*/
50         virtual void setNode(osg::Node*);
51 
52         /** Return node if attached.*/
53         virtual const osg::Node* getNode() const;
54 
55         /** Return node if attached.*/
56         virtual osg::Node* getNode();
57 
58         /** Move the camera to the default position.
59             May be ignored by manipulators if home functionality is not appropriate.*/
60         virtual void home(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& us);
61 
62         /** Start/restart the manipulator.*/
63         virtual void init(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& us);
64 
65 
66         /** handle events, return true if handled, false otherwise.*/
67         virtual bool handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& us);
68 
69     private:
70 
71         /** Reset the internal GUIEvent stack.*/
72         void flushMouseEventStack();
73         /** Add the current mouse GUIEvent to internal stack.*/
74         void addMouseEvent(const osgGA::GUIEventAdapter& ea);
75 
76         void computePosition(const osg::Vec3& eye,const osg::Vec3& lv,const osg::Vec3& up);
77 
78         /** For the give mouse movement calculate the movement of the camera.
79             Return true is camera has moved and a redraw is required.*/
80         bool calcMovement();
81 
82         /** Check the speed at which the mouse is moving.
83             If speed is below a threshold then return false, otherwise return true.*/
84         bool isMouseMoving();
85 
86         // Internal event stack comprising last three mouse events.
87         osg::ref_ptr<const osgGA::GUIEventAdapter> _ga_t1;
88         osg::ref_ptr<const osgGA::GUIEventAdapter> _ga_t0;
89 
90         osg::ref_ptr<osg::Node>       _node;
91 
92         float _modelScale;
93         float _minimumZoomScale;
94 
95         bool _thrown;
96 
97         osg::Vec3   _center;
98         osg::Quat   _rotation;
99         float       _distance;
100 
101 };
102 
103 #endif
104