diff --git a/data/scene/debugglobe/map_service_configs/TERRA_CR_B143_2016-04-12.wms b/data/scene/debugglobe/map_service_configs/TERRA_CR_B143_2016-04-12.wms
index 125c9b7c60..974c7da85f 100644
--- a/data/scene/debugglobe/map_service_configs/TERRA_CR_B143_2016-04-12.wms
+++ b/data/scene/debugglobe/map_service_configs/TERRA_CR_B143_2016-04-12.wms
@@ -2,14 +2,7 @@
http://map1.vis.earthdata.nasa.gov/twms-geo/twms.cgi?
MODIS TERRA tileset
- 2016-04-27
+ 2016-04-12
-
- -180.0
- 90.0
- 180.0
- -90.0
- bottom
-
20
diff --git a/modules/globebrowsing/CMakeLists.txt b/modules/globebrowsing/CMakeLists.txt
index 61730ba75f..06f86d469e 100644
--- a/modules/globebrowsing/CMakeLists.txt
+++ b/modules/globebrowsing/CMakeLists.txt
@@ -82,7 +82,7 @@ set(SOURCE_FILES
${CMAKE_CURRENT_SOURCE_DIR}/other/texturetileset.cpp
${CMAKE_CURRENT_SOURCE_DIR}/other/patchcoverageprovider.cpp
${CMAKE_CURRENT_SOURCE_DIR}/other/tileprovider.cpp
- ${CMAKE_CURRENT_SOURCE_DIR}/other/gdaldataconverter.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/other/gdaldataconverter.inl
${CMAKE_CURRENT_SOURCE_DIR}/other/lrucache.inl
${CMAKE_CURRENT_SOURCE_DIR}/other/concurrentjobmanager.inl
diff --git a/modules/globebrowsing/globes/clipmapglobe.cpp b/modules/globebrowsing/globes/clipmapglobe.cpp
index 978f924ba7..02de81a3cd 100644
--- a/modules/globebrowsing/globes/clipmapglobe.cpp
+++ b/modules/globebrowsing/globes/clipmapglobe.cpp
@@ -49,7 +49,8 @@ namespace openspace {
: _clipMapPyramid(Geodetic2(M_PI / 2, M_PI / 2))
, _ellipsoid(ellipsoid)
{
- _tileProvider = shared_ptr(new TileProvider("map_service_configs/TERRAIN.wms", 100));
+ _tileProvider = shared_ptr(new TileProvider(
+ "map_service_configs/TERRAIN.wms", 100));
// init Renderer
auto outerPatchRenderer = new ClipMapPatchRenderer(
shared_ptr(new OuterClipMapGrid(512)),
diff --git a/modules/globebrowsing/other/gdaldataconverter.h b/modules/globebrowsing/other/gdaldataconverter.h
index d3dab822b8..6601db2317 100644
--- a/modules/globebrowsing/other/gdaldataconverter.h
+++ b/modules/globebrowsing/other/gdaldataconverter.h
@@ -36,24 +36,11 @@
#include
-namespace openspace {
+namespace openspace {
using namespace ghoul::opengl;
- // forward declaration
- class GeodeticTileIndex;
- //class Geodetic2;
-
- class GdalDataConverter
- {
- public:
- GdalDataConverter();
- ~GdalDataConverter();
-
- std::shared_ptr convertToOpenGLTexture(
- GDALDataset* dataSet,
- const GeodeticTileIndex& tileIndex,
- int GLType);
+ struct UninitializedTextureTile {
struct TextureFormat
{
@@ -61,17 +48,49 @@ namespace openspace {
GLuint glFormat;
};
- struct TextureDataType
+ UninitializedTextureTile(
+ void* data,
+ glm::uvec3 dims,
+ TextureFormat format,
+ GLuint glType,
+ const GeodeticTileIndex& ti)
+ : imageData(data)
+ , dimensions(dims)
+ , texFormat(format)
+ , glType(glType)
+ , tileIndex(ti)
{
- Texture::Format ghoulFormat;
- GLuint glFormat;
- };
- TextureFormat getTextureFormatFromRasterCount(int rasterCount);
+ }
+
+ void* imageData;
+ glm::uvec3 dimensions;
+ TextureFormat texFormat;
+ GLuint glType;
+ const GeodeticTileIndex tileIndex;
+ };
+
+ template
+ class GdalDataConverter
+ {
+ public:
+
+ GdalDataConverter();
+ ~GdalDataConverter();
+
+ std::shared_ptr getUninitializedTextureTile(
+ GDALDataset * dataSet,
+ const GeodeticTileIndex & tileIndex);
+
+ UninitializedTextureTile::TextureFormat getTextureFormatFromRasterCount(
+ int rasterCount);
+ GLuint getGlDataTypeFromGdalDataType(GDALDataType gdalType);
glm::uvec2 geodeticToPixel(GDALDataset* dataSet, const Geodetic2& geo);
};
} // namespace openspace
+#include
+
#endif // __GDALDATACONVERTER_H__
\ No newline at end of file
diff --git a/modules/globebrowsing/other/gdaldataconverter.cpp b/modules/globebrowsing/other/gdaldataconverter.inl
similarity index 53%
rename from modules/globebrowsing/other/gdaldataconverter.cpp
rename to modules/globebrowsing/other/gdaldataconverter.inl
index e90cd4a030..2929b492c2 100644
--- a/modules/globebrowsing/other/gdaldataconverter.cpp
+++ b/modules/globebrowsing/other/gdaldataconverter.inl
@@ -27,92 +27,106 @@
#include
#include
-namespace {
- const std::string _loggerCat = "GdalDataConverter";
-}
-
namespace openspace {
- GdalDataConverter::GdalDataConverter()
+ template
+ GdalDataConverter::GdalDataConverter()
{
}
- GdalDataConverter::~GdalDataConverter()
+ template
+ GdalDataConverter::~GdalDataConverter()
{
}
- std::shared_ptr GdalDataConverter::convertToOpenGLTexture(
+ template
+ std::shared_ptr GdalDataConverter::getUninitializedTextureTile(
GDALDataset* dataSet,
- const GeodeticTileIndex& tileIndex,
- int GLType)
- {
+ const GeodeticTileIndex& tileIndex) {
int nRasters = dataSet->GetRasterCount();
ghoul_assert(nRasters > 0, "Bad dataset. Contains no rasterband.");
GDALRasterBand* firstBand = dataSet->GetRasterBand(1);
+ // Assume all raster bands have the same data type
+ GDALDataType gdalType = firstBand->GetRasterDataType();
// Level = overviewCount - overview
- int overviewCount = firstBand->GetOverviewCount();
- int overview = overviewCount - tileIndex.level - 1;
+ int numOverviews = firstBand->GetOverviewCount();
- // The output texture will have this size
- int xSizelevel0 = firstBand->GetOverview(overviewCount - 1)->GetXSize();
- int ySizelevel0 = firstBand->GetOverview(overviewCount - 1)->GetYSize();
+ int xSize0 = firstBand->GetXSize();
+ int ySize0 = firstBand->GetYSize();
+
+ GeodeticPatch patch = GeodeticPatch(tileIndex);
+ glm::uvec2 pixelStart0 = geodeticToPixel(dataSet, patch.northWestCorner());
+ glm::uvec2 pixelEnd0 = geodeticToPixel(dataSet, patch.southEastCorner());
+ glm::uvec2 numberOfPixels0 = pixelEnd0 - pixelStart0;
+ int minNumPixels0 = glm::min(numberOfPixels0.x, numberOfPixels0.y);
+ int minNumPixelsRequired = 512;
+ int ov = log2(minNumPixels0) - log2(minNumPixelsRequired + 1);
- // The data that the texture should read
- GLubyte* imageData = new GLubyte[xSizelevel0 * ySizelevel0 * nRasters];
+ ov = glm::clamp(ov, 0, numOverviews - 1);
+
+ glm::uvec2 pixelStart(pixelStart0.x >> (ov + 1), pixelStart0.y >> (ov + 1));
+ glm::uvec2 numberOfPixels(numberOfPixels0.x >> (ov + 1), numberOfPixels0.y >> (ov + 1));
+
+ // GDAL reads image data top to bottom
+ T* imageData = new T[numberOfPixels.x * numberOfPixels.y * nRasters];
// Read the data (each rasterband is a separate channel)
- for (size_t i = 0; i < nRasters; i++)
- {
- GDALRasterBand* rasterBand = dataSet->GetRasterBand(i + 1)->GetOverview(overview);
-
- int xBeginRead = tileIndex.x * pow(2, tileIndex.level) * xSizelevel0;
- int yBeginRead = tileIndex.y * pow(2, tileIndex.level) * ySizelevel0;
+ for (size_t i = 0; i < nRasters; i++) {
+ GDALRasterBand* rasterBand = dataSet->GetRasterBand(i + 1)->GetOverview(ov);
+
+ int xSize = rasterBand->GetXSize();
+ int ySize = rasterBand->GetYSize();
+
rasterBand->RasterIO(
GF_Read,
- xBeginRead, // Begin read x
- yBeginRead, // Begin read y
- xSizelevel0, // width to read x
- ySizelevel0, // width to read y
- imageData + i, // Where to put data
- xSizelevel0, // width to read x in destination
- ySizelevel0, // width to read y in destination
- GDT_Byte, // Type
- sizeof(GLubyte) * nRasters, // Pixel spacing
- 0); // Line spacing
+ pixelStart.x, // Begin read x
+ pixelStart.y, // Begin read y
+ numberOfPixels.x, // width to read x
+ numberOfPixels.y, // width to read y
+ imageData + i, // Where to put data
+ numberOfPixels.x, // width to write x in destination
+ numberOfPixels.y, // width to write y in destination
+ gdalType, // Type
+ sizeof(T) * nRasters, // Pixel spacing
+ 0); // Line spacing
}
- GdalDataConverter::TextureFormat textrureFormat =
+ // GDAL reads image data top to bottom. We want the opposite.
+ T* imageDataYflipped = new T[numberOfPixels.x * numberOfPixels.y * nRasters];
+ for (size_t y = 0; y < numberOfPixels.y; y++) {
+ for (size_t x = 0; x < numberOfPixels.x; x++) {
+ imageDataYflipped[x + y * numberOfPixels.x] =
+ imageData[x + (numberOfPixels.y - y) * numberOfPixels.x];
+ }
+ }
+
+ delete[] imageData;
+
+ glm::uvec3 dims(numberOfPixels.x, numberOfPixels.y, 1);
+ UninitializedTextureTile::TextureFormat textrureFormat =
getTextureFormatFromRasterCount(nRasters);
-
-
- Texture* tex = new Texture(
- static_cast(imageData),
- glm::uvec3(xSizelevel0, ySizelevel0, 1),
- textrureFormat.ghoulFormat,
- textrureFormat.glFormat,
- GL_UNSIGNED_BYTE,
- Texture::FilterMode::Linear,
- Texture::WrappingMode::Repeat);
-
- // The texture should take ownership of the data
- std::shared_ptr texture = std::shared_ptr(tex);
-
-
- // Do not free imageData since the texture now has ownership of it
- return texture;
+ GLuint glType = getGlDataTypeFromGdalDataType(gdalType);
+ UninitializedTextureTile* uninitedTexPtr = new UninitializedTextureTile(
+ imageDataYflipped,
+ dims,
+ textrureFormat,
+ glType,
+ tileIndex);
+ std::shared_ptr uninitedTex =
+ std::shared_ptr(uninitedTexPtr);
+ return uninitedTex;
}
-
-
- glm::uvec2 GdalDataConverter::geodeticToPixel(GDALDataset* dataSet, const Geodetic2& geo) {
+ template
+ glm::uvec2 GdalDataConverter::geodeticToPixel(GDALDataset* dataSet, const Geodetic2& geo) {
double padfTransform[6];
CPLErr err = dataSet->GetGeoTransform(padfTransform);
@@ -140,19 +154,17 @@ namespace openspace {
double L = (-a[0]*b[1] + a[1]*b[0] - a[1]*Y + b[1]*X) / divisor;
// ref: https://www.wolframalpha.com/input/?i=X+%3D+a0+%2B+a1P+%2B+a2L,+Y+%3D+b0+%2B+b1P+%2B+b2L,+solve+for+P+and+L
-
double Xp = a[0] + P*a[1] + L*a[2];
double Yp = b[0] + P*b[1] + L*b[2];
return glm::uvec2(P, L);
}
-
-
- GdalDataConverter::TextureFormat GdalDataConverter::getTextureFormatFromRasterCount(
+ template
+ UninitializedTextureTile::TextureFormat GdalDataConverter::getTextureFormatFromRasterCount(
int rasterCount)
{
- TextureFormat format;
+ UninitializedTextureTile::TextureFormat format;
switch (rasterCount)
{
@@ -173,10 +185,42 @@ namespace openspace {
format.glFormat = GL_RGBA;
break;
default:
-
+ LERROR("Too many channels for OpenGL.");
break;
}
return format;
}
+ template
+ GLuint GdalDataConverter::getGlDataTypeFromGdalDataType(GDALDataType gdalType)
+ {
+ switch (gdalType)
+ {
+ case GDT_Byte:
+ return GL_BYTE;
+ break;
+ case GDT_UInt16:
+ return GL_UNSIGNED_SHORT;
+ break;
+ case GDT_Int16:
+ return GL_SHORT;
+ break;
+ case GDT_UInt32:
+ return GL_UNSIGNED_INT;
+ break;
+ case GDT_Int32:
+ return GL_INT;
+ break;
+ case GDT_Float32:
+ return GL_FLOAT;
+ break;
+ case GDT_Float64:
+ return GL_DOUBLE;
+ break;
+ default:
+ LERROR("GDAL data type unknown to OpenGL: " << gdalType);
+ return GL_UNSIGNED_BYTE;
+ }
+ }
+
} // namespace openspace
diff --git a/modules/globebrowsing/other/texturetileset.cpp b/modules/globebrowsing/other/texturetileset.cpp
index 3111b1d08a..13e7cfc977 100644
--- a/modules/globebrowsing/other/texturetileset.cpp
+++ b/modules/globebrowsing/other/texturetileset.cpp
@@ -52,7 +52,7 @@ namespace openspace {
, _offsetLevel0(offsetLevel0)
, _depth(depth)
{
-
+ /*
// Read using GDAL
@@ -76,7 +76,7 @@ namespace openspace {
_testTexture->uploadTexture();
_testTexture->setFilter(ghoul::opengl::Texture::FilterMode::Linear);
-
+ */
/*
// Set e texture to test
std::string fileName = "textures/earth_bluemarble.jpg";
diff --git a/modules/globebrowsing/other/tileprovider.cpp b/modules/globebrowsing/other/tileprovider.cpp
index 4bf97495b4..8d6b65c665 100644
--- a/modules/globebrowsing/other/tileprovider.cpp
+++ b/modules/globebrowsing/other/tileprovider.cpp
@@ -51,7 +51,9 @@ namespace openspace {
{
int downloadApplicationVersion = 1;
if (!DownloadManager::isInitialized()) {
- DownloadManager::initialize("../tmp_openspace_downloads/", downloadApplicationVersion);
+ DownloadManager::initialize(
+ "../tmp_openspace_downloads/",
+ downloadApplicationVersion);
}
if (!hasInitializedGDAL) {
@@ -64,25 +66,23 @@ namespace openspace {
//auto desc = _gdalDataSet->GetDescription();
ghoul_assert(_gdalDataSet != nullptr, "Failed to load dataset: " << filePath);
-
}
TileProvider::~TileProvider(){
delete _gdalDataSet;
}
-
void TileProvider::prerender() {
while (_tileLoadManager.numFinishedJobs() > 0) {
auto finishedJob = _tileLoadManager.popFinishedJob();
- std::shared_ptr uninitedTex = finishedJob->product();
+ std::shared_ptr uninitedTex =
+ finishedJob->product();
HashKey key = uninitedTex->tileIndex.hashKey();
std::shared_ptr texture = initializeTexture(uninitedTex);
_tileCache.put(key, texture);
}
}
-
std::shared_ptr TileProvider::getTile(const GeodeticTileIndex& tileIndex) {
HashKey hashkey = tileIndex.hashKey();
@@ -102,101 +102,60 @@ namespace openspace {
}
}
+ std::shared_ptr TileProvider::getUninitializedTextureTile(
+ const GeodeticTileIndex& tileIndex) {
+
+ // We assume here that all rasterbands have the same data type
+ GDALDataType gdalType = _gdalDataSet->GetRasterBand(1)->GetRasterDataType();
-
-
-
- std::shared_ptr TileProvider::getUninitializedTextureTile(const GeodeticTileIndex& tileIndex) {
- int nRasters = _gdalDataSet->GetRasterCount();
-
- ghoul_assert(nRasters > 0, "Bad dataset. Contains no rasterband.");
-
- GDALRasterBand* firstBand = _gdalDataSet->GetRasterBand(1);
-
- // Level = overviewCount - overview
- int numOverviews = firstBand->GetOverviewCount();
-
-
- int xSize0 = firstBand->GetXSize();
- int ySize0 = firstBand->GetYSize();
-
- GeodeticPatch patch = GeodeticPatch(tileIndex);
- glm::uvec2 pixelStart0 = _converter.geodeticToPixel(_gdalDataSet, patch.northWestCorner());
- glm::uvec2 pixelEnd0 = _converter.geodeticToPixel(_gdalDataSet, patch.southEastCorner());
- glm::uvec2 numberOfPixels0 = pixelEnd0 - pixelStart0;
-
-
- int minNumPixels0 = glm::min(numberOfPixels0.x, numberOfPixels0.y);
-
- int minNumPixelsRequired = 512;
- int ov = log2(minNumPixels0) - log2(minNumPixelsRequired);
-
- ov = glm::clamp(ov, 0, numOverviews - 1);
-
- glm::uvec2 pixelStart(pixelStart0.x >> (ov + 1), pixelStart0.y >> (ov + 1));
- glm::uvec2 numberOfPixels(numberOfPixels0.x >> (ov + 1), numberOfPixels0.y >> (ov + 1));
-
-
-
- // GDAL reads image data top to bottom
- GLubyte* imageData = new GLubyte[numberOfPixels.x * numberOfPixels.y * nRasters];
-
- // Read the data (each rasterband is a separate channel)
- for (size_t i = 0; i < nRasters; i++) {
- GDALRasterBand* rasterBand = _gdalDataSet->GetRasterBand(i + 1)->GetOverview(ov);
-
- int xSize = rasterBand->GetXSize();
- int ySize = rasterBand->GetYSize();
-
- rasterBand->RasterIO(
- GF_Read,
- pixelStart.x, // Begin read x
- pixelStart.y, // Begin read y
- numberOfPixels.x, // width to read x
- numberOfPixels.y, // width to read y
- imageData + i, // Where to put data
- numberOfPixels.x, // width to write x in destination
- numberOfPixels.y, // width to write y in destination
- GDT_Byte, // Type
- sizeof(GLubyte) * nRasters, // Pixel spacing
- 0); // Line spacing
+ switch (gdalType)
+ {
+ case GDT_Byte:
+ return _uByteConverter.getUninitializedTextureTile(_gdalDataSet, tileIndex);
+ break;
+ case GDT_UInt16:
+ return _uShortConverter.getUninitializedTextureTile(_gdalDataSet, tileIndex);
+ break;
+ case GDT_Int16:
+ return _shortConverter.getUninitializedTextureTile(_gdalDataSet, tileIndex);
+ break;
+ case GDT_UInt32:
+ return _uIntConverter.getUninitializedTextureTile(_gdalDataSet, tileIndex);
+ break;
+ case GDT_Int32:
+ return _intConverter.getUninitializedTextureTile(_gdalDataSet, tileIndex);
+ break;
+ case GDT_Float32:
+ return _floatConverter.getUninitializedTextureTile(_gdalDataSet, tileIndex);
+ break;
+ case GDT_Float64:
+ return _doubleConverter.getUninitializedTextureTile(_gdalDataSet, tileIndex);
+ break;
+ default:
+ LERROR("GDAL data type unknown to OpenGL: " << gdalType);
}
-
- // GDAL reads image data top to bottom. We want the opposite.
- GLubyte* imageDataYflipped = new GLubyte[numberOfPixels.x * numberOfPixels.y * nRasters];
- for (size_t y = 0; y < numberOfPixels.y; y++) {
- for (size_t x = 0; x < numberOfPixels.x; x++) {
- imageDataYflipped[x + y * numberOfPixels.x] = imageData[x + (numberOfPixels.y - y) * numberOfPixels.x];
- }
- }
-
- delete[] imageData;
-
- glm::uvec3 dims(numberOfPixels.x, numberOfPixels.y, 1);
- GdalDataConverter::TextureFormat textrureFormat = _converter.getTextureFormatFromRasterCount(nRasters);
- UninitializedTextureTile* uninitedTexPtr = new UninitializedTextureTile(imageDataYflipped, dims, textrureFormat, tileIndex);
- std::shared_ptr uninitedTex = std::shared_ptr(uninitedTexPtr);
- return uninitedTex;
+ return nullptr;
}
-
- std::shared_ptr TileProvider::initializeTexture(std::shared_ptr uninitedTexture) {
+ std::shared_ptr TileProvider::initializeTexture(
+ std::shared_ptr uninitedTexture) {
Texture* tex = new Texture(
- static_cast(uninitedTexture->imageData),
+ uninitedTexture->imageData,
uninitedTexture->dimensions,
uninitedTexture->texFormat.ghoulFormat,
uninitedTexture->texFormat.glFormat,
- GL_UNSIGNED_BYTE,
+ uninitedTexture->glType,
Texture::FilterMode::Linear,
- Texture::WrappingMode::Repeat);
+ Texture::WrappingMode::ClampToBorder);
// The texture should take ownership of the data
std::shared_ptr texture = std::shared_ptr(tex);
texture->uploadTexture();
+ /*
texture->setWrapping(ghoul::opengl::Texture::WrappingMode::ClampToBorder);
texture->setFilter(ghoul::opengl::Texture::FilterMode::Linear);
-
+ */
return texture;
}
diff --git a/modules/globebrowsing/other/tileprovider.h b/modules/globebrowsing/other/tileprovider.h
index 5af4cdf877..411f95cd66 100644
--- a/modules/globebrowsing/other/tileprovider.h
+++ b/modules/globebrowsing/other/tileprovider.h
@@ -39,39 +39,18 @@
#include
#include
-
-namespace openspace {
-
-
- struct UninitializedTextureTile {
- UninitializedTextureTile(GLubyte* data, glm::uvec3 dims,
- GdalDataConverter::TextureFormat format, const GeodeticTileIndex& ti)
- : imageData(data)
- , dimensions(dims)
- , texFormat(format)
- , tileIndex(ti){
-
- }
-
-
- GLubyte * imageData;
- glm::uvec3 dimensions;
- GdalDataConverter::TextureFormat texFormat;
- const GeodeticTileIndex tileIndex;
- };
-
-}
-
//////////////////////////////////////////////////////////////////////////////////////////
// TILE PROVIDER //
//////////////////////////////////////////////////////////////////////////////////////////
namespace openspace {
-
-
using namespace ghoul::opengl;
+ /**
+ Provides tiles through GDAL datasets which can be defined with xml files
+ for example for wms.
+ */
class TileProvider {
public:
TileProvider(const std::string& fileName, int tileCacheSize);
@@ -81,26 +60,39 @@ namespace openspace {
void prerender();
-
private:
friend class TextureTileLoadJob;
- std::shared_ptr getUninitializedTextureTile(const GeodeticTileIndex& tileIndex);
- std::shared_ptr initializeTexture(std::shared_ptr uninitedTexture);
-
+ /**
+ Fetches all the needeed texture data from the GDAL dataset.
+ */
+ std::shared_ptr getUninitializedTextureTile(
+ const GeodeticTileIndex& tileIndex);
+
+ /**
+ Creates an OpenGL texture and pushes the data to the GPU.
+ */
+ std::shared_ptr initializeTexture(
+ std::shared_ptr uninitedTexture);
LRUCache> _tileCache;
-
const std::string _filePath;
static bool hasInitializedGDAL;
GDALDataset* _gdalDataSet;
- GdalDataConverter _converter;
+
+ // Converters are needed for all different data types since they are templated.
+ GdalDataConverter _uByteConverter;
+ GdalDataConverter _uShortConverter;
+ GdalDataConverter _shortConverter;
+ GdalDataConverter _uIntConverter;
+ GdalDataConverter _intConverter;
+ GdalDataConverter _floatConverter;
+ GdalDataConverter _doubleConverter;
ConcurrentJobManager _tileLoadManager;
-
};
} // namespace openspace
diff --git a/modules/globebrowsing/shaders/clipmappatch_spheremapping_vs.glsl b/modules/globebrowsing/shaders/clipmappatch_spheremapping_vs.glsl
index 26a8c9a1ef..52e6803fad 100644
--- a/modules/globebrowsing/shaders/clipmappatch_spheremapping_vs.glsl
+++ b/modules/globebrowsing/shaders/clipmappatch_spheremapping_vs.glsl
@@ -114,18 +114,21 @@ void main()
PositionNormalPair pair = globalInterpolation(fs_uv);
- vec4 textureColor = vec4(0);
+ float sampledHeight00, sampledHeight10, sampledHeight01, sampledHeight11;
+
vec2 uv00 = vec2(uvTransformPatchToTile00 * vec3(fs_uv.s, fs_uv.t, 1));
- textureColor += texture(textureSampler00, uv00);
+ sampledHeight00 = texture(textureSampler00, uv00).r;
vec2 uv10 = vec2(uvTransformPatchToTile10 * vec3(fs_uv.s, fs_uv.t, 1));
- textureColor += texture(textureSampler10, uv10);
+ sampledHeight10 = texture(textureSampler10, uv10).r;
vec2 uv01 = vec2(uvTransformPatchToTile01 * vec3(fs_uv.s, fs_uv.t, 1));
- textureColor += texture(textureSampler01, uv01);
+ sampledHeight01 = texture(textureSampler01, uv01).r;
vec2 uv11 = vec2(uvTransformPatchToTile11 * vec3(fs_uv.s, fs_uv.t, 1));
- textureColor += texture(textureSampler11, uv11);
+ sampledHeight11 = texture(textureSampler11, uv11).r;
- pair.position += pair.normal * textureColor.r * 1e4;
+ float sampledHeight = max(sampledHeight00, max(sampledHeight10, max(sampledHeight01, sampledHeight11)));
+
+ pair.position += pair.normal * sampledHeight * 1e5;
vec4 position = modelViewProjectionTransform * vec4(pair.position, 1);
fs_position = pair.position;
diff --git a/modules/globebrowsing/shaders/simple_fs.glsl b/modules/globebrowsing/shaders/simple_fs.glsl
index cf40637783..657d621677 100644
--- a/modules/globebrowsing/shaders/simple_fs.glsl
+++ b/modules/globebrowsing/shaders/simple_fs.glsl
@@ -58,18 +58,22 @@ Fragment getFragment() {
Fragment frag;
frag.color = vec4(0);
-
+ vec4 color00, color10, color01, color11;
+
vec2 uv00 = vec2(uvTransformPatchToTile00 * vec3(fs_uv.s, fs_uv.t, 1));
- frag.color += texture(textureSampler00, uv00);
+ color00 = texture(textureSampler00, uv00);
vec2 uv10 = vec2(uvTransformPatchToTile10 * vec3(fs_uv.s, fs_uv.t, 1));
- frag.color += texture(textureSampler10, uv10);
+ color10 += texture(textureSampler10, uv10);
vec2 uv01 = vec2(uvTransformPatchToTile01 * vec3(fs_uv.s, fs_uv.t, 1));
- frag.color += texture(textureSampler01, uv01);
+ color01 += texture(textureSampler01, uv01);
vec2 uv11 = vec2(uvTransformPatchToTile11 * vec3(fs_uv.s, fs_uv.t, 1));
- frag.color += texture(textureSampler11, uv11);
+ color11 += texture(textureSampler11, uv11);
+
+ frag.color = max(color00, max(color10, max(color01, color11))) * 10;
+
//frag.color = frag.color * 0.5 + 0.999*texture(textureSampler, fs_uv);
//frag.color /= 4;