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();
|
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.
|
// do the normal frame.
|
||||||
|
|
||||||
|
@ -344,6 +344,7 @@ public:
|
|||||||
|
|
||||||
osg::Switch* getPresentationSwitch() { return _presentationSwitch.get(); }
|
osg::Switch* getPresentationSwitch() { return _presentationSwitch.get(); }
|
||||||
|
|
||||||
|
|
||||||
enum WhichPosition
|
enum WhichPosition
|
||||||
{
|
{
|
||||||
FIRST_POSITION = 0,
|
FIRST_POSITION = 0,
|
||||||
@ -405,6 +406,8 @@ public:
|
|||||||
|
|
||||||
double getReferenceTime() const { return _referenceTime; }
|
double getReferenceTime() const { return _referenceTime; }
|
||||||
|
|
||||||
|
virtual bool checkNeedToDoFrame();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
~SlideEventHandler() {}
|
~SlideEventHandler() {}
|
||||||
|
@ -224,7 +224,7 @@ class OSGVIEWER_EXPORT ViewerBase : public virtual osg::Object
|
|||||||
|
|
||||||
/** check to see if the new frame is required, called by run(..) when FrameScheme is set to ON_DEMAND.*/
|
/** check to see if the new frame is required, called by run(..) when FrameScheme is set to ON_DEMAND.*/
|
||||||
virtual bool checkNeedToDoFrame() = 0;
|
virtual bool checkNeedToDoFrame() = 0;
|
||||||
|
|
||||||
/** check to see if events have been received, return true if events are now available.*/
|
/** check to see if events have been received, return true if events are now available.*/
|
||||||
virtual bool checkEvents() = 0;
|
virtual bool checkEvents() = 0;
|
||||||
|
|
||||||
@ -277,7 +277,11 @@ class OSGVIEWER_EXPORT ViewerBase : public virtual osg::Object
|
|||||||
/** Get the keyboard and mouse usage of this viewer.*/
|
/** Get the keyboard and mouse usage of this viewer.*/
|
||||||
virtual void getUsage(osg::ApplicationUsage& usage) const = 0;
|
virtual void getUsage(osg::ApplicationUsage& usage) const = 0;
|
||||||
|
|
||||||
protected:
|
bool getRequestRedraw() const { return _requestRedraw; }
|
||||||
|
|
||||||
|
bool getRequestContinousUpdate() const { return _requestContinousUpdate; }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
void viewerBaseInit();
|
void viewerBaseInit();
|
||||||
|
|
||||||
@ -335,9 +339,9 @@ class OSGVIEWER_EXPORT ViewerBase : public virtual osg::Object
|
|||||||
osg::ref_ptr<osgUtil::IncrementalCompileOperation> _incrementalCompileOperation;
|
osg::ref_ptr<osgUtil::IncrementalCompileOperation> _incrementalCompileOperation;
|
||||||
|
|
||||||
osg::observer_ptr<osg::GraphicsContext> _currentContext;
|
osg::observer_ptr<osg::GraphicsContext> _currentContext;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
// Define private copy constructor
|
// Define private copy constructor
|
||||||
// otherwsie VS2015 will construct it's own which will call the private copy operator from osg::Object resulting in an compile error.
|
// otherwsie VS2015 will construct it's own which will call the private copy operator from osg::Object resulting in an compile error.
|
||||||
ViewerBase& operator = (const ViewerBase&) { return *this; }
|
ViewerBase& operator = (const ViewerBase&) { return *this; }
|
||||||
|
@ -1655,3 +1655,41 @@ void SlideEventHandler::setRequestReload(bool flag)
|
|||||||
_requestReload = 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