1 #pragma once
2 
3 #include <mbgl/gl/context.hpp>
4 #include <mbgl/gl/vertex_array.hpp>
5 
6 #include <cstddef>
7 #include <vector>
8 #include <map>
9 
10 namespace mbgl {
11 
12 template <class Attributes>
13 class Segment {
14 public:
Segment(std::size_t vertexOffset_,std::size_t indexOffset_,std::size_t vertexLength_=0,std::size_t indexLength_=0)15     Segment(std::size_t vertexOffset_,
16             std::size_t indexOffset_,
17             std::size_t vertexLength_ = 0,
18             std::size_t indexLength_ = 0)
19         : vertexOffset(vertexOffset_),
20           indexOffset(indexOffset_),
21           vertexLength(vertexLength_),
22           indexLength(indexLength_) {}
23 
24     const std::size_t vertexOffset;
25     const std::size_t indexOffset;
26 
27     std::size_t vertexLength;
28     std::size_t indexLength;
29 
30     // One VertexArray per layer ID. This minimizes rebinding in cases where
31     // several layers share buckets but have different sets of active attributes.
32     // This can happen:
33     //   * when two layers have the same layout properties, but differing
34     //     data-driven paint properties
35     //   * when two fill layers have the same layout properties, but one
36     //     uses fill-color and the other uses fill-pattern
37     mutable std::map<std::string, gl::VertexArray> vertexArrays;
38 };
39 
40 template <class Attributes>
41 using SegmentVector = std::vector<Segment<Attributes>>;
42 
43 } // namespace mbgl
44