void VBox::calcSize(const ControlContext& cx, osg::Vec2f& out_size) { if ( visible() == true ) { _renderSize.set( 0, 0 ); // collect all the members, growing the container size vertically for( ControlList::const_iterator i = _controls.begin(); i != _controls.end(); ++i ) { Control* child = i->get(); osg::Vec2f childSize; bool first = i == _controls.begin(); child->calcSize( cx, childSize ); _renderSize.x() = osg::maximum( _renderSize.x(), childSize.x() ); _renderSize.y() += first ? childSize.y() : spacing() + childSize.y(); } _renderSize.set( _renderSize.x() + padding().left() + padding().right(), _renderSize.y() + padding().top() + padding().bottom() ); out_size.set( _renderSize.x() + margin().left() + margin().right(), _renderSize.y() + margin().top() + margin().bottom() ); Container::calcSize( cx, out_size ); } else { out_size.set(0,0); } }
void ImageControl::calcSize(const ControlContext& cx, osg::Vec2f& out_size) { if ( visible() == true ) { _renderSize.set( 0, 0 ); if ( _image.valid() ) { _renderSize.set( _image->s(), _image->t() ); } _renderSize.set( osg::maximum( _renderSize.x(), width().value() ), osg::maximum( _renderSize.y(), height().value() ) ); out_size.set( margin().left() + margin().right() + _renderSize.x(), margin().top() + margin().bottom() + _renderSize.y() ); _dirty = false; } else { out_size.set(0,0); } }
void Control::calcSize(const ControlContext& cx, osg::Vec2f& out_size) { if ( visible() == true ) { _renderSize.set( width().value(), height().value() ); out_size.set( _renderSize.x() + margin().left() + margin().right(), _renderSize.y() + margin().top() + margin().bottom() ); } else { out_size.set(0,0); } }
void LabelControl::calcSize(const ControlContext& cx, osg::Vec2f& out_size) { if ( visible() == true ) { // we have to create the drawable during the layout pass so we can calculate its size. LabelText* t = new LabelText(); t->setText( _text ); // yes, object coords. screen coords won't work becuase the bounding box will be wrong. t->setCharacterSizeMode( osgText::Text::OBJECT_COORDS ); t->setCharacterSize( _fontSize ); // always align to top. layout alignment gets calculated layer in Control::calcPos(). t->setAlignment( osgText::Text::LEFT_TOP ); t->setColor( foreColor().value() ); if ( _font.valid() ) t->setFont( _font.get() ); osg::BoundingBox bbox = t->getTextBB(); if ( cx._viewContextID != ~0 ) { //the Text's autoTransformCache matrix puts some mojo on the bounding box osg::Matrix m = t->getATMatrix( cx._viewContextID ); osg::Vec3 bmin = osg::Vec3( bbox.xMin(), bbox.yMin(), bbox.zMin() ) * m; osg::Vec3 bmax = osg::Vec3( bbox.xMax(), bbox.yMax(), bbox.zMax() ) * m; _renderSize.set( bmax.x() - bmin.x(), bmax.y() - bmin.y() ); } else { _renderSize.set( bbox.xMax()-bbox.xMin(), bbox.yMax()-bbox.yMin() ); } _drawable = t; out_size.set( margin().left() + margin().right() + _renderSize.x(), margin().top() + margin().bottom() + _renderSize.y() ); } else { out_size.set(0,0); } _dirty = false; }