Added s/getContinousUpdate(bool) method to OverlayNode.

This commit is contained in:
Robert Osfield
2005-09-06 19:54:29 +00:00
parent 5283c11f8a
commit 4e6a8cfcd5
3 changed files with 103 additions and 73 deletions

View File

@@ -309,7 +309,10 @@ int main(int argc, char **argv)
osg::ref_ptr<osgSim::OverlayNode> overlayNode; osg::ref_ptr<osgSim::OverlayNode> overlayNode;
if (insertOverlayNode) if (insertOverlayNode)
{ {
overlayNode = new osgSim::OverlayNode; overlayNode = new osgSim::OverlayNode;
// insert the OverlayNode between the coordinate system node and its children.
for(unsigned int i=0; i<csn->getNumChildren(); ++i) for(unsigned int i=0; i<csn->getNumChildren(); ++i)
{ {
overlayNode->addChild( csn->getChild(i) ); overlayNode->addChild( csn->getChild(i) );
@@ -317,6 +320,10 @@ int main(int argc, char **argv)
csn->removeChild(0, csn->getNumChildren()); csn->removeChild(0, csn->getNumChildren());
csn->addChild(overlayNode.get()); csn->addChild(overlayNode.get());
// tell the overlay node to continously update its overlay texture
// as we know we'll be tracking a moving target.
overlayNode->setContinousUpdate(true);
} }

View File

@@ -44,9 +44,15 @@ class OSGSIM_EXPORT OverlayNode : public osg::Group
/** Get the const overlay subgraph which will be render to texture.*/ /** Get the const overlay subgraph which will be render to texture.*/
const osg::Node* getOverlaySubgraph() const { return _overlaySubgraph.get(); } const osg::Node* getOverlaySubgraph() const { return _overlaySubgraph.get(); }
/** Inform the OveralNode that the overlay texture needs to be updated.*/ /** Inform the OverlayNode that the overlay texture needs to be updated.*/
void dirtyOverlayTexture(); void dirtyOverlayTexture();
/** Set whether the OverlayNode should update the overlay texture on every frame.*/
void setContinousUpdate(bool update) { _continousUpdate = update; }
/** Get whether the OverlayNode should update the overlay texture on every frame.*/
bool getContinousUpdate() const { return _continousUpdate; }
/** Set the texture unit that the texture should be assigned to.*/ /** Set the texture unit that the texture should be assigned to.*/
void setOverlayTextureUnit(unsigned int unit); void setOverlayTextureUnit(unsigned int unit);
@@ -85,6 +91,8 @@ class OSGSIM_EXPORT OverlayNode : public osg::Group
unsigned int _textureSizeHint; unsigned int _textureSizeHint;
osg::ref_ptr<osg::Texture2D> _texture; osg::ref_ptr<osg::Texture2D> _texture;
bool _continousUpdate;
osg::BoundingSphere _overlaySubgraphBound;
}; };
} }

View File

@@ -21,7 +21,8 @@ using namespace osgSim;
OverlayNode::OverlayNode(): OverlayNode::OverlayNode():
_textureUnit(1), _textureUnit(1),
_textureSizeHint(1024) _textureSizeHint(1024),
_continousUpdate(false)
{ {
init(); init();
} }
@@ -30,7 +31,8 @@ OverlayNode::OverlayNode(const OverlayNode& copy, const osg::CopyOp& copyop):
Group(copy,copyop), Group(copy,copyop),
_overlaySubgraph(copy._overlaySubgraph), _overlaySubgraph(copy._overlaySubgraph),
_textureUnit(copy._textureUnit), _textureUnit(copy._textureUnit),
_textureSizeHint(copy._textureSizeHint) _textureSizeHint(copy._textureSizeHint),
_continousUpdate(copy._continousUpdate)
{ {
init(); init();
} }
@@ -102,7 +104,7 @@ void OverlayNode::traverse(osg::NodeVisitor& nv)
unsigned int contextID = cv->getState()!=0 ? cv->getState()->getContextID() : 0; unsigned int contextID = cv->getState()!=0 ? cv->getState()->getContextID() : 0;
// if we need to redraw then do cull traversal on camera. // if we need to redraw then do cull traversal on camera.
if (!_textureObjectValidList[contextID]) if (!_textureObjectValidList[contextID] || _continousUpdate)
{ {
// now compute the camera's view and projection matrix to point at the shadower (the camera's children) // now compute the camera's view and projection matrix to point at the shadower (the camera's children)
@@ -112,12 +114,11 @@ void OverlayNode::traverse(osg::NodeVisitor& nv)
bs.expandBy(_camera->getChild(i)->getBound()); bs.expandBy(_camera->getChild(i)->getBound());
} }
if (!bs.valid()) if (bs.valid())
{ {
osg::notify(osg::WARN) << "OverlayNode::traverse() - bb invalid"<<_camera.get()<<std::endl; // update the bounding volume for later testing
return; // whether the overlay can be seen or not.
} _overlaySubgraphBound = bs;
// see if we are within a coordinate system node. // see if we are within a coordinate system node.
osg::CoordinateSystemNode* csn = 0; osg::CoordinateSystemNode* csn = 0;
@@ -183,9 +184,23 @@ void OverlayNode::traverse(osg::NodeVisitor& nv)
_textureObjectValidList[contextID] = 1; _textureObjectValidList[contextID] = 1;
} }
}
// now set up the drawing of the main scene. // now set up the drawing of the main scene.
#if 0
// Disable for time being as _overlaySubgraphBound isn't accurate for
// detecting whether the overaly texture will sit over affect the rendering
// of the children of the OverlayNode. Frustrum intersection may prove more
// fruitful.
// note needs to use bound when captured not current bound.
if (!_overlaySubgraphBound.valid() || cv->isCulled(_overlaySubgraphBound))
{
Group::traverse(nv);
}
else
#endif
{ {
_texgenNode->accept(*cv); _texgenNode->accept(*cv);