diff --git a/src/input/Freenect.cc b/src/input/Freenect.cc index 0b5c3edbf4cc322b405bf943506cf1cb1780c96d..d29cf5dde715baf1380173dfc12899f58b452de3 100644 --- a/src/input/Freenect.cc +++ b/src/input/Freenect.cc @@ -197,7 +197,7 @@ Freenect::get3DPointCloudData(void) unsigned short* data = reinterpret_cast(depth); for (int i = 0; i < FREENECT_FRAME_PIX; ++i) { - if (data[i] <= 2048) + if (data[i] > 0 && data[i] <= 2048) { // see www.ros.org/wiki/kinect_node for details double range = 1.0f / (-0.00307f * static_cast(data[i]) + 3.33f); @@ -226,9 +226,9 @@ Freenect::get6DPointCloudData(void) { Vector6D point; - point.x = rawPointCloud[i].x(); - point.y = rawPointCloud[i].y(); - point.z = rawPointCloud[i].z(); + point.x = rawPointCloud.at(i).x(); + point.y = rawPointCloud.at(i).y(); + point.z = rawPointCloud.at(i).z(); QVector4D transformedPoint = transformMatrix * QVector4D(point.x, point.y, point.z, 1.0); diff --git a/src/ui/map3D/GCManipulator.cc b/src/ui/map3D/GCManipulator.cc index 98385365719468fa1f3b41be0a79d968a1d5524b..6f2fb0e7f80bf0496ccf72707de2c132f7793bf4 100644 --- a/src/ui/map3D/GCManipulator.cc +++ b/src/ui/map3D/GCManipulator.cc @@ -33,21 +33,21 @@ This file is part of the QGROUNDCONTROL project GCManipulator::GCManipulator() { - _moveSensitivity = 0.05f; - _zoomSensitivity = 1.0f; - _minZoomRange = 2.0f; + _moveSensitivity = 0.05; + _zoomSensitivity = 1.0; + _minZoomRange = 2.0; } void -GCManipulator::setMinZoomRange(float minZoomRange) +GCManipulator::setMinZoomRange(double minZoomRange) { _minZoomRange = minZoomRange; } void -GCManipulator::move(float dx, float dy, float dz) +GCManipulator::move(double dx, double dy, double dz) { - _center += osg::Vec3(dx, dy, dz); + _center += osg::Vec3d(dx, dy, dz); } bool @@ -126,15 +126,15 @@ GCManipulator::handle(const osgGA::GUIEventAdapter& ea, case GUIEventAdapter::SCROLL: { // zoom model - float scale = 1.0f; + double scale = 1.0; if (ea.getScrollingMotion() == GUIEventAdapter::SCROLL_UP) { - scale -= _zoomSensitivity * 0.1f; + scale -= _zoomSensitivity * 0.1; } else { - scale += _zoomSensitivity * 0.1f; + scale += _zoomSensitivity * 0.1; } if (_distance * scale > _minZoomRange) { @@ -161,12 +161,12 @@ GCManipulator::handle(const osgGA::GUIEventAdapter& ea, } case GUIEventAdapter::KEY_Left: { - float scale = -_moveSensitivity * _distance; + double scale = -_moveSensitivity * _distance; osg::Matrix rotation_matrix; rotation_matrix.makeRotate(_rotation); - osg::Vec3 dv(scale, 0.0f, 0.0f); + osg::Vec3d dv(scale, 0.0, 0.0); _center += dv * rotation_matrix; @@ -174,12 +174,12 @@ GCManipulator::handle(const osgGA::GUIEventAdapter& ea, } case GUIEventAdapter::KEY_Right: { - float scale = _moveSensitivity * _distance; + double scale = _moveSensitivity * _distance; osg::Matrix rotation_matrix; rotation_matrix.makeRotate(_rotation); - osg::Vec3 dv(scale, 0.0f, 0.0f); + osg::Vec3d dv(scale, 0.0, 0.0); _center += dv * rotation_matrix; @@ -187,12 +187,12 @@ GCManipulator::handle(const osgGA::GUIEventAdapter& ea, } case GUIEventAdapter::KEY_Up: { - float scale = _moveSensitivity * _distance; + double scale = _moveSensitivity * _distance; osg::Matrix rotation_matrix; rotation_matrix.makeRotate(_rotation); - osg::Vec3 dv(0.0f, scale, 0.0f); + osg::Vec3d dv(0.0, scale, 0.0); _center += dv * rotation_matrix; @@ -200,12 +200,12 @@ GCManipulator::handle(const osgGA::GUIEventAdapter& ea, } case GUIEventAdapter::KEY_Down: { - float scale = -_moveSensitivity * _distance; + double scale = -_moveSensitivity * _distance; osg::Matrix rotation_matrix; rotation_matrix.makeRotate(_rotation); - osg::Vec3 dv(0.0f, scale, 0.0f); + osg::Vec3d dv(0.0, scale, 0.0); _center += dv * rotation_matrix; @@ -231,7 +231,7 @@ GCManipulator::handle(const osgGA::GUIEventAdapter& ea, bool -GCManipulator::calcMovement() +GCManipulator::calcMovement(void) { using namespace osgGA; @@ -241,11 +241,11 @@ GCManipulator::calcMovement() return false; } - float dx = _ga_t0->getXnormalized() - _ga_t1->getXnormalized(); - float dy = _ga_t0->getYnormalized() - _ga_t1->getYnormalized(); + double dx = _ga_t0->getXnormalized() - _ga_t1->getXnormalized(); + double dy = _ga_t0->getYnormalized() - _ga_t1->getYnormalized(); // return if there is no movement. - if (dx == 0.0f && dy == 0.0f) + if (dx == 0.0 && dy == 0.0) { return false; } @@ -282,12 +282,12 @@ GCManipulator::calcMovement() GUIEventAdapter::RIGHT_MOUSE_BUTTON)) { // pan model - float scale = -_moveSensitivity * _distance; + double scale = -_moveSensitivity * _distance; osg::Matrix rotation_matrix; rotation_matrix.makeRotate(_rotation); - osg::Vec3 dv(dx * scale, dy * scale, 0.0f); + osg::Vec3d dv(dx * scale, dy * scale, 0.0); _center += dv * rotation_matrix; @@ -297,7 +297,7 @@ GCManipulator::calcMovement() else if (buttonMask == GUIEventAdapter::RIGHT_MOUSE_BUTTON) { // zoom model - float scale = 1.0f + dy * _zoomSensitivity; + double scale = 1.0 + dy * _zoomSensitivity; if (_distance * scale > _minZoomRange) { diff --git a/src/ui/map3D/GCManipulator.h b/src/ui/map3D/GCManipulator.h index 87477813a8ecdbf301f9f8fe3fa75fcc8ec38056..e8291abfd85cfdb34c647170cc3843d0876872f9 100644 --- a/src/ui/map3D/GCManipulator.h +++ b/src/ui/map3D/GCManipulator.h @@ -39,9 +39,9 @@ class GCManipulator : public osgGA::TrackballManipulator public: GCManipulator(); - void setMinZoomRange(float minZoomRange); + void setMinZoomRange(double minZoomRange); - virtual void move(float dx, float dy, float dz); + virtual void move(double dx, double dy, double dz); /** * @brief Handle events. @@ -51,11 +51,11 @@ public: osgGA::GUIActionAdapter& us); protected: - bool calcMovement(); + bool calcMovement(void); - float _moveSensitivity; - float _zoomSensitivity; - float _minZoomRange; + double _moveSensitivity; + double _zoomSensitivity; + double _minZoomRange; }; #endif // GCMANIPULATOR_H diff --git a/src/ui/map3D/Imagery.cc b/src/ui/map3D/Imagery.cc index ff9a4d572e50d9582e198a77d87f6b793e7476a3..8a0c22bc3876765247ef5fcbaa4014efd079b9a6 100644 --- a/src/ui/map3D/Imagery.cc +++ b/src/ui/map3D/Imagery.cc @@ -70,6 +70,11 @@ Imagery::prefetch2D(double windowWidth, double windowHeight, double zoom, double xOrigin, double yOrigin, const QString& utmZone) { + if (currentImageryType == BLANK_MAP) + { + return; + } + double tileResolution; if (currentImageryType == GOOGLE_SATELLITE || currentImageryType == GOOGLE_MAP) @@ -115,6 +120,16 @@ Imagery::draw2D(double windowWidth, double windowHeight, double zoom, double xOrigin, double yOrigin, const QString& utmZone) { + if (getNumDrawables() > 0) + { + removeDrawables(0, getNumDrawables()); + } + + if (currentImageryType == BLANK_MAP) + { + return; + } + double tileResolution; if (currentImageryType == GOOGLE_SATELLITE || currentImageryType == GOOGLE_MAP) @@ -144,11 +159,6 @@ Imagery::draw2D(double windowWidth, double windowHeight, yOrigin + windowHeight / 2.0 / zoom * 1.5, utmZone, minTileX, minTileY, maxTileX, maxTileY, zoomLevel); - if (getNumDrawables() > 0) - { - removeDrawables(0, getNumDrawables()); - } - for (int r = minTileY; r <= maxTileY; ++r) { for (int c = minTileX; c <= maxTileX; ++c) @@ -161,10 +171,10 @@ Imagery::draw2D(double windowWidth, double windowHeight, TexturePtr t = textureCache->get(tileURL); if (!t.isNull()) { - addDrawable(t->draw(y1 - yOrigin, x1 - xOrigin, - y2 - yOrigin, x2 - xOrigin, - y3 - yOrigin, x3 - xOrigin, - y4 - yOrigin, x4 - xOrigin, + addDrawable(t->draw(y1, x1, + y2, x2, + y3, x3, + y4, x4, true)); } } @@ -176,6 +186,11 @@ Imagery::prefetch3D(double radius, double tileResolution, double xOrigin, double yOrigin, const QString& utmZone) { + if (currentImageryType == BLANK_MAP) + { + return; + } + int minTileX, minTileY, maxTileX, maxTileY; int zoomLevel; @@ -200,6 +215,16 @@ Imagery::draw3D(double radius, double tileResolution, double xOrigin, double yOrigin, const QString& utmZone) { + if (getNumDrawables() > 0) + { + removeDrawables(0, getNumDrawables()); + } + + if (currentImageryType == BLANK_MAP) + { + return; + } + int minTileX, minTileY, maxTileX, maxTileY; int zoomLevel; @@ -208,11 +233,6 @@ Imagery::draw3D(double radius, double tileResolution, xOrigin + radius, yOrigin + radius, utmZone, minTileX, minTileY, maxTileX, maxTileY, zoomLevel); - if (getNumDrawables() > 0) - { - removeDrawables(0, getNumDrawables()); - } - for (int r = minTileY; r <= maxTileY; ++r) { for (int c = minTileX; c <= maxTileX; ++c) @@ -226,10 +246,10 @@ Imagery::draw3D(double radius, double tileResolution, if (!t.isNull()) { - addDrawable(t->draw(y1 - yOrigin, x1 - xOrigin, - y2 - yOrigin, x2 - xOrigin, - y3 - yOrigin, x3 - xOrigin, - y4 - yOrigin, x4 - xOrigin, + addDrawable(t->draw(y1, x1, + y2, x2, + y3, x3, + y4, x4, true)); } } @@ -563,7 +583,7 @@ Imagery::UTMtoLL(double utmNorthing, double utmEasting, const QString& utmZone, * D * D * D * D * D / 120.0) / cos(phi1Rad); longitude = LongOrigin + longitude / M_PI * 180.0; } -#include + QString Imagery::getTileLocation(int tileX, int tileY, int zoomLevel, double tileResolution) const diff --git a/src/ui/map3D/Pixhawk3DWidget.cc b/src/ui/map3D/Pixhawk3DWidget.cc index 7f63dd7a08ab161b8f3ce0ed5a2ea878854ab83b..a43f64bb6ab01d1632e195f06bcd374e0e97ba3f 100644 --- a/src/ui/map3D/Pixhawk3DWidget.cc +++ b/src/ui/map3D/Pixhawk3DWidget.cc @@ -56,6 +56,7 @@ Pixhawk3DWidget::Pixhawk3DWidget(QWidget* parent) , displayRGBD3D(false) , enableRGBDColor(true) , followCamera(true) + , enableFreenect(false) , lastRobotX(0.0f) , lastRobotY(0.0f) , lastRobotZ(0.0f) @@ -88,12 +89,15 @@ Pixhawk3DWidget::Pixhawk3DWidget(QWidget* parent) #ifdef QGC_LIBFREENECT_ENABLED freenect.reset(new Freenect()); - freenect->init(); + enableFreenect = freenect->init(); #endif // generate RGBD model - rgbd3DNode = createRGBD3D(); - egocentricMap->addChild(rgbd3DNode); + if (enableFreenect) + { + rgbd3DNode = createRGBD3D(); + egocentricMap->addChild(rgbd3DNode); + } setupHUD(); @@ -174,6 +178,15 @@ void Pixhawk3DWidget::selectMapSource(int index) { mapNode->setImageryType(static_cast(index)); + + if (mapNode->getImageryType() == Imagery::BLANK_MAP) + { + displayImagery = false; + } + else + { + displayImagery = true; + } } void @@ -187,7 +200,7 @@ Pixhawk3DWidget::selectVehicleModel(int index) void Pixhawk3DWidget::recenter(void) { - float robotX = 0.0f, robotY = 0.0f, robotZ = 0.0f; + double robotX = 0.0f, robotY = 0.0f, robotZ = 0.0f; if (uas != NULL) { robotX = uas->getLocalX(); @@ -345,12 +358,12 @@ Pixhawk3DWidget::display(void) return; } - float robotX = uas->getLocalX(); - float robotY = uas->getLocalY(); - float robotZ = uas->getLocalZ(); - float robotRoll = uas->getRoll(); - float robotPitch = uas->getPitch(); - float robotYaw = uas->getYaw(); + double robotX = uas->getLocalX(); + double robotY = uas->getLocalY(); + double robotZ = uas->getLocalZ(); + double robotRoll = uas->getRoll(); + double robotPitch = uas->getPitch(); + double robotYaw = uas->getYaw(); if (lastRobotX == 0.0f && lastRobotY == 0.0f && lastRobotZ == 0.0f) { @@ -365,17 +378,17 @@ Pixhawk3DWidget::display(void) if (followCamera) { - float dx = robotY - lastRobotY; - float dy = robotX - lastRobotX; - float dz = lastRobotZ - robotZ; + double dx = robotY - lastRobotY; + double dy = robotX - lastRobotX; + double dz = lastRobotZ - robotZ; moveCamera(dx, dy, dz); } - robotPosition->setPosition(osg::Vec3(robotY, robotX, -robotZ)); - robotAttitude->setAttitude(osg::Quat(-robotYaw, osg::Vec3f(0.0f, 0.0f, 1.0f), - robotPitch, osg::Vec3f(1.0f, 0.0f, 0.0f), - robotRoll, osg::Vec3f(0.0f, 1.0f, 0.0f))); + robotPosition->setPosition(osg::Vec3d(robotY, robotX, -robotZ)); + robotAttitude->setAttitude(osg::Quat(-robotYaw, osg::Vec3d(0.0f, 0.0f, 1.0f), + robotPitch, osg::Vec3d(1.0f, 0.0f, 0.0f), + robotRoll, osg::Vec3d(0.0f, 1.0f, 0.0f))); if (displayTrail) { @@ -398,7 +411,7 @@ Pixhawk3DWidget::display(void) } #ifdef QGC_LIBFREENECT_ENABLED - if (displayRGBD2D || displayRGBD3D) + if (enableFreenect && (displayRGBD2D || displayRGBD3D)) { updateRGBD(); } @@ -409,10 +422,13 @@ Pixhawk3DWidget::display(void) rollingMap->setChildValue(gridNode, displayGrid); rollingMap->setChildValue(trailNode, displayTrail); + allocentricMap->setChildValue(mapNode, displayImagery); rollingMap->setChildValue(targetNode, displayTarget); rollingMap->setChildValue(waypointsNode, displayWaypoints); - egocentricMap->setChildValue(rgbd3DNode, displayRGBD3D); - allocentricMap->setChildValue(mapNode, displayImagery); + if (enableFreenect) + { + egocentricMap->setChildValue(rgbd3DNode, displayRGBD3D); + } hudGroup->setChildValue(rgb2DGeode, displayRGBD2D); hudGroup->setChildValue(depth2DGeode, displayRGBD2D); @@ -437,9 +453,6 @@ Pixhawk3DWidget::keyPressEvent(QKeyEvent* event) case 'c': case 'C': enableRGBDColor = !enableRGBDColor; break; - case 'i': case 'I': - displayImagery = !displayImagery; - break; } } @@ -531,7 +544,7 @@ Pixhawk3DWidget::createTrail(void) trailGeometry->setUseDisplayList(false); geode->addDrawable(trailGeometry.get()); - trailVertices = new osg::Vec3Array; + trailVertices = new osg::Vec3dArray; trailGeometry->setVertexArray(trailVertices); trailDrawArrays = new osg::DrawArrays(osg::PrimitiveSet::LINE_STRIP); @@ -677,8 +690,8 @@ Pixhawk3DWidget::resizeHUD(void) } void -Pixhawk3DWidget::updateHUD(float robotX, float robotY, float robotZ, - float robotRoll, float robotPitch, float robotYaw) +Pixhawk3DWidget::updateHUD(double robotX, double robotY, double robotZ, + double robotRoll, double robotPitch, double robotYaw) { resizeHUD(); @@ -715,7 +728,7 @@ Pixhawk3DWidget::updateHUD(float robotX, float robotY, float robotZ, } void -Pixhawk3DWidget::updateTrail(float robotX, float robotY, float robotZ) +Pixhawk3DWidget::updateTrail(double robotX, double robotY, double robotZ) { if (robotX == 0.0f || robotY == 0.0f || robotZ == 0.0f) { @@ -725,9 +738,9 @@ Pixhawk3DWidget::updateTrail(float robotX, float robotY, float robotZ) bool addToTrail = false; if (trail.size() > 0) { - if (fabsf(robotX - trail[trail.size() - 1].x()) > 0.01f || - fabsf(robotY - trail[trail.size() - 1].y()) > 0.01f || - fabsf(robotZ - trail[trail.size() - 1].z()) > 0.01f) + if (fabs(robotX - trail[trail.size() - 1].x()) > 0.01f || + fabs(robotY - trail[trail.size() - 1].y()) > 0.01f || + fabs(robotZ - trail[trail.size() - 1].z()) > 0.01f) { addToTrail = true; } @@ -739,11 +752,11 @@ Pixhawk3DWidget::updateTrail(float robotX, float robotY, float robotZ) if (addToTrail) { - osg::Vec3 p(robotX, robotY, robotZ); + osg::Vec3d p(robotX, robotY, robotZ); if (trail.size() == trail.capacity()) { memcpy(trail.data(), trail.data() + 1, - (trail.size() - 1) * sizeof(osg::Vec3)); + (trail.size() - 1) * sizeof(osg::Vec3d)); trail[trail.size() - 1] = p; } else @@ -755,9 +768,9 @@ Pixhawk3DWidget::updateTrail(float robotX, float robotY, float robotZ) trailVertices->clear(); for (int i = 0; i < trail.size(); ++i) { - trailVertices->push_back(osg::Vec3(trail[i].y() - robotY, - trail[i].x() - robotX, - -(trail[i].z() - robotZ))); + trailVertices->push_back(osg::Vec3d(trail[i].y() - robotY, + trail[i].x() - robotX, + -(trail[i].z() - robotZ))); } trailDrawArrays->setFirst(0); @@ -768,6 +781,11 @@ Pixhawk3DWidget::updateTrail(float robotX, float robotY, float robotZ) void Pixhawk3DWidget::updateImagery(void) { + if (mapNode->getImageryType() == Imagery::BLANK_MAP) + { + return; + } + char zone[5] = "32T"; double viewingRadius = cameraManipulator->getDistance() * 10.0; @@ -777,7 +795,7 @@ Pixhawk3DWidget::updateImagery(void) } double minResolution = 0.25; - double centerResolution = cameraManipulator->getDistance() / 25.0; + double centerResolution = cameraManipulator->getDistance() / 50.0; double maxResolution = 1048576.0; Imagery::ImageryType imageryType = mapNode->getImageryType(); @@ -1100,7 +1118,7 @@ Pixhawk3DWidget::updateRGBD(void) void Pixhawk3DWidget::markTarget(void) { - float robotZ = 0.0f; + double robotZ = 0.0f; if (uas != NULL) { robotZ = uas->getLocalZ(); diff --git a/src/ui/map3D/Pixhawk3DWidget.h b/src/ui/map3D/Pixhawk3DWidget.h index 182326dd1de2516d1b7191f3aab540a389c5c8e8..b7e251a857a40d350275959347e79417cc096c94 100644 --- a/src/ui/map3D/Pixhawk3DWidget.h +++ b/src/ui/map3D/Pixhawk3DWidget.h @@ -88,9 +88,9 @@ private: void setupHUD(void); void resizeHUD(void); - void updateHUD(float robotX, float robotY, float robotZ, - float robotRoll, float robotPitch, float robotYaw); - void updateTrail(float robotX, float robotY, float robotZ); + void updateHUD(double robotX, double robotY, double robotZ, + double robotRoll, double robotPitch, double robotYaw); + void updateTrail(double robotX, double robotY, double robotZ); void updateImagery(void); void updateTarget(void); void updateWaypoints(void); @@ -111,8 +111,8 @@ private: bool followCamera; - osg::ref_ptr trailVertices; - QVarLengthArray trail; + osg::ref_ptr trailVertices; + QVarLengthArray trail; osg::ref_ptr vehicleModel; osg::ref_ptr hudBackgroundGeometry; @@ -134,6 +134,7 @@ private: QScopedPointer freenect; QVector pointCloud; #endif + bool enableFreenect; QSharedPointer rgb; QSharedPointer coloredDepth; @@ -141,7 +142,7 @@ private: QPushButton* targetButton; - float lastRobotX, lastRobotY, lastRobotZ; + double lastRobotX, lastRobotY, lastRobotZ; }; #endif // PIXHAWK3DWIDGET_H diff --git a/src/ui/map3D/Q3DWidget.cc b/src/ui/map3D/Q3DWidget.cc index 21300459923b90d477531cf7545424936d62e799..6c9de7149913fb6e5d7b1201def5fdd7ffd1f419 100644 --- a/src/ui/map3D/Q3DWidget.cc +++ b/src/ui/map3D/Q3DWidget.cc @@ -181,13 +181,13 @@ Q3DWidget::setCameraParams(float minZoomRange, float cameraFov, } void -Q3DWidget::moveCamera(float dx, float dy, float dz) +Q3DWidget::moveCamera(double dx, double dy, double dz) { cameraManipulator->move(dx, dy, dz); } void -Q3DWidget::recenterCamera(float x, float y, float z) +Q3DWidget::recenterCamera(double x, double y, double z) { cameraManipulator->setCenter(osg::Vec3d(x, y, z)); } @@ -385,18 +385,6 @@ Q3DWidget::wheelEvent(QWheelEvent* event) osgGA::GUIEventAdapter::SCROLL_DOWN); } -float -Q3DWidget::r2d(float angle) -{ - return angle * 57.295779513082320876f; -} - -float -Q3DWidget::d2r(float angle) -{ - return angle * 0.0174532925199432957692f; -} - osgGA::GUIEventAdapter::KeySymbol Q3DWidget::convertKey(int key) const { diff --git a/src/ui/map3D/Q3DWidget.h b/src/ui/map3D/Q3DWidget.h index 0dcd8d91f1716e129a7b7fcfb45f2fa2403c92d7..a8a0b368aeb1187fc7ded88c69545b9414fc1bed 100644 --- a/src/ui/map3D/Q3DWidget.h +++ b/src/ui/map3D/Q3DWidget.h @@ -88,12 +88,12 @@ public: * @param dy Translation along the y-axis in meters. * @param dz Translation along the z-axis in meters. */ - void moveCamera(float dx, float dy, float dz); + void moveCamera(double dx, double dy, double dz); /** * @brief Recenters the camera at (x,y,z). */ - void recenterCamera(float x, float y, float z); + void recenterCamera(double x, double y, double z); /** * @brief Sets up 3D display mode. @@ -211,20 +211,6 @@ protected: */ virtual void wheelEvent(QWheelEvent* event); - /** - * @brief Converts radians to degrees. - * @param angle Angle in radians. - * @return angle in degrees. - */ - float r2d(float angle); - - /** - * @brief Converts degrees to radians. - * @param angle Angle in degrees. - * @return angle in radians. - */ - float d2r(float angle); - /** * @brief Converts Qt-defined key to OSG-defined key. * @param key Qt-defined key. diff --git a/src/ui/map3D/Texture.cc b/src/ui/map3D/Texture.cc index f307c0a8e9d094e2cf40205e91547535109bb05a..63b6c7a6f1dba11414e8e64d26251d7be6ec72d0 100644 --- a/src/ui/map3D/Texture.cc +++ b/src/ui/map3D/Texture.cc @@ -47,7 +47,7 @@ Texture::Texture(unsigned int _id) osg::ref_ptr image = new osg::Image; texture2D->setImage(image); - osg::ref_ptr vertices(new osg::Vec2Array(4)); + osg::ref_ptr vertices(new osg::Vec3dArray(4)); geometry->setVertexArray(vertices); osg::ref_ptr textureCoords = new osg::Vec2Array; @@ -55,7 +55,7 @@ Texture::Texture(unsigned int _id) 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)); - geometry->setTexCoordArray(id, textureCoords); + geometry->setTexCoordArray(0, textureCoords); geometry->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::LINES, 0, 4)); @@ -66,6 +66,13 @@ Texture::Texture(unsigned int _id) geometry->setColorBinding(osg::Geometry::BIND_OVERALL); geometry->setUseDisplayList(false); + + osg::ref_ptr linewidth(new osg::LineWidth); + linewidth->setWidth(2.0f); + geometry->getOrCreateStateSet()-> + setAttributeAndModes(linewidth, osg::StateAttribute::ON); + geometry->getOrCreateStateSet()-> + setMode(GL_LIGHTING, osg::StateAttribute::OFF); } const QString& @@ -94,8 +101,8 @@ Texture::sync(const WebImagePtr& image) texture2D->getImage()->setImage(image->getWidth(), image->getHeight(), 1, - GL_RGB, - GL_RGB, + GL_RGBA, + GL_RGBA, GL_UNSIGNED_BYTE, image->getImageData(), osg::Image::NO_DELETE); @@ -105,23 +112,23 @@ Texture::sync(const WebImagePtr& image) } osg::ref_ptr -Texture::draw(float x1, float y1, float x2, float y2, +Texture::draw(double x1, double y1, double x2, double y2, bool smoothInterpolation) const { return draw(x1, y1, x2, y1, x2, y2, x1, y2, smoothInterpolation); } osg::ref_ptr -Texture::draw(float x1, float y1, float x2, float y2, - float x3, float y3, float x4, float y4, +Texture::draw(double x1, double y1, double x2, double y2, + double x3, double y3, double x4, double y4, bool smoothInterpolation) const { - osg::Vec2Array* vertices = - static_cast(geometry->getVertexArray()); - (*vertices)[0].set(x1, y1); - (*vertices)[1].set(x2, y2); - (*vertices)[2].set(x3, y3); - (*vertices)[3].set(x4, y4); + osg::Vec3dArray* vertices = + static_cast(geometry->getVertexArray()); + (*vertices)[0].set(x1, y1, -0.1); + (*vertices)[1].set(x2, y2, -0.1); + (*vertices)[2].set(x3, y3, -0.1); + (*vertices)[3].set(x4, y4, -0.1); osg::DrawArrays* drawarrays = static_cast(geometry->getPrimitiveSet(0)); @@ -130,11 +137,11 @@ Texture::draw(float x1, float y1, float x2, float y2, if (state == REQUESTED) { - drawarrays->set(osg::PrimitiveSet::LINES, 0, 4); + drawarrays->set(osg::PrimitiveSet::LINE_LOOP, 0, 4); (*colors)[0].set(0.0f, 0.0f, 1.0f, 1.0f); geometry->getOrCreateStateSet()-> - setTextureAttributeAndModes(id, texture2D, osg::StateAttribute::OFF); + setTextureAttributeAndModes(0, texture2D, osg::StateAttribute::OFF); return geometry; } @@ -154,7 +161,7 @@ Texture::draw(float x1, float y1, float x2, float y2, (*colors)[0].set(1.0f, 1.0f, 1.0f, 1.0f); geometry->getOrCreateStateSet()-> - setTextureAttributeAndModes(id, texture2D, osg::StateAttribute::ON); + setTextureAttributeAndModes(0, texture2D, osg::StateAttribute::ON); return geometry; } diff --git a/src/ui/map3D/Texture.h b/src/ui/map3D/Texture.h index 9be6f53f26863fdd916eda323e181f10ed60b1f1..095fb13f78dde5e0c20e749de85c795449cfb8ad 100644 --- a/src/ui/map3D/Texture.h +++ b/src/ui/map3D/Texture.h @@ -51,10 +51,10 @@ public: void sync(const WebImagePtr& image); - osg::ref_ptr draw(float x1, float y1, float x2, float y2, + osg::ref_ptr draw(double x1, double y1, double x2, double y2, bool smoothInterpolation) const; - osg::ref_ptr draw(float x1, float y1, float x2, float y2, - float x3, float y3, float x4, float y4, + osg::ref_ptr draw(double x1, double y1, double x2, double y2, + double x3, double y3, double x4, double y4, bool smoothInterpolation) const; private: