Add a simple abstract class for providing Tiles with text. Refactor ChunkIndexTileProvider

This commit is contained in:
Erik Broberg
2016-08-30 18:15:00 -04:00
parent 5d21878ead
commit 1be37a9333
4 changed files with 72 additions and 41 deletions
+2 -2
View File
@@ -50,7 +50,7 @@ set(HEADER_FILES
${CMAKE_CURRENT_SOURCE_DIR}/tile/tileprovider/tileprovider.h
${CMAKE_CURRENT_SOURCE_DIR}/tile/tileprovider/singleimageprovider.h
${CMAKE_CURRENT_SOURCE_DIR}/tile/tileprovider/chunkindextileprovider.h
${CMAKE_CURRENT_SOURCE_DIR}/tile/tileprovider/texttileprovider.h
${CMAKE_CURRENT_SOURCE_DIR}/tile/tileprovider/cachingtileprovider.h
${CMAKE_CURRENT_SOURCE_DIR}/tile/tileprovider/temporaltileprovider.h
@@ -101,7 +101,7 @@ set(SOURCE_FILES
${CMAKE_CURRENT_SOURCE_DIR}/tile/tileprovider/tileprovider.cpp
${CMAKE_CURRENT_SOURCE_DIR}/tile/tileprovider/singleimageprovider.cpp
${CMAKE_CURRENT_SOURCE_DIR}/tile/tileprovider/chunkindextileprovider.cpp
${CMAKE_CURRENT_SOURCE_DIR}/tile/tileprovider/texttileprovider.cpp
${CMAKE_CURRENT_SOURCE_DIR}/tile/tileprovider/cachingtileprovider.cpp
${CMAKE_CURRENT_SOURCE_DIR}/tile/tileprovider/temporaltileprovider.cpp
@@ -22,7 +22,7 @@
* OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
****************************************************************************************/
#include <modules/globebrowsing/tile/tileprovider/chunkindextileprovider.h>
#include <modules/globebrowsing/tile/tileprovider/texttileprovider.h>
#include <modules/globebrowsing/chunk/chunkindex.h>
@@ -40,18 +40,17 @@
namespace {
const std::string _loggerCat = "TileProvider";
const std::string _loggerCat = "TextTileProvider";
}
namespace openspace {
ChunkIndexTileProvider::ChunkIndexTileProvider(const glm::uvec2& textureSize, size_t fontSize)
TextTileProvider::TextTileProvider(const glm::uvec2& textureSize, size_t fontSize)
: _tileCache(500)
, _textureSize(textureSize)
, _fontSize(fontSize)
{
using namespace ghoul::fontrendering;
_font = OsEng.fontManager().font("Mono", _fontSize);
_fontRenderer = std::unique_ptr<FontRenderer>(FontRenderer::createDefault());
@@ -61,11 +60,11 @@ namespace openspace {
glGenFramebuffers(1, &_fbo);
}
ChunkIndexTileProvider::~ChunkIndexTileProvider() {
TextTileProvider::~TextTileProvider() {
glDeleteFramebuffers(1, &_fbo);
}
Tile ChunkIndexTileProvider::getTile(const ChunkIndex& chunkIndex) {
Tile TextTileProvider::getTile(const ChunkIndex& chunkIndex) {
ChunkHashKey key = chunkIndex.hashKey();
if (!_tileCache.exist(key)) {
@@ -75,31 +74,31 @@ namespace openspace {
return _tileCache.get(key);
}
Tile ChunkIndexTileProvider::getDefaultTile() {
Tile TextTileProvider::getDefaultTile() {
return Tile::TileUnavailable;
}
Tile::Status ChunkIndexTileProvider::getTileStatus(const ChunkIndex& index) {
Tile::Status TextTileProvider::getTileStatus(const ChunkIndex& index) {
return Tile::Status::OK;
}
TileDepthTransform ChunkIndexTileProvider::depthTransform() {
TileDepthTransform TextTileProvider::depthTransform() {
TileDepthTransform transform;
transform.depthOffset = 0.0f;
transform.depthScale = 1.0f;
return transform;
}
void ChunkIndexTileProvider::update() {
void TextTileProvider::update() {
// nothing to be done
}
void ChunkIndexTileProvider::reset() {
void TextTileProvider::reset() {
_tileCache.clear();
}
Tile ChunkIndexTileProvider::createChunkIndexTile(const ChunkIndex& chunkIndex) {
Tile TextTileProvider::createChunkIndexTile(const ChunkIndex& chunkIndex) {
glm::uvec4 color = { 0, 0, 0, 0 };
Tile tile = Tile::createPlainTile(_textureSize, color);
@@ -128,15 +127,8 @@ namespace openspace {
static_cast<GLsizei>(tile.texture->height())
);
_fontRenderer->render(
*_font,
glm::vec2(
_textureSize.x / 4 - (_textureSize.x / 32) * log10(1 << chunkIndex.level),
_textureSize.y / 2 + _fontSize),
glm::vec4(1.0, 0.0, 0.0, 1.0),
"level: %i \nx: %i \ny: %i",
chunkIndex.level, chunkIndex.x, chunkIndex.y
);
ghoul_assert(_fontRenderer != nullptr, "_fontRenderer must not be null");
renderText(*_fontRenderer, chunkIndex);
// Reset state: bind default FBO and set viewport to what it was
glBindFramebuffer(GL_FRAMEBUFFER, defaultFBO);
@@ -145,10 +137,27 @@ namespace openspace {
return tile;
}
int ChunkIndexTileProvider::maxLevel() {
int TextTileProvider::maxLevel() {
return 1337; // unlimited
}
void ChunkIndexTileProvider::renderText(const FontRenderer& fontRenderer, const ChunkIndex& chunkIndex) const {
fontRenderer.render(
*_font,
glm::vec2(
_textureSize.x / 4 - (_textureSize.x / 32) * log10(1 << chunkIndex.level),
_textureSize.y / 2 + _fontSize),
glm::vec4(1.0, 0.0, 0.0, 1.0),
"level: %i \nx: %i \ny: %i",
chunkIndex.level, chunkIndex.x, chunkIndex.y
);
}
} // namespace openspace
@@ -22,8 +22,8 @@
* OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
****************************************************************************************/
#ifndef __CHUNK_INDEX_TILE_PROVIDER_H__
#define __CHUNK_INDEX_TILE_PROVIDER_H__
#ifndef __TEXT_TILE_PROVIDER_H__
#define __TEXT_TILE_PROVIDER_H__
#include <ghoul/logging/logmanager.h>
#include <ghoul/filesystem/filesystem.h> // absPath
@@ -45,12 +45,21 @@
namespace openspace {
class ChunkIndexTileProvider : public TileProvider {
using namespace ghoul::fontrendering;
/**
* This abstract class implements the TilProvider interface and enables a simple way
* of providing tiles with any type of rendered text.
* Internally it handles setting up a FBO for rendering the text, and defines a new
* interface, consisting of only a single method for subclasses to implement:
* \code renderText(const FontRenderer&, const ChunkIndex&) const \endcode
*/
class TextTileProvider : public TileProvider {
public:
ChunkIndexTileProvider(const glm::uvec2& textureSize = {512, 512}, size_t fontSize = 48);
virtual ~ChunkIndexTileProvider();
TextTileProvider(const glm::uvec2& textureSize = {512, 512}, size_t fontSize = 48);
virtual ~TextTileProvider();
// Methods below are implemented in this class
virtual Tile getTile(const ChunkIndex& chunkIndex);
virtual Tile getDefaultTile();
@@ -59,18 +68,31 @@ namespace openspace {
virtual void update();
virtual void reset();
virtual int maxLevel();
private:
Tile createChunkIndexTile(const ChunkIndex& chunkIndex);
std::shared_ptr<ghoul::fontrendering::Font> _font;
std::unique_ptr<ghoul::fontrendering::FontRenderer> _fontRenderer;
TileCache _tileCache;
// This method is pure and should be implemented by subclasses
virtual void renderText(const FontRenderer& fontRenderer, const ChunkIndex& chunkIndex) const = 0;
protected:
std::shared_ptr<ghoul::fontrendering::Font> _font;
glm::uvec2 _textureSize;
size_t _fontSize;
GLuint _fbo;
private:
Tile createChunkIndexTile(const ChunkIndex& chunkIndex);
std::unique_ptr<ghoul::fontrendering::FontRenderer> _fontRenderer;
TileCache _tileCache;
GLuint _fbo;
};
/**
* Provides \class Tiles with the chunk index rendered as text onto its tiles.
*/
class ChunkIndexTileProvider : public TextTileProvider {
public:
virtual void renderText(const FontRenderer& fontRenderer, const ChunkIndex& chunkIndex) const;
};
@@ -79,4 +101,4 @@ namespace openspace {
#endif // __CHUNK_INDEX_TILE_PROVIDER_H__
#endif // __TEXT_TILE_PROVIDER_H__
@@ -28,7 +28,7 @@
#include <modules/globebrowsing/tile/tileprovider/singleimageprovider.h>
#include <modules/globebrowsing/tile/tileprovider/cachingtileprovider.h>
#include <modules/globebrowsing/tile/tileprovider/temporaltileprovider.h>
#include <modules/globebrowsing/tile/tileprovider/chunkindextileprovider.h>
#include <modules/globebrowsing/tile/tileprovider/texttileprovider.h>
#include <ghoul/logging/logmanager.h>