maplibre/legacy/buckets/
symbol_bucket.rs

1//! Translated from https://github.com/maplibre/maplibre-native/blob/4add9ea/src/mbgl/renderer/buckets/symbol_bucket.cpp
2
3use std::{
4    collections::{BTreeMap, BTreeSet, HashMap},
5    marker::PhantomData,
6    ops::Range,
7};
8
9use geo_types::GeometryCollection;
10
11use crate::{
12    euclid::Point2D,
13    legacy::{
14        geometry_tile_data::GeometryCoordinates,
15        glyph::WritingModeType,
16        image_atlas::ImagePositions,
17        layout::{
18            symbol_feature::SymbolGeometryTileFeature,
19            symbol_instance::SymbolInstance,
20            symbol_layout::{LayerProperties, SortKeyRange},
21        },
22        style_types::{
23            PropertyValue, SymbolLayoutProperties_PossiblyEvaluated, TextWritingModeType,
24        },
25        CanonicalTileID, TileSpace,
26    },
27    render::view_state::ViewState,
28};
29
30/// maplibre/maplibre-native#4add9ea original name: PatternDependency
31struct PatternDependency;
32
33/// maplibre/maplibre-native#4add9ea original name: SymbolVertex
34#[derive(Clone, Debug)]
35pub struct SymbolVertex {
36    pub label_anchor: Point2D<f64, TileSpace>,
37    pub o: Point2D<f64, TileSpace>,
38    pub glyph_offset_y: f64,
39    pub tx: u16,
40    pub ty: u16,
41    pub size_data: Range<f64>,
42    pub is_sdf: bool,
43    pub pixel_offset: Point2D<f64, TileSpace>,
44    pub min_font_scale: Point2D<f64, TileSpace>,
45}
46
47impl SymbolVertex {
48    /// maplibre/maplibre-native#4add9ea original name: new
49    pub fn new(
50        label_anchor: Point2D<f64, TileSpace>,
51        o: Point2D<f64, TileSpace>,
52        glyph_offset_y: f64,
53        tx: u16,
54        ty: u16,
55        size_data: Range<f64>,
56        is_sdf: bool,
57        pixel_offset: Point2D<f64, TileSpace>,
58        min_font_scale: Point2D<f64, TileSpace>,
59    ) -> SymbolVertex {
60        Self {
61            label_anchor,
62            o,
63            glyph_offset_y,
64            tx,
65            ty,
66            size_data,
67            is_sdf,
68            pixel_offset,
69            min_font_scale,
70        }
71    }
72}
73
74/// maplibre/maplibre-native#4add9ea original name: DynamicVertex
75#[derive(Copy, Clone, Debug)]
76pub struct DynamicVertex {
77    anchor_point: Point2D<f64, TileSpace>,
78    label_angle: f64,
79}
80/// maplibre/maplibre-native#4add9ea original name: OpacityVertex
81#[derive(Copy, Clone, Debug)]
82pub struct OpacityVertex {
83    placed: bool,
84    opacity: f64,
85}
86
87impl DynamicVertex {
88    /// maplibre/maplibre-native#4add9ea original name: new
89    pub fn new(anchor_point: Point2D<f64, TileSpace>, label_angle: f64) -> Self {
90        Self {
91            anchor_point,
92            label_angle,
93        }
94    }
95}
96
97impl OpacityVertex {
98    /// maplibre/maplibre-native#4add9ea original name: new
99    pub fn new(placed: bool, opacity: f64) -> Self {
100        Self { placed, opacity }
101    }
102}
103
104/// maplibre/maplibre-native#4add9ea original name: VertexVector
105pub type VertexVector = Vec<SymbolVertex>;
106/// maplibre/maplibre-native#4add9ea original name: DynamicVertexVector
107pub type DynamicVertexVector = Vec<DynamicVertex>;
108/// maplibre/maplibre-native#4add9ea original name: OpacityVertexVector
109pub type OpacityVertexVector = Vec<OpacityVertex>;
110/// maplibre/maplibre-native#4add9ea original name: SymbolTextAttributes
111#[derive(Default, Clone, Debug)]
112pub struct SymbolTextAttributes;
113/// maplibre/maplibre-native#4add9ea original name: SymbolSizeBinder
114#[derive(Default, Clone, Debug)]
115pub struct SymbolSizeBinder;
116
117impl SymbolSizeBinder {
118    /// maplibre/maplibre-native#4add9ea original name: getVertexSizeData
119    pub fn get_vertex_size_data(&self, feature: &SymbolGeometryTileFeature) -> Range<f64> {
120        // TODO ConstantSymbolSizeBinder
121        0.0..0.0
122    }
123}
124
125/// maplibre/maplibre-native#4add9ea original name: FeatureSortOrder
126#[derive(Default, Clone, Debug)]
127struct FeatureSortOrder;
128/// maplibre/maplibre-native#4add9ea original name: TriangleIndexVector
129#[derive(Default, Clone, Debug)]
130pub struct TriangleIndexVector {
131    pub indices: Vec<u16>,
132}
133impl TriangleIndexVector {
134    /// maplibre/maplibre-native#4add9ea original name: push
135    pub fn push(&mut self, a: u16, b: u16, c: u16) {
136        //todo!()
137        // put them flat into the buffer .len() should return the count of indices
138        self.indices.push(a);
139        self.indices.push(b);
140        self.indices.push(c);
141    }
142
143    /// maplibre/maplibre-native#4add9ea original name: len
144    pub fn len(&self) -> usize {
145        //  todo!()
146        // put them flat into the buffer .len() should return the count of indices
147        self.indices.len()
148    }
149}
150/// maplibre/maplibre-native#4add9ea original name: UploadPass
151pub struct UploadPass;
152/// maplibre/maplibre-native#4add9ea original name: SymbolInstanceReferences
153pub struct SymbolInstanceReferences;
154/// maplibre/maplibre-native#4add9ea original name: RenderLayer
155pub struct RenderLayer;
156/// maplibre/maplibre-native#4add9ea original name: CrossTileSymbolLayerIndex
157pub struct CrossTileSymbolLayerIndex;
158/// maplibre/maplibre-native#4add9ea original name: BucketPlacementData
159pub struct BucketPlacementData;
160/// maplibre/maplibre-native#4add9ea original name: Placement
161pub struct Placement;
162/// maplibre/maplibre-native#4add9ea original name: TransformState
163pub type TransformState = ViewState;
164/// maplibre/maplibre-native#4add9ea original name: RenderTile
165pub struct RenderTile;
166
167/// maplibre/maplibre-native#4add9ea original name: Segment
168#[derive(Copy, Clone, Debug)]
169pub struct Segment<T> {
170    pub vertex_offset: usize,
171    pub index_offset: usize,
172    pub vertex_length: usize,
173    pub index_length: usize,
174
175    // One DrawScope per layer ID. This minimizes rebinding in cases where
176    // several layers share buckets but have different sets of active
177    // attributes. This can happen:
178    //   * when two layers have the same layout properties, but differing
179    //     data-driven paint properties
180    //   * when two fill layers have the same layout properties, but one
181    //     uses fill-color and the other uses fill-pattern
182    // TODO drawScopes:  BTreeMap<String, gfx::DrawScope>
183    pub sort_key: f64,
184
185    pub _phandom_data: PhantomData<T>,
186}
187
188/// maplibre/maplibre-native#4add9ea original name: PlacedSymbol
189#[derive(Default, Clone, Debug)]
190pub struct PlacedSymbol {
191    pub anchor_point: Point2D<f64, TileSpace>,
192    pub segment: usize,
193    pub lower_size: f64,
194    pub upper_size: f64,
195    pub line_offset: [f64; 2],
196    pub writing_modes: WritingModeType,
197    pub line: GeometryCoordinates,
198    pub tile_distances: Vec<f64>,
199    pub glyph_offsets: Vec<f64>,
200    pub hidden: bool,
201    pub vertex_start_index: usize,
202    /// The crossTileID is only filled/used on the foreground for variable text anchors
203    pub cross_tile_id: u32,
204    /// The placedOrientation is only used when symbol layer's property is set to
205    /// support placement for orientation variants.
206    pub placed_orientation: Option<TextWritingModeType>,
207    pub angle: f64,
208    /// Reference to placed icon, only applicable for text symbols.
209    pub placed_icon_index: Option<usize>,
210}
211
212/// maplibre/maplibre-native#4add9ea original name: PatternLayerMap
213type PatternLayerMap = HashMap<String, PatternDependency>;
214
215/// maplibre/maplibre-native#4add9ea original name: SegmentVector
216type SegmentVector<T> = Vec<Segment<T>>;
217
218/// maplibre/maplibre-native#4add9ea original name: SymbolBucketBuffer
219#[derive(Default, Clone, Debug)]
220pub struct SymbolBucketBuffer {
221    pub shared_vertices: VertexVector,
222    pub shared_dynamic_vertices: DynamicVertexVector,
223    pub shared_opacity_vertices: OpacityVertexVector,
224
225    /// maplibre/maplibre-native#4add9ea original name: TriangleIndexVector
226    // type TriangleIndexVector = gfx::IndexVector<gfx::Triangles>,
227    pub shared_triangles: TriangleIndexVector,
228    pub triangles: TriangleIndexVector,
229    //TODO triangles: &TriangleIndexVector = *sharedTriangles,
230    pub segments: SegmentVector<SymbolTextAttributes>,
231    pub placed_symbols: Vec<PlacedSymbol>,
232    //    #if MLN_LEGACY_RENDERER
233    //            std::optional<VertexBuffer> vertexBuffer,
234    //            std::optional<DynamicVertexBuffer> dynamicVertexBuffer,
235    //            std::optional<OpacityVertexBuffer> opacityVertexBuffer,
236    //            std::optional<gfx::IndexBuffer> indexBuffer,
237    //    #endif // MLN_LEGACY_RENDERER
238}
239
240/// maplibre/maplibre-native#4add9ea original name: PaintProperties
241#[derive(Clone, Debug)]
242pub struct PaintProperties {
243    //    iconBinders: SymbolIconProgram::Binders,
244    //    textBinders:  SymbolSDFTextProgram::Binders,
245}
246
247/// maplibre/maplibre-native#4add9ea original name: CollisionBuffer
248//struct CollisionBuffer {
249//    Box<CollisionVertexVector> sharedVertices = std::make_shared::<CollisionVertexVector>(),
250//    CollisionVertexVector& vertices() { return *sharedVertices, }
251//    CollisionVertexVector& vertices()  { return *sharedVertices, }
252//
253//    Box<CollisionDynamicVertexVector> sharedDynamicVertices = std::make_shared::<CollisionDynamicVertexVector>(),
254//    CollisionDynamicVertexVector& dynamicVertices() { return *sharedDynamicVertices, }
255//    CollisionDynamicVertexVector& dynamicVertices()  { return *sharedDynamicVertices, }
256//
257//    SegmentVector<CollisionBoxProgram::AttributeList> segments,
258//
259//    #if MLN_LEGACY_RENDERER
260//    std::optional<gfx::VertexBuffer<gfx::Vertex<CollisionBoxLayoutAttributes>>> vertexBuffer,
261//    std::optional<gfx::VertexBuffer<gfx::Vertex<CollisionBoxDynamicAttributes>>> dynamicVertexBuffer,
262//    #endif // MLN_LEGACY_RENDERER
263//}
264
265/// maplibre/maplibre-native#4add9ea original name: CollisionBoxBuffer
266//struct CollisionBoxBuffer : public CollisionBuffer {
267/// maplibre/maplibre-native#4add9ea original name: LineIndexVector
268//    type LineIndexVector = gfx::IndexVector<gfx::Lines>,
269//    Box<LineIndexVector> sharedLines = std::make_shared::<LineIndexVector>(),
270//    LineIndexVector& lines = *sharedLines,
271//    #if MLN_LEGACY_RENDERER
272//    std::optional<gfx::IndexBuffer> indexBuffer,
273//    #endif // MLN_LEGACY_RENDERER
274//}
275/// maplibre/maplibre-native#4add9ea original name: CollisionCircleBuffer
276//struct CollisionCircleBuffer : public CollisionBuffer {
277/// maplibre/maplibre-native#4add9ea original name: TriangleIndexVector
278//    //type TriangleIndexVector = gfx::IndexVector<gfx::Triangles>,
279//    Box<TriangleIndexVector> sharedTriangles = std::make_shared::<TriangleIndexVector>(),
280//    TriangleIndexVector& triangles = *sharedTriangles,
281//    #if MLN_LEGACY_RENDERER
282//            std::optional<gfx::IndexBuffer> indexBuffer,
283//    #endif // MLN_LEGACY_RENDERER
284//}
285
286/// maplibre/maplibre-native#4add9ea original name: SymbolBucket
287#[derive(Clone, Debug)]
288pub struct SymbolBucket {
289    layout: SymbolLayoutProperties_PossiblyEvaluated,
290    bucket_leader_id: String,
291    sorted_angle: f64,
292
293    // Flags
294    // TODO what are the initial values?
295    icons_need_linear: bool,
296    sort_features_by_y: bool,
297    static_uploaded: bool,
298    placement_changes_uploaded: bool,
299    dynamic_uploaded: bool,
300    sort_uploaded: bool,
301    icons_in_text: bool,
302    // Set and used by placement.
303    pub just_reloaded: bool,
304    has_variable_placement: bool,
305    has_uninitialized_symbols: bool,
306
307    //pub symbolInstances: Vec<SymbolInstance>,
308    pub sort_key_ranges: Vec<SortKeyRange>,
309
310    pub paint_properties: HashMap<String, PaintProperties>,
311
312    pub text_size_binder: Box<SymbolSizeBinder>,
313    /// maplibre/maplibre-native#4add9ea original name: VertexVector
314    //type VertexVector = gfx::VertexVector<SymbolLayoutVertex>,
315    /// maplibre/maplibre-native#4add9ea original name: VertexBuffer
316    //type VertexBuffer = gfx::VertexBuffer<SymbolLayoutVertex>,
317    /// maplibre/maplibre-native#4add9ea original name: DynamicVertexVector
318    //type DynamicVertexVector = gfx::VertexVector<gfx::Vertex<SymbolDynamicLayoutAttributes>>,
319    /// maplibre/maplibre-native#4add9ea original name: DynamicVertexBuffer
320    //type DynamicVertexBuffer = gfx::VertexBuffer<gfx::Vertex<SymbolDynamicLayoutAttributes>>,
321    /// maplibre/maplibre-native#4add9ea original name: OpacityVertexVector
322    //type OpacityVertexVector = gfx::VertexVector<gfx::Vertex<SymbolOpacityAttributes>>,
323    /// maplibre/maplibre-native#4add9ea original name: OpacityVertexBuffer
324    //type OpacityVertexBuffer = gfx::VertexBuffer<gfx::Vertex<SymbolOpacityAttributes>>,
325    pub text: SymbolBucketBuffer,
326
327    pub icon_size_binder: Box<SymbolSizeBinder>,
328    pub icon: SymbolBucketBuffer,
329    pub sdf_icon: SymbolBucketBuffer,
330
331    /// maplibre/maplibre-native#4add9ea original name: CollisionVertexVector
332    //type CollisionVertexVector = gfx::VertexVector<gfx::Vertex<CollisionBoxLayoutAttributes>>,
333    /// maplibre/maplibre-native#4add9ea original name: CollisionDynamicVertexVector
334    //type CollisionDynamicVertexVector = gfx::VertexVector<gfx::Vertex<CollisionBoxDynamicAttributes>>,
335
336    // iconCollisionBox: Box<CollisionBoxBuffer>,
337    // textCollisionBox:   Box<CollisionBoxBuffer>,
338    // iconCollisionCircle:  Box<CollisionCircleBuffer>,
339    // textCollisionCircle: Box<CollisionCircleBuffer> ,
340    tile_pixel_ratio: f64,
341    bucket_instance_id: u32,
342    allow_vertical_placement: bool,
343    placement_modes: Vec<TextWritingModeType>,
344    has_format_section_overrides: Option<bool>,
345
346    feature_sort_order: FeatureSortOrder,
347
348    uploaded: bool,
349}
350
351static MAX_BUCKET_INSTANCE_ID: u32 = 0;
352
353impl SymbolBucket {
354    /// maplibre/maplibre-native#4add9ea original name: new
355    pub fn new(
356        layout_: SymbolLayoutProperties_PossiblyEvaluated,
357        paint_properties: &BTreeMap<String, LayerProperties>,
358        text_size: &PropertyValue<f64>,
359        icon_size: &PropertyValue<f64>,
360        zoom: f64,
361        icons_need_linear: bool,
362        sort_features_by_y: bool,
363        bucket_name: String,
364        symbol_instances: Vec<SymbolInstance>,
365        sort_key_ranges: Vec<SortKeyRange>,
366        tile_pixel_ratio: f64,
367        allow_vertical_placement: bool,
368        placement_modes: Vec<TextWritingModeType>,
369        icons_in_text: bool,
370    ) -> Self {
371        // TODO MAX_BUCKET_INSTANCE_ID += 1;
372
373        // TODO
374        // for pair in paintProperties_ {
375        //      let evaluated = getEvaluated::<SymbolLayerProperties>(pair.second);
376        //     self_.paintProperties.emplace(
377        //         std::piecewise_ruct,
378        //         std::forward_as_tuple(pair.first),
379        //         std::forward_as_tuple(PaintProperties{{RenderSymbolLayer::iconPaintProperties(evaluated), zoom},
380        //                                               {RenderSymbolLayer::textPaintProperties(evaluated), zoom}}));
381        // }
382        Self {
383            layout: layout_,
384            bucket_leader_id: bucket_name,
385            sorted_angle: f64::MAX,
386            icons_need_linear: icons_need_linear
387                || icon_size.is_data_driven()
388                || !icon_size.is_zoomant(),
389            sort_features_by_y,
390            static_uploaded: false,
391            placement_changes_uploaded: false,
392            dynamic_uploaded: false,
393            sort_uploaded: false,
394            icons_in_text: false,
395            just_reloaded: false,
396            has_variable_placement: false,
397            has_uninitialized_symbols: false,
398            // TODO symbolInstances: symbolInstances_,
399            sort_key_ranges,
400            paint_properties: Default::default(),
401            text_size_binder: Default::default(),
402            // TODO textSizeBinder: SymbolSizeBinder::create(zoom, textSize, TextSize::defaultValue()),
403            text: SymbolBucketBuffer::default(),
404            icon_size_binder: Default::default(),
405            // TODO iconSizeBinder: SymbolSizeBinder::create(zoom, iconSize, IconSize::defaultValue()),
406            icon: SymbolBucketBuffer::default(),
407            sdf_icon: SymbolBucketBuffer::default(),
408            tile_pixel_ratio,
409            bucket_instance_id: MAX_BUCKET_INSTANCE_ID,
410            allow_vertical_placement,
411            placement_modes,
412            has_format_section_overrides: None,
413            feature_sort_order: FeatureSortOrder,
414            uploaded: false,
415        }
416    }
417
418    // As long as this bucket has a Prepare render pass, this function is
419    // getting called. Typically, this only happens once when the bucket is
420    // being rendered for the first time.
421    /// maplibre/maplibre-native#4add9ea original name: upload
422    pub fn upload(&self, pass: &UploadPass) {
423        todo!()
424    }
425    /// maplibre/maplibre-native#4add9ea original name: hasData
426    pub fn has_data(&self) -> bool {
427        // todo!()
428        true
429    }
430
431    /// maplibre/maplibre-native#4add9ea original name: hasTextData
432    pub fn has_text_data(&self) -> bool {
433        todo!()
434    }
435    /// maplibre/maplibre-native#4add9ea original name: has_icon_data
436    pub fn has_icon_data(&self) -> bool {
437        todo!()
438    }
439    /// maplibre/maplibre-native#4add9ea original name: hasSdfIconData
440    pub fn has_sdf_icon_data(&self) -> bool {
441        todo!()
442    }
443    /// maplibre/maplibre-native#4add9ea original name: hasIconCollisionBoxData
444    pub fn has_icon_collision_box_data(&self) -> bool {
445        todo!()
446    }
447    /// maplibre/maplibre-native#4add9ea original name: hasIconCollisionCircleData
448    pub fn has_icon_collision_circle_data(&self) -> bool {
449        todo!()
450    }
451    /// maplibre/maplibre-native#4add9ea original name: hasTextCollisionBoxData
452    pub fn has_text_collision_box_data(&self) -> bool {
453        todo!()
454    }
455    /// maplibre/maplibre-native#4add9ea original name: hasTextCollisionCircleData
456    pub fn has_text_collision_circle_data(&self) -> bool {
457        todo!()
458    }
459    /// maplibre/maplibre-native#4add9ea original name: hasFormatSectionOverrides
460    pub fn has_format_section_overrides(&self) -> bool {
461        //  todo!()
462        false
463    }
464
465    /// maplibre/maplibre-native#4add9ea original name: sortFeatures
466    pub fn sort_features(&self, angle: f64) {
467        todo!()
468    }
469    // Returns references to the `symbolInstances` items, sorted by viewport Y.
470    /// maplibre/maplibre-native#4add9ea original name: getSortedSymbols
471    pub fn get_sorted_symbols(&self, angle: f64) -> SymbolInstanceReferences {
472        todo!()
473    }
474    // Returns references to the `symbolInstances` items, which belong to the
475    // `sortKeyRange` range, returns references to all the symbols if
476    // |sortKeyRange| is `std::nullopt`.
477    /// maplibre/maplibre-native#4add9ea original name: getSymbols
478    pub fn get_symbols(&self, sort_key_range: &Option<SortKeyRange>) -> SymbolInstanceReferences {
479        todo!()
480    }
481
482    /// maplibre/maplibre-native#4add9ea original name: getOrCreateIconCollisionBox
483    //    pub fn getOrCreateIconCollisionBox(&self,) -> &CollisionBoxBuffer{
484    //        if (!self.iconCollisionBox) {
485    //            self.iconCollisionBox = std::make_unique<CollisionBoxBuffer>()
486    //        }
487    //        return *self.iconCollisionBox
488    //    }
489    /// maplibre/maplibre-native#4add9ea original name: getOrCreateTextCollisionBox
490    //    pub fn getOrCreateTextCollisionBox(&self,) -> &CollisionBoxBuffer{
491    //        if (!self.textCollisionBox) {
492    //            self.textCollisionBox = std::make_unique<CollisionBoxBuffer>()
493    //        }
494    //        return *self.textCollisionBox
495    //    }
496    /// maplibre/maplibre-native#4add9ea original name:    getOrCreateIconCollisionCircleBuffer
497    //    pub fn    getOrCreateIconCollisionCircleBuffer(&self,)  -> &CollisionCircleBuffer{
498    //        if (!self.iconCollisionCircle) {
499    //            self.iconCollisionCircle = std::make_unique<CollisionCircleBuffer>()
500    //        }
501    //        return *self.iconCollisionCircle
502    //    }
503    /// maplibre/maplibre-native#4add9ea original name:  getOrCreateTextCollisionCircleBuffer
504    //    pub fn  getOrCreateTextCollisionCircleBuffer(&self,) -> &CollisionCircleBuffer {
505    //        if (!self.textCollisionCircle) {
506    //            self.textCollisionCircle = std::make_unique<CollisionCircleBuffer>(),
507    //        }
508    //        return *self.textCollisionCircle
509    //    }
510
511    /// maplibre/maplibre-native#4add9ea original name: getQueryRadius
512    pub fn get_query_radius(&self, layer: RenderLayer) -> f64 {
513        0.
514    }
515
516    /// maplibre/maplibre-native#4add9ea original name: needsUpload
517    pub fn needs_upload(&self) -> bool {
518        self.has_data() && !self.uploaded
519    }
520
521    // Feature geometries are also used to populate the feature index.
522    // Obtaining these is a costly operation, so we do it only once, and
523    // pass-by--ref the geometries as a second parameter.
524    /// maplibre/maplibre-native#4add9ea original name: addFeature
525    pub fn add_feature(
526        &self,
527        geometry_tile_fature: &SymbolGeometryTileFeature,
528        geometry_collection: &GeometryCollection,
529        image_positions: &ImagePositions,
530        patter_layer_map: &PatternLayerMap,
531        value: usize,
532        canonical: &CanonicalTileID,
533    ) {
534    }
535
536    // The following methods are implemented by buckets that require cross-tile indexing and placement.
537
538    // Returns a pair, the first element of which is a bucket cross-tile id
539    // on success call, `0` otherwise. The second element is `true` if
540    // the bucket was originally registered, `false` otherwise.
541    /// maplibre/maplibre-native#4add9ea original name: registerAtCrossTileIndex
542    pub fn register_at_cross_tile_index(
543        &self,
544        cross_tile_index: &CrossTileSymbolLayerIndex,
545        render_tile: &RenderTile,
546    ) -> (u32, bool) {
547        todo!()
548    }
549    // Places this bucket to the given placement.
550    /// maplibre/maplibre-native#4add9ea original name: place
551    pub fn place(
552        &self,
553        placement: &Placement,
554        bucket_placement_data: &BucketPlacementData,
555        values: &BTreeSet<u32>,
556    ) {
557        todo!()
558    }
559    /// maplibre/maplibre-native#4add9ea original name: updateVertices
560    pub fn update_vertices(
561        placement: &Placement,
562        update_opacities: bool,
563        transform_state: &TransformState,
564        render_tile: &RenderTile,
565        values: &BTreeSet<u32>,
566    ) {
567        todo!()
568    }
569}