osgEarth 2.1.1
|
Public Member Functions | |
void | addControl (Control *control) |
void | removeControl (Control *control) |
Control * | getControlAtMouse (float x, float y) const |
void | setAllowControlNodeOverlap (bool value) |
void | update (const osg::FrameStamp *frameStamp) |
void | setControlContext (const ControlContext &) |
virtual void | traverse (osg::NodeVisitor &nv) |
virtual | ~ControlCanvas () |
ControlCanvas (osgViewer::View *view) | |
Static Public Member Functions | |
static ControlCanvas * | get (osg::View *view, bool installCanvasInSceneData=false) |
Protected Attributes | |
ControlList | _controls |
GeodeTable | _geodeTable |
ControlContext | _context |
bool | _contextDirty |
osg::ref_ptr< ControlNodeBin > | _controlNodeBin |
Private Types | |
typedef std::map< osg::View *, ControlCanvas * > | ViewCanvasMap |
Private Member Functions | |
ControlCanvas (osgViewer::View *view, bool registerCanvas) | |
void | init (osgViewer::View *view, bool registerCanvas) |
bool | handle (const osgGA::GUIEventAdapter &ea, osgGA::GUIActionAdapter &aa) |
ControlNodeBin * | getControlNodeBin () |
Static Private Attributes | |
static ViewCanvasMap | _viewCanvasMap |
static OpenThreads::Mutex | _viewCanvasMapMutex |
Friends | |
struct | ControlCanvasEventHandler |
class | ControlNode |
typedef std::map<osg::View*, ControlCanvas*> osgEarth::Util::Controls::ControlCanvas::ViewCanvasMap [private] |
ControlCanvas::~ControlCanvas | ( | ) | [virtual] |
Definition at line 2203 of file Controls.cpp.
{ OpenThreads::ScopedLock<OpenThreads::Mutex> lock( _viewCanvasMapMutex ); _viewCanvasMap.erase( _context._view ); }
ControlCanvas::ControlCanvas | ( | osgViewer::View * | view | ) |
Constructs a new canvas and attaches it to a view. Call getOrCreateControlCanvas(view) to create one.
Definition at line 2154 of file Controls.cpp.
: _contextDirty(true) { init( view, true ); }
ControlCanvas::ControlCanvas | ( | osgViewer::View * | view, |
bool | registerCanvas | ||
) | [private] |
Definition at line 2160 of file Controls.cpp.
: _contextDirty( true ) { init( view, registerCanvas ); }
void ControlCanvas::addControl | ( | Control * | control | ) |
adds a top-level control to this surface.
Definition at line 2216 of file Controls.cpp.
{ osg::Geode* geode = new osg::Geode(); _geodeTable[control] = geode; addChild( geode ); control->dirty(); _controls.push_back( control ); }
ControlCanvas * ControlCanvas::get | ( | osg::View * | view, |
bool | installCanvasInSceneData = false |
||
) | [static] |
Accesses the control canvas attached the the specified view.
Definition at line 2121 of file Controls.cpp.
{ ControlCanvas* canvas = 0L; OpenThreads::ScopedLock<OpenThreads::Mutex> lock( _viewCanvasMapMutex ); ViewCanvasMap::iterator i = _viewCanvasMap.find( view ); if ( i != _viewCanvasMap.end() ) { canvas = i->second; } else { // Not found, so create one. If requested, add a callback that will // automatically install it in the view's scene data during the // next update traversal. osgViewer::View* view2 = dynamic_cast<osgViewer::View*>(view); if ( view2 ) { canvas = new ControlCanvas( view2, false ); _viewCanvasMap[view] = canvas; if ( installInSceneData ) new CanvasInstaller( canvas, view->getCamera() ); } } return canvas; }
Control * ControlCanvas::getControlAtMouse | ( | float | x, |
float | y | ||
) | const |
gets the top-most control that intersects the specified position.
Definition at line 2240 of file Controls.cpp.
{ for( ControlList::const_iterator i = _controls.begin(); i != _controls.end(); ++i ) { Control* control = i->get(); if ( control->intersects( x, _context._vp->height() - y ) ) return control; } return 0L; }
ControlNodeBin* osgEarth::Util::Controls::ControlCanvas::getControlNodeBin | ( | ) | [inline, private] |
Accesses the priority rendering bin for this canvas.
Definition at line 723 of file Controls.
{ return _controlNodeBin.get(); }
bool ControlCanvas::handle | ( | const osgGA::GUIEventAdapter & | ea, |
osgGA::GUIActionAdapter & | aa | ||
) | [private] |
Definition at line 2252 of file Controls.cpp.
{ for (ControlList::reverse_iterator i = _controls.rbegin(); i != _controls.rend(); ++i) { Control* control = i->get(); if (control->isDirty()) { aa.requestRedraw(); break; } } bool handled = false; //Send a frame event to all controls if ( ea.getEventType() == osgGA::GUIEventAdapter::FRAME ) { for( ControlList::const_reverse_iterator i = _controls.rbegin(); i != _controls.rend(); ++i ) { i->get()->handle(ea, aa, _context); } return handled; } float invY = _context._vp->height() - ea.getY(); for( ControlList::reverse_iterator i = _controls.rbegin(); i != _controls.rend(); ++i ) { Control* control = i->get(); if ( control->intersects( ea.getX(), invY ) ) { handled = control->handle( ea, aa, _context ); if ( handled ) break; } } if ( _context._active.size() > 1 ) { _context._active.front()->setActive( false ); _context._active.pop(); } if ( _context._active.size() > 0 ) { bool hit = _context._active.front()->intersects( ea.getX(), invY ); _context._active.front()->setActive( hit ); if ( !hit ) _context._active.pop(); } return handled; //_context._active.size() > 0; }
void ControlCanvas::init | ( | osgViewer::View * | view, |
bool | registerCanvas | ||
) | [private] |
Definition at line 2167 of file Controls.cpp.
{ this->setDataVariance( osg::Object::DYNAMIC ); view->addEventHandler( new ViewportHandler(this) ); view->addEventHandler( new ControlCanvasEventHandler(this) ); setReferenceFrame(osg::Transform::ABSOLUTE_RF); setViewMatrix(osg::Matrix::identity()); setClearMask(GL_DEPTH_BUFFER_BIT); setRenderOrder(osg::Camera::POST_RENDER); setAllowEventFocus( true ); // activate the update traversal ADJUST_UPDATE_TRAV_COUNT( this, 1 ); osg::StateSet* ss = getOrCreateStateSet(); ss->setMode( GL_LIGHTING, osg::StateAttribute::OFF | osg::StateAttribute::OVERRIDE ); ss->setMode( GL_BLEND, osg::StateAttribute::ON | osg::StateAttribute::OVERRIDE ); ss->setAttributeAndModes( new osg::Depth( osg::Depth::LEQUAL, 0, 1, false ) ); // this is necessary b/c osgText puts things in this bin too and we can't override that ss->setRenderingHint( osg::StateSet::TRANSPARENT_BIN ); ss->setBinNumber(999999); _controlNodeBin = new ControlNodeBin(); this->addChild( _controlNodeBin->getControlGroup() ); // register this canvas. if ( registerCanvas ) { OpenThreads::ScopedLock<OpenThreads::Mutex> lock( _viewCanvasMapMutex ); _viewCanvasMap[view] = this; } }
void ControlCanvas::removeControl | ( | Control * | control | ) |
removes a top-level control.
Definition at line 2226 of file Controls.cpp.
{ GeodeTable::iterator i = _geodeTable.find( control ); if ( i != _geodeTable.end() ) { removeChild( i->second ); _geodeTable.erase( i ); } ControlList::iterator j = std::find( _controls.begin(), _controls.end(), control ); if ( j != _controls.end() ) _controls.erase( j ); }
void ControlCanvas::setAllowControlNodeOverlap | ( | bool | value | ) |
Toggles whether ControlNodes are allowed to overlap.
Definition at line 2210 of file Controls.cpp.
{ getControlNodeBin()->_sortingEnabled = !value; }
void ControlCanvas::setControlContext | ( | const ControlContext & | cx | ) |
Definition at line 2358 of file Controls.cpp.
{ _context = cx; _contextDirty = true; }
void ControlCanvas::traverse | ( | osg::NodeVisitor & | nv | ) | [virtual] |
Definition at line 2347 of file Controls.cpp.
{ if ( nv.getVisitorType() == osg::NodeVisitor::UPDATE_VISITOR ) { update( nv.getFrameStamp() ); } osg::Camera::traverse( nv ); }
void ControlCanvas::update | ( | const osg::FrameStamp * | frameStamp | ) |
Definition at line 2307 of file Controls.cpp.
{ _context._frameStamp = frameStamp; int bin = 0; for( ControlList::iterator i = _controls.begin(); i != _controls.end(); ++i ) { Control* control = i->get(); if ( control->isDirty() || _contextDirty ) { osg::Vec2f size; control->calcSize( _context, size ); control->calcFill( _context ); osg::Vec2f surfaceSize( _context._vp->width(), _context._vp->height() ); control->calcPos( _context, osg::Vec2f(0,0), surfaceSize ); osg::Geode* geode = _geodeTable[control]; geode->removeDrawables( 0, geode->getNumDrawables() ); DrawableList drawables; control->draw( _context, drawables ); for( DrawableList::iterator j = drawables.begin(); j != drawables.end(); ++j ) { j->get()->setDataVariance( osg::Object::DYNAMIC ); j->get()->getOrCreateStateSet()->setBinNumber( bin++ ); geode->addDrawable( j->get() ); } } } if ( _controlNodeBin.valid() ) { _controlNodeBin->draw( _context, _contextDirty, bin ); } _contextDirty = false; }
friend struct ControlCanvasEventHandler [friend] |
friend class ControlNode [friend] |
bool osgEarth::Util::Controls::ControlCanvas::_contextDirty [protected] |
osg::ref_ptr<ControlNodeBin> osgEarth::Util::Controls::ControlCanvas::_controlNodeBin [protected] |
ControlCanvas::ViewCanvasMap ControlCanvas::_viewCanvasMap [static, private] |
OpenThreads::Mutex ControlCanvas::_viewCanvasMapMutex [static, private] |