1 | #pragma once |
2 | |
3 | #include <mbgl/util/noncopyable.hpp> |
4 | #include <mbgl/tile/geometry_tile_data.hpp> |
5 | #include <mbgl/style/layer_type.hpp> |
6 | |
7 | #include <atomic> |
8 | |
9 | namespace mbgl { |
10 | |
11 | namespace gl { |
12 | class Context; |
13 | } // namespace gl |
14 | |
15 | class RenderLayer; |
16 | |
17 | class Bucket : private util::noncopyable { |
18 | public: |
19 | Bucket(style::LayerType layerType_) |
20 | : layerType(layerType_) { |
21 | } |
22 | |
23 | virtual ~Bucket() = default; |
24 | |
25 | // Check whether this bucket is of the given subtype. |
26 | template <class T> |
27 | bool is() const; |
28 | |
29 | // Dynamically cast this bucket to the given subtype. |
30 | template <class T> |
31 | T* as() { |
32 | return is<T>() ? reinterpret_cast<T*>(this) : nullptr; |
33 | } |
34 | |
35 | template <class T> |
36 | const T* as() const { |
37 | return is<T>() ? reinterpret_cast<const T*>(this) : nullptr; |
38 | } |
39 | |
40 | // Feature geometries are also used to populate the feature index. |
41 | // Obtaining these is a costly operation, so we do it only once, and |
42 | // pass-by-const-ref the geometries as a second parameter. |
43 | virtual void addFeature(const GeometryTileFeature&, |
44 | const GeometryCollection&) {}; |
45 | |
46 | // As long as this bucket has a Prepare render pass, this function is getting called. Typically, |
47 | // this only happens once when the bucket is being rendered for the first time. |
48 | virtual void upload(gl::Context&) = 0; |
49 | |
50 | virtual bool hasData() const = 0; |
51 | |
52 | virtual float getQueryRadius(const RenderLayer&) const { |
53 | return 0; |
54 | }; |
55 | |
56 | bool needsUpload() const { |
57 | return hasData() && !uploaded; |
58 | } |
59 | |
60 | protected: |
61 | style::LayerType layerType; |
62 | std::atomic<bool> uploaded { false }; |
63 | }; |
64 | |
65 | } // namespace mbgl |
66 | |