Rendering small patches does not create new tiles.

This commit is contained in:
Kalle Bladin
2016-05-10 19:26:16 -04:00
parent 2b2c3166e4
commit 574d7bfe79
5 changed files with 54 additions and 27 deletions
@@ -49,7 +49,6 @@ namespace openspace {
};
UninitializedTextureTile(
void* data,
glm::uvec3 dims,
TextureFormat format,
@@ -82,7 +81,7 @@ namespace openspace {
std::shared_ptr<UninitializedTextureTile> getUninitializedTextureTile(
GDALDataset * dataSet,
GeodeticTileIndex tileIndex,
int minNumPixelsRequired);
int tileLevelDifference);
UninitializedTextureTile::TextureFormat getTextureFormat(
int rasterCount,
@@ -47,7 +47,7 @@ namespace openspace {
std::shared_ptr<UninitializedTextureTile> GdalDataConverter<T>::getUninitializedTextureTile(
GDALDataset* dataSet,
GeodeticTileIndex tileIndex,
int minNumPixelsRequired)
int tileLevelDifference)
{
int nRasters = dataSet->GetRasterCount();
@@ -74,7 +74,8 @@ namespace openspace {
// Calculate a suitable overview to choose from the GDAL dataset
int minNumPixels0 = glm::min(numPixels0.x, numPixels0.y);
int ov = log2(minNumPixels0) - log2(minNumPixelsRequired + 1);
int sizeLevel0 = firstBand->GetOverview(numOverviews - 1)->GetXSize();
int ov = log2(minNumPixels0) - log2(sizeLevel0 + 1) - tileLevelDifference;
ov = glm::clamp(ov, 0, numOverviews - 1);
// Convert the interval [pixelStart0, pixelEnd0] to pixel space at
+38 -10
View File
@@ -51,7 +51,6 @@ namespace openspace {
int minimumPixelSize)
: _filePath(filePath)
, _tileCache(tileCacheSize) // setting cache size
, _minimumPixelSize(minimumPixelSize)
{
// Set a temporary texture
std::string fileName = "textures/earth_bluemarble.jpg";
@@ -81,13 +80,17 @@ namespace openspace {
hasInitializedGDAL = true;
}
std::string absFilePath = absPath(filePath);
_gdalDataSet = (GDALDataset *)GDALOpen(absFilePath.c_str(), GA_ReadOnly);
//auto desc = _gdalDataSet->GetDescription();
ghoul_assert(_gdalDataSet != nullptr, "Failed to load dataset: " << filePath);
GDALRasterBand* firstBand = _gdalDataSet->GetRasterBand(1);
int numOverviews = firstBand->GetOverviewCount();
int sizeLevel0 = firstBand->GetOverview(numOverviews - 1)->GetXSize();
_tileLevelDifference = log2(minimumPixelSize) - log2(sizeLevel0);
}
TileProvider::~TileProvider(){
@@ -109,6 +112,31 @@ namespace openspace {
std::shared_ptr<Texture> tex = nullptr;
glm::vec2 uvOffset(0, 0);
glm::vec2 uvScale(1, 1);
// Check if we are trying to get a texture for a very small patch.
// In that case, use the biggest one defined for the dataset.
int maximumAllowedLevel =
_gdalDataSet->GetRasterBand(1)->GetOverviewCount() - 1;
int levelInDataset = tileIndex.level + _tileLevelDifference;
int timesToStepUp = levelInDataset - maximumAllowedLevel;
for (int i = 0; i < timesToStepUp; i++)
{
uvScale *= 0.5;
uvOffset *= 0.5;
if (tileIndex.isEastChild()) {
uvOffset.x += 0.5;
}
// In OpenGL, positive y direction is up
if (tileIndex.isNorthChild()) {
uvOffset.y += 0.5;
}
tileIndex = tileIndex.parent();
}
// We also need to check if the wanted texture is available. If not, go up a level
while (true) {
tex = getOrStartFetchingTile(tileIndex);
@@ -180,43 +208,43 @@ namespace openspace {
return _uByteConverter.getUninitializedTextureTile(
_gdalDataSet,
tileIndex,
_minimumPixelSize);
_tileLevelDifference);
break;
case GDT_UInt16:
return _uShortConverter.getUninitializedTextureTile(
_gdalDataSet,
tileIndex,
_minimumPixelSize);
_tileLevelDifference);
break;
case GDT_Int16:
return _shortConverter.getUninitializedTextureTile(
_gdalDataSet,
tileIndex,
_minimumPixelSize);
_tileLevelDifference);
break;
case GDT_UInt32:
return _uIntConverter.getUninitializedTextureTile(
_gdalDataSet,
tileIndex,
_minimumPixelSize);
_tileLevelDifference);
break;
case GDT_Int32:
return _intConverter.getUninitializedTextureTile(
_gdalDataSet,
tileIndex,
_minimumPixelSize);
_tileLevelDifference);
break;
case GDT_Float32:
return _floatConverter.getUninitializedTextureTile(
_gdalDataSet,
tileIndex,
_minimumPixelSize);
_tileLevelDifference);
break;
case GDT_Float64:
return _doubleConverter.getUninitializedTextureTile(
_gdalDataSet,
tileIndex,
_minimumPixelSize);
_tileLevelDifference);
break;
default:
LERROR("GDAL data type unknown to OpenGL: " << gdalType);
+8 -9
View File
@@ -45,18 +45,17 @@
namespace openspace {
using namespace ghoul::opengl;
struct Tile {
std::shared_ptr<Texture> texture;
struct TileTextureTransform
{
glm::vec2 uvOffset;
glm::vec2 uvScale;
};
struct Tile {
std::shared_ptr<Texture> texture;
TileTextureTransform transform;
};
/**
Provides tiles through GDAL datasets which can be defined with xml files
@@ -110,7 +109,7 @@ namespace openspace {
ConcurrentJobManager<UninitializedTextureTile> _tileLoadManager;
std::shared_ptr<Texture> _defaultTexture;
int _minimumPixelSize;
int _tileLevelDifference;
};
} // namespace openspace
@@ -133,8 +133,8 @@ namespace openspace {
texUnitHeight.activate();
heightTile.texture->bind();
_programObjectGlobalRendering->setUniform("textureSamplerHeight", texUnitHeight);
_programObjectGlobalRendering->setUniform("heightSamplingScale", heightTile.uvScale);
_programObjectGlobalRendering->setUniform("heightSamplingOffset", heightTile.uvOffset);
_programObjectGlobalRendering->setUniform("heightSamplingScale", heightTile.transform.uvScale);
_programObjectGlobalRendering->setUniform("heightSamplingOffset", heightTile.transform.uvOffset);
@@ -151,8 +151,8 @@ namespace openspace {
texUnitColor.activate();
colorTile.texture->bind();
_programObjectGlobalRendering->setUniform("textureSamplerColor", texUnitColor);
_programObjectGlobalRendering->setUniform("colorSamplingScale", colorTile.uvScale);
_programObjectGlobalRendering->setUniform("colorSamplingOffset", colorTile.uvOffset);
_programObjectGlobalRendering->setUniform("colorSamplingScale", colorTile.transform.uvScale);
_programObjectGlobalRendering->setUniform("colorSamplingOffset", colorTile.transform.uvOffset);
Geodetic2 swCorner = patch.southWestCorner();