ImageWindowGeode.cc 4.63 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
///*=====================================================================
//
//QGroundControl Open Source Ground Control Station
//
//(c) 2009, 2010 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
//
//This file is part of the QGROUNDCONTROL project
//
//    QGROUNDCONTROL is free software: you can redistribute it and/or modify
//    it under the terms of the GNU General Public License as published by
//    the Free Software Foundation, either version 3 of the License, or
//    (at your option) any later version.
//
//    QGROUNDCONTROL is distributed in the hope that it will be useful,
//    but WITHOUT ANY WARRANTY; without even the implied warranty of
//    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//    GNU General Public License for more details.
//
//    You should have received a copy of the GNU General Public License
//    along with QGROUNDCONTROL. If not, see <http://www.gnu.org/licenses/>.
//
//======================================================================*/

/**
 * @file
 *   @brief Definition of the class ImageWindowGeode.
 *
 *   @author Lionel Heng <hengli@student.ethz.ch>
 *
 */

#include "ImageWindowGeode.h"

34
ImageWindowGeode::ImageWindowGeode()
35 36
 : mBorder(5)
 , mImage(new osg::Image)
37
{
38 39 40 41 42 43 44

}

void
ImageWindowGeode::init(const QString& caption, const osg::Vec4& backgroundColor,
                       osg::ref_ptr<osgText::Font>& font)
{
45 46
    // image
    osg::ref_ptr<osg::Geometry> imageGeometry = new osg::Geometry;
47
    mImageVertices = new osg::Vec3Array(4);
48 49 50 51 52 53 54 55 56 57 58 59

    osg::ref_ptr<osg::Vec2Array> textureCoords = new osg::Vec2Array;
    textureCoords->push_back(osg::Vec2(0.0f, 1.0f));
    textureCoords->push_back(osg::Vec2(1.0f, 1.0f));
    textureCoords->push_back(osg::Vec2(1.0f, 0.0f));
    textureCoords->push_back(osg::Vec2(0.0f, 0.0f));

    osg::ref_ptr<osg::Vec4Array> imageColors(new osg::Vec4Array);
    imageColors->push_back(osg::Vec4(1.0f, 1.0f, 1.0f, 1.0f));
    imageGeometry->setColorArray(imageColors);
    imageGeometry->setColorBinding(osg::Geometry::BIND_OVERALL);

60
    imageGeometry->setVertexArray(mImageVertices);
61 62 63
    imageGeometry->setTexCoordArray(0, textureCoords);

    imageGeometry->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::POLYGON,
64
                                   0, mImageVertices->size()));
65 66 67

    osg::ref_ptr<osg::Texture2D> texture = new osg::Texture2D;
    texture->setDataVariance(osg::Object::DYNAMIC);
68
    texture->setImage(mImage);
69 70 71
    texture->setResizeNonPowerOfTwoHint(false);

    imageGeometry->getOrCreateStateSet()->
72
    setTextureAttributeAndModes(0, texture, osg::StateAttribute::ON);
73 74 75 76
    imageGeometry->setUseDisplayList(false);

    // background
    osg::ref_ptr<osg::Geometry> backgroundGeometry = new osg::Geometry;
77 78
    mBackgroundVertices = new osg::Vec3Array(4);
    backgroundGeometry->setVertexArray(mBackgroundVertices);
79
    backgroundGeometry->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::POLYGON,
80
                                        0, mBackgroundVertices->size()));
81 82 83 84 85 86 87
    osg::ref_ptr<osg::Vec4Array> backgroundColors(new osg::Vec4Array);
    backgroundColors->push_back(backgroundColor);
    backgroundGeometry->setColorArray(backgroundColors);
    backgroundGeometry->setColorBinding(osg::Geometry::BIND_OVERALL);
    backgroundGeometry->setUseDisplayList(false);

    // caption
88 89 90 91 92 93
    mText = new osgText::Text;
    mText->setText(caption.toStdString().c_str());
    mText->setCharacterSize(11);
    mText->setFont(font);
    mText->setAxisAlignment(osgText::Text::SCREEN);
    mText->setColor(osg::Vec4(1.0f, 1.0f, 1.0f, 1.0f));
94 95 96

    addDrawable(imageGeometry);
    addDrawable(backgroundGeometry);
97
    addDrawable(mText);
98 99 100 101 102 103 104

    setAttributes(0, 0, 0, 0);
}

void
ImageWindowGeode::setAttributes(int x, int y, int width, int height)
{
105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
    int imageWidth = width - mBorder * 2;
    int imageHeight = height - mBorder * 2 - 15;
    int imageXPosition = x + mBorder;
    int imageYPosition = y + mBorder;

    mImageVertices->at(0) = osg::Vec3(imageXPosition, imageYPosition, 0);
    mImageVertices->at(1) = osg::Vec3(imageXPosition + imageWidth, imageYPosition, 0);
    mImageVertices->at(2) = osg::Vec3(imageXPosition + imageWidth, imageYPosition + imageHeight, 0);
    mImageVertices->at(3) = osg::Vec3(imageXPosition, imageYPosition + imageHeight, 0);

    mText->setPosition(osg::Vec3(imageXPosition, imageYPosition + imageHeight + 5, 0));

    mBackgroundVertices->at(0) = osg::Vec3(x, y, -1);
    mBackgroundVertices->at(1) = osg::Vec3(x + width, y, -1);
    mBackgroundVertices->at(2) = osg::Vec3(x + width, y + height, -1);
    mBackgroundVertices->at(3) = osg::Vec3(x, y + height, -1);
}

osg::ref_ptr<osg::Image>&
ImageWindowGeode::image(void)
{
    return mImage;
127
}