Add new TileProvider implementation SizeReferenceTileProvider and add to lodMars

This commit is contained in:
Erik Broberg
2016-08-31 13:27:36 -04:00
parent 4a5dd1dacb
commit b064c5606f
4 changed files with 67 additions and 3 deletions
+5
View File
@@ -86,6 +86,11 @@ return {
Type = "ChunkIndex",
Name = "Indices",
},
{
Type = "SizeReference",
Name = "Size Reference",
Radii = marsEllipsoid,
},
},
HeightMaps = {
{
@@ -63,6 +63,7 @@ void GlobeBrowsingModule::internalInitialize() {
fTileProvider->registerClass<SingleImageProvider>("SingleImage");
fTileProvider->registerClass<TemporalTileProvider>("Temporal");
fTileProvider->registerClass<ChunkIndexTileProvider>("ChunkIndex");
fTileProvider->registerClass<SizeReferenceTileProvider>("SizeReference");
}
@@ -53,6 +53,7 @@ namespace openspace {
{
_font = OsEng.fontManager().font("Mono", _fontSize);
_fontRenderer = std::unique_ptr<FontRenderer>(FontRenderer::createDefault());
_fontRenderer->setFramebufferSize(textureSize);
@@ -142,7 +143,9 @@ namespace openspace {
}
//////////////////////////////////////////////////////////////////////////////////////
// Chunk Index Tile Provider //
//////////////////////////////////////////////////////////////////////////////////////
void ChunkIndexTileProvider::renderText(const FontRenderer& fontRenderer, const ChunkIndex& chunkIndex) const {
fontRenderer.render(
@@ -156,8 +159,52 @@ namespace openspace {
);
}
//////////////////////////////////////////////////////////////////////////////////////
// Tile Size Reference Tile Provider //
//////////////////////////////////////////////////////////////////////////////////////
namespace {
const std::string KeyRadii = "Radii";
}
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);
}
void SizeReferenceTileProvider::renderText(const FontRenderer& fontRenderer, const ChunkIndex& chunkIndex) const {
GeodeticPatch patch(chunkIndex);
bool aboveEquator = patch.isNorthern();
double lat = aboveEquator ? patch.minLat() : patch.maxLat();
double lon1 = patch.minLon();
double lon2 = patch.maxLon();
double tileLongitudalLength = _ellipsoid.longitudalDistance(lat, lon1, lon2);
std::string unit = "m";
if (tileLongitudalLength > 10000) {
tileLongitudalLength *= 0.001;
unit = "km";
}
glm::vec2 textPosition;
textPosition.x = 0;
textPosition.y = aboveEquator ? _fontSize / 2 : _textureSize.y - 3 * _fontSize / 2;
glm::vec4 color(1.0, 1.0, 1.0, 1.0);
fontRenderer.render(
*_font,
textPosition,
color,
" %.0f %s",
tileLongitudalLength, unit.c_str()
);
}
} // namespace openspace
@@ -25,6 +25,8 @@
#ifndef __TEXT_TILE_PROVIDER_H__
#define __TEXT_TILE_PROVIDER_H__
#include <memory>
#include <ghoul/logging/logmanager.h>
#include <ghoul/filesystem/filesystem.h> // absPath
#include <ghoul/opengl/texture.h>
@@ -37,6 +39,7 @@
#include <modules/globebrowsing/tile/asynctilereader.h>
#include <modules/globebrowsing/tile/tileprovider/tileprovider.h>
#include <modules/globebrowsing/other/lrucache.h>
#include <modules/globebrowsing/geometry/ellipsoid.h>
//////////////////////////////////////////////////////////////////////////////////////////
@@ -60,7 +63,7 @@ namespace openspace {
TextTileProvider(const glm::uvec2& textureSize = {512, 512}, size_t fontSize = 48);
virtual ~TextTileProvider();
// Methods below are implemented in this class
// The TileProvider interface below is implemented in this class
virtual Tile getTile(const ChunkIndex& chunkIndex);
virtual Tile getDefaultTile();
@@ -72,7 +75,6 @@ namespace openspace {
// This method is pure and should be implemented by subclasses
virtual void renderText(const FontRenderer& fontRenderer, const ChunkIndex& chunkIndex) const = 0;
protected:
@@ -97,6 +99,15 @@ namespace openspace {
};
class SizeReferenceTileProvider : public TextTileProvider {
public:
SizeReferenceTileProvider(const ghoul::Dictionary& dictionary);
virtual void renderText(const FontRenderer& fontRenderer, const ChunkIndex& chunkIndex) const;
private:
Ellipsoid _ellipsoid;
};
} // namespace openspace