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,76 @@
|
||||
#include <plot/render/vertex_array.hpp>
|
||||
|
||||
#include <plot/gl/api.hpp>
|
||||
|
||||
#include <cstddef>
|
||||
|
||||
namespace plot::render {
|
||||
namespace {
|
||||
|
||||
/// Instance data advances one step per instance, never per vertex: both
|
||||
/// pipelines draw one quad per instance with corners synthesised from
|
||||
/// `gl_VertexID`, so every attribute has a divisor of 1 (core since GL 3.3).
|
||||
constexpr gl::GLuint kPerInstance = 1;
|
||||
|
||||
} // namespace
|
||||
|
||||
bool LineVertexArray::create(Status* st) noexcept {
|
||||
if (!vao_.create(st)) {
|
||||
return false;
|
||||
}
|
||||
if (!buffer_.create(st)) {
|
||||
vao_.reset(); // do not leave a vertex array behind on the failure path
|
||||
return false;
|
||||
}
|
||||
// Attribute pointers capture the bound GL_ARRAY_BUFFER, so bind both first.
|
||||
vao_.bind();
|
||||
buffer_.bind();
|
||||
// Offsets come from the struct, not from counting floats: the layout is the
|
||||
// one shaders.hpp declares, and it stays in step with LineInstance.
|
||||
vao_.attrib(0u, 2, sizeof(LineInstance), offsetof(LineInstance, x0));
|
||||
vao_.attrib(1u, 2, sizeof(LineInstance), offsetof(LineInstance, x1));
|
||||
gl::glVertexAttribDivisor(0u, kPerInstance);
|
||||
gl::glVertexAttribDivisor(1u, kPerInstance);
|
||||
gl::glBindVertexArray(0); // leave the binding as we found it
|
||||
return true;
|
||||
}
|
||||
|
||||
void LineVertexArray::upload(const f32* interleaved, u32 segments) noexcept {
|
||||
// An array that was never created reports nothing to draw, so a caller that
|
||||
// ignored create()'s status rasterises nothing instead of stale memory.
|
||||
if (interleaved == nullptr || vao_.id() == 0) {
|
||||
instances_ = 0;
|
||||
return;
|
||||
}
|
||||
buffer_.upload(interleaved, segments);
|
||||
instances_ = segments;
|
||||
}
|
||||
|
||||
bool TextVertexArray::create(Status* st) noexcept {
|
||||
if (!vao_.create(st)) {
|
||||
return false;
|
||||
}
|
||||
if (!buffer_.create(st)) {
|
||||
vao_.reset();
|
||||
return false;
|
||||
}
|
||||
vao_.bind();
|
||||
buffer_.bind();
|
||||
vao_.attrib(0u, 2, sizeof(TextInstance), offsetof(TextInstance, x));
|
||||
vao_.attrib(1u, 2, sizeof(TextInstance), offsetof(TextInstance, u));
|
||||
gl::glVertexAttribDivisor(0u, kPerInstance);
|
||||
gl::glVertexAttribDivisor(1u, kPerInstance);
|
||||
gl::glBindVertexArray(0);
|
||||
return true;
|
||||
}
|
||||
|
||||
void TextVertexArray::upload(const f32* interleaved, u32 glyphs) noexcept {
|
||||
if (interleaved == nullptr || vao_.id() == 0) {
|
||||
instances_ = 0;
|
||||
return;
|
||||
}
|
||||
buffer_.upload(interleaved, glyphs);
|
||||
instances_ = glyphs;
|
||||
}
|
||||
|
||||
} // namespace plot::render
|
||||
Reference in new issue
Block a user