mirror of
https://github.com/OpenSpace/OpenSpace.git
synced 2026-04-21 10:28:44 -05:00
Rendering small patches does not create new tiles.
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user