what happens if you change your coordinates of using Vec2Array to Vec3Array
(it is still in 3d regardless of your 2D HUD projection, so just set Z to
zero)?

Nick


On Fri, Jul 4, 2014 at 3:20 PM, Andrés Barrionuevo <[email protected]>
wrote:

> Hello there!
>
> I've struggling a while with the setup of a HUD camera.
> What I want to achieve is to show cross in the middle of the vieport.
>
> I have been able to display text, but not the cross, so I'm requesting a
> little help with this ... :)
>
> Here's the code for the viewer (it is based in the osgQt and osghud
> examples):
>
>
> Code:
>
> class Viewer: public QWidget, public osgViewer::Viewer {
> public:
>     static const unsigned int MAIN_MASK = 0x1;
>     static const unsigned int HUD_MASK = 0x2;
>     virtual void paintEvent( QPaintEvent* event )
>     {
>         frame();
>     }
>     Viewer( osg::ref_ptr<osg::Node> g): QWidget(), osgViewer::Viewer() {
>         osg::ref_ptr<osg::Camera> cam = createCamera( 150, 10, 640, 800 );
>
>         QGridLayout* layout = new QGridLayout;
>         layout->setContentsMargins( 1, 1, 1, 1 );
>         QWidget* widget = addViewWidget( cam.get(), g.get() );
>
>         layout->addWidget( widget );
>         setLayout( layout );
>         connect( &( this->timer_ ), SIGNAL( timeout() ), this, SLOT(
> update() ) );
>
>         getDatabasePager()->setDoPreCompile( true );
>     }
>     void startTimer() { timer_.start(24); }
>     ~Viewer(){}
> private:
>     osg::Camera* createCamera( int x, int y, int w, int h )
>     {
>         try {
>             osg::DisplaySettings* ds =
> osg::DisplaySettings::instance().get();
>             if( !ds ) {
>               return NULL;
>             }
>             osg::ref_ptr<osg::GraphicsContext::Traits> traits =
>                     new osg::GraphicsContext::Traits
>             ;
>
>             traits->windowName = "no name";
>             traits->windowDecoration = true;
>             traits->x = x;
>             traits->y = y;
>             traits->width = w;
>             traits->height = h;
>             traits->doubleBuffer = true;
>             traits->alpha = ds->getMinimumNumAlphaBits();
>             traits->stencil = ds->getMinimumNumStencilBits();
>             traits->sampleBuffers = ds->getMultiSamples();
>             traits->samples = 4;
>
>             osgViewer::Viewer::Views views;
>             getViews( views );
>             osg::ref_ptr<osg::Camera> camera = views[ 0 ]->getCamera();
>
>             camera->setGraphicsContext(
>                         new osgQt::GraphicsWindowQt( traits.get() ) )
>             ;
>             camera->setClearColor( osg::Vec4( 0,0,0,1 ) );
>             camera->setViewport(
>                         new osg::Viewport( 0, 0, traits->width,
> traits->height) )
>             ;
>             const double tw = static_cast<double>( traits->width );
>             const double th = static_cast<double>( traits->height );
>             camera->setProjectionMatrixAsPerspective( 30.0f, tw / th, 1.0f,
>                                                       10000.0f )
>             ;
>
>             camera->setCullMask( MAIN_MASK );
>             return camera.release();
>         } catch( const std::bad_alloc& ) {
>             return NULL;
>         }
>     }
>     QWidget* addViewWidget( osg::Camera *camera, osg::Node *scene )
>     {
>         try {
>
>             addEventHandler( new osgViewer::StatsHandler );
>
>             osgGA::CameraManipulator* cameraManipulator =
>                     new osgGA::TrackballManipulator(
>                         osgGA::StandardManipulator::DEFAULT_SETTINGS
>                     )
>             ;
>
>             setCameraManipulator( cameraManipulator );
>             osg::observer_ptr<osgGA::TrackballManipulator> cm =
>                     dynamic_cast<osgGA::TrackballManipulator*>(
> cameraManipulator )
>             ;
>
>             cm->setAnimationTime( -1 );
>             cm->setMinimumDistance( 10 );
>
>
>                         hud = new osg::Camera;
>                         hud->setCullMask( HUD_MASK );
>
>
>
> hud->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
>
>                         hud->setClearMask(GL_DEPTH_BUFFER_BIT /*|
> GL_COLOR_BUFFER_BIT*/ );
>
>                         hud->setRenderOrder(osg::Camera::POST_RENDER);
>
>                         hud->setAllowEventFocus(false);
>
>                         osgViewer::Viewer::Windows windows;
>                         getWindows( windows );
>                         hud->setClearColor( osg::Vec4( 0.0, 1.0, 0.0,
> 255.0 ) );
>
> hud->getOrCreateStateSet()->setMode(GL_DEPTH_TEST,osg::StateAttribute::OFF);
>                         hud->setGraphicsContext( windows.front() );
>
>
>
>                         osg::Viewport* vport = camera->getViewport();
>                         const osg::Matrix wmat =
> vport->computeWindowMatrix();
>                         osg::Vec3d vc( vport->x() + vport->width()/2,
> vport->y() + vport->height()/2, 1.0 );
>
>                         hud->setViewport( vc.x() - 50, vc.y() - 50,
> 100,100 );
>
>                         hud->setProjectionMatrix( osg::Matrix::ortho2D(
> vc.x() - 50, vc.y() - 50, vc.x() + 50, vc.y() + 50 ) );
>
>                         osg::ref_ptr<osg::Geode> geode = new osg::Geode;
>                         osg::ref_ptr<osg::Vec4Array> color = new
> osg::Vec4Array;
>                         color->push_back( osg::Vec4( 1.0, 0.0, 0.0, 1.0 )
> );
> #if 0
>                         osg::ref_ptr<osgText::Text> text = new
> osgText::Text;
>                         geode->addDrawable( text.get() );
>                         text->setPosition( osg::Vec3( vc.x(), vc.y(), 0.0
> ) );
>                         text->setAlignment( osgText::Text::CENTER_CENTER );
>                         text->setText( "BAH" );
>                         text->setColor( color->front() );
>
> text->getOrCreateStateSet()->setMode(GL_DEPTH_TEST,osg::StateAttribute::OFF);
>
> text->getOrCreateStateSet()->setMode(GL_BLEND,osg::StateAttribute::OFF);
>                         text->getOrCreateStateSet()->setMode(GL_LIGHTING,
> osg::StateAttribute::OFF);
>
> #else
>                         osg::ref_ptr<osg::Geometry> geom = new
> osg::Geometry;
>                         geode->addDrawable( geom.get() );
>                         osg::ref_ptr<osg::Vec2Array> vert = new
> osg::Vec2Array;
>                         const float buf = 0.5f;
>                         vert->push_back( osg::Vec2d( vc.x() - buf, vc.y()
> + buf ) );
>                         vert->push_back( osg::Vec2d( vc.x() + buf, vc.y()
> - buf ) );
>                         vert->push_back( osg::Vec2d( vc.x() - buf, vc.y()
> - buf ) );
>                         vert->push_back( osg::Vec2d( vc.x() + buf, vc.y()
> + buf ) );
>
>                         geom->setVertexArray( vert.get() );
>                         geom->setColorArray( color.get() );
>                         geom->setColorBinding( osg::Geometry::BIND_OVERALL
> );
>
> geom->getOrCreateStateSet()->setMode(GL_BLEND,osg::StateAttribute::OFF);
>                         geom->getOrCreateStateSet()->setMode(
> GL_DEPTH_TEST,
>
>                         osg::StateAttribute::OFF )
>                         ;
>                         geom->getOrCreateStateSet()->setMode( GL_LIGHTING,
>
>                         osg::StateAttribute::OFF )
>                         ;
>                         geom->getOrCreateStateSet()->setRenderBinDetails(
> 25, "RenderBin" );
>                         geom->addPrimitiveSet(
>                                                 new osg::DrawArrays(
> GL_LINES, 0,
>
>                vert->size() ) )
>                         ;
>                         geom->getOrCreateStateSet()->setAttributeAndModes(
>                                                 new osg::LineWidth( 3.0f )
> )
>                         ;
>                         geom->getOrCreateStateSet()->setAttributeAndModes(
>                                                 new osg::Point( 5.0f ) )
>                         ;
>                         geom->addPrimitiveSet(
>                                                 new osg::DrawArrays(
> GL_POINTS,
>
>                0,
>
>                vert->size() ) )
>                         ;
> #endif
>
>                         geode->setNodeMask( HUD_MASK );
>                         hud->addChild( geode.get() );
>                         osg::Group* g = dynamic_cast<osg::Group*>(scene);
>                         std::cout << "G-" << g->getNumChildren() << "\n";
>                         g->addChild( hud.get() );
>
>
>
>
>             osg::Vec3d eye , cent = scene->getBound().center();
>             eye[2] += 100;
>             cm->setHomePosition( eye, cent, osg::Y_AXIS );
>
>             setCamera( camera );
>             setSceneData( g );
>             setRunFrameScheme( osgViewer::Viewer::ON_DEMAND );
>             osgQt::GraphicsWindowQt* gw =
>               dynamic_cast<osgQt::GraphicsWindowQt*>(
> camera->getGraphicsContext() )
>             ;
>             return gw ? gw->getGLWidget() : 0;
>         } catch( const std::bad_alloc& ) {
>             return NULL;
>         }
>     }
> private:
>     QTimer timer_;
>     osg::ref_ptr<osg::Camera> hud;
>     osg::ref_ptr<osg::Geode> hudgeode;
> };
>
>
>
>
> The code inside the #if 0 part in the addViewWidget function shows the
> text, but the code for the cross shows nothing.
>
> Do you have any idea?
>
> ...
>
> Cheers,
> Andrés
>
> ------------------
> Read this topic online here:
> http://forum.openscenegraph.org/viewtopic.php?p=60156#60156
>
>
>
>
>
> _______________________________________________
> osg-users mailing list
> [email protected]
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>



-- 
trajce nikolov nick
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to