#ifndef MBGL_RENDERER_SYMBOLBUCKET #define MBGL_RENDERER_SYMBOLBUCKET #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace mbgl { class SDFShader; class IconShader; class CollisionBoxShader; class DotShader; class CollisionTile; class SpriteAtlas; class SpriteStore; class GlyphAtlas; class GlyphStore; class SymbolFeature { public: std::vector> geometry; std::u32string label; std::string sprite; }; struct Anchor; class SymbolInstance { public: explicit SymbolInstance(Anchor& anchor, const std::vector& line, const Shaping& shapedText, const PositionedIcon& shapedIcon, const SymbolLayoutProperties& layout, const bool inside, const uint32_t index, const float textBoxScale, const float textPadding, const float textAlongLine, const float iconBoxScale, const float iconPadding, const float iconAlongLine, const GlyphPositions& face); float x; float y; uint32_t index; bool hasText; bool hasIcon; SymbolQuads glyphQuads; SymbolQuads iconQuads; CollisionFeature textCollisionFeature; CollisionFeature iconCollisionFeature; }; class SymbolBucket : public Bucket { typedef ElementGroup<1> TextElementGroup; typedef ElementGroup<2> IconElementGroup; typedef ElementGroup<1> CollisionBoxElementGroup; public: SymbolBucket(float overscaling, float zoom, const MapMode); ~SymbolBucket() override; void upload() override; void render(Painter&, const StyleLayer&, const TileID&, const mat4&) override; bool hasData() const override; bool hasTextData() const; bool hasIconData() const; bool hasCollisionBoxData() const; void addFeatures(uintptr_t tileUID, SpriteAtlas&, GlyphAtlas&, GlyphStore&); void drawGlyphs(SDFShader& shader); void drawIcons(SDFShader& shader); void drawIcons(IconShader& shader); void drawCollisionBoxes(CollisionBoxShader& shader); void parseFeatures(const GeometryTileLayer&, const FilterExpression&); bool needsDependencies(GlyphStore&, SpriteStore&); void placeFeatures(CollisionTile&) override; private: void addFeature(const std::vector> &lines, const Shaping &shapedText, const PositionedIcon &shapedIcon, const GlyphPositions &face); bool anchorIsTooClose(const std::u32string &text, const float repeatDistance, Anchor &anchor); std::map> compareText; void addToDebugBuffers(CollisionTile &collisionTile); void swapRenderData() override; // Adds placed items to the buffer. template void addSymbols(Buffer &buffer, const SymbolQuads &symbols, float scale, const bool keepUpright, const bool alongLine, const float placementAngle); public: SymbolLayoutProperties layout; bool sdfIcons = false; bool iconsNeedLinear = false; private: const float overscaling; const float zoom; const float tileSize; const float tilePixelRatio; const MapMode mode; std::set ranges; std::vector symbolInstances; std::vector features; struct SymbolRenderData { struct TextBuffer { TextVertexBuffer vertices; TriangleElementsBuffer triangles; std::vector> groups; } text; struct IconBuffer { IconVertexBuffer vertices; TriangleElementsBuffer triangles; std::vector> groups; } icon; struct CollisionBoxBuffer { CollisionBoxVertexBuffer vertices; std::vector> groups; } collisionBox; }; std::unique_ptr renderData; std::unique_ptr renderDataInProgress; }; } // namespace mbgl #endif