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

Reply via email to