Ensure canvas is updated before displaying image containing a canvas
This commit is contained in:
parent
cd58df820e
commit
0a1e920659
@ -47,9 +47,11 @@ namespace canvas
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
CullCallback(const CanvasWeakPtr& canvas);
|
CullCallback(const CanvasWeakPtr& canvas);
|
||||||
|
void cullNextFrame();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
CanvasWeakPtr _canvas;
|
CanvasWeakPtr _canvas;
|
||||||
|
mutable bool _cull_next_frame;
|
||||||
|
|
||||||
virtual bool cull( osg::NodeVisitor* nv,
|
virtual bool cull( osg::NodeVisitor* nv,
|
||||||
osg::Drawable* drawable,
|
osg::Drawable* drawable,
|
||||||
@ -58,11 +60,18 @@ namespace canvas
|
|||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
CullCallback::CullCallback(const CanvasWeakPtr& 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,
|
bool CullCallback::cull( osg::NodeVisitor* nv,
|
||||||
osg::Drawable* drawable,
|
osg::Drawable* drawable,
|
||||||
@ -71,8 +80,12 @@ namespace canvas
|
|||||||
if( !_canvas.expired() )
|
if( !_canvas.expired() )
|
||||||
_canvas.lock()->enableRendering();
|
_canvas.lock()->enableRendering();
|
||||||
|
|
||||||
|
if( !_cull_next_frame )
|
||||||
// TODO check if window/image should be culled
|
// TODO check if window/image should be culled
|
||||||
return false;
|
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)
|
void Image::setSrcCanvas(CanvasPtr canvas)
|
||||||
{
|
{
|
||||||
|
@ -48,6 +48,7 @@ namespace canvas
|
|||||||
virtual ~Image();
|
virtual ~Image();
|
||||||
|
|
||||||
virtual void update(double dt);
|
virtual void update(double dt);
|
||||||
|
virtual void valueChanged(SGPropertyNode* child);
|
||||||
|
|
||||||
void setSrcCanvas(CanvasPtr canvas);
|
void setSrcCanvas(CanvasPtr canvas);
|
||||||
CanvasWeakPtr getSrcCanvas() const;
|
CanvasWeakPtr getSrcCanvas() const;
|
||||||
|
Loading…
Reference in New Issue
Block a user