From 8c3dde97a1da3e7722364f3010d9519268b4f8e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABtan=20Renaudeau?= Date: Mon, 28 Dec 2015 20:57:34 +0100 Subject: [PATCH] bugfix iOS version --- Examples/Simple/package.json | 4 +- ios/GLCanvas.m | 60 +++++++++++++++--------------- ios/GLImage.m | 4 +- ios/RNGL.xcodeproj/project.pbxproj | 2 +- 4 files changed, 37 insertions(+), 33 deletions(-) diff --git a/Examples/Simple/package.json b/Examples/Simple/package.json index 36c439e..91a0abe 100644 --- a/Examples/Simple/package.json +++ b/Examples/Simple/package.json @@ -7,8 +7,8 @@ }, "dependencies": { "gl-react-native": "file:../..", - "gl-react": "^2.0.2", + "gl-react": "^2.0.8", "react-native": "^0.17.0", - "react-native-material-kit": "^0.2.2" + "react-native-material-kit": "^0.2.4" } } diff --git a/ios/GLCanvas.m b/ios/GLCanvas.m index e96cdbe..5600ffa 100644 --- a/ios/GLCanvas.m +++ b/ios/GLCanvas.m @@ -104,7 +104,7 @@ RCT_NOT_IMPLEMENTED(-init) - (void)setRenderId:(NSNumber *)renderId { - if (_nbContentTextures > 0) { + if ([_nbContentTextures intValue] > 0) { [self setNeedsDisplay]; } } @@ -273,12 +273,17 @@ RCT_NOT_IMPLEMENTED(-init) GLRenderData *res = traverseTree(_data); if (res != nil) { + _needSync = false; _renderData = traverseTree(_data); _images = images; for (NSString *src in diff([prevImages allKeys], [images allKeys])) { [_preloaded removeObject:src]; } } + else { + // the data is not ready, retry in one tick + [self setNeedsDisplay]; + } } } @@ -329,25 +334,23 @@ RCT_NOT_IMPLEMENTED(-init) - (void)drawRect:(CGRect)rect { - __weak GLCanvas *weakSelf = self; + self.layer.opaque = _opaque; + + if (_neverRendered) { + _neverRendered = false; + glClearColor(0.0, 0.0, 0.0, 0.0); + glClear(GL_COLOR_BUFFER_BIT); + } + if (_needSync) { - _needSync = false; [self syncData]; } - self.layer.opaque = _opaque; - if ([self haveRemainingToPreload]) { - if (_neverRendered) { - _neverRendered = false; - glClearColor(0.0, 0.0, 0.0, 0.0); - glClear(GL_COLOR_BUFFER_BIT); - } return; } - _neverRendered = false; - BOOL needsDeferredRendering = _nbContentTextures > 0 && !_autoRedraw; + BOOL needsDeferredRendering = [_nbContentTextures intValue] > 0 && !_autoRedraw; if (needsDeferredRendering && !_deferredRendering) { _deferredRendering = true; [self performSelectorOnMainThread:@selector(syncContentData) withObject:nil waitUntilDone:NO]; @@ -355,24 +358,23 @@ RCT_NOT_IMPLEMENTED(-init) else { [self render]; _deferredRendering = false; - if (_captureFrameRequested) { _captureFrameRequested = false; - - // FIXME: might use performSelectorOnMainThread as well - dispatch_async(dispatch_get_main_queue(), ^{ // snapshot not allowed in render tick. defer it. - if (!weakSelf) return; - UIImage *frameImage = [weakSelf snapshot]; - NSData *frameData = UIImagePNGRepresentation(frameImage); - NSString *frame = - [NSString stringWithFormat:@"data:image/png;base64,%@", - [frameData base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength]]; - if (weakSelf.onGLCaptureFrame) weakSelf.onGLCaptureFrame(@{ @"frame": frame }); - }); + [self performSelectorOnMainThread:@selector(capture) withObject:nil waitUntilDone:NO]; } } } +-(void)capture +{ + UIImage *frameImage = [self snapshot]; + NSData *frameData = UIImagePNGRepresentation(frameImage); + NSString *frame = + [NSString stringWithFormat:@"data:image/png;base64,%@", + [frameData base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength]]; + if (self.onGLCaptureFrame) self.onGLCaptureFrame(@{ @"frame": frame }); +} + - (void)render { GLRenderData *rd = _renderData; @@ -489,11 +491,11 @@ RCT_NOT_IMPLEMENTED(-init) - (void)dispatchOnProgress: (double)progress withLoaded:(int)loaded withTotal:(int)total { if (self.onGLProgress) self.onGLProgress( - @{ - @"progress": @(RCTZeroIfNaN(progress)), - @"loaded": @(RCTZeroIfNaN(loaded)), - @"total": @(RCTZeroIfNaN(total)) - }); + @{ + @"progress": @(RCTZeroIfNaN(progress)), + @"loaded": @(RCTZeroIfNaN(loaded)), + @"total": @(RCTZeroIfNaN(total)) + }); } @end diff --git a/ios/GLImage.m b/ios/GLImage.m index d2715bc..d4c1d3f 100644 --- a/ios/GLImage.m +++ b/ios/GLImage.m @@ -97,7 +97,9 @@ RCT_NOT_IMPLEMENTED(-init) } else { // we need to copy the image because it seems the image will be altered. self.image = [UIImage imageWithCGImage:image.CGImage]; - if(_onload) _onload(); + dispatch_async(dispatch_get_main_queue(), ^{ + if (_onload) _onload(); + }); } }]; } diff --git a/ios/RNGL.xcodeproj/project.pbxproj b/ios/RNGL.xcodeproj/project.pbxproj index e056536..359f9ce 100644 --- a/ios/RNGL.xcodeproj/project.pbxproj +++ b/ios/RNGL.xcodeproj/project.pbxproj @@ -42,7 +42,7 @@ 346089C01BEFD0A500C90DB5 /* GLFBO.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GLFBO.h; sourceTree = ""; }; 346089C11BEFD0A500C90DB5 /* GLFBO.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GLFBO.m; sourceTree = ""; }; 346089C21BEFD0A500C90DB5 /* GLImage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GLImage.h; sourceTree = ""; }; - 346089C31BEFD0A500C90DB5 /* GLImage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GLImage.m; sourceTree = ""; }; + 346089C31BEFD0A500C90DB5 /* GLImage.m */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 2; lastKnownFileType = sourcecode.c.objc; path = GLImage.m; sourceTree = ""; tabWidth = 2; }; 346089C41BEFD0A500C90DB5 /* GLImageData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GLImageData.h; sourceTree = ""; }; 346089C51BEFD0A500C90DB5 /* GLImageData.m */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 2; lastKnownFileType = sourcecode.c.objc; path = GLImageData.m; sourceTree = ""; tabWidth = 2; }; 346089C61BEFD0A500C90DB5 /* GLRenderData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GLRenderData.h; sourceTree = ""; }; -- 2.26.2