Hi,
I have 3 views in a composite viewer. I like to show or hind them.
All three views are using the same graphicscontext.
in my following approach i try to use a cullmask to turn the views on and off.
Ofcourse, the gl_clear is called for every renderstage of the views and the
view is still visible. I would like to hind the complete view, including the
background.
I also figured out, that since I use the same graphicscontext it doesn't matter
if I add the view to the composite viewer or not. I will be shown anyway.
e.g. When you comment the last lines in the following code.
...
redView->getCamera()->setGraphicsContext(graphicscontext);
blueView->getCamera()->setGraphicsContext(graphicscontext);
greenView->getCamera()->setGraphicsContext(graphicscontext);
viewer.addView(redView );
// viewer.addView(blueView );
// viewer.addView(greenView);
...
For me it seems like the "addView" is more like a add context.
I also had a second approach where I use the "addView" and "removeView" of the
composite viewer to show or hind the views. Unfortunately I i hade some other
problems with this idea.
What else could be a solution for my problem?
Code:
#include <osg/Camera>
#include <osgDB/ReadFile>
#include <osgViewer/Viewer>
#include <osgViewer/CompositeViewer>
#include <osgViewer/ViewerEventHandlers>
#include <osgGA/Trackballmanipulator>
#include <osgGA/GUIEventHandler>
#include <osg/MatrixTransform>
class MyEventHandler: public osgGA::GUIEventHandler
{
public:
osg::ref_ptr<osg::Group> m_root;
MyEventHandler(osg::Group * root){
m_root = root;
}
virtual bool handle( const osgGA::GUIEventAdapter& ea,
osgGA::GUIActionAdapter& aa )
{
switch ( ea.getEventType() )
{
case osgGA::GUIEventAdapter::KEYDOWN:
switch ( ea.getKey() )
{
case 'a': case 'A':
{
osgViewer::View* view = dynamic_cast<osgViewer::View*>(&aa);
if ( view )
{
if ( m_root->getNodeMask() == 1<<0)
{
m_root->setNodeMask(1<<1);
}
else
{
m_root->setNodeMask(1<<0);
}
std::cout<<" viewer cullmask: "<< m_root->getNodeMask()<<std::endl;
}
else
{
std::cout<<"now viewer"<<std::endl;
}
}
break;
default:
break;
}
}
return true;
}
};
class pathMaker{
public:
static osg::AnimationPath* createAnimationPath( float radius, float time)
{
osg::ref_ptr<osg::AnimationPath> path =
new osg::AnimationPath;
path->setLoopMode( osg::AnimationPath::LOOP );
unsigned int numSamples = 32;
float delta_yaw = 2.0f * osg::PI/((float)numSamples - 1.0f);
float delta_time = time / (float)numSamples;
for ( unsigned int i=0; i<numSamples; ++i )
{
float yaw = delta_yaw * (float)i;
osg::Vec3 pos( sinf(yaw)*radius, cosf(yaw)*radius, 0.0f );
osg::Quat rot( -yaw, osg::Z_AXIS );
path->insert( delta_time * (float)i,
osg::AnimationPath::ControlPoint(pos, rot)
);
}
return path.release();
}
};
int main (){
int m_maxScreenWidth = 1440;
int m_maxScreenHeight = 540;
osg::ref_ptr<osg::GraphicsContext::Traits> traits = new
osg::GraphicsContext::Traits;
traits->x = 200;
traits->y = 400;
traits->width = m_maxScreenWidth;
traits->height = m_maxScreenHeight;
traits->depth = 16;
traits->windowDecoration = true;
traits->supportsResize = true;
traits->windowName = "TEST";
traits->doubleBuffer = true;
osg::ref_ptr<osg::GraphicsContext> graphicscontext =
osg::GraphicsContext::createGraphicsContext(traits);
if (graphicscontext.valid())
{
graphicscontext->setClearColor(osg::Vec4f(0.0f, 0.0f, 0.0f, 1.0f));
graphicscontext->setClearMask(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
}
osg::ref_ptr<osg::Group> root = new osg::Group;
osg::ref_ptr<osg::MatrixTransform> rotateNode =
new osg::MatrixTransform;
osg::ref_ptr<osg::Node> n = osgDB::readNodeFile("cessna.osg.0,0,90.rot");
for ( unsigned int i = 0; i < 100 ; i++) // just produce some load for the
gpu
{
osg::ref_ptr<osg::MatrixTransform> rotateN =
new osg::MatrixTransform;
rotateN->addChild(n);
osg::Quat rot( -3 * i, osg::X_AXIS );
rotateN->setMatrix(osg::Matrix::rotate(rot));
rotateNode->addChild(rotateN);
}
root->addChild( rotateNode.get() );
osgViewer::CompositeViewer viewer;
viewer.setThreadingModel(osgViewer::ViewerBase::ThreadingModel::SingleThreaded);
osg::ref_ptr<osg::AnimationPathCallback> apcb = new
osg::AnimationPathCallback;
apcb->setAnimationPath( pathMaker::createAnimationPath(50.0f, 6.0f) );
rotateNode->setUpdateCallback( apcb.get() );
osgViewer::View * redView = new osgViewer::View();
osgViewer::View * blueView = new osgViewer::View();
osgViewer::View * greenView = new osgViewer::View();
redView->setName("redView");
blueView->setName("blueView");
greenView->setName("greenView");
redView->setSceneData(root);
blueView->setSceneData(root);
greenView->setSceneData(root);
redView->getCamera()->setClearColor(osg::Vec4f(0.5,0,0,1));
blueView->getCamera()->setClearColor(osg::Vec4f(0,0,0.5,1));
greenView->getCamera()->setClearColor(osg::Vec4f(0,0.5,0,1));
blueView->getCamera()->setViewport( m_maxScreenWidth * 0.4375, 0,
m_maxScreenWidth * 0.5625, m_maxScreenHeight);
blueView->getCamera()->setProjectionMatrixAsPerspective(45.0f,static_cast<double>(m_maxScreenWidth
* 0.5625) / static_cast<double>(m_maxScreenHeight), 1.0f, 1000.0f);
blueView->getCamera()->setAllowEventFocus(false);
blueView->getCamera()->setViewMatrixAsLookAt(osg::Vec3(20,0,2),osg::Vec3(0,-1,0),osg::Vec3(0,0,1));
redView->getCamera()->setViewport(m_maxScreenWidth * 0.09027, 0,
m_maxScreenWidth * 0.2638, m_maxScreenHeight);
redView->getCamera()->setProjectionMatrixAsPerspective(45.0f,
static_cast<double>(m_maxScreenWidth * 0.2638) /
static_cast<double>(m_maxScreenHeight), 1.0f, 1000.0f);
redView->getCamera()->setAllowEventFocus(false);
redView->getCamera()->setViewMatrixAsLookAt(osg::Vec3(-100,-50,-100),osg::Vec3(0,-1,0),osg::Vec3(0,0,1));
greenView->getCamera()->setViewport(100, 100, m_maxScreenWidth-200 ,
m_maxScreenHeight-200);
greenView->getCamera()->setProjectionMatrixAsPerspective(45.0f,
static_cast<double>(m_maxScreenWidth -200) /
static_cast<double>(m_maxScreenHeight-200), 1.0f, 1000.0f);
greenView->getCamera()->setAllowEventFocus(false);
greenView->getCamera()->setViewMatrixAsLookAt(osg::Vec3(-100,-50,50),osg::Vec3(0,-1,0),osg::Vec3(0,0,1));
osg::ref_ptr<osgViewer::StatsHandler> statsHandler = new
osgViewer::StatsHandler();
redView->addEventHandler(statsHandler);
redView->addEventHandler(new MyEventHandler(root.get()));
redView->getCamera()->setCullMask(1<<0);
blueView->getCamera()->setCullMask(1<<0);
greenView->getCamera()->setCullMask(1<<1);
root->setNodeMask(1<<0);
redView->getCamera()->setGraphicsContext(graphicscontext);
blueView->getCamera()->setGraphicsContext(graphicscontext);
greenView->getCamera()->setGraphicsContext(graphicscontext);
viewer.addView(redView );
viewer.addView(blueView );
viewer.addView(greenView);
return viewer.run();
}
Thank you very much!
Cheers,
Mat
------------------
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=56055#56055
#include <osg/Camera>
#include <osgDB/ReadFile>
#include <osgViewer/Viewer>
#include <osgViewer/CompositeViewer>
#include <osgViewer/ViewerEventHandlers>
#include <osgGA/Trackballmanipulator>
#include <osgGA/GUIEventHandler>
#include <osg/MatrixTransform>
class MyEventHandler: public osgGA::GUIEventHandler
{
public:
osg::ref_ptr<osg::Group> m_root;
MyEventHandler(osg::Group * root){
m_root = root;
}
virtual bool handle( const osgGA::GUIEventAdapter& ea,
osgGA::GUIActionAdapter& aa )
{
switch ( ea.getEventType() )
{
case osgGA::GUIEventAdapter::KEYDOWN:
switch ( ea.getKey() )
{
case 'a': case 'A':
{
osgViewer::View* view = dynamic_cast<osgViewer::View*>(&aa);
if ( view )
{
if ( m_root->getNodeMask() == 1<<0)
{
m_root->setNodeMask(1<<1);
}
else
{
m_root->setNodeMask(1<<0);
}
std::cout<<" viewer cullmask: "<< m_root->getNodeMask()<<std::endl;
}
else
{
std::cout<<"now viewer"<<std::endl;
}
}
break;
default:
break;
}
}
return true;
}
};
class pathMaker{
public:
static osg::AnimationPath* createAnimationPath( float radius, float time)
{
osg::ref_ptr<osg::AnimationPath> path =
new osg::AnimationPath;
path->setLoopMode( osg::AnimationPath::LOOP );
unsigned int numSamples = 32;
float delta_yaw = 2.0f * osg::PI/((float)numSamples - 1.0f);
float delta_time = time / (float)numSamples;
for ( unsigned int i=0; i<numSamples; ++i )
{
float yaw = delta_yaw * (float)i;
osg::Vec3 pos( sinf(yaw)*radius, cosf(yaw)*radius, 0.0f );
osg::Quat rot( -yaw, osg::Z_AXIS );
path->insert( delta_time * (float)i,
osg::AnimationPath::ControlPoint(pos, rot)
);
}
return path.release();
}
};
int main (){
int m_maxScreenWidth = 1440;
int m_maxScreenHeight = 540;
osg::ref_ptr<osg::GraphicsContext::Traits> traits = new
osg::GraphicsContext::Traits;
traits->x = 200;
traits->y = 400;
traits->width = m_maxScreenWidth;
traits->height = m_maxScreenHeight;
traits->depth = 16;
traits->windowDecoration = true;
traits->supportsResize = true;
traits->windowName = "TEST";
traits->doubleBuffer = true;
osg::ref_ptr<osg::GraphicsContext> graphicscontext =
osg::GraphicsContext::createGraphicsContext(traits);
if (graphicscontext.valid())
{
graphicscontext->setClearColor(osg::Vec4f(0.0f, 0.0f, 0.0f, 1.0f));
graphicscontext->setClearMask(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
}
osg::ref_ptr<osg::Group> root = new osg::Group;
osg::ref_ptr<osg::MatrixTransform> rotateNode =
new osg::MatrixTransform;
osg::ref_ptr<osg::Node> n = osgDB::readNodeFile("cessna.osg.0,0,90.rot");
for ( unsigned int i = 0; i < 100 ; i++) // just produce some load for the
gpu
{
osg::ref_ptr<osg::MatrixTransform> rotateN =
new osg::MatrixTransform;
rotateN->addChild(n);
osg::Quat rot( -3 * i, osg::X_AXIS );
rotateN->setMatrix(osg::Matrix::rotate(rot));
rotateNode->addChild(rotateN);
}
root->addChild( rotateNode.get() );
osgViewer::CompositeViewer viewer;
viewer.setThreadingModel(osgViewer::ViewerBase::ThreadingModel::SingleThreaded);
osg::ref_ptr<osg::AnimationPathCallback> apcb = new
osg::AnimationPathCallback;
apcb->setAnimationPath( pathMaker::createAnimationPath(50.0f, 6.0f) );
rotateNode->setUpdateCallback( apcb.get() );
osgViewer::View * redView = new osgViewer::View();
osgViewer::View * blueView = new osgViewer::View();
osgViewer::View * greenView = new osgViewer::View();
redView->setName("redView");
blueView->setName("blueView");
greenView->setName("greenView");
redView->setSceneData(root);
blueView->setSceneData(root);
greenView->setSceneData(root);
redView->getCamera()->setClearColor(osg::Vec4f(0.5,0,0,1));
blueView->getCamera()->setClearColor(osg::Vec4f(0,0,0.5,1));
greenView->getCamera()->setClearColor(osg::Vec4f(0,0.5,0,1));
blueView->getCamera()->setViewport( m_maxScreenWidth * 0.4375, 0,
m_maxScreenWidth * 0.5625, m_maxScreenHeight);
blueView->getCamera()->setProjectionMatrixAsPerspective(45.0f,static_cast<double>(m_maxScreenWidth
* 0.5625) / static_cast<double>(m_maxScreenHeight), 1.0f, 1000.0f);
blueView->getCamera()->setAllowEventFocus(false);
blueView->getCamera()->setViewMatrixAsLookAt(osg::Vec3(20,0,2),osg::Vec3(0,-1,0),osg::Vec3(0,0,1));
redView->getCamera()->setViewport(m_maxScreenWidth * 0.09027, 0,
m_maxScreenWidth * 0.2638, m_maxScreenHeight);
redView->getCamera()->setProjectionMatrixAsPerspective(45.0f,
static_cast<double>(m_maxScreenWidth * 0.2638) /
static_cast<double>(m_maxScreenHeight), 1.0f, 1000.0f);
redView->getCamera()->setAllowEventFocus(false);
redView->getCamera()->setViewMatrixAsLookAt(osg::Vec3(-100,-50,-100),osg::Vec3(0,-1,0),osg::Vec3(0,0,1));
greenView->getCamera()->setViewport(100, 100, m_maxScreenWidth-200 ,
m_maxScreenHeight-200);
greenView->getCamera()->setProjectionMatrixAsPerspective(45.0f,
static_cast<double>(m_maxScreenWidth -200) /
static_cast<double>(m_maxScreenHeight-200), 1.0f, 1000.0f);
greenView->getCamera()->setAllowEventFocus(false);
greenView->getCamera()->setViewMatrixAsLookAt(osg::Vec3(-100,-50,50),osg::Vec3(0,-1,0),osg::Vec3(0,0,1));
osg::ref_ptr<osgViewer::StatsHandler> statsHandler = new
osgViewer::StatsHandler();
redView->addEventHandler(statsHandler);
redView->addEventHandler(new MyEventHandler(root.get()));
redView->getCamera()->setCullMask(1<<0);
blueView->getCamera()->setCullMask(1<<0);
greenView->getCamera()->setCullMask(1<<1);
root->setNodeMask(1<<0);
redView->getCamera()->setGraphicsContext(graphicscontext);
blueView->getCamera()->setGraphicsContext(graphicscontext);
greenView->getCamera()->setGraphicsContext(graphicscontext);
viewer.addView(redView );
viewer.addView(blueView );
viewer.addView(greenView);
return viewer.run();
}
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org