#import "ExampleCustomDrawableStyleLayer.h" #import "MLNStyleLayer.h" #import "MLNCustomDrawableStyleLayer.h" #include #include #include #include #include #include class ExampleCustomDrawableStyleLayerHost; @implementation ExampleCustomDrawableStyleLayer - (instancetype)initWithIdentifier:(NSString *)identifier { auto layer = std::make_unique(identifier.UTF8String, std::make_unique(self)); return self = [super initWithPendingLayer:std::move(layer)]; } @end class ExampleCustomDrawableStyleLayerHost : public mbgl::style::CustomDrawableLayerHost { public: ExampleCustomDrawableStyleLayerHost(ExampleCustomDrawableStyleLayer *styleLayer) { layerRef = styleLayer; layer = nil; } void initialize() override { if (layerRef == nil) return; else if (layer == nil) layer = layerRef; } void update(Interface& interface) override { // if we have built our drawable(s) already, either update or skip if (interface.getDrawableCount()) return; // set tile interface.setTileID({11, 327, 791}); constexpr float extent = mbgl::util::EXTENT; // add polylines { using namespace mbgl; constexpr auto numLines = 6; Interface::LineOptions options[numLines] { {/*color=*/Color::red(), /*blur=*/0.0f, /*opacity=*/1.0f, /*gapWidth=*/0.0f, /*offset=*/0.0f, /*width=*/8.0f, {} }, {/*color=*/Color::blue(), /*blur=*/4.0f, /*opacity=*/1.0f, /*gapWidth=*/2.0f, /*offset=*/-1.0f, /*width=*/4.0f, {} }, {/*color=*/Color(1.f, 0.5f, 0, 0.5f), /*blur=*/16.0f, /*opacity=*/1.0f, /*gapWidth=*/1.0f, /*offset=*/2.0f, /*width=*/16.0f, {} }, {/*color=*/Color(1.f, 1.f, 0, 0.3f), /*blur=*/2.0f, /*opacity=*/1.0f, /*gapWidth=*/1.0f, /*offset=*/-2.0f, /*width=*/2.0f, {} }, {/*color=*/Color::black(), /*blur=*/0.5f, /*opacity=*/0.5f, /*gapWidth=*/1.0f, /*offset=*/0.5f, /*width=*/0.5f, {} }, {/*color=*/Color(1.f, 0, 1.f, 0.2f), /*blur=*/24.0f, /*opacity=*/0.5f, /*gapWidth=*/1.0f, /*offset=*/-5.0f, /*width=*/24.0f, {} }, }; for(auto& opt: options) { opt.geometry.beginCap = style::LineCapType::Round; opt.geometry.endCap = style::LineCapType::Round; opt.geometry.joinType = style::LineJoinType::Round; } constexpr auto numPoints = 100; GeometryCoordinates polyline; for (auto ipoint{0}; ipoint < numPoints; ++ipoint) { polyline.emplace_back(ipoint * extent / numPoints, std::sin(ipoint * 2 * M_PI / numPoints) * extent / numLines / 2.f); } for (auto index {0}; index < numLines; ++index) { for(auto &p : polyline) { p.y += extent / numLines; } // set property values interface.setLineOptions(options[index]); // add polyline interface.addPolyline(polyline); } } // add fill polygon { using namespace mbgl; GeometryCollection geometry{ { // ring 1 {static_cast(extent* 0.1f), static_cast(extent* 0.2f)}, {static_cast(extent* 0.5f), static_cast(extent* 0.5f)}, {static_cast(extent* 0.7f), static_cast(extent* 0.5f)}, {static_cast(extent* 0.5f), static_cast(extent* 1.0f)}, {static_cast(extent* 0.0f), static_cast(extent* 0.5f)}, {static_cast(extent* 0.1f), static_cast(extent* 0.2f)}, }, { // ring 2 {static_cast(extent* 0.1f), static_cast(extent* 0.25f)}, {static_cast(extent* 0.15f), static_cast(extent* 0.5f)}, {static_cast(extent* 0.25f), static_cast(extent* 0.45f)}, {static_cast(extent* 0.1f), static_cast(extent* 0.25f)}, }, }; // set properties interface.setFillOptions({/*color=*/Color::green(), /*opacity=*/0.5f}); // add fill interface.addFill(geometry); } // finish interface.finish(); } void deinitialize() override { if (layer == nil) return; layerRef = layer; layer = nil; } private: __weak ExampleCustomDrawableStyleLayer * layerRef; ExampleCustomDrawableStyleLayer * layer = nil; };