feat(render): style, GLSL line/text pipelines, staging batches, bitmap font
This commit is contained in:
1 parent
9a086b7d69
commit
7cbc1c9955
22 files changed
+1535
No files matched your search
@@ -0,0 +1,61 @@
|
||||
#include <plot/render/primitives.hpp>
|
||||
|
||||
namespace plot::render {
|
||||
|
||||
// ----------------------------------------------------------------- LineBatch
|
||||
|
||||
void LineBatch::begin() noexcept { v_.clear(); }
|
||||
|
||||
void LineBatch::clear() noexcept { v_.clear(); }
|
||||
|
||||
void LineBatch::add_segment(Vec2 a, Vec2 b) {
|
||||
v_.push_back(a.x);
|
||||
v_.push_back(a.y);
|
||||
v_.push_back(b.x);
|
||||
v_.push_back(b.y);
|
||||
}
|
||||
|
||||
void LineBatch::add_polyline(const Vec2* pts, u32 n) {
|
||||
if (pts == nullptr || n < 2u) {
|
||||
return; // no pair of points, no segment
|
||||
}
|
||||
// Grow once for the whole polyline rather than per segment, so a frame that
|
||||
// stages the same workload as the last one never reallocates.
|
||||
v_.reserve(v_.size() + 4u * (n - 1u));
|
||||
for (u32 i = 1; i < n; ++i) {
|
||||
add_segment(pts[i - 1u], pts[i]);
|
||||
}
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------- TextBatch
|
||||
|
||||
void TextBatch::begin() noexcept { v_.clear(); }
|
||||
|
||||
void TextBatch::clear() noexcept { v_.clear(); }
|
||||
|
||||
void TextBatch::add_glyph(Vec2 pos_px, u32 slot) {
|
||||
const Vec2 origin = BitmapFont::atlas_origin(slot);
|
||||
v_.push_back(pos_px.x);
|
||||
v_.push_back(pos_px.y);
|
||||
v_.push_back(origin.x);
|
||||
v_.push_back(origin.y);
|
||||
}
|
||||
|
||||
Vec2 TextBatch::add_text(Vec2 pen_px, const char* utf8, const BitmapFont& font, f32 px_per_cell) {
|
||||
if (utf8 == nullptr) {
|
||||
return pen_px;
|
||||
}
|
||||
const f32 scale = px_per_cell / static_cast<f32>(BitmapFont::kGlyphPx);
|
||||
for (const char* p = utf8; *p != '\0';) {
|
||||
// Same codepoints `measure` sums and the same advances, scaled by the
|
||||
// on-screen cell size: a run staged here is exactly what the plot layer
|
||||
// measured, times the scale it draws at, so a label never overruns the
|
||||
// space that was reserved for it.
|
||||
const u32 codepoint = BitmapFont::next_codepoint(p);
|
||||
add_glyph(pen_px, BitmapFont::glyph_index(codepoint));
|
||||
pen_px.x += font.advance_codepoint(codepoint) * scale;
|
||||
}
|
||||
return pen_px;
|
||||
}
|
||||
|
||||
} // namespace plot::render
|
||||
Reference in new issue
Block a user