Commit 64a56635 authored by Lionel Heng's avatar Lionel Heng

Re-implemented 3D imagery feature in OSG. Still a few outstanding issues to resolve.

parent 2adb1f82
......@@ -230,8 +230,6 @@ HEADERS += src/MG.h \
src/ui/RadioCalibration/CurveCalibrator.h \
src/ui/RadioCalibration/AbstractCalibrator.h \
src/comm/QGCMAVLink.h
contains(DEPENDENCIES_PRESENT, osg) {
message("Including headers for OpenSceneGraph")
......@@ -242,23 +240,25 @@ contains(DEPENDENCIES_PRESENT, osg) {
src/ui/map3D/QOSGWidget.h \
src/ui/map3D/PixhawkCheetahGeode.h \
src/ui/map3D/Pixhawk3DWidget.h \
src/ui/map3D/Q3DWidgetFactory.h
contains(DEPENDENCIES_PRESENT, osgearth) {
message("Including headers for OSGEARTH")
# Enable only if OpenSceneGraph is available
HEADERS += src/ui/map3D/QMap3D.h
}
src/ui/map3D/Q3DWidgetFactory.h \
src/ui/map3D/WebImageCache.h \
src/ui/map3D/WebImage.h \
src/ui/map3D/TextureCache.h \
src/ui/map3D/Texture.h \
src/ui/map3D/Imagery.h
contains(DEPENDENCIES_PRESENT, osgearth) {
message("Including headers for OSGEARTH")
# Enable only if OpenSceneGraph is available
HEADERS += src/ui/map3D/QMap3D.h
}
}
contains(DEPENDENCIES_PRESENT, libfreenect) {
message("Including headers for libfreenect")
# Enable only if libfreenect is available
HEADERS += src/input/Freenect.h
}
SOURCES += src/main.cc \
src/Core.cc \
src/uas/UASManager.cc \
......@@ -328,38 +328,35 @@ SOURCES += src/main.cc \
src/ui/RadioCalibration/CurveCalibrator.cc \
src/ui/RadioCalibration/AbstractCalibrator.cc \
src/ui/RadioCalibration/RadioCalibrationData.cc
contains(DEPENDENCIES_PRESENT, osg) {
message("Including sources for OpenSceneGraph")
# Enable only if OpenSceneGraph is available
SOURCES += src/ui/map3D/Q3DWidget.cc \
src/ui/map3D/ImageWindowGeode.cc \
src/ui/map3D/GCManipulator.cc \
src/ui/map3D/QOSGWidget.cc \
src/ui/map3D/ImageWindowGeode.cc \
src/ui/map3D/GCManipulator.cc \
src/ui/map3D/QOSGWidget.cc \
src/ui/map3D/PixhawkCheetahGeode.cc \
src/ui/map3D/Pixhawk3DWidget.cc \
src/ui/map3D/Q3DWidgetFactory.cc
contains(DEPENDENCIES_PRESENT, osgearth) {
message("Including sources for osgEarth")
# Enable only if OpenSceneGraph is available
SOURCES += src/ui/map3D/QMap3D.cc
}
src/ui/map3D/Q3DWidgetFactory.cc \
src/ui/map3D/WebImageCache.cc \
src/ui/map3D/WebImage.cc \
src/ui/map3D/TextureCache.cc \
src/ui/map3D/Texture.cc \
src/ui/map3D/Imagery.cc
contains(DEPENDENCIES_PRESENT, osgearth) {
message("Including sources for osgEarth")
# Enable only if OpenSceneGraph is available
SOURCES += src/ui/map3D/QMap3D.cc
}
}
contains(DEPENDENCIES_PRESENT, libfreenect) {
contains(DEPENDENCIES_PRESENT, libfreenect) {
message("Including sources for libfreenect")
# Enable only if libfreenect is available
SOURCES += src/input/Freenect.cc
}
RESOURCES += mavground.qrc
# Include RT-LAB Library
......
......@@ -46,6 +46,12 @@ Imagery::Imagery()
}
Imagery::ImageryType
Imagery::getImageryType(void) const
{
return currentImageryType;
}
void
Imagery::setImageryType(ImageryType type)
{
......@@ -62,7 +68,6 @@ Imagery::setOffset(double xOffset, double yOffset)
void
Imagery::prefetch2D(double windowWidth, double windowHeight,
double zoom, double xOrigin, double yOrigin,
double viewXOffset, double viewYOffset,
const QString& utmZone)
{
double tileResolution;
......@@ -88,10 +93,10 @@ Imagery::prefetch2D(double windowWidth, double windowHeight,
int zoomLevel;
tileBounds(tileResolution,
xOrigin + viewXOffset - windowWidth / 2.0 / zoom,
yOrigin + viewYOffset - windowHeight / 2.0 / zoom,
xOrigin + viewXOffset + windowWidth / 2.0 / zoom,
yOrigin + viewYOffset + windowHeight / 2.0 / zoom, utmZone,
xOrigin - windowWidth / 2.0 / zoom * 1.5,
yOrigin - windowHeight / 2.0 / zoom * 1.5,
xOrigin + windowWidth / 2.0 / zoom * 1.5,
yOrigin + windowHeight / 2.0 / zoom * 1.5, utmZone,
minTileX, minTileY, maxTileX, maxTileY, zoomLevel);
for (int r = minTileY; r <= maxTileY; ++r)
......@@ -108,7 +113,6 @@ Imagery::prefetch2D(double windowWidth, double windowHeight,
void
Imagery::draw2D(double windowWidth, double windowHeight,
double zoom, double xOrigin, double yOrigin,
double viewXOffset, double viewYOffset,
const QString& utmZone)
{
double tileResolution;
......@@ -134,12 +138,17 @@ Imagery::draw2D(double windowWidth, double windowHeight,
int zoomLevel;
tileBounds(tileResolution,
xOrigin + viewXOffset - windowWidth / 2.0 / zoom * 1.5,
yOrigin + viewYOffset - windowHeight / 2.0 / zoom * 1.5,
xOrigin + viewXOffset + windowWidth / 2.0 / zoom * 1.5,
yOrigin + viewYOffset + windowHeight / 2.0 / zoom * 1.5, utmZone,
xOrigin - windowWidth / 2.0 / zoom * 1.5,
yOrigin - windowHeight / 2.0 / zoom * 1.5,
xOrigin + windowWidth / 2.0 / zoom * 1.5,
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)
......@@ -152,10 +161,11 @@ Imagery::draw2D(double windowWidth, double windowHeight,
TexturePtr t = textureCache->get(tileURL);
if (!t.isNull())
{
t->draw(x1 - xOrigin, y1 - yOrigin,
x2 - xOrigin, y2 - yOrigin,
x3 - xOrigin, y3 - yOrigin,
x4 - xOrigin, y4 - yOrigin, true);
addDrawable(t->draw(y1 - yOrigin, x1 - xOrigin,
y2 - yOrigin, x2 - xOrigin,
y3 - yOrigin, x3 - xOrigin,
y4 - yOrigin, x4 - xOrigin,
true));
}
}
}
......@@ -164,17 +174,14 @@ Imagery::draw2D(double windowWidth, double windowHeight,
void
Imagery::prefetch3D(double radius, double tileResolution,
double xOrigin, double yOrigin,
double viewXOffset, double viewYOffset,
const QString& utmZone, bool useHeightModel)
const QString& utmZone)
{
int minTileX, minTileY, maxTileX, maxTileY;
int zoomLevel;
tileBounds(tileResolution,
xOrigin + viewXOffset - radius,
yOrigin + viewYOffset - radius,
xOrigin + viewXOffset + radius,
yOrigin + viewYOffset + radius, utmZone,
xOrigin - radius, yOrigin - radius,
xOrigin + radius, yOrigin + radius, utmZone,
minTileX, minTileY, maxTileX, maxTileY, zoomLevel);
for (int r = minTileY; r <= maxTileY; ++r)
......@@ -183,7 +190,7 @@ Imagery::prefetch3D(double radius, double tileResolution,
{
QString url = getTileLocation(c, r, zoomLevel, tileResolution);
TexturePtr t = textureCache->get(url, useHeightModel);
TexturePtr t = textureCache->get(url);
}
}
}
......@@ -191,19 +198,21 @@ Imagery::prefetch3D(double radius, double tileResolution,
void
Imagery::draw3D(double radius, double tileResolution,
double xOrigin, double yOrigin,
double viewXOffset, double viewYOffset,
const QString& utmZone, bool useHeightModel)
const QString& utmZone)
{
int minTileX, minTileY, maxTileX, maxTileY;
int zoomLevel;
tileBounds(tileResolution,
xOrigin + viewXOffset - radius,
yOrigin + viewYOffset - radius,
xOrigin + viewXOffset + radius,
yOrigin + viewYOffset + radius, utmZone,
xOrigin - radius, yOrigin - radius,
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)
......@@ -213,14 +222,15 @@ Imagery::draw3D(double radius, double tileResolution,
double x1, y1, x2, y2, x3, y3, x4, y4;
imageBounds(c, r, tileResolution, x1, y1, x2, y2, x3, y3, x4, y4);
TexturePtr t = textureCache->get(tileURL, useHeightModel);
TexturePtr t = textureCache->get(tileURL);
if (!t.isNull())
{
t->draw(x1 - xOrigin, y1 - yOrigin,
x2 - xOrigin, y2 - yOrigin,
x3 - xOrigin, y3 - yOrigin,
x4 - xOrigin, y4 - yOrigin, true);
addDrawable(t->draw(y1 - yOrigin, x1 - xOrigin,
y2 - yOrigin, x2 - xOrigin,
y3 - yOrigin, x3 - xOrigin,
y4 - yOrigin, x4 - xOrigin,
true));
}
}
}
......@@ -257,8 +267,7 @@ Imagery::imageBounds(int tileX, int tileY, double tileResolution,
LLtoUTM(lat2, lon2, x3, y3, utmZone);
LLtoUTM(lat2, lon1, x4, y4, utmZone);
}
else if (currentImageryType == SWISSTOPO_SATELLITE ||
currentImageryType == SWISSTOPO_SATELLITE_3D)
else if (currentImageryType == SWISSTOPO_SATELLITE)
{
double utmMultiplier = tileResolution * 200.0;
double minX = tileX * utmMultiplier;
......@@ -295,8 +304,7 @@ Imagery::tileBounds(double tileResolution,
UTMtoTile(maxUtmX, maxUtmY, utmZone, tileResolution,
maxTileX, minTileY, zoomLevel);
}
else if (currentImageryType == SWISSTOPO_SATELLITE ||
currentImageryType == SWISSTOPO_SATELLITE_3D)
else if (currentImageryType == SWISSTOPO_SATELLITE)
{
double utmMultiplier = tileResolution * 200;
......@@ -555,7 +563,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 <QDebug>
QString
Imagery::getTileLocation(int tileX, int tileY, int zoomLevel,
double tileResolution) const
......@@ -572,7 +580,7 @@ Imagery::getTileLocation(int tileX, int tileY, int zoomLevel,
oss << "http://khm.google.com/vt/lbw/lyrs=y&x=" << tileX
<< "&y=" << tileY << "&z=" << zoomLevel;
break;
case SWISSTOPO_SATELLITE: case SWISSTOPO_SATELLITE_3D:
case SWISSTOPO_SATELLITE:
oss << "../map/eth_zurich_swissimage_025/200/color/" << tileY
<< "/tile-";
if (tileResolution < 1.0)
......
......@@ -32,44 +32,42 @@ This file is part of the QGROUNDCONTROL project
#ifndef IMAGERY_H
#define IMAGERY_H
#include <osg/Geode>
#include <QScopedPointer>
#include <QString>
#include "TextureCache.h"
class Imagery
class Imagery : public osg::Geode
{
public:
enum ImageryType
{
GOOGLE_MAP = 0,
GOOGLE_SATELLITE = 1,
SWISSTOPO_SATELLITE = 2,
SWISSTOPO_SATELLITE_3D = 3
BLANK_MAP = 0,
GOOGLE_MAP = 1,
GOOGLE_SATELLITE = 2,
SWISSTOPO_SATELLITE = 3
};
Imagery();
ImageryType getImageryType(void) const;
void setImageryType(ImageryType type);
void setOffset(double xOffset, double yOffset);
void prefetch2D(double windowWidth, double windowHeight,
double zoom, double xOrigin, double yOrigin,
double viewXOffset, double viewYOffset,
const QString& utmZone);
void draw2D(double windowWidth, double windowHeight,
double zoom, double xOrigin, double yOrigin,
double viewXOffset, double viewYOffset,
const QString& utmZone);
void prefetch3D(double radius, double tileResolution,
double xOrigin, double yOrigin,
double viewXOffset, double viewYOffset,
const QString& utmZone, bool useHeightModel);
const QString& utmZone);
void draw3D(double radius, double tileResolution,
double xOrigin, double yOrigin,
double viewXOffset, double viewYOffset,
const QString& utmZone, bool useHeightModel);
const QString& utmZone);
bool update(void);
......
......@@ -49,6 +49,7 @@ Pixhawk3DWidget::Pixhawk3DWidget(QWidget* parent)
, uas(NULL)
, displayGrid(true)
, displayTrail(false)
, displayImagery(true)
, displayTarget(false)
, displayWaypoints(true)
, displayRGBD2D(false)
......@@ -74,11 +75,9 @@ Pixhawk3DWidget::Pixhawk3DWidget(QWidget* parent)
trailNode = createTrail();
rollingMap->addChild(trailNode);
#ifdef QGC_OSGEARTH_ENABLED
// generate map model
mapNode = createMap();
root->addChild(mapNode);
#endif
allocentricMap->addChild(mapNode);
// generate target model
allocentricMap->addChild(createTarget());
......@@ -171,6 +170,12 @@ Pixhawk3DWidget::showWaypoints(int state)
}
}
void
Pixhawk3DWidget::selectMapSource(int index)
{
mapNode->setImageryType(static_cast<Imagery::ImageryType>(index));
}
void
Pixhawk3DWidget::selectVehicleModel(int index)
{
......@@ -205,7 +210,7 @@ Pixhawk3DWidget::toggleFollowCamera(int32_t state)
followCamera = false;
}
}
#include <osgDB/WriteFile>
QVector< osg::ref_ptr<osg::Node> >
Pixhawk3DWidget::findVehicleModels(void)
{
......@@ -273,6 +278,12 @@ Pixhawk3DWidget::buildLayout(void)
waypointsCheckBox->setText("Waypoints");
waypointsCheckBox->setChecked(displayWaypoints);
QLabel* mapLabel = new QLabel("Map", this);
QComboBox* mapComboBox = new QComboBox(this);
mapComboBox->addItem("None");
mapComboBox->addItem("Map (Google)");
mapComboBox->addItem("Satellite (Google)");
QLabel* modelLabel = new QLabel("Vehicle Model", this);
QComboBox* modelComboBox = new QComboBox(this);
for (int i = 0; i < vehicleModels.size(); ++i)
......@@ -299,12 +310,14 @@ Pixhawk3DWidget::buildLayout(void)
layout->addWidget(trailCheckBox, 1, 1);
layout->addWidget(waypointsCheckBox, 1, 2);
layout->addItem(new QSpacerItem(10, 0, QSizePolicy::Expanding, QSizePolicy::Expanding), 1, 3);
layout->addWidget(modelLabel, 1, 4);
layout->addWidget(modelComboBox, 1, 5);
layout->addWidget(targetButton, 1, 6);
layout->addItem(new QSpacerItem(10, 0, QSizePolicy::Expanding, QSizePolicy::Expanding), 1, 7);
layout->addWidget(recenterButton, 1, 8);
layout->addWidget(followCameraCheckBox, 1, 9);
layout->addWidget(mapLabel, 1, 4);
layout->addWidget(mapComboBox, 1, 5);
layout->addWidget(modelLabel, 1, 6);
layout->addWidget(modelComboBox, 1, 7);
layout->addWidget(targetButton, 1, 8);
layout->addItem(new QSpacerItem(10, 0, QSizePolicy::Expanding, QSizePolicy::Expanding), 1, 9);
layout->addWidget(recenterButton, 1, 10);
layout->addWidget(followCameraCheckBox, 1, 11);
layout->setRowStretch(0, 100);
layout->setRowStretch(1, 1);
setLayout(layout);
......@@ -315,6 +328,8 @@ Pixhawk3DWidget::buildLayout(void)
this, SLOT(showTrail(int)));
connect(waypointsCheckBox, SIGNAL(stateChanged(int)),
this, SLOT(showWaypoints(int)));
connect(mapComboBox, SIGNAL(currentIndexChanged(int)),
this, SLOT(selectMapSource(int)));
connect(modelComboBox, SIGNAL(currentIndexChanged(int)),
this, SLOT(selectVehicleModel(int)));
connect(recenterButton, SIGNAL(clicked()), this, SLOT(recenter()));
......@@ -362,20 +377,42 @@ Pixhawk3DWidget::display(void)
robotPitch, osg::Vec3f(1.0f, 0.0f, 0.0f),
robotRoll, osg::Vec3f(0.0f, 1.0f, 0.0f)));
updateTrail(robotX, robotY, robotZ);
updateTarget();
updateWaypoints();
if (displayTrail)
{
updateTrail(robotX, robotY, robotZ);
}
if (displayImagery)
{
updateImagery();
}
if (displayTarget)
{
updateTarget();
}
if (displayWaypoints)
{
updateWaypoints();
}
#ifdef QGC_LIBFREENECT_ENABLED
updateRGBD();
if (displayRGBD2D || displayRGBD3D)
{
updateRGBD();
}
#endif
updateHUD(robotX, robotY, robotZ, robotRoll, robotPitch, robotYaw);
// set node visibility
rollingMap->setChildValue(gridNode, displayGrid);
rollingMap->setChildValue(trailNode, displayTrail);
rollingMap->setChildValue(targetNode, displayTarget);
rollingMap->setChildValue(waypointsNode, displayWaypoints);
egocentricMap->setChildValue(rgbd3DNode, displayRGBD3D);
allocentricMap->setChildValue(mapNode, displayImagery);
hudGroup->setChildValue(rgb2DGeode, displayRGBD2D);
hudGroup->setChildValue(depth2DGeode, displayRGBD2D);
......@@ -400,6 +437,9 @@ Pixhawk3DWidget::keyPressEvent(QKeyEvent* event)
case 'c': case 'C':
enableRGBDColor = !enableRGBDColor;
break;
case 'i': case 'I':
displayImagery = !displayImagery;
break;
}
}
......@@ -512,16 +552,11 @@ Pixhawk3DWidget::createTrail(void)
return geode;
}
#ifdef QGC_OSGEARTH_ENABLED
osg::ref_ptr<osgEarth::MapNode>
osg::ref_ptr<Imagery>
Pixhawk3DWidget::createMap(void)
{
osg::ref_ptr<osg::Node> model = osgDB::readNodeFile("map.earth");
osg::ref_ptr<osgEarth::MapNode> node = osgEarth::MapNode::findMapNode(model);
return node;
return osg::ref_ptr<Imagery>(new Imagery());
}
#endif
osg::ref_ptr<osg::Node>
Pixhawk3DWidget::createTarget(void)
......@@ -730,6 +765,74 @@ Pixhawk3DWidget::updateTrail(float robotX, float robotY, float robotZ)
trailGeometry->dirtyBound();
}
void
Pixhawk3DWidget::updateImagery(void)
{
char zone[5] = "32T";
double viewingRadius = cameraManipulator->getDistance() * 10.0;
if (viewingRadius < 100.0)
{
viewingRadius = 100.0;
}
double minResolution = 0.25;
double centerResolution = cameraManipulator->getDistance() / 25.0;
double maxResolution = 1048576.0;
Imagery::ImageryType imageryType = mapNode->getImageryType();
switch (imageryType)
{
case Imagery::GOOGLE_MAP:
minResolution = 0.25;
break;
case Imagery::GOOGLE_SATELLITE:
minResolution = 0.5;
break;
case Imagery::SWISSTOPO_SATELLITE:
minResolution = 0.25;
maxResolution = 0.25;
break;
default: {}
}
double resolution = minResolution;
while (resolution * 2.0 < centerResolution)
{
resolution *= 2.0;
}
if (resolution > maxResolution)
{
resolution = maxResolution;
}
mapNode->draw3D(viewingRadius,
resolution,
cameraManipulator->getCenter().y(),
cameraManipulator->getCenter().x(),
zone);
// prefetch map tiles
if (resolution / 2.0 >= minResolution)
{
mapNode->prefetch3D(viewingRadius / 2.0,
resolution / 2.0,
cameraManipulator->getCenter().y(),
cameraManipulator->getCenter().x(),
zone);
}
if (resolution * 2.0 <= maxResolution)
{
mapNode->prefetch3D(viewingRadius * 2.0,
resolution * 2.0,
cameraManipulator->getCenter().y(),
cameraManipulator->getCenter().x(),
zone);
}
mapNode->update();
}
void
Pixhawk3DWidget::updateTarget(void)
{
......
......@@ -33,10 +33,8 @@
#define PIXHAWK3DWIDGET_H
#include <osgText/Text>
#ifdef QGC_OSGEARTH_ENABLED
#include <osgEarth/MapNode>
#endif
#include "Imagery.h"
#include "ImageWindowGeode.h"
#ifdef QGC_LIBFREENECT_ENABLED
......@@ -65,6 +63,7 @@ private slots:
void showGrid(int state);
void showTrail(int state);
void showWaypoints(int state);
void selectMapSource(int index);
void selectVehicleModel(int index);
void recenter(void);
void toggleFollowCamera(int state);
......@@ -81,11 +80,7 @@ protected:
private:
osg::ref_ptr<osg::Geode> createGrid(void);
osg::ref_ptr<osg::Geode> createTrail(void);
#ifdef QGC_OSGEARTH_ENABLED
osg::ref_ptr<osgEarth::MapNode> createMap(void);
#endif
osg::ref_ptr<Imagery> createMap(void);
osg::ref_ptr<osg::Node> createTarget(void);
osg::ref_ptr<osg::Group> createWaypoints(void);
osg::ref_ptr<osg::Geode> createRGBD3D(void);
......@@ -96,6 +91,7 @@ private:
void updateHUD(float robotX, float robotY, float robotZ,
float robotRoll, float robotPitch, float robotYaw);
void updateTrail(float robotX, float robotY, float robotZ);
void updateImagery(void);
void updateTarget(void);
void updateWaypoints(void);
#ifdef QGC_LIBFREENECT_ENABLED
......@@ -106,6 +102,7 @@ private:
bool displayGrid;
bool displayTrail;
bool displayImagery;
bool displayTarget;
bool displayWaypoints;
bool displayRGBD2D;
......@@ -128,9 +125,7 @@ private:
osg::ref_ptr<osg::Geode> trailNode;
osg::ref_ptr<osg::Geometry> trailGeometry;
osg::ref_ptr<osg::DrawArrays> trailDrawArrays;
#ifdef QGC_OSGEARTH_ENABLED
osg::ref_ptr<osgEarth::MapNode> mapNode;
#endif
osg::ref_ptr<Imagery> mapNode;
osg::ref_ptr<osg::Geode> targetNode;
osg::ref_ptr<osg::PositionAttitudeTransform> targetPosition;
osg::ref_ptr<osg::Group> waypointsNode;
......
......@@ -33,18 +33,39 @@ This file is part of the QGROUNDCONTROL project
#include "Texture.h"
Texture::Texture()
: _is3D(false)
Texture::Texture(unsigned int _id)
: id(_id)
, texture2D(new osg::Texture2D)
, geometry(new osg::Geometry)
{
texture2D->setFilter(osg::Texture::MIN_FILTER, osg::Texture::NEAREST);
texture2D->setFilter(osg::Texture::MAG_FILTER, osg::Texture::NEAREST);
GLuint id;
glGenTextures(1, &id);
t->setID(id);
glBindTexture(GL_TEXTURE_2D, id);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
texture2D->setDataVariance(osg::Object::DYNAMIC);
texture2D->setResizeNonPowerOfTwoHint(false);
osg::ref_ptr<osg::Image> image = new osg::Image;
texture2D->setImage(image);
osg::ref_ptr<osg::Vec2Array> vertices(new osg::Vec2Array(4));
geometry->setVertexArray(vertices);
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));
geometry->setTexCoordArray(id, textureCoords);
geometry->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::LINES,
0, 4));
osg::ref_ptr<osg::Vec4Array> colors(new osg::Vec4Array);
colors->push_back(osg::Vec4(0.0f, 0.0f, 1.0f, 1.0f));
geometry->setColorArray(colors);
geometry->setColorBinding(osg::Geometry::BIND_OVERALL);
geometry->setUseDisplayList(false);
}
const QString&
......@@ -53,64 +74,33 @@ Texture::getSourceURL(void) const
return sourceURL;
}
void
Texture::setId(unsigned int _id)
{
id = _id;
}
void
Texture::sync(const WebImagePtr& image)
{
state = static_cast<State>(image->getState());
if (image->getState() != WebImage::UNINITIALIZED &&
(sourceURL != image->getSourceURL() ||
_is3D != image->is3D()))
sourceURL != image->getSourceURL())
{
sourceURL = image->getSourceURL();
_is3D = image->is3D();
}
if (image->getState() == WebImage::READY && image->getSyncFlag())
{
image->setSyncFlag(false);
if (image->getWidth() != imageWidth ||
image->getHeight() != imageHeight)
if (texture2D->getImage() != NULL)
{
imageWidth = image->getWidth();
textureWidth = 32;
while (textureWidth < imageWidth)
{