#pragma once #include #include #include #include #include #include #include #include #include #include #include #include namespace mbgl { class CrossTileSymbolLayerIndex; class PlacedSymbol { public: PlacedSymbol(Point anchorPoint_, std::size_t segment_, float lowerSize_, float upperSize_, std::array lineOffset_, WritingModeType writingModes_, GeometryCoordinates line_, std::vector tileDistances_, optional placedIconIndex_ = nullopt) : anchorPoint(anchorPoint_), segment(segment_), lowerSize(lowerSize_), upperSize(upperSize_), lineOffset(lineOffset_), writingModes(writingModes_), line(std::move(line_)), tileDistances(std::move(tileDistances_)), hidden(false), vertexStartIndex(0), placedIconIndex(std::move(placedIconIndex_)) {} Point anchorPoint; std::size_t segment; float lowerSize; float upperSize; std::array lineOffset; WritingModeType writingModes; GeometryCoordinates line; std::vector tileDistances; std::vector glyphOffsets; bool hidden; size_t vertexStartIndex; // The crossTileID is only filled/used on the foreground for variable text anchors uint32_t crossTileID = 0u; // The placedOrientation is only used when symbol layer's property is set to support // placement for orientation variants. optional placedOrientation; float angle = 0; // Reference to placed icon, only applicable for text symbols. optional placedIconIndex; }; class SymbolBucket final : public Bucket { public: SymbolBucket(Immutable, const std::map>&, const style::PropertyValue& textSize, const style::PropertyValue& iconSize, float zoom, bool iconsNeedLinear, bool sortFeaturesByY, const std::string bucketLeaderID, const std::vector&&, const float tilePixelRatio, bool allowVerticalPlacement, std::vector placementModes, bool iconsInText); ~SymbolBucket() override; void upload(gfx::UploadPass&) override; bool hasData() const override; std::pair registerAtCrossTileIndex(CrossTileSymbolLayerIndex&, const OverscaledTileID&, const TransformState& transformState) override; void place(Placement&, const BucketPlacementParameters&, std::set&) override; void updateVertices( const Placement&, bool updateOpacities, const TransformState&, const RenderTile&, std::set&) override; bool hasTextData() const; bool hasIconData() const; bool hasSdfIconData() const; bool hasIconCollisionBoxData() const; bool hasIconCollisionCircleData() const; bool hasTextCollisionBoxData() const; bool hasTextCollisionCircleData() const; bool hasFormatSectionOverrides() const; void sortFeatures(const float angle); // The result contains references to the `symbolInstances` items, sorted by viewport Y. std::vector> getSortedSymbols(const float angle) const; Immutable layout; const std::string bucketLeaderID; float sortedAngle = std::numeric_limits::max(); // Flags const bool iconsNeedLinear : 1; const bool sortFeaturesByY : 1; bool staticUploaded : 1; bool placementChangesUploaded : 1; bool dynamicUploaded : 1; bool sortUploaded : 1; bool iconsInText : 1; // Set and used by placement. mutable bool justReloaded : 1; bool hasVariablePlacement : 1; std::vector symbolInstances; struct PaintProperties { SymbolIconProgram::Binders iconBinders; SymbolSDFTextProgram::Binders textBinders; }; std::map paintProperties; std::unique_ptr textSizeBinder; struct Buffer { gfx::VertexVector vertices; gfx::VertexVector> dynamicVertices; gfx::VertexVector> opacityVertices; gfx::IndexVector triangles; SegmentVector segments; std::vector placedSymbols; optional> vertexBuffer; optional>> dynamicVertexBuffer; optional>> opacityVertexBuffer; optional indexBuffer; } text; std::unique_ptr iconSizeBinder; Buffer icon; Buffer sdfIcon; struct CollisionBuffer { gfx::VertexVector> vertices; gfx::VertexVector> dynamicVertices; SegmentVector segments; optional>> vertexBuffer; optional>> dynamicVertexBuffer; }; struct CollisionBoxBuffer : public CollisionBuffer { gfx::IndexVector lines; optional indexBuffer; }; std::unique_ptr iconCollisionBox; std::unique_ptr textCollisionBox; CollisionBoxBuffer& getOrCreateIconCollisionBox() { if (!iconCollisionBox) iconCollisionBox = std::make_unique(); return *iconCollisionBox; } CollisionBoxBuffer& getOrCreateTextCollisionBox() { if (!textCollisionBox) textCollisionBox = std::make_unique(); return *textCollisionBox; } struct CollisionCircleBuffer : public CollisionBuffer { gfx::IndexVector triangles; optional indexBuffer; }; std::unique_ptr iconCollisionCircle; std::unique_ptr textCollisionCircle; CollisionCircleBuffer& getOrCreateIconCollisionCircleBuffer() { if (!iconCollisionCircle) iconCollisionCircle = std::make_unique(); return *iconCollisionCircle; } CollisionCircleBuffer& getOrCreateTextCollisionCircleBuffer() { if (!textCollisionCircle) textCollisionCircle = std::make_unique(); return *textCollisionCircle; } const float tilePixelRatio; uint32_t bucketInstanceId; const bool allowVerticalPlacement; const std::vector placementModes; mutable optional hasFormatSectionOverrides_; FeatureSortOrder featureSortOrder; }; } // namespace mbgl