root/OpenSceneGraph/trunk/src/osgViewer/Viewer.cpp @ 9868

Revision 9868, 37.2 kB (checked in by robert, 5 years ago)

Preliminary work on general purpose incremental compile support in osgViewer.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield
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#include <stdio.h>
15#include <stdlib.h>
16
17#include <osg/DeleteHandler>
18#include <osg/io_utils>
19
20#include <osgUtil/GLObjectsVisitor>
21#include <osgDB/Registry>
22#include <osgDB/ReadFile>
23#include <osgGA/TrackballManipulator>
24
25#include <osgViewer/Viewer>
26#include <osgViewer/Renderer>
27#include <osgViewer/CompositeViewer>
28
29#include <sstream>
30#include <string.h>
31
32using namespace osgViewer;
33
34
35Viewer::Viewer()
36{
37    _viewerBase = this;
38
39    constructorInit();
40}
41
42Viewer::Viewer(osg::ArgumentParser& arguments)
43{
44    _viewerBase = this;
45
46    constructorInit();
47
48    // Add help for command-line options read here
49    arguments.getApplicationUsage()->addCommandLineOption("--SingleThreaded","Select SingleThreaded threading model for viewer.");
50    arguments.getApplicationUsage()->addCommandLineOption("--CullDrawThreadPerContext","Select CullDrawThreadPerContext threading model for viewer.");
51    arguments.getApplicationUsage()->addCommandLineOption("--DrawThreadPerContext","Select DrawThreadPerContext threading model for viewer.");
52    arguments.getApplicationUsage()->addCommandLineOption("--CullThreadPerCameraDrawThreadPerContext","Select CullThreadPerCameraDrawThreadPerContext threading model for viewer.");
53    arguments.getApplicationUsage()->addCommandLineOption("--clear-color <color>","Set the background color of the viewer in the form \"r,g,b[,a]\".");
54    arguments.getApplicationUsage()->addCommandLineOption("--screen <num>","Set the screen to use when multiple screens are present.");
55    arguments.getApplicationUsage()->addCommandLineOption("--window <x y w h>","Set the position (x,y) and size (w,h) of the viewer window.");
56    // FIXME: Uncomment these lines when the options have been documented properly
57    //arguments.getApplicationUsage()->addCommandLineOption("--3d-sd","");
58    //arguments.getApplicationUsage()->addCommandLineOption("--panoramic-sd","");
59    //arguments.getApplicationUsage()->addCommandLineOption("--radius","");
60    //arguments.getApplicationUsage()->addCommandLineOption("--collar","");
61    //arguments.getApplicationUsage()->addCommandLineOption("--im","");
62   
63    std::string filename;
64    bool readConfig = false;
65    while (arguments.read("-c",filename))
66    {
67        readConfig = readConfiguration(filename) || readConfig;
68    }
69
70    while (arguments.read("--SingleThreaded")) setThreadingModel(SingleThreaded);
71    while (arguments.read("--CullDrawThreadPerContext")) setThreadingModel(CullDrawThreadPerContext);
72    while (arguments.read("--DrawThreadPerContext")) setThreadingModel(DrawThreadPerContext);
73    while (arguments.read("--CullThreadPerCameraDrawThreadPerContext")) setThreadingModel(CullThreadPerCameraDrawThreadPerContext);
74
75    osg::DisplaySettings::instance()->readCommandLine(arguments);
76    osgDB::readCommandLine(arguments);
77
78    std::string colorStr;
79    while (arguments.read("--clear-color",colorStr))
80    {
81        float r, g, b;
82        float a = 1.0f;
83        int cnt = sscanf( colorStr.c_str(), "%f,%f,%f,%f", &r, &g, &b, &a );
84        if( cnt==3 || cnt==4 ) getCamera()->setClearColor( osg::Vec4(r,g,b,a) );
85        else osg::notify(osg::WARN)<<"Invalid clear color \""<<colorStr<<"\""<<std::endl;
86    }
87   
88    int screenNum = -1;
89    while (arguments.read("--screen",screenNum)) {}
90   
91    int x = -1, y = -1, width = -1, height = -1;
92    while (arguments.read("--window",x,y,width,height)) {}
93   
94    bool ss3d = false;
95    bool wowvx20 = false;
96    bool wowvx42 = false;
97    if ((wowvx20=arguments.read("--wowvx-20")) || (wowvx42=arguments.read("--wowvx-42")) || arguments.read("--wowvx"))
98    {
99        int wow_content=0x02, wow_factor=0x40, wow_offset=0x80;
100        float wow_Zd, wow_vz, wow_M, wow_C;
101        if (wowvx20){
102            wow_Zd = 0.459813f;
103            wow_vz = 6.180772f;
104            wow_M = -1586.34f;
105            wow_C = 127.5f;
106        }
107        else if (wowvx42){
108            wow_Zd = 0.467481f;
109            wow_vz = 7.655192f;
110            wow_M = -1960.37f;
111            wow_C = 127.5f;
112        }
113
114        while (arguments.read("--wow-content",wow_content)) {}
115        while (arguments.read("--wow-factor",wow_factor)) {}
116        while (arguments.read("--wow-offset",wow_offset)) {}
117        while (arguments.read("--wow-zd",wow_Zd)) {}
118        while (arguments.read("--wow-vz",wow_vz)) {}
119        while (arguments.read("--wow-M",wow_M)) {}
120        while (arguments.read("--wow-C",wow_C)) {}
121           
122        if (screenNum<0) screenNum = 0;
123       
124        setUpViewForWoWVxDisplay( screenNum, wow_content, wow_factor, wow_offset, wow_Zd, wow_vz, wow_M, wow_C );
125    }
126    else if ((ss3d=arguments.read("--3d-sd")) || arguments.read("--panoramic-sd"))
127    {
128        double radius = 1.0;
129        while (arguments.read("--radius",radius)) {}
130
131        double collar = 0.45;
132        while (arguments.read("--collar",collar)) {}
133
134        std::string intensityMapFilename;
135        while (arguments.read("--im",intensityMapFilename)) {}
136
137        osg::ref_ptr<osg::Image> intensityMap = intensityMapFilename.empty() ? 0 : osgDB::readImageFile(intensityMapFilename);
138
139        if (screenNum<0) screenNum = 0;
140
141        if (ss3d)
142        {
143            setThreadingModel(SingleThreaded);
144            setUpViewFor3DSphericalDisplay(radius, collar, screenNum, intensityMap.get());
145        }
146        else
147        {
148            setThreadingModel(SingleThreaded);
149            setUpViewForPanoramicSphericalDisplay(radius, collar, screenNum, intensityMap.get());
150        }
151    }
152    else if (width>0 && height>0)
153    {
154        if (screenNum>=0) setUpViewInWindow(x, y, width, height, screenNum);
155        else setUpViewInWindow(x,y,width,height);
156       
157    }
158    else if (screenNum>=0)
159    {
160        setUpViewOnSingleScreen(screenNum);
161    }
162
163}
164
165Viewer::Viewer(const osgViewer::Viewer& viewer, const osg::CopyOp& copyop):
166    View(viewer,copyop)
167{
168    _viewerBase = this;
169}
170
171void Viewer::constructorInit()
172{
173    _eventVisitor = new osgGA::EventVisitor;
174    _eventVisitor->setActionAdapter(this);
175    _eventVisitor->setFrameStamp(_frameStamp.get());
176   
177    _updateVisitor = new osgUtil::UpdateVisitor;
178    _updateVisitor->setFrameStamp(_frameStamp.get());
179
180    setViewerStats(new osg::Stats("Viewer"));
181}
182
183Viewer::~Viewer()
184{
185    //osg::notify(osg::NOTICE)<<"Viewer::~Viewer()"<<std::endl;
186
187
188    Threads threads;
189    getAllThreads(threads);
190
191    osg::notify(osg::INFO)<<"Viewer::~Viewer():: start destructor getThreads = "<<threads.size()<<std::endl;
192
193
194    stopThreading();
195   
196    if (_scene.valid() && _scene->getDatabasePager())
197    {
198        _scene->getDatabasePager()->cancel();
199        _scene->setDatabasePager(0);
200    }
201
202    Contexts contexts;
203    getContexts(contexts);
204
205    // clear out all the previously assigned operations
206    for(Contexts::iterator citr = contexts.begin();
207        citr != contexts.end();
208        ++citr)
209    {
210        (*citr)->close();
211    }
212   
213    //osg::notify(osg::NOTICE)<<"finish Viewer::~Viewer()"<<std::endl;
214   
215    getAllThreads(threads);
216
217    osg::notify(osg::INFO)<<"Viewer::~Viewer() end destrcutor getThreads = "<<threads.size()<<std::endl;
218
219}
220
221void Viewer::take(View& rhs)
222{
223    osgViewer::View::take(rhs);
224   
225#if 1
226    osgViewer::Viewer* rhs_viewer = dynamic_cast<osgViewer::Viewer*>(&rhs);
227    if (rhs_viewer)
228    {
229        // variables left to take.
230        _done = rhs_viewer->_done;
231        _keyEventSetsDone = rhs_viewer->_keyEventSetsDone;
232        _quitEventSetsDone = rhs_viewer->_quitEventSetsDone;
233        _threadingModel = rhs_viewer->_threadingModel;
234        _threadsRunning = rhs_viewer->_threadsRunning;
235        _endBarrierPosition = rhs_viewer->_endBarrierPosition;
236        _startRenderingBarrier = rhs_viewer->_startRenderingBarrier;
237        _endRenderingDispatchBarrier = rhs_viewer->_endRenderingDispatchBarrier;
238        _endDynamicDrawBlock = rhs_viewer->_endDynamicDrawBlock;
239        _cameraWithFocus = rhs_viewer->_cameraWithFocus;
240        _eventVisitor = rhs_viewer->_eventVisitor;
241        _updateOperations = rhs_viewer->_updateOperations;
242        _updateVisitor = rhs_viewer->_updateVisitor;
243        _realizeOperation = rhs_viewer->_realizeOperation;
244        _currentContext = rhs_viewer->_currentContext;
245
246
247        // objects to clear
248        rhs_viewer->_done = true;
249        rhs_viewer->_startRenderingBarrier = 0;
250        rhs_viewer->_endRenderingDispatchBarrier = 0;
251        rhs_viewer->_endDynamicDrawBlock = 0;
252        rhs_viewer->_cameraWithFocus = 0;
253        rhs_viewer->_eventVisitor = 0;
254        rhs_viewer->_updateOperations = 0;
255        rhs_viewer->_updateVisitor = 0;
256        rhs_viewer->_realizeOperation = 0;
257        rhs_viewer->_currentContext = 0;
258    }
259#endif   
260}
261
262bool Viewer::readConfiguration(const std::string& filename)
263{
264    osg::notify(osg::INFO)<<"Viewer::readConfiguration("<<filename<<")"<<std::endl;
265   
266    osg::ref_ptr<osg::Object> object = osgDB::readObjectFile(filename);
267    if (!object)
268    {
269        //osg::notify(osg::NOTICE)<<"Error: Unable to load configuration file \""<<filename<<"\""<<std::endl;
270        return false;
271    }
272   
273    CompositeViewer* compositeViewer = dynamic_cast<CompositeViewer*>(object.get());
274    if (compositeViewer)
275    {
276        osg::notify(osg::NOTICE)<<"Error: Config file \""<<filename<<"\" containing CompositeViewer cannot be loaded by Viewer."<<std::endl;
277        return false;
278    }
279   
280    View* view = dynamic_cast<osgViewer::View*>(object.get());
281    if (view)
282    {
283        take(*view);
284
285        return true;
286    }
287    else
288    {   
289        osg::notify(osg::NOTICE)<<"Error: Config file \""<<filename<<"\" does not contain a valid Viewer configuration."<<std::endl;
290        return false;
291    }
292}
293
294bool Viewer::isRealized() const
295{
296    Contexts contexts;
297    const_cast<Viewer*>(this)->getContexts(contexts);
298
299    unsigned int numRealizedWindows = 0;
300
301    // clear out all the previously assigned operations
302    for(Contexts::iterator citr = contexts.begin();
303        citr != contexts.end();
304        ++citr)
305    {
306        if ((*citr)->isRealized()) ++numRealizedWindows;
307    }
308   
309    return numRealizedWindows > 0;
310}
311
312int Viewer::run()
313{
314    if (!getCameraManipulator() && getCamera()->getAllowEventFocus())
315    {
316        setCameraManipulator(new osgGA::TrackballManipulator());
317    }
318   
319    setReleaseContextAtEndOfFrameHint(false);
320           
321    return ViewerBase::run();
322}
323
324void Viewer::setStartTick(osg::Timer_t tick)
325{
326    View::setStartTick(tick);
327   
328    Contexts contexts;
329    getContexts(contexts,false);
330
331    getEventQueue()->setStartTick(_startTick);
332    for(Contexts::iterator citr = contexts.begin();
333        citr != contexts.end();
334        ++citr)
335    {
336        osgViewer::GraphicsWindow* gw = dynamic_cast<osgViewer::GraphicsWindow*>(*citr);
337        if (gw)
338        {
339            gw->getEventQueue()->setStartTick(_startTick);
340        }
341    }
342}
343
344void Viewer::setReferenceTime(double time)
345{
346    osg::Timer_t tick = osg::Timer::instance()->tick();
347    double currentTime = osg::Timer::instance()->delta_s(_startTick, tick);
348    double delta_ticks = (time-currentTime)*(osg::Timer::instance()->getSecondsPerTick());
349    if (delta_ticks>=0) tick += osg::Timer_t(delta_ticks);
350    else tick -= osg::Timer_t(-delta_ticks);
351
352    // assign the new start tick
353    setStartTick(tick);
354}
355
356
357void Viewer::setSceneData(osg::Node* node)
358{
359    setReferenceTime(0.0);
360
361    View::setSceneData(node);
362}
363
364GraphicsWindowEmbedded* Viewer::setUpViewerAsEmbeddedInWindow(int x, int y, int width, int height)
365{
366    setThreadingModel(SingleThreaded);
367    osgViewer::GraphicsWindowEmbedded* gw = new osgViewer::GraphicsWindowEmbedded(x,y,width,height);
368    getCamera()->setViewport(new osg::Viewport(0,0,width,height));
369    getCamera()->setProjectionMatrixAsPerspective(30.0f, static_cast<double>(width)/static_cast<double>(height), 1.0f, 10000.0f);
370    getCamera()->setGraphicsContext(gw);
371    return gw;
372}
373
374void Viewer::realize()
375{
376    //osg::notify(osg::INFO)<<"Viewer::realize()"<<std::endl;
377   
378    setCameraWithFocus(0);
379
380    Contexts contexts;
381    getContexts(contexts);
382   
383    if (contexts.empty())
384    {
385        osg::notify(osg::INFO)<<"Viewer::realize() - No valid contexts found, setting up view across all screens."<<std::endl;
386   
387        // no windows are already set up so set up a default view       
388       
389        const char* ptr = 0;
390        if ((ptr = getenv("OSG_CONFIG_FILE")) != 0)
391        {
392            readConfiguration(ptr);
393        }
394        else
395        {
396            int screenNum = -1;
397            if ((ptr = getenv("OSG_SCREEN")) != 0)
398            {
399                if (strlen(ptr)!=0) screenNum = atoi(ptr);
400                else screenNum = -1;
401            }
402
403            int x = -1, y = -1, width = -1, height = -1;
404            if ((ptr = getenv("OSG_WINDOW")) != 0)
405            {
406                std::istringstream iss(ptr);
407                iss >> x >> y >> width >> height;
408            }
409
410            if (width>0 && height>0)
411            {
412                if (screenNum>=0) setUpViewInWindow(x, y, width, height, screenNum);
413                else setUpViewInWindow(x,y,width,height);
414            }
415            else if (screenNum>=0)
416            {
417                setUpViewOnSingleScreen(screenNum);
418            }
419            else
420            {
421                setUpViewAcrossAllScreens();
422            }
423        }
424       
425        getContexts(contexts);
426    }
427
428    if (contexts.empty())
429    {
430        osg::notify(osg::NOTICE)<<"Viewer::realize() - failed to set up any windows"<<std::endl;
431        _done = true;
432        return;
433    }
434   
435    for(Contexts::iterator citr = contexts.begin();
436        citr != contexts.end();
437        ++citr)
438    {
439        osg::GraphicsContext* gc = *citr;
440        gc->realize();
441       
442        if (_realizeOperation.valid() && gc->valid())
443        {
444            gc->makeCurrent();
445           
446            (*_realizeOperation)(gc);
447           
448            gc->releaseContext();
449        }
450    }
451
452    // attach contexts to _incrementalCompileOperation if attached.
453    if (_incrementalCompileOperation) _incrementalCompileOperation->assignContexts(contexts);
454
455    bool grabFocus = true;
456    if (grabFocus)
457    {
458        for(Contexts::iterator citr = contexts.begin();
459            citr != contexts.end();
460            ++citr)
461        {
462            osgViewer::GraphicsWindow* gw = dynamic_cast<osgViewer::GraphicsWindow*>(*citr);
463            if (gw)
464            {
465                gw->grabFocusIfPointerInWindow();   
466            }
467        }
468    }
469   
470    // initialize the global timer to be relative to the current time.
471    osg::Timer::instance()->setStartTick();
472
473    // pass on the start tick to all the associated event queues
474    setStartTick(osg::Timer::instance()->getStartTick());
475
476    setUpThreading();
477   
478    if (osg::DisplaySettings::instance()->getCompileContextsHint())
479    {
480        int numProcessors = OpenThreads::GetNumberOfProcessors();
481        int processNum = 0;
482
483        for(unsigned int i=0; i<= osg::GraphicsContext::getMaxContextID(); ++i)
484        {
485            osg::GraphicsContext* gc = osg::GraphicsContext::getOrCreateCompileContext(i);
486
487            if (gc)
488            {
489                gc->createGraphicsThread();
490                gc->getGraphicsThread()->setProcessorAffinity(processNum % numProcessors);
491                gc->getGraphicsThread()->startThread();
492               
493                ++processNum;
494            }
495        }
496    }
497   
498}
499
500
501
502void Viewer::advance(double simulationTime)
503{
504    if (_done) return;
505
506    double prevousReferenceTime = _frameStamp->getReferenceTime();
507    int previousFrameNumber = _frameStamp->getFrameNumber();
508
509    _frameStamp->setFrameNumber(_frameStamp->getFrameNumber()+1);
510
511    _frameStamp->setReferenceTime( osg::Timer::instance()->delta_s(_startTick, osg::Timer::instance()->tick()) );
512
513    if (simulationTime==USE_REFERENCE_TIME)
514    {
515        _frameStamp->setSimulationTime(_frameStamp->getReferenceTime());
516    }
517    else
518    {
519        _frameStamp->setSimulationTime(simulationTime);
520    }
521   
522    if (getViewerStats() && getViewerStats()->collectStats("frame_rate"))
523    {
524        // update previous frame stats
525        double deltaFrameTime = _frameStamp->getReferenceTime() - prevousReferenceTime;
526        getViewerStats()->setAttribute(previousFrameNumber, "Frame duration", deltaFrameTime);
527        getViewerStats()->setAttribute(previousFrameNumber, "Frame rate", 1.0/deltaFrameTime);
528
529        // update current frames stats
530        getViewerStats()->setAttribute(_frameStamp->getFrameNumber(), "Reference time", _frameStamp->getReferenceTime());
531    }
532
533    if (osg::Referenced::getDeleteHandler())
534    {
535        osg::Referenced::getDeleteHandler()->flush();
536        osg::Referenced::getDeleteHandler()->setFrameNumber(_frameStamp->getFrameNumber());
537    }
538
539}
540
541void Viewer::eventTraversal()
542{
543    if (_done) return;
544
545    double beginEventTraversal = osg::Timer::instance()->delta_s(_startTick, osg::Timer::instance()->tick());
546
547    // osg::notify(osg::NOTICE)<<"Viewer::frameEventTraversal()."<<std::endl;
548   
549    // need to copy events from the GraphicsWindow's into local EventQueue;
550    osgGA::EventQueue::Events events;
551
552    Contexts contexts;
553    getContexts(contexts);
554
555    osgGA::GUIEventAdapter* eventState = getEventQueue()->getCurrentEventState();
556    osg::Matrix masterCameraVPW = getCamera()->getViewMatrix() * getCamera()->getProjectionMatrix();
557    if (getCamera()->getViewport())
558    {
559        osg::Viewport* viewport = getCamera()->getViewport();
560        masterCameraVPW *= viewport->computeWindowMatrix();
561        eventState->setInputRange( viewport->x(), viewport->y(), viewport->x() + viewport->width(), viewport->y() + viewport->height());
562    }
563    else
564    {
565        eventState->setInputRange(-1.0, -1.0, 1.0, 1.0);
566    }
567
568
569    for(Contexts::iterator citr = contexts.begin();
570        citr != contexts.end();
571        ++citr)
572    {
573        osgViewer::GraphicsWindow* gw = dynamic_cast<osgViewer::GraphicsWindow*>(*citr);
574        if (gw)
575        {
576            gw->checkEvents();
577           
578            osgGA::EventQueue::Events gw_events;
579            gw->getEventQueue()->takeEvents(gw_events);
580           
581            osgGA::EventQueue::Events::iterator itr;
582            for(itr = gw_events.begin();
583                itr != gw_events.end();
584                ++itr)
585            {
586                osgGA::GUIEventAdapter* event = itr->get();
587               
588                bool pointerEvent = false;
589
590                float x = event->getX();
591                float y = event->getY();
592               
593                bool invert_y = event->getMouseYOrientation()==osgGA::GUIEventAdapter::Y_INCREASING_DOWNWARDS;
594                if (invert_y && gw->getTraits()) y = gw->getTraits()->height - y;
595               
596                switch(event->getEventType())
597                {
598                    case(osgGA::GUIEventAdapter::PUSH):
599                    case(osgGA::GUIEventAdapter::RELEASE):
600                    case(osgGA::GUIEventAdapter::DRAG):
601                    case(osgGA::GUIEventAdapter::MOVE):
602                    {
603                        pointerEvent = true;
604                       
605                        if (event->getEventType()!=osgGA::GUIEventAdapter::DRAG || !getCameraWithFocus())
606                        {
607                            osg::GraphicsContext::Cameras& cameras = gw->getCameras();
608                            for(osg::GraphicsContext::Cameras::iterator citr = cameras.begin();
609                                citr != cameras.end();
610                                ++citr)
611                            {
612                                osg::Camera* camera = *citr;
613                                if (camera->getView()==this &&
614                                    camera->getAllowEventFocus() &&
615                                    camera->getRenderTargetImplementation()==osg::Camera::FRAME_BUFFER)
616                                {
617                                    osg::Viewport* viewport = camera ? camera->getViewport() : 0;
618                                    if (viewport &&
619                                        x >= viewport->x() && y >= viewport->y() &&
620                                        x <= (viewport->x()+viewport->width()) && y <= (viewport->y()+viewport->height()) )
621                                    {
622                                        // osg::notify(osg::NOTICE)<<"setCamera with focus "<<camera->getName()<<" x="<<x<<" y="<<y<<std::endl;
623                                        setCameraWithFocus(camera);
624                                    }
625                                }
626                            }
627                        }
628                       
629                        break;
630                    }
631                    default:
632                        break;
633                }
634               
635                if (pointerEvent)
636                {
637                    if (getCameraWithFocus())
638                    {
639                        osg::Viewport* viewport = getCameraWithFocus()->getViewport();
640                        osg::Matrix localCameraVPW = getCameraWithFocus()->getViewMatrix() * getCameraWithFocus()->getProjectionMatrix();
641                        if (viewport) localCameraVPW *= viewport->computeWindowMatrix();
642
643                        osg::Matrix matrix( osg::Matrix::inverse(localCameraVPW) * masterCameraVPW );
644
645                        osg::Vec3d new_coord = osg::Vec3d(x,y,0.0) * matrix;
646
647                        x = new_coord.x();
648                        y = new_coord.y();                               
649
650                        // osg::notify(osg::NOTICE)<<"pointer event new_coord.x()="<<new_coord.x()<<" new_coord.y()="<<new_coord.y()<<std::endl;
651
652                        event->setInputRange(eventState->getXmin(), eventState->getYmin(), eventState->getXmax(), eventState->getYmax());
653                        event->setX(x);
654                        event->setY(y);
655                        event->setMouseYOrientation(osgGA::GUIEventAdapter::Y_INCREASING_UPWARDS);
656
657                    }
658                    else
659                    {
660                        x = eventState->getXmin() + (x/double(gw->getTraits()->width))*(eventState->getXmax() - eventState->getXmin());
661                        y = eventState->getYmin() + (y/double(gw->getTraits()->height))*(eventState->getYmax() - eventState->getYmin());
662                        // osg::notify(osg::NOTICE)<<"new x = "<<x<<" new y = "<<y<<std::endl;
663
664                        event->setInputRange(eventState->getXmin(), eventState->getYmin(), eventState->getXmax(), eventState->getYmax());
665                        event->setX(x);
666                        event->setY(y);
667                        event->setMouseYOrientation(osgGA::GUIEventAdapter::Y_INCREASING_UPWARDS);
668                    }
669                   
670                    // pass along the new pointer events details to the eventState of the viewer
671                    eventState->setX(x);
672                    eventState->setY(y);
673                    eventState->setButtonMask(event->getButtonMask());
674                    eventState->setMouseYOrientation(osgGA::GUIEventAdapter::Y_INCREASING_UPWARDS);
675
676                }
677                else
678                {
679                    event->setInputRange(eventState->getXmin(), eventState->getYmin(), eventState->getXmax(), eventState->getYmax());
680                    event->setX(eventState->getX());
681                    event->setY(eventState->getY());
682                    event->setButtonMask(eventState->getButtonMask());
683                    event->setMouseYOrientation(eventState->getMouseYOrientation());
684                }
685                //osg::notify(osg::NOTICE)<<"   mouse x = "<<event->getX()<<" y="<<event->getY()<<std::endl;
686                // osg::notify(osg::NOTICE)<<"   mouse Xmin = "<<event->getXmin()<<" Ymin="<<event->getYmin()<<" xMax="<<event->getXmax()<<" Ymax="<<event->getYmax()<<std::endl;
687            }
688
689            for(itr = gw_events.begin();
690                itr != gw_events.end();
691                ++itr)
692            {
693                osgGA::GUIEventAdapter* event = itr->get();
694                switch(event->getEventType())
695                {
696                    case(osgGA::GUIEventAdapter::CLOSE_WINDOW):
697                    {
698                        bool wasThreading = areThreadsRunning();
699                        if (wasThreading) stopThreading();
700                       
701                        gw->close();
702                        _currentContext = NULL;
703                       
704                        if (wasThreading) startThreading();
705                       
706                        break;
707                    }
708                    default:
709                        break;
710                }
711            }
712
713            events.insert(events.end(), gw_events.begin(), gw_events.end());
714
715        }
716    }
717   
718
719    // osg::notify(osg::NOTICE)<<"mouseEventState Xmin = "<<eventState->getXmin()<<" Ymin="<<eventState->getYmin()<<" xMax="<<eventState->getXmax()<<" Ymax="<<eventState->getYmax()<<std::endl;
720
721
722    _eventQueue->frame( getFrameStamp()->getReferenceTime() );
723    _eventQueue->takeEvents(events);
724
725
726#if 0
727    // osg::notify(osg::NOTICE)<<"Events "<<events.size()<<std::endl;
728    for(osgGA::EventQueue::Events::iterator itr = events.begin();
729        itr != events.end();
730        ++itr)
731    {
732        osgGA::GUIEventAdapter* event = itr->get();
733        switch(event->getEventType())
734        {
735            case(osgGA::GUIEventAdapter::PUSH):
736                osg::notify(osg::NOTICE)<<"  PUSH "<<event->getButton()<<" x="<<event->getX()<<" y="<<event->getY()<<std::endl;
737                break;
738            case(osgGA::GUIEventAdapter::RELEASE):
739                osg::notify(osg::NOTICE)<<"  RELEASE "<<event->getButton()<<" x="<<event->getX()<<" y="<<event->getY()<<std::endl;
740                break;
741            case(osgGA::GUIEventAdapter::DRAG):
742                osg::notify(osg::NOTICE)<<"  DRAG "<<event->getButtonMask()<<" x="<<event->getX()<<" y="<<event->getY()<<std::endl;
743                break;
744            case(osgGA::GUIEventAdapter::MOVE):
745                osg::notify(osg::NOTICE)<<"  MOVE "<<event->getButtonMask()<<" x="<<event->getX()<<" y="<<event->getY()<<std::endl;
746                break;
747            case(osgGA::GUIEventAdapter::SCROLL):
748                osg::notify(osg::NOTICE)<<"  SCROLL "<<event->getScrollingMotion()<<std::endl;
749                break;
750            case(osgGA::GUIEventAdapter::KEYDOWN):
751                osg::notify(osg::NOTICE)<<"  KEYDOWN '"<<(char)event->getKey()<<"'"<<std::endl;
752                break;
753            case(osgGA::GUIEventAdapter::KEYUP):
754                osg::notify(osg::NOTICE)<<"  KEYUP '"<<(char)event->getKey()<<"'"<<std::endl;
755                break;
756            case(osgGA::GUIEventAdapter::RESIZE):
757                osg::notify(osg::NOTICE)<<"  RESIZE "<<event->getWindowX()<<"/"<<event->getWindowY()<<" x "<<event->getWindowWidth()<<"/"<<event->getWindowHeight() << std::endl;
758                break;
759            case(osgGA::GUIEventAdapter::QUIT_APPLICATION):
760                osg::notify(osg::NOTICE)<<"  QUIT_APPLICATION " << std::endl;
761                break;
762            case(osgGA::GUIEventAdapter::FRAME):
763                // osg::notify(osg::NOTICE)<<"  FRAME "<<std::endl;
764                break;
765            default:
766                // osg::notify(osg::NOTICE)<<"  Event not handled"<<std::endl;
767                break;
768        }
769    }
770#endif
771
772    // osg::notify(osg::NOTICE)<<"Events "<<events.size()<<std::endl;
773   
774    if ((_keyEventSetsDone!=0) || _quitEventSetsDone)
775    {
776        for(osgGA::EventQueue::Events::iterator itr = events.begin();
777            itr != events.end();
778            ++itr)
779        {
780            osgGA::GUIEventAdapter* event = itr->get();
781            switch(event->getEventType())
782            {
783                case(osgGA::GUIEventAdapter::KEYUP):
784                    if (_keyEventSetsDone && event->getKey()==_keyEventSetsDone) _done = true;
785                    break;
786               
787                case(osgGA::GUIEventAdapter::QUIT_APPLICATION):
788                    if (_quitEventSetsDone) _done = true;
789                    break;
790                   
791                default:
792                    break;
793            }
794        }
795    }
796       
797    if (_done) return;
798
799    if (_eventVisitor.valid() && getSceneData())
800    {
801        _eventVisitor->setFrameStamp(getFrameStamp());
802        _eventVisitor->setTraversalNumber(getFrameStamp()->getFrameNumber());
803
804        for(osgGA::EventQueue::Events::iterator itr = events.begin();
805            itr != events.end();
806            ++itr)
807        {
808            osgGA::GUIEventAdapter* event = itr->get();
809
810            _eventVisitor->reset();
811            _eventVisitor->addEvent( event );
812
813            getSceneData()->accept(*_eventVisitor);
814
815            // call any camera update callbacks, but only traverse that callback, don't traverse its subgraph
816            // leave that to the scene update traversal.
817            osg::NodeVisitor::TraversalMode tm = _eventVisitor->getTraversalMode();
818            _eventVisitor->setTraversalMode(osg::NodeVisitor::TRAVERSE_NONE);
819
820            if (_camera.valid() && _camera->getEventCallback()) _camera->accept(*_eventVisitor);
821
822            for(unsigned int i=0; i<getNumSlaves(); ++i)
823            {
824                osg::Camera* camera = getSlave(i)._camera.get();
825                if (camera && camera->getEventCallback()) camera->accept(*_eventVisitor);
826            }
827
828            _eventVisitor->setTraversalMode(tm);
829
830        }
831    }
832
833
834    for(osgGA::EventQueue::Events::iterator itr = events.begin();
835        itr != events.end();
836        ++itr)
837    {
838        osgGA::GUIEventAdapter* event = itr->get();
839
840        for(EventHandlers::iterator hitr = _eventHandlers.begin();
841            hitr != _eventHandlers.end();
842            ++hitr)
843        {
844            (*hitr)->handleWithCheckAgainstIgnoreHandledEventsMask( *event, *this, 0, 0);
845        }
846       
847    }
848
849    for(osgGA::EventQueue::Events::iterator itr = events.begin();
850        itr != events.end();
851        ++itr)
852    {
853        osgGA::GUIEventAdapter* event = itr->get();
854        if (_cameraManipulator.valid())
855        {
856            _cameraManipulator->handleWithCheckAgainstIgnoreHandledEventsMask( *event, *this);
857        }
858    }
859   
860    if (getViewerStats() && getViewerStats()->collectStats("event"))
861    {
862        double endEventTraversal = osg::Timer::instance()->delta_s(_startTick, osg::Timer::instance()->tick());
863
864        // update current frames stats
865        getViewerStats()->setAttribute(_frameStamp->getFrameNumber(), "Event traversal begin time", beginEventTraversal);
866        getViewerStats()->setAttribute(_frameStamp->getFrameNumber(), "Event traversal end time", endEventTraversal);
867        getViewerStats()->setAttribute(_frameStamp->getFrameNumber(), "Event traversal time taken", endEventTraversal-beginEventTraversal);
868    }
869
870}
871
872void Viewer::updateTraversal()
873{
874    if (_done) return;
875
876    double beginUpdateTraversal = osg::Timer::instance()->delta_s(_startTick, osg::Timer::instance()->tick());
877
878    _updateVisitor->reset();
879    _updateVisitor->setFrameStamp(getFrameStamp());
880    _updateVisitor->setTraversalNumber(getFrameStamp()->getFrameNumber());
881
882    if (getSceneData())
883    {
884        _updateVisitor->setImageRequestHandler(_scene->getImagePager());
885        getSceneData()->accept(*_updateVisitor);
886    }
887   
888    if (_scene->getDatabasePager())
889    {   
890        // synchronize changes required by the DatabasePager thread to the scene graph
891        _scene->getDatabasePager()->updateSceneGraph(*_frameStamp);
892    }
893
894    if (_scene->getImagePager())
895    {   
896        // synchronize changes required by the DatabasePager thread to the scene graph
897        _scene->getImagePager()->updateSceneGraph(*_frameStamp);
898    }
899
900    if (_updateOperations.valid())
901    {
902        _updateOperations->runOperations(this);
903    }
904   
905    if (_incrementalCompileOperation.valid())
906    {
907        // merge subgraphs that have been compiled by the incremental compiler operation.
908        _incrementalCompileOperation->mergeCompiledSubgraphs();
909    }
910
911
912    {
913        // call any camera update callbacks, but only traverse that callback, don't traverse its subgraph
914        // leave that to the scene update traversal.
915        osg::NodeVisitor::TraversalMode tm = _updateVisitor->getTraversalMode();
916        _updateVisitor->setTraversalMode(osg::NodeVisitor::TRAVERSE_NONE);
917
918        if (_camera.valid() && _camera->getUpdateCallback()) _camera->accept(*_updateVisitor);
919
920        for(unsigned int i=0; i<getNumSlaves(); ++i)
921        {
922            osg::Camera* camera = getSlave(i)._camera.get();
923            if (camera && camera->getUpdateCallback()) camera->accept(*_updateVisitor);
924        }
925
926        _updateVisitor->setTraversalMode(tm);
927    }
928
929    if (_cameraManipulator.valid())
930    {
931        setFusionDistance( getCameraManipulator()->getFusionDistanceMode(),
932                            getCameraManipulator()->getFusionDistanceValue() );
933
934        _camera->setViewMatrix(_cameraManipulator->getInverseMatrix());
935    }
936
937    updateSlaves();
938
939    if (getViewerStats() && getViewerStats()->collectStats("update"))
940    {
941        double endUpdateTraversal = osg::Timer::instance()->delta_s(_startTick, osg::Timer::instance()->tick());
942
943        // update current frames stats
944        getViewerStats()->setAttribute(_frameStamp->getFrameNumber(), "Update traversal begin time", beginUpdateTraversal);
945        getViewerStats()->setAttribute(_frameStamp->getFrameNumber(), "Update traversal end time", endUpdateTraversal);
946        getViewerStats()->setAttribute(_frameStamp->getFrameNumber(), "Update traversal time taken", endUpdateTraversal-beginUpdateTraversal);
947    }
948}
949
950void Viewer::getScenes(Scenes& scenes, bool onlyValid)
951{
952    scenes.push_back(_scene.get());
953}
954
955void Viewer::getViews(Views& views, bool onlyValid)
956{
957    views.push_back(this);
958}
959
960void Viewer::getAllThreads(Threads& threads, bool onlyActive)
961{
962    OperationThreads operationThreads;
963    getOperationThreads(operationThreads);
964   
965    for(OperationThreads::iterator itr = operationThreads.begin();
966        itr != operationThreads.end();
967        ++itr)
968    {
969        threads.push_back(*itr);
970    }
971   
972
973    if (_scene.valid())
974    {
975        osgDB::DatabasePager* dp = _scene->getDatabasePager();
976        if (dp)
977        {
978            for(unsigned int i=0; i<dp->getNumDatabaseThreads(); ++i)
979            {
980                osgDB::DatabasePager::DatabaseThread* dt = dp->getDatabaseThread(i);
981                if (!onlyActive || dt->isRunning())
982                {
983                    threads.push_back(dt);
984                }
985            }
986        }
987    }
988}
989
990
991void Viewer::getOperationThreads(OperationThreads& threads, bool onlyActive)
992{
993    threads.clear();
994   
995    Contexts contexts;
996    getContexts(contexts);
997    for(Contexts::iterator gcitr = contexts.begin();
998        gcitr != contexts.end();
999        ++gcitr)
1000    {
1001        osg::GraphicsContext* gc = *gcitr;
1002        if (gc->getGraphicsThread() &&
1003            (!onlyActive || gc->getGraphicsThread()->isRunning()) )
1004        {
1005            threads.push_back(gc->getGraphicsThread());
1006        }
1007    }
1008   
1009    Cameras cameras;
1010    getCameras(cameras);
1011    for(Cameras::iterator citr = cameras.begin();
1012        citr != cameras.end();
1013        ++citr)
1014    {
1015        osg::Camera* camera = *citr;
1016        if (camera->getCameraThread() &&
1017            (!onlyActive || camera->getCameraThread()->isRunning()) )
1018        {
1019            threads.push_back(camera->getCameraThread());
1020        }
1021    }
1022   
1023}
1024
1025void Viewer::getContexts(Contexts& contexts, bool onlyValid)
1026{
1027    typedef std::set<osg::GraphicsContext*> ContextSet;
1028    ContextSet contextSet;
1029
1030    contexts.clear();
1031
1032    if (_camera.valid() &&
1033        _camera->getGraphicsContext() &&
1034        (_camera->getGraphicsContext()->valid() || !onlyValid))
1035    {
1036        contextSet.insert(_camera->getGraphicsContext());
1037        contexts.push_back(_camera->getGraphicsContext());
1038    }
1039   
1040    for(unsigned int i=0; i<getNumSlaves(); ++i)
1041    {
1042        Slave& slave = getSlave(i);
1043        osg::GraphicsContext* sgc = slave._camera.valid() ? slave._camera->getGraphicsContext() : 0;
1044        if (sgc && (sgc->valid() || !onlyValid))
1045        {
1046            if (contextSet.count(sgc)==0)
1047            {
1048                contextSet.insert(sgc);
1049                contexts.push_back(sgc);
1050            }
1051        }
1052    }
1053}
1054
1055void Viewer::getCameras(Cameras& cameras, bool onlyActive)
1056{
1057    cameras.clear();
1058   
1059    if (_camera.valid() &&
1060        (!onlyActive || (_camera->getGraphicsContext() && _camera->getGraphicsContext()->valid())) ) cameras.push_back(_camera.get());
1061
1062    for(Slaves::iterator itr = _slaves.begin();
1063        itr != _slaves.end();
1064        ++itr)
1065    {
1066        if (itr->_camera.valid() &&
1067            (!onlyActive || (itr->_camera->getGraphicsContext() && itr->_camera->getGraphicsContext()->valid())) ) cameras.push_back(itr->_camera.get());
1068    }
1069}
1070
1071
1072double Viewer::elapsedTime()
1073{
1074    return osg::Timer::instance()->delta_s(_startTick, osg::Timer::instance()->tick());
1075}
1076
1077
1078void Viewer::getUsage(osg::ApplicationUsage& usage) const
1079{
1080    if (_cameraManipulator.valid())
1081    {
1082        _cameraManipulator->getUsage(usage);
1083    }
1084
1085    for(EventHandlers::const_iterator hitr = _eventHandlers.begin();
1086        hitr != _eventHandlers.end();
1087        ++hitr)
1088    {
1089        (*hitr)->getUsage(usage);
1090    }
1091}
Note: See TracBrowser for help on using the browser.