#pragma once #include #include #include #include namespace plot::render { /// Vertex array plus instance buffer of the line pipeline. /// /// The attribute layout is fixed by the line shader (see shaders.hpp): `a_p0` at /// location 0 and `a_p1` at location 1, two floats each, advancing once per /// instance. A caller never writes a location, stride or offset; it stages a /// `LineBatch` and uploads its `data()`. class LineVertexArray { public: /// Creates the vertex array, the instance buffer and the attribute layout. bool create(Status* st = nullptr) noexcept; /// Uploads `segments` instances from interleaved `x0,y0,x1,y1` floats and /// records how many the next draw should rasterise. void upload(const f32* interleaved, u32 segments) noexcept; void bind() const noexcept { vao_.bind(); } bool valid() const noexcept { return vao_.id() != 0; } u32 instance_count() const noexcept { return instances_; } private: LineBuffer buffer_; gl::VertexArray vao_; u32 instances_ = 0; }; /// Vertex array plus instance buffer of the text pipeline: `a_pos` at location 0 /// and the glyph's atlas texel origin `a_uv` at location 1, two floats each, /// advancing once per instance. class TextVertexArray { public: bool create(Status* st = nullptr) noexcept; /// Uploads `glyphs` instances from interleaved `x,y,u,v` floats. void upload(const f32* interleaved, u32 glyphs) noexcept; void bind() const noexcept { vao_.bind(); } bool valid() const noexcept { return vao_.id() != 0; } u32 instance_count() const noexcept { return instances_; } private: TextBuffer buffer_; gl::VertexArray vao_; u32 instances_ = 0; }; } // namespace plot::render