#pragma once #include #include #include #include #include namespace mbgl { namespace gl { template class Segment { public: Segment(std::size_t vertexOffset_, std::size_t indexOffset_, std::size_t vertexLength_ = 0, std::size_t indexLength_ = 0) : vertexOffset(vertexOffset_), indexOffset(indexOffset_), vertexLength(vertexLength_), indexLength(indexLength_) {} const std::size_t vertexOffset; const std::size_t indexOffset; std::size_t vertexLength; std::size_t indexLength; void bind(Context& context, BufferID indexBuffer_, const typename Attributes::Locations& attributeLocations, const typename Attributes::Bindings& attributeBindings_) const { if (!vao) { vao = context.createVertexArray(); context.vertexBuffer.setDirty(); } context.vertexArrayObject = *vao; if (indexBuffer != indexBuffer_) { indexBuffer = indexBuffer_; context.elementBuffer.setDirty(); context.elementBuffer = indexBuffer_; } Attributes::bind(context, attributeLocations, variableBindings, attributeBindings_, vertexOffset); } private: mutable optional vao; mutable optional indexBuffer; mutable typename Attributes::VariableBindings variableBindings; }; template class SegmentVector : public std::vector> { public: SegmentVector() = default; }; } // namespace gl } // namespace mbgl