Changeset 10098
- Timestamp:
- 04/24/09 18:20:50 (4 years ago)
- Location:
- OpenSceneGraph/trunk
- Files:
-
- 10 modified
-
include/osgViewer/CompositeViewer (modified) (3 diffs)
-
include/osgViewer/View (modified) (1 diff)
-
include/osgViewer/Viewer (modified) (4 diffs)
-
include/osgViewer/ViewerBase (modified) (5 diffs)
-
src/osgViewer/CompositeViewer.cpp (modified) (3 diffs)
-
src/osgViewer/StatsHandler.cpp (modified) (1 diff)
-
src/osgViewer/View.cpp (modified) (1 diff)
-
src/osgViewer/Viewer.cpp (modified) (5 diffs)
-
src/osgViewer/ViewerBase.cpp (modified) (5 diffs)
-
src/osgViewer/ViewerEventHandlers.cpp (modified) (8 diffs)
Legend:
- Unmodified
- Added
- Removed
-
OpenSceneGraph/trunk/include/osgViewer/CompositeViewer
r9554 r10098 74 74 75 75 virtual double elapsedTime(); 76 76 77 77 virtual osg::FrameStamp* getViewerFrameStamp() { return getFrameStamp(); } 78 78 79 79 80 80 /** Execute a main frame loop. … … 85 85 virtual int run(); 86 86 87 /** check to see if the new frame is required, called by run(..) when FrameScheme is set to ON_DEMAND.*/ 88 virtual bool checkNeedToDoFrame(); 89 87 90 virtual void advance(double simulationTime=USE_REFERENCE_TIME); 88 91 … … 90 93 91 94 virtual void updateTraversal(); 92 93 95 96 94 97 void setCameraWithFocus(osg::Camera* camera); 95 98 osg::Camera* getCameraWithFocus() { return _cameraWithFocus.get(); } 96 99 const osg::Camera* getCameraWithFocus() const { return _cameraWithFocus.get(); } 97 100 98 101 osgViewer::View* getViewWithFocus() { return _viewWithFocus.get(); } 99 102 const osgViewer::View* getViewWithFocus() const { return _viewWithFocus.get(); } -
OpenSceneGraph/trunk/include/osgViewer/View
r9909 r10098 234 234 osgUtil::SceneView::FusionDistanceMode _fusionDistanceMode; 235 235 float _fusionDistanceValue; 236 236 237 }; 237 238 -
OpenSceneGraph/trunk/include/osgViewer/Viewer
r9554 r10098 36 36 37 37 virtual ~Viewer(); 38 38 39 39 META_Object(osgViewer,Viewer); 40 40 … … 75 75 76 76 virtual double elapsedTime(); 77 77 78 78 virtual osg::FrameStamp* getViewerFrameStamp() { return getFrameStamp(); } 79 80 79 81 80 /** Execute a main frame loop. … … 86 85 virtual int run(); 87 86 87 /** check to see if the new frame is required, called by run(..) when FrameScheme is set to ON_DEMAND.*/ 88 virtual bool checkNeedToDoFrame(); 89 88 90 virtual void advance(double simulationTime=USE_REFERENCE_TIME); 89 91 … … 91 93 92 94 virtual void updateTraversal(); 93 95 94 96 void setCameraWithFocus(osg::Camera* camera) { _cameraWithFocus = camera; } 95 97 osg::Camera* getCameraWithFocus() { return _cameraWithFocus.get(); } 96 98 const osg::Camera* getCameraWithFocus() const { return _cameraWithFocus.get(); } 97 99 98 100 virtual void getCameras(Cameras& cameras, bool onlyActive=true); 99 101 100 102 virtual void getContexts(Contexts& contexts, bool onlyValid=true); 101 103 -
OpenSceneGraph/trunk/include/osgViewer/ViewerBase
r9917 r10098 200 200 void checkWindowStatus(); 201 201 202 202 enum FrameScheme 203 { 204 ON_DEMAND, 205 CONTINUOUS 206 }; 207 208 void setRunFrameScheme(FrameScheme fs) { _runFrameScheme = fs; } 209 FrameScheme getRunFrameScheme() const { return _runFrameScheme; } 210 211 void setRunMaxFrameRate(double frameRate) { _runMaxFrameRate = frameRate; } 212 double getRunMaxFrameRate() const { return _runMaxFrameRate; } 203 213 204 214 /** Execute a main frame loop. … … 207 217 * and installs trackball manipulator if one is not already assigned. 208 218 */ 209 virtual int run() = 0; 219 virtual int run(); 220 221 /** check to see if the new frame is required, called by run(..) when FrameScheme is set to ON_DEMAND.*/ 222 virtual bool checkNeedToDoFrame() = 0; 210 223 211 224 /** Render a complete new frame. … … 250 263 251 264 protected: 252 265 266 void viewerBaseInit(); 267 268 friend class osgViewer::View; 269 253 270 inline void makeCurrent(osg::GraphicsContext* gc) 254 271 { 255 272 if (_currentContext==gc) return; 256 273 257 274 releaseContext(); 258 275 259 276 if (gc && gc->valid() && gc->makeCurrent()) _currentContext = gc; 260 277 } 261 278 262 279 inline void releaseContext() 263 280 { … … 276 293 bool _quitEventSetsDone; 277 294 bool _releaseContextAtEndOfFrameHint; 278 295 279 296 ThreadingModel _threadingModel; 280 297 bool _threadsRunning; 298 299 bool _requestRedraw; 300 bool _requestContinousUpdate; 301 302 FrameScheme _runFrameScheme; 303 double _runMaxFrameRate; 304 281 305 282 306 BarrierPosition _endBarrierPosition; … … 285 309 osg::ref_ptr<osg::BarrierOperation> _endRenderingDispatchBarrier; 286 310 osg::ref_ptr<osg::EndOfDynamicDrawBlock> _endDynamicDrawBlock; 287 311 288 312 osg::ref_ptr<osgGA::EventVisitor> _eventVisitor; 289 313 290 314 osg::ref_ptr<osg::OperationQueue> _updateOperations; 291 315 osg::ref_ptr<osgUtil::UpdateVisitor> _updateVisitor; 292 316 293 317 osg::ref_ptr<osg::Operation> _realizeOperation; 294 318 osg::ref_ptr<osgUtil::IncrementalCompileOperation> _incrementalCompileOperation; -
OpenSceneGraph/trunk/src/osgViewer/CompositeViewer.cpp
r9997 r10098 38 38 { 39 39 constructorInit(); 40 40 41 arguments.getApplicationUsage()->addCommandLineOption("--SingleThreaded","Select SingleThreaded threading model for viewer."); 42 arguments.getApplicationUsage()->addCommandLineOption("--CullDrawThreadPerContext","Select CullDrawThreadPerContext threading model for viewer."); 43 arguments.getApplicationUsage()->addCommandLineOption("--DrawThreadPerContext","Select DrawThreadPerContext threading model for viewer."); 44 arguments.getApplicationUsage()->addCommandLineOption("--CullThreadPerCameraDrawThreadPerContext","Select CullThreadPerCameraDrawThreadPerContext threading model for viewer."); 45 46 arguments.getApplicationUsage()->addCommandLineOption("--run-on-demand","Set the run methods frame rate management to only rendering frames when required."); 47 arguments.getApplicationUsage()->addCommandLineOption("--run-continuous","Set the run methods frame rate management to rendering frames continuously."); 48 arguments.getApplicationUsage()->addCommandLineOption("--run-max-frame-rate","Set the run methods maximum permissable frame rate, 0.0 is default and switching off frame rate capping."); 49 50 41 51 std::string filename; 42 52 bool readConfig = false; … … 51 61 while (arguments.read("--CullThreadPerCameraDrawThreadPerContext")) setThreadingModel(CullThreadPerCameraDrawThreadPerContext); 52 62 63 64 while(arguments.read("--run-on-demand")) { setRunFrameScheme(ON_DEMAND); } 65 while(arguments.read("--run-continuous")) { setRunFrameScheme(CONTINUOUS); } 66 67 double runMaxFrameRate; 68 while(arguments.read("--run-max-frame-rate", runMaxFrameRate)) { setRunMaxFrameRate(runMaxFrameRate); } 69 70 53 71 osg::DisplaySettings::instance()->readCommandLine(arguments); 54 72 osgDB::readCommandLine(arguments); … … 221 239 222 240 return numRealizedWindows > 0; 241 } 242 243 bool CompositeViewer::checkNeedToDoFrame() 244 { 245 if (_requestRedraw) return true; 246 if (_requestContinousUpdate) return true; 247 248 for(RefViews::iterator itr = _views.begin(); 249 itr != _views.end(); 250 ++itr) 251 { 252 osgViewer::View* view = itr->get(); 253 if (view) 254 { 255 // If the database pager is going to update the scene the render flag is 256 // set so that the updates show up 257 if (view->getDatabasePager()->requiresUpdateSceneGraph() || 258 view->getDatabasePager()->getRequestsInProgress()) return true; 259 } 260 } 261 262 // now do a eventTraversal to see if any events might require a new frame. 263 eventTraversal(); 264 265 if (_requestRedraw) return true; 266 if (_requestContinousUpdate) return true; 267 268 return false; 223 269 } 224 270 -
OpenSceneGraph/trunk/src/osgViewer/StatsHandler.cpp
r9624 r10098 184 184 } 185 185 186 186 aa.requestRedraw(); 187 187 } 188 188 return true; -
OpenSceneGraph/trunk/src/osgViewer/View.cpp
r9909 r10098 1697 1697 void View::requestRedraw() 1698 1698 { 1699 } 1700 1701 void View::requestContinuousUpdate(bool) 1702 { 1699 getViewerBase()->_requestRedraw = true; 1700 } 1701 1702 void View::requestContinuousUpdate(bool flag) 1703 { 1704 getViewerBase()->_requestContinousUpdate = flag; 1703 1705 } 1704 1706 -
OpenSceneGraph/trunk/src/osgViewer/Viewer.cpp
r9868 r10098 54 54 arguments.getApplicationUsage()->addCommandLineOption("--screen <num>","Set the screen to use when multiple screens are present."); 55 55 arguments.getApplicationUsage()->addCommandLineOption("--window <x y w h>","Set the position (x,y) and size (w,h) of the viewer window."); 56 57 arguments.getApplicationUsage()->addCommandLineOption("--run-on-demand","Set the run methods frame rate management to only rendering frames when required."); 58 arguments.getApplicationUsage()->addCommandLineOption("--run-continuous","Set the run methods frame rate management to rendering frames continuously."); 59 arguments.getApplicationUsage()->addCommandLineOption("--run-max-frame-rate","Set the run methods maximum permissable frame rate, 0.0 is default and switching off frame rate capping."); 60 56 61 // FIXME: Uncomment these lines when the options have been documented properly 57 62 //arguments.getApplicationUsage()->addCommandLineOption("--3d-sd",""); … … 85 90 else osg::notify(osg::WARN)<<"Invalid clear color \""<<colorStr<<"\""<<std::endl; 86 91 } 87 92 93 94 while(arguments.read("--run-on-demand")) { setRunFrameScheme(ON_DEMAND); } 95 while(arguments.read("--run-continuous")) { setRunFrameScheme(CONTINUOUS); } 96 97 double runMaxFrameRate; 98 while(arguments.read("--run-max-frame-rate", runMaxFrameRate)) { setRunMaxFrameRate(runMaxFrameRate); } 99 100 88 101 int screenNum = -1; 89 102 while (arguments.read("--screen",screenNum)) {} 90 103 91 104 int x = -1, y = -1, width = -1, height = -1; 92 105 while (arguments.read("--window",x,y,width,height)) {} 93 106 94 107 bool ss3d = false; 95 108 bool wowvx20 = false; … … 310 323 } 311 324 325 bool Viewer::checkNeedToDoFrame() 326 { 327 if (_requestRedraw) return true; 328 if (_requestContinousUpdate) return true; 329 330 // If the database pager is going to update the scene the render flag is 331 // set so that the updates show up 332 if(getDatabasePager()->requiresUpdateSceneGraph() || getDatabasePager()->getRequestsInProgress()) return true; 333 334 // now do a eventTraversal to see if any events might require a new frame. 335 eventTraversal(); 336 337 if (_requestRedraw) return true; 338 if (_requestContinousUpdate) return true; 339 340 return false; 341 } 342 312 343 int Viewer::run() 313 344 { … … 316 347 setCameraManipulator(new osgGA::TrackballManipulator()); 317 348 } 318 349 319 350 setReleaseContextAtEndOfFrameHint(false); 320 351 321 352 return ViewerBase::run(); 322 353 } … … 325 356 { 326 357 View::setStartTick(tick); 327 358 328 359 Contexts contexts; 329 360 getContexts(contexts,false); -
OpenSceneGraph/trunk/src/osgViewer/ViewerBase.cpp
r9886 r10098 34 34 static osg::ApplicationUsageProxy ViewerBase_e2(osg::ApplicationUsage::ENVIRONMENTAL_VARIABLE,"OSG_SCREEN <value>","Set the default screen that windows should open up on."); 35 35 static osg::ApplicationUsageProxy ViewerBase_e3(osg::ApplicationUsage::ENVIRONMENTAL_VARIABLE,"OSG_WINDOW x y width height","Set the default window dimensions that windows should open up on."); 36 36 static osg::ApplicationUsageProxy ViewerBase_e4(osg::ApplicationUsage::ENVIRONMENTAL_VARIABLE,"OSG_RUN_FRAME_SCHEME","Frame rate manage scheme that viewer run should use, ON_DEMAND or CONTINUOUS (default)."); 37 static osg::ApplicationUsageProxy ViewerBase_e5(osg::ApplicationUsage::ENVIRONMENTAL_VARIABLE,"OSG_RUN_MAX_FRAME_RATE","Set the maximum number of frame as second that viewer run. 0.0 is default and disables an frame rate capping."); 37 38 38 39 using namespace osgViewer; … … 40 41 ViewerBase::ViewerBase(): 41 42 osg::Object(true) 43 { 44 viewerBaseInit(); 45 } 46 47 ViewerBase::ViewerBase(const ViewerBase& base): 48 osg::Object(true) 49 { 50 viewerBaseInit(); 51 } 52 53 void ViewerBase::viewerBaseInit() 42 54 { 43 55 _firstFrame = true; … … 49 61 _threadsRunning = false; 50 62 _endBarrierPosition = AfterSwapBuffers; 51 } 52 53 ViewerBase::ViewerBase(const ViewerBase& base): 54 osg::Object(true) 55 { 56 _firstFrame = true; 57 _done = false; 58 _keyEventSetsDone = osgGA::GUIEventAdapter::KEY_Escape; 59 _quitEventSetsDone = true; 60 _releaseContextAtEndOfFrameHint = true; 61 _threadingModel = AutomaticSelection; 62 _threadsRunning = false; 63 _endBarrierPosition = AfterSwapBuffers; 63 _requestRedraw = true; 64 _requestContinousUpdate = false; 65 66 _runFrameScheme = CONTINUOUS; 67 _runMaxFrameRate = 0.0f; 68 69 const char* str = getenv("OSG_RUN_FRAME_SCHEME"); 70 if (str) 71 { 72 if (strcmp(str, "ON_DEMAND")==0) _runFrameScheme = ON_DEMAND; 73 else if (strcmp(str, "CONTINUOUS")==0) _runFrameScheme = CONTINUOUS; 74 } 75 76 str = getenv("OSG_RUN_MAX_FRAME_RATE"); 77 if (str) 78 { 79 _runMaxFrameRate = atof(str); 80 } 64 81 } 65 82 … … 574 591 } 575 592 576 #if 0577 while (!done())578 {579 frame();580 }581 #else582 583 593 const char* str = getenv("OSG_RUN_FRAME_COUNT"); 584 if (str) 585 { 586 int runTillFrameNumber = atoi(str); 587 while (!done() && getViewerFrameStamp()->getFrameNumber()<runTillFrameNumber) 594 int runTillFrameNumber = str==0 ? -1 : atoi(str); 595 596 while(!done() || (runTillFrameNumber>=0 && getViewerFrameStamp()->getFrameNumber()>runTillFrameNumber)) 597 { 598 double minFrameTime = _runMaxFrameRate>0.0 ? 1.0/_runMaxFrameRate : 0.0; 599 osg::Timer_t startFrameTick = osg::Timer::instance()->tick(); 600 if (_runFrameScheme==ON_DEMAND) 601 { 602 if (checkNeedToDoFrame()) frame(); 603 } 604 else 588 605 { 589 606 frame(); 590 607 } 591 } 592 else 593 { 594 while (!done()) 595 { 596 frame(); 597 } 598 } 599 #endif 608 609 // work out if we need to force a sleep to hold back the frame rate 610 osg::Timer_t endFrameTick = osg::Timer::instance()->tick(); 611 double frameTime = osg::Timer::instance()->delta_s(startFrameTick, endFrameTick); 612 if (frameTime < minFrameTime) OpenThreads::Thread::microSleep(1000000.0*(minFrameTime-frameTime)); 613 } 614 600 615 return 0; 601 616 } … … 843 858 getViewerStats()->setAttribute(frameStamp->getFrameNumber(), "Rendering traversals time taken", endRenderingTraversals-beginRenderingTraversals); 844 859 } 845 } 846 860 861 _requestRedraw = false; 862 } 863 -
OpenSceneGraph/trunk/src/osgViewer/ViewerEventHandlers.cpp
r9340 r10098 101 101 toggleFullscreen(*itr); 102 102 } 103 104 aa.requestRedraw(); 103 105 return true; 104 106 } … … 115 117 changeWindowedResolution(*itr, true); 116 118 } 119 120 aa.requestRedraw(); 117 121 return true; 118 122 } … … 129 133 changeWindowedResolution(*itr, false); 130 134 } 135 136 aa.requestRedraw(); 131 137 return true; 132 138 } … … 318 324 if (_changeThreadingModel == true && ea.getKey() == _keyEventChangeThreadingModel && delta > 1.0) 319 325 { 326 320 327 _tickOrLastKeyPress = osg::Timer::instance()->tick(); 321 328 … … 349 356 break; 350 357 } 358 359 aa.requestRedraw(); 351 360 return true; 352 361 } … … 364 373 break; 365 374 } 375 376 aa.requestRedraw(); 366 377 return true; 367 378 } … … 576 587 camera->setLODScale(camera->getLODScale()*1.1); 577 588 osg::notify(osg::NOTICE)<<"LODScale = "<<camera->getLODScale()<<std::endl; 589 590 aa.requestRedraw(); 578 591 return true; 579 592 } … … 583 596 camera->setLODScale(camera->getLODScale()/1.1); 584 597 osg::notify(osg::NOTICE)<<"LODScale = "<<camera->getLODScale()<<std::endl; 585 return true; 586 } 598 599 aa.requestRedraw(); 600 return true; 601 } 587 602 588 603 break;
