mirror of
https://github.com/OpenSpace/OpenSpace.git
synced 2026-05-23 21:08:47 -05:00
Add new TileProvider implementation SizeReferenceTileProvider and add to lodMars
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user