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
9namespace mbgl {
10
11namespace gl {
12class Context;
13} // namespace gl
14
15class RenderLayer;
16
17class Bucket : private util::noncopyable {
18public:
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
60protected:
61 style::LayerType layerType;
62 std::atomic<bool> uploaded { false };
63};
64
65} // namespace mbgl
66

source code of qtlocation/src/3rdparty/mapbox-gl-native/src/mbgl/renderer/bucket.hpp