root/OpenSceneGraph/trunk/src/osgGA/KeySwitchMatrixManipulator.cpp @ 7064

Revision 7064, 5.8 kB (checked in by robert, 7 years ago)

Added checking of GUIEventAdpter::getHandled().

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1#include <osgGA/KeySwitchMatrixManipulator>
2#include <osg/Notify>
3
4using namespace osgGA;
5
6void KeySwitchMatrixManipulator::addMatrixManipulator(int key, std::string name, MatrixManipulator *cm)
7{
8    if(!cm) return;
9
10    _manips[key]=std::make_pair(name,osg::ref_ptr<MatrixManipulator>(cm));
11   
12    if(!_current)
13    {
14        _current=cm;
15        _current->setHomePosition(_homeEye,_homeCenter,_homeUp,_autoComputeHomePosition);
16        _current->setNode(0);
17        _current->setCoordinateFrameCallback(getCoordinateFrameCallback());
18        _current->setByMatrix(getMatrix());
19    }
20}
21
22void KeySwitchMatrixManipulator::addNumberedMatrixManipulator(MatrixManipulator *cm)
23{
24    if(!cm) return;
25    addMatrixManipulator('1'+_manips.size(),cm->className(),cm);
26}
27
28void KeySwitchMatrixManipulator::selectMatrixManipulator(unsigned int num)
29{
30    unsigned int manipNo = 0;
31    KeyManipMap::iterator itr;
32    for(itr=_manips.begin();
33        manipNo!=num && itr!=_manips.end();
34        ++itr,++manipNo)
35    {
36    }
37   
38    if (itr!=_manips.end())
39    {
40        itr->second.second->setHomePosition(_homeEye,_homeCenter,_homeUp,_autoComputeHomePosition);
41
42        if (_current.valid())
43        {
44            if ( !itr->second.second->getCoordinateFrameCallback() )
45            {
46                itr->second.second->setCoordinateFrameCallback(_current->getCoordinateFrameCallback());
47            }
48       
49            if ( !itr->second.second->getNode() )
50            {
51                itr->second.second->setNode(_current->getNode());
52            }
53            itr->second.second->setByMatrix(_current->getMatrix());
54        }
55        _current = itr->second.second;
56    }
57}
58
59void KeySwitchMatrixManipulator::setNode(osg::Node* node)
60{
61    for(KeyManipMap::iterator itr=_manips.begin();
62        itr!=_manips.end();
63        ++itr)
64    {
65        itr->second.second->setNode(node);
66    }
67}
68
69void KeySwitchMatrixManipulator::setHomePosition(const osg::Vec3d& eye, const osg::Vec3d& center, const osg::Vec3d& up, bool autoComputeHomePosition)
70{
71    MatrixManipulator::setHomePosition(eye, center, up, autoComputeHomePosition);
72    for(KeyManipMap::iterator itr=_manips.begin();
73        itr!=_manips.end();
74        ++itr)
75    {
76        itr->second.second->setHomePosition(eye, center, up, autoComputeHomePosition);
77    }
78}
79
80void KeySwitchMatrixManipulator::setAutoComputeHomePosition(bool flag)
81{
82    _autoComputeHomePosition = flag;
83    for(KeyManipMap::iterator itr=_manips.begin();
84        itr!=_manips.end();
85        ++itr)
86    {
87        itr->second.second->setAutoComputeHomePosition(flag);
88    }
89}
90
91void KeySwitchMatrixManipulator::setMinimumDistance(float minimumDistance)
92{
93    _minimumDistance = minimumDistance;
94    for(KeyManipMap::iterator itr=_manips.begin();
95        itr!=_manips.end();
96        ++itr)
97    {
98        itr->second.second->setMinimumDistance(minimumDistance);
99    }
100}
101
102void KeySwitchMatrixManipulator::computeHomePosition()
103{
104    for(KeyManipMap::iterator itr=_manips.begin();
105        itr!=_manips.end();
106        ++itr)
107    {
108        itr->second.second->computeHomePosition();
109    }
110}
111
112void KeySwitchMatrixManipulator::setCoordinateFrameCallback(CoordinateFrameCallback* cb)
113{
114    _coordinateFrameCallback = cb;
115    for(KeyManipMap::iterator itr=_manips.begin();
116        itr!=_manips.end();
117        ++itr)
118    {
119        itr->second.second->setCoordinateFrameCallback(cb);
120    }
121}
122
123MatrixManipulator* KeySwitchMatrixManipulator::getMatrixManipulatorWithIndex(unsigned int index)
124{
125    unsigned i=0;
126    for(KeyManipMap::iterator itr = _manips.begin();
127         itr != _manips.end();
128         ++itr, ++i)
129    {
130        if (i==index) return itr->second.second.get();
131    }
132    return 0;
133}
134
135const MatrixManipulator* KeySwitchMatrixManipulator::getMatrixManipulatorWithIndex(unsigned int index) const
136{
137    unsigned i=0;
138    for(KeyManipMap::const_iterator itr = _manips.begin();
139         itr != _manips.end();
140         ++itr, ++i)
141    {
142        if (i==index) return itr->second.second.get();
143    }
144    return 0;
145}
146
147MatrixManipulator* KeySwitchMatrixManipulator::getMatrixManipulatorWithKey(unsigned int key)
148{
149    KeyManipMap::iterator itr = _manips.find(key);
150    if (itr!=_manips.end()) return itr->second.second.get();
151    else return 0;
152}
153
154const MatrixManipulator* KeySwitchMatrixManipulator::getMatrixManipulatorWithKey(unsigned int key) const
155{
156    KeyManipMap::const_iterator itr = _manips.find(key);
157    if (itr!=_manips.end()) return itr->second.second.get();
158    else return 0;
159}
160
161bool KeySwitchMatrixManipulator::handle(const GUIEventAdapter& ea,GUIActionAdapter& aa)
162{
163    if (!_current) return false;
164
165    bool handled = false;
166
167    if (!ea.getHandled() && ea.getEventType()==GUIEventAdapter::KEYDOWN)
168    {
169
170        KeyManipMap::iterator it=_manips.find(ea.getKey());
171        if(it != _manips.end())
172        {
173            osg::notify(osg::INFO)<<"Switching to manipulator: "<<(*it).second.first<<std::endl;
174            if ( !it->second.second->getNode() )
175            {
176                it->second.second->setNode(_current->getNode());
177            }
178            it->second.second->setByMatrix(_current->getMatrix());
179            it->second.second->init(ea,aa);
180            _current = it->second.second;
181
182            //_cameraManipChangeCallbacks.notify(this);
183           
184            handled = true;
185        }
186    }
187
188    return _current->handle(ea,aa) || handled;
189}
190
191void KeySwitchMatrixManipulator::getUsage(osg::ApplicationUsage& usage) const
192{
193    for(KeyManipMap::const_iterator itr=_manips.begin();
194        itr!=_manips.end();
195        ++itr)
196    {
197        std::string key; key += (char)(itr->first);
198        std::string explanation(std::string("Select '")+itr->second.first+std::string("' camera manipulator"));
199        if (_current==itr->second.second) explanation += " (default)";
200
201        usage.addKeyboardMouseBinding(key,explanation);
202        itr->second.second->getUsage(usage);
203    }
204}
Note: See TracBrowser for help on using the browser.