void TrackNode::init( const TrackNodeFieldSchema& schema ) { _geode = new osg::Geode(); IconSymbol* icon = _style.get<IconSymbol>(); osg::Image* image = icon ? icon->getImage() : 0L; if ( icon && image ) { // apply the image icon. osg::Geometry* imageGeom = AnnotationUtils::createImageGeometry( image, // image osg::Vec2s(0,0), // offset 0, // tex image unit icon->heading()->eval() ); if ( imageGeom ) { _geode->addDrawable( imageGeom ); } } if ( !schema.empty() ) { // turn the schema defs into text drawables and record a map so we can // set the field text later. for( TrackNodeFieldSchema::const_iterator i = schema.begin(); i != schema.end(); ++i ) { const TrackNodeField& field = i->second; if ( field._symbol.valid() ) { osg::Drawable* drawable = AnnotationUtils::createTextDrawable( field._symbol->content()->expr(), // text field._symbol.get(), // symbol osg::Vec3(0,0,0) ); // offset if ( drawable ) { // if the user intends to change the label later, make it dynamic // since osgText updates are not thread-safe if ( field._dynamic ) drawable->setDataVariance( osg::Object::DYNAMIC ); else drawable->setDataVariance( osg::Object::STATIC ); addDrawable( i->first, drawable ); } } } } // ensure depth testing always passes, and disable depth buffer writes. osg::StateSet* stateSet = _geode->getOrCreateStateSet(); stateSet->setAttributeAndModes( new osg::Depth(osg::Depth::ALWAYS, 0, 1, false), 1 ); applyStyle( _style ); setLightingIfNotSet( false ); getAttachPoint()->addChild( _geode ); ShaderGenerator gen( Registry::stateSetCache() ); this->accept( gen ); }
void TrackNode::init( const TrackNodeFieldSchema& schema ) { osg::StateSet* ss = this->getOrCreateStateSet(); ScreenSpaceLayout::activate(ss); // Disable lighting for place nodes by default ss->setDefine(OE_LIGHTING_DEFINE, osg::StateAttribute::OFF); osgEarth::clearChildren( getPositionAttitudeTransform() ); _geode = new osg::Geode(); IconSymbol* icon = _style.get<IconSymbol>(); osg::Image* image = icon ? icon->getImage() : 0L; if ( icon && image ) { // apply the image icon. osg::Geometry* imageGeom = AnnotationUtils::createImageGeometry( image, // image osg::Vec2s(0,0), // offset 0, // tex image unit icon->heading()->eval(), icon->scale()->eval() ); if ( imageGeom ) { _geode->addDrawable( imageGeom ); ScreenSpaceLayoutData* layout = new ScreenSpaceLayoutData(); layout->setPriority(getPriority()); imageGeom->setUserData(layout); } } if ( !schema.empty() ) { // turn the schema defs into text drawables and record a map so we can // set the field text later. for( TrackNodeFieldSchema::const_iterator i = schema.begin(); i != schema.end(); ++i ) { const TrackNodeField& field = i->second; if ( field._symbol.valid() ) { osg::Vec3 offset( field._symbol->pixelOffset()->x(), field._symbol->pixelOffset()->y(), 0.0); osg::Drawable* drawable = AnnotationUtils::createTextDrawable( field._symbol->content()->expr(), // text field._symbol.get(), // symbol offset ); // offset if ( drawable ) { // if the user intends to change the label later, make it dynamic // since osgText updates are not thread-safe if ( field._dynamic ) drawable->setDataVariance( osg::Object::DYNAMIC ); else drawable->setDataVariance( osg::Object::STATIC ); addDrawable( i->first, drawable ); } } } } // ensure depth testing always passes, and disable depth buffer writes. osg::StateSet* stateSet = _geode->getOrCreateStateSet(); stateSet->setAttributeAndModes( new osg::Depth(osg::Depth::ALWAYS, 0, 1, false), 1 ); applyStyle( _style ); setLightingIfNotSet( false ); getPositionAttitudeTransform()->addChild( _geode ); // generate shaders: Registry::shaderGenerator().run( this, "osgEarth.TrackNode", Registry::stateSetCache() ); }