From 09b367549136791c6156f16f9c82e604081ff929 Mon Sep 17 00:00:00 2001 From: Kalle Bladin Date: Thu, 13 Jul 2017 20:23:57 +0200 Subject: [PATCH 01/28] Move readImageData from GdalRawTileDataReader to RawTileDataReader so that it can be used by other RawTileDataReaders --- .../tile/asynctiledataprovider.cpp | 4 + .../gdalrawtiledatareader.cpp | 134 +----------------- .../rawtiledatareader/gdalrawtiledatareader.h | 3 +- .../rawtiledatareader/rawtiledatareader.cpp | 128 +++++++++++++++++ .../rawtiledatareader/rawtiledatareader.h | 10 +- .../simplerawtiledatareader.cpp | 9 ++ .../simplerawtiledatareader.h | 3 +- .../tile/tileprovider/defaulttileprovider.cpp | 3 +- 8 files changed, 153 insertions(+), 141 deletions(-) diff --git a/modules/globebrowsing/tile/asynctiledataprovider.cpp b/modules/globebrowsing/tile/asynctiledataprovider.cpp index 46723e5fbc..ee4c6bc6e8 100644 --- a/modules/globebrowsing/tile/asynctiledataprovider.cpp +++ b/modules/globebrowsing/tile/asynctiledataprovider.cpp @@ -62,6 +62,10 @@ std::shared_ptr AsyncTileDataProvider::getRawTileDataReader() } bool AsyncTileDataProvider::enqueueTileIO(const TileIndex& tileIndex) { + if (tileIndex.level < 2) { + int hej = 0; + } + if (_resetMode == ResetMode::ShouldNotReset && satisfiesEnqueueCriteria(tileIndex)) { if (_pboContainer) { char* dataPtr = static_cast(_pboContainer->mapBuffer( diff --git a/modules/globebrowsing/tile/rawtiledatareader/gdalrawtiledatareader.cpp b/modules/globebrowsing/tile/rawtiledatareader/gdalrawtiledatareader.cpp index 45eaa90a8b..608baeb69d 100644 --- a/modules/globebrowsing/tile/rawtiledatareader/gdalrawtiledatareader.cpp +++ b/modules/globebrowsing/tile/rawtiledatareader/gdalrawtiledatareader.cpp @@ -106,6 +106,10 @@ int GdalRawTileDataReader::rasterYSize() const { return _gdalDatasetMetaDataCached.rasterYSize; } +int GdalRawTileDataReader::dataSourceNumRasters() const { + return _gdalDatasetMetaDataCached.rasterCount; +} + float GdalRawTileDataReader::depthOffset() const { return _gdalDatasetMetaDataCached.offset; } @@ -182,134 +186,6 @@ void GdalRawTileDataReader::initialize() { _cached._maxLevel = std::max(_cached._maxLevel, 2); } -void GdalRawTileDataReader::readImageData( - IODescription& io, RawTile::ReadError& worstError, char* imageDataDest) const { - - // Only read the minimum number of rasters - int nRastersToRead = std::min(_gdalDatasetMetaDataCached.rasterCount, - static_cast(_initData.nRasters())); - - switch (_initData.ghoulTextureFormat()) { - case ghoul::opengl::Texture::Format::Red: - if (nRastersToRead == 1) { // One channel - // The final destination pointer is offsetted by one datum byte size - // for every raster (or data channel, i.e. R in RGB) - char* dataDestination = imageDataDest + _initData.bytesPerDatum(); - - RawTile::ReadError err = repeatedRasterRead(1, io, dataDestination); - - // CE_None = 0, CE_Debug = 1, CE_Warning = 2, CE_Failure = 3, CE_Fatal = 4 - worstError = std::max(worstError, err); - } - break; - case ghoul::opengl::Texture::Format::RG: - case ghoul::opengl::Texture::Format::RGB: - case ghoul::opengl::Texture::Format::RGBA: { - if (nRastersToRead == 1) { // Grayscale - for (int i = 0; i < 3; i++) { - // The final destination pointer is offsetted by one datum byte size - // for every raster (or data channel, i.e. R in RGB) - char* dataDestination = imageDataDest + (i * _initData.bytesPerDatum()); - - RawTile::ReadError err = repeatedRasterRead(1, io, dataDestination); - - // CE_None = 0, CE_Debug = 1, CE_Warning = 2, CE_Failure = 3, CE_Fatal = 4 - worstError = std::max(worstError, err); - } - } - else if (nRastersToRead == 2) { // Grayscale + alpha - for (int i = 0; i < 3; i++) { - // The final destination pointer is offsetted by one datum byte size - // for every raster (or data channel, i.e. R in RGB) - char* dataDestination = imageDataDest + (i * _initData.bytesPerDatum()); - - RawTile::ReadError err = repeatedRasterRead(1, io, dataDestination); - - // CE_None = 0, CE_Debug = 1, CE_Warning = 2, CE_Failure = 3, CE_Fatal = 4 - worstError = std::max(worstError, err); - } - // Last read is the alpha channel - char* dataDestination = imageDataDest + (3 * _initData.bytesPerDatum()); - RawTile::ReadError err = repeatedRasterRead(2, io, dataDestination); - - // CE_None = 0, CE_Debug = 1, CE_Warning = 2, CE_Failure = 3, CE_Fatal = 4 - worstError = std::max(worstError, err); - } - else { // Three or more rasters - for (int i = 0; i < nRastersToRead; i++) { - // The final destination pointer is offsetted by one datum byte size - // for every raster (or data channel, i.e. R in RGB) - char* dataDestination = imageDataDest + (i * _initData.bytesPerDatum()); - - RawTile::ReadError err = repeatedRasterRead(i + 1, io, dataDestination); - - // CE_None = 0, CE_Debug = 1, CE_Warning = 2, CE_Failure = 3, CE_Fatal = 4 - worstError = std::max(worstError, err); - } - } - break; - } - case ghoul::opengl::Texture::Format::BGR: - case ghoul::opengl::Texture::Format::BGRA: { - if (nRastersToRead == 1) { // Grayscale - for (int i = 0; i < 3; i++) { - // The final destination pointer is offsetted by one datum byte size - // for every raster (or data channel, i.e. R in RGB) - char* dataDestination = imageDataDest + (i * _initData.bytesPerDatum()); - - RawTile::ReadError err = repeatedRasterRead(1, io, dataDestination); - - // CE_None = 0, CE_Debug = 1, CE_Warning = 2, CE_Failure = 3, CE_Fatal = 4 - worstError = std::max(worstError, err); - } - } - else if (nRastersToRead == 2) { // Grayscale + alpha - for (int i = 0; i < 3; i++) { - // The final destination pointer is offsetted by one datum byte size - // for every raster (or data channel, i.e. R in RGB) - char* dataDestination = imageDataDest + (i * _initData.bytesPerDatum()); - - RawTile::ReadError err = repeatedRasterRead(1, io, dataDestination); - - // CE_None = 0, CE_Debug = 1, CE_Warning = 2, CE_Failure = 3, CE_Fatal = 4 - worstError = std::max(worstError, err); - } - // Last read is the alpha channel - char* dataDestination = imageDataDest + (3 * _initData.bytesPerDatum()); - RawTile::ReadError err = repeatedRasterRead(2, io, dataDestination); - - // CE_None = 0, CE_Debug = 1, CE_Warning = 2, CE_Failure = 3, CE_Fatal = 4 - worstError = std::max(worstError, err); - } - else { // Three or more rasters - for (int i = 0; i < 3 && i < nRastersToRead; i++) { - // The final destination pointer is offsetted by one datum byte size - // for every raster (or data channel, i.e. R in RGB) - char* dataDestination = imageDataDest + (i * _initData.bytesPerDatum()); - - RawTile::ReadError err = repeatedRasterRead(3 - i, io, dataDestination); - - // CE_None = 0, CE_Debug = 1, CE_Warning = 2, CE_Failure = 3, CE_Fatal = 4 - worstError = std::max(worstError, err); - } - } - if (nRastersToRead > 3) { // Alpha channel exists - // Last read is the alpha channel - char* dataDestination = imageDataDest + (3 * _initData.bytesPerDatum()); - RawTile::ReadError err = repeatedRasterRead(4, io, dataDestination); - - // CE_None = 0, CE_Debug = 1, CE_Warning = 2, CE_Failure = 3, CE_Fatal = 4 - worstError = std::max(worstError, err); - } - break; - } - default: { - ghoul_assert(false, "Texture format not supported for tiles"); - break; - } - } -} - RawTile::ReadError GdalRawTileDataReader::rasterRead( int rasterBand, const IODescription& io, char* dataDestination) const { @@ -400,4 +276,4 @@ int GdalRawTileDataReader::calculateTileLevelDifference(int minimumPixelSize) co } // namespace globebrowsing } // namespace openspace -#endif // GLOBEBROWSING_USE_GDAL \ No newline at end of file +#endif // GLOBEBROWSING_USE_GDAL diff --git a/modules/globebrowsing/tile/rawtiledatareader/gdalrawtiledatareader.h b/modules/globebrowsing/tile/rawtiledatareader/gdalrawtiledatareader.h index 8280b61ec3..e79c2158af 100644 --- a/modules/globebrowsing/tile/rawtiledatareader/gdalrawtiledatareader.h +++ b/modules/globebrowsing/tile/rawtiledatareader/gdalrawtiledatareader.h @@ -79,6 +79,7 @@ public: virtual float noDataValueAsFloat() const override; virtual int rasterXSize() const override; virtual int rasterYSize() const override; + virtual int dataSourceNumRasters() const; virtual float depthOffset() const override; virtual float depthScale() const override; @@ -96,8 +97,6 @@ protected: private: // Private virtual function overloading virtual void initialize() override; - virtual void readImageData(IODescription& io, RawTile::ReadError& worstError, - char* dataDestination) const override; virtual RawTile::ReadError rasterRead( int rasterBand, const IODescription& io, char* dst) const override; diff --git a/modules/globebrowsing/tile/rawtiledatareader/rawtiledatareader.cpp b/modules/globebrowsing/tile/rawtiledatareader/rawtiledatareader.cpp index b88fb167ed..9078745da4 100644 --- a/modules/globebrowsing/tile/rawtiledatareader/rawtiledatareader.cpp +++ b/modules/globebrowsing/tile/rawtiledatareader/rawtiledatareader.cpp @@ -116,6 +116,134 @@ std::shared_ptr RawTileDataReader::readTileData(TileIndex tileIndex, return rawTile; } +void RawTileDataReader::readImageData( + IODescription& io, RawTile::ReadError& worstError, char* imageDataDest) const { + + // Only read the minimum number of rasters + int nRastersToRead = std::min(dataSourceNumRasters(), + static_cast(_initData.nRasters())); + + switch (_initData.ghoulTextureFormat()) { + case ghoul::opengl::Texture::Format::Red: + if (nRastersToRead == 1) { // One channel + // The final destination pointer is offsetted by one datum byte size + // for every raster (or data channel, i.e. R in RGB) + char* dataDestination = imageDataDest + _initData.bytesPerDatum(); + + RawTile::ReadError err = repeatedRasterRead(1, io, dataDestination); + + // CE_None = 0, CE_Debug = 1, CE_Warning = 2, CE_Failure = 3, CE_Fatal = 4 + worstError = std::max(worstError, err); + } + break; + case ghoul::opengl::Texture::Format::RG: + case ghoul::opengl::Texture::Format::RGB: + case ghoul::opengl::Texture::Format::RGBA: { + if (nRastersToRead == 1) { // Grayscale + for (int i = 0; i < 3; i++) { + // The final destination pointer is offsetted by one datum byte size + // for every raster (or data channel, i.e. R in RGB) + char* dataDestination = imageDataDest + (i * _initData.bytesPerDatum()); + + RawTile::ReadError err = repeatedRasterRead(1, io, dataDestination); + + // CE_None = 0, CE_Debug = 1, CE_Warning = 2, CE_Failure = 3, CE_Fatal = 4 + worstError = std::max(worstError, err); + } + } + else if (nRastersToRead == 2) { // Grayscale + alpha + for (int i = 0; i < 3; i++) { + // The final destination pointer is offsetted by one datum byte size + // for every raster (or data channel, i.e. R in RGB) + char* dataDestination = imageDataDest + (i * _initData.bytesPerDatum()); + + RawTile::ReadError err = repeatedRasterRead(1, io, dataDestination); + + // CE_None = 0, CE_Debug = 1, CE_Warning = 2, CE_Failure = 3, CE_Fatal = 4 + worstError = std::max(worstError, err); + } + // Last read is the alpha channel + char* dataDestination = imageDataDest + (3 * _initData.bytesPerDatum()); + RawTile::ReadError err = repeatedRasterRead(2, io, dataDestination); + + // CE_None = 0, CE_Debug = 1, CE_Warning = 2, CE_Failure = 3, CE_Fatal = 4 + worstError = std::max(worstError, err); + } + else { // Three or more rasters + for (int i = 0; i < nRastersToRead; i++) { + // The final destination pointer is offsetted by one datum byte size + // for every raster (or data channel, i.e. R in RGB) + char* dataDestination = imageDataDest + (i * _initData.bytesPerDatum()); + + RawTile::ReadError err = repeatedRasterRead(i + 1, io, dataDestination); + + // CE_None = 0, CE_Debug = 1, CE_Warning = 2, CE_Failure = 3, CE_Fatal = 4 + worstError = std::max(worstError, err); + } + } + break; + } + case ghoul::opengl::Texture::Format::BGR: + case ghoul::opengl::Texture::Format::BGRA: { + if (nRastersToRead == 1) { // Grayscale + for (int i = 0; i < 3; i++) { + // The final destination pointer is offsetted by one datum byte size + // for every raster (or data channel, i.e. R in RGB) + char* dataDestination = imageDataDest + (i * _initData.bytesPerDatum()); + + RawTile::ReadError err = repeatedRasterRead(1, io, dataDestination); + + // CE_None = 0, CE_Debug = 1, CE_Warning = 2, CE_Failure = 3, CE_Fatal = 4 + worstError = std::max(worstError, err); + } + } + else if (nRastersToRead == 2) { // Grayscale + alpha + for (int i = 0; i < 3; i++) { + // The final destination pointer is offsetted by one datum byte size + // for every raster (or data channel, i.e. R in RGB) + char* dataDestination = imageDataDest + (i * _initData.bytesPerDatum()); + + RawTile::ReadError err = repeatedRasterRead(1, io, dataDestination); + + // CE_None = 0, CE_Debug = 1, CE_Warning = 2, CE_Failure = 3, CE_Fatal = 4 + worstError = std::max(worstError, err); + } + // Last read is the alpha channel + char* dataDestination = imageDataDest + (3 * _initData.bytesPerDatum()); + RawTile::ReadError err = repeatedRasterRead(2, io, dataDestination); + + // CE_None = 0, CE_Debug = 1, CE_Warning = 2, CE_Failure = 3, CE_Fatal = 4 + worstError = std::max(worstError, err); + } + else { // Three or more rasters + for (int i = 0; i < 3 && i < nRastersToRead; i++) { + // The final destination pointer is offsetted by one datum byte size + // for every raster (or data channel, i.e. R in RGB) + char* dataDestination = imageDataDest + (i * _initData.bytesPerDatum()); + + RawTile::ReadError err = repeatedRasterRead(3 - i, io, dataDestination); + + // CE_None = 0, CE_Debug = 1, CE_Warning = 2, CE_Failure = 3, CE_Fatal = 4 + worstError = std::max(worstError, err); + } + } + if (nRastersToRead > 3) { // Alpha channel exists + // Last read is the alpha channel + char* dataDestination = imageDataDest + (3 * _initData.bytesPerDatum()); + RawTile::ReadError err = repeatedRasterRead(4, io, dataDestination); + + // CE_None = 0, CE_Debug = 1, CE_Warning = 2, CE_Failure = 3, CE_Fatal = 4 + worstError = std::max(worstError, err); + } + break; + } + default: { + ghoul_assert(false, "Texture format not supported for tiles"); + break; + } + } +} + TileDepthTransform RawTileDataReader::getDepthTransform() const { return _depthTransform; } diff --git a/modules/globebrowsing/tile/rawtiledatareader/rawtiledatareader.h b/modules/globebrowsing/tile/rawtiledatareader/rawtiledatareader.h index 4d0b5197e9..7840ea5cf2 100644 --- a/modules/globebrowsing/tile/rawtiledatareader/rawtiledatareader.h +++ b/modules/globebrowsing/tile/rawtiledatareader/rawtiledatareader.h @@ -76,6 +76,7 @@ public: virtual float noDataValueAsFloat() const = 0; virtual int rasterXSize() const = 0; virtual int rasterYSize() const = 0; + virtual int dataSourceNumRasters() const = 0; virtual float depthOffset() const; virtual float depthScale() const; PixelRegion fullPixelRegion() const; @@ -96,11 +97,6 @@ protected: */ virtual void initialize() = 0; - /** - * Call this in the constructor of the class extending RawTileDataReader - */ - //void ensureInitialized(); - /** * The function returns a transform to map * the pixel coordinates to cover the whole geodetic lat long space. @@ -113,8 +109,8 @@ protected: * \param worstError should be set to the error code returned when * reading the data. */ - virtual void readImageData( - IODescription& io, RawTile::ReadError& worstError, char* dataDestination) const = 0; + void readImageData( + IODescription& io, RawTile::ReadError& worstError, char* dataDestination) const; virtual RawTile::ReadError rasterRead( int rasterBand, const IODescription& io, char* dst) const = 0; diff --git a/modules/globebrowsing/tile/rawtiledatareader/simplerawtiledatareader.cpp b/modules/globebrowsing/tile/rawtiledatareader/simplerawtiledatareader.cpp index e0d4d72ac7..f1ed547ab7 100644 --- a/modules/globebrowsing/tile/rawtiledatareader/simplerawtiledatareader.cpp +++ b/modules/globebrowsing/tile/rawtiledatareader/simplerawtiledatareader.cpp @@ -73,6 +73,10 @@ int SimpleRawTileDataReader::rasterYSize() const { return _dataTexture->dimensions().y; } +int SimpleRawTileDataReader::dataSourceNumRasters() const { + return _dataTexture->numberOfChannels(); +} + float SimpleRawTileDataReader::depthOffset() const { return 0.0f; } @@ -115,6 +119,7 @@ void SimpleRawTileDataReader::initialize() { _depthTransform = {depthScale(), depthOffset()}; } +/* void SimpleRawTileDataReader::readImageData( IODescription& io, RawTile::ReadError& worstError, char* dataDestination) const { @@ -127,6 +132,7 @@ void SimpleRawTileDataReader::readImageData( // None = 0, Debug = 1, Warning = 2, Failure = 3, Fatal = 4 worstError = std::max(worstError, err); } +*/ RawTile::ReadError SimpleRawTileDataReader::rasterRead( int rasterBand, const IODescription& io, char* dataDestination) const @@ -141,6 +147,8 @@ RawTile::ReadError SimpleRawTileDataReader::rasterRead( "IODescription does not match data texture."); char* pixelWriteRow = dataDestination; + +/* try { // For each row for (int y = 0; y < io.read.region.numPixels.y; y++) { @@ -157,6 +165,7 @@ RawTile::ReadError SimpleRawTileDataReader::rasterRead( return RawTile::ReadError::Failure; } return RawTile::ReadError::None; + */ } diff --git a/modules/globebrowsing/tile/rawtiledatareader/simplerawtiledatareader.h b/modules/globebrowsing/tile/rawtiledatareader/simplerawtiledatareader.h index 0716dca804..7a7d913e15 100644 --- a/modules/globebrowsing/tile/rawtiledatareader/simplerawtiledatareader.h +++ b/modules/globebrowsing/tile/rawtiledatareader/simplerawtiledatareader.h @@ -58,6 +58,7 @@ public: virtual float noDataValueAsFloat() const override; virtual int rasterXSize() const override; virtual int rasterYSize() const override; + virtual int dataSourceNumRasters() const; virtual float depthOffset() const override; virtual float depthScale() const override; @@ -68,8 +69,6 @@ protected: private: // Private virtual function overloading virtual void initialize() override; - virtual void readImageData( - IODescription& io, RawTile::ReadError& worstError, char* dataDestination) const override; virtual RawTile::ReadError rasterRead( int rasterBand, const IODescription& io, char* dst) const override; diff --git a/modules/globebrowsing/tile/tileprovider/defaulttileprovider.cpp b/modules/globebrowsing/tile/tileprovider/defaulttileprovider.cpp index 63496682e5..0179c102ef 100644 --- a/modules/globebrowsing/tile/tileprovider/defaulttileprovider.cpp +++ b/modules/globebrowsing/tile/tileprovider/defaulttileprovider.cpp @@ -214,7 +214,8 @@ void DefaultTileProvider::initAsyncTileDataReader(TileTextureInitData initData) _asyncTextureDataProvider = std::make_shared(_name, tileDataset); - if (_preCacheLevel > -1) { + // Tiles are only available for levels 2 and higher. + if (_preCacheLevel >= 2) { LDEBUG("Precaching '" << _filePath << "' with level '" << _preCacheLevel << "'"); for (int level = 0; level <= _preCacheLevel; ++level) { for (int x = 0; x <= level * 2; ++x) { From 5ef29660836919962de2ae6f444a8152ce6589f1 Mon Sep 17 00:00:00 2001 From: Kalle Bladin Date: Thu, 13 Jul 2017 20:34:56 +0200 Subject: [PATCH 02/28] Move getIODescription from GdalRawTileDataReader to RawTileDataReader. --- .../gdalrawtiledatareader.cpp | 32 ----------------- .../rawtiledatareader/gdalrawtiledatareader.h | 1 - .../rawtiledatareader/rawtiledatareader.cpp | 34 +++++++++++++++++++ .../rawtiledatareader/rawtiledatareader.h | 2 +- .../simplerawtiledatareader.cpp | 4 ++- .../simplerawtiledatareader.h | 4 --- 6 files changed, 38 insertions(+), 39 deletions(-) diff --git a/modules/globebrowsing/tile/rawtiledatareader/gdalrawtiledatareader.cpp b/modules/globebrowsing/tile/rawtiledatareader/gdalrawtiledatareader.cpp index 608baeb69d..b55b651fa2 100644 --- a/modules/globebrowsing/tile/rawtiledatareader/gdalrawtiledatareader.cpp +++ b/modules/globebrowsing/tile/rawtiledatareader/gdalrawtiledatareader.cpp @@ -122,38 +122,6 @@ std::array GdalRawTileDataReader::getGeoTransform() const { return _gdalDatasetMetaDataCached.padfTransform; } -IODescription GdalRawTileDataReader::getIODescription(const TileIndex& tileIndex) const { - IODescription io; - io.read.region = highestResPixelRegion(tileIndex); - - // write region starts in origin - io.write.region.start = PixelRegion::PixelCoordinate(0, 0); - io.write.region.numPixels = PixelRegion::PixelCoordinate( - _initData.dimensionsWithoutPadding().x, _initData.dimensionsWithoutPadding().y); - - io.read.overview = 0; - io.read.fullRegion = fullPixelRegion(); - // For correct sampling in dataset, we need to pad the texture tile - - PixelRegion scaledPadding = padding; - double scale = - io.read.region.numPixels.x / static_cast(io.write.region.numPixels.x); - scaledPadding.numPixels *= scale; - scaledPadding.start *= scale; - - io.read.region.pad(scaledPadding); - io.write.region.pad(padding); - io.write.region.start = PixelRegion::PixelCoordinate(0, 0); - - io.write.bytesPerLine = _initData.bytesPerLine(); - io.write.totalNumBytes = _initData.totalNumBytes(); - - ghoul_assert(io.write.region.numPixels.x == io.write.region.numPixels.y, ""); - ghoul_assert(io.write.region.numPixels.x == _initData.dimensionsWithPadding().x, ""); - - return io; -} - void GdalRawTileDataReader::initialize() { if (_datasetFilePath.empty()) { throw ghoul::RuntimeError("File path must not be empty"); diff --git a/modules/globebrowsing/tile/rawtiledatareader/gdalrawtiledatareader.h b/modules/globebrowsing/tile/rawtiledatareader/gdalrawtiledatareader.h index e79c2158af..12787f1358 100644 --- a/modules/globebrowsing/tile/rawtiledatareader/gdalrawtiledatareader.h +++ b/modules/globebrowsing/tile/rawtiledatareader/gdalrawtiledatareader.h @@ -92,7 +92,6 @@ protected: * the pixel coordinates to cover the whole geodetic lat long space. */ virtual std::array getGeoTransform() const override; - virtual IODescription getIODescription(const TileIndex& tileIndex) const override; private: // Private virtual function overloading diff --git a/modules/globebrowsing/tile/rawtiledatareader/rawtiledatareader.cpp b/modules/globebrowsing/tile/rawtiledatareader/rawtiledatareader.cpp index 9078745da4..fef381fcce 100644 --- a/modules/globebrowsing/tile/rawtiledatareader/rawtiledatareader.cpp +++ b/modules/globebrowsing/tile/rawtiledatareader/rawtiledatareader.cpp @@ -244,6 +244,40 @@ void RawTileDataReader::readImageData( } } +IODescription RawTileDataReader::getIODescription(const TileIndex& tileIndex) const { + IODescription io; + io.read.region = highestResPixelRegion(tileIndex); + + // write region starts in origin + io.write.region.start = PixelRegion::PixelCoordinate(0, 0); + io.write.region.numPixels = PixelRegion::PixelCoordinate( + _initData.dimensionsWithoutPadding().x, _initData.dimensionsWithoutPadding().y); + + io.read.overview = 0; + io.read.fullRegion = fullPixelRegion(); + // For correct sampling in dataset, we need to pad the texture tile + + PixelRegion scaledPadding = padding; + double scale = + io.read.region.numPixels.x / static_cast(io.write.region.numPixels.x); + scaledPadding.numPixels *= scale; + scaledPadding.start *= scale; + + io.read.region.pad(scaledPadding); + io.write.region.pad(padding); + io.write.region.start = PixelRegion::PixelCoordinate(0, 0); + + io.write.bytesPerLine = _initData.bytesPerLine(); + io.write.totalNumBytes = _initData.totalNumBytes(); + + ghoul_assert(io.write.region.numPixels.x == io.write.region.numPixels.y, + "Write region must be square"); + ghoul_assert(io.write.region.numPixels.x == _initData.dimensionsWithPadding().x, + "Write region must match tile it writes to."); + + return io; +} + TileDepthTransform RawTileDataReader::getDepthTransform() const { return _depthTransform; } diff --git a/modules/globebrowsing/tile/rawtiledatareader/rawtiledatareader.h b/modules/globebrowsing/tile/rawtiledatareader/rawtiledatareader.h index 7840ea5cf2..64f0d89f41 100644 --- a/modules/globebrowsing/tile/rawtiledatareader/rawtiledatareader.h +++ b/modules/globebrowsing/tile/rawtiledatareader/rawtiledatareader.h @@ -115,7 +115,7 @@ protected: virtual RawTile::ReadError rasterRead( int rasterBand, const IODescription& io, char* dst) const = 0; - virtual IODescription getIODescription(const TileIndex& tileIndex) const = 0; + IODescription getIODescription(const TileIndex& tileIndex) const; /** * Get the pixel corresponding to a specific position on the globe defined by the diff --git a/modules/globebrowsing/tile/rawtiledatareader/simplerawtiledatareader.cpp b/modules/globebrowsing/tile/rawtiledatareader/simplerawtiledatareader.cpp index f1ed547ab7..f7d730ecea 100644 --- a/modules/globebrowsing/tile/rawtiledatareader/simplerawtiledatareader.cpp +++ b/modules/globebrowsing/tile/rawtiledatareader/simplerawtiledatareader.cpp @@ -85,6 +85,7 @@ float SimpleRawTileDataReader::depthScale() const { return 1.0f; } +/* IODescription SimpleRawTileDataReader::getIODescription(const TileIndex& tileIndex) const { IODescription io; io.read.overview = 0; @@ -96,6 +97,7 @@ IODescription SimpleRawTileDataReader::getIODescription(const TileIndex& tileInd return io; } +*/ void SimpleRawTileDataReader::initialize() { _dataTexture = ghoul::io::TextureReader::ref().loadTexture(_datasetFilePath); @@ -146,7 +148,7 @@ RawTile::ReadError SimpleRawTileDataReader::rasterRead( ghoul_assert(io.read.region.numPixels.y == io.write.region.numPixels.y, "IODescription does not match data texture."); - char* pixelWriteRow = dataDestination; + char* pixelWriteRow = dataDestination + io.write.bytesPerLine; /* try { diff --git a/modules/globebrowsing/tile/rawtiledatareader/simplerawtiledatareader.h b/modules/globebrowsing/tile/rawtiledatareader/simplerawtiledatareader.h index 7a7d913e15..5f8241cf13 100644 --- a/modules/globebrowsing/tile/rawtiledatareader/simplerawtiledatareader.h +++ b/modules/globebrowsing/tile/rawtiledatareader/simplerawtiledatareader.h @@ -62,10 +62,6 @@ public: virtual float depthOffset() const override; virtual float depthScale() const override; -protected: - - virtual IODescription getIODescription(const TileIndex& tileIndex) const override; - private: // Private virtual function overloading virtual void initialize() override; From c22d1e3df4a8544982a27dd3bbf506cc7b13cd56 Mon Sep 17 00:00:00 2001 From: Kalle Bladin Date: Thu, 13 Jul 2017 22:14:29 +0200 Subject: [PATCH 03/28] SimpleRawTileDataReader can now read all image sizes --- .../simplerawtiledatareader.cpp | 152 +++++++++++------- 1 file changed, 91 insertions(+), 61 deletions(-) diff --git a/modules/globebrowsing/tile/rawtiledatareader/simplerawtiledatareader.cpp b/modules/globebrowsing/tile/rawtiledatareader/simplerawtiledatareader.cpp index f7d730ecea..d40a98ddde 100644 --- a/modules/globebrowsing/tile/rawtiledatareader/simplerawtiledatareader.cpp +++ b/modules/globebrowsing/tile/rawtiledatareader/simplerawtiledatareader.cpp @@ -58,7 +58,7 @@ void SimpleRawTileDataReader::reset() { } int SimpleRawTileDataReader::maxChunkLevel() const { - return 2; + return 5; } float SimpleRawTileDataReader::noDataValueAsFloat() const { @@ -85,20 +85,6 @@ float SimpleRawTileDataReader::depthScale() const { return 1.0f; } -/* -IODescription SimpleRawTileDataReader::getIODescription(const TileIndex& tileIndex) const { - IODescription io; - io.read.overview = 0; - io.read.region = highestResPixelRegion(tileIndex); - io.read.fullRegion = PixelRegion({0, 0}, {rasterXSize(), rasterYSize()}); - io.write.region = PixelRegion({0, 0}, io.read.region.numPixels); - io.write.bytesPerLine = _dataTexture->bytesPerPixel() * io.write.region.numPixels.x; - io.write.totalNumBytes = io.write.bytesPerLine * io.write.region.numPixels.y; - - return io; -} -*/ - void SimpleRawTileDataReader::initialize() { _dataTexture = ghoul::io::TextureReader::ref().loadTexture(_datasetFilePath); if (_dataTexture == nullptr) { @@ -108,34 +94,9 @@ void SimpleRawTileDataReader::initialize() { "formats." ); } - float exponentX = log2(_dataTexture->dimensions().x); - float exponentY = log2(_dataTexture->dimensions().y); - if ( (exponentX - static_cast(exponentX)) > 0.0001 || - (exponentY - static_cast(exponentY)) > 0.0001 ) { - throw ghoul::RuntimeError( - "Unable to read dataset: " + _datasetFilePath + - ".\nCurrently only supporting power of 2 textures." - ); - } - _depthTransform = {depthScale(), depthOffset()}; } -/* -void SimpleRawTileDataReader::readImageData( - IODescription& io, RawTile::ReadError& worstError, char* dataDestination) const { - - // Modify to match OpenGL texture layout: - IODescription modifiedIO = io; - modifiedIO.read.region.start.y = modifiedIO.read.fullRegion.numPixels.y - modifiedIO.read.region.numPixels.y - modifiedIO.read.region.start.y; - - RawTile::ReadError err = repeatedRasterRead(0, modifiedIO, dataDestination); - - // None = 0, Debug = 1, Warning = 2, Failure = 3, Fatal = 4 - worstError = std::max(worstError, err); -} -*/ - RawTile::ReadError SimpleRawTileDataReader::rasterRead( int rasterBand, const IODescription& io, char* dataDestination) const { @@ -143,31 +104,100 @@ RawTile::ReadError SimpleRawTileDataReader::rasterRead( "IODescription does not match data texture."); ghoul_assert(static_cast(io.read.fullRegion.numPixels.y) == _dataTexture->dimensions().y, "IODescription does not match data texture."); - ghoul_assert(io.read.region.numPixels.x == io.write.region.numPixels.x, - "IODescription does not match data texture."); - ghoul_assert(io.read.region.numPixels.y == io.write.region.numPixels.y, - "IODescription does not match data texture."); - char* pixelWriteRow = dataDestination + io.write.bytesPerLine; - -/* - try { - // For each row - for (int y = 0; y < io.read.region.numPixels.y; y++) { - int bytesPerLineDataTexture = - _dataTexture->bytesPerPixel() * _dataTexture->dimensions().x; - const char* textureRow = (static_cast(_dataTexture->pixelData()) - + io.read.region.start.x * _dataTexture->bytesPerPixel()) - + io.read.region.start.y * bytesPerLineDataTexture - + y * bytesPerLineDataTexture; - memcpy(pixelWriteRow, textureRow, io.write.bytesPerLine); - pixelWriteRow += io.write.bytesPerLine; + // Modify to match OpenGL texture layout: + IODescription modifiedIO = io; + modifiedIO.read.region.start.y = + modifiedIO.read.fullRegion.numPixels.y - + modifiedIO.read.region.numPixels.y - + modifiedIO.read.region.start.y; + + char* writeDataStart = + dataDestination + + _initData.bytesPerLine() * modifiedIO.write.region.start.y + + _initData.bytesPerPixel() * modifiedIO.write.region.start.x; + + for (int y = 0; y < modifiedIO.write.region.numPixels.y; ++y) { + for (int x = 0; x < modifiedIO.write.region.numPixels.x; ++x) { + char* pixelWriteDestination = + writeDataStart + + y * _initData.bytesPerLine() + + x * _initData.bytesPerPixel(); + + int xInSource = + modifiedIO.read.region.start.x + + static_cast(x) / modifiedIO.write.region.numPixels.x * + modifiedIO.read.region.numPixels.x; + int yInSource = + modifiedIO.read.region.start.y + + static_cast(y) / modifiedIO.write.region.numPixels.y * + modifiedIO.read.region.numPixels.y; + + glm::vec4 sourceTexel = _dataTexture->texelAsFloat(xInSource, yInSource); + + switch (_initData.glType()) { + case GL_UNSIGNED_BYTE: { + unsigned char value = static_cast( + sourceTexel[rasterBand - 1] * 255 + ); + char* bytes = reinterpret_cast(&value); + *pixelWriteDestination = *bytes; + break; + } + case GL_BYTE: { + char value = static_cast( + sourceTexel[rasterBand - 1] + ); + char* bytes = reinterpret_cast(&value); + *pixelWriteDestination = *bytes; + break; + } + case GL_UNSIGNED_SHORT: { + unsigned short value = static_cast( + sourceTexel[rasterBand - 1] + ); + char* bytes = reinterpret_cast(&value); + *pixelWriteDestination = *bytes; + break; + } + case GL_SHORT: { + short value = static_cast( + sourceTexel[rasterBand - 1] + ); + char* bytes = reinterpret_cast(&value); + *pixelWriteDestination = *bytes; + break; + } + case GL_UNSIGNED_INT: { + unsigned int value = static_cast( + sourceTexel[rasterBand - 1] + ); + char* bytes = reinterpret_cast(&value); + *pixelWriteDestination = *bytes; + break; + } + case GL_INT: { + int value = static_cast( + sourceTexel[rasterBand - 1] + ); + char* bytes = reinterpret_cast(&value); + *pixelWriteDestination = *bytes; + break; + } + case GL_FLOAT: { + float value = sourceTexel[rasterBand - 1]; + char* bytes = reinterpret_cast(&value); + *pixelWriteDestination = *bytes; + break; + } + default: { + ghoul_assert(false, "Unknown texture type"); + return RawTile::ReadError::Failure; + } + } } - } catch (const std::exception&) { - return RawTile::ReadError::Failure; } return RawTile::ReadError::None; - */ } From 28a6365aa22ff99f20c964ae38ee74b9c28fde94 Mon Sep 17 00:00:00 2001 From: Kalle Bladin Date: Thu, 13 Jul 2017 23:49:39 +0200 Subject: [PATCH 04/28] Add the ability to have fallback textures --- data/scene/lodglobes/earth/earth.mod | 30 +++++ .../rendering/layer/layergroup.cpp | 15 +++ .../rawtiledatareader/rawtiledatareader.cpp | 16 +-- .../simplerawtiledatareader.cpp | 15 ++- .../tile/tileprovider/tileproviderbylevel.cpp | 103 +++++++++--------- 5 files changed, 108 insertions(+), 71 deletions(-) diff --git a/data/scene/lodglobes/earth/earth.mod b/data/scene/lodglobes/earth/earth.mod index b20133580d..b94ced43a1 100644 --- a/data/scene/lodglobes/earth/earth.mod +++ b/data/scene/lodglobes/earth/earth.mod @@ -68,6 +68,11 @@ return { SegmentsPerPatch = 64, Layers = { ColorLayers = { + { + Name = "Earth Bluemarble Height", + FilePath = "textures/earth_bluemarble_height.jpg", + Enabled = true, + }, { Name = "ESRI VIIRS Combo", Type = "ByLevelTileLayer", @@ -88,6 +93,11 @@ return { }, }, Enabled = true, + Fallback = { + Name = "Blue Marble", + FilePath = "textures/earth_bluemarble.jpg", + Enabled = true, + } }, { Name = "BMNG", @@ -131,6 +141,16 @@ return { Gamma = 1.5, Multiplier = 15.0, }, + Fallback = { + Name = "Earth Night", + FilePath = "textures/earth_night.jpg", + Enabled = true, + Settings = { + Opacity = 1.0, + Gamma = 1.5, + Multiplier = 15.0, + }, + } }, { Type = "TemporalTileLayer", @@ -143,6 +163,11 @@ return { Name = "MODIS_Water_Mask", FilePath = "map_service_configs/GIBS/MODIS_Water_Mask.xml", Enabled = true, + Fallback = { + Name = "Earth Reflectance", + FilePath = "textures/earth_reflectance.jpg", + Enabled = true, + } }, { Name = "GEBCO", @@ -178,6 +203,11 @@ return { FilePath = "map_service_configs/ESRI/TERRAIN.wms", Enabled = true, TilePixelSize = 64, + Fallback = { + Name = "Earth Bluemarble Height", + FilePath = "textures/earth_bluemarble_height.jpg", + Enabled = true, + } }, }, }, diff --git a/modules/globebrowsing/rendering/layer/layergroup.cpp b/modules/globebrowsing/rendering/layer/layergroup.cpp index 7b038c8f58..75b15fa4de 100644 --- a/modules/globebrowsing/rendering/layer/layergroup.cpp +++ b/modules/globebrowsing/rendering/layer/layergroup.cpp @@ -28,6 +28,8 @@ namespace { const char* _loggerCat = "LayerGroup"; + + const char* KeyFallback = "Fallback"; } namespace openspace { @@ -53,6 +55,19 @@ LayerGroup::LayerGroup(layergroupid::GroupID id, const ghoul::Dictionary& dict) } catch (const ghoul::RuntimeError& e) { LERRORC(e.component, e.message); + + if (layerDict.hasKeyAndValue(KeyFallback)) { + LWARNING("Unable to create layer. Initializing fallback layer."); + ghoul::Dictionary fallbackLayerDict = + layerDict.value(KeyFallback); + try { + addLayer(fallbackLayerDict); + } + catch (const ghoul::RuntimeError& e) { + LERRORC(e.component, e.message); + continue; + } + } continue; } } diff --git a/modules/globebrowsing/tile/rawtiledatareader/rawtiledatareader.cpp b/modules/globebrowsing/tile/rawtiledatareader/rawtiledatareader.cpp index fef381fcce..914225f3cb 100644 --- a/modules/globebrowsing/tile/rawtiledatareader/rawtiledatareader.cpp +++ b/modules/globebrowsing/tile/rawtiledatareader/rawtiledatareader.cpp @@ -124,18 +124,12 @@ void RawTileDataReader::readImageData( static_cast(_initData.nRasters())); switch (_initData.ghoulTextureFormat()) { - case ghoul::opengl::Texture::Format::Red: - if (nRastersToRead == 1) { // One channel - // The final destination pointer is offsetted by one datum byte size - // for every raster (or data channel, i.e. R in RGB) - char* dataDestination = imageDataDest + _initData.bytesPerDatum(); - - RawTile::ReadError err = repeatedRasterRead(1, io, dataDestination); - - // CE_None = 0, CE_Debug = 1, CE_Warning = 2, CE_Failure = 3, CE_Fatal = 4 - worstError = std::max(worstError, err); - } + case ghoul::opengl::Texture::Format::Red: { + char* dataDestination = imageDataDest; + RawTile::ReadError err = repeatedRasterRead(1, io, dataDestination); + worstError = std::max(worstError, err); break; + } case ghoul::opengl::Texture::Format::RG: case ghoul::opengl::Texture::Format::RGB: case ghoul::opengl::Texture::Format::RGBA: { diff --git a/modules/globebrowsing/tile/rawtiledatareader/simplerawtiledatareader.cpp b/modules/globebrowsing/tile/rawtiledatareader/simplerawtiledatareader.cpp index d40a98ddde..e11d644c90 100644 --- a/modules/globebrowsing/tile/rawtiledatareader/simplerawtiledatareader.cpp +++ b/modules/globebrowsing/tile/rawtiledatareader/simplerawtiledatareader.cpp @@ -135,6 +135,9 @@ RawTile::ReadError SimpleRawTileDataReader::rasterRead( glm::vec4 sourceTexel = _dataTexture->texelAsFloat(xInSource, yInSource); + // Different type reinterpreting depending on the type of the target texture + // the _initData.glType() does not necessarily have to be the same type as + // the type of the source texture. Therefore the value is cast to float first. switch (_initData.glType()) { case GL_UNSIGNED_BYTE: { unsigned char value = static_cast( @@ -146,7 +149,7 @@ RawTile::ReadError SimpleRawTileDataReader::rasterRead( } case GL_BYTE: { char value = static_cast( - sourceTexel[rasterBand - 1] + sourceTexel[rasterBand - 1] * 255 ); char* bytes = reinterpret_cast(&value); *pixelWriteDestination = *bytes; @@ -154,7 +157,7 @@ RawTile::ReadError SimpleRawTileDataReader::rasterRead( } case GL_UNSIGNED_SHORT: { unsigned short value = static_cast( - sourceTexel[rasterBand - 1] + sourceTexel[rasterBand - 1] * 65535 ); char* bytes = reinterpret_cast(&value); *pixelWriteDestination = *bytes; @@ -162,7 +165,7 @@ RawTile::ReadError SimpleRawTileDataReader::rasterRead( } case GL_SHORT: { short value = static_cast( - sourceTexel[rasterBand - 1] + sourceTexel[rasterBand - 1] * 65535 ); char* bytes = reinterpret_cast(&value); *pixelWriteDestination = *bytes; @@ -170,7 +173,7 @@ RawTile::ReadError SimpleRawTileDataReader::rasterRead( } case GL_UNSIGNED_INT: { unsigned int value = static_cast( - sourceTexel[rasterBand - 1] + sourceTexel[rasterBand - 1] * 4294967295 ); char* bytes = reinterpret_cast(&value); *pixelWriteDestination = *bytes; @@ -178,14 +181,14 @@ RawTile::ReadError SimpleRawTileDataReader::rasterRead( } case GL_INT: { int value = static_cast( - sourceTexel[rasterBand - 1] + sourceTexel[rasterBand - 1] * 4294967295 ); char* bytes = reinterpret_cast(&value); *pixelWriteDestination = *bytes; break; } case GL_FLOAT: { - float value = sourceTexel[rasterBand - 1]; + GLfloat value = sourceTexel[rasterBand - 1]; char* bytes = reinterpret_cast(&value); *pixelWriteDestination = *bytes; break; diff --git a/modules/globebrowsing/tile/tileprovider/tileproviderbylevel.cpp b/modules/globebrowsing/tile/tileprovider/tileproviderbylevel.cpp index 92438fbeb3..39e8c6e39a 100644 --- a/modules/globebrowsing/tile/tileprovider/tileproviderbylevel.cpp +++ b/modules/globebrowsing/tile/tileprovider/tileproviderbylevel.cpp @@ -54,62 +54,57 @@ TileProviderByLevel::TileProviderByLevel(const ghoul::Dictionary& dictionary) } for (size_t i = 0; i < providers.size(); i++) { - try { - std::string dictKey = std::to_string(i + 1); - ghoul::Dictionary levelProviderDict = providers.value( - dictKey + std::string dictKey = std::to_string(i + 1); + ghoul::Dictionary levelProviderDict = providers.value( + dictKey + ); + double floatMaxLevel; + int maxLevel = 0; + if (!levelProviderDict.getValue(KeyMaxLevel, floatMaxLevel)) { + throw std::runtime_error( + "Must define key '" + std::string(KeyMaxLevel) + "'" ); - double floatMaxLevel; - int maxLevel = 0; - if (!levelProviderDict.getValue(KeyMaxLevel, floatMaxLevel)) { - throw std::runtime_error( - "Must define key '" + std::string(KeyMaxLevel) + "'" - ); - } - maxLevel = std::round(floatMaxLevel); - - ghoul::Dictionary providerDict; - if (!levelProviderDict.getValue(KeyTileProvider, providerDict)) { - throw std::runtime_error( - "Must define key '" + std::string(KeyTileProvider) + "'" - ); - } - providerDict.setValue(KeyLayerGroupID, layerGroupID); - - std::string typeString; - providerDict.getValue("Type", typeString); - layergroupid::TypeID typeID = layergroupid::TypeID::Unknown; - if (typeString.empty()) { - typeID = layergroupid::TypeID::DefaultTileLayer; - } - else { - typeID = layergroupid::getTypeIDFromTypeString(typeString); - } - - if (typeID == layergroupid::TypeID::Unknown) { - throw ghoul::RuntimeError("Unknown layer type: " + typeString); - } - - _levelTileProviders.push_back( - std::shared_ptr(TileProvider::createFromDictionary(typeID, providerDict)) - ); - - std::string providerName; - providerDict.getValue("Name", providerName); - _levelTileProviders.back()->setName(providerName); - addPropertySubOwner(_levelTileProviders.back().get()); - - // Ensure we can represent the max level - if(static_cast(_providerIndices.size()) < maxLevel){ - _providerIndices.resize(maxLevel+1, -1); - } - - // map this level to the tile provider index - _providerIndices[maxLevel] = _levelTileProviders.size() - 1; } - catch (const ghoul::RuntimeError& e) { - LWARNING("Unable to create tile provider: " + std::string(e.what())); - } + maxLevel = std::round(floatMaxLevel); + + ghoul::Dictionary providerDict; + if (!levelProviderDict.getValue(KeyTileProvider, providerDict)) { + throw std::runtime_error( + "Must define key '" + std::string(KeyTileProvider) + "'" + ); + } + providerDict.setValue(KeyLayerGroupID, layerGroupID); + + std::string typeString; + providerDict.getValue("Type", typeString); + layergroupid::TypeID typeID = layergroupid::TypeID::Unknown; + if (typeString.empty()) { + typeID = layergroupid::TypeID::DefaultTileLayer; + } + else { + typeID = layergroupid::getTypeIDFromTypeString(typeString); + } + + if (typeID == layergroupid::TypeID::Unknown) { + throw ghoul::RuntimeError("Unknown layer type: " + typeString); + } + + _levelTileProviders.push_back( + std::shared_ptr(TileProvider::createFromDictionary(typeID, providerDict)) + ); + + std::string providerName; + providerDict.getValue("Name", providerName); + _levelTileProviders.back()->setName(providerName); + addPropertySubOwner(_levelTileProviders.back().get()); + + // Ensure we can represent the max level + if(static_cast(_providerIndices.size()) < maxLevel){ + _providerIndices.resize(maxLevel+1, -1); + } + + // map this level to the tile provider index + _providerIndices[maxLevel] = _levelTileProviders.size() - 1; } // Fill in the gaps (value -1) in provider indices, from back to end From e825d3b736f5a2037ef973b2430963429c8f2dc5 Mon Sep 17 00:00:00 2001 From: Kalle Bladin Date: Fri, 14 Jul 2017 00:09:44 +0200 Subject: [PATCH 05/28] Correct type reinterpretation --- .../simplerawtiledatareader.cpp | 23 +++++++------------ 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/modules/globebrowsing/tile/rawtiledatareader/simplerawtiledatareader.cpp b/modules/globebrowsing/tile/rawtiledatareader/simplerawtiledatareader.cpp index e11d644c90..e7e148a0b0 100644 --- a/modules/globebrowsing/tile/rawtiledatareader/simplerawtiledatareader.cpp +++ b/modules/globebrowsing/tile/rawtiledatareader/simplerawtiledatareader.cpp @@ -143,54 +143,47 @@ RawTile::ReadError SimpleRawTileDataReader::rasterRead( unsigned char value = static_cast( sourceTexel[rasterBand - 1] * 255 ); - char* bytes = reinterpret_cast(&value); - *pixelWriteDestination = *bytes; + *reinterpret_cast(pixelWriteDestination) = value; break; } case GL_BYTE: { char value = static_cast( sourceTexel[rasterBand - 1] * 255 ); - char* bytes = reinterpret_cast(&value); - *pixelWriteDestination = *bytes; + *reinterpret_cast(pixelWriteDestination) = value; break; } case GL_UNSIGNED_SHORT: { unsigned short value = static_cast( sourceTexel[rasterBand - 1] * 65535 ); - char* bytes = reinterpret_cast(&value); - *pixelWriteDestination = *bytes; + *reinterpret_cast(pixelWriteDestination) = value; break; } case GL_SHORT: { short value = static_cast( sourceTexel[rasterBand - 1] * 65535 ); - char* bytes = reinterpret_cast(&value); - *pixelWriteDestination = *bytes; + *reinterpret_cast(pixelWriteDestination) = value; break; } case GL_UNSIGNED_INT: { unsigned int value = static_cast( sourceTexel[rasterBand - 1] * 4294967295 ); - char* bytes = reinterpret_cast(&value); - *pixelWriteDestination = *bytes; + *reinterpret_cast(pixelWriteDestination) = value; break; } case GL_INT: { int value = static_cast( sourceTexel[rasterBand - 1] * 4294967295 ); - char* bytes = reinterpret_cast(&value); - *pixelWriteDestination = *bytes; + *reinterpret_cast(pixelWriteDestination) = value; break; } case GL_FLOAT: { - GLfloat value = sourceTexel[rasterBand - 1]; - char* bytes = reinterpret_cast(&value); - *pixelWriteDestination = *bytes; + float value = sourceTexel[rasterBand - 1]; + *reinterpret_cast(pixelWriteDestination) = value; break; } default: { From 42ff93c4da3c2811104c9aaf89f530918a530fbb Mon Sep 17 00:00:00 2001 From: Kalle Bladin Date: Fri, 14 Jul 2017 00:26:01 +0200 Subject: [PATCH 06/28] Add fallback texture for Mars --- data/scene/lodglobes/mars/mars.mod | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/data/scene/lodglobes/mars/mars.mod b/data/scene/lodglobes/mars/mars.mod index 7443aa8f2f..2daeeebdd4 100644 --- a/data/scene/lodglobes/mars/mars.mod +++ b/data/scene/lodglobes/mars/mars.mod @@ -43,6 +43,11 @@ return { Name = "Viking", FilePath = "map_service_configs/MARS_Viking_MDIM21.xml", Enabled = true, + Fallback = { + Name = "Mars Texture", + FilePath = "textures/mars.jpg", + Enabled = true, + }, }, { Name = "MOLA Pseudo Color", From f2d7c9c754154df8f9d54db6c1ef40188836f57e Mon Sep 17 00:00:00 2001 From: Kalle Bladin Date: Fri, 14 Jul 2017 00:46:39 +0200 Subject: [PATCH 07/28] Update maxChunkLevel function --- .../tile/rawtiledatareader/simplerawtiledatareader.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/modules/globebrowsing/tile/rawtiledatareader/simplerawtiledatareader.cpp b/modules/globebrowsing/tile/rawtiledatareader/simplerawtiledatareader.cpp index e7e148a0b0..f5d41d2769 100644 --- a/modules/globebrowsing/tile/rawtiledatareader/simplerawtiledatareader.cpp +++ b/modules/globebrowsing/tile/rawtiledatareader/simplerawtiledatareader.cpp @@ -58,7 +58,8 @@ void SimpleRawTileDataReader::reset() { } int SimpleRawTileDataReader::maxChunkLevel() const { - return 5; + float ratio = static_cast(rasterYSize()) / _initData.dimensionsWithoutPadding().y; + return glm::max(2, 1 + static_cast(glm::log2(ratio))); } float SimpleRawTileDataReader::noDataValueAsFloat() const { @@ -100,9 +101,11 @@ void SimpleRawTileDataReader::initialize() { RawTile::ReadError SimpleRawTileDataReader::rasterRead( int rasterBand, const IODescription& io, char* dataDestination) const { - ghoul_assert(static_cast(io.read.fullRegion.numPixels.x) == _dataTexture->dimensions().x, + ghoul_assert(static_cast( + io.read.fullRegion.numPixels.x) == _dataTexture->dimensions().x, "IODescription does not match data texture."); - ghoul_assert(static_cast(io.read.fullRegion.numPixels.y) == _dataTexture->dimensions().y, + ghoul_assert(static_cast( + io.read.fullRegion.numPixels.y) == _dataTexture->dimensions().y, "IODescription does not match data texture."); // Modify to match OpenGL texture layout: From 0a0942307c9daacc8a3f7e790e749b8e2e360e6f Mon Sep 17 00:00:00 2001 From: Kalle Bladin Date: Fri, 14 Jul 2017 10:58:50 +0200 Subject: [PATCH 08/28] Fix y axis flip issue. --- .../rawtiledatareader/rawtiledatareader.cpp | 6 +++ .../rawtiledatareader/rawtiledatareader.h | 6 +++ .../simplerawtiledatareader.cpp | 37 ++++++++++--------- .../simplerawtiledatareader.h | 3 ++ 4 files changed, 35 insertions(+), 17 deletions(-) diff --git a/modules/globebrowsing/tile/rawtiledatareader/rawtiledatareader.cpp b/modules/globebrowsing/tile/rawtiledatareader/rawtiledatareader.cpp index 914225f3cb..1675a9fd12 100644 --- a/modules/globebrowsing/tile/rawtiledatareader/rawtiledatareader.cpp +++ b/modules/globebrowsing/tile/rawtiledatareader/rawtiledatareader.cpp @@ -119,6 +119,8 @@ std::shared_ptr RawTileDataReader::readTileData(TileIndex tileIndex, void RawTileDataReader::readImageData( IODescription& io, RawTile::ReadError& worstError, char* imageDataDest) const { + io = adjustIODescription(io); + // Only read the minimum number of rasters int nRastersToRead = std::min(dataSourceNumRasters(), static_cast(_initData.nRasters())); @@ -238,6 +240,10 @@ void RawTileDataReader::readImageData( } } +IODescription RawTileDataReader::adjustIODescription(const IODescription& io) const { + return io; +} + IODescription RawTileDataReader::getIODescription(const TileIndex& tileIndex) const { IODescription io; io.read.region = highestResPixelRegion(tileIndex); diff --git a/modules/globebrowsing/tile/rawtiledatareader/rawtiledatareader.h b/modules/globebrowsing/tile/rawtiledatareader/rawtiledatareader.h index 64f0d89f41..338a6a3970 100644 --- a/modules/globebrowsing/tile/rawtiledatareader/rawtiledatareader.h +++ b/modules/globebrowsing/tile/rawtiledatareader/rawtiledatareader.h @@ -112,6 +112,12 @@ protected: void readImageData( IODescription& io, RawTile::ReadError& worstError, char* dataDestination) const; + /** + * The default does not affect the IODescription but this function can be used for + * example to flip the y axis. + */ + virtual IODescription adjustIODescription(const IODescription& io) const; + virtual RawTile::ReadError rasterRead( int rasterBand, const IODescription& io, char* dst) const = 0; diff --git a/modules/globebrowsing/tile/rawtiledatareader/simplerawtiledatareader.cpp b/modules/globebrowsing/tile/rawtiledatareader/simplerawtiledatareader.cpp index f5d41d2769..dc9dfd1bc8 100644 --- a/modules/globebrowsing/tile/rawtiledatareader/simplerawtiledatareader.cpp +++ b/modules/globebrowsing/tile/rawtiledatareader/simplerawtiledatareader.cpp @@ -108,33 +108,26 @@ RawTile::ReadError SimpleRawTileDataReader::rasterRead( io.read.fullRegion.numPixels.y) == _dataTexture->dimensions().y, "IODescription does not match data texture."); - // Modify to match OpenGL texture layout: - IODescription modifiedIO = io; - modifiedIO.read.region.start.y = - modifiedIO.read.fullRegion.numPixels.y - - modifiedIO.read.region.numPixels.y - - modifiedIO.read.region.start.y; - char* writeDataStart = dataDestination + - _initData.bytesPerLine() * modifiedIO.write.region.start.y + - _initData.bytesPerPixel() * modifiedIO.write.region.start.x; + _initData.bytesPerLine() * io.write.region.start.y + + _initData.bytesPerPixel() * io.write.region.start.x; - for (int y = 0; y < modifiedIO.write.region.numPixels.y; ++y) { - for (int x = 0; x < modifiedIO.write.region.numPixels.x; ++x) { + for (int y = 0; y < io.write.region.numPixels.y; ++y) { + for (int x = 0; x < io.write.region.numPixels.x; ++x) { char* pixelWriteDestination = writeDataStart + y * _initData.bytesPerLine() + x * _initData.bytesPerPixel(); int xInSource = - modifiedIO.read.region.start.x + - static_cast(x) / modifiedIO.write.region.numPixels.x * - modifiedIO.read.region.numPixels.x; + io.read.region.start.x + + static_cast(x) / io.write.region.numPixels.x * + io.read.region.numPixels.x; int yInSource = - modifiedIO.read.region.start.y + - static_cast(y) / modifiedIO.write.region.numPixels.y * - modifiedIO.read.region.numPixels.y; + io.read.region.start.y + + static_cast(y) / io.write.region.numPixels.y * + io.read.region.numPixels.y; glm::vec4 sourceTexel = _dataTexture->texelAsFloat(xInSource, yInSource); @@ -199,6 +192,16 @@ RawTile::ReadError SimpleRawTileDataReader::rasterRead( return RawTile::ReadError::None; } +IODescription SimpleRawTileDataReader::adjustIODescription(const IODescription& io) const { + // Modify to match OpenGL texture layout + IODescription modifiedIO = io; + modifiedIO.read.region.start.y = + modifiedIO.read.fullRegion.numPixels.y - + modifiedIO.read.region.numPixels.y - + modifiedIO.read.region.start.y; + + return modifiedIO; +} } // namespace globebrowsing } // namespace openspace diff --git a/modules/globebrowsing/tile/rawtiledatareader/simplerawtiledatareader.h b/modules/globebrowsing/tile/rawtiledatareader/simplerawtiledatareader.h index 5f8241cf13..b22d56d915 100644 --- a/modules/globebrowsing/tile/rawtiledatareader/simplerawtiledatareader.h +++ b/modules/globebrowsing/tile/rawtiledatareader/simplerawtiledatareader.h @@ -62,6 +62,9 @@ public: virtual float depthOffset() const override; virtual float depthScale() const override; +protected: + virtual IODescription adjustIODescription(const IODescription& io) const; + private: // Private virtual function overloading virtual void initialize() override; From 3aa8f2a056c5ca377ce9aae6320a24339aeb94d0 Mon Sep 17 00:00:00 2001 From: Kalle Bladin Date: Wed, 19 Jul 2017 10:01:53 +0200 Subject: [PATCH 09/28] Recompile shaders at initialization of globes --- data/scene/lodglobes/earth/earth.mod | 12 +----------- modules/globebrowsing/globes/chunkedlodglobe.cpp | 5 +++++ modules/globebrowsing/globes/chunkedlodglobe.h | 10 ++++++++++ modules/globebrowsing/globes/renderableglobe.cpp | 4 ++++ 4 files changed, 20 insertions(+), 11 deletions(-) diff --git a/data/scene/lodglobes/earth/earth.mod b/data/scene/lodglobes/earth/earth.mod index 40ca41b843..e18362ed33 100644 --- a/data/scene/lodglobes/earth/earth.mod +++ b/data/scene/lodglobes/earth/earth.mod @@ -66,11 +66,6 @@ return { SegmentsPerPatch = 64, Layers = { ColorLayers = { - { - Name = "Earth Bluemarble Height", - FilePath = "textures/earth_bluemarble_height.jpg", - Enabled = true, - }, { Name = "ESRI VIIRS Combo", Type = "ByLevelTileLayer", @@ -98,8 +93,8 @@ return { } }, { + Name = "ESRI_Imagery_World_2D", FilePath = "map_service_configs/ESRI/ESRI_Imagery_World_2D.wms", - Name = "ESRI", }, { Name = "BMNG", @@ -165,11 +160,6 @@ return { Name = "MODIS_Water_Mask", FilePath = "map_service_configs/GIBS/MODIS_Water_Mask.xml", Enabled = true, - Fallback = { - Name = "Earth Reflectance", - FilePath = "textures/earth_reflectance.jpg", - Enabled = true, - } }, { Name = "GEBCO", diff --git a/modules/globebrowsing/globes/chunkedlodglobe.cpp b/modules/globebrowsing/globes/chunkedlodglobe.cpp index 60de75ff00..c38a791557 100644 --- a/modules/globebrowsing/globes/chunkedlodglobe.cpp +++ b/modules/globebrowsing/globes/chunkedlodglobe.cpp @@ -279,6 +279,11 @@ void ChunkedLodGlobe::notifyShaderRecompilation() { _shadersNeedRecompilation = true; } +void ChunkedLodGlobe::recompileShaders() { + _renderer->recompileShaders(_owner); + _shadersNeedRecompilation = false; +} + void ChunkedLodGlobe::render(const RenderData& data) { stats.startNewRecord(); if (_shadersNeedRecompilation) { diff --git a/modules/globebrowsing/globes/chunkedlodglobe.h b/modules/globebrowsing/globes/chunkedlodglobe.h index 52f5e61d3c..8b7dba9651 100644 --- a/modules/globebrowsing/globes/chunkedlodglobe.h +++ b/modules/globebrowsing/globes/chunkedlodglobe.h @@ -107,8 +107,18 @@ public: */ float getHeight(glm::dvec3 position) const; + /** + * Notifies the renderer to recompile its shaders the next time the render function is + * called. The actual shader recompilation takes place in the render function because + * properties that the shader depends on need to be properly synced. + */ void notifyShaderRecompilation(); + /** + * Directly recompile the shaders of the renderer. + */ + void recompileShaders(); + const int minSplitDepth; const int maxSplitDepth; diff --git a/modules/globebrowsing/globes/renderableglobe.cpp b/modules/globebrowsing/globes/renderableglobe.cpp index 6b61e0f7d0..d7dd6d4b49 100644 --- a/modules/globebrowsing/globes/renderableglobe.cpp +++ b/modules/globebrowsing/globes/renderableglobe.cpp @@ -141,6 +141,10 @@ RenderableGlobe::RenderableGlobe(const ghoul::Dictionary& dictionary) addPropertySubOwner(_debugPropertyOwner); addPropertySubOwner(_layerManager.get()); //addPropertySubOwner(_pointGlobe.get()); + + // Recompile the shaders directly so that it is not done the first time the render + // function is called. + _chunkedLodGlobe->recompileShaders(); } bool RenderableGlobe::initialize() { From fa47fd19fab613c6130ba558826398e6fe164757 Mon Sep 17 00:00:00 2001 From: Kalle Bladin Date: Mon, 7 Aug 2017 10:26:46 +0200 Subject: [PATCH 10/28] Woops, accidentally removed chunkedlodglobe.cpp. Now it is back --- .../globebrowsing/globes/chunkedlodglobe.cpp | 363 ++++++++++++++++++ 1 file changed, 363 insertions(+) create mode 100644 modules/globebrowsing/globes/chunkedlodglobe.cpp diff --git a/modules/globebrowsing/globes/chunkedlodglobe.cpp b/modules/globebrowsing/globes/chunkedlodglobe.cpp new file mode 100644 index 0000000000..4ddc73df95 --- /dev/null +++ b/modules/globebrowsing/globes/chunkedlodglobe.cpp @@ -0,0 +1,363 @@ +/***************************************************************************************** + * * + * OpenSpace * + * * + * Copyright (c) 2014-2017 * + * * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this * + * software and associated documentation files (the "Software"), to deal in the Software * + * without restriction, including without limitation the rights to use, copy, modify, * + * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to * + * permit persons to whom the Software is furnished to do so, subject to the following * + * conditions: * + * * + * The above copyright notice and this permission notice shall be included in all copies * + * or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + ****************************************************************************************/ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include + +#include + +namespace openspace::globebrowsing { + +const TileIndex ChunkedLodGlobe::LEFT_HEMISPHERE_INDEX = TileIndex(0, 0, 1); +const TileIndex ChunkedLodGlobe::RIGHT_HEMISPHERE_INDEX = TileIndex(1, 0, 1); +const GeodeticPatch ChunkedLodGlobe::COVERAGE = GeodeticPatch(0, 0, 90, 180); + +ChunkedLodGlobe::ChunkedLodGlobe(const RenderableGlobe& owner, size_t segmentsPerPatch, + std::shared_ptr layerManager) + : Renderable({ { "Name", owner.name() } }) + , minSplitDepth(2) + , maxSplitDepth(22) + , stats(StatsCollector(absPath("test_stats"), 1, StatsCollector::Enabled::No)) + , _owner(owner) + , _leftRoot(std::make_unique(Chunk(owner, LEFT_HEMISPHERE_INDEX))) + , _rightRoot(std::make_unique(Chunk(owner, RIGHT_HEMISPHERE_INDEX))) + , _layerManager(layerManager) + , _shadersNeedRecompilation(true) +{ + auto geometry = std::make_shared( + static_cast(segmentsPerPatch), + static_cast(segmentsPerPatch), + TriangleSoup::Positions::No, + TriangleSoup::TextureCoordinates::Yes, + TriangleSoup::Normals::No + ); + + _chunkCullers.push_back(std::make_unique()); + _chunkCullers.push_back(std::make_unique( + AABB3(glm::vec3(-1, -1, 0), glm::vec3(1, 1, 1e35))) + ); + + _chunkEvaluatorByAvailableTiles = + std::make_unique(); + _chunkEvaluatorByProjectedArea = + std::make_unique(); + _chunkEvaluatorByDistance = + std::make_unique(); + + _renderer = std::make_unique(geometry, layerManager); +} + +// The destructor is defined here to make it feasiable to use a unique_ptr +// with a forward declaration +ChunkedLodGlobe::~ChunkedLodGlobe() {} + +bool ChunkedLodGlobe::isReady() const { + return true; +} + +std::shared_ptr ChunkedLodGlobe::layerManager() const { + return _layerManager; +} + +bool ChunkedLodGlobe::testIfCullable(const Chunk& chunk, + const RenderData& renderData) const +{ + if (_owner.debugProperties().performHorizonCulling && + _chunkCullers[0]->isCullable(chunk, renderData)) { + return true; + } + if (_owner.debugProperties().performFrustumCulling && + _chunkCullers[1]->isCullable(chunk, renderData)) { + return true; + } + return false; +} + +const ChunkNode& ChunkedLodGlobe::findChunkNode(const Geodetic2& p) const { + ghoul_assert(COVERAGE.contains(p), + "Point must be in lat [-90, 90] and lon [-180, 180]"); + + return p.lon < COVERAGE.center().lon ? _leftRoot->find(p) : _rightRoot->find(p); +} + +int ChunkedLodGlobe::getDesiredLevel( + const Chunk& chunk, const RenderData& renderData) const { + int desiredLevel = 0; + if (_owner.debugProperties().levelByProjectedAreaElseDistance) { + desiredLevel = _chunkEvaluatorByProjectedArea->getDesiredLevel(chunk, renderData); + } + else { + desiredLevel = _chunkEvaluatorByDistance->getDesiredLevel(chunk, renderData); + } + + int desiredLevelByAvailableData = _chunkEvaluatorByAvailableTiles->getDesiredLevel( + chunk, renderData + ); + if (desiredLevelByAvailableData != chunklevelevaluator::Evaluator::UnknownDesiredLevel && + _owner.debugProperties().limitLevelByAvailableData) { + desiredLevel = glm::min(desiredLevel, desiredLevelByAvailableData); + } + + desiredLevel = glm::clamp(desiredLevel, minSplitDepth, maxSplitDepth); + return desiredLevel; +} + +float ChunkedLodGlobe::getHeight(glm::dvec3 position) const { + float height = 0; + + // Get the uv coordinates to sample from + Geodetic2 geodeticPosition = _owner.ellipsoid().cartesianToGeodetic2(position); + int chunkLevel = findChunkNode(geodeticPosition).getChunk().tileIndex().level; + + TileIndex tileIndex = TileIndex(geodeticPosition, chunkLevel); + GeodeticPatch patch = GeodeticPatch(tileIndex); + + Geodetic2 geoDiffPatch = + patch.getCorner(Quad::NORTH_EAST) - patch.getCorner(Quad::SOUTH_WEST); + + Geodetic2 geoDiffPoint = geodeticPosition - patch.getCorner(Quad::SOUTH_WEST); + glm::vec2 patchUV = glm::vec2( + geoDiffPoint.lon / geoDiffPatch.lon, + geoDiffPoint.lat / geoDiffPatch.lat + ); + + // Get the tile providers for the height maps + const std::vector>& heightMapLayers = + _layerManager->layerGroup(layergroupid::GroupID::HeightLayers).activeLayers(); + + for (const std::shared_ptr& layer : heightMapLayers) { + tileprovider::TileProvider* tileProvider = layer->tileProvider(); + if (!tileProvider) { + continue; + } + // Transform the uv coordinates to the current tile texture + ChunkTile chunkTile = tileProvider->getChunkTile(tileIndex); + const Tile& tile = chunkTile.tile; + const TileUvTransform& uvTransform = chunkTile.uvTransform; + const TileDepthTransform& depthTransform = tileProvider->depthTransform(); + if (tile.status() != Tile::Status::OK) { + return 0; + } + + ghoul::opengl::Texture* tileTexture = tile.texture(); + if (!tileTexture) { + return 0; + } + + glm::vec2 transformedUv = Tile::TileUvToTextureSamplePosition( + uvTransform, + patchUV, + glm::uvec2(tileTexture->dimensions()) + ); + + // Sample and do linear interpolation + // (could possibly be moved as a function in ghoul texture) + // Suggestion: a function in ghoul::opengl::Texture that takes uv coordinates + // in range [0,1] and uses the set interpolation method and clamping. + + glm::uvec3 dimensions = tileTexture->dimensions(); + + glm::vec2 samplePos = transformedUv * glm::vec2(dimensions); + glm::uvec2 samplePos00 = samplePos; + samplePos00 = glm::clamp( + samplePos00, + glm::uvec2(0, 0), + glm::uvec2(dimensions) - glm::uvec2(1) + ); + glm::vec2 samplePosFract = samplePos - glm::vec2(samplePos00); + + glm::uvec2 samplePos10 = glm::min( + samplePos00 + glm::uvec2(1, 0), + glm::uvec2(dimensions) - glm::uvec2(1) + ); + glm::uvec2 samplePos01 = glm::min( + samplePos00 + glm::uvec2(0, 1), + glm::uvec2(dimensions) - glm::uvec2(1) + ); + glm::uvec2 samplePos11 = glm::min( + samplePos00 + glm::uvec2(1, 1), + glm::uvec2(dimensions) - glm::uvec2(1) + ); + + float sample00 = tileTexture->texelAsFloat(samplePos00).x; + float sample10 = tileTexture->texelAsFloat(samplePos10).x; + float sample01 = tileTexture->texelAsFloat(samplePos01).x; + float sample11 = tileTexture->texelAsFloat(samplePos11).x; + + // In case the texture has NaN or no data values don't use this height map. + bool anySampleIsNaN = + std::isnan(sample00) || + std::isnan(sample01) || + std::isnan(sample10) || + std::isnan(sample11); + + bool anySampleIsNoData = + sample00 == tileProvider->noDataValueAsFloat() || + sample01 == tileProvider->noDataValueAsFloat() || + sample10 == tileProvider->noDataValueAsFloat() || + sample11 == tileProvider->noDataValueAsFloat(); + + if (anySampleIsNaN || anySampleIsNoData) { + continue; + } + + float sample0 = sample00 * (1.f - samplePosFract.x) + sample10 * samplePosFract.x; + float sample1 = sample01 * (1.f - samplePosFract.x) + sample11 * samplePosFract.x; + + float sample = sample0 * (1.f - samplePosFract.y) + sample1 * samplePosFract.y; + + // Same as is used in the shader. This is not a perfect solution but + // if the sample is actually a no-data-value (min_float) the interpolated + // value might not be. Therefore we have a cut-off. Assuming no data value + // is smaller than -100000 + if (sample > -100000) + { + // Perform depth transform to get the value in meters + height = depthTransform.depthOffset + depthTransform.depthScale * sample; + // Make sure that the height value follows the layer settings. + // For example if the multiplier is set to a value bigger than one, + // the sampled height should be modified as well. + height = layer->renderSettings().performLayerSettings(height); + } + } + // Return the result + return height; +} + +void ChunkedLodGlobe::notifyShaderRecompilation() { + _shadersNeedRecompilation = true; +} + +void ChunkedLodGlobe::recompileShaders() { + _renderer->recompileShaders(_owner); + _shadersNeedRecompilation = false; +} + +void ChunkedLodGlobe::render(const RenderData& data, RendererTasks&) { + stats.startNewRecord(); + if (_shadersNeedRecompilation) { + _renderer->recompileShaders(_owner); + _shadersNeedRecompilation = false; + } + + auto duration = std::chrono::system_clock::now().time_since_epoch(); + auto millis = std::chrono::duration_cast(duration).count(); + stats.i["time"] = millis; + + _leftRoot->updateChunkTree(data); + _rightRoot->updateChunkTree(data); + + // Calculate the MVP matrix + glm::dmat4 viewTransform = glm::dmat4(data.camera.combinedViewMatrix()); + glm::dmat4 vp = glm::dmat4(data.camera.sgctInternal.projectionMatrix()) * viewTransform; + glm::dmat4 mvp = vp * _owner.modelTransform(); + + // Render function + auto renderJob = [this, &data, &mvp](const ChunkNode& chunkNode) { + stats.i["chunks nodes"]++; + const Chunk& chunk = chunkNode.getChunk(); + if (chunkNode.isLeaf()) { + stats.i["leafs chunk nodes"]++; + if (chunk.isVisible()) { + stats.i["rendered chunks"]++; + _renderer->renderChunk(chunkNode.getChunk(), data); + debugRenderChunk(chunk, mvp); + } + } + }; + + _leftRoot->breadthFirst(renderJob); + _rightRoot->breadthFirst(renderJob); + + //_leftRoot->reverseBreadthFirst(renderJob); + //_rightRoot->reverseBreadthFirst(renderJob); + + auto duration2 = std::chrono::system_clock::now().time_since_epoch(); + auto millis2 = std::chrono::duration_cast(duration2).count(); + stats.i["chunk globe render time"] = millis2 - millis; +} + +void ChunkedLodGlobe::debugRenderChunk(const Chunk& chunk, const glm::dmat4& mvp) const { + if (_owner.debugProperties().showChunkBounds || + _owner.debugProperties().showChunkAABB) + { + const std::vector modelSpaceCorners = + chunk.getBoundingPolyhedronCorners(); + std::vector clippingSpaceCorners(8); + AABB3 screenSpaceBounds; + + for (size_t i = 0; i < 8; ++i) { + const glm::vec4& clippingSpaceCorner = mvp * modelSpaceCorners[i]; + clippingSpaceCorners[i] = clippingSpaceCorner; + + glm::vec3 screenSpaceCorner = + (1.0f / clippingSpaceCorner.w) * clippingSpaceCorner; + screenSpaceBounds.expand(screenSpaceCorner); + } + + unsigned int colorBits = 1 + chunk.tileIndex().level % 6; + glm::vec4 color = glm::vec4(colorBits & 1, colorBits & 2, colorBits & 4, 0.3); + + if (_owner.debugProperties().showChunkBounds) { + DebugRenderer::ref().renderNiceBox(clippingSpaceCorners, color); + } + + if (_owner.debugProperties().showChunkAABB) { + auto& screenSpacePoints = + DebugRenderer::ref().verticesFor(screenSpaceBounds); + DebugRenderer::ref().renderNiceBox(screenSpacePoints, color); + } + } +} + +void ChunkedLodGlobe::update(const UpdateData& data) { + setBoundingSphere(static_cast( + _owner.ellipsoid().maximumRadius() * data.modelTransform.scale + )); + _renderer->update(); +} + +} // namespace openspace::globebrowsing From 2ecfd4d05a9c3e24a18902d8eb0bddd3ebca8859 Mon Sep 17 00:00:00 2001 From: Kalle Bladin Date: Mon, 7 Aug 2017 10:45:36 +0200 Subject: [PATCH 11/28] Remove debug code --- modules/globebrowsing/tile/asynctiledataprovider.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/modules/globebrowsing/tile/asynctiledataprovider.cpp b/modules/globebrowsing/tile/asynctiledataprovider.cpp index 39016bf849..3371048b61 100644 --- a/modules/globebrowsing/tile/asynctiledataprovider.cpp +++ b/modules/globebrowsing/tile/asynctiledataprovider.cpp @@ -61,10 +61,6 @@ std::shared_ptr AsyncTileDataProvider::getRawTileDataReader() } bool AsyncTileDataProvider::enqueueTileIO(const TileIndex& tileIndex) { - if (tileIndex.level < 2) { - int hej = 0; - } - if (_resetMode == ResetMode::ShouldNotReset && satisfiesEnqueueCriteria(tileIndex)) { if (_pboContainer) { char* dataPtr = static_cast(_pboContainer->mapBuffer( From 1265de0d50fdb5511c28547d4be409514720c154 Mon Sep 17 00:00:00 2001 From: Kalle Bladin Date: Tue, 8 Aug 2017 14:02:56 +0200 Subject: [PATCH 12/28] Only use padding for height layers --- .../globebrowsing/globes/chunkedlodglobe.cpp | 2 +- .../globebrowsing/rendering/gpu/gpulayer.cpp | 13 +- .../globebrowsing/rendering/gpu/gpulayer.h | 2 + .../globebrowsing/rendering/layer/layer.cpp | 36 +++++ modules/globebrowsing/rendering/layer/layer.h | 10 ++ .../rendering/layer/layermanager.cpp | 11 +- .../rendering/layershadermanager.cpp | 11 -- .../shaders/texturetilemapping.hglsl | 20 +-- modules/globebrowsing/shaders/tile.hglsl | 130 ++++++++---------- .../rawtiledatareader/rawtiledatareader.cpp | 12 +- .../rawtiledatareader/rawtiledatareader.h | 3 - modules/globebrowsing/tile/tile.cpp | 22 --- modules/globebrowsing/tile/tile.h | 4 - .../tile/tileprovider/tileprovider.cpp | 2 +- .../tile/tiletextureinitdata.cpp | 36 +++-- .../globebrowsing/tile/tiletextureinitdata.h | 10 +- 16 files changed, 173 insertions(+), 151 deletions(-) diff --git a/modules/globebrowsing/globes/chunkedlodglobe.cpp b/modules/globebrowsing/globes/chunkedlodglobe.cpp index 4ddc73df95..eaf7245bf0 100644 --- a/modules/globebrowsing/globes/chunkedlodglobe.cpp +++ b/modules/globebrowsing/globes/chunkedlodglobe.cpp @@ -187,7 +187,7 @@ float ChunkedLodGlobe::getHeight(glm::dvec3 position) const { return 0; } - glm::vec2 transformedUv = Tile::TileUvToTextureSamplePosition( + glm::vec2 transformedUv = layer->TileUvToTextureSamplePosition( uvTransform, patchUV, glm::uvec2(tileTexture->dimensions()) diff --git a/modules/globebrowsing/rendering/gpu/gpulayer.cpp b/modules/globebrowsing/rendering/gpu/gpulayer.cpp index e7bea852a2..cf68d93eb8 100644 --- a/modules/globebrowsing/rendering/gpu/gpulayer.cpp +++ b/modules/globebrowsing/rendering/gpu/gpulayer.cpp @@ -25,13 +25,13 @@ #include #include +#include namespace openspace::globebrowsing { void GPULayer::setValue(ghoul::opengl::ProgramObject* programObject, const Layer& layer, const TileIndex& tileIndex, int pileSize) { - ChunkTilePile chunkTilePile = layer.getChunkTilePile(tileIndex, pileSize); gpuRenderSettings.setValue(programObject, layer.renderSettings()); gpuLayerAdjustment.setValue(programObject, layer.layerAdjustment()); @@ -43,9 +43,13 @@ void GPULayer::setValue(ghoul::opengl::ProgramObject* programObject, const Layer case layergroupid::TypeID::TemporalTileLayer: case layergroupid::TypeID::TileIndexTileLayer: case layergroupid::TypeID::ByIndexTileLayer: - case layergroupid::TypeID::ByLevelTileLayer: + case layergroupid::TypeID::ByLevelTileLayer: { + ChunkTilePile chunkTilePile = layer.getChunkTilePile(tileIndex, pileSize); gpuChunkTilePile.setValue(programObject, chunkTilePile); + paddingStartOffset.setValue(programObject, layer.tilePixelStartOffset()); + paddingSizeDifference.setValue(programObject, layer.tilePixelSizeDifference()); break; + } case layergroupid::TypeID::SolidColor: gpuColor.setValue(programObject, layer.otherTypesProperties().color.value()); break; @@ -68,9 +72,12 @@ void GPULayer::bind(ghoul::opengl::ProgramObject* programObject, const Layer& la case layergroupid::TypeID::TemporalTileLayer: case layergroupid::TypeID::TileIndexTileLayer: case layergroupid::TypeID::ByIndexTileLayer: - case layergroupid::TypeID::ByLevelTileLayer: + case layergroupid::TypeID::ByLevelTileLayer: { gpuChunkTilePile.bind(programObject, nameBase + "pile.", pileSize); + paddingStartOffset.bind(programObject, nameBase + "padding.startOffset"); + paddingSizeDifference.bind(programObject, nameBase + "padding.sizeDifference"); break; + } case layergroupid::TypeID::SolidColor: gpuColor.bind(programObject, nameBase + "color"); break; diff --git a/modules/globebrowsing/rendering/gpu/gpulayer.h b/modules/globebrowsing/rendering/gpu/gpulayer.h index e7edba9cb3..caaa313567 100644 --- a/modules/globebrowsing/rendering/gpu/gpulayer.h +++ b/modules/globebrowsing/rendering/gpu/gpulayer.h @@ -73,6 +73,8 @@ private: GPULayerRenderSettings gpuRenderSettings; GPULayerAdjustment gpuLayerAdjustment; + GPUData paddingStartOffset; + GPUData paddingSizeDifference; // Adjustment layer stuff GPUData gpuColor; }; diff --git a/modules/globebrowsing/rendering/layer/layer.cpp b/modules/globebrowsing/rendering/layer/layer.cpp index fec5f0b5c7..727eb42542 100644 --- a/modules/globebrowsing/rendering/layer/layer.cpp +++ b/modules/globebrowsing/rendering/layer/layer.cpp @@ -24,7 +24,9 @@ #include +#include #include +#include namespace openspace::globebrowsing { @@ -102,6 +104,10 @@ Layer::Layer(layergroupid::GroupID id, const ghoul::Dictionary& layerDict) layerDict.getValue(keyEnabled, enabled); _enabled.setValue(enabled); + TileTextureInitData initData = LayerManager::getTileTextureInitData(_layerGroupId); + _padTilePixelStartOffset = initData.tilePixelStartOffset(); + _padTilePixelSizeDifference = initData.tilePixelSizeDifference(); + // Initialize settings ghoul::Dictionary settingsDict; if (layerDict.getValue(keySettings, settingsDict)) { @@ -261,6 +267,36 @@ void Layer::update() { } } +glm::ivec2 Layer::tilePixelStartOffset() const { + return _padTilePixelStartOffset; +} + +glm::ivec2 Layer::tilePixelSizeDifference() const { + return _padTilePixelSizeDifference; +} + +glm::vec2 Layer::compensateSourceTextureSampling(glm::vec2 startOffset, glm::vec2 sizeDiff, + glm::uvec2 resolution, glm::vec2 tileUV) +{ + glm::vec2 sourceSize = glm::vec2(resolution) + sizeDiff; + glm::vec2 currentSize = glm::vec2(resolution); + glm::vec2 sourceToCurrentSize = currentSize / sourceSize; + tileUV = sourceToCurrentSize * (tileUV - startOffset / sourceSize); + return tileUV; +} + +glm::vec2 Layer::TileUvToTextureSamplePosition(const TileUvTransform& uvTransform, + glm::vec2 tileUV, glm::uvec2 resolution) +{ + glm::vec2 uv = uvTransform.uvOffset + uvTransform.uvScale * tileUV; + uv = compensateSourceTextureSampling( + tilePixelStartOffset(), + tilePixelSizeDifference(), + resolution, + uv); + return uv; +} + layergroupid::TypeID Layer::parseTypeIdFromDictionary( const ghoul::Dictionary& initDict) const { diff --git a/modules/globebrowsing/rendering/layer/layer.h b/modules/globebrowsing/rendering/layer/layer.h index bf1d055eb2..4700b15c53 100644 --- a/modules/globebrowsing/rendering/layer/layer.h +++ b/modules/globebrowsing/rendering/layer/layer.h @@ -69,6 +69,13 @@ public: void update(); + glm::ivec2 tilePixelStartOffset() const; + glm::ivec2 tilePixelSizeDifference() const; + glm::vec2 compensateSourceTextureSampling(glm::vec2 startOffset, glm::vec2 sizeDiff, + glm::uvec2 resolution, glm::vec2 tileUV); + glm::vec2 TileUvToTextureSamplePosition(const TileUvTransform& uvTransform, + glm::vec2 tileUV, glm::uvec2 resolution); + private: layergroupid::TypeID parseTypeIdFromDictionary(const ghoul::Dictionary& initDict) const; void initializeBasedOnType(layergroupid::TypeID typeId, ghoul::Dictionary initDict); @@ -86,6 +93,9 @@ private: LayerRenderSettings _renderSettings; LayerAdjustment _layerAdjustment; + glm::ivec2 _padTilePixelStartOffset; + glm::ivec2 _padTilePixelSizeDifference; + const layergroupid::GroupID _layerGroupId; std::function _onChangeCallback; diff --git a/modules/globebrowsing/rendering/layer/layermanager.cpp b/modules/globebrowsing/rendering/layer/layermanager.cpp index 2c5c87fd8c..cf397c9f68 100644 --- a/modules/globebrowsing/rendering/layer/layermanager.cpp +++ b/modules/globebrowsing/rendering/layer/layermanager.cpp @@ -124,33 +124,34 @@ TileTextureInitData LayerManager::getTileTextureInitData(layergroupid::GroupID i size_t tileSize = preferredTileSize ? preferredTileSize : 64; return TileTextureInitData(tileSize, tileSize, GL_FLOAT, ghoul::opengl::Texture::Format::Red, + true, TileTextureInitData::ShouldAllocateDataOnCPU::Yes); } case layergroupid::GroupID::ColorLayers: { size_t tileSize = preferredTileSize ? preferredTileSize : 512; return TileTextureInitData(tileSize, tileSize, GL_UNSIGNED_BYTE, - ghoul::opengl::Texture::Format::BGRA); + ghoul::opengl::Texture::Format::BGRA, false); } case layergroupid::GroupID::Overlays: { size_t tileSize = preferredTileSize ? preferredTileSize : 512; return TileTextureInitData(tileSize, tileSize, GL_UNSIGNED_BYTE, - ghoul::opengl::Texture::Format::BGRA); + ghoul::opengl::Texture::Format::BGRA, false); } case layergroupid::GroupID::NightLayers: { size_t tileSize = preferredTileSize ? preferredTileSize : 512; return TileTextureInitData(tileSize, tileSize, GL_UNSIGNED_BYTE, - ghoul::opengl::Texture::Format::BGRA); + ghoul::opengl::Texture::Format::BGRA, false); } case layergroupid::GroupID::WaterMasks: { size_t tileSize = preferredTileSize ? preferredTileSize : 512; return TileTextureInitData(tileSize, tileSize, GL_UNSIGNED_BYTE, - ghoul::opengl::Texture::Format::BGRA); + ghoul::opengl::Texture::Format::BGRA, false); } default: { ghoul_assert(false, "Unknown layer group ID"); size_t tileSize = preferredTileSize ? preferredTileSize : 512; return TileTextureInitData(tileSize, tileSize, GL_UNSIGNED_BYTE, - ghoul::opengl::Texture::Format::BGRA); + ghoul::opengl::Texture::Format::BGRA, false); } } } diff --git a/modules/globebrowsing/rendering/layershadermanager.cpp b/modules/globebrowsing/rendering/layershadermanager.cpp index a352b896cb..0a17547a08 100644 --- a/modules/globebrowsing/rendering/layershadermanager.cpp +++ b/modules/globebrowsing/rendering/layershadermanager.cpp @@ -116,17 +116,6 @@ LayerShaderManager::LayerShaderPreprocessingData ); pairs.emplace_back("defaultHeight", std::to_string(Chunk::DEFAULT_HEIGHT)); - pairs.emplace_back("tilePaddingStart", - "ivec2(" + - std::to_string(RawTileDataReader::padding.start.x) + "," + - std::to_string(RawTileDataReader::padding.start.y) + ")" - ); - pairs.emplace_back("tilePaddingSizeDiff", - "ivec2(" + - std::to_string(RawTileDataReader::padding.numPixels.x) + "," + - std::to_string(RawTileDataReader::padding.numPixels.y) + ")" - ); - return preprocessingData; } diff --git a/modules/globebrowsing/shaders/texturetilemapping.hglsl b/modules/globebrowsing/shaders/texturetilemapping.hglsl index 64b75a2355..395d219bab 100644 --- a/modules/globebrowsing/shaders/texturetilemapping.hglsl +++ b/modules/globebrowsing/shaders/texturetilemapping.hglsl @@ -119,19 +119,19 @@ vec4 getSample#{layerGroup}#{i}(vec2 uv, LevelWeights levelWeights, // All tile layers are the same. Sample from texture #if (#{#{layerGroup}#{i}LayerType} == 0) // DefaultTileLayer - color = getTexVal(#{layerGroup}[#{i}].pile, levelWeights, uv); + color = getTexVal(#{layerGroup}[#{i}].pile, levelWeights, uv, #{layerGroup}[#{i}].padding); #elif (#{#{layerGroup}#{i}LayerType} == 1) // SingleImageTileLayer - color = getTexVal(#{layerGroup}[#{i}].pile, levelWeights, uv); + color = getTexVal(#{layerGroup}[#{i}].pile, levelWeights, uv, #{layerGroup}[#{i}].padding); #elif (#{#{layerGroup}#{i}LayerType} == 2) // SizeReferenceTileLayer - color = getTexVal(#{layerGroup}[#{i}].pile, levelWeights, uv); + color = getTexVal(#{layerGroup}[#{i}].pile, levelWeights, uv, #{layerGroup}[#{i}].padding); #elif (#{#{layerGroup}#{i}LayerType} == 3) // TemporalTileLayer - color = getTexVal(#{layerGroup}[#{i}].pile, levelWeights, uv); + color = getTexVal(#{layerGroup}[#{i}].pile, levelWeights, uv, #{layerGroup}[#{i}].padding); #elif (#{#{layerGroup}#{i}LayerType} == 4) // TileIndexTileLayer - color = getTexVal(#{layerGroup}[#{i}].pile, levelWeights, uv); + color = getTexVal(#{layerGroup}[#{i}].pile, levelWeights, uv, #{layerGroup}[#{i}].padding); #elif (#{#{layerGroup}#{i}LayerType} == 5) // ByIndexTileLayer - color = getTexVal(#{layerGroup}[#{i}].pile, levelWeights, uv); + color = getTexVal(#{layerGroup}[#{i}].pile, levelWeights, uv, #{layerGroup}[#{i}].padding); #elif (#{#{layerGroup}#{i}LayerType} == 6) // ByLevelTileLayer - color = getTexVal(#{layerGroup}[#{i}].pile, levelWeights, uv); + color = getTexVal(#{layerGroup}[#{i}].pile, levelWeights, uv, #{layerGroup}[#{i}].padding); #elif (#{#{layerGroup}#{i}LayerType} == 7) // SolidColor color.rgb = #{layerGroup}[#{i}].color; #endif @@ -296,8 +296,12 @@ vec4 calculateDebugColor(vec2 uv, vec4 fragPos, vec2 vertexResolution) { } float tileResolution(vec2 tileUV, ChunkTile chunkTile) { + PixelPadding padding; + padding.startOffset = ivec2(0); + padding.sizeDifference = ivec2(0); + vec2 heightResolution = textureSize(chunkTile.textureSampler, 0); - vec2 uv = TileUVToTextureSamplePosition(chunkTile, tileUV); + vec2 uv = TileUVToTextureSamplePosition(chunkTile, tileUV, padding); return gridDots(uv, heightResolution); } diff --git a/modules/globebrowsing/shaders/tile.hglsl b/modules/globebrowsing/shaders/tile.hglsl index d7060b0880..6905e2c82c 100644 --- a/modules/globebrowsing/shaders/tile.hglsl +++ b/modules/globebrowsing/shaders/tile.hglsl @@ -25,90 +25,25 @@ #ifndef TEXTURETILE_HGLSL #define TEXTURETILE_HGLSL -// Must match the values in tiledataset.cpp -// (could be set as shader preprocessing data so that multiple definitions -// are not needed) -#define TILE_PIXEL_START_OFFSET #{tilePaddingStart} -#define TILE_PIXEL_SIZE_DIFFERENCE #{tilePaddingSizeDiff} - -vec4 patchBorderOverlay(vec2 uv, vec3 borderColor, float borderSize) { - vec2 uvOffset = uv - vec2(0.5); - float thres = 0.5 - borderSize/2; - bool isBorder = abs(uvOffset.x) > thres || abs(uvOffset.y) > thres; - vec3 color = isBorder ? borderColor : vec3(0); - return vec4(color, 0); -} - - -///////////////////////////////////////////////////////////////////// -// ChunkTile Depth Transform // -///////////////////////////////////////////////////////////////////// - struct TileDepthTransform { float depthScale; float depthOffset; }; -float getTransformedTexVal(TileDepthTransform transform, float val) { - return transform.depthOffset + transform.depthScale * val; -} - -vec4 getTransformedTexVal(TileDepthTransform transform, vec4 val) { - return transform.depthOffset + transform.depthScale * val; -} - - -///////////////////////////////////////////////////////////////////// -// ChunkTile UV Transform // -///////////////////////////////////////////////////////////////////// - struct TileUvTransform { vec2 uvOffset; vec2 uvScale; }; - -///////////////////////////////////////////////////////////////////// -// ChunkTile // -///////////////////////////////////////////////////////////////////// - struct ChunkTile { sampler2D textureSampler; TileUvTransform uvTransform; }; -vec2 compensateSourceTextureSampling(vec2 startOffset, vec2 sizeDiff, ChunkTile chunkTile, - vec2 tileUV) -{ - ivec2 resolution = textureSize(chunkTile.textureSampler, 0); - - vec2 sourceSize = vec2(resolution) + sizeDiff; - vec2 currentSize = vec2(resolution); - vec2 sourceToCurrentSize = currentSize / sourceSize; - return sourceToCurrentSize * (tileUV - startOffset / sourceSize); -} - -vec2 TileUVToTextureSamplePosition(ChunkTile chunkTile, vec2 tileUV) { - vec2 uv = chunkTile.uvTransform.uvOffset + chunkTile.uvTransform.uvScale * tileUV; - return compensateSourceTextureSampling( - TILE_PIXEL_START_OFFSET, - TILE_PIXEL_SIZE_DIFFERENCE, - chunkTile, - uv - ); -} - -vec4 getTexVal(ChunkTile chunkTile, vec2 tileUV) { - return texture( - chunkTile.textureSampler, - TileUVToTextureSamplePosition(chunkTile, tileUV) - ); -} - - -///////////////////////////////////////////////////////////////////// -// Chunk Tile Pile // -///////////////////////////////////////////////////////////////////// +struct PixelPadding { + ivec2 startOffset; + ivec2 sizeDifference; +}; struct ChunkTilePile { ChunkTile chunkTile0; @@ -134,6 +69,7 @@ struct Layer { TileDepthTransform depthTransform; LayerSettings settings; LayerAdjustment adjustment; + PixelPadding padding; // Other layer type properties stuff vec3 color; @@ -145,6 +81,52 @@ struct LevelWeights { float w3; }; +vec4 patchBorderOverlay(vec2 uv, vec3 borderColor, float borderSize) { + vec2 uvOffset = uv - vec2(0.5); + float thres = 0.5 - borderSize/2; + bool isBorder = abs(uvOffset.x) > thres || abs(uvOffset.y) > thres; + vec3 color = isBorder ? borderColor : vec3(0); + return vec4(color, 0); +} + +float getTransformedTexVal(TileDepthTransform transform, float val) { + return transform.depthOffset + transform.depthScale * val; +} + +vec4 getTransformedTexVal(TileDepthTransform transform, vec4 val) { + return transform.depthOffset + transform.depthScale * val; +} + +vec2 compensateSourceTextureSampling(vec2 startOffset, vec2 sizeDiff, ChunkTile chunkTile, + vec2 tileUV) +{ + ivec2 resolution = textureSize(chunkTile.textureSampler, 0); + + vec2 sourceSize = vec2(resolution) + sizeDiff; + vec2 currentSize = vec2(resolution); + vec2 sourceToCurrentSize = currentSize / sourceSize; + return sourceToCurrentSize * (tileUV - startOffset / sourceSize); +} + +vec2 TileUVToTextureSamplePosition(ChunkTile chunkTile, vec2 tileUV, + PixelPadding padding) +{ + vec2 uv = chunkTile.uvTransform.uvOffset + chunkTile.uvTransform.uvScale * tileUV; + return compensateSourceTextureSampling( + padding.startOffset, + padding.sizeDifference, + chunkTile, + uv + ); +} + +vec4 getTexVal(ChunkTile chunkTile, vec2 tileUV, PixelPadding padding) { + return texture( + chunkTile.textureSampler, + TileUVToTextureSamplePosition(chunkTile, tileUV, padding) + ); +} + float getLevelInterpolationParameter(int chunkLevel, float distanceScaleFactor, float distToVertexOnEllipsoid) { @@ -172,10 +154,12 @@ LevelWeights getDefaultLevelWeights() { return levelWeights; } -vec4 getTexVal(ChunkTilePile chunkTilePile, LevelWeights w, vec2 uv) { - return w.w1 * getTexVal(chunkTilePile.chunkTile0, uv) + - w.w2 * getTexVal(chunkTilePile.chunkTile1, uv) + - w.w3 * getTexVal(chunkTilePile.chunkTile2, uv); +vec4 getTexVal(ChunkTilePile chunkTilePile, LevelWeights w, vec2 uv, + PixelPadding padding) +{ + return w.w1 * getTexVal(chunkTilePile.chunkTile0, uv, padding) + + w.w2 * getTexVal(chunkTilePile.chunkTile1, uv, padding) + + w.w3 * getTexVal(chunkTilePile.chunkTile2, uv, padding); } #endif // TEXTURETILE_HGLSL diff --git a/modules/globebrowsing/tile/rawtiledatareader/rawtiledatareader.cpp b/modules/globebrowsing/tile/rawtiledatareader/rawtiledatareader.cpp index a4cc93d8bc..4a6c9b0d02 100644 --- a/modules/globebrowsing/tile/rawtiledatareader/rawtiledatareader.cpp +++ b/modules/globebrowsing/tile/rawtiledatareader/rawtiledatareader.cpp @@ -54,12 +54,7 @@ #include namespace openspace::globebrowsing { - -const PixelRegion RawTileDataReader::padding = PixelRegion( - TileTextureInitData::tilePixelStartOffset, - TileTextureInitData::tilePixelSizeDifference -); - + RawTileDataReader::RawTileDataReader(const TileTextureInitData& initData, PerformPreprocessing preprocess) : _initData(initData) @@ -256,6 +251,11 @@ IODescription RawTileDataReader::getIODescription(const TileIndex& tileIndex) co io.read.fullRegion = fullPixelRegion(); // For correct sampling in dataset, we need to pad the texture tile + PixelRegion padding = PixelRegion( + _initData.tilePixelStartOffset(), + _initData.tilePixelSizeDifference() + ); + PixelRegion scaledPadding = padding; double scale = io.read.region.numPixels.x / static_cast(io.write.region.numPixels.x); diff --git a/modules/globebrowsing/tile/rawtiledatareader/rawtiledatareader.h b/modules/globebrowsing/tile/rawtiledatareader/rawtiledatareader.h index d4c3e30135..07ec571abc 100644 --- a/modules/globebrowsing/tile/rawtiledatareader/rawtiledatareader.h +++ b/modules/globebrowsing/tile/rawtiledatareader/rawtiledatareader.h @@ -84,9 +84,6 @@ public: * Returns a single channeled empty RawTile of size 16 * 16 pixels. */ std::shared_ptr defaultTileData() const; - - /// Padding around all tiles to read to make sure edge blending works. - const static PixelRegion padding; // same as the two above protected: diff --git a/modules/globebrowsing/tile/tile.cpp b/modules/globebrowsing/tile/tile.cpp index f05b9ebe84..cf8ed712a3 100644 --- a/modules/globebrowsing/tile/tile.cpp +++ b/modules/globebrowsing/tile/tile.cpp @@ -42,26 +42,4 @@ Tile::Tile(ghoul::opengl::Texture* texture, , _status(status) { } -glm::vec2 Tile::compensateSourceTextureSampling(glm::vec2 startOffset, glm::vec2 sizeDiff, - glm::uvec2 resolution, glm::vec2 tileUV) -{ - glm::vec2 sourceSize = glm::vec2(resolution) + sizeDiff; - glm::vec2 currentSize = glm::vec2(resolution); - glm::vec2 sourceToCurrentSize = currentSize / sourceSize; - tileUV = sourceToCurrentSize * (tileUV - startOffset / sourceSize); - return tileUV; -} - -glm::vec2 Tile::TileUvToTextureSamplePosition(const TileUvTransform& uvTransform, - glm::vec2 tileUV, glm::uvec2 resolution) -{ - glm::vec2 uv = uvTransform.uvOffset + uvTransform.uvScale * tileUV; - uv = compensateSourceTextureSampling( - TileTextureInitData::tilePixelStartOffset, - TileTextureInitData::tilePixelSizeDifference, - resolution, - uv); - return uv; -} - } // namespace openspace::globebrowsing diff --git a/modules/globebrowsing/tile/tile.h b/modules/globebrowsing/tile/tile.h index 7f4e617f0b..aa6f746dcf 100644 --- a/modules/globebrowsing/tile/tile.h +++ b/modules/globebrowsing/tile/tile.h @@ -85,10 +85,6 @@ public: return _texture; }; - static glm::vec2 compensateSourceTextureSampling(glm::vec2 startOffset, - glm::vec2 sizeDiff, glm::uvec2 resolution, glm::vec2 tileUV); - static glm::vec2 TileUvToTextureSamplePosition(const TileUvTransform& uvTransform, - glm::vec2 tileUV, glm::uvec2 resolution); /** * A tile with status unavailable that any user can return to * indicate that a tile was unavailable. diff --git a/modules/globebrowsing/tile/tileprovider/tileprovider.cpp b/modules/globebrowsing/tile/tileprovider/tileprovider.cpp index eb0f4a1571..034c669daf 100644 --- a/modules/globebrowsing/tile/tileprovider/tileprovider.cpp +++ b/modules/globebrowsing/tile/tileprovider/tileprovider.cpp @@ -161,7 +161,7 @@ void TileProvider::initializeDefaultTile() { using namespace ghoul::opengl; // Create pixel data - TileTextureInitData initData(8, 8, GL_UNSIGNED_BYTE, Texture::Format::RGBA, + TileTextureInitData initData(8, 8, GL_UNSIGNED_BYTE, Texture::Format::RGBA, false, TileTextureInitData::ShouldAllocateDataOnCPU::Yes); int numBytes = initData.totalNumBytes(); char* pixels = new char[numBytes]; diff --git a/modules/globebrowsing/tile/tiletextureinitdata.cpp b/modules/globebrowsing/tile/tiletextureinitdata.cpp index 5418fefe3e..b2608eac21 100644 --- a/modules/globebrowsing/tile/tiletextureinitdata.cpp +++ b/modules/globebrowsing/tile/tiletextureinitdata.cpp @@ -23,22 +23,26 @@ ****************************************************************************************/ #include + #include namespace openspace::globebrowsing { -const glm::ivec2 TileTextureInitData::tilePixelStartOffset = glm::ivec2(-2); -const glm::ivec2 TileTextureInitData::tilePixelSizeDifference = glm::ivec2(4); +const glm::ivec2 TileTextureInitData::TilePixelStartOffset = glm::ivec2(-2); +const glm::ivec2 TileTextureInitData::TilePixelSizeDifference = glm::ivec2(4); TileTextureInitData::TileTextureInitData(size_t width, size_t height, GLenum glType, - Format textureFormat, ShouldAllocateDataOnCPU shouldAllocateDataOnCPU) + Format textureFormat, bool padTiles, ShouldAllocateDataOnCPU shouldAllocateDataOnCPU) : _glType(glType) , _ghoulTextureFormat(textureFormat) , _shouldAllocateDataOnCPU(shouldAllocateDataOnCPU) { + _tilePixelStartOffset = padTiles ? TilePixelStartOffset : glm::ivec2(0); + _tilePixelSizeDifference = padTiles ? TilePixelSizeDifference : glm::ivec2(0); + _dimensionsWithoutPadding = glm::ivec3(width, height, 1); - _dimensionsWithPadding = glm::ivec3( - width + tilePixelSizeDifference.x, height + tilePixelSizeDifference.y, 1); + _dimensionsWithPadding = glm::ivec3( width + _tilePixelSizeDifference.x, height + _tilePixelSizeDifference.y, + 1); _nRasters = tiledatatype::numberOfRasters(_ghoulTextureFormat); _bytesPerDatum = tiledatatype::numberOfBytes(glType); _bytesPerPixel = _nRasters * _bytesPerDatum; @@ -66,6 +70,14 @@ glm::ivec3 TileTextureInitData::dimensionsWithoutPadding() const { return _dimensionsWithoutPadding; } +glm::ivec2 TileTextureInitData::tilePixelStartOffset() const { + return _tilePixelStartOffset; +} + +glm::ivec2 TileTextureInitData::tilePixelSizeDifference() const { + return _tilePixelSizeDifference; +} + size_t TileTextureInitData::nRasters() const { return _nRasters; } @@ -107,18 +119,18 @@ TileTextureInitData::HashKey TileTextureInitData::hashKey() const { } void TileTextureInitData::calculateHashKey() { - ghoul_assert(_dimensionsWithoutPadding.x > 0, "Incorrect dimension"); - ghoul_assert(_dimensionsWithoutPadding.y > 0, "Incorrect dimension"); - ghoul_assert(_dimensionsWithoutPadding.x <= 1024, "Incorrect dimension"); - ghoul_assert(_dimensionsWithoutPadding.y <= 1024, "Incorrect dimension"); - ghoul_assert(_dimensionsWithoutPadding.z == 1, "Incorrect dimension"); + ghoul_assert(_dimensionsWithPadding.x > 0, "Incorrect dimension"); + ghoul_assert(_dimensionsWithPadding.y > 0, "Incorrect dimension"); + ghoul_assert(_dimensionsWithPadding.x <= 1024, "Incorrect dimension"); + ghoul_assert(_dimensionsWithPadding.y <= 1024, "Incorrect dimension"); + ghoul_assert(_dimensionsWithPadding.z == 1, "Incorrect dimension"); unsigned int format = getUniqueIdFromTextureFormat(_ghoulTextureFormat); ghoul_assert(format < 256, "Incorrect format"); _hashKey = 0LL; - _hashKey |= _dimensionsWithoutPadding.x; - _hashKey |= _dimensionsWithoutPadding.y << 10; + _hashKey |= _dimensionsWithPadding.x; + _hashKey |= _dimensionsWithPadding.y << 10; _hashKey |= static_cast>(_glType) << (10 + 16); _hashKey |= format << (10 + 16 + 4); }; diff --git a/modules/globebrowsing/tile/tiletextureinitdata.h b/modules/globebrowsing/tile/tiletextureinitdata.h index 491ddff368..ff939770c4 100644 --- a/modules/globebrowsing/tile/tiletextureinitdata.h +++ b/modules/globebrowsing/tile/tiletextureinitdata.h @@ -43,6 +43,7 @@ public: using Format = ghoul::opengl::Texture::Format; TileTextureInitData(size_t width, size_t height, GLenum glType, Format textureFormat, + bool padTiles, ShouldAllocateDataOnCPU shouldAllocateDataOnCPU = ShouldAllocateDataOnCPU::No); TileTextureInitData(const TileTextureInitData& original); @@ -51,6 +52,8 @@ public: glm::ivec3 dimensionsWithPadding() const; glm::ivec3 dimensionsWithoutPadding() const; + glm::ivec2 tilePixelStartOffset() const; + glm::ivec2 tilePixelSizeDifference() const; size_t nRasters() const; size_t bytesPerDatum() const; size_t bytesPerPixel() const; @@ -62,16 +65,19 @@ public: bool shouldAllocateDataOnCPU() const; HashKey hashKey() const; - const static glm::ivec2 tilePixelStartOffset; - const static glm::ivec2 tilePixelSizeDifference; + const static glm::ivec2 TilePixelStartOffset; + const static glm::ivec2 TilePixelSizeDifference; private: + void calculateHashKey(); unsigned int getUniqueIdFromTextureFormat(Format textureFormat) const; HashKey _hashKey; glm::ivec3 _dimensionsWithPadding; glm::ivec3 _dimensionsWithoutPadding; + glm::ivec2 _tilePixelStartOffset; + glm::ivec2 _tilePixelSizeDifference; GLenum _glType; Format _ghoulTextureFormat; GLenum _glTextureFormat; From 559a8063bc41fee6e5953d4e8b42c0ea6388d4d5 Mon Sep 17 00:00:00 2001 From: Kalle Bladin Date: Tue, 8 Aug 2017 15:49:27 +0200 Subject: [PATCH 13/28] Do not use padding for temporal VIIRS for faster loading --- .../globebrowsing/cache/memoryawaretilecache.cpp | 2 +- modules/globebrowsing/rendering/layer/layer.cpp | 7 ++++++- .../globebrowsing/rendering/layer/layermanager.cpp | 13 +++++++------ .../globebrowsing/rendering/layer/layermanager.h | 2 +- .../tile/tileprovider/defaulttileprovider.cpp | 11 ++++++++--- .../tile/tileprovider/defaulttileprovider.h | 1 + .../tile/tileprovider/sizereferencetileprovider.cpp | 3 ++- .../tile/tileprovider/tileindextileprovider.cpp | 3 ++- .../tile/tileprovider/tileproviderbylevel.cpp | 2 -- modules/globebrowsing/tile/tiletextureinitdata.cpp | 6 ++++-- modules/globebrowsing/tile/tiletextureinitdata.h | 1 + 11 files changed, 33 insertions(+), 18 deletions(-) diff --git a/modules/globebrowsing/cache/memoryawaretilecache.cpp b/modules/globebrowsing/cache/memoryawaretilecache.cpp index b146f31f36..3dd31eef5d 100644 --- a/modules/globebrowsing/cache/memoryawaretilecache.cpp +++ b/modules/globebrowsing/cache/memoryawaretilecache.cpp @@ -143,7 +143,7 @@ void MemoryAwareTileCache::clear() { void MemoryAwareTileCache::createDefaultTextureContainers() { for (int id = 0; id < layergroupid::NUM_LAYER_GROUPS; id++) { TileTextureInitData initData = - LayerManager::getTileTextureInitData(layergroupid::GroupID(id)); + LayerManager::getTileTextureInitData(layergroupid::GroupID(id), true); assureTextureContainerExists(initData); } } diff --git a/modules/globebrowsing/rendering/layer/layer.cpp b/modules/globebrowsing/rendering/layer/layer.cpp index 727eb42542..40ad9f472a 100644 --- a/modules/globebrowsing/rendering/layer/layer.cpp +++ b/modules/globebrowsing/rendering/layer/layer.cpp @@ -40,6 +40,7 @@ namespace { const char* keySettings = "Settings"; const char* keyAdjustment = "Adjustment"; const char* KeyBlendMode = "BlendMode"; + const char* KeyPadTiles = "PadTiles"; static const openspace::properties::Property::PropertyInfo TypeInfo = { "Type", @@ -104,7 +105,11 @@ Layer::Layer(layergroupid::GroupID id, const ghoul::Dictionary& layerDict) layerDict.getValue(keyEnabled, enabled); _enabled.setValue(enabled); - TileTextureInitData initData = LayerManager::getTileTextureInitData(_layerGroupId); + bool padTiles = true; + layerDict.getValue(KeyPadTiles, padTiles); + + TileTextureInitData initData = LayerManager::getTileTextureInitData(_layerGroupId, + padTiles); _padTilePixelStartOffset = initData.tilePixelStartOffset(); _padTilePixelSizeDifference = initData.tilePixelSizeDifference(); diff --git a/modules/globebrowsing/rendering/layer/layermanager.cpp b/modules/globebrowsing/rendering/layer/layermanager.cpp index cf397c9f68..7efa897c47 100644 --- a/modules/globebrowsing/rendering/layer/layermanager.cpp +++ b/modules/globebrowsing/rendering/layer/layermanager.cpp @@ -117,6 +117,7 @@ void LayerManager::reset(bool includeDisabled) { } TileTextureInitData LayerManager::getTileTextureInitData(layergroupid::GroupID id, + bool padTiles, size_t preferredTileSize) { switch (id) { @@ -124,34 +125,34 @@ TileTextureInitData LayerManager::getTileTextureInitData(layergroupid::GroupID i size_t tileSize = preferredTileSize ? preferredTileSize : 64; return TileTextureInitData(tileSize, tileSize, GL_FLOAT, ghoul::opengl::Texture::Format::Red, - true, + padTiles, TileTextureInitData::ShouldAllocateDataOnCPU::Yes); } case layergroupid::GroupID::ColorLayers: { size_t tileSize = preferredTileSize ? preferredTileSize : 512; return TileTextureInitData(tileSize, tileSize, GL_UNSIGNED_BYTE, - ghoul::opengl::Texture::Format::BGRA, false); + ghoul::opengl::Texture::Format::BGRA, padTiles); } case layergroupid::GroupID::Overlays: { size_t tileSize = preferredTileSize ? preferredTileSize : 512; return TileTextureInitData(tileSize, tileSize, GL_UNSIGNED_BYTE, - ghoul::opengl::Texture::Format::BGRA, false); + ghoul::opengl::Texture::Format::BGRA, padTiles); } case layergroupid::GroupID::NightLayers: { size_t tileSize = preferredTileSize ? preferredTileSize : 512; return TileTextureInitData(tileSize, tileSize, GL_UNSIGNED_BYTE, - ghoul::opengl::Texture::Format::BGRA, false); + ghoul::opengl::Texture::Format::BGRA, padTiles); } case layergroupid::GroupID::WaterMasks: { size_t tileSize = preferredTileSize ? preferredTileSize : 512; return TileTextureInitData(tileSize, tileSize, GL_UNSIGNED_BYTE, - ghoul::opengl::Texture::Format::BGRA, false); + ghoul::opengl::Texture::Format::BGRA, padTiles); } default: { ghoul_assert(false, "Unknown layer group ID"); size_t tileSize = preferredTileSize ? preferredTileSize : 512; return TileTextureInitData(tileSize, tileSize, GL_UNSIGNED_BYTE, - ghoul::opengl::Texture::Format::BGRA, false); + ghoul::opengl::Texture::Format::BGRA, padTiles); } } } diff --git a/modules/globebrowsing/rendering/layer/layermanager.h b/modules/globebrowsing/rendering/layer/layermanager.h index 6fda583ded..b5f88f0eed 100644 --- a/modules/globebrowsing/rendering/layer/layermanager.h +++ b/modules/globebrowsing/rendering/layer/layermanager.h @@ -59,7 +59,7 @@ public: void reset(bool includingDisabled = false); static TileTextureInitData getTileTextureInitData(layergroupid::GroupID id, - size_t preferredTileSize = 0); + bool padTiles, size_t preferredTileSize = 0); static bool shouldPerformPreProcessingOnLayergroup(layergroupid::GroupID id); void onChange(std::function callback); diff --git a/modules/globebrowsing/tile/tileprovider/defaulttileprovider.cpp b/modules/globebrowsing/tile/tileprovider/defaulttileprovider.cpp index c7b47b612b..1bfd89d684 100644 --- a/modules/globebrowsing/tile/tileprovider/defaulttileprovider.cpp +++ b/modules/globebrowsing/tile/tileprovider/defaulttileprovider.cpp @@ -49,6 +49,7 @@ namespace { const char* KeyFilePath = "FilePath"; const char* KeyBasePath = "BasePath"; const char* KeyPreCacheLevel = "PreCacheLevel"; + const char* KeyPadTiles = "PadTiles"; static const openspace::properties::Property::PropertyInfo FilePathInfo = { "FilePath", @@ -98,8 +99,12 @@ DefaultTileProvider::DefaultTileProvider(const ghoul::Dictionary& dictionary) LDEBUG("Default pixel size overridden: " << pixelSize); tilePixelSize = static_cast(pixelSize); } + + _padTiles = true; + dictionary.getValue(KeyPadTiles, _padTiles); + TileTextureInitData initData(LayerManager::getTileTextureInitData( - _layerGroupID, tilePixelSize)); + _layerGroupID, _padTiles, tilePixelSize)); _tilePixelSize.setValue(initData.dimensionsWithoutPadding().x); _performPreProcessing = @@ -136,7 +141,7 @@ void DefaultTileProvider::update() { if (_asyncTextureDataProvider->shouldBeDeleted()) { _asyncTextureDataProvider = nullptr; TileTextureInitData initData(LayerManager::getTileTextureInitData( - _layerGroupID, _tilePixelSize)); + _layerGroupID, _padTiles, _tilePixelSize)); initAsyncTileDataReader(initData); } } @@ -149,7 +154,7 @@ void DefaultTileProvider::reset() { } else { TileTextureInitData initData(LayerManager::getTileTextureInitData( - _layerGroupID, _tilePixelSize)); + _layerGroupID, _padTiles, _tilePixelSize)); initAsyncTileDataReader(initData); } } diff --git a/modules/globebrowsing/tile/tileprovider/defaulttileprovider.h b/modules/globebrowsing/tile/tileprovider/defaulttileprovider.h index e9f68f21b9..5039373c4f 100644 --- a/modules/globebrowsing/tile/tileprovider/defaulttileprovider.h +++ b/modules/globebrowsing/tile/tileprovider/defaulttileprovider.h @@ -86,6 +86,7 @@ private: std::string _basePath; int _preCacheLevel; bool _performPreProcessing; + bool _padTiles; }; } // namespace openspace::globebrowsing::tileprovider diff --git a/modules/globebrowsing/tile/tileprovider/sizereferencetileprovider.cpp b/modules/globebrowsing/tile/tileprovider/sizereferencetileprovider.cpp index 4f02613a7c..286dc969c9 100644 --- a/modules/globebrowsing/tile/tileprovider/sizereferencetileprovider.cpp +++ b/modules/globebrowsing/tile/tileprovider/sizereferencetileprovider.cpp @@ -43,7 +43,8 @@ namespace { namespace openspace::globebrowsing::tileprovider { SizeReferenceTileProvider::SizeReferenceTileProvider(const ghoul::Dictionary& dictionary) - : TextTileProvider(LayerManager::getTileTextureInitData(layergroupid::GroupID::ColorLayers)) + : TextTileProvider( + LayerManager::getTileTextureInitData(layergroupid::GroupID::ColorLayers, false)) , _backgroundTile(Tile::TileUnavailable) { _fontSize = 50; diff --git a/modules/globebrowsing/tile/tileprovider/tileindextileprovider.cpp b/modules/globebrowsing/tile/tileprovider/tileindextileprovider.cpp index 4baf0608a0..4c945c359f 100644 --- a/modules/globebrowsing/tile/tileprovider/tileindextileprovider.cpp +++ b/modules/globebrowsing/tile/tileprovider/tileindextileprovider.cpp @@ -32,7 +32,8 @@ namespace openspace::globebrowsing::tileprovider { TileIndexTileProvider::TileIndexTileProvider(const ghoul::Dictionary&) : TextTileProvider(LayerManager::getTileTextureInitData( - layergroupid::GroupID::ColorLayers + layergroupid::GroupID::ColorLayers, + false )) {} diff --git a/modules/globebrowsing/tile/tileprovider/tileproviderbylevel.cpp b/modules/globebrowsing/tile/tileprovider/tileproviderbylevel.cpp index 2b12f4dca9..8a83737b22 100644 --- a/modules/globebrowsing/tile/tileprovider/tileproviderbylevel.cpp +++ b/modules/globebrowsing/tile/tileprovider/tileproviderbylevel.cpp @@ -29,8 +29,6 @@ #include namespace { - const char* _loggerCat = "TileProviderByLevel"; - const char* KeyProviders = "LevelTileProviders"; const char* KeyMaxLevel = "MaxLevel"; const char* KeyTileProvider = "TileProvider"; diff --git a/modules/globebrowsing/tile/tiletextureinitdata.cpp b/modules/globebrowsing/tile/tiletextureinitdata.cpp index b2608eac21..69d2cc9cec 100644 --- a/modules/globebrowsing/tile/tiletextureinitdata.cpp +++ b/modules/globebrowsing/tile/tiletextureinitdata.cpp @@ -28,13 +28,14 @@ namespace openspace::globebrowsing { -const glm::ivec2 TileTextureInitData::TilePixelStartOffset = glm::ivec2(-2); -const glm::ivec2 TileTextureInitData::TilePixelSizeDifference = glm::ivec2(4); +const glm::ivec2 TileTextureInitData::TilePixelStartOffset = glm::ivec2(-1); +const glm::ivec2 TileTextureInitData::TilePixelSizeDifference = glm::ivec2(2); TileTextureInitData::TileTextureInitData(size_t width, size_t height, GLenum glType, Format textureFormat, bool padTiles, ShouldAllocateDataOnCPU shouldAllocateDataOnCPU) : _glType(glType) , _ghoulTextureFormat(textureFormat) + , _padTiles(padTiles) , _shouldAllocateDataOnCPU(shouldAllocateDataOnCPU) { _tilePixelStartOffset = padTiles ? TilePixelStartOffset : glm::ivec2(0); @@ -59,6 +60,7 @@ TileTextureInitData::TileTextureInitData(const TileTextureInitData& original) original.dimensionsWithoutPadding().y, original.glType(), original.ghoulTextureFormat(), + original._padTiles, original.shouldAllocateDataOnCPU() ? ShouldAllocateDataOnCPU::Yes : ShouldAllocateDataOnCPU::No) { }; diff --git a/modules/globebrowsing/tile/tiletextureinitdata.h b/modules/globebrowsing/tile/tiletextureinitdata.h index ff939770c4..decf3a57b2 100644 --- a/modules/globebrowsing/tile/tiletextureinitdata.h +++ b/modules/globebrowsing/tile/tiletextureinitdata.h @@ -87,6 +87,7 @@ private: size_t _bytesPerLine; size_t _totalNumBytes; bool _shouldAllocateDataOnCPU; + bool _padTiles; }; } // namespace openspace::globebrowsing From 71f811fcd8858b37b627e69139dedab776c50458 Mon Sep 17 00:00:00 2001 From: Kalle Bladin Date: Tue, 8 Aug 2017 16:11:16 +0200 Subject: [PATCH 14/28] Tiles now have the same size even if padding is enabled. --- data/scene/earth/earth.mod | 4 +- .../globebrowsing/cache/texturecontainer.cpp | 2 +- .../gdalrawtiledatareader.cpp | 2 +- .../rawtiledatareader/rawtiledatareader.cpp | 8 ++-- .../simplerawtiledatareader.cpp | 2 +- .../tile/tileprovider/defaulttileprovider.cpp | 2 +- .../sizereferencetileprovider.cpp | 2 +- .../tile/tileprovider/texttileprovider.cpp | 2 +- .../tileprovider/tileindextileprovider.cpp | 6 +-- .../tile/tileprovider/tileprovider.cpp | 2 +- .../tile/tiletextureinitdata.cpp | 38 ++++++++----------- .../globebrowsing/tile/tiletextureinitdata.h | 6 +-- 12 files changed, 35 insertions(+), 41 deletions(-) diff --git a/data/scene/earth/earth.mod b/data/scene/earth/earth.mod index 09c24e615a..e4079b7de3 100644 --- a/data/scene/earth/earth.mod +++ b/data/scene/earth/earth.mod @@ -74,13 +74,15 @@ return { Name = "Temporal VIIRS SNPP", Type = "TemporalTileLayer", FilePath = "map_service_configs/GIBS/Temporal_VIIRS_SNPP_CorrectedReflectance_TrueColor.xml", + PadTiles = false, } }, { MaxLevel = 22, TileProvider = { Name = "ESRI Imagery World 2D", - FilePath = "map_service_configs/ESRI/ESRI_Imagery_World_2D.wms" + FilePath = "map_service_configs/ESRI/ESRI_Imagery_World_2D.wms", + PadTiles = false, } }, }, diff --git a/modules/globebrowsing/cache/texturecontainer.cpp b/modules/globebrowsing/cache/texturecontainer.cpp index c0a49a3b5c..ce713d0b95 100644 --- a/modules/globebrowsing/cache/texturecontainer.cpp +++ b/modules/globebrowsing/cache/texturecontainer.cpp @@ -45,7 +45,7 @@ void TextureContainer::reset() { for (size_t i = 0; i < _numTextures; ++i) { auto tex = std::make_unique( - _initData.dimensionsWithPadding(), + _initData.dimensions(), _initData.ghoulTextureFormat(), _initData.glTextureFormat(), _initData.glType(), diff --git a/modules/globebrowsing/tile/rawtiledatareader/gdalrawtiledatareader.cpp b/modules/globebrowsing/tile/rawtiledatareader/gdalrawtiledatareader.cpp index 731c14c920..b0e607bb6f 100644 --- a/modules/globebrowsing/tile/rawtiledatareader/gdalrawtiledatareader.cpp +++ b/modules/globebrowsing/tile/rawtiledatareader/gdalrawtiledatareader.cpp @@ -144,7 +144,7 @@ void GdalRawTileDataReader::initialize() { _depthTransform = calculateTileDepthTransform(); _cached._tileLevelDifference = - calculateTileLevelDifference(_initData.dimensionsWithoutPadding().x); + calculateTileLevelDifference(_initData.dimensions().x); int numOverviews = _dataset->GetRasterBand(1)->GetOverviewCount(); _cached._maxLevel = -_cached._tileLevelDifference; diff --git a/modules/globebrowsing/tile/rawtiledatareader/rawtiledatareader.cpp b/modules/globebrowsing/tile/rawtiledatareader/rawtiledatareader.cpp index 4a6c9b0d02..046f8c8d8b 100644 --- a/modules/globebrowsing/tile/rawtiledatareader/rawtiledatareader.cpp +++ b/modules/globebrowsing/tile/rawtiledatareader/rawtiledatareader.cpp @@ -245,7 +245,7 @@ IODescription RawTileDataReader::getIODescription(const TileIndex& tileIndex) co // write region starts in origin io.write.region.start = PixelRegion::PixelCoordinate(0, 0); io.write.region.numPixels = PixelRegion::PixelCoordinate( - _initData.dimensionsWithoutPadding().x, _initData.dimensionsWithoutPadding().y); + _initData.dimensions().x, _initData.dimensions().y); io.read.overview = 0; io.read.fullRegion = fullPixelRegion(); @@ -263,15 +263,15 @@ IODescription RawTileDataReader::getIODescription(const TileIndex& tileIndex) co scaledPadding.start *= scale; io.read.region.pad(scaledPadding); - io.write.region.pad(padding); - io.write.region.start = PixelRegion::PixelCoordinate(0, 0); + //io.write.region.pad(padding); + //io.write.region.start = PixelRegion::PixelCoordinate(0, 0); io.write.bytesPerLine = _initData.bytesPerLine(); io.write.totalNumBytes = _initData.totalNumBytes(); ghoul_assert(io.write.region.numPixels.x == io.write.region.numPixels.y, "Write region must be square"); - ghoul_assert(io.write.region.numPixels.x == _initData.dimensionsWithPadding().x, + ghoul_assert(io.write.region.numPixels.x == _initData.dimensions().x, "Write region must match tile it writes to."); return io; diff --git a/modules/globebrowsing/tile/rawtiledatareader/simplerawtiledatareader.cpp b/modules/globebrowsing/tile/rawtiledatareader/simplerawtiledatareader.cpp index 3f4acf260b..84acea65bc 100644 --- a/modules/globebrowsing/tile/rawtiledatareader/simplerawtiledatareader.cpp +++ b/modules/globebrowsing/tile/rawtiledatareader/simplerawtiledatareader.cpp @@ -57,7 +57,7 @@ void SimpleRawTileDataReader::reset() { } int SimpleRawTileDataReader::maxChunkLevel() const { - float ratio = static_cast(rasterYSize()) / _initData.dimensionsWithoutPadding().y; + float ratio = static_cast(rasterYSize()) / _initData.dimensions().y; return glm::max(2, 1 + static_cast(glm::log2(ratio))); } diff --git a/modules/globebrowsing/tile/tileprovider/defaulttileprovider.cpp b/modules/globebrowsing/tile/tileprovider/defaulttileprovider.cpp index 1bfd89d684..2383bf306d 100644 --- a/modules/globebrowsing/tile/tileprovider/defaulttileprovider.cpp +++ b/modules/globebrowsing/tile/tileprovider/defaulttileprovider.cpp @@ -105,7 +105,7 @@ DefaultTileProvider::DefaultTileProvider(const ghoul::Dictionary& dictionary) TileTextureInitData initData(LayerManager::getTileTextureInitData( _layerGroupID, _padTiles, tilePixelSize)); - _tilePixelSize.setValue(initData.dimensionsWithoutPadding().x); + _tilePixelSize.setValue(initData.dimensions().x); _performPreProcessing = LayerManager::shouldPerformPreProcessingOnLayergroup(_layerGroupID); diff --git a/modules/globebrowsing/tile/tileprovider/sizereferencetileprovider.cpp b/modules/globebrowsing/tile/tileprovider/sizereferencetileprovider.cpp index 286dc969c9..054d8a6400 100644 --- a/modules/globebrowsing/tile/tileprovider/sizereferencetileprovider.cpp +++ b/modules/globebrowsing/tile/tileprovider/sizereferencetileprovider.cpp @@ -74,7 +74,7 @@ void SizeReferenceTileProvider::renderText(const ghoul::fontrendering::FontRende textPosition.x = 0; textPosition.y = aboveEquator ? _fontSize / 2.f : - _initData.dimensionsWithPadding().y - 3.f * _fontSize / 2.f; + _initData.dimensions().y - 3.f * _fontSize / 2.f; glm::vec4 color(1.0, 1.0, 1.0, 1.0); fontRenderer.render( diff --git a/modules/globebrowsing/tile/tileprovider/texttileprovider.cpp b/modules/globebrowsing/tile/tileprovider/texttileprovider.cpp index cdf048d919..5b4abbac7f 100644 --- a/modules/globebrowsing/tile/tileprovider/texttileprovider.cpp +++ b/modules/globebrowsing/tile/tileprovider/texttileprovider.cpp @@ -50,7 +50,7 @@ TextTileProvider::TextTileProvider(const TileTextureInitData& initData, size_t f _font = OsEng.fontManager().font("Mono", static_cast(_fontSize)); _fontRenderer = std::unique_ptr(FontRenderer::createDefault()); - _fontRenderer->setFramebufferSize(_initData.dimensionsWithPadding()); + _fontRenderer->setFramebufferSize(_initData.dimensions()); glGenFramebuffers(1, &_fbo); } diff --git a/modules/globebrowsing/tile/tileprovider/tileindextileprovider.cpp b/modules/globebrowsing/tile/tileprovider/tileindextileprovider.cpp index 4c945c359f..22c7b727b9 100644 --- a/modules/globebrowsing/tile/tileprovider/tileindextileprovider.cpp +++ b/modules/globebrowsing/tile/tileprovider/tileindextileprovider.cpp @@ -43,9 +43,9 @@ void TileIndexTileProvider::renderText(const ghoul::fontrendering::FontRenderer& fontRenderer.render( *_font, glm::vec2( - _initData.dimensionsWithPadding().x / 4 - - (_initData.dimensionsWithPadding().x / 32) * log10(1 << tileIndex.level), - _initData.dimensionsWithPadding().y / 2 + _fontSize), + _initData.dimensions().x / 4 - + (_initData.dimensions().x / 32) * log10(1 << tileIndex.level), + _initData.dimensions().y / 2 + _fontSize), glm::vec4(1.0, 1.0, 1.0, 1.0), glm::vec4(1.0, 1.0, 1.0, 1.0), "level: %i \nx: %i \ny: %i", diff --git a/modules/globebrowsing/tile/tileprovider/tileprovider.cpp b/modules/globebrowsing/tile/tileprovider/tileprovider.cpp index 034c669daf..d4784278e1 100644 --- a/modules/globebrowsing/tile/tileprovider/tileprovider.cpp +++ b/modules/globebrowsing/tile/tileprovider/tileprovider.cpp @@ -168,7 +168,7 @@ void TileProvider::initializeDefaultTile() { memset(pixels, 0, numBytes); // Create ghoul texture - _defaultTileTexture = std::make_unique(initData.dimensionsWithPadding()); + _defaultTileTexture = std::make_unique(initData.dimensions()); _defaultTileTexture->setDataOwnership(Texture::TakeOwnership::Yes); _defaultTileTexture->setPixelData(pixels); _defaultTileTexture->uploadTexture(); diff --git a/modules/globebrowsing/tile/tiletextureinitdata.cpp b/modules/globebrowsing/tile/tiletextureinitdata.cpp index 69d2cc9cec..1f8e1b4da3 100644 --- a/modules/globebrowsing/tile/tiletextureinitdata.cpp +++ b/modules/globebrowsing/tile/tiletextureinitdata.cpp @@ -28,8 +28,8 @@ namespace openspace::globebrowsing { -const glm::ivec2 TileTextureInitData::TilePixelStartOffset = glm::ivec2(-1); -const glm::ivec2 TileTextureInitData::TilePixelSizeDifference = glm::ivec2(2); +const glm::ivec2 TileTextureInitData::TilePixelStartOffset = glm::ivec2(-2); +const glm::ivec2 TileTextureInitData::TilePixelSizeDifference = glm::ivec2(4); TileTextureInitData::TileTextureInitData(size_t width, size_t height, GLenum glType, Format textureFormat, bool padTiles, ShouldAllocateDataOnCPU shouldAllocateDataOnCPU) @@ -41,14 +41,12 @@ TileTextureInitData::TileTextureInitData(size_t width, size_t height, GLenum glT _tilePixelStartOffset = padTiles ? TilePixelStartOffset : glm::ivec2(0); _tilePixelSizeDifference = padTiles ? TilePixelSizeDifference : glm::ivec2(0); - _dimensionsWithoutPadding = glm::ivec3(width, height, 1); - _dimensionsWithPadding = glm::ivec3( width + _tilePixelSizeDifference.x, height + _tilePixelSizeDifference.y, - 1); + _dimensions = glm::ivec3(width, height, 1); _nRasters = tiledatatype::numberOfRasters(_ghoulTextureFormat); _bytesPerDatum = tiledatatype::numberOfBytes(glType); _bytesPerPixel = _nRasters * _bytesPerDatum; - _bytesPerLine = _bytesPerPixel * _dimensionsWithPadding.x; - _totalNumBytes = _bytesPerLine * _dimensionsWithPadding.y; + _bytesPerLine = _bytesPerPixel * _dimensions.x; + _totalNumBytes = _bytesPerLine * _dimensions.y; _glTextureFormat = tiledatatype::glTextureFormat(_glType, _ghoulTextureFormat); calculateHashKey(); @@ -56,20 +54,16 @@ TileTextureInitData::TileTextureInitData(size_t width, size_t height, GLenum glT TileTextureInitData::TileTextureInitData(const TileTextureInitData& original) : TileTextureInitData( - original.dimensionsWithoutPadding().x, - original.dimensionsWithoutPadding().y, + original.dimensions().x, + original.dimensions().y, original.glType(), original.ghoulTextureFormat(), original._padTiles, original.shouldAllocateDataOnCPU() ? ShouldAllocateDataOnCPU::Yes : ShouldAllocateDataOnCPU::No) { }; -glm::ivec3 TileTextureInitData::dimensionsWithPadding() const { - return _dimensionsWithPadding; -} - -glm::ivec3 TileTextureInitData::dimensionsWithoutPadding() const { - return _dimensionsWithoutPadding; +glm::ivec3 TileTextureInitData::dimensions() const { + return _dimensions; } glm::ivec2 TileTextureInitData::tilePixelStartOffset() const { @@ -121,18 +115,18 @@ TileTextureInitData::HashKey TileTextureInitData::hashKey() const { } void TileTextureInitData::calculateHashKey() { - ghoul_assert(_dimensionsWithPadding.x > 0, "Incorrect dimension"); - ghoul_assert(_dimensionsWithPadding.y > 0, "Incorrect dimension"); - ghoul_assert(_dimensionsWithPadding.x <= 1024, "Incorrect dimension"); - ghoul_assert(_dimensionsWithPadding.y <= 1024, "Incorrect dimension"); - ghoul_assert(_dimensionsWithPadding.z == 1, "Incorrect dimension"); + ghoul_assert(_dimensions.x > 0, "Incorrect dimension"); + ghoul_assert(_dimensions.y > 0, "Incorrect dimension"); + ghoul_assert(_dimensions.x <= 1024, "Incorrect dimension"); + ghoul_assert(_dimensions.y <= 1024, "Incorrect dimension"); + ghoul_assert(_dimensions.z == 1, "Incorrect dimension"); unsigned int format = getUniqueIdFromTextureFormat(_ghoulTextureFormat); ghoul_assert(format < 256, "Incorrect format"); _hashKey = 0LL; - _hashKey |= _dimensionsWithPadding.x; - _hashKey |= _dimensionsWithPadding.y << 10; + _hashKey |= _dimensions.x; + _hashKey |= _dimensions.y << 10; _hashKey |= static_cast>(_glType) << (10 + 16); _hashKey |= format << (10 + 16 + 4); }; diff --git a/modules/globebrowsing/tile/tiletextureinitdata.h b/modules/globebrowsing/tile/tiletextureinitdata.h index decf3a57b2..b2549d8a06 100644 --- a/modules/globebrowsing/tile/tiletextureinitdata.h +++ b/modules/globebrowsing/tile/tiletextureinitdata.h @@ -50,8 +50,7 @@ public: ~TileTextureInitData() = default; - glm::ivec3 dimensionsWithPadding() const; - glm::ivec3 dimensionsWithoutPadding() const; + glm::ivec3 dimensions() const; glm::ivec2 tilePixelStartOffset() const; glm::ivec2 tilePixelSizeDifference() const; size_t nRasters() const; @@ -74,8 +73,7 @@ private: unsigned int getUniqueIdFromTextureFormat(Format textureFormat) const; HashKey _hashKey; - glm::ivec3 _dimensionsWithPadding; - glm::ivec3 _dimensionsWithoutPadding; + glm::ivec3 _dimensions; glm::ivec2 _tilePixelStartOffset; glm::ivec2 _tilePixelSizeDifference; GLenum _glType; From afe449c67d855232da7dbe2805aa23761f3f51fd Mon Sep 17 00:00:00 2001 From: Kalle Bladin Date: Tue, 8 Aug 2017 16:39:58 +0200 Subject: [PATCH 15/28] Specify no padding for layer --- data/scene/earth/earth.mod | 1 + 1 file changed, 1 insertion(+) diff --git a/data/scene/earth/earth.mod b/data/scene/earth/earth.mod index e4079b7de3..e38d6477c7 100644 --- a/data/scene/earth/earth.mod +++ b/data/scene/earth/earth.mod @@ -87,6 +87,7 @@ return { }, }, Enabled = true, + PadTiles = false, Fallback = { Name = "Blue Marble", FilePath = "textures/earth_bluemarble.jpg", From 3adf03707305ac3d676703fe83a687b07240f601 Mon Sep 17 00:00:00 2001 From: Kalle Bladin Date: Tue, 8 Aug 2017 17:23:19 +0200 Subject: [PATCH 16/28] Clean up --- modules/globebrowsing/rendering/gpu/gpulayer.cpp | 1 - modules/globebrowsing/rendering/layer/layer.cpp | 4 ++-- .../globebrowsing/rendering/layer/layermanager.h | 3 ++- .../tile/rawtiledatareader/gdalrawtiledatareader.h | 13 ++++++------- .../tile/rawtiledatareader/rawtiledatareader.cpp | 10 +++++----- .../tile/rawtiledatareader/rawtiledatareader.h | 2 +- .../tile/tileprovider/defaulttileprovider.cpp | 12 ++++++++---- .../tile/tileprovider/tileprovider.cpp | 3 ++- .../tile/tileprovider/tileproviderbylevel.cpp | 4 ++-- modules/globebrowsing/tile/tiletextureinitdata.cpp | 3 ++- modules/globebrowsing/tile/tiletextureinitdata.h | 4 ++-- 11 files changed, 32 insertions(+), 27 deletions(-) diff --git a/modules/globebrowsing/rendering/gpu/gpulayer.cpp b/modules/globebrowsing/rendering/gpu/gpulayer.cpp index cf68d93eb8..6899cdbc97 100644 --- a/modules/globebrowsing/rendering/gpu/gpulayer.cpp +++ b/modules/globebrowsing/rendering/gpu/gpulayer.cpp @@ -25,7 +25,6 @@ #include #include -#include namespace openspace::globebrowsing { diff --git a/modules/globebrowsing/rendering/layer/layer.cpp b/modules/globebrowsing/rendering/layer/layer.cpp index 40ad9f472a..e23e9b24cc 100644 --- a/modules/globebrowsing/rendering/layer/layer.cpp +++ b/modules/globebrowsing/rendering/layer/layer.cpp @@ -281,7 +281,7 @@ glm::ivec2 Layer::tilePixelSizeDifference() const { } glm::vec2 Layer::compensateSourceTextureSampling(glm::vec2 startOffset, glm::vec2 sizeDiff, - glm::uvec2 resolution, glm::vec2 tileUV) + glm::uvec2 resolution, glm::vec2 tileUV) { glm::vec2 sourceSize = glm::vec2(resolution) + sizeDiff; glm::vec2 currentSize = glm::vec2(resolution); @@ -291,7 +291,7 @@ glm::vec2 Layer::compensateSourceTextureSampling(glm::vec2 startOffset, glm::vec } glm::vec2 Layer::TileUvToTextureSamplePosition(const TileUvTransform& uvTransform, - glm::vec2 tileUV, glm::uvec2 resolution) + glm::vec2 tileUV, glm::uvec2 resolution) { glm::vec2 uv = uvTransform.uvOffset + uvTransform.uvScale * tileUV; uv = compensateSourceTextureSampling( diff --git a/modules/globebrowsing/rendering/layer/layermanager.h b/modules/globebrowsing/rendering/layer/layermanager.h index b5f88f0eed..dfc331bfa1 100644 --- a/modules/globebrowsing/rendering/layer/layermanager.h +++ b/modules/globebrowsing/rendering/layer/layermanager.h @@ -59,7 +59,8 @@ public: void reset(bool includingDisabled = false); static TileTextureInitData getTileTextureInitData(layergroupid::GroupID id, - bool padTiles, size_t preferredTileSize = 0); + bool padTiles, + size_t preferredTileSize = 0); static bool shouldPerformPreProcessingOnLayergroup(layergroupid::GroupID id); void onChange(std::function callback); diff --git a/modules/globebrowsing/tile/rawtiledatareader/gdalrawtiledatareader.h b/modules/globebrowsing/tile/rawtiledatareader/gdalrawtiledatareader.h index 60486008dc..34e81e8e09 100644 --- a/modules/globebrowsing/tile/rawtiledatareader/gdalrawtiledatareader.h +++ b/modules/globebrowsing/tile/rawtiledatareader/gdalrawtiledatareader.h @@ -63,11 +63,10 @@ public: * \param baseDirectory, the base directory to use in future loading operations */ GdalRawTileDataReader(const std::string& filePath, - const TileTextureInitData& initData, - const std::string& baseDirectory = "", - RawTileDataReader::PerformPreprocessing preprocess = - RawTileDataReader::PerformPreprocessing::No - ); + const TileTextureInitData& initData, + const std::string& baseDirectory = "", + RawTileDataReader::PerformPreprocessing preprocess = + RawTileDataReader::PerformPreprocessing::No); virtual ~GdalRawTileDataReader() override; @@ -95,8 +94,8 @@ protected: private: // Private virtual function overloading virtual void initialize() override; - virtual RawTile::ReadError rasterRead( - int rasterBand, const IODescription& io, char* dst) const override; + virtual RawTile::ReadError rasterRead(int rasterBand, const IODescription& io, + char* dst) const override; // GDAL Helper methods GDALDataset* openGdalDataset(const std::string& filePath); diff --git a/modules/globebrowsing/tile/rawtiledatareader/rawtiledatareader.cpp b/modules/globebrowsing/tile/rawtiledatareader/rawtiledatareader.cpp index 046f8c8d8b..134f2d441d 100644 --- a/modules/globebrowsing/tile/rawtiledatareader/rawtiledatareader.cpp +++ b/modules/globebrowsing/tile/rawtiledatareader/rawtiledatareader.cpp @@ -56,11 +56,11 @@ namespace openspace::globebrowsing { RawTileDataReader::RawTileDataReader(const TileTextureInitData& initData, - PerformPreprocessing preprocess) + PerformPreprocessing preprocess) : _initData(initData) , _preprocess(preprocess) , _hasBeenInitialized(false) -{} +{ } std::shared_ptr RawTileDataReader::defaultTileData() const { return std::make_shared(RawTile::createDefault(_initData)); @@ -110,9 +110,9 @@ std::shared_ptr RawTileDataReader::readTileData(TileIndex tileIndex, return rawTile; } -void RawTileDataReader::readImageData( - IODescription& io, RawTile::ReadError& worstError, char* imageDataDest) const { - +void RawTileDataReader::readImageData(IODescription& io, RawTile::ReadError& worstError, + char* imageDataDest) const +{ io = adjustIODescription(io); // Only read the minimum number of rasters diff --git a/modules/globebrowsing/tile/rawtiledatareader/rawtiledatareader.h b/modules/globebrowsing/tile/rawtiledatareader/rawtiledatareader.h index 07ec571abc..b99ed886bc 100644 --- a/modules/globebrowsing/tile/rawtiledatareader/rawtiledatareader.h +++ b/modules/globebrowsing/tile/rawtiledatareader/rawtiledatareader.h @@ -49,7 +49,7 @@ public: using PerformPreprocessing = ghoul::Boolean; RawTileDataReader(const TileTextureInitData& initData, - PerformPreprocessing preprocess = PerformPreprocessing::No); + PerformPreprocessing preprocess = PerformPreprocessing::No); virtual ~RawTileDataReader() = default; /** diff --git a/modules/globebrowsing/tile/tileprovider/defaulttileprovider.cpp b/modules/globebrowsing/tile/tileprovider/defaulttileprovider.cpp index 2383bf306d..3f589efcdb 100644 --- a/modules/globebrowsing/tile/tileprovider/defaulttileprovider.cpp +++ b/modules/globebrowsing/tile/tileprovider/defaulttileprovider.cpp @@ -140,8 +140,10 @@ void DefaultTileProvider::update() { initTexturesFromLoadedData(); if (_asyncTextureDataProvider->shouldBeDeleted()) { _asyncTextureDataProvider = nullptr; - TileTextureInitData initData(LayerManager::getTileTextureInitData( - _layerGroupID, _padTiles, _tilePixelSize)); + TileTextureInitData initData( + LayerManager::getTileTextureInitData(_layerGroupID, _padTiles, + _tilePixelSize) + ); initAsyncTileDataReader(initData); } } @@ -153,8 +155,10 @@ void DefaultTileProvider::reset() { _asyncTextureDataProvider->prepairToBeDeleted(); } else { - TileTextureInitData initData(LayerManager::getTileTextureInitData( - _layerGroupID, _padTiles, _tilePixelSize)); + TileTextureInitData initData( + LayerManager::getTileTextureInitData(_layerGroupID, _padTiles, + _tilePixelSize) + ); initAsyncTileDataReader(initData); } } diff --git a/modules/globebrowsing/tile/tileprovider/tileprovider.cpp b/modules/globebrowsing/tile/tileprovider/tileprovider.cpp index d4784278e1..ebc7ddb3b5 100644 --- a/modules/globebrowsing/tile/tileprovider/tileprovider.cpp +++ b/modules/globebrowsing/tile/tileprovider/tileprovider.cpp @@ -161,7 +161,8 @@ void TileProvider::initializeDefaultTile() { using namespace ghoul::opengl; // Create pixel data - TileTextureInitData initData(8, 8, GL_UNSIGNED_BYTE, Texture::Format::RGBA, false, + TileTextureInitData initData(8, 8, GL_UNSIGNED_BYTE, Texture::Format::RGBA, + false, TileTextureInitData::ShouldAllocateDataOnCPU::Yes); int numBytes = initData.totalNumBytes(); char* pixels = new char[numBytes]; diff --git a/modules/globebrowsing/tile/tileprovider/tileproviderbylevel.cpp b/modules/globebrowsing/tile/tileprovider/tileproviderbylevel.cpp index 8a83737b22..7666f95823 100644 --- a/modules/globebrowsing/tile/tileprovider/tileproviderbylevel.cpp +++ b/modules/globebrowsing/tile/tileprovider/tileproviderbylevel.cpp @@ -95,7 +95,7 @@ TileProviderByLevel::TileProviderByLevel(const ghoul::Dictionary& dictionary) { addPropertySubOwner(_levelTileProviders.back().get()); // Ensure we can represent the max level - if(static_cast(_providerIndices.size()) < maxLevel){ + if (static_cast(_providerIndices.size()) < maxLevel) { _providerIndices.resize(maxLevel+1, -1); } @@ -104,7 +104,7 @@ TileProviderByLevel::TileProviderByLevel(const ghoul::Dictionary& dictionary) { } // Fill in the gaps (value -1) in provider indices, from back to end - for(int i = _providerIndices.size() - 2; i >= 0; --i){ + for (int i = _providerIndices.size() - 2; i >= 0; --i) { if(_providerIndices[i] == -1){ _providerIndices[i] = _providerIndices[i+1]; } diff --git a/modules/globebrowsing/tile/tiletextureinitdata.cpp b/modules/globebrowsing/tile/tiletextureinitdata.cpp index 1f8e1b4da3..66e9a71f26 100644 --- a/modules/globebrowsing/tile/tiletextureinitdata.cpp +++ b/modules/globebrowsing/tile/tiletextureinitdata.cpp @@ -32,7 +32,8 @@ const glm::ivec2 TileTextureInitData::TilePixelStartOffset = glm::ivec2(-2); const glm::ivec2 TileTextureInitData::TilePixelSizeDifference = glm::ivec2(4); TileTextureInitData::TileTextureInitData(size_t width, size_t height, GLenum glType, - Format textureFormat, bool padTiles, ShouldAllocateDataOnCPU shouldAllocateDataOnCPU) + Format textureFormat, bool padTiles, + ShouldAllocateDataOnCPU shouldAllocateDataOnCPU) : _glType(glType) , _ghoulTextureFormat(textureFormat) , _padTiles(padTiles) diff --git a/modules/globebrowsing/tile/tiletextureinitdata.h b/modules/globebrowsing/tile/tiletextureinitdata.h index b2549d8a06..ce11903cbb 100644 --- a/modules/globebrowsing/tile/tiletextureinitdata.h +++ b/modules/globebrowsing/tile/tiletextureinitdata.h @@ -43,8 +43,8 @@ public: using Format = ghoul::opengl::Texture::Format; TileTextureInitData(size_t width, size_t height, GLenum glType, Format textureFormat, - bool padTiles, - ShouldAllocateDataOnCPU shouldAllocateDataOnCPU = ShouldAllocateDataOnCPU::No); + bool padTiles, + ShouldAllocateDataOnCPU shouldAllocateDataOnCPU = ShouldAllocateDataOnCPU::No); TileTextureInitData(const TileTextureInitData& original); From 1fb5273b858fe433272f795b85e340c45ade3e1f Mon Sep 17 00:00:00 2001 From: Kalle Bladin Date: Fri, 11 Aug 2017 15:27:23 +0200 Subject: [PATCH 17/28] Add function getGeoPosition and fix bug in getGeo --- modules/globebrowsing/globebrowsingmodule.cpp | 38 +++++++++++++------ modules/globebrowsing/globebrowsingmodule.h | 3 +- .../globebrowsing/globebrowsingmodule_lua.inl | 35 ++++++++++++++++- 3 files changed, 61 insertions(+), 15 deletions(-) diff --git a/modules/globebrowsing/globebrowsingmodule.cpp b/modules/globebrowsing/globebrowsingmodule.cpp index 51fb67cd22..109ac7704c 100644 --- a/modules/globebrowsing/globebrowsingmodule.cpp +++ b/modules/globebrowsing/globebrowsingmodule.cpp @@ -25,6 +25,7 @@ #include #include +#include #include #include #include @@ -162,8 +163,15 @@ scripting::LuaLibrary GlobeBrowsingModule::luaLibrary() const { { "goToGeo", &globebrowsing::luascriptfunctions::goToGeo, - "void", + "number, number, number", "Go to geographic coordinates latitude and longitude" + }, + { + "getGeoPosition", + &globebrowsing::luascriptfunctions::getGeoPosition, + "void", + "Get geographic coordinates of the camera poosition in latitude, " + "longitude, and altitude" } }, { @@ -184,7 +192,9 @@ void GlobeBrowsingModule::goToChunk(int x, int y, int level) { void GlobeBrowsingModule::goToGeo(double latitude, double longitude) { using namespace globebrowsing; Camera* cam = OsEng.navigationHandler().camera(); - goToGeodetic2(*cam, Geodetic2(latitude, longitude) / 180 * glm::pi(), true); + goToGeodetic2(*cam, Geodetic2( + Angle::fromDegrees(latitude).asRadians(), + Angle::fromDegrees(longitude).asRadians()), true); } void GlobeBrowsingModule::goToGeo(double latitude, double longitude, @@ -196,7 +206,9 @@ void GlobeBrowsingModule::goToGeo(double latitude, double longitude, goToGeodetic3( *cam, { - Geodetic2(latitude, longitude) / 180 * glm::pi(), + Geodetic2( + Angle::fromDegrees(latitude).asRadians(), + Angle::fromDegrees(longitude).asRadians()), altitude }, true @@ -246,16 +258,18 @@ void GlobeBrowsingModule::goToGeodetic2(Camera& camera, return; } - // Camera position in model space - glm::dvec3 camPos = camera.positionVec3(); - glm::dmat4 inverseModelTransform = globe->inverseModelTransform(); + glm::dvec3 cameraPosition = OsEng.navigationHandler().camera()->positionVec3(); + glm::dmat4 inverseModelTransform = + OsEng.navigationHandler().focusNode()->inverseModelTransform(); glm::dvec3 cameraPositionModelSpace = - glm::dvec3(inverseModelTransform * glm::dvec4(camPos, 1)); - - glm::dvec3 positionOnEllipsoid = - globe->ellipsoid().geodeticSurfaceProjection(cameraPositionModelSpace); - double altitude = glm::length(cameraPositionModelSpace - positionOnEllipsoid); - + inverseModelTransform * glm::dvec4(cameraPosition, 1.0); + SurfacePositionHandle posHandle = globe->calculateSurfacePositionHandle( + cameraPositionModelSpace); + + glm::dvec3 centerToActualSurface = posHandle.centerToReferenceSurface + + posHandle.referenceSurfaceOutDirection * posHandle.heightToSurface; + double altitude = glm::length(cameraPositionModelSpace - centerToActualSurface); + goToGeodetic3(camera, {geo2, altitude}, resetCameraDirection); } diff --git a/modules/globebrowsing/globebrowsingmodule.h b/modules/globebrowsing/globebrowsingmodule.h index 0f16467c73..f6fe3c289b 100644 --- a/modules/globebrowsing/globebrowsingmodule.h +++ b/modules/globebrowsing/globebrowsingmodule.h @@ -54,6 +54,8 @@ public: globebrowsing::cache::MemoryAwareTileCache* tileCache(); scripting::LuaLibrary luaLibrary() const override; + globebrowsing::RenderableGlobe* castFocusNodeRenderableToGlobe(); + protected: void internalInitialize() override; @@ -66,7 +68,6 @@ private: void goToGeodetic3(Camera& camera, globebrowsing::Geodetic3 geo3, bool resetCameraDirection); void resetCameraDirection(Camera& camera, globebrowsing::Geodetic2 geo2); - globebrowsing::RenderableGlobe* castFocusNodeRenderableToGlobe(); /** \return a comma separated list of layer group names. diff --git a/modules/globebrowsing/globebrowsingmodule_lua.inl b/modules/globebrowsing/globebrowsingmodule_lua.inl index a46ccb1dfa..35a1fd2b7d 100644 --- a/modules/globebrowsing/globebrowsingmodule_lua.inl +++ b/modules/globebrowsing/globebrowsingmodule_lua.inl @@ -24,6 +24,7 @@ #include +#include #include #include @@ -158,8 +159,8 @@ int goToGeo(lua_State* L) { return luaL_error(L, "Expected 2 or 3 arguments."); } - double latitude = static_cast(lua_tonumber(L, 1)); - double longitude = static_cast(lua_tonumber(L, 2)); + double latitude = static_cast(lua_tonumber(L, 1)); + double longitude = static_cast(lua_tonumber(L, 2)); if (nArguments == 2) { OsEng.moduleEngine().module()->goToGeo(latitude, longitude); @@ -173,4 +174,34 @@ int goToGeo(lua_State* L) { return 0; } +int getGeoPosition(lua_State* L) { + int nArguments = lua_gettop(L); + if (nArguments != 0) { + return luaL_error(L, "Expected 0 arguments."); + } + + RenderableGlobe* globe = + OsEng.moduleEngine().module()->castFocusNodeRenderableToGlobe(); + if (!globe) { + return luaL_error(L, "Focus node must be a RenderableGlobe"); + } + + glm::dvec3 cameraPosition = OsEng.navigationHandler().camera()->positionVec3(); + glm::dmat4 inverseModelTransform = + OsEng.navigationHandler().focusNode()->inverseModelTransform(); + glm::dvec3 cameraPositionModelSpace = + inverseModelTransform * glm::dvec4(cameraPosition, 1.0); + SurfacePositionHandle posHandle = globe->calculateSurfacePositionHandle( + cameraPositionModelSpace); + + Geodetic2 geo2 = globe->ellipsoid().cartesianToGeodetic2(posHandle.centerToReferenceSurface); + double altitude = glm::length(cameraPositionModelSpace - posHandle.centerToReferenceSurface); + + lua_pushnumber(L, Angle::fromRadians(geo2.lat).asDegrees()); + lua_pushnumber(L, Angle::fromRadians(geo2.lon).asDegrees()); + lua_pushnumber(L, altitude); + + return 3; +} + } // namespace openspace::globebrowsing::luascriptfunctions From 0ac1f96ae8e9f5f3228e4468d33b72c4ac911759 Mon Sep 17 00:00:00 2001 From: Kalle Bladin Date: Tue, 15 Aug 2017 12:09:06 +0200 Subject: [PATCH 18/28] Add ability to define a color for SolidColor layers at initialization. --- modules/globebrowsing/rendering/layer/layer.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/modules/globebrowsing/rendering/layer/layer.cpp b/modules/globebrowsing/rendering/layer/layer.cpp index 639dbd90e6..105a05e7d3 100644 --- a/modules/globebrowsing/rendering/layer/layer.cpp +++ b/modules/globebrowsing/rendering/layer/layer.cpp @@ -1,4 +1,4 @@ -/***************************************************************************************** +/***************************************************************************************** * * * OpenSpace * * * @@ -337,8 +337,14 @@ void Layer::initializeBasedOnType(layergroupid::TypeID typeId, ghoul::Dictionary ); break; } - case layergroupid::TypeID::SolidColor: + case layergroupid::TypeID::SolidColor: { + if (initDict.hasKeyAndValue(ColorInfo.identifier)) { + glm::vec3 color; + initDict.getValue(ColorInfo.identifier, color); + _otherTypesProperties.color.setValue(color); + } break; + } default: throw ghoul::RuntimeError("Unable to create layer. Unknown type."); break; From 04a90acd23eb8014ee735b8361e033a99e329e6a Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Tue, 15 Aug 2017 10:02:43 -0400 Subject: [PATCH 19/28] Update Jenkinsfile to point to shorter workspace directory in Windows --- Jenkinsfile | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index b2714c6996..4291403834 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -27,6 +27,7 @@ stage('Build') { parallel linux: { node('linux') { timeout(time: 45, unit: 'MINUTES') { + deleteDir() checkout scm sh 'git submodule update --init --recursive' @@ -43,16 +44,18 @@ stage('Build') { windows: { node('windows') { timeout(time: 45, unit: 'MINUTES') { - deleteDir() - checkout scm - bat ''' - git submodule update --init --recursive - if not exist "build" mkdir "build" - cd build - cmake -G "Visual Studio 15 2017 Win64" .. ''' + - flags + ''' .. - msbuild.exe OpenSpace.sln /nologo /verbosity:minimal /m:2 /p:Configuration=Debug - ''' + ws("C:/J") { + deleteDir() + checkout scm + bat ''' + git submodule update --init --recursive + if not exist "build" mkdir "build" + cd build + cmake -G "Visual Studio 15 2017 Win64" .. ''' + + flags + ''' .. + msbuild.exe OpenSpace.sln /nologo /verbosity:minimal /m:2 /p:Configuration=Debug + ''' + } } } }, From 709d7fa63cfeaa05106c5042fbb2f711780e195d Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Tue, 15 Aug 2017 10:06:17 -0400 Subject: [PATCH 20/28] Use branch name in Jenkinsfile --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 4291403834..e789a1cc64 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -44,7 +44,7 @@ stage('Build') { windows: { node('windows') { timeout(time: 45, unit: 'MINUTES') { - ws("C:/J") { + ws("C:/J/${env.BRANCH_NAME}") { deleteDir() checkout scm bat ''' From 8fc0eb560ac4b79b615cabd0a8e813f25b419fcf Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Tue, 15 Aug 2017 10:14:15 -0400 Subject: [PATCH 21/28] Create additional subdirectory in Jenkinsfile --- Jenkinsfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index e789a1cc64..4beec961ab 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -44,7 +44,8 @@ stage('Build') { windows: { node('windows') { timeout(time: 45, unit: 'MINUTES') { - ws("C:/J/${env.BRANCH_NAME}") { + // We specify the workspace directory manually to reduce the path length and thus try to avoid MSB3491 on Visual Studio + ws("C:/J/O/${env.BRANCH_NAME}") { deleteDir() checkout scm bat ''' From 82fd196ddde883cf68525fcb4f9006bbc28191a4 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Tue, 15 Aug 2017 13:57:34 -0400 Subject: [PATCH 22/28] Organize WMS minidrivers for Moon, Mars, and Mercury Add WMS minidrivers from AWS servers --- .../mars/map_service_configs/AWS/CTX.wms | 17 +++++ .../mars/map_service_configs/AWS/Mdim.wms | 22 ++++++ .../AWS/Mola_Elevation.wms | 23 ++++++ .../AWS/Mola_PseudoColor.wms | 22 ++++++ .../map_service_configs/AWS/Themis_IR_Day.wms | 22 ++++++ .../AWS/Themis_IR_Night.wms | 22 ++++++ .../{CTX_Mosaic.xml => LiU/CTX.xml} | 0 .../{ => LiU}/Mola_Elevation.xml | 0 .../mars/map_service_configs/MARS_Viking.xml | 10 --- .../mars/map_service_configs/MDIM21_color.xml | 22 ------ .../Utah/{CTX_Mosaic.xml => CTX.xml} | 0 ...laPseudoColor.xml => Mola_PseudoColor.xml} | 0 .../map_service_configs/Utah/ThemisIRDay.xml | 20 ----- .../Utah/ThemisIRNight.xml | 20 ----- .../Utah/Themis_IR_Day.xml | 22 ++++++ .../Utah/Themis_IR_Night.xml | 22 ++++++ data/scene/mars/mars.mod | 74 ++++++++++++++++--- .../{ => AMNH}/OnMercuryColor.xml | 0 .../{ => AMNH}/OnMercuryElevationGaskell.xml | 0 .../{ => AMNH}/OnMercuryImage.xml | 0 .../map_service_configs/AWS/MessengerMdis.wms | 20 +++++ .../AWS/MessengerMosaic.wms | 20 +++++ data/scene/mercury/mercury.mod | 14 +++- data/scene/moon/moon.mod | 13 +++- 24 files changed, 299 insertions(+), 86 deletions(-) create mode 100644 data/scene/mars/map_service_configs/AWS/CTX.wms create mode 100644 data/scene/mars/map_service_configs/AWS/Mdim.wms create mode 100644 data/scene/mars/map_service_configs/AWS/Mola_Elevation.wms create mode 100644 data/scene/mars/map_service_configs/AWS/Mola_PseudoColor.wms create mode 100644 data/scene/mars/map_service_configs/AWS/Themis_IR_Day.wms create mode 100644 data/scene/mars/map_service_configs/AWS/Themis_IR_Night.wms rename data/scene/mars/map_service_configs/{CTX_Mosaic.xml => LiU/CTX.xml} (100%) rename data/scene/mars/map_service_configs/{ => LiU}/Mola_Elevation.xml (100%) delete mode 100644 data/scene/mars/map_service_configs/MARS_Viking.xml delete mode 100644 data/scene/mars/map_service_configs/MDIM21_color.xml rename data/scene/mars/map_service_configs/Utah/{CTX_Mosaic.xml => CTX.xml} (100%) rename data/scene/mars/map_service_configs/Utah/{MolaPseudoColor.xml => Mola_PseudoColor.xml} (100%) delete mode 100644 data/scene/mars/map_service_configs/Utah/ThemisIRDay.xml delete mode 100644 data/scene/mars/map_service_configs/Utah/ThemisIRNight.xml create mode 100644 data/scene/mars/map_service_configs/Utah/Themis_IR_Day.xml create mode 100644 data/scene/mars/map_service_configs/Utah/Themis_IR_Night.xml rename data/scene/mercury/map_service_configs/{ => AMNH}/OnMercuryColor.xml (100%) rename data/scene/mercury/map_service_configs/{ => AMNH}/OnMercuryElevationGaskell.xml (100%) rename data/scene/mercury/map_service_configs/{ => AMNH}/OnMercuryImage.xml (100%) create mode 100644 data/scene/mercury/map_service_configs/AWS/MessengerMdis.wms create mode 100644 data/scene/mercury/map_service_configs/AWS/MessengerMosaic.wms diff --git a/data/scene/mars/map_service_configs/AWS/CTX.wms b/data/scene/mars/map_service_configs/AWS/CTX.wms new file mode 100644 index 0000000000..46251f85e8 --- /dev/null +++ b/data/scene/mars/map_service_configs/AWS/CTX.wms @@ -0,0 +1,17 @@ + + + http://planetarydev-1803629091.us-west-2.elb.amazonaws.com/Mars/CTX/tile/${z}/${y}/${x} + + + -180.0 90.0 + 180.0 -90.0 + 4194304 2097152 + 12 top + + GEOGCS["GCS_Mars_2000_Sphere",DATUM["D_Mars_2000_Sphere",SPHEROID["Mars_2000_Sphere_IAU_IAG",3396190.0,0.0]],PRIMEM["Reference_Meridian",0.0],UNIT["Degree",0.0174532925199433]] + 512 512 + 2 + 5 + 400,204,404 + true + diff --git a/data/scene/mars/map_service_configs/AWS/Mdim.wms b/data/scene/mars/map_service_configs/AWS/Mdim.wms new file mode 100644 index 0000000000..d795931273 --- /dev/null +++ b/data/scene/mars/map_service_configs/AWS/Mdim.wms @@ -0,0 +1,22 @@ + + + http://planetarydev-1803629091.us-west-2.elb.amazonaws.com/Mars/Mdim/tile/${z}/${y}/${x} + + + -180.0 + 90.0 + 180.0 + -90.0 + 92160 + 46080 + 7 + top + + GEOGCS["GCS_Mars_2000_Sphere",DATUM["D_Mars_2000_Sphere",SPHEROID["Mars_2000_Sphere_IAU_IAG",3396190.0,0.0]],PRIMEM["Reference_Meridian",0.0],UNIT["Degree",0.0174532925199433]] + 360 + 360 + 3 + 10 + 400,204,404 + true + diff --git a/data/scene/mars/map_service_configs/AWS/Mola_Elevation.wms b/data/scene/mars/map_service_configs/AWS/Mola_Elevation.wms new file mode 100644 index 0000000000..b53bee4210 --- /dev/null +++ b/data/scene/mars/map_service_configs/AWS/Mola_Elevation.wms @@ -0,0 +1,23 @@ + + + http://planetarydev-1803629091.us-west-2.elb.amazonaws.com/Mars/MolaElevation/tile/${z}/${y}/${x} + + + -180.0 + 90.0 + 180.0 + -90.0 + 46080 + 23040 + 6 + top + + GEOGCS["GCS_Mars_2000_Sphere",DATUM["D_Mars_2000_Sphere",SPHEROID["Mars_2000_Sphere_IAU_IAG",3396190.0,0.0]],PRIMEM["Reference_Meridian",0.0],UNIT["Degree",0.0174532925199433]] + 360 + 360 + 1 + Int16 + 10 + 400,204,404 + true + diff --git a/data/scene/mars/map_service_configs/AWS/Mola_PseudoColor.wms b/data/scene/mars/map_service_configs/AWS/Mola_PseudoColor.wms new file mode 100644 index 0000000000..2fad1a362a --- /dev/null +++ b/data/scene/mars/map_service_configs/AWS/Mola_PseudoColor.wms @@ -0,0 +1,22 @@ + + + http://planetarydev-1803629091.us-west-2.elb.amazonaws.com/Mars/MolaPseudoColor/tile/${z}/${y}/${x} + + + -180.0 + 90.0 + 180.0 + -90.0 + 46080 + 23040 + 6 + top + + GEOGCS["GCS_Mars_2000_Sphere",DATUM["D_Mars_2000_Sphere",SPHEROID["Mars_2000_Sphere_IAU_IAG",3396190.0,0.0]],PRIMEM["Reference_Meridian",0.0],UNIT["Degree",0.0174532925199433]] + 360 + 360 + 3 + 10 + 400,204,404 + true + diff --git a/data/scene/mars/map_service_configs/AWS/Themis_IR_Day.wms b/data/scene/mars/map_service_configs/AWS/Themis_IR_Day.wms new file mode 100644 index 0000000000..041f46e04e --- /dev/null +++ b/data/scene/mars/map_service_configs/AWS/Themis_IR_Day.wms @@ -0,0 +1,22 @@ + + + http://planetarydev-1803629091.us-west-2.elb.amazonaws.com/Mars/ThemisIRDay/tile/${z}/${y}/${x} + + + -180.0 + 90.0 + 180.0 + -90.0 + 213390 + 106695 + 9 + top + + GEOGCS["GCS_Mars_2000_Sphere",DATUM["D_Mars_2000_Sphere",SPHEROID["Mars_2000_Sphere_IAU_IAG",3396190.0,0.0]],PRIMEM["Reference_Meridian",0.0],UNIT["Degree",0.0174532925199433]] + 256 + 256 + 1 + 10 + 400,204,404 + true + diff --git a/data/scene/mars/map_service_configs/AWS/Themis_IR_Night.wms b/data/scene/mars/map_service_configs/AWS/Themis_IR_Night.wms new file mode 100644 index 0000000000..387e06efe5 --- /dev/null +++ b/data/scene/mars/map_service_configs/AWS/Themis_IR_Night.wms @@ -0,0 +1,22 @@ + + + http://planetarydev-1803629091.us-west-2.elb.amazonaws.com/Mars/ThemisIRNight/tile/${z}/${y}/${x} + + + -180.0 + 90.0 + 180.0 + -90.0 + 213388 + 71130 + 9 + top + + GEOGCS["GCS_Mars_2000_Sphere",DATUM["D_Mars_2000_Sphere",SPHEROID["Mars_2000_Sphere_IAU_IAG",3396190.0,0.0]],PRIMEM["Reference_Meridian",0.0],UNIT["Degree",0.0174532925199433]] + 256 + 256 + 1 + 10 + 400,204,404 + true + diff --git a/data/scene/mars/map_service_configs/CTX_Mosaic.xml b/data/scene/mars/map_service_configs/LiU/CTX.xml similarity index 100% rename from data/scene/mars/map_service_configs/CTX_Mosaic.xml rename to data/scene/mars/map_service_configs/LiU/CTX.xml diff --git a/data/scene/mars/map_service_configs/Mola_Elevation.xml b/data/scene/mars/map_service_configs/LiU/Mola_Elevation.xml similarity index 100% rename from data/scene/mars/map_service_configs/Mola_Elevation.xml rename to data/scene/mars/map_service_configs/LiU/Mola_Elevation.xml diff --git a/data/scene/mars/map_service_configs/MARS_Viking.xml b/data/scene/mars/map_service_configs/MARS_Viking.xml deleted file mode 100644 index 7197faf38e..0000000000 --- a/data/scene/mars/map_service_configs/MARS_Viking.xml +++ /dev/null @@ -1,10 +0,0 @@ - - http://webgis3.wr.usgs.gov/arcgis/rest/services/Mars_color/MapServer/WMTS/1.0.0/WMTSCapabilities.xml - - -180.0 - 90 - 180.0 - -90 - - 3 - \ No newline at end of file diff --git a/data/scene/mars/map_service_configs/MDIM21_color.xml b/data/scene/mars/map_service_configs/MDIM21_color.xml deleted file mode 100644 index caaa46437f..0000000000 --- a/data/scene/mars/map_service_configs/MDIM21_color.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - 1.3.0 - http://planetarymaps.usgs.gov/cgi-bin/mapserv?map=/maps/mars/mars_simp_cyl.map - EPSG:4326 - image/png - MDIM21_color - TRUE - - - -180.0 - 90.0 - 180.0 - -90.0 - 2048 - 1024 - bottom - - - \ No newline at end of file diff --git a/data/scene/mars/map_service_configs/Utah/CTX_Mosaic.xml b/data/scene/mars/map_service_configs/Utah/CTX.xml similarity index 100% rename from data/scene/mars/map_service_configs/Utah/CTX_Mosaic.xml rename to data/scene/mars/map_service_configs/Utah/CTX.xml diff --git a/data/scene/mars/map_service_configs/Utah/MolaPseudoColor.xml b/data/scene/mars/map_service_configs/Utah/Mola_PseudoColor.xml similarity index 100% rename from data/scene/mars/map_service_configs/Utah/MolaPseudoColor.xml rename to data/scene/mars/map_service_configs/Utah/Mola_PseudoColor.xml diff --git a/data/scene/mars/map_service_configs/Utah/ThemisIRDay.xml b/data/scene/mars/map_service_configs/Utah/ThemisIRDay.xml deleted file mode 100644 index 3b7641214b..0000000000 --- a/data/scene/mars/map_service_configs/Utah/ThemisIRDay.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - http://asgard.sci.utah.edu/Mars/ThemisIRDay/tile/${z}/${y}/${x} - - - -180.0 - 90.0 - 180.0 - -90.0 - 213390 - 106695 - 9 - top - - GEOGCS["GCS_Mars_2000_Sphere",DATUM["D_Mars_2000_Sphere",SPHEROID["Mars_2000_Sphere_IAU_IAG",3396190.0,0.0]],PRIMEM["Reference_Meridian",0.0],UNIT["Degree",0.0174532925199433]] - 256 - 256 - 1 - 10 - \ No newline at end of file diff --git a/data/scene/mars/map_service_configs/Utah/ThemisIRNight.xml b/data/scene/mars/map_service_configs/Utah/ThemisIRNight.xml deleted file mode 100644 index 3b7641214b..0000000000 --- a/data/scene/mars/map_service_configs/Utah/ThemisIRNight.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - http://asgard.sci.utah.edu/Mars/ThemisIRDay/tile/${z}/${y}/${x} - - - -180.0 - 90.0 - 180.0 - -90.0 - 213390 - 106695 - 9 - top - - GEOGCS["GCS_Mars_2000_Sphere",DATUM["D_Mars_2000_Sphere",SPHEROID["Mars_2000_Sphere_IAU_IAG",3396190.0,0.0]],PRIMEM["Reference_Meridian",0.0],UNIT["Degree",0.0174532925199433]] - 256 - 256 - 1 - 10 - \ No newline at end of file diff --git a/data/scene/mars/map_service_configs/Utah/Themis_IR_Day.xml b/data/scene/mars/map_service_configs/Utah/Themis_IR_Day.xml new file mode 100644 index 0000000000..a951c29e07 --- /dev/null +++ b/data/scene/mars/map_service_configs/Utah/Themis_IR_Day.xml @@ -0,0 +1,22 @@ + + + http://asgard.sci.utah.edu/Mars/ThemisIRDay/tile/${z}/${y}/${x} + + + -180.0 + 90.0 + 180.0 + -90.0 + 213390 + 106695 + 9 + top + + GEOGCS["GCS_Mars_2000_Sphere",DATUM["D_Mars_2000_Sphere",SPHEROID["Mars_2000_Sphere_IAU_IAG",3396190.0,0.0]],PRIMEM["Reference_Meridian",0.0],UNIT["Degree",0.0174532925199433]] + 256 + 256 + 1 + 10 + 400,204,404 + true + diff --git a/data/scene/mars/map_service_configs/Utah/Themis_IR_Night.xml b/data/scene/mars/map_service_configs/Utah/Themis_IR_Night.xml new file mode 100644 index 0000000000..7aee3a5b85 --- /dev/null +++ b/data/scene/mars/map_service_configs/Utah/Themis_IR_Night.xml @@ -0,0 +1,22 @@ + + + http://asgard.sci.utah.edu/Mars/ThemisIRNight/tile/${z}/${y}/${x} + + + -180.0 + 90.0 + 180.0 + -90.0 + 213390 + 106695 + 9 + top + + GEOGCS["GCS_Mars_2000_Sphere",DATUM["D_Mars_2000_Sphere",SPHEROID["Mars_2000_Sphere_IAU_IAG",3396190.0,0.0]],PRIMEM["Reference_Meridian",0.0],UNIT["Degree",0.0174532925199433]] + 256 + 256 + 1 + 10 + 400,204,404 + true + diff --git a/data/scene/mars/mars.mod b/data/scene/mars/mars.mod index 9a947b4019..8e5f786d53 100644 --- a/data/scene/mars/mars.mod +++ b/data/scene/mars/mars.mod @@ -32,7 +32,7 @@ return { Layers = { ColorLayers = { { - Name = "Viking", + Name = "Viking MDIM", FilePath = "map_service_configs/MARS_Viking_MDIM21.xml", Enabled = true, Fallback = { @@ -41,19 +41,55 @@ return { Enabled = true, }, }, + -- Linköping University based servers { - Name = "MOLA Pseudo Color", - FilePath = "map_service_configs/Utah/MolaPseudoColor.xml" - }, - { - Name = "CTX Mosaic [Europe]", - FilePath = "map_service_configs/CTX_Mosaic.xml", + Name = "CTX Mosaic [LiU]", + FilePath = "map_service_configs/LiU/CTX.xml", BlendMode = "Color" }, + -- University of Utah based servers { Name = "CTX Mosaic [Utah]", - FilePath = "map_service_configs/Utah/CTX_Mosaic.xml", + FilePath = "map_service_configs/Utah/CTX.xml", BlendMode = "Color" + }, + { + Name = "MOLA Pseudo Color", + FilePath = "map_service_configs/Utah/Mola_PseudoColor.xml" + }, + { + Name = "Themis IR Day [Utah]", + FilePath = "map_service_configs/Utah/Themis_IR_Day.xml" + }, + { + Name = "Themis IR Night [Utah]", + FilePath = "map_service_configs/Utah/Themis_IR_Night.xml" + }, + { + Name = "Viking MDIM [Utah]", + FilePath = "map_service_configs/Utah/Mdim.xml" + }, + -- AWS based servers + { + Name = "CTX Mosaic [AWS]", + FilePath = "map_service_configs/AWS/CTX.wms", + BlendMode = "Color" + }, + { + Name = "Viking MDIM [AWS]", + FilePath = "map_service_configs/AWS/Mdim.wms" + }, + { + Name = "MOLA Pseudo Color [AWS]", + FilePath = "map_service_configs/AWS/Mola_PseudoColor.wms" + }, + { + Name = "Themis IR Day [AWS]", + FilePath = "map_service_configs/AWS/Themis_IR_Day.wms" + }, + { + Name = "Themis IR Night [AWS]", + FilePath = "map_service_configs/AWS/Themis_IR_Night.wms" } }, Overlays = { @@ -69,11 +105,27 @@ return { }, HeightLayers = { { - Name = "Mola Elevation [Europe]", - FilePath = "map_service_configs/Mola_Elevation.xml", + Name = "Mola Elevation", + FilePath = "map_service_configs/Mars_MGS_MOLA_DEM.xml", Enabled = true, TilePixelSize = 90 - } + }, + { + Name = "Mola Elevation [Europe]", + FilePath = "map_service_configs/LiU/Mola_Elevation.xml", + -- Enabled = true, + TilePixelSize = 90 + }, + { + Name = "Mola Elevation [Utah]", + FilePath = "map_service_configs/Utah/Mola_Elevation.xml", + TilePixelSize = 90 + }, + { + Name = "Mola Elevation [AWS]", + FilePath = "map_service_configs/AWS/Mola_Elevation.wms", + TilePixelSize = 90 + }, } } }, diff --git a/data/scene/mercury/map_service_configs/OnMercuryColor.xml b/data/scene/mercury/map_service_configs/AMNH/OnMercuryColor.xml similarity index 100% rename from data/scene/mercury/map_service_configs/OnMercuryColor.xml rename to data/scene/mercury/map_service_configs/AMNH/OnMercuryColor.xml diff --git a/data/scene/mercury/map_service_configs/OnMercuryElevationGaskell.xml b/data/scene/mercury/map_service_configs/AMNH/OnMercuryElevationGaskell.xml similarity index 100% rename from data/scene/mercury/map_service_configs/OnMercuryElevationGaskell.xml rename to data/scene/mercury/map_service_configs/AMNH/OnMercuryElevationGaskell.xml diff --git a/data/scene/mercury/map_service_configs/OnMercuryImage.xml b/data/scene/mercury/map_service_configs/AMNH/OnMercuryImage.xml similarity index 100% rename from data/scene/mercury/map_service_configs/OnMercuryImage.xml rename to data/scene/mercury/map_service_configs/AMNH/OnMercuryImage.xml diff --git a/data/scene/mercury/map_service_configs/AWS/MessengerMdis.wms b/data/scene/mercury/map_service_configs/AWS/MessengerMdis.wms new file mode 100644 index 0000000000..bafca5ca07 --- /dev/null +++ b/data/scene/mercury/map_service_configs/AWS/MessengerMdis.wms @@ -0,0 +1,20 @@ + + + http://planetarydev-1803629091.us-west-2.elb.amazonaws.com/Mercury/MessengerMdis/tile/${z}/${y}/${x} + + + -180.0 + 90.0 + 180.0 + -90.0 + 61324 + 30662 + 7 + top + + GEOGCS["GCS_Mercury_2015",DATUM["D_Mercury_2015",SPHEROID["Mercury_2015",2439400.0,0.0]],PRIMEM["Reference_Meridian",0.0],UNIT["Degree",0.0174532925199433]] + 256 + 256 + 1 + 10 + diff --git a/data/scene/mercury/map_service_configs/AWS/MessengerMosaic.wms b/data/scene/mercury/map_service_configs/AWS/MessengerMosaic.wms new file mode 100644 index 0000000000..89415f373e --- /dev/null +++ b/data/scene/mercury/map_service_configs/AWS/MessengerMosaic.wms @@ -0,0 +1,20 @@ + + + http://planetarydev-1803629091.us-west-2.elb.amazonaws.com/Mercury/MessengerMosaic/tile/${z}/${y}/${x} + + + -180.0 + 90.0 + 180.0 + -90.0 + 23054 + 11527 + 6 + top + + GEOGCS["GCS_Mercury_2015",DATUM["D_Mercury_2015",SPHEROID["Mercury_2015",2439400.0,0.0]],PRIMEM["Reference_Meridian",0.0],UNIT["Degree",0.0174532925199433]] + 256 + 256 + 3 + 10 + diff --git a/data/scene/mercury/mercury.mod b/data/scene/mercury/mercury.mod index 7f825463d8..d510478baa 100644 --- a/data/scene/mercury/mercury.mod +++ b/data/scene/mercury/mercury.mod @@ -32,14 +32,24 @@ return { SegmentsPerPatch = 64, Layers = { ColorLayers = { + -- University of Utah based servers { - Name = "Messenger_MDIS", + Name = "Messenger MDIS [Utah]", FilePath = "map_service_configs/Utah/MessengerMDIS.wms", Enabled = true }, { - Name = "Messenger_Mosaic", + Name = "Messenger Mosaic [Utah]", FilePath = "map_service_configs/Utah/MessengerMosaic.wms" + }, + -- AWS based servers + { + Name = "Messenger MDIS [AWS]", + FilePath = "map_service_configs/AWS/MessengerMdis.wms", + }, + { + Name = "Messenger Mosaic [AWS]", + FilePath = "map_service_configs/AWS/MessengerMosaic.wms", } } } diff --git a/data/scene/moon/moon.mod b/data/scene/moon/moon.mod index 6c441d2b7b..2ed3aaddcf 100644 --- a/data/scene/moon/moon.mod +++ b/data/scene/moon/moon.mod @@ -22,11 +22,13 @@ return { SegmentsPerPatch = 64, Layers = { ColorLayers = { + -- LMMP based servers { - Name = "OnMoonColorGrayscale", + Name = "LRO WAC Mosaic [OnMoon]", FilePath = "map_service_configs/OnMoonColor.xml", Enabled = true, }, + -- Utah based servers { Name = "ClemUvvis", FilePath = "map_service_configs/Utah/ClemUvvis.wms" @@ -41,6 +43,15 @@ return { } }, HeightLayers = { + -- LMMP based servers + -- { + -- Name = "Lunar Elevation [OnMoon]", + -- FilePath = "map_service_configs/OnMoonHeight.xml", + -- Enabled = true, + -- TilePixelSize = 64, + -- -- Settings = { Multiplier = 0.5 }, + -- }, + -- Utah based servers { Name = "LolaDem", FilePath = "map_service_configs/Utah/LolaDem.wms", From 948507f20e654f3e840e49488e6fcb593a2b25ea Mon Sep 17 00:00:00 2001 From: Kalle Bladin Date: Wed, 16 Aug 2017 14:35:56 +0200 Subject: [PATCH 23/28] Fix previous error appearing when accurate normals were used without height layers. --- modules/globebrowsing/rendering/chunkrenderer.cpp | 12 ++++-------- modules/globebrowsing/shaders/tileheight.hglsl | 8 ++++---- 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/modules/globebrowsing/rendering/chunkrenderer.cpp b/modules/globebrowsing/rendering/chunkrenderer.cpp index e17397c878..b2c50c29c6 100644 --- a/modules/globebrowsing/rendering/chunkrenderer.cpp +++ b/modules/globebrowsing/rendering/chunkrenderer.cpp @@ -142,7 +142,9 @@ void ChunkRenderer::setCommonUniforms(ghoul::opengl::ProgramObject& programObjec chunk.owner().generalProperties().orenNayarRoughness); } - if (chunk.owner().generalProperties().useAccurateNormals) { + if (chunk.owner().generalProperties().useAccurateNormals && + !_layerManager->layerGroup(layergroupid::HeightLayers).activeLayers().empty()) + { glm::dvec3 corner00 = chunk.owner().ellipsoid().cartesianSurfacePosition( chunk.surfacePatch().getCorner(Quad::SOUTH_WEST)); glm::dvec3 corner10 = chunk.owner().ellipsoid().cartesianSurfacePosition( @@ -176,12 +178,6 @@ void ChunkRenderer::setCommonUniforms(ghoul::opengl::ProgramObject& programObjec programObject.setUniform("deltaPhi1", glm::length(deltaPhi1)); programObject.setUniform("tileDelta", tileDelta); } - - if (chunk.owner().generalProperties().performShading) { - programObject.setUniform( - "orenNayarRoughness", - chunk.owner().generalProperties().orenNayarRoughness); - } } void ChunkRenderer::renderChunkGlobally(const Chunk& chunk, const RenderData& data){ @@ -238,7 +234,7 @@ void ChunkRenderer::renderChunkGlobally(const Chunk& chunk, const RenderData& da } if (chunk.owner().generalProperties().useAccurateNormals && - _layerManager->layerGroup(layergroupid::HeightLayers).activeLayers().size() > 0) + !_layerManager->layerGroup(layergroupid::HeightLayers).activeLayers().empty()) { // Apply an extra scaling to the height if the object is scaled programObject->setUniform( diff --git a/modules/globebrowsing/shaders/tileheight.hglsl b/modules/globebrowsing/shaders/tileheight.hglsl index 31ae8b3a29..df7cb9673d 100644 --- a/modules/globebrowsing/shaders/tileheight.hglsl +++ b/modules/globebrowsing/shaders/tileheight.hglsl @@ -43,13 +43,13 @@ uniform Layer HeightLayers[NUMLAYERS_HEIGHTMAP]; uniform float heightScale; #endif // USE_HEIGHTMAP -#if USE_ACCURATE_NORMALS +#if USE_ACCURATE_NORMALS && USE_HEIGHTMAP uniform float deltaTheta0; uniform float deltaTheta1; uniform float deltaPhi0; uniform float deltaPhi1; uniform float tileDelta; -#endif //USE_ACCURATE_NORMALS +#endif //USE_ACCURATE_NORMALS && USE_HEIGHTMAP float getUntransformedTileHeight(vec2 uv, LevelWeights levelWeights) { float height = CHUNK_DEFAULT_HEIGHT; @@ -97,7 +97,7 @@ vec3 getTileNormal(vec2 uv, LevelWeights levelWeights, vec3 ellipsoidNormalCamer vec3 ellipsoidTangentThetaCameraSpace, vec3 ellipsoidTangentPhiCameraSpace) { -#if USE_ACCURATE_NORMALS +#if USE_ACCURATE_NORMALS && USE_HEIGHTMAP float deltaPhi = mix(deltaPhi0, deltaPhi1, uv.x); float deltaTheta = mix(deltaTheta0, deltaTheta1, uv.y); @@ -112,7 +112,7 @@ vec3 getTileNormal(vec2 uv, LevelWeights levelWeights, vec3 ellipsoidNormalCamer vec3 diffPhi = deltaPhiVec + ellipsoidNormalCameraSpace * (height01 - height00); return normalize(cross(diffTheta, diffPhi)); -#else // USE_ACCURATE_NORMALS +#else // USE_ACCURATE_NORMALS && USE_HEIGHTMAP return ellipsoidNormalCameraSpace; #endif } From 4513c4e1e2b9abb2a204c8e1372d7e2742e5aa69 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Wed, 16 Aug 2017 09:10:03 -0400 Subject: [PATCH 24/28] Runtime fix for SpacecraftInstruments module --- .../rendering/renderablecrawlingline.cpp | 4 ++-- .../rendering/renderablefov.cpp | 4 ++-- .../rendering/renderablemodelprojection.cpp | 12 ++++++------ .../rendering/renderableplanetprojection.cpp | 8 ++++---- .../rendering/renderableshadowcylinder.cpp | 4 ++-- .../util/projectioncomponent.cpp | 4 ++-- 6 files changed, 18 insertions(+), 18 deletions(-) diff --git a/modules/spacecraftinstruments/rendering/renderablecrawlingline.cpp b/modules/spacecraftinstruments/rendering/renderablecrawlingline.cpp index da9aa1cdc5..94011b540b 100644 --- a/modules/spacecraftinstruments/rendering/renderablecrawlingline.cpp +++ b/modules/spacecraftinstruments/rendering/renderablecrawlingline.cpp @@ -139,8 +139,8 @@ void RenderableCrawlingLine::initialize() { RenderEngine& renderEngine = OsEng.renderEngine(); _program = renderEngine.buildRenderProgram( "RenderableCrawlingLine", - "${MODULE_NEWHORIZONS}/shaders/crawlingline_vs.glsl", - "${MODULE_NEWHORIZONS}/shaders/crawlingline_fs.glsl" + "${MODULE_SPACECRAFTINSTRUMENTS}/shaders/crawlingline_vs.glsl", + "${MODULE_SPACECRAFTINSTRUMENTS}/shaders/crawlingline_fs.glsl" ); glGenVertexArrays(1, &_vao); diff --git a/modules/spacecraftinstruments/rendering/renderablefov.cpp b/modules/spacecraftinstruments/rendering/renderablefov.cpp index 2683d3249a..1f3bfc7e32 100644 --- a/modules/spacecraftinstruments/rendering/renderablefov.cpp +++ b/modules/spacecraftinstruments/rendering/renderablefov.cpp @@ -301,8 +301,8 @@ void RenderableFov::initialize() { RenderEngine& renderEngine = OsEng.renderEngine(); _programObject = renderEngine.buildRenderProgram( "FovProgram", - "${MODULE_NEWHORIZONS}/shaders/fov_vs.glsl", - "${MODULE_NEWHORIZONS}/shaders/fov_fs.glsl" + "${MODULE_SPACECRAFTINSTRUMENTS}/shaders/fov_vs.glsl", + "${MODULE_SPACECRAFTINSTRUMENTS}/shaders/fov_fs.glsl" ); // Fetch information about the specific instrument diff --git a/modules/spacecraftinstruments/rendering/renderablemodelprojection.cpp b/modules/spacecraftinstruments/rendering/renderablemodelprojection.cpp index 72e0281c42..f3ab27d457 100644 --- a/modules/spacecraftinstruments/rendering/renderablemodelprojection.cpp +++ b/modules/spacecraftinstruments/rendering/renderablemodelprojection.cpp @@ -183,20 +183,20 @@ bool RenderableModelProjection::isReady() const { void RenderableModelProjection::initialize() { RenderEngine& renderEngine = OsEng.renderEngine(); _programObject = renderEngine.buildRenderProgram("ModelShader", - "${MODULE_NEWHORIZONS}/shaders/renderableModel_vs.glsl", - "${MODULE_NEWHORIZONS}/shaders/renderableModel_fs.glsl"); + "${MODULE_SPACECRAFTINSTRUMENTS}/shaders/renderableModel_vs.glsl", + "${MODULE_SPACECRAFTINSTRUMENTS}/shaders/renderableModel_fs.glsl"); _fboProgramObject = ghoul::opengl::ProgramObject::Build("ProjectionPass", - "${MODULE_NEWHORIZONS}/shaders/renderableModelProjection_vs.glsl", - "${MODULE_NEWHORIZONS}/shaders/renderableModelProjection_fs.glsl"); + "${MODULE_SPACECRAFTINSTRUMENTS}/shaders/renderableModelProjection_vs.glsl", + "${MODULE_SPACECRAFTINSTRUMENTS}/shaders/renderableModelProjection_fs.glsl"); _fboProgramObject->setIgnoreUniformLocationError( ghoul::opengl::ProgramObject::IgnoreError::Yes ); _depthFboProgramObject = ghoul::opengl::ProgramObject::Build("DepthPass", - "${MODULE_NEWHORIZONS}/shaders/renderableModelDepth_vs.glsl", - "${MODULE_NEWHORIZONS}/shaders/renderableModelDepth_fs.glsl"); + "${MODULE_SPACECRAFTINSTRUMENTS}/shaders/renderableModelDepth_vs.glsl", + "${MODULE_SPACECRAFTINSTRUMENTS}/shaders/renderableModelDepth_fs.glsl"); loadTextures(); diff --git a/modules/spacecraftinstruments/rendering/renderableplanetprojection.cpp b/modules/spacecraftinstruments/rendering/renderableplanetprojection.cpp index f0066ab126..cf2763309f 100644 --- a/modules/spacecraftinstruments/rendering/renderableplanetprojection.cpp +++ b/modules/spacecraftinstruments/rendering/renderableplanetprojection.cpp @@ -204,14 +204,14 @@ RenderablePlanetProjection::~RenderablePlanetProjection() {} void RenderablePlanetProjection::initialize() { _programObject = OsEng.renderEngine().buildRenderProgram( "projectiveProgram", - "${MODULE_NEWHORIZONS}/shaders/renderablePlanet_vs.glsl", - "${MODULE_NEWHORIZONS}/shaders/renderablePlanet_fs.glsl" + "${MODULE_SPACECRAFTINSTRUMENTS}/shaders/renderablePlanet_vs.glsl", + "${MODULE_SPACECRAFTINSTRUMENTS}/shaders/renderablePlanet_fs.glsl" ); _fboProgramObject = ghoul::opengl::ProgramObject::Build( "fboPassProgram", - "${MODULE_NEWHORIZONS}/shaders/renderablePlanetProjection_vs.glsl", - "${MODULE_NEWHORIZONS}/shaders/renderablePlanetProjection_fs.glsl" + "${MODULE_SPACECRAFTINSTRUMENTS}/shaders/renderablePlanetProjection_vs.glsl", + "${MODULE_SPACECRAFTINSTRUMENTS}/shaders/renderablePlanetProjection_fs.glsl" ); loadTextures(); diff --git a/modules/spacecraftinstruments/rendering/renderableshadowcylinder.cpp b/modules/spacecraftinstruments/rendering/renderableshadowcylinder.cpp index 8fc906c472..cccd416013 100644 --- a/modules/spacecraftinstruments/rendering/renderableshadowcylinder.cpp +++ b/modules/spacecraftinstruments/rendering/renderableshadowcylinder.cpp @@ -267,8 +267,8 @@ void RenderableShadowCylinder::initialize() { RenderEngine& renderEngine = OsEng.renderEngine(); _shader = renderEngine.buildRenderProgram( "ShadowCylinderProgram", - "${MODULE_NEWHORIZONS}/shaders/terminatorshadow_vs.glsl", - "${MODULE_NEWHORIZONS}/shaders/terminatorshadow_fs.glsl" + "${MODULE_SPACECRAFTINSTRUMENTS}/shaders/terminatorshadow_vs.glsl", + "${MODULE_SPACECRAFTINSTRUMENTS}/shaders/terminatorshadow_fs.glsl" ); } diff --git a/modules/spacecraftinstruments/util/projectioncomponent.cpp b/modules/spacecraftinstruments/util/projectioncomponent.cpp index 214553eaa5..f1e9f9455a 100644 --- a/modules/spacecraftinstruments/util/projectioncomponent.cpp +++ b/modules/spacecraftinstruments/util/projectioncomponent.cpp @@ -382,8 +382,8 @@ bool ProjectionComponent::initializeGL() { if (_dilation.isEnabled) { _dilation.program = ghoul::opengl::ProgramObject::Build( "Dilation", - "${MODULE_NEWHORIZONS}/shaders/dilation_vs.glsl", - "${MODULE_NEWHORIZONS}/shaders/dilation_fs.glsl" + "${MODULE_SPACECRAFTINSTRUMENTS}/shaders/dilation_vs.glsl", + "${MODULE_SPACECRAFTINSTRUMENTS}/shaders/dilation_fs.glsl" ); const GLfloat plane[] = { From 621dd20f45d2b48e3ed68b89f04c122996c948fe Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Wed, 16 Aug 2017 15:08:47 -0400 Subject: [PATCH 25/28] Fix include of default applications --- support/cmake/handle_applications.cmake | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/support/cmake/handle_applications.cmake b/support/cmake/handle_applications.cmake index cc4c3217a9..a15eeb4182 100644 --- a/support/cmake/handle_applications.cmake +++ b/support/cmake/handle_applications.cmake @@ -38,10 +38,9 @@ function (handle_applications) get_application_attribute_default(${app_dir} is_default_application) if (${is_default_application}) - set(OPENSPACE_APPLICATION_${upper_app} ON) + set(OPENSPACE_APPLICATION_${upper_app} ON CACHE BOOL "Build ${app} application" FORCE) endif () - if (OPENSPACE_APPLICATION_${upper_app}) message(STATUS "Adding application ${app}") add_subdirectory(${app_dir}) From 7d3b0d7822e4fd0b2a58ae140a3862df71e0cc2b Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Thu, 17 Aug 2017 09:36:05 -0400 Subject: [PATCH 26/28] Update new horizons data files (kernels and textures) --- .gitignore | 1 + .../newhorizons/NewHorizonsKernels.torrent | Bin 17892 -> 0 bytes .../newhorizons/new_horizons_kernels.torrent | Bin 0 -> 18359 bytes .../newhorizons/newhorizons/newhorizons.data | 2 +- .../newhorizons/newhorizons/newhorizons.mod | 92 +++++------------- .../newhorizons/pluto/charon/charon.data | 2 +- .../newhorizons/pluto/charon/charon.mod | 27 ++--- .../newhorizons/pluto/hydra/hydra.mod | 18 ++-- .../newhorizons/pluto/kerberos/kerberos.mod | 12 +-- .../missions/newhorizons/pluto/nix/nix.mod | 12 +-- .../newhorizons/pluto/pluto/pluto.mod | 25 ++--- .../missions/newhorizons/pluto/styx/styx.mod | 12 +-- 12 files changed, 63 insertions(+), 140 deletions(-) delete mode 100644 data/scene/missions/newhorizons/newhorizons/NewHorizonsKernels.torrent create mode 100644 data/scene/missions/newhorizons/newhorizons/new_horizons_kernels.torrent diff --git a/.gitignore b/.gitignore index 7b140e286b..f3d422fad7 100644 --- a/.gitignore +++ b/.gitignore @@ -118,3 +118,4 @@ data/spice/OsirisRexKernels data/spice/plu055.bsp data/spice/Rosetta data/spice/sat375.bsp +data/spice/new_horizons/ diff --git a/data/scene/missions/newhorizons/newhorizons/NewHorizonsKernels.torrent b/data/scene/missions/newhorizons/newhorizons/NewHorizonsKernels.torrent deleted file mode 100644 index feebf52b69707ea3677402d72101d2f0fb584acc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17892 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 diff --git a/data/scene/missions/newhorizons/newhorizons/new_horizons_kernels.torrent b/data/scene/missions/newhorizons/newhorizons/new_horizons_kernels.torrent new file mode 100644 index 0000000000000000000000000000000000000000..659c9c3f7953471ec818b7c4e3c0ee93a53e16eb GIT binary patch literal 18359 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 RV><_13uD6{pTlGP{{eDoxNQIc literal 0 HcmV?d00001 diff --git a/data/scene/missions/newhorizons/newhorizons/newhorizons.data b/data/scene/missions/newhorizons/newhorizons/newhorizons.data index 1f2ad0d805..6051bdd987 100644 --- a/data/scene/missions/newhorizons/newhorizons/newhorizons.data +++ b/data/scene/missions/newhorizons/newhorizons/newhorizons.data @@ -4,7 +4,7 @@ return { { Identifier = "newhorizons_textures", Destination = "textures", Version = 2 } }, TorrentFiles = { - { File = "NewHorizonsKernels.torrent", Destination = "${SPICE}" }, + { File = "new_horizons_kernels.torrent", Destination = "${SPICE}" }, { File = "jup260.bsp.torrent", Destination = "${SPICE}" } } } \ No newline at end of file diff --git a/data/scene/missions/newhorizons/newhorizons/newhorizons.mod b/data/scene/missions/newhorizons/newhorizons/newhorizons.mod index d15b46d79d..889c6af821 100644 --- a/data/scene/missions/newhorizons/newhorizons/newhorizons.mod +++ b/data/scene/missions/newhorizons/newhorizons/newhorizons.mod @@ -1,71 +1,35 @@ -if UseAccurateNewHorizonsKernels then - NewHorizonsKernels = { - "${SPICE}/nh_20170126/spk/nh_pred_20141201_20190301_od122.bsp", - "${SPICE}/nh_20170126/spk/NavSE_plu047_od122.bsp", - "${SPICE}/nh_20170126/spk/NavPE_de433_od122.bsp", +NewHorizonsKernels = { + "${SPICE}/new_horizons/spk/nh_pred_20141201_20190301_od122.bsp", + "${SPICE}/new_horizons/spk/NavSE_plu047_od122.bsp", + "${SPICE}/new_horizons/spk/NavPE_de433_od122.bsp", - "${SPICE}/jup260.bsp", + "${SPICE}/jup260.bsp", - "${SPICE}/nh_20170126/ck/nh_scispi_2015_pred.bc", - "${SPICE}/nh_20170126/ck/nh_scispi_2015_recon.bc", - "${SPICE}/nh_20170126/ck/nh_lorri_wcs.bc", - - "${SPICE}/nh_20170126/smithed_pc_and_sp/PLU_LORRI_ALL_161216.bc", + "${SPICE}/new_horizons/ck/nh_scispi_2015_pred.bc", + "${SPICE}/new_horizons/ck/nh_scispi_2015_recon.bc", + "${SPICE}/new_horizons/ck/nh_lorri_wcs.bc", + + "${SPICE}/new_horizons/smithed_pc_and_sp/PLU_LORRI_ALL_161216.bc", - "${SPICE}/nh_20170126/sclk/new-horizons_1121.tsc", + "${SPICE}/new_horizons/sclk/new-horizons_1121.tsc", - "${SPICE}/nh_20170126/pck/nh_targets_v001.tpc", - "${SPICE}/nh_20170126/pck/nh_pcnh_005.tpc", + "${SPICE}/new_horizons/pck/nh_targets_v001.tpc", + "${SPICE}/new_horizons/pck/nh_pcnh_005.tpc", - "${SPICE}/nh_20170126/fk/nh_v220.tf", - "${SPICE}/nh_20170126/ik/nh_allinstruments_v002.ti", - "${SPICE}/nh_20170126/ik/nh_alice_v200.ti", - "${SPICE}/nh_20170126/ik/nh_lorri_v201.ti", - "${SPICE}/nh_20170126/ik/nh_pepssi_v110.ti", - "${SPICE}/nh_20170126/ik/nh_ralph_v100.ti", - "${SPICE}/nh_20170126/ik/nh_rex_v100.ti", - "${SPICE}/nh_20170126/ik/nh_sdc_v101.ti", - "${SPICE}/nh_20170126/ik/nh_swap_v100.ti", - "${SPICE}/nh_20170126/ik/nh_astr_v000.ti", - "${SPICE}/nh_20170126/ik/nh_fss_v000.ti", - "${SPICE}/nh_20170126/fk/nh_soc_misc_v001.tf", - "${SPICE}/nh_20170126/spk/nh_stars.bsp", - } -else - NewHorizonsKernels = { - --SCLK - - "${SPICE}/NewHorizonsKernels/new_horizons_413.tsc", - - "${SPICE}/NewHorizonsKernels/nhops_CORE_v9g_cdh2.bc", - "${SPICE}/NewHorizonsKernels/nh_ref_20080710_20160101_od059B.bsp", - - "${SPICE}/de430_1850-2150.bsp", - -- CK - "${SPICE}/NewHorizonsKernels/merged_nhpc_2006_v011.bc", - "${SPICE}/NewHorizonsKernels/merged_nhpc_2007_v006.bc", - -- FK - "${SPICE}/NewHorizonsKernels/nh_v200.tf", - -- IK - "${SPICE}/NewHorizonsKernels/nh_alice_v110.ti", - "${SPICE}/NewHorizonsKernels/nh_lorri_v100.ti", - "${SPICE}/NewHorizonsKernels/nh_pepssi_v110.ti", - "${SPICE}/NewHorizonsKernels/nh_ralph_v100.ti", - "${SPICE}/NewHorizonsKernels/nh_rex_v100.ti", - "${SPICE}/NewHorizonsKernels/nh_sdc_v101.ti", - "${SPICE}/NewHorizonsKernels/nh_swap_v100.ti", - -- PCK - - -- SPK - "${SPICE}/jup260.bsp", - "${SPICE}/NewHorizonsKernels/de413.bsp", - "${SPICE}/NewHorizonsKernels/nh_nep_ura_000.bsp", - "${SPICE}/NewHorizonsKernels/nh_recon_e2j_v1.bsp", - "${SPICE}/NewHorizonsKernels/nh_recon_j2sep07_prelimv1.bsp", - "${SPICE}/NewHorizonsKernels/sb_2002jf56_2.bsp", - "${SPICE}/NewHorizonsKernels/nh_plu017.bsp", - } -end + "${SPICE}/new_horizons/fk/nh_v220.tf", + "${SPICE}/new_horizons/ik/nh_allinstruments_v002.ti", + "${SPICE}/new_horizons/ik/nh_alice_v200.ti", + "${SPICE}/new_horizons/ik/nh_lorri_v201.ti", + "${SPICE}/new_horizons/ik/nh_pepssi_v110.ti", + "${SPICE}/new_horizons/ik/nh_ralph_v100.ti", + "${SPICE}/new_horizons/ik/nh_rex_v100.ti", + "${SPICE}/new_horizons/ik/nh_sdc_v101.ti", + "${SPICE}/new_horizons/ik/nh_swap_v100.ti", + "${SPICE}/new_horizons/ik/nh_astr_v000.ti", + "${SPICE}/new_horizons/ik/nh_fss_v000.ti", + "${SPICE}/new_horizons/fk/nh_soc_misc_v001.tf", + "${SPICE}/new_horizons/spk/nh_stars.bsp", +} return { { @@ -87,8 +51,6 @@ return { }, { Name = "NewHorizons", - -- Parent = "PlutoBarycenter", - -- Parent = "JupiterBarycenter", Parent = "NewHorizonsPosition", Renderable = { Type = "RenderableModel", diff --git a/data/scene/missions/newhorizons/pluto/charon/charon.data b/data/scene/missions/newhorizons/pluto/charon/charon.data index 0e0214f515..3b5a49d167 100644 --- a/data/scene/missions/newhorizons/pluto/charon/charon.data +++ b/data/scene/missions/newhorizons/pluto/charon/charon.data @@ -1,5 +1,5 @@ return { FileRequest = { - { Identifier = "charon_textures", Destination = "textures", Version = 2 } + { Identifier = "charon_textures", Destination = "textures", Version = 3 } }, } \ No newline at end of file diff --git a/data/scene/missions/newhorizons/pluto/charon/charon.mod b/data/scene/missions/newhorizons/pluto/charon/charon.mod index 2f611209cb..a02d63a997 100644 --- a/data/scene/missions/newhorizons/pluto/charon/charon.mod +++ b/data/scene/missions/newhorizons/pluto/charon/charon.mod @@ -1,22 +1,15 @@ local charon_radius = 6.035E5 -if UseAccurateNewHorizonsKernels then - NewHorizonsKernels = { - "${SPICE}/nh_20170126/spk/NavSE_plu047_od122.bsp", - "${SPICE}/nh_20170126/spk/NavPE_de433_od122.bsp", - } -else - NewHorizonsKernels = { - "${OPENSPACE_DATA}/spice/de430_1850-2150.bsp" - } -end - -local Files = { - low = "textures/charon_highres.jpg", - med = "textures/charon_highres.jpg", - high = "textures/cpmap_cyl_HR_0e.jpg" +local NewHorizonsKernels = { + "${SPICE}/new_horizons/spk/NavSE_plu047_od122.bsp", + "${SPICE}/new_horizons/spk/NavPE_de433_od122.bsp", } -local ColorTexture = Files[TextureResolution] + +-- Loading the smaller version for higher compatability +-- if we have a good way to measure GPU memory, we can make this dynamic +local ColorTexture = "textures/NH_Charon_mosaic_8192.png" +local HeightTexture = "textures/NH_Charon_DTM_8192.png" + return { -- CharonProjection module @@ -32,7 +25,7 @@ return { Segments = 100 }, ColorTexture = ColorTexture, - HeightTexture = "textures/cpdem-Mcolor2-MLorriCA-lr-5_ZMfs-cyl.jpg", + HeightTexture = HeightTexture, Projection = { Observer = "NEW HORIZONS", Target = "CHARON", diff --git a/data/scene/missions/newhorizons/pluto/hydra/hydra.mod b/data/scene/missions/newhorizons/pluto/hydra/hydra.mod index b6d7101c42..742096b036 100644 --- a/data/scene/missions/newhorizons/pluto/hydra/hydra.mod +++ b/data/scene/missions/newhorizons/pluto/hydra/hydra.mod @@ -1,14 +1,8 @@ -local charon_radius = 0.53E5 +local hydra_radius = 0.53E5 -if UseAccurateNewHorizonsKernels then - NewHorizonsKernels = { - "${SPICE}/nh_20170126/spk/NavSE_plu047_od122.bsp" - } -else - NewHorizonsKernels = { - "${SPICE}/NewHorizonsKernels/nh_p4p5_revised.bsp" - } -end +local NewHorizonsKernels = { + "${SPICE}/new_horizons/spk/NavSE_plu047_od122.bsp", +} return { -- Hydra module @@ -19,10 +13,10 @@ return { Type = "RenderablePlanet", Frame = "IAU_PLUTO", Body = "HYDRA", - Radius = charon_radius, + Radius = hydra_radius, Geometry = { Type = "SimpleSphere", - Radius = charon_radius, + Radius = hydra_radius, Segments = 100 }, ColorTexture = "textures/gray.jpg", diff --git a/data/scene/missions/newhorizons/pluto/kerberos/kerberos.mod b/data/scene/missions/newhorizons/pluto/kerberos/kerberos.mod index f75c930f0d..e2abf614af 100644 --- a/data/scene/missions/newhorizons/pluto/kerberos/kerberos.mod +++ b/data/scene/missions/newhorizons/pluto/kerberos/kerberos.mod @@ -1,14 +1,8 @@ local kerberos_radius = 0.1E5 -if UseAccurateNewHorizonsKernels then - NewHorizonsKernels = { - "${SPICE}/nh_20170126/spk/NavSE_plu047_od122.bsp" - } -else - NewHorizonsKernels = { - "${SPICE}/NewHorizonsKernels/nh_p4p5_revised.bsp" - } -end +local NewHorizonsKernels = { + "${SPICE}/new_horizons/spk/NavSE_plu047_od122.bsp", +} return { -- Styx module diff --git a/data/scene/missions/newhorizons/pluto/nix/nix.mod b/data/scene/missions/newhorizons/pluto/nix/nix.mod index f5c75c866f..a3ade397d5 100644 --- a/data/scene/missions/newhorizons/pluto/nix/nix.mod +++ b/data/scene/missions/newhorizons/pluto/nix/nix.mod @@ -1,14 +1,8 @@ local nix_radius = 0.45E5 -if UseAccurateNewHorizonsKernels then - NewHorizonsKernels = { - "${SPICE}/nh_20170126/spk/NavSE_plu047_od122.bsp" - } -else - NewHorizonsKernels = { - "${SPICE}/NewHorizonsKernels/nh_p4p5_revised.bsp" - } -end +local NewHorizonsKernels = { + "${SPICE}/new_horizons/spk/NavSE_plu047_od122.bsp", +} return { -- Nix module diff --git a/data/scene/missions/newhorizons/pluto/pluto/pluto.mod b/data/scene/missions/newhorizons/pluto/pluto/pluto.mod index 5077ef65af..3981f50f66 100644 --- a/data/scene/missions/newhorizons/pluto/pluto/pluto.mod +++ b/data/scene/missions/newhorizons/pluto/pluto/pluto.mod @@ -1,22 +1,13 @@ local pluto_radius = 1.173E6 -if UseAccurateNewHorizonsKernels then - NewHorizonsKernels = { - "${SPICE}/nh_20170126/spk/NavPE_de433_od122.bsp", - "${SPICE}/nh_20170126/spk/NavSE_plu047_od122.bsp" - } -else - NewHorizonsKernels = { - "${SPICE}/NewHorizonsKernels/nh_plu017.bsp" - } -end - -local Files = { - low = "textures/pluto_large.jpg", - med = "textures/Shenk_180.jpg", - high = "textures/pmap_cyl_HR_LOR_lowres.jpg" +local NewHorizonsKernels = { + "${SPICE}/new_horizons/spk/NavPE_de433_od122.bsp", + "${SPICE}/new_horizons/spk/NavSE_plu047_od122.bsp" } -local ColorTexture = Files[TextureResolution] + +local ColorTexture = "textures/pluto.jpg" +-- local ColorTexture = "textures/NH_Pluto_mosaic_16384.png" +local HeightTexture = "textures/NH_Pluto_DTM_16384.png" return { -- Pluto barycenter module @@ -45,7 +36,7 @@ return { Segments = 100 }, ColorTexture = ColorTexture, - HeightTexture = "textures/pluto_shenk_heightmap.jpg", + HeightTexture = HeightTexture, Projection = { Sequence = "${OPENSPACE_DATA}/scene/missions/newhorizons/pluto/pluto/images", EventFile = "${OPENSPACE_DATA}/scene/missions/newhorizons/pluto/pluto/assets/core_v9h_obs_getmets_v8_time_fix_nofrcd_mld.txt", diff --git a/data/scene/missions/newhorizons/pluto/styx/styx.mod b/data/scene/missions/newhorizons/pluto/styx/styx.mod index 3d157182e5..0474408ff9 100644 --- a/data/scene/missions/newhorizons/pluto/styx/styx.mod +++ b/data/scene/missions/newhorizons/pluto/styx/styx.mod @@ -1,14 +1,8 @@ local styx_radius = 0.75E4 -if UseAccurateNewHorizonsKernels then - NewHorizonsKernels = { - "${SPICE}/nh_20170126/spk/NavSE_plu047_od122.bsp" - } -else - NewHorizonsKernels = { - "${SPICE}/NewHorizonsKernels/nh_p4p5_revised.bsp" - } -end +NewHorizonsKernels = { + "${SPICE}/new_horizons/spk/NavSE_plu047_od122.bsp" +} return { -- Styx module From e056ad561f942ffb6423e842cf4bbc114ad93746 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Thu, 17 Aug 2017 10:15:28 -0400 Subject: [PATCH 27/28] Add MOC WA Mars texture as torrent Organize mars textures correctly --- data/scene/default.scene | 7 ++- data/scene/mars/map_datasets.torrent | Bin 0 -> 14973 bytes data/scene/mars/mars.data | 1 + data/scene/mars/mars.mod | 65 ++++++++++++++------------- 4 files changed, 40 insertions(+), 33 deletions(-) create mode 100644 data/scene/mars/map_datasets.torrent diff --git a/data/scene/default.scene b/data/scene/default.scene index 48cb27dc77..4bfab819ee 100644 --- a/data/scene/default.scene +++ b/data/scene/default.scene @@ -1,6 +1,11 @@ -- Add folders to this list that contain .info files describing HiRISE patches local mars_folders = { -- Add a folder here whose contents will be automatically added to the Mars globe + -- If multiple folders are added, the results will be added sequentially, meaning that + -- if areas overlap (for example CTX and HiRISE) and CTX is specified *after* HiRISE, + -- CTX will stomp over the HiRISE + -- + -- tl;dr: Specify CTX folders first, then HiRISE } function preInitialization() @@ -82,7 +87,7 @@ function postInitialization() openspace.printInfo("Done setting default values") - -- Add the HiRISE patches described at the top of this file + -- Add the CTX and HiRISE patches described at the top of this file for _, file in pairs(mars_folders) do openspace.globebrowsing.addBlendingLayersFromDirectory(file, "Mars") end diff --git a/data/scene/mars/map_datasets.torrent b/data/scene/mars/map_datasets.torrent new file mode 100644 index 0000000000000000000000000000000000000000..812a8df72377b4e2aa3c913912e9ecfba21bccc7 GIT binary patch literal 14973 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 Date: Thu, 17 Aug 2017 10:17:32 -0400 Subject: [PATCH 28/28] Quick fix for mars.mod --- data/scene/mars/mars.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/scene/mars/mars.mod b/data/scene/mars/mars.mod index 6cd0d90847..d2e8d0e7ca 100644 --- a/data/scene/mars/mars.mod +++ b/data/scene/mars/mars.mod @@ -108,7 +108,7 @@ return { HeightLayers = { { Name = "Mola Elevation", - FilePath = "map_service_configs/Mars_MGS_MOLA_DEM.xml" + FilePath = "map_service_configs/Mars_MGS_MOLA_DEM.xml", TilePixelSize = 90 }, {