diff options
-rw-r--r-- | gyp/platform-ios.gypi | 1 | ||||
-rw-r--r-- | include/mbgl/ios/MGLMapView+MGLCustomStyleLayerAdditions.h | 22 | ||||
-rw-r--r-- | include/mbgl/ios/Mapbox.h | 1 | ||||
-rw-r--r-- | ios/app/MBXViewController.mm | 59 | ||||
-rw-r--r-- | platform/ios/MGLMapView.mm | 66 |
5 files changed, 149 insertions, 0 deletions
diff --git a/gyp/platform-ios.gypi b/gyp/platform-ios.gypi index d510d25c03..22a44dd31a 100644 --- a/gyp/platform-ios.gypi +++ b/gyp/platform-ios.gypi @@ -50,6 +50,7 @@ '../platform/ios/MGLMapboxEvents.m', '../include/mbgl/ios/MGLMapView.h', '../include/mbgl/ios/MGLMapView+IBAdditions.h', + '../include/mbgl/ios/MGLMapView+MGLCustomStyleLayerAdditions.h', '../platform/ios/MGLMapView.mm', '../include/mbgl/ios/MGLAccountManager.h', '../platform/ios/MGLAccountManager_Private.h', diff --git a/include/mbgl/ios/MGLMapView+MGLCustomStyleLayerAdditions.h b/include/mbgl/ios/MGLMapView+MGLCustomStyleLayerAdditions.h new file mode 100644 index 0000000000..4785a36cfa --- /dev/null +++ b/include/mbgl/ios/MGLMapView+MGLCustomStyleLayerAdditions.h @@ -0,0 +1,22 @@ +#import "MGLMapView.h" + +NS_ASSUME_NONNULL_BEGIN + +typedef void (^MGLCustomStyleLayerPreparationHandler)(void); + +typedef void (^MGLCustomStyleLayerDrawingHandler)(CGSize size, + CLLocationCoordinate2D centerCoordinate, + double zoomLevel, + CLLocationDirection direction, + CGFloat pitch, + CGFloat perspectiveSkew); + +typedef void (^MGLCustomStyleLayerCompletionHandler)(void); + +@interface MGLMapView (MGLCustomStyleLayerAdditions) + +- (void)insertCustomStyleLayerWithIdentifier:(NSString *)identifier preparationHandler:(MGLCustomStyleLayerPreparationHandler)preparation drawingHandler:(MGLCustomStyleLayerDrawingHandler)drawing completionHandler:(MGLCustomStyleLayerCompletionHandler)completion belowStyleLayerWithIdentifier:(nullable NSString *)otherIdentifier; + +@end + +NS_ASSUME_NONNULL_END diff --git a/include/mbgl/ios/Mapbox.h b/include/mbgl/ios/Mapbox.h index 004839059f..e8b3ead1d9 100644 --- a/include/mbgl/ios/Mapbox.h +++ b/include/mbgl/ios/Mapbox.h @@ -5,6 +5,7 @@ #import "MGLGeometry.h" #import "MGLMapView.h" #import "MGLMapView+IBAdditions.h" +#import "MGLMapView+MGLCustomStyleLayerAdditions.h" #import "MGLMultiPoint.h" #import "MGLOverlay.h" #import "MGLPointAnnotation.h" diff --git a/ios/app/MBXViewController.mm b/ios/app/MBXViewController.mm index 7e19382f9a..d5ef815351 100644 --- a/ios/app/MBXViewController.mm +++ b/ios/app/MBXViewController.mm @@ -4,6 +4,7 @@ #import <mbgl/util/default_styles.hpp> #import <CoreLocation/CoreLocation.h> +#import <OpenGLES/ES2/gl.h> static UIColor *const kTintColor = [UIColor colorWithRed:0.120 green:0.550 blue:0.670 alpha:1.000]; @@ -150,6 +151,7 @@ static const CLLocationCoordinate2D WorldTourDestinations[] = { @"Add Test Shapes", @"Start World Tour", @"Remove Annotations", + @"Insert Custom Style Layer", nil]; [sheet showFromBarButtonItem:self.navigationItem.leftBarButtonItem animated:YES]; @@ -260,6 +262,10 @@ static const CLLocationCoordinate2D WorldTourDestinations[] = { { [self.mapView removeAnnotations:self.mapView.annotations]; } + else if (buttonIndex == actionSheet.firstOtherButtonIndex + 9) + { + [self insertCustomStyleLayer]; + } } - (void)parseFeaturesAddingCount:(NSUInteger)featuresCount @@ -302,6 +308,59 @@ static const CLLocationCoordinate2D WorldTourDestinations[] = { }); } +- (void)insertCustomStyleLayer +{ + static const GLchar *vertexShaderSource = "attribute vec2 a_pos; void main() { gl_Position = vec4(a_pos, 0, 1); }"; + static const GLchar *fragmentShaderSource = "void main() { gl_FragColor = vec4(0, 1, 0, 1); }"; + + __block GLuint program = 0; + __block GLuint vertexShader = 0; + __block GLuint fragmentShader = 0; + __block GLuint buffer = 0; + __block GLuint a_pos = 0; + [self.mapView insertCustomStyleLayerWithIdentifier:@"mbx-custom" preparationHandler:^{ + program = glCreateProgram(); + vertexShader = glCreateShader(GL_VERTEX_SHADER); + fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); + + glShaderSource(vertexShader, 1, &vertexShaderSource, nullptr); + glCompileShader(vertexShader); + glAttachShader(program, vertexShader); + glShaderSource(fragmentShader, 1, &fragmentShaderSource, nullptr); + glCompileShader(fragmentShader); + glAttachShader(program, fragmentShader); + glLinkProgram(program); + a_pos = glGetAttribLocation(program, "a_pos"); + + GLfloat background[] = { -1,-1, 1,-1, -1,1, 1,1 }; + glGenBuffers(1, &buffer); + glBindBuffer(GL_ARRAY_BUFFER, buffer); + glBufferData(GL_ARRAY_BUFFER, 8 * sizeof(GLfloat), background, GL_STATIC_DRAW); + } drawingHandler:^(__unused CGSize size, + __unused CLLocationCoordinate2D centerCoordinate, + __unused double zoomLevel, + __unused CLLocationDirection direction, + __unused CGFloat pitch, + __unused CGFloat perspectiveSkew) { + glUseProgram(program); + glBindBuffer(GL_ARRAY_BUFFER, buffer); + glEnableVertexAttribArray(a_pos); + glVertexAttribPointer(a_pos, 2, GL_FLOAT, GL_FALSE, 0, NULL); + glDisable(GL_STENCIL_TEST); + glDisable(GL_DEPTH_TEST); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + } completionHandler:^{ + if (program) { + glDeleteBuffers(1, &buffer); + glDetachShader(program, vertexShader); + glDetachShader(program, fragmentShader); + glDeleteShader(vertexShader); + glDeleteShader(fragmentShader); + glDeleteProgram(program); + } + } belowStyleLayerWithIdentifier:@"housenum-label"]; +} + - (void)handleLongPress:(UILongPressGestureRecognizer *)longPress { if (longPress.state == UIGestureRecognizerStateBegan) diff --git a/platform/ios/MGLMapView.mm b/platform/ios/MGLMapView.mm index 5d944e81fe..e9657f5616 100644 --- a/platform/ios/MGLMapView.mm +++ b/platform/ios/MGLMapView.mm @@ -1,5 +1,6 @@ #import "MGLMapView.h" #import "MGLMapView+IBAdditions.h" +#import "MGLMapView+MGLCustomStyleLayerAdditions.h" #import <mbgl/platform/log.hpp> #import <mbgl/platform/gl.hpp> @@ -3472,6 +3473,8 @@ class MBGLView : public mbgl::View @end +#pragma mark - IBAdditions methods + @implementation MGLMapView (IBAdditions) + (NS_SET_OF(NSString *) *)keyPathsForValuesAffectingStyleURL__ @@ -3610,3 +3613,66 @@ class MBGLView : public mbgl::View } @end + +#pragma mark - MGLCustomStyleLayerAdditions methods + +class MGLCustomStyleLayerHandlers +{ +public: + MGLCustomStyleLayerHandlers(MGLCustomStyleLayerPreparationHandler p, + MGLCustomStyleLayerDrawingHandler d, + MGLCustomStyleLayerCompletionHandler f) + : prepare(p), draw(d), finish(f) {} + + MGLCustomStyleLayerPreparationHandler prepare; + MGLCustomStyleLayerDrawingHandler draw; + MGLCustomStyleLayerCompletionHandler finish; +}; + +void MGLPrepareCustomStyleLayer(void *context) +{ + MGLCustomStyleLayerPreparationHandler prepare = reinterpret_cast<MGLCustomStyleLayerHandlers *>(context)->prepare; + if (prepare) + { + prepare(); + } +} + +void MGLDrawCustomStyleLayer(void *context, const mbgl::CustomLayerRenderParameters ¶ms) +{ + CGSize size = CGSizeMake(params.width, params.height); + CLLocationCoordinate2D centerCoordinate = CLLocationCoordinate2DMake(params.latitude, params.longitude); + double zoomLevel = params.zoom; + CLLocationDirection direction = mbgl::util::wrap(params.bearing, 0., 360.); + CGFloat pitch = params.pitch; + CGFloat perspectiveSkew = params.altitude; + MGLCustomStyleLayerDrawingHandler draw = reinterpret_cast<MGLCustomStyleLayerHandlers *>(context)->draw; + if (draw) + { + draw(size, centerCoordinate, zoomLevel, direction, pitch, perspectiveSkew); + } +} + +void MGLFinishCustomStyleLayer(void *context) +{ + MGLCustomStyleLayerHandlers *handlers = reinterpret_cast<MGLCustomStyleLayerHandlers *>(context); + MGLCustomStyleLayerCompletionHandler finish = handlers->finish; + if (finish) + { + finish(); + } + delete handlers; +} + +@implementation MGLMapView (MGLCustomStyleLayerAdditions) + +- (void)insertCustomStyleLayerWithIdentifier:(NSString *)identifier preparationHandler:(void (^)())preparation drawingHandler:(MGLCustomStyleLayerDrawingHandler)drawing completionHandler:(void (^)())completion belowStyleLayerWithIdentifier:(nullable NSString *)otherIdentifier +{ + NSAssert(identifier, @"Style layer needs an identifier"); + MGLCustomStyleLayerHandlers *context = new MGLCustomStyleLayerHandlers(preparation, drawing, completion); + _mbglMap->addCustomLayer(identifier.UTF8String, MGLPrepareCustomStyleLayer, + MGLDrawCustomStyleLayer, MGLFinishCustomStyleLayer, + context, otherIdentifier.UTF8String); +} + +@end |