From 4cb06414f1caf0b775cf2fffd39415436f3d11f1 Mon Sep 17 00:00:00 2001 From: Lionel Heng Date: Sun, 5 Dec 2010 16:51:24 +0100 Subject: [PATCH] Added feature to 3D view to display current scale. --- qgroundcontrol.pro | 8 +- src/ui/map3D/HUDScaleGeode.cc | 125 ++++++++++++++++++++++++++++++++ src/ui/map3D/HUDScaleGeode.h | 52 +++++++++++++ src/ui/map3D/Pixhawk3DWidget.cc | 24 +++++- src/ui/map3D/Pixhawk3DWidget.h | 2 + src/ui/map3D/Texture.cc | 8 +- 6 files changed, 210 insertions(+), 9 deletions(-) create mode 100644 src/ui/map3D/HUDScaleGeode.cc create mode 100644 src/ui/map3D/HUDScaleGeode.h diff --git a/qgroundcontrol.pro b/qgroundcontrol.pro index d45f0c99f0..090355b9e3 100644 --- a/qgroundcontrol.pro +++ b/qgroundcontrol.pro @@ -235,8 +235,6 @@ HEADERS += src/MG.h \ src/comm/QGCMAVLink.h \ src/ui/QGCWebView.h \ src/ui/map3D/QGCGoogleEarthView.h - - contains(DEPENDENCIES_PRESENT, osg) { message("Including headers for OpenSceneGraph") @@ -252,7 +250,8 @@ contains(DEPENDENCIES_PRESENT, osg) { src/ui/map3D/WebImage.h \ src/ui/map3D/TextureCache.h \ src/ui/map3D/Texture.h \ - src/ui/map3D/Imagery.h + src/ui/map3D/Imagery.h \ + src/ui/map3D/HUDScaleGeode.h contains(DEPENDENCIES_PRESENT, osgearth) { message("Including headers for OSGEARTH") @@ -352,7 +351,8 @@ contains(DEPENDENCIES_PRESENT, osg) { src/ui/map3D/WebImage.cc \ src/ui/map3D/TextureCache.cc \ src/ui/map3D/Texture.cc \ - src/ui/map3D/Imagery.cc + src/ui/map3D/Imagery.cc \ + src/ui/map3D/HUDScaleGeode.cc contains(DEPENDENCIES_PRESENT, osgearth) { message("Including sources for osgEarth") diff --git a/src/ui/map3D/HUDScaleGeode.cc b/src/ui/map3D/HUDScaleGeode.cc new file mode 100644 index 0000000000..bb113610d4 --- /dev/null +++ b/src/ui/map3D/HUDScaleGeode.cc @@ -0,0 +1,125 @@ +/*===================================================================== + +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()); +} diff --git a/src/ui/map3D/HUDScaleGeode.h b/src/ui/map3D/HUDScaleGeode.h new file mode 100644 index 0000000000..7f2a370887 --- /dev/null +++ b/src/ui/map3D/HUDScaleGeode.h @@ -0,0 +1,52 @@ +/*===================================================================== + +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 + * + */ + +#ifndef HUDSCALEGEODE_H +#define HUDSCALEGEODE_H + +#include +#include +#include + +class HUDScaleGeode : public osg::Geode +{ +public: + HUDScaleGeode(); + + void init(void); + void update(int windowHeight, float cameraFov, float cameraDistance, + bool darkBackground); + +private: + osg::ref_ptr text; +}; + +#endif // HUDSCALEGEODE_H diff --git a/src/ui/map3D/Pixhawk3DWidget.cc b/src/ui/map3D/Pixhawk3DWidget.cc index 84afb023a9..5d25e484be 100644 --- a/src/ui/map3D/Pixhawk3DWidget.cc +++ b/src/ui/map3D/Pixhawk3DWidget.cc @@ -287,9 +287,18 @@ Pixhawk3DWidget::setWaypointAltitude(void) { if (uas) { + bool ok; const QVector waypoints = uas->getWaypointManager().getWaypointList(); -// waypoints.at(selectedWpIndex)->setZ(0.0); + Waypoint* waypoint = waypoints.at(selectedWpIndex); + + double newAltitude = + QInputDialog::getDouble(this, tr("Set altitude of waypoint %1").arg(selectedWpIndex), + tr("Altitude (m):"), -waypoint->getZ(), -1000.0, 1000.0, 1, &ok); + if (ok) + { + waypoint->setZ(-newAltitude); + } } } @@ -760,6 +769,10 @@ Pixhawk3DWidget::setupHUD(void) osg::Vec4(0.0f, 0.0f, 0.1f, 1.0f), depthImage); hudGroup->addChild(depth2DGeode); + + scaleGeode = new HUDScaleGeode; + scaleGeode->init(); + hudGroup->addChild(scaleGeode); } void @@ -821,6 +834,15 @@ Pixhawk3DWidget::updateHUD(double robotX, double robotY, double robotZ, " " << cursorPosition.second << "]"; statusText->setText(oss.str()); + bool darkBackground = true; + if (mapNode->getImageryType() == Imagery::GOOGLE_MAP) + { + darkBackground = false; + } + + scaleGeode->update(height(), cameraParams.cameraFov, + cameraManipulator->getDistance(), darkBackground); + if (!rgb.isNull()) { rgbImage->setImage(640, 480, 1, diff --git a/src/ui/map3D/Pixhawk3DWidget.h b/src/ui/map3D/Pixhawk3DWidget.h index 21c01bea82..87afd0ca27 100644 --- a/src/ui/map3D/Pixhawk3DWidget.h +++ b/src/ui/map3D/Pixhawk3DWidget.h @@ -34,6 +34,7 @@ #include +#include "HUDScaleGeode.h" #include "Imagery.h" #include "ImageWindowGeode.h" @@ -136,6 +137,7 @@ private: osg::ref_ptr vehicleModel; osg::ref_ptr hudBackgroundGeometry; osg::ref_ptr statusText; + osg::ref_ptr scaleGeode; osg::ref_ptr rgb2DGeode; osg::ref_ptr depth2DGeode; osg::ref_ptr rgbImage; diff --git a/src/ui/map3D/Texture.cc b/src/ui/map3D/Texture.cc index 258ceb17f9..54c3f39461 100644 --- a/src/ui/map3D/Texture.cc +++ b/src/ui/map3D/Texture.cc @@ -127,10 +127,10 @@ Texture::draw(double x1, double y1, double x2, double y2, { osg::Vec3dArray* vertices = static_cast(geometry->getVertexArray()); - (*vertices)[0].set(x1, y1, z - 0.1); - (*vertices)[1].set(x2, y2, z - 0.1); - (*vertices)[2].set(x3, y3, z - 0.1); - (*vertices)[3].set(x4, y4, z - 0.1); + (*vertices)[0].set(x1, y1, z); + (*vertices)[1].set(x2, y2, z); + (*vertices)[2].set(x3, y3, z); + (*vertices)[3].set(x4, y4, z); osg::DrawArrays* drawarrays = static_cast(geometry->getPrimitiveSet(0)); -- GitLab