root/OpenSceneGraph/trunk/src/osgPresentation/PickEventHandler.cpp @ 10764

Revision 10764, 6.6 kB (checked in by robert, 5 years ago)

<iterator>, <stdlib.h> and <ctype.h> includes required for QNX compiler

RevLine 
[10113]1/* -*-c++-*- Present3D - Copyright (C) 1999-2006 Robert Osfield
2 *
3 * This software is open source and may be redistributed and/or modified under 
4 * the terms of the GNU General Public License (GPL) version 2.0.
5 * The full license is in LICENSE.txt file included with this distribution,.
6 *
7 * This software is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10 * include LICENSE.txt for more details.
11*/
12
[10396]13#include <osgPresentation/PickEventHandler>
14#include <osgPresentation/SlideEventHandler>
[10113]15
16#include <osgViewer/Viewer>
17#include <osg/Notify>
18#include <osgDB/FileUtils>
19
[10764]20#include <stdlib.h>
21
[10117]22using namespace osgPresentation;
23
24PickEventHandler::PickEventHandler(osgPresentation::Operation operation,bool relativeJump, int slideNum, int layerNum):
[10113]25    _operation(operation),
26    _relativeJump(relativeJump),
27    _slideNum(slideNum),
28    _layerNum(layerNum)
29{
30}
31
[10117]32PickEventHandler::PickEventHandler(const std::string& str, osgPresentation::Operation operation,bool relativeJump, int slideNum, int layerNum):
[10113]33    _command(str),
34    _operation(operation),
35    _relativeJump(relativeJump),
36    _slideNum(slideNum),
37    _layerNum(layerNum)
38{
39}
40
[10117]41PickEventHandler::PickEventHandler(const osgPresentation::KeyPosition& keyPos,bool relativeJump, int slideNum, int layerNum):
[10113]42    _keyPos(keyPos),
[10117]43    _operation(osgPresentation::EVENT),
[10113]44    _relativeJump(relativeJump),
45    _slideNum(slideNum),
46    _layerNum(layerNum)
47{
48}
49
50
51bool PickEventHandler::handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa, osg::Object*, osg::NodeVisitor* nv)
52{
53    switch(ea.getEventType())
54    {
55        case(osgGA::GUIEventAdapter::MOVE):
56        case(osgGA::GUIEventAdapter::PUSH):
57        case(osgGA::GUIEventAdapter::RELEASE):
58        {
59            osgViewer::Viewer* viewer = dynamic_cast<osgViewer::Viewer*>(&aa);
60            osgUtil::LineSegmentIntersector::Intersections intersections;
61            if (viewer->computeIntersections(ea.getX(),ea.getY(), nv->getNodePath(), intersections))
62            {
63                for(osgUtil::LineSegmentIntersector::Intersections::iterator hitr=intersections.begin();
64                    hitr!=intersections.end();
65                    ++hitr)
66                {
67                    if (ea.getEventType()==osgGA::GUIEventAdapter::MOVE)
68                    {
69                        osg::notify(osg::INFO)<<"Tooltip..."<<std::endl;
70                    }
71                    else if (ea.getEventType()==osgGA::GUIEventAdapter::RELEASE)
72                    {
73                        doOperation();
74                        return true;
75                    }
76                }
77            }
78            break;
79        }
80        case(osgGA::GUIEventAdapter::KEYDOWN):
81        {
82            //osg::notify(osg::NOTICE)<<"PickEventHandler KEYDOWN "<<(char)ea.getKey()<<std::endl;
83            //if (object) osg::notify(osg::NOTICE)<<"    "<<object->className()<<std::endl;
84            break;
85        }
86        default:
87            break;
88    }
89    return false;
90}
91
92
93void PickEventHandler::accept(osgGA::GUIEventHandlerVisitor& v)
94{
95    v.visit(*this);
96}
97
98void PickEventHandler::getUsage(osg::ApplicationUsage& /*usage*/) const
99{
100}
101
102void PickEventHandler::setRelativeJump(int slideNum, int layerNum)
103{
104    _relativeJump = true;
105    _slideNum = slideNum;
106    _layerNum = layerNum;
107}
108
109void PickEventHandler::setAbsoluteJump(int slideNum, int layerNum)
110{
111    _relativeJump = false;
112    _slideNum = slideNum;
113    _layerNum = layerNum;
114}
115
116
117void PickEventHandler::doOperation()
118{
119    switch(_operation)
120    {
[10117]121        case(osgPresentation::RUN):
[10113]122        {
123            osg::notify(osg::NOTICE)<<"Run "<<_command<<std::endl;
[10117]124
125#if 0
[10113]126            osgDB::FilePathList& paths = osgDB::getDataFilePathList();
127            if (!paths.empty())
128            {
129            #ifdef _WIN32           
130                std::string delimintor(";");
131            #else
132                std::string delimintor(":");
133            #endif
134                std::string filepath("OSG_FILE_PATH=");
[10207]135
[10113]136                bool needDeliminator = false;
137                for(osgDB::FilePathList::iterator itr = paths.begin();
138                    itr != paths.end();
139                    ++itr)
140                {
141                    if (needDeliminator) filepath += delimintor;
142                    filepath += *itr;
143                    needDeliminator = true;
144                }
145                putenv( (char*) filepath.c_str());
146
147                std::string binpath("PATH=");
148                char* path = getenv("PATH");
149                if (path) binpath += path;
[10207]150
[10113]151                needDeliminator = true;
152                for(osgDB::FilePathList::iterator itr = paths.begin();
153                    itr != paths.end();
154                    ++itr)
155                {
156                    if (needDeliminator) binpath += delimintor;
157                    binpath += *itr;
158                    needDeliminator = true;
159                }
160                putenv( (char*) binpath.c_str());
161
162            }
[10207]163#endif
[10113]164            int result = system(_command.c_str());
165
[10207]166            osg::notify(osg::INFO)<<"system("<<_command<<") result "<<result<<std::endl;
167
[10113]168            break;
169        }
[10117]170        case(osgPresentation::LOAD):
[10113]171        {
172            osg::notify(osg::NOTICE)<<"Load "<<_command<<std::endl;
173            break;
174        }
[10117]175        case(osgPresentation::EVENT):
[10113]176        {
177            osg::notify(osg::INFO)<<"Event "<<_keyPos._key<<" "<<_keyPos._x<<" "<<_keyPos._y<<std::endl;
178            if (SlideEventHandler::instance()) SlideEventHandler::instance()->dispatchEvent(_keyPos);
179            break;
180        }
[10117]181        case(osgPresentation::JUMP):
182        {
183            osg::notify(osg::NOTICE)<<"Requires jump "<<std::endl;
184            break;
185        }
[10113]186    }
187   
188    if (requiresJump())
189    {
190        osg::notify(osg::NOTICE)<<"Requires jump "<<_relativeJump<<", "<<_slideNum<<", "<<_layerNum<<std::endl;
[10207]191
[10113]192        if (_relativeJump)
193        {
194            int previousSlide = SlideEventHandler::instance()->getActiveSlide();
195            int previousLayer = SlideEventHandler::instance()->getActiveLayer();
196            int newSlide = previousSlide + _slideNum;
197            int newLayer = previousLayer + _layerNum;
198            if (newLayer<0)
199            {
200                newLayer = 0;
201            }
[10207]202
[10113]203            osg::notify(osg::NOTICE)<<"   jump to "<<newSlide<<", "<<newLayer<<std::endl;
204
205            SlideEventHandler::instance()->selectSlide(newSlide, newLayer);
206        }
207        else
208        {
209            SlideEventHandler::instance()->selectSlide(_slideNum,_layerNum);
210        }
211    }
212    else
213    {
214        osg::notify(osg::NOTICE)<<"No jump required."<<std::endl;
215    }
216}
Note: See TracBrowser for help on using the browser.