root/OpenSceneGraph/trunk/include/osgGA/NodeTrackerManipulator @ 7648

Revision 7648, 7.0 kB (checked in by robert, 7 years ago)

From Roland Smeenk, "Attached you will find a large set of small typo fixes (mainly in the comments)."

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
RevLine 
[5328]1/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield
[3340]2 *
3 * This library is open source and may be redistributed and/or modified under 
4 * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
5 * (at your option) any later version.  The full license is in LICENSE file
6 * included with this distribution, and on the openscenegraph.org website.
7 *
8 * This library is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 * OpenSceneGraph Public License for more details.
12*/
13
14#ifndef OSGGA_NODETRACKERMANIPULATOR
15#define OSGGA_NODETRACKERMANIPULATOR 1
16
17#include <osgGA/MatrixManipulator>
[3398]18
[3340]19#include <osg/Quat>
[5016]20#include <osg/observer_ptr>
[3340]21
22namespace osgGA{
23
24class OSGGA_EXPORT NodeTrackerManipulator : public MatrixManipulator
25{
26    public:
27
28        NodeTrackerManipulator();
29
30        virtual const char* className() const { return "NodeTrackerManipulator"; }
31
[7102]32        typedef std::vector< osg::observer_ptr<osg::Node> >   ObserverNodePath;
[3340]33
[5375]34        void setTrackNodePath(const osg::NodePath& nodePath)
35        {
36           _trackNodePath.clear();
37           _trackNodePath.reserve(nodePath.size());
38           std::copy(nodePath.begin(), nodePath.end(), std::back_inserter(_trackNodePath));
39        }
40
[7102]41        void setTrackNodePath(const ObserverNodePath& nodePath) { _trackNodePath = nodePath; }
42        ObserverNodePath& getTrackNodePath() { return _trackNodePath; }
[3340]43
[3398]44        void setTrackNode(osg::Node* node);
45        osg::Node* getTrackNode() { return _trackNodePath.empty() ? 0 : _trackNodePath.back().get(); }
46        const osg::Node* getTrackNode() const { return _trackNodePath.empty() ? 0 : _trackNodePath.back().get(); }
47
[3343]48        enum TrackerMode
49        {
[3498]50            /** Track the center of the node's bounding sphere, but not rotations of the node. 
[7648]51              * For databases which have a CoordinateSystemNode, the orientation is kept relative the coordinate frame if the center of the node.
[3498]52              */
[3343]53            NODE_CENTER,
[3498]54            /** Track the center of the node's bounding sphere, and the azimuth rotation (about the z axis of the current coordinate frame).
[7648]55              * For databases which have a CoordinateSystemNode, the orientation is kept relative the coordinate frame if the center of the node.
[3498]56              */
[3495]57            NODE_CENTER_AND_AZIM,
[3498]58            /** Tack the center of the node's bounding sphere, and the all rotations of the node.
59              */
[6461]60            NODE_CENTER_AND_ROTATION
[3343]61        };
62       
63        void setTrackerMode(TrackerMode mode);
[4756]64        TrackerMode getTrackerMode() const { return _trackerMode; }
[3343]65
66
[3340]67        enum RotationMode
68        {
[3498]69            /** Use a trackball style manipulation of the view direction w.r.t the tracked orientation.
70              */
[3495]71            TRACKBALL,
[3498]72            /** Allow the elevation and azimuth angles to be adjust w.r.t the tracked orientation.
73              */
[6461]74            ELEVATION_AZIM
[3340]75        };
76       
77        void setRotationMode(RotationMode mode);
78        RotationMode getRotationMode() const { return _rotationMode; }
79
80
81        /** set the position of the matrix manipulator using a 4x4 Matrix.*/
82        virtual void setByMatrix(const osg::Matrixd& matrix);
83
84        /** set the position of the matrix manipulator using a 4x4 Matrix.*/
85        virtual void setByInverseMatrix(const osg::Matrixd& matrix) { setByMatrix(osg::Matrixd::inverse(matrix)); }
86
87        /** get the position of the manipulator as 4x4 Matrix.*/
88        virtual osg::Matrixd getMatrix() const;
89
90        /** get the position of the manipulator as a inverse matrix of the manipulator, typically used as a model view matrix.*/
91        virtual osg::Matrixd getInverseMatrix() const;
92
[7648]93        /** Get the FusionDistanceMode. Used by SceneView for setting up stereo convergence.*/
[3340]94        virtual osgUtil::SceneView::FusionDistanceMode getFusionDistanceMode() const { return osgUtil::SceneView::USE_FUSION_DISTANCE_VALUE; }
95
[7648]96        /** Get the FusionDistanceValue. Used by SceneView for setting up stereo convergence.*/
[3340]97        virtual float getFusionDistanceValue() const { return _distance; }
98
99        /** Attach a node to the manipulator.
100            Automatically detaches previously attached node.
101            setNode(NULL) detaches previously nodes.
102            Is ignored by manipulators which do not require a reference model.*/
103        virtual void setNode(osg::Node*);
104
105        /** Return node if attached.*/
106        virtual const osg::Node* getNode() const;
107
108        /** Return node if attached.*/
109        virtual osg::Node* getNode();
110
[3497]111        virtual void computeHomePosition();
112
[3340]113        /** Move the camera to the default position.
114            May be ignored by manipulators if home functionality is not appropriate.*/
115        virtual void home(const GUIEventAdapter& ea,GUIActionAdapter& us);
116       
117        /** Start/restart the manipulator.*/
118        virtual void init(const GUIEventAdapter& ea,GUIActionAdapter& us);
119
120        /** handle events, return true if handled, false otherwise.*/
121        virtual bool handle(const GUIEventAdapter& ea,GUIActionAdapter& us);
122
123        /** Get the keyboard and mouse usage of this manipulator.*/
124        virtual void getUsage(osg::ApplicationUsage& usage) const;
125
126    protected:
127
128        virtual ~NodeTrackerManipulator();
[3398]129       
[5016]130        osg::NodePath getNodePath() const;
[3340]131
[5016]132        bool validateNodePath() const;
133
[3340]134        /** Reset the internal GUIEvent stack.*/
135        void flushMouseEventStack();
136        /** Add the current mouse GUIEvent to internal stack.*/
137        void addMouseEvent(const GUIEventAdapter& ea);
138
[3343]139        void computeNodeWorldToLocal(osg::Matrixd& worldToLocal) const;
140        void computeNodeLocalToWorld(osg::Matrixd& localToWorld) const;
[3340]141
[3343]142        void computeNodeCenterAndRotation(osg::Vec3d& center, osg::Quat& rotation) const;
143
[3340]144        void computePosition(const osg::Vec3d& eye,const osg::Vec3d& lv,const osg::Vec3d& up);
145
146        /** For the give mouse movement calculate the movement of the camera.
147            Return true is camera has moved and a redraw is required.*/
148        bool calcMovement();
149       
150        void trackball(osg::Vec3& axis,double& angle, double p1x, double p1y, double p2x, double p2y);
151        double tb_project_to_sphere(double r, double x, double y);
152
153
154        /** Check the speed at which the mouse is moving.
155            If speed is below a threshold then return false, otherwise return true.*/
156        bool isMouseMoving();
157
158
159        void clampOrientation();
160
161
[4919]162        // Internal event stack comprising last two mouse events.
[3340]163        osg::ref_ptr<const GUIEventAdapter> _ga_t1;
164        osg::ref_ptr<const GUIEventAdapter> _ga_t0;
165
166        osg::ref_ptr<osg::Node> _node;
[3398]167       
[7102]168        ObserverNodePath      _trackNodePath;
[3340]169
[3343]170        TrackerMode             _trackerMode;
[3340]171        RotationMode            _rotationMode;
172
173        bool                    _thrown;
174       
[3343]175        osg::Quat               _nodeRotation;
[3340]176        osg::Quat               _rotation;
177        float                   _distance;
178
179};
180
181}
182
183#endif
184
Note: See TracBrowser for help on using the browser.