Set up new view dependent overlay technique control methods

This commit is contained in:
Robert Osfield
2007-05-14 20:23:10 +00:00
parent 55bd6129f4
commit e41cd46da8
3 changed files with 110 additions and 12 deletions

View File

@@ -250,6 +250,12 @@ int main(int argc, char **argv)
return 1;
}
}
osgSim::OverlayNode::OverlayTechnique technique = osgSim::OverlayNode::OBJECT_DEPENDENT_WITH_ORTHOGRAPHIC_OVERLAY;
while (arguments.read("--object")) technique = osgSim::OverlayNode::OBJECT_DEPENDENT_WITH_ORTHOGRAPHIC_OVERLAY;
while (arguments.read("--ortho") || arguments.read("--orthographic")) technique = osgSim::OverlayNode::VIEW_DEPENDENT_WITH_ORTHOGRAPHIC_OVERLAY;
while (arguments.read("--persp") || arguments.read("--perspective")) technique = osgSim::OverlayNode::VIEW_DEPENDENT_WITH_PERSPECTIVE_OVERLAY;
// if user request help write it out to cout.
if (arguments.read("-h") || arguments.read("--help"))
@@ -287,7 +293,7 @@ int main(int argc, char **argv)
if (insertOverlayNode)
{
overlayNode = new osgSim::OverlayNode;
overlayNode = new osgSim::OverlayNode(technique);
// insert the OverlayNode between the coordinate system node and its children.
for(unsigned int i=0; i<csn->getNumChildren(); ++i)

View File

@@ -28,7 +28,15 @@ namespace osgSim {
class OSGSIM_EXPORT OverlayNode : public osg::Group
{
public :
OverlayNode();
enum OverlayTechnique
{
OBJECT_DEPENDENT_WITH_ORTHOGRAPHIC_OVERLAY,
VIEW_DEPENDENT_WITH_ORTHOGRAPHIC_OVERLAY,
VIEW_DEPENDENT_WITH_PERSPECTIVE_OVERLAY,
};
OverlayNode(OverlayTechnique technique=OBJECT_DEPENDENT_WITH_ORTHOGRAPHIC_OVERLAY);
OverlayNode(const OverlayNode& es, const osg::CopyOp& copyop=osg::CopyOp::SHALLOW_COPY);
@@ -36,6 +44,11 @@ class OSGSIM_EXPORT OverlayNode : public osg::Group
virtual void traverse(osg::NodeVisitor& nv);
void setOverlayTechnique(OverlayTechnique technique);
OverlayTechnique getOverlayTechnique() { return _overlayTechnique; }
/** Set the overlay subgraph which will be rendered to texture.*/
void setOverlaySubgraph(osg::Node* node);
@@ -60,7 +73,7 @@ class OSGSIM_EXPORT OverlayNode : public osg::Group
void setOverlayClearColor(const osg::Vec4& color);
/** Get the clear color to use when rendering the overlay subgraph.*/
const osg::Vec4& getOverlayClearColor() const;
osg::Vec4 getOverlayClearColor() const;
/** Set the TexEnv mode used to combine the overlay texture with the base color/texture of the OverlayNode's decorate subgraph.*/
void setTexEnvMode(GLenum mode);
@@ -103,13 +116,23 @@ class OSGSIM_EXPORT OverlayNode : public osg::Group
virtual ~OverlayNode() {}
void init();
void init_OBJECT_DEPENDENT_WITH_ORTHOGRAPHIC_OVERLAY();
void init_VIEW_DEPENDENT_WITH_ORTHOGRAPHIC_OVERLAY();
void init_VIEW_DEPENDENT_WITH_PERSPECTIVE_OVERLAY();
void traverse_OBJECT_DEPENDENT_WITH_ORTHOGRAPHIC_OVERLAY(osg::NodeVisitor& nv);
void traverse_VIEW_DEPENDENT_WITH_ORTHOGRAPHIC_OVERLAY(osg::NodeVisitor& nv);
void traverse_VIEW_DEPENDENT_WITH_PERSPECTIVE_OVERLAY(osg::NodeVisitor& nv);
void updateMainSubgraphStateSet();
typedef osg::buffered_value< int > TextureObjectValidList;
mutable TextureObjectValidList _textureObjectValidList;
OverlayTechnique _overlayTechnique;
osg::ref_ptr<osg::Camera> _camera;
// overlay subgraph is render to a texture

View File

@@ -22,7 +22,8 @@
using namespace osgSim;
using namespace osg;
OverlayNode::OverlayNode():
OverlayNode::OverlayNode(OverlayTechnique technique):
_overlayTechnique(technique),
_texEnvMode(GL_DECAL),
_textureUnit(1),
_textureSizeHint(1024),
@@ -35,6 +36,7 @@ OverlayNode::OverlayNode():
OverlayNode::OverlayNode(const OverlayNode& copy, const osg::CopyOp& copyop):
osg::Group(copy,copyop),
_overlayTechnique(copy._overlayTechnique),
_overlaySubgraph(copy._overlaySubgraph),
_texEnvMode(copy._texEnvMode),
_textureUnit(copy._textureUnit),
@@ -78,8 +80,34 @@ void OverlayNode::releaseGLObjects(osg::State* state) const
if (_texture.valid()) _texture->releaseGLObjects(state);
}
void OverlayNode::setOverlayTechnique(OverlayTechnique technique)
{
if (_overlayTechnique==technique) return;
_overlayTechnique = technique;
init();
}
void OverlayNode::init()
{
switch(_overlayTechnique)
{
case(OBJECT_DEPENDENT_WITH_ORTHOGRAPHIC_OVERLAY):
init_OBJECT_DEPENDENT_WITH_ORTHOGRAPHIC_OVERLAY();
break;
case(VIEW_DEPENDENT_WITH_ORTHOGRAPHIC_OVERLAY):
init_VIEW_DEPENDENT_WITH_ORTHOGRAPHIC_OVERLAY();
break;
case(VIEW_DEPENDENT_WITH_PERSPECTIVE_OVERLAY):
init_VIEW_DEPENDENT_WITH_PERSPECTIVE_OVERLAY();
break;
}
}
void OverlayNode::init_OBJECT_DEPENDENT_WITH_ORTHOGRAPHIC_OVERLAY()
{
osg::notify(osg::NOTICE)<<"OverlayNode::init() - OBJECT_DEPENDENT_WITH_ORTHOGRAPHIC_OVERLAY"<<std::endl;
unsigned int tex_width = _textureSizeHint;
unsigned int tex_height = _textureSizeHint;
@@ -125,8 +153,33 @@ void OverlayNode::init()
setOverlayTextureUnit(_textureUnit);
}
void OverlayNode::init_VIEW_DEPENDENT_WITH_ORTHOGRAPHIC_OVERLAY()
{
osg::notify(osg::NOTICE)<<"OverlayNode::init() - VIEW_DEPENDENT_WITH_ORTHOGRAPHIC_OVERLAY"<<std::endl;
}
void OverlayNode::init_VIEW_DEPENDENT_WITH_PERSPECTIVE_OVERLAY()
{
osg::notify(osg::NOTICE)<<"OverlayNode::init() - VIEW_DEPENDENT_WITH_PERSPECTIVE_OVERLAY"<<std::endl;
}
void OverlayNode::traverse(osg::NodeVisitor& nv)
{
switch(_overlayTechnique)
{
case(OBJECT_DEPENDENT_WITH_ORTHOGRAPHIC_OVERLAY):
traverse_OBJECT_DEPENDENT_WITH_ORTHOGRAPHIC_OVERLAY(nv);
break;
case(VIEW_DEPENDENT_WITH_ORTHOGRAPHIC_OVERLAY):
traverse_VIEW_DEPENDENT_WITH_ORTHOGRAPHIC_OVERLAY(nv);
break;
case(VIEW_DEPENDENT_WITH_PERSPECTIVE_OVERLAY):
traverse_VIEW_DEPENDENT_WITH_PERSPECTIVE_OVERLAY(nv);
break;
}
}
void OverlayNode::traverse_OBJECT_DEPENDENT_WITH_ORTHOGRAPHIC_OVERLAY(osg::NodeVisitor& nv)
{
if (nv.getVisitorType() == osg::NodeVisitor::UPDATE_VISITOR)
{
@@ -276,14 +329,28 @@ void OverlayNode::traverse(osg::NodeVisitor& nv)
}
}
void OverlayNode::traverse_VIEW_DEPENDENT_WITH_ORTHOGRAPHIC_OVERLAY(osg::NodeVisitor& nv)
{
osg::notify(osg::NOTICE)<<"OverlayNode::traverse() - VIEW_DEPENDENT_WITH_ORTHOGRAPHIC_OVERLAY"<<std::endl;
}
void OverlayNode::traverse_VIEW_DEPENDENT_WITH_PERSPECTIVE_OVERLAY(osg::NodeVisitor& nv)
{
osg::notify(osg::NOTICE)<<"OverlayNode::traverse() - VIEW_DEPENDENT_WITH_PERSPECTIVE_OVERLAY"<<std::endl;
}
void OverlayNode::setOverlaySubgraph(osg::Node* node)
{
if (_overlaySubgraph == node) return;
_overlaySubgraph = node;
_camera->removeChildren(0, _camera->getNumChildren());
_camera->addChild(node);
if (_camera.valid())
{
_camera->removeChildren(0, _camera->getNumChildren());
_camera->addChild(node);
}
dirtyOverlayTexture();
}
@@ -296,12 +363,12 @@ void OverlayNode::dirtyOverlayTexture()
void OverlayNode::setOverlayClearColor(const osg::Vec4& color)
{
_camera->setClearColor(color);
if (_camera.valid()) _camera->setClearColor(color);
}
const osg::Vec4& OverlayNode::getOverlayClearColor() const
osg::Vec4 OverlayNode::getOverlayClearColor() const
{
return _camera->getClearColor();
return _camera.valid() ? _camera->getClearColor() : osg::Vec4(1.0f,1.0f,1.0f,1.0f);
}
@@ -316,7 +383,7 @@ void OverlayNode::setOverlayTextureUnit(unsigned int unit)
{
_textureUnit = unit;
_texgenNode->setTextureUnit(_textureUnit);
if (_texgenNode.valid()) _texgenNode->setTextureUnit(_textureUnit);
updateMainSubgraphStateSet();
}
@@ -327,12 +394,14 @@ void OverlayNode::setOverlayTextureSizeHint(unsigned int size)
_textureSizeHint = size;
//_texture->dirtyTextureObject();
_texture->setTextureSize(_textureSizeHint, _textureSizeHint);
_camera->setViewport(0,0,_textureSizeHint,_textureSizeHint);
if (_texture.valid()) _texture->setTextureSize(_textureSizeHint, _textureSizeHint);
if (_camera.valid()) _camera->setViewport(0,0,_textureSizeHint,_textureSizeHint);
}
void OverlayNode::updateMainSubgraphStateSet()
{
if (!_mainSubgraphStateSet) return;
_mainSubgraphStateSet->clear();
_mainSubgraphStateSet->setTextureAttributeAndModes(_textureUnit, _texture.get(), osg::StateAttribute::ON);
_mainSubgraphStateSet->setTextureMode(_textureUnit, GL_TEXTURE_GEN_S, osg::StateAttribute::ON);