Added a local implementation of SlideEventHandler::checkNeedToDoFrame() so that Present3D can toggle on/off the need for continuous rendering to only slides that require it,
enabling slides with no animation to sit iddle rather keeping rendering, reducing CPU/GPU overhead and saving power.
This commit is contained in:
parent
1f5b7855eb
commit
68430ee8e5
@ -865,7 +865,7 @@ int main( int argc, char **argv )
|
||||
{
|
||||
osg::Timer_t startFrameTick = osg::Timer::instance()->tick();
|
||||
|
||||
if (viewer.getRunFrameScheme()!=osgViewer::ViewerBase::ON_DEMAND || viewer.checkNeedToDoFrame())
|
||||
if (viewer.getRunFrameScheme()!=osgViewer::ViewerBase::ON_DEMAND || seh->checkNeedToDoFrame())
|
||||
{
|
||||
// do the normal frame.
|
||||
|
||||
|
@ -344,6 +344,7 @@ public:
|
||||
|
||||
osg::Switch* getPresentationSwitch() { return _presentationSwitch.get(); }
|
||||
|
||||
|
||||
enum WhichPosition
|
||||
{
|
||||
FIRST_POSITION = 0,
|
||||
@ -405,6 +406,8 @@ public:
|
||||
|
||||
double getReferenceTime() const { return _referenceTime; }
|
||||
|
||||
virtual bool checkNeedToDoFrame();
|
||||
|
||||
protected:
|
||||
|
||||
~SlideEventHandler() {}
|
||||
|
@ -277,7 +277,11 @@ class OSGVIEWER_EXPORT ViewerBase : public virtual osg::Object
|
||||
/** Get the keyboard and mouse usage of this viewer.*/
|
||||
virtual void getUsage(osg::ApplicationUsage& usage) const = 0;
|
||||
|
||||
protected:
|
||||
bool getRequestRedraw() const { return _requestRedraw; }
|
||||
|
||||
bool getRequestContinousUpdate() const { return _requestContinousUpdate; }
|
||||
|
||||
protected:
|
||||
|
||||
void viewerBaseInit();
|
||||
|
||||
|
@ -1655,3 +1655,41 @@ void SlideEventHandler::setRequestReload(bool flag)
|
||||
_requestReload = flag;
|
||||
}
|
||||
|
||||
bool SlideEventHandler::checkNeedToDoFrame()
|
||||
{
|
||||
if (_viewer.valid())
|
||||
{
|
||||
if (_viewer->getRequestRedraw()) return true;
|
||||
if (_viewer->getRequestContinousUpdate()) return true;
|
||||
|
||||
// If the database pager is going to update the scene the render flag is
|
||||
// set so that the updates show up
|
||||
if(_viewer->getDatabasePager()->requiresUpdateSceneGraph() || _viewer->getDatabasePager()->getRequestsInProgress()) return true;
|
||||
|
||||
// if there update callbacks then we need to do frame.
|
||||
if (_viewer->getCamera()->getUpdateCallback()) return true;
|
||||
|
||||
if (!_pause)
|
||||
{
|
||||
if (_slideSwitch.valid() && _activeLayer<static_cast<int>(_slideSwitch->getNumChildren()))
|
||||
{
|
||||
if (_slideSwitch->getChild(_activeLayer)->getNumChildrenRequiringUpdateTraversal()>0) return true;
|
||||
}
|
||||
else if (_viewer->getSceneData()!=0 && _viewer->getSceneData()->getNumChildrenRequiringUpdateTraversal()>0) return true;
|
||||
}
|
||||
|
||||
// check if events are available and need processing
|
||||
if (_viewer->checkEvents()) return true;
|
||||
|
||||
// now check if any of the event handles have prompted a redraw.
|
||||
if (_viewer->getRequestRedraw()) return true;
|
||||
if (_viewer->getRequestContinousUpdate()) return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user