Ensure canvas is updated before displaying image containing a canvas

This commit is contained in:
Thomas Geymayer 2013-03-11 21:22:43 +01:00
parent cd58df820e
commit 0a1e920659
2 changed files with 40 additions and 3 deletions

View File

@ -47,9 +47,11 @@ namespace canvas
{
public:
CullCallback(const CanvasWeakPtr& canvas);
void cullNextFrame();
private:
CanvasWeakPtr _canvas;
mutable bool _cull_next_frame;
virtual bool cull( osg::NodeVisitor* nv,
osg::Drawable* drawable,
@ -58,11 +60,18 @@ namespace canvas
//----------------------------------------------------------------------------
CullCallback::CullCallback(const CanvasWeakPtr& canvas):
_canvas( canvas )
_canvas( canvas ),
_cull_next_frame( false )
{
}
//----------------------------------------------------------------------------
void CullCallback::cullNextFrame()
{
_cull_next_frame = true;
}
//----------------------------------------------------------------------------
bool CullCallback::cull( osg::NodeVisitor* nv,
osg::Drawable* drawable,
@ -71,8 +80,12 @@ namespace canvas
if( !_canvas.expired() )
_canvas.lock()->enableRendering();
if( !_cull_next_frame )
// TODO check if window/image should be culled
return false;
_cull_next_frame = false;
return true;
}
//----------------------------------------------------------------------------
@ -288,6 +301,29 @@ namespace canvas
}
}
//----------------------------------------------------------------------------
void Image::valueChanged(SGPropertyNode* child)
{
// If the image is switched from invisible to visible, and it shows a
// canvas, we need to delay showing it by one frame to ensure the canvas is
// updated before the image is displayed.
//
// As canvas::Element handles and filters changes to the "visible" property
// we can not check this in Image::childChanged but instead have to override
// Element::valueChanged.
if( !isVisible()
&& child->getParent() == _node
&& child->getNameString() == "visible"
&& child->getBoolValue() )
{
CullCallback* cb = static_cast<CullCallback*>(_geom->getCullCallback());
if( cb )
cb->cullNextFrame();
}
Element::valueChanged(child);
}
//----------------------------------------------------------------------------
void Image::setSrcCanvas(CanvasPtr canvas)
{

View File

@ -48,6 +48,7 @@ namespace canvas
virtual ~Image();
virtual void update(double dt);
virtual void valueChanged(SGPropertyNode* child);
void setSrcCanvas(CanvasPtr canvas);
CanvasWeakPtr getSrcCanvas() const;