-
-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
renderer: primitive text renderer with support for colors
- Loading branch information
1 parent
856d006
commit 85843eb
Showing
8 changed files
with
286 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
add_sources(libopenage | ||
color.cpp | ||
text_renderer.cpp | ||
) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
// Copyright 2015-2015 the openage authors. See copying.md for legal info. | ||
|
||
#include "color.h" | ||
|
||
namespace openage { | ||
namespace renderer { | ||
|
||
Color::Color() | ||
: | ||
r{0}, | ||
g{0}, | ||
b{0}, | ||
a{255} { | ||
// Empty | ||
} | ||
|
||
Color::Color(uint8_t r, uint8_t g, uint8_t b, uint8_t a) | ||
: | ||
r{r}, | ||
g{g}, | ||
b{b}, | ||
a{a} { | ||
// Empty | ||
} | ||
|
||
Color::Color(const Color &other) | ||
: | ||
r{other.r}, | ||
g{other.g}, | ||
b{other.b}, | ||
a{other.a} { | ||
// Empty | ||
} | ||
|
||
Color &Color::operator=(const Color &other) { | ||
if (this != &other) { | ||
this->r = other.r; | ||
this->g = other.g; | ||
this->b = other.b; | ||
this->a = other.a; | ||
} | ||
|
||
return *this; | ||
} | ||
|
||
bool operator==(const Color &left, const Color &right) { | ||
return left.r == right.r && left.g == right.g && left.b == right.b && left.a == right.a; | ||
} | ||
|
||
bool operator!=(const Color &left, const Color &right) { | ||
return !(left == right); | ||
} | ||
|
||
}} // openage::renderer |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
// Copyright 2015-2015 the openage authors. See copying.md for legal info. | ||
|
||
#ifndef OPENAGE_RENDERER_COLOR_H_ | ||
#define OPENAGE_RENDERER_COLOR_H_ | ||
|
||
#include <cstdint> | ||
|
||
namespace openage { | ||
namespace renderer { | ||
|
||
class Color { | ||
public: | ||
Color(); | ||
|
||
Color(uint8_t r, uint8_t g, uint8_t b, uint8_t a); | ||
|
||
Color(const Color &other); | ||
|
||
Color &operator=(const Color &other); | ||
|
||
uint8_t r; | ||
uint8_t g; | ||
uint8_t b; | ||
uint8_t a; | ||
|
||
}; | ||
|
||
bool operator==(const Color &left, const Color &right); | ||
bool operator!=(const Color &left, const Color &right); | ||
|
||
}} // openage::renderer | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,114 @@ | ||
// Copyright 2015-2015 the openage authors. See copying.md for legal info. | ||
|
||
#include "text_renderer.h" | ||
|
||
#include <algorithm> | ||
#include <epoxy/gl.h> | ||
|
||
#include "../log/log.h" | ||
#include "../util/strings.h" | ||
#include "../font.h" | ||
|
||
namespace openage { | ||
namespace renderer { | ||
|
||
TextRenderer::TextRenderer() | ||
: | ||
current_font{nullptr}, | ||
current_color{255, 255, 255, 255}, | ||
is_dirty{true} { | ||
// Empty | ||
} | ||
|
||
TextRenderer::~TextRenderer() { | ||
// Empty | ||
} | ||
|
||
void TextRenderer::set_font(openage::Font *font) { | ||
if (this->current_font == font) { | ||
return; | ||
} | ||
|
||
this->current_font = font; | ||
this->is_dirty = true; | ||
} | ||
|
||
void TextRenderer::set_color(const Color &color) { | ||
if (this->current_color == color) { | ||
return; | ||
} | ||
|
||
this->current_color = color; | ||
this->is_dirty = true; | ||
} | ||
|
||
void TextRenderer::draw(coord::window position, const char *format, ...) { | ||
std::string text; | ||
va_list vl; | ||
va_start(vl, format); | ||
util::vsformat(format, vl, text); | ||
va_end(vl); | ||
|
||
this->draw(position.x, position.y, text); | ||
} | ||
|
||
void TextRenderer::draw(coord::window position, const std::string &text) { | ||
this->draw(position.x, position.y, text); | ||
} | ||
|
||
void TextRenderer::draw(int x, int y, const std::string &text) { | ||
if (this->is_dirty) { | ||
TextRenderBatch batch; | ||
batch.font = this->current_font; | ||
batch.color = this->current_color; | ||
render_batches.push_back(batch); | ||
this->is_dirty = false; | ||
} | ||
|
||
TextRenderBatchPass batch_pass; | ||
batch_pass.x = x; | ||
batch_pass.y = y; | ||
batch_pass.text = text; | ||
render_batches.back().passes.push_back(batch_pass); | ||
} | ||
|
||
void TextRenderer::render() { | ||
// Sort the batches by font | ||
std::sort(std::begin(this->render_batches), std::end(this->render_batches), | ||
[](const TextRenderBatch &a, const TextRenderBatch &b) -> bool { | ||
return a.font < b.font; | ||
}); | ||
|
||
// Merge consecutive batches if font and color values are same | ||
for (auto current_batch = std::begin(this->render_batches); current_batch != std::end(this->render_batches); ) { | ||
auto next_batch = current_batch; | ||
next_batch++; | ||
if (next_batch != std::end(this->render_batches) && | ||
current_batch->font == next_batch->font && | ||
current_batch->color == next_batch->color) { | ||
// Merge the render passes of current and next batches and remove the next batch | ||
std::move(std::begin(next_batch->passes), | ||
std::end(next_batch->passes), | ||
std::back_inserter(current_batch->passes)); | ||
this->render_batches.erase(next_batch); | ||
} else { | ||
current_batch++; | ||
} | ||
} | ||
|
||
// Render all the batches | ||
for (auto &batch : this->render_batches) { | ||
glColor4f(batch.color.r / 255.f, | ||
batch.color.g / 255.f, | ||
batch.color.b / 255.f, | ||
batch.color.a / 255.f); | ||
for (auto &pass : batch.passes) { | ||
batch.font->render_static(pass.x, pass.y, pass.text.c_str()); | ||
} | ||
} | ||
|
||
// Clear the render batches for next frame | ||
this->render_batches.clear(); | ||
} | ||
|
||
}} // openage::renderer |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
// Copyright 2015-2015 the openage authors. See copying.md for legal info. | ||
|
||
#ifndef OPENAGE_RENDERER_TEXT_RENDERER_H_ | ||
#define OPENAGE_RENDERER_TEXT_RENDERER_H_ | ||
|
||
#include <vector> | ||
#include <string> | ||
|
||
#include "../coord/window.h" | ||
#include "color.h" | ||
|
||
namespace openage { | ||
|
||
class Font; | ||
|
||
namespace renderer { | ||
|
||
class TextRenderer { | ||
|
||
public: | ||
TextRenderer(); | ||
|
||
virtual ~TextRenderer(); | ||
|
||
void set_font(Font *font); | ||
void set_color(const Color &color); | ||
|
||
void draw(coord::window position, const char *format, ...); | ||
void draw(coord::window position, const std::string &text); | ||
void draw(int x, int y, const std::string &text); | ||
|
||
void render(); | ||
|
||
private: | ||
struct TextRenderBatchPass { | ||
int x; | ||
int y; | ||
std::string text; | ||
}; | ||
|
||
struct TextRenderBatch { | ||
openage::Font *font; | ||
Color color; | ||
std::vector<TextRenderBatchPass> passes; | ||
}; | ||
|
||
Font *current_font; | ||
Color current_color; | ||
bool is_dirty; | ||
std::vector<TextRenderBatch> render_batches; | ||
|
||
}; | ||
|
||
}} // openage::renderer | ||
|
||
#endif |