From c2019570010eb76146cdfd0cb2bd4af925b354ec Mon Sep 17 00:00:00 2001 From: Erik Broberg Date: Wed, 31 Aug 2016 14:38:05 -0400 Subject: [PATCH] SizeReferenceTileProvider renders referred distance next to its text --- data/scene/debugglobe/textures/arrows.png | Bin 0 -> 20377 bytes data/scene/lodmars/lodmars.mod | 1 + .../tile/tileprovider/texttileprovider.cpp | 43 +++++++++++++++++- .../tile/tileprovider/texttileprovider.h | 6 +++ 4 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 data/scene/debugglobe/textures/arrows.png diff --git a/data/scene/debugglobe/textures/arrows.png b/data/scene/debugglobe/textures/arrows.png new file mode 100644 index 0000000000000000000000000000000000000000..d10df6684c618aff5de9313b84132b809b60255f GIT binary patch literal 20377 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 literal 0 HcmV?d00001 diff --git a/data/scene/lodmars/lodmars.mod b/data/scene/lodmars/lodmars.mod index 15127ad591..c540ee38c3 100644 --- a/data/scene/lodmars/lodmars.mod +++ b/data/scene/lodmars/lodmars.mod @@ -90,6 +90,7 @@ return { Type = "SizeReference", Name = "Size Reference", Radii = marsEllipsoid, + BackgroundImagePath = "../debugglobe/textures/arrows.png", }, }, HeightMaps = { diff --git a/modules/globebrowsing/tile/tileprovider/texttileprovider.cpp b/modules/globebrowsing/tile/tileprovider/texttileprovider.cpp index dc516383eb..66e8a0d9cf 100644 --- a/modules/globebrowsing/tile/tileprovider/texttileprovider.cpp +++ b/modules/globebrowsing/tile/tileprovider/texttileprovider.cpp @@ -100,8 +100,7 @@ namespace openspace { } Tile TextTileProvider::createChunkIndexTile(const ChunkIndex& chunkIndex) { - glm::uvec4 color = { 0, 0, 0, 0 }; - Tile tile = Tile::createPlainTile(_textureSize, color); + Tile tile = backgroundTile(chunkIndex); // Keep track of defaultFBO and viewport to be able to reset state when done GLint defaultFBO; @@ -142,6 +141,11 @@ namespace openspace { return 1337; // unlimited } + Tile TextTileProvider::backgroundTile(const ChunkIndex& chunkIndex) const { + glm::uvec4 color = { 0, 0, 0, 0 }; + return Tile::createPlainTile(_textureSize, color); + } + ////////////////////////////////////////////////////////////////////////////////////// // Chunk Index Tile Provider // @@ -165,16 +169,30 @@ namespace openspace { namespace { const std::string KeyRadii = "Radii"; + const std::string KeyBackgroundImagePath = "BackgroundImagePath"; } SizeReferenceTileProvider::SizeReferenceTileProvider(const ghoul::Dictionary& dictionary) { _fontSize = 64; _font = OsEng.fontManager().font("Mono", _fontSize); + glm::dvec3 radii(1,1,1); if (!dictionary.getValue(KeyRadii, radii)) { throw std::runtime_error("Must define key '" + KeyRadii + "'"); } _ellipsoid = Ellipsoid(radii); + + _backgroundTile.status = Tile::Status::Unavailable; + std::string backgroundImagePath; + if (dictionary.getValue(KeyBackgroundImagePath, backgroundImagePath)) { + using namespace ghoul::io; + std::string imgAbsPath = absPath(backgroundImagePath); + _backgroundTile.texture = TextureReader::ref().loadTexture(imgAbsPath); + _backgroundTile.texture->uploadTexture(); + _backgroundTile.texture->setFilter(ghoul::opengl::Texture::FilterMode::Linear); + _backgroundTile.status = Tile::Status::OK; + } + } void SizeReferenceTileProvider::renderText(const FontRenderer& fontRenderer, const ChunkIndex& chunkIndex) const { @@ -206,5 +224,26 @@ namespace openspace { ); } + Tile SizeReferenceTileProvider::backgroundTile(const ChunkIndex& chunkIndex) const { + if (_backgroundTile.status == Tile::Status::OK) { + Tile tile; + auto t = _backgroundTile.texture; + void* pixelData = new char[t->expectedPixelDataSize()]; + memcpy(pixelData, t->pixelData(), t->expectedPixelDataSize()); + tile.texture = std::make_shared( + pixelData, t->dimensions(), t->format(), t->internalFormat(), t->dataType(), t->filter(), t->wrapping()); + tile.texture->uploadTexture(); + tile.texture->setDataOwnership(Texture::TakeOwnership::Yes); + tile.status = Tile::Status::OK; + return tile; + } + else { + // use default background + return TextTileProvider::backgroundTile(chunkIndex); + } + } + + + } // namespace openspace diff --git a/modules/globebrowsing/tile/tileprovider/texttileprovider.h b/modules/globebrowsing/tile/tileprovider/texttileprovider.h index bb40eeaf06..79e9f6523a 100644 --- a/modules/globebrowsing/tile/tileprovider/texttileprovider.h +++ b/modules/globebrowsing/tile/tileprovider/texttileprovider.h @@ -73,6 +73,9 @@ namespace openspace { virtual void reset(); virtual int maxLevel(); + // Returns the tile which will be used to draw text onto. + // Default implementation returns a tile with a plain transparent texture. + virtual Tile backgroundTile(const ChunkIndex& chunkIndex) const; // This method is pure and should be implemented by subclasses virtual void renderText(const FontRenderer& fontRenderer, const ChunkIndex& chunkIndex) const = 0; @@ -102,10 +105,13 @@ namespace openspace { class SizeReferenceTileProvider : public TextTileProvider { public: SizeReferenceTileProvider(const ghoul::Dictionary& dictionary); + virtual void renderText(const FontRenderer& fontRenderer, const ChunkIndex& chunkIndex) const; + virtual Tile backgroundTile(const ChunkIndex& chunkIndex) const; private: Ellipsoid _ellipsoid; + Tile _backgroundTile; }; } // namespace openspace