/*===================================================================== QGroundControl Open Source Ground Control Station (c) 2009, 2010 QGROUNDCONTROL PROJECT 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 . ======================================================================*/ /** * @file * @brief Definition of the class HUDScaleGeode. * * @author Lionel Heng * */ #include "HUDScaleGeode.h" #include #include HUDScaleGeode::HUDScaleGeode() { } void HUDScaleGeode::init(void) { osg::ref_ptr outlineVertices(new osg::Vec2Array); outlineVertices->push_back(osg::Vec2(20.0f, 50.0f)); outlineVertices->push_back(osg::Vec2(20.0f, 70.0f)); outlineVertices->push_back(osg::Vec2(20.0f, 60.0f)); outlineVertices->push_back(osg::Vec2(100.0f, 60.0f)); outlineVertices->push_back(osg::Vec2(100.0f, 50.0f)); outlineVertices->push_back(osg::Vec2(100.0f, 70.0f)); osg::ref_ptr outlineGeometry(new osg::Geometry); outlineGeometry->setVertexArray(outlineVertices); osg::ref_ptr outlineColor(new osg::Vec4Array); outlineColor->push_back(osg::Vec4(1.0f, 1.0f, 1.0f, 1.0f)); outlineGeometry->setColorArray(outlineColor); outlineGeometry->setColorBinding(osg::Geometry::BIND_OVERALL); outlineGeometry->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::LINES, 0, 6)); osg::ref_ptr outlineWidth(new osg::LineWidth()); outlineWidth->setWidth(4.0f); outlineGeometry->getOrCreateStateSet()-> setAttributeAndModes(outlineWidth, osg::StateAttribute::ON); addDrawable(outlineGeometry); osg::ref_ptr markerVertices(new osg::Vec2Array); markerVertices->push_back(osg::Vec2(20.0f, 50.0f)); markerVertices->push_back(osg::Vec2(20.0f, 70.0f)); markerVertices->push_back(osg::Vec2(20.0f, 60.0f)); markerVertices->push_back(osg::Vec2(100.0f, 60.0f)); markerVertices->push_back(osg::Vec2(100.0f, 50.0f)); markerVertices->push_back(osg::Vec2(100.0f, 70.0f)); osg::ref_ptr markerGeometry(new osg::Geometry); markerGeometry->setVertexArray(markerVertices); osg::ref_ptr markerColor(new osg::Vec4Array); markerColor->push_back(osg::Vec4(0.0f, 0.0f, 0.0f, 1.0f)); markerGeometry->setColorArray(markerColor); markerGeometry->setColorBinding(osg::Geometry::BIND_OVERALL); markerGeometry->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::LINES, 0, 6)); osg::ref_ptr markerWidth(new osg::LineWidth()); markerWidth->setWidth(1.5f); markerGeometry->getOrCreateStateSet()-> setAttributeAndModes(markerWidth, osg::StateAttribute::ON); addDrawable(markerGeometry); text = new osgText::Text; text->setCharacterSize(11); text->setFont("images/Vera.ttf"); text->setAxisAlignment(osgText::Text::SCREEN); text->setColor(osg::Vec4(1.0f, 1.0f, 1.0f, 1.0f)); text->setPosition(osg::Vec3(40.0f, 45.0f, -1.5f)); addDrawable(text); } void HUDScaleGeode::update(int windowHeight, float cameraFov, float cameraDistance, bool darkBackground) { float f = static_cast(windowHeight) / 2.0f / tanf(cameraFov / 180.0f * M_PI / 2.0f); float dist = cameraDistance / f * 80.0f; if (darkBackground) { text->setColor(osg::Vec4(1.0f, 1.0f, 1.0f, 1.0f)); } else { text->setColor(osg::Vec4(0.0f, 0.0f, 0.0f, 1.0f)); } text->setText(QString("%1 m").arg(dist, 0, 'f', 2).toStdString()); }