osgEarth 2.1.1
Public Member Functions | Private Attributes

osgEarth::Util::Controls::ImageControl Class Reference

Inheritance diagram for osgEarth::Util::Controls::ImageControl:
Collaboration diagram for osgEarth::Util::Controls::ImageControl:

List of all members.

Public Member Functions

 ImageControl (osg::Image *image=0L)
void setImage (osg::Image *image)
osg::Image * getImage () const
void setRotation (const Angular &angle)
const AngulargetRotation () const
void setFixSizeForRotation (bool value)
bool getFixSizeForRotation () const
virtual void calcSize (const ControlContext &context, osg::Vec2f &out_size)
virtual void draw (const ControlContext &cx, DrawableList &out)

Private Attributes

osg::ref_ptr< osg::Image > _image
Angular _rotation
bool _fixSizeForRot
osg::Geometry * _geom

Detailed Description

Control that contains a raster image

Definition at line 305 of file Controls.


Constructor & Destructor Documentation

ImageControl::ImageControl ( osg::Image *  image = 0L)

Definition at line 607 of file Controls.cpp.

                                            :
_rotation( 0.0, Units::RADIANS ),
_fixSizeForRot( false )
{
    setImage( image );
}

Here is the call graph for this function:


Member Function Documentation

void ImageControl::calcSize ( const ControlContext context,
osg::Vec2f &  out_size 
) [virtual]

Reimplemented from osgEarth::Util::Controls::Control.

Definition at line 642 of file Controls.cpp.

{
    if ( visible() == true )
    {
        _renderSize.set( 0, 0 );

        //First try the explicit settings
        if (width().isSet() && height().isSet())
        {
            _renderSize.set(width().value(), height().value());
        }
        //Second try the size of the image itself
        else if (_image.valid())
        {
            _renderSize.set( _image->s(), _image->t() );
        }
        //Lastly just use the default values for width and height
        else
        {
            _renderSize.set( width().value(), height().value());
        }

        //if there's a rotation angle, rotate
        float rot = _fixSizeForRot ? osg::PI_4 : _rotation.as(Units::RADIANS);
        if ( rot != 0.0f )
        {
            calculateRotatedSize( 
                _renderSize.x(), _renderSize.y(), 
                rot,
                _renderSize.x(), _renderSize.y() );
        }
        
        out_size.set(
            margin().left() + margin().right() + _renderSize.x(),
            margin().top() + margin().bottom() + _renderSize.y() );

        //_dirty = false;
    }
    else
    {
        out_size.set(0,0);
    }
}

Here is the call graph for this function:

void ImageControl::draw ( const ControlContext cx,
DrawableList out 
) [virtual]

Reimplemented from osgEarth::Util::Controls::Control.

Reimplemented in osgEarth::Util::Controls::Frame, and osgEarth::Util::Controls::RoundedFrame.

Definition at line 689 of file Controls.cpp.

{
    if ( visible() == true && _image.valid() )
    {
        //TODO: this is not precisely correct..images get deformed slightly..
        osg::Geometry* g = new osg::Geometry();

        float rx = osg::round( _renderPos.x() );
        float ry = osg::round( _renderPos.y() );
        float vph = cx._vp->height();

        osg::Vec3Array* verts = new osg::Vec3Array(4);
        g->setVertexArray( verts );

        if ( _rotation.as(Units::RADIANS) != 0.0f || _fixSizeForRot == true )
        {
            osg::Vec2f rc( rx+_renderSize.x()/2, (vph-ry)-_renderSize.y()/2 );
            float ra = osg::PI - _rotation.as(Units::RADIANS);

            rx += 0.5*_renderSize.x() - 0.5*(float)_image->s();
            ry += 0.5*_renderSize.y() - 0.5*(float)_image->t();

            rot( rx, vph-ry, rc, ra, (*verts)[0] );
            rot( rx, vph-ry-_image->t(), rc, ra, (*verts)[1] );
            rot( rx+_image->s(), vph-ry-_image->t(), rc, ra, (*verts)[2] );
            rot( rx+_image->s(), vph-ry, rc, ra, (*verts)[3] );
        }
        else
        {
            (*verts)[0].set( rx, vph - ry, 0 );
            (*verts)[1].set( rx, vph - ry - _renderSize.y(), 0 );
            (*verts)[2].set( rx + _renderSize.x(), vph - ry - _renderSize.y(), 0 );
            (*verts)[3].set( rx + _renderSize.x(), vph - ry, 0 );
        }

        g->addPrimitiveSet( new osg::DrawArrays( GL_QUADS, 0, 4 ) );

        osg::Vec4Array* c = new osg::Vec4Array(1);
        (*c)[0] = osg::Vec4f(1,1,1,1);
        g->setColorArray( c );
        g->setColorBinding( osg::Geometry::BIND_OVERALL );

        bool flip = _image->getOrigin()==osg::Image::TOP_LEFT;

        osg::Vec2Array* t = new osg::Vec2Array(4);

#ifdef IMAGECONTROL_TEXRECT

        (*t)[0].set( 0, flip? 0: _image->t()-1 );
        (*t)[1].set( 0, flip? _image->t()-1: 0 );
        (*t)[2].set( _image->s()-1, flip? _image->t()-1: 0 );
        (*t)[3].set( _image->s()-1, flip? 0: _image->t()-1 );
        osg::TextureRectangle* tex = new osg::TextureRectangle( _image.get() );

#else

        (*t)[0].set( 0, flip? 0 : 1 );
        (*t)[1].set( 0, flip? 1 : 0 );
        (*t)[2].set( 1, flip? 1 : 0 );
        (*t)[3].set( 1, flip? 0 : 1 );
        osg::Texture2D* tex = new osg::Texture2D( _image.get() );
#endif

        g->setTexCoordArray( 0, t );

        tex->setResizeNonPowerOfTwoHint(false);

        tex->setFilter( osg::Texture::MIN_FILTER, osg::Texture::NEAREST );
        tex->setFilter( osg::Texture::MAG_FILTER, osg::Texture::LINEAR );
        g->getOrCreateStateSet()->setTextureAttributeAndModes( 0, tex, osg::StateAttribute::ON );

        osg::TexEnv* texenv = new osg::TexEnv( osg::TexEnv::MODULATE );
        g->getStateSet()->setTextureAttributeAndModes( 0, texenv, osg::StateAttribute::ON );
        
#ifndef IMAGECONTROL_TEXRECT
        osg::Program* program = new osg::Program();
        program->addShader( new osg::Shader( osg::Shader::VERTEX, s_controlVertexShader ) );
        program->addShader( new osg::Shader( osg::Shader::FRAGMENT, s_imageControlFragmentShader ) );
        g->getStateSet()->setAttributeAndModes( program, osg::StateAttribute::ON );
#endif

        out.push_back( g );

        _dirty = false;
    }
}

Here is the call graph for this function:

bool osgEarth::Util::Controls::ImageControl::getFixSizeForRotation ( ) const [inline]

Definition at line 320 of file Controls.

{ return _fixSizeForRot; }
osg::Image* osgEarth::Util::Controls::ImageControl::getImage ( ) const [inline]

Definition at line 311 of file Controls.

{ return _image.get(); }

Here is the caller graph for this function:

const Angular& osgEarth::Util::Controls::ImageControl::getRotation ( ) const [inline]

Definition at line 315 of file Controls.

{ return _rotation; }
void ImageControl::setFixSizeForRotation ( bool  value)

Tells the control to fix its minimum size to account to rotation. Otherwise the control will auto-size its width/height based on the rotation angle.

Definition at line 633 of file Controls.cpp.

{
    if ( _fixSizeForRot != value ) {
        _fixSizeForRot = value;
        dirty();
    }
}

Here is the call graph for this function:

Here is the caller graph for this function:

void ImageControl::setImage ( osg::Image *  image)

Definition at line 615 of file Controls.cpp.

{
    if ( image != _image.get() ) {
        _image = image;
        dirty();
    }
}

Here is the call graph for this function:

Here is the caller graph for this function:

void ImageControl::setRotation ( const Angular angle)

Rotates the image.

Definition at line 624 of file Controls.cpp.

{
    if ( angle != _rotation ) {
        _rotation = angle;
        dirty();
    }
}

Here is the call graph for this function:

Here is the caller graph for this function:


Member Data Documentation

Definition at line 329 of file Controls.

Reimplemented from osgEarth::Util::Controls::Control.

Definition at line 330 of file Controls.

osg::ref_ptr<osg::Image> osgEarth::Util::Controls::ImageControl::_image [private]

Definition at line 327 of file Controls.

Definition at line 328 of file Controls.


The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines