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}