From 9373cdaf36ed282fd5ff625c75ee251513957391 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABtan=20Renaudeau?= Date: Tue, 8 Sep 2015 19:56:51 +0200 Subject: [PATCH] WIP integrating gl-react-core 0.2.x --- Examples/AdvancedEffects/src/Intro.js | 32 +- Examples/Simple/Blur1D.js | 10 +- Examples/Simple/HueRotate.js | 7 +- Examples/Tests/.flowconfig | 46 + Examples/Tests/.gitignore | 28 + Examples/Tests/.npmignore | 27 + Examples/Tests/Add.js | 36 + Examples/Tests/Blur.js | 54 ++ Examples/Tests/Blur1D.js | 58 ++ Examples/Tests/Display2.js | 46 + Examples/Tests/HelloGL.js | 28 + Examples/Tests/Layer.js | 36 + Examples/Tests/Multiply.js | 36 + .../Tests/iOS/Tests.xcodeproj/project.pbxproj | 789 ++++++++++++++++++ .../xcshareddata/xcschemes/Tests.xcscheme | 112 +++ Examples/Tests/iOS/Tests/AppDelegate.h | 16 + Examples/Tests/iOS/Tests/AppDelegate.m | 60 ++ .../iOS/Tests/Base.lproj/LaunchScreen.xib | 42 + .../AppIcon.appiconset/Contents.json | 38 + Examples/Tests/iOS/Tests/Info.plist | 48 ++ Examples/Tests/iOS/Tests/main.jsbundle | 8 + Examples/Tests/iOS/Tests/main.m | 18 + Examples/Tests/iOS/TestsTests/Info.plist | 24 + Examples/Tests/iOS/TestsTests/TestsTests.m | 65 ++ Examples/Tests/index.ios.js | 73 ++ Examples/Tests/package.json | 12 + RNGL/GLCanvas.h | 3 +- RNGL/GLCanvas.m | 90 +- RNGL/GLCanvasManager.m | 3 +- RNGL/GLData.h | 6 + RNGL/GLData.m | 4 + RNGL/GLRenderData.h | 8 +- RNGL/GLRenderData.m | 6 +- RNGL/RCTConvert+GLData.m | 12 +- src/Target.js | 3 - src/Uniform.js | 3 + src/View.js | 47 +- src/index.js | 4 +- 38 files changed, 1836 insertions(+), 102 deletions(-) create mode 100644 Examples/Tests/.flowconfig create mode 100644 Examples/Tests/.gitignore create mode 100644 Examples/Tests/.npmignore create mode 100644 Examples/Tests/Add.js create mode 100644 Examples/Tests/Blur.js create mode 100644 Examples/Tests/Blur1D.js create mode 100644 Examples/Tests/Display2.js create mode 100644 Examples/Tests/HelloGL.js create mode 100644 Examples/Tests/Layer.js create mode 100644 Examples/Tests/Multiply.js create mode 100644 Examples/Tests/iOS/Tests.xcodeproj/project.pbxproj create mode 100644 Examples/Tests/iOS/Tests.xcodeproj/xcshareddata/xcschemes/Tests.xcscheme create mode 100644 Examples/Tests/iOS/Tests/AppDelegate.h create mode 100644 Examples/Tests/iOS/Tests/AppDelegate.m create mode 100644 Examples/Tests/iOS/Tests/Base.lproj/LaunchScreen.xib create mode 100644 Examples/Tests/iOS/Tests/Images.xcassets/AppIcon.appiconset/Contents.json create mode 100644 Examples/Tests/iOS/Tests/Info.plist create mode 100644 Examples/Tests/iOS/Tests/main.jsbundle create mode 100644 Examples/Tests/iOS/Tests/main.m create mode 100644 Examples/Tests/iOS/TestsTests/Info.plist create mode 100644 Examples/Tests/iOS/TestsTests/TestsTests.m create mode 100644 Examples/Tests/index.ios.js create mode 100644 Examples/Tests/package.json delete mode 100644 src/Target.js create mode 100644 src/Uniform.js diff --git a/Examples/AdvancedEffects/src/Intro.js b/Examples/AdvancedEffects/src/Intro.js index c77196f..dc243e9 100644 --- a/Examples/AdvancedEffects/src/Intro.js +++ b/Examples/AdvancedEffects/src/Intro.js @@ -52,23 +52,25 @@ class Intro extends React.Component { colorSeparation: 0.02, moving: 1 }}> - - - GL REACT NATIVE - - - - - {time.toFixed(2)}s - - - {(fps).toFixed(0)} fps - - - {""} + + + + GL REACT NATIVE + + + + {time.toFixed(2)}s + + + {(fps).toFixed(0)} fps + + + {""} + + - + ; } } diff --git a/Examples/Simple/Blur1D.js b/Examples/Simple/Blur1D.js index e1647a6..1202255 100644 --- a/Examples/Simple/Blur1D.js +++ b/Examples/Simple/Blur1D.js @@ -35,17 +35,17 @@ void main () { class Blur1D extends GL.Component { render () { - const { width, height, direction, children } = this.props; + const { width, height, direction, children: t } = this.props; return - {children} - ; + resolution: [ width, height ], + t + }} + />; } } diff --git a/Examples/Simple/HueRotate.js b/Examples/Simple/HueRotate.js index d822a42..85f3eb6 100644 --- a/Examples/Simple/HueRotate.js +++ b/Examples/Simple/HueRotate.js @@ -26,14 +26,13 @@ void main() { class HueRotate extends React.Component { render () { - const { width, height, hue, children } = this.props; + const { width, height, hue, children: tex } = this.props; return - {children} - ; + uniforms={{ hue, tex }} + />; } } diff --git a/Examples/Tests/.flowconfig b/Examples/Tests/.flowconfig new file mode 100644 index 0000000..438e495 --- /dev/null +++ b/Examples/Tests/.flowconfig @@ -0,0 +1,46 @@ +[ignore] + +# We fork some components by platform. +.*/*.web.js +.*/*.android.js + +# Some modules have their own node_modules with overlap +.*/node_modules/node-haste/.* + +# Ignore react-tools where there are overlaps, but don't ignore anything that +# react-native relies on +.*/node_modules/react-tools/src/React.js +.*/node_modules/react-tools/src/renderers/shared/event/EventPropagators.js +.*/node_modules/react-tools/src/renderers/shared/event/eventPlugins/ResponderEventPlugin.js +.*/node_modules/react-tools/src/shared/vendor/core/ExecutionEnvironment.js + + +# Ignore commoner tests +.*/node_modules/commoner/test/.* + +# See https://github.com/facebook/flow/issues/442 +.*/react-tools/node_modules/commoner/lib/reader.js + +# Ignore jest +.*/react-native/node_modules/jest-cli/.* + +[include] + +[libs] +node_modules/react-native/Libraries/react-native/react-native-interface.js + +[options] +module.system=haste + +munge_underscores=true + +suppress_type=$FlowIssue +suppress_type=$FlowFixMe +suppress_type=$FixMe + +suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(>=0\\.\\(1[0-4]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\) +suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(>=0\\.\\(1[0-4]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)? #[0-9]+ +suppress_comment=\\(.\\|\n\\)*\\$FlowFixedInNextDeploy + +[version] +0.14.0 diff --git a/Examples/Tests/.gitignore b/Examples/Tests/.gitignore new file mode 100644 index 0000000..b927355 --- /dev/null +++ b/Examples/Tests/.gitignore @@ -0,0 +1,28 @@ +# OSX +# +.DS_Store + +# Xcode +# +build/ +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +xcuserdata +*.xccheckout +*.moved-aside +DerivedData +*.hmap +*.ipa +*.xcuserstate +project.xcworkspace + +# node.js +# +node_modules/ +npm-debug.log diff --git a/Examples/Tests/.npmignore b/Examples/Tests/.npmignore new file mode 100644 index 0000000..c39012e --- /dev/null +++ b/Examples/Tests/.npmignore @@ -0,0 +1,27 @@ +# OSX +# +.DS_Store + +# Xcode +# +build/ +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +xcuserdata +*.xccheckout +*.moved-aside +DerivedData +*.hmap +*.ipa +*.xcuserstate + +# node.js +# +node_modules/ +npm-debug.log diff --git a/Examples/Tests/Add.js b/Examples/Tests/Add.js new file mode 100644 index 0000000..c206217 --- /dev/null +++ b/Examples/Tests/Add.js @@ -0,0 +1,36 @@ +const React = require("react-native"); +const GL = require("gl-react-native"); + +const shaders = GL.Shaders.create({ + add: { + frag: ` +precision highp float; + +varying vec2 uv; +uniform sampler2D t1; +uniform sampler2D t2; + +void main () { + vec4 c1 = texture2D(t1, uv); + vec4 c2 = texture2D(t2, uv); + gl_FragColor = c1 + c2; +} +` + } +}); + +class Add extends GL.Component { + render () { + const { width, height, children } = this.props; + if (!children || children.length !== 2) throw new Error("You must provide 2 children to Add"); + const [t1, t2] = children; + return ; + } +} + +module.exports = Add; diff --git a/Examples/Tests/Blur.js b/Examples/Tests/Blur.js new file mode 100644 index 0000000..31ceb54 --- /dev/null +++ b/Examples/Tests/Blur.js @@ -0,0 +1,54 @@ +const React = require("react-native"); +const GL = require("gl-react-native"); +const { + PropTypes +} = React; +const Blur1D = require("./Blur1D"); + +const NORM = Math.sqrt(2)/2; + +function directionForPass (p, factor, total) { + const f = factor * p / total; + switch (p%4) { + case 0: return [f,0]; + case 1: return [0,f]; + case 2: return [f*NORM,f*NORM]; + case 3: return [f*NORM,-f*NORM]; + } + return p%2 ? [f,0] : [0,f]; +} + +/** Usages: + - Small blur: + {url} + - Medium blur: + {url} + - Powerful blur: + {url} + */ +class Blur extends GL.Component { + render () { + const { width, height, factor, children, passes } = this.props; + + const rec = p => p <= 0 ? children : + + {rec(p-1)} + ; + + return rec(passes); + } +} + +Blur.defaultProps = { + passes: 2 +}; + +Blur.propTypes = { + width: PropTypes.number, + height: PropTypes.number, + factor: PropTypes.number.isRequired, + children: PropTypes.any.isRequired, + passes: PropTypes.number +}; + +module.exports = Blur; diff --git a/Examples/Tests/Blur1D.js b/Examples/Tests/Blur1D.js new file mode 100644 index 0000000..39b9a05 --- /dev/null +++ b/Examples/Tests/Blur1D.js @@ -0,0 +1,58 @@ +const React = require("react-native"); +const GL = require("gl-react-native"); + +const { + PropTypes +} = React; + +const shaders = GL.Shaders.create({ + blur1D: { + frag: ` +precision highp float; +varying vec2 uv; +uniform sampler2D t; +uniform vec2 resolution; +uniform vec2 direction; +// Credits: https://github.com/Jam3/glsl-fast-gaussian-blur +vec4 blur9 (sampler2D image, vec2 uv, vec2 resolution, vec2 direction) { + vec4 color = vec4(0.0); + vec2 off1 = vec2(1.3846153846) * direction; + vec2 off2 = vec2(3.2307692308) * direction; + color += texture2D(image, uv) * 0.2270270270; + color += texture2D(image, uv + (off1 / resolution)) * 0.3162162162; + color += texture2D(image, uv - (off1 / resolution)) * 0.3162162162; + color += texture2D(image, uv + (off2 / resolution)) * 0.0702702703; + color += texture2D(image, uv - (off2 / resolution)) * 0.0702702703; + return color; +} +void main () { + gl_FragColor = blur9(t, uv, resolution, direction); +} + ` + } +}); + +class Blur1D extends GL.Component { + render () { + const { width, height, direction, children } = this.props; + return + {children} + ; + } +} + +Blur1D.propTypes = { + width: PropTypes.number, + height: PropTypes.number, + direction: PropTypes.array.isRequired, + children: PropTypes.any.isRequired +}; + +module.exports = Blur1D; diff --git a/Examples/Tests/Display2.js b/Examples/Tests/Display2.js new file mode 100644 index 0000000..74939fc --- /dev/null +++ b/Examples/Tests/Display2.js @@ -0,0 +1,46 @@ +const React = require("react-native"); +const GL = require("gl-react-native"); + +const shaders = GL.Shaders.create({ + display2: { + frag: ` +precision highp float; + +varying vec2 uv; +uniform sampler2D t1; +uniform sampler2D t2; +uniform bool vertical; + +void main () { + float v = vertical ? 1.0 : 0.0; + vec2 p = uv * mix(vec2(2.0, 1.0), vec2(1.0, 2.0), v); + vec4 c1 = step(mix(p.x, p.y, v), 1.0) * texture2D(t1, p); + vec4 c2 = step(1.0, mix(p.x, p.y, v)) * texture2D(t2, p - vec2(1.0-v, v)); + gl_FragColor = c1 + c2; +} +` + } +}); + +class Display2 extends GL.Component { + render () { + const { width, height, children, vertical, ...rest } = this.props; + if (!children || children.length !== 2) throw new Error("You must provide 2 children to Display2"); + let [t1, t2] = children; + if (vertical) [t1,t2]=[t2,t1]; // just because webgl y's is reversed + return ; + } +} + +Display2.defaultProps = { + vertical: false +}; + +module.exports = Display2; diff --git a/Examples/Tests/HelloGL.js b/Examples/Tests/HelloGL.js new file mode 100644 index 0000000..84393e1 --- /dev/null +++ b/Examples/Tests/HelloGL.js @@ -0,0 +1,28 @@ +const React = require("react-native"); +const GL = require("gl-react-native"); + +const shaders = GL.Shaders.create({ + helloGL: { + frag: ` +precision highp float; +varying vec2 uv; // This variable vary in all pixel position (normalized from vec2(0.0,0.0) to vec2(1.0,1.0)) + +void main () { // This function is called FOR EACH PIXEL + gl_FragColor = vec4(uv.x, uv.y, 0.5, 1.0); // red vary over X, green vary over Y, blue is 50%, alpha is 100%. +} + ` + } +}); + +class HelloGL extends GL.Component { + render () { + const { width, height } = this.props; + return ; + } +} + +module.exports = HelloGL; diff --git a/Examples/Tests/Layer.js b/Examples/Tests/Layer.js new file mode 100644 index 0000000..e495b69 --- /dev/null +++ b/Examples/Tests/Layer.js @@ -0,0 +1,36 @@ +const React = require("react-native"); +const GL = require("gl-react-native"); + +const shaders = GL.Shaders.create({ + layer: { + frag: ` +precision highp float; + +varying vec2 uv; +uniform sampler2D t1; +uniform sampler2D t2; + +void main () { + vec4 c1 = texture2D(t1, uv); + vec4 c2 = texture2D(t2, uv); + gl_FragColor = mix(c1, c2, c2.a); +} +` + } +}); + +class Layer extends GL.Component { + render () { + const { width, height, children } = this.props; + if (!children || children.length !== 2) throw new Error("You must provide 2 children to Layer"); + const [t1, t2] = children; + return ; + } +} + +module.exports = Layer; diff --git a/Examples/Tests/Multiply.js b/Examples/Tests/Multiply.js new file mode 100644 index 0000000..44e7bd4 --- /dev/null +++ b/Examples/Tests/Multiply.js @@ -0,0 +1,36 @@ +const React = require("react-native"); +const GL = require("gl-react-native"); + +const shaders = GL.Shaders.create({ + multiply: { + frag: ` +precision highp float; + +varying vec2 uv; +uniform sampler2D t1; +uniform sampler2D t2; + +void main () { + vec4 c1 = texture2D(t1, uv); + vec4 c2 = texture2D(t2, uv); + gl_FragColor = c1 * c2; +} +` + } +}); + +class Multiply extends GL.Component { + render () { + const { width, height, children } = this.props; + if (!children || children.length !== 2) throw new Error("You must provide 2 children to Multiply"); + const [t1, t2] = children; + return ; + } +} + +module.exports = Multiply; diff --git a/Examples/Tests/iOS/Tests.xcodeproj/project.pbxproj b/Examples/Tests/iOS/Tests.xcodeproj/project.pbxproj new file mode 100644 index 0000000..85a1280 --- /dev/null +++ b/Examples/Tests/iOS/Tests.xcodeproj/project.pbxproj @@ -0,0 +1,789 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 008F07F31AC5B25A0029DE68 /* main.jsbundle in Resources */ = {isa = PBXBuildFile; fileRef = 008F07F21AC5B25A0029DE68 /* main.jsbundle */; }; + 00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */; }; + 00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */; }; + 00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */; }; + 00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */; }; + 00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */; }; + 00E356F31AD99517003FC87E /* TestsTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* TestsTests.m */; }; + 133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 78C398B91ACF4ADC00677621 /* libRCTLinking.a */; }; + 139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */; }; + 139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */; }; + 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; }; + 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB11A68108700A75B9A /* LaunchScreen.xib */; }; + 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; + 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; + 146834051AC3E58100842450 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; }; + 34A81B591B9F50DB002650C2 /* libRNGL.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 34A81B561B9F50D6002650C2 /* libRNGL.a */; }; + 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 832341B51AAA6A8300B99B32 /* libRCTText.a */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 134814201AA4EA6300B7C361; + remoteInfo = RCTActionSheet; + }; + 00C302B91ABCB90400DB3ED1 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 134814201AA4EA6300B7C361; + remoteInfo = RCTGeolocation; + }; + 00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 58B5115D1A9E6B3D00147676; + remoteInfo = RCTImage; + }; + 00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 58B511DB1A9E6C8500147676; + remoteInfo = RCTNetwork; + }; + 00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 832C81801AAF6DEF007FA2F7; + remoteInfo = RCTVibration; + }; + 00E356F41AD99517003FC87E /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 13B07F861A680F5B00A75B9A; + remoteInfo = Tests; + }; + 139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 134814201AA4EA6300B7C361; + remoteInfo = RCTSettings; + }; + 139FDEF31B06529B00C62182 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 3C86DF461ADF2C930047B81A; + remoteInfo = RCTWebSocket; + }; + 146834031AC3E56700842450 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 83CBBA2E1A601D0E00E9B192; + remoteInfo = React; + }; + 34A81B551B9F50D6002650C2 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 34A81B461B9F50D5002650C2 /* RNGL.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 34B330031B821571003856F8; + remoteInfo = RNGL; + }; + 34A81B571B9F50D6002650C2 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 34A81B461B9F50D5002650C2 /* RNGL.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 34B3300E1B821571003856F8; + remoteInfo = RNGLTests; + }; + 78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 134814201AA4EA6300B7C361; + remoteInfo = RCTLinking; + }; + 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 58B5119B1A9E6C1200147676; + remoteInfo = RCTText; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 008F07F21AC5B25A0029DE68 /* main.jsbundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = main.jsbundle; sourceTree = ""; }; + 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTActionSheet.xcodeproj; path = "../node_modules/react-native/Libraries/ActionSheetIOS/RCTActionSheet.xcodeproj"; sourceTree = ""; }; + 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTGeolocation.xcodeproj; path = "../node_modules/react-native/Libraries/Geolocation/RCTGeolocation.xcodeproj"; sourceTree = ""; }; + 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTImage.xcodeproj; path = "../node_modules/react-native/Libraries/Image/RCTImage.xcodeproj"; sourceTree = ""; }; + 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTNetwork.xcodeproj; path = "../node_modules/react-native/Libraries/Network/RCTNetwork.xcodeproj"; sourceTree = ""; }; + 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTVibration.xcodeproj; path = "../node_modules/react-native/Libraries/Vibration/RCTVibration.xcodeproj"; sourceTree = ""; }; + 00E356EE1AD99517003FC87E /* TestsTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = TestsTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 00E356F21AD99517003FC87E /* TestsTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TestsTests.m; sourceTree = ""; }; + 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTSettings.xcodeproj; path = "../node_modules/react-native/Libraries/Settings/RCTSettings.xcodeproj"; sourceTree = ""; }; + 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTWebSocket.xcodeproj; path = "../node_modules/react-native/Libraries/WebSocket/RCTWebSocket.xcodeproj"; sourceTree = ""; }; + 13B07F961A680F5B00A75B9A /* Tests.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Tests.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; + 13B07FB01A68108700A75B9A /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; + 13B07FB21A68108700A75B9A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; + 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; + 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 146833FF1AC3E56700842450 /* React.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = React.xcodeproj; path = "../node_modules/react-native/React/React.xcodeproj"; sourceTree = ""; }; + 34A81B461B9F50D5002650C2 /* RNGL.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RNGL.xcodeproj; path = "../node_modules/gl-react-native/RNGL.xcodeproj"; sourceTree = ""; }; + 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTLinking.xcodeproj; path = "../node_modules/react-native/Libraries/LinkingIOS/RCTLinking.xcodeproj"; sourceTree = ""; }; + 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTText.xcodeproj; path = "../node_modules/react-native/Libraries/Text/RCTText.xcodeproj"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 00E356EB1AD99517003FC87E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 13B07F8C1A680F5B00A75B9A /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 34A81B591B9F50DB002650C2 /* libRNGL.a in Frameworks */, + 146834051AC3E58100842450 /* libReact.a in Frameworks */, + 00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */, + 00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */, + 00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */, + 133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */, + 00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */, + 139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */, + 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */, + 00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */, + 139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 00C302A81ABCB8CE00DB3ED1 /* Products */ = { + isa = PBXGroup; + children = ( + 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */, + ); + name = Products; + sourceTree = ""; + }; + 00C302B61ABCB90400DB3ED1 /* Products */ = { + isa = PBXGroup; + children = ( + 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */, + ); + name = Products; + sourceTree = ""; + }; + 00C302BC1ABCB91800DB3ED1 /* Products */ = { + isa = PBXGroup; + children = ( + 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */, + ); + name = Products; + sourceTree = ""; + }; + 00C302D41ABCB9D200DB3ED1 /* Products */ = { + isa = PBXGroup; + children = ( + 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */, + ); + name = Products; + sourceTree = ""; + }; + 00C302E01ABCB9EE00DB3ED1 /* Products */ = { + isa = PBXGroup; + children = ( + 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */, + ); + name = Products; + sourceTree = ""; + }; + 00E356EF1AD99517003FC87E /* TestsTests */ = { + isa = PBXGroup; + children = ( + 00E356F21AD99517003FC87E /* TestsTests.m */, + 00E356F01AD99517003FC87E /* Supporting Files */, + ); + path = TestsTests; + sourceTree = ""; + }; + 00E356F01AD99517003FC87E /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 00E356F11AD99517003FC87E /* Info.plist */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 139105B71AF99BAD00B5F7CC /* Products */ = { + isa = PBXGroup; + children = ( + 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */, + ); + name = Products; + sourceTree = ""; + }; + 139FDEE71B06529A00C62182 /* Products */ = { + isa = PBXGroup; + children = ( + 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */, + ); + name = Products; + sourceTree = ""; + }; + 13B07FAE1A68108700A75B9A /* Tests */ = { + isa = PBXGroup; + children = ( + 13B07FAF1A68108700A75B9A /* AppDelegate.h */, + 13B07FB01A68108700A75B9A /* AppDelegate.m */, + 13B07FB51A68108700A75B9A /* Images.xcassets */, + 13B07FB61A68108700A75B9A /* Info.plist */, + 13B07FB11A68108700A75B9A /* LaunchScreen.xib */, + 008F07F21AC5B25A0029DE68 /* main.jsbundle */, + 13B07FB71A68108700A75B9A /* main.m */, + ); + path = Tests; + sourceTree = ""; + }; + 146834001AC3E56700842450 /* Products */ = { + isa = PBXGroup; + children = ( + 146834041AC3E56700842450 /* libReact.a */, + ); + name = Products; + sourceTree = ""; + }; + 34A81B471B9F50D5002650C2 /* Products */ = { + isa = PBXGroup; + children = ( + 34A81B561B9F50D6002650C2 /* libRNGL.a */, + 34A81B581B9F50D6002650C2 /* RNGLTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 78C398B11ACF4ADC00677621 /* Products */ = { + isa = PBXGroup; + children = ( + 78C398B91ACF4ADC00677621 /* libRCTLinking.a */, + ); + name = Products; + sourceTree = ""; + }; + 832341AE1AAA6A7D00B99B32 /* Libraries */ = { + isa = PBXGroup; + children = ( + 34A81B461B9F50D5002650C2 /* RNGL.xcodeproj */, + 146833FF1AC3E56700842450 /* React.xcodeproj */, + 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */, + 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */, + 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */, + 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */, + 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */, + 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */, + 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */, + 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */, + 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */, + ); + name = Libraries; + sourceTree = ""; + }; + 832341B11AAA6A8300B99B32 /* Products */ = { + isa = PBXGroup; + children = ( + 832341B51AAA6A8300B99B32 /* libRCTText.a */, + ); + name = Products; + sourceTree = ""; + }; + 83CBB9F61A601CBA00E9B192 = { + isa = PBXGroup; + children = ( + 13B07FAE1A68108700A75B9A /* Tests */, + 00E356EF1AD99517003FC87E /* TestsTests */, + 832341AE1AAA6A7D00B99B32 /* Libraries */, + 83CBBA001A601CBA00E9B192 /* Products */, + ); + indentWidth = 2; + sourceTree = ""; + tabWidth = 2; + }; + 83CBBA001A601CBA00E9B192 /* Products */ = { + isa = PBXGroup; + children = ( + 13B07F961A680F5B00A75B9A /* Tests.app */, + 00E356EE1AD99517003FC87E /* TestsTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 00E356ED1AD99517003FC87E /* TestsTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "TestsTests" */; + buildPhases = ( + 00E356EA1AD99517003FC87E /* Sources */, + 00E356EB1AD99517003FC87E /* Frameworks */, + 00E356EC1AD99517003FC87E /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 00E356F51AD99517003FC87E /* PBXTargetDependency */, + ); + name = TestsTests; + productName = TestsTests; + productReference = 00E356EE1AD99517003FC87E /* TestsTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 13B07F861A680F5B00A75B9A /* Tests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "Tests" */; + buildPhases = ( + 13B07F871A680F5B00A75B9A /* Sources */, + 13B07F8C1A680F5B00A75B9A /* Frameworks */, + 13B07F8E1A680F5B00A75B9A /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Tests; + productName = "Hello World"; + productReference = 13B07F961A680F5B00A75B9A /* Tests.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 83CBB9F71A601CBA00E9B192 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0610; + ORGANIZATIONNAME = Facebook; + TargetAttributes = { + 00E356ED1AD99517003FC87E = { + CreatedOnToolsVersion = 6.2; + TestTargetID = 13B07F861A680F5B00A75B9A; + }; + }; + }; + buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "Tests" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 83CBB9F61A601CBA00E9B192; + productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; + projectDirPath = ""; + projectReferences = ( + { + ProductGroup = 00C302A81ABCB8CE00DB3ED1 /* Products */; + ProjectRef = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */; + }, + { + ProductGroup = 00C302B61ABCB90400DB3ED1 /* Products */; + ProjectRef = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */; + }, + { + ProductGroup = 00C302BC1ABCB91800DB3ED1 /* Products */; + ProjectRef = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */; + }, + { + ProductGroup = 78C398B11ACF4ADC00677621 /* Products */; + ProjectRef = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */; + }, + { + ProductGroup = 00C302D41ABCB9D200DB3ED1 /* Products */; + ProjectRef = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */; + }, + { + ProductGroup = 139105B71AF99BAD00B5F7CC /* Products */; + ProjectRef = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */; + }, + { + ProductGroup = 832341B11AAA6A8300B99B32 /* Products */; + ProjectRef = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */; + }, + { + ProductGroup = 00C302E01ABCB9EE00DB3ED1 /* Products */; + ProjectRef = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */; + }, + { + ProductGroup = 139FDEE71B06529A00C62182 /* Products */; + ProjectRef = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; + }, + { + ProductGroup = 146834001AC3E56700842450 /* Products */; + ProjectRef = 146833FF1AC3E56700842450 /* React.xcodeproj */; + }, + { + ProductGroup = 34A81B471B9F50D5002650C2 /* Products */; + ProjectRef = 34A81B461B9F50D5002650C2 /* RNGL.xcodeproj */; + }, + ); + projectRoot = ""; + targets = ( + 13B07F861A680F5B00A75B9A /* Tests */, + 00E356ED1AD99517003FC87E /* TestsTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXReferenceProxy section */ + 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTActionSheet.a; + remoteRef = 00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTGeolocation.a; + remoteRef = 00C302B91ABCB90400DB3ED1 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTImage.a; + remoteRef = 00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTNetwork.a; + remoteRef = 00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTVibration.a; + remoteRef = 00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTSettings.a; + remoteRef = 139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTWebSocket.a; + remoteRef = 139FDEF31B06529B00C62182 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 146834041AC3E56700842450 /* libReact.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libReact.a; + remoteRef = 146834031AC3E56700842450 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 34A81B561B9F50D6002650C2 /* libRNGL.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRNGL.a; + remoteRef = 34A81B551B9F50D6002650C2 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 34A81B581B9F50D6002650C2 /* RNGLTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = RNGLTests.xctest; + remoteRef = 34A81B571B9F50D6002650C2 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 78C398B91ACF4ADC00677621 /* libRCTLinking.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTLinking.a; + remoteRef = 78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 832341B51AAA6A8300B99B32 /* libRCTText.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTText.a; + remoteRef = 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; +/* End PBXReferenceProxy section */ + +/* Begin PBXResourcesBuildPhase section */ + 00E356EC1AD99517003FC87E /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 13B07F8E1A680F5B00A75B9A /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 008F07F31AC5B25A0029DE68 /* main.jsbundle in Resources */, + 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, + 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 00E356EA1AD99517003FC87E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 00E356F31AD99517003FC87E /* TestsTests.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 13B07F871A680F5B00A75B9A /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */, + 13B07FC11A68108700A75B9A /* main.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 00E356F51AD99517003FC87E /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 13B07F861A680F5B00A75B9A /* Tests */; + targetProxy = 00E356F41AD99517003FC87E /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 13B07FB11A68108700A75B9A /* LaunchScreen.xib */ = { + isa = PBXVariantGroup; + children = ( + 13B07FB21A68108700A75B9A /* Base */, + ); + name = LaunchScreen.xib; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 00E356F61AD99517003FC87E /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + FRAMEWORK_SEARCH_PATHS = ( + "$(SDKROOT)/Developer/Library/Frameworks", + "$(inherited)", + ); + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + INFOPLIST_FILE = TestsTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.2; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Tests.app/Tests"; + }; + name = Debug; + }; + 00E356F71AD99517003FC87E /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + COPY_PHASE_STRIP = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(SDKROOT)/Developer/Library/Frameworks", + "$(inherited)", + ); + INFOPLIST_FILE = TestsTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.2; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Tests.app/Tests"; + }; + name = Release; + }; + 13B07F941A680F5B00A75B9A /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + "$(SRCROOT)/../node_modules/react-native/React/**", + ); + INFOPLIST_FILE = "$(SRCROOT)/Tests/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + OTHER_LDFLAGS = "-ObjC"; + PRODUCT_NAME = Tests; + }; + name = Debug; + }; + 13B07F951A680F5B00A75B9A /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + "$(SRCROOT)/../node_modules/react-native/React/**", + ); + INFOPLIST_FILE = "$(SRCROOT)/Tests/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + OTHER_LDFLAGS = "-ObjC"; + PRODUCT_NAME = Tests; + }; + name = Release; + }; + 83CBBA201A601CBA00E9B192 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + "$(SRCROOT)/../node_modules/react-native/React/**", + ); + IPHONEOS_DEPLOYMENT_TARGET = 7.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + }; + name = Debug; + }; + 83CBBA211A601CBA00E9B192 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = YES; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + "$(SRCROOT)/../node_modules/react-native/React/**", + ); + IPHONEOS_DEPLOYMENT_TARGET = 7.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "TestsTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 00E356F61AD99517003FC87E /* Debug */, + 00E356F71AD99517003FC87E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "Tests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 13B07F941A680F5B00A75B9A /* Debug */, + 13B07F951A680F5B00A75B9A /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "Tests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 83CBBA201A601CBA00E9B192 /* Debug */, + 83CBBA211A601CBA00E9B192 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */; +} diff --git a/Examples/Tests/iOS/Tests.xcodeproj/xcshareddata/xcschemes/Tests.xcscheme b/Examples/Tests/iOS/Tests.xcodeproj/xcshareddata/xcschemes/Tests.xcscheme new file mode 100644 index 0000000..2e65a43 --- /dev/null +++ b/Examples/Tests/iOS/Tests.xcodeproj/xcshareddata/xcschemes/Tests.xcscheme @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Examples/Tests/iOS/Tests/AppDelegate.h b/Examples/Tests/iOS/Tests/AppDelegate.h new file mode 100644 index 0000000..a9654d5 --- /dev/null +++ b/Examples/Tests/iOS/Tests/AppDelegate.h @@ -0,0 +1,16 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import + +@interface AppDelegate : UIResponder + +@property (nonatomic, strong) UIWindow *window; + +@end diff --git a/Examples/Tests/iOS/Tests/AppDelegate.m b/Examples/Tests/iOS/Tests/AppDelegate.m new file mode 100644 index 0000000..1f1e1dd --- /dev/null +++ b/Examples/Tests/iOS/Tests/AppDelegate.m @@ -0,0 +1,60 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import "AppDelegate.h" + +#import "RCTRootView.h" + +@implementation AppDelegate + +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions +{ + NSURL *jsCodeLocation; + + /** + * Loading JavaScript code - uncomment the one you want. + * + * OPTION 1 + * Load from development server. Start the server from the repository root: + * + * $ npm start + * + * To run on device, change `localhost` to the IP address of your computer + * (you can get this by typing `ifconfig` into the terminal and selecting the + * `inet` value under `en0:`) and make sure your computer and iOS device are + * on the same Wi-Fi network. + */ + + jsCodeLocation = [NSURL URLWithString:@"http://localhost:8081/index.ios.bundle"]; + + /** + * OPTION 2 + * Load from pre-bundled file on disk. To re-generate the static bundle + * from the root of your project directory, run + * + * $ react-native bundle --minify + * + * see http://facebook.github.io/react-native/docs/runningondevice.html + */ + +// jsCodeLocation = [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"]; + + RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation + moduleName:@"Tests" + launchOptions:launchOptions]; + + self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; + UIViewController *rootViewController = [[UIViewController alloc] init]; + rootViewController.view = rootView; + self.window.rootViewController = rootViewController; + [self.window makeKeyAndVisible]; + return YES; +} + +@end diff --git a/Examples/Tests/iOS/Tests/Base.lproj/LaunchScreen.xib b/Examples/Tests/iOS/Tests/Base.lproj/LaunchScreen.xib new file mode 100644 index 0000000..a774c3c --- /dev/null +++ b/Examples/Tests/iOS/Tests/Base.lproj/LaunchScreen.xib @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Examples/Tests/iOS/Tests/Images.xcassets/AppIcon.appiconset/Contents.json b/Examples/Tests/iOS/Tests/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..118c98f --- /dev/null +++ b/Examples/Tests/iOS/Tests/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,38 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Examples/Tests/iOS/Tests/Info.plist b/Examples/Tests/iOS/Tests/Info.plist new file mode 100644 index 0000000..cddf076 --- /dev/null +++ b/Examples/Tests/iOS/Tests/Info.plist @@ -0,0 +1,48 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIViewControllerBasedStatusBarAppearance + + NSLocationWhenInUseUsageDescription + + NSAppTransportSecurity + + + NSAllowsArbitraryLoads + + + + diff --git a/Examples/Tests/iOS/Tests/main.jsbundle b/Examples/Tests/iOS/Tests/main.jsbundle new file mode 100644 index 0000000..b702b30 --- /dev/null +++ b/Examples/Tests/iOS/Tests/main.jsbundle @@ -0,0 +1,8 @@ +// Offline JS +// To re-generate the offline bundle, run this from the root of your project: +// +// $ react-native bundle --minify +// +// See http://facebook.github.io/react-native/docs/runningondevice.html for more details. + +throw new Error('Offline JS file is empty. See iOS/main.jsbundle for instructions'); diff --git a/Examples/Tests/iOS/Tests/main.m b/Examples/Tests/iOS/Tests/main.m new file mode 100644 index 0000000..3d767fc --- /dev/null +++ b/Examples/Tests/iOS/Tests/main.m @@ -0,0 +1,18 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import + +#import "AppDelegate.h" + +int main(int argc, char * argv[]) { + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); + } +} diff --git a/Examples/Tests/iOS/TestsTests/Info.plist b/Examples/Tests/iOS/TestsTests/Info.plist new file mode 100644 index 0000000..886825c --- /dev/null +++ b/Examples/Tests/iOS/TestsTests/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/Examples/Tests/iOS/TestsTests/TestsTests.m b/Examples/Tests/iOS/TestsTests/TestsTests.m new file mode 100644 index 0000000..318f1bb --- /dev/null +++ b/Examples/Tests/iOS/TestsTests/TestsTests.m @@ -0,0 +1,65 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import +#import + +#import "RCTAssert.h" +#import "RCTRedBox.h" +#import "RCTRootView.h" + +#define TIMEOUT_SECONDS 240 +#define TEXT_TO_LOOK_FOR @"Welcome to React Native!" + +@interface TestsTests : XCTestCase + +@end + +@implementation TestsTests + + +- (BOOL)findSubviewInView:(UIView *)view matching:(BOOL(^)(UIView *view))test +{ + if (test(view)) { + return YES; + } + for (UIView *subview in [view subviews]) { + if ([self findSubviewInView:subview matching:test]) { + return YES; + } + } + return NO; +} + +- (void)testRendersWelcomeScreen { + UIViewController *vc = [[[[UIApplication sharedApplication] delegate] window] rootViewController]; + NSDate *date = [NSDate dateWithTimeIntervalSinceNow:TIMEOUT_SECONDS]; + BOOL foundElement = NO; + NSString *redboxError = nil; + + while ([date timeIntervalSinceNow] > 0 && !foundElement && !redboxError) { + [[NSRunLoop mainRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; + [[NSRunLoop mainRunLoop] runMode:NSRunLoopCommonModes beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; + + redboxError = [[RCTRedBox sharedInstance] currentErrorMessage]; + + foundElement = [self findSubviewInView:vc.view matching:^BOOL(UIView *view) { + if ([view.accessibilityLabel isEqualToString:TEXT_TO_LOOK_FOR]) { + return YES; + } + return NO; + }]; + } + + XCTAssertNil(redboxError, @"RedBox error: %@", redboxError); + XCTAssertTrue(foundElement, @"Couldn't find element with text '%@' in %d seconds", TEXT_TO_LOOK_FOR, TIMEOUT_SECONDS); +} + + +@end diff --git a/Examples/Tests/index.ios.js b/Examples/Tests/index.ios.js new file mode 100644 index 0000000..f5327b9 --- /dev/null +++ b/Examples/Tests/index.ios.js @@ -0,0 +1,73 @@ +const React = require("react-native"); +const { + AppRegistry, + Text, + View, +} = React; + +const Blur = require("./Blur"); +const Add = require("./Add"); +const Multiply = require("./Multiply"); +const Layer = require("./Layer"); +const HelloGL = require("./HelloGL"); +const Display2 = require("./Display2"); +const { width: viewportW, height: viewportH } = require("Dimensions").get("window"); + +const Tests = React.createClass({ + render: function() { + const helloGL = + ; + + const txt = + + {[0,1,2,3].map(i => + Hello World {i} + )} + ; + + const img = "http://i.imgur.com/zJIxPEo.jpg"; + + const blurredImage = + + {img} + ; + + const blurredImageOverText = + + {blurredImage} + {txt} + ; + + return + + + + {txt} + {helloGL} + + + + + {blurredImageOverText} + {helloGL} + + + {blurredImage} + + + {txt} + + ; + } +}); + +AppRegistry.registerComponent("Tests", () => Tests); diff --git a/Examples/Tests/package.json b/Examples/Tests/package.json new file mode 100644 index 0000000..405c865 --- /dev/null +++ b/Examples/Tests/package.json @@ -0,0 +1,12 @@ +{ + "name": "Tests", + "version": "0.0.1", + "private": true, + "scripts": { + "start": "node_modules/react-native/packager/packager.sh" + }, + "dependencies": { + "gl-react-native": "file:../..", + "react-native": "^0.10.1" + } +} diff --git a/RNGL/GLCanvas.h b/RNGL/GLCanvas.h index 90090f1..2618cb7 100644 --- a/RNGL/GLCanvas.h +++ b/RNGL/GLCanvas.h @@ -5,8 +5,9 @@ @property (nonatomic) GLData *data; @property (nonatomic) BOOL opaque; -@property (nonatomic) NSNumber *nbTargets; +@property (nonatomic) NSNumber *nbContentTextures; @property (nonatomic) NSNumber *renderId; +@property (nonatomic) NSArray *imagesToPreload; - (instancetype)initWithBridge:(RCTBridge *)bridge withContext:(EAGLContext*)context; diff --git a/RNGL/GLCanvas.m b/RNGL/GLCanvas.m index c36af08..2534144 100644 --- a/RNGL/GLCanvas.m +++ b/RNGL/GLCanvas.m @@ -18,12 +18,12 @@ GLRenderData *_renderData; - NSArray *_targetTextures; + NSArray *_contentTextures; NSDictionary *_images; // This caches the currently used images (imageSrc -> GLReactImage) BOOL _opaque; // opaque prop (if false, the GLCanvas will become transparent) - BOOL _deferredRendering; // This flag indicates a render has been deferred to the next frame (when using GL.Target) + BOOL _deferredRendering; // This flag indicates a render has been deferred to the next frame (when using contents) GLint defaultFBO; } @@ -63,7 +63,7 @@ NSString* srcResource (id res) - (void)setRenderId:(NSNumber *)renderId { - if (_nbTargets > 0) { + if (_nbContentTextures > 0) { [self setNeedsDisplay]; } } @@ -87,23 +87,21 @@ NSString* srcResource (id res) NSDictionary *prevImages = _images; NSMutableDictionary *images = [[NSMutableDictionary alloc] init]; - GLRenderData * (^traverseTree) (GLData *data, int frameIndex); - __block __weak GLRenderData * (^weak_traverseTree)(GLData *data, int frameIndex); - weak_traverseTree = traverseTree = ^GLRenderData *(GLData *data, int frameIndex) { + GLRenderData * (^traverseTree) (GLData *data); + __block __weak GLRenderData * (^weak_traverseTree)(GLData *data); + weak_traverseTree = traverseTree = ^GLRenderData *(GLData *data) { NSNumber *width = data.width; NSNumber *height = data.height; + int fboId = [data.fboId intValue]; + + NSMutableArray *contextChildren = [[NSMutableArray alloc] init]; + for (GLData *child in data.contextChildren) { + [contextChildren addObject:weak_traverseTree(child)]; + } - // Traverse children and compute GLRenderData NSMutableArray *children = [[NSMutableArray alloc] init]; - NSMutableDictionary *fbosMapping = [[NSMutableDictionary alloc] init]; - int fboId = 0; - int i = 0; for (GLData *child in data.children) { - if (fboId == frameIndex) fboId ++; - fbosMapping[[NSNumber numberWithInt:i]] = [NSNumber numberWithInt:fboId]; - [children addObject:weak_traverseTree(child, fboId)]; - fboId ++; - i ++; + [children addObject:weak_traverseTree(child)]; } GLShader *shader = [GLShadersRegistry getShader:data.shader]; @@ -119,15 +117,15 @@ NSString* srcResource (id res) if (value && (type == GL_SAMPLER_2D || type == GL_SAMPLER_CUBE)) { uniforms[uniformName] = [NSNumber numberWithInt:units++]; NSString *type = [RCTConvert NSString:value[@"type"]]; - if ([type isEqualToString:@"target"]) { + if ([type isEqualToString:@"content"]) { int id = [[RCTConvert NSNumber:value[@"id"]] intValue]; - if (id >= [_targetTextures count]) { - [self resizeTargets:id+1]; + if (id >= [_contentTextures count]) { + [self resizeUniformContentTextures:id+1]; } - textures[uniformName] = _targetTextures[id]; + textures[uniformName] = _contentTextures[id]; } else if ([type isEqualToString:@"framebuffer"]) { - NSNumber *id = fbosMapping[[RCTConvert NSNumber:value[@"id"]]]; + NSNumber *id = [RCTConvert NSNumber:value[@"id"]]; GLFBO *fbo = [GLShadersRegistry getFBO:id]; textures[uniformName] = fbo.color[0]; } @@ -174,47 +172,58 @@ NSString* srcResource (id res) } } - return [[GLRenderData alloc] initWithShader:shader withUniforms:uniforms withTextures:textures withWidth:width withHeight:height withFrameIndex:frameIndex withChildren:children]; + return [[GLRenderData alloc] + initWithShader:shader + withUniforms:uniforms + withTextures:textures + withWidth:width + withHeight:height + withFboId:fboId + withContextChildren:contextChildren + withChildren:children]; }; - _renderData = traverseTree(_data, -1); + _renderData = traverseTree(_data); _images = images; [self setNeedsDisplay]; } } -- (void)setNbTargets:(NSNumber *)nbTargets +- (void)setNbContentTextures:(NSNumber *)nbContentTextures { - [self resizeTargets:[nbTargets intValue]]; - _nbTargets = nbTargets; + [self resizeUniformContentTextures:[nbContentTextures intValue]]; + _nbContentTextures = nbContentTextures; } -- (void)resizeTargets:(int)n +- (void)resizeUniformContentTextures:(int)n { [EAGLContext setCurrentContext:self.context]; - int length = (int) [_targetTextures count]; + int length = (int) [_contentTextures count]; if (length == n) return; if (n < length) { - _targetTextures = [_targetTextures subarrayWithRange:NSMakeRange(0, n)]; + _contentTextures = [_contentTextures subarrayWithRange:NSMakeRange(0, n)]; } else { - NSMutableArray *targetTextures = [[NSMutableArray alloc] initWithArray:_targetTextures]; - for (int i = (int) [_targetTextures count]; i < n; i++) { - [targetTextures addObject:[[GLTexture alloc] init]]; + NSMutableArray *contentTextures = [[NSMutableArray alloc] initWithArray:_contentTextures]; + for (int i = (int) [_contentTextures count]; i < n; i++) { + [contentTextures addObject:[[GLTexture alloc] init]]; } - _targetTextures = targetTextures; + _contentTextures = contentTextures; } } -- (void)syncTargetTextures +- (void)syncContentTextures { int i = 0; - for (GLTexture *texture in _targetTextures) { + for (GLTexture *texture in _contentTextures) { UIView* view = self.superview.subviews[i]; // We take siblings by index (closely related to the JS code) if (view) { - [texture setPixelsWithView:view]; + if ([view.subviews count] == 1) + [texture setPixelsWithView:view.subviews[0]]; + else + [texture setPixelsWithView:view]; } else { [texture setPixelsEmpty]; } @@ -224,7 +233,7 @@ NSString* srcResource (id res) - (void)drawRect:(CGRect)rect { - BOOL needsDeferredRendering = _nbTargets > 0; + BOOL needsDeferredRendering = _nbContentTextures > 0; if (needsDeferredRendering && !_deferredRendering) { dispatch_async(dispatch_get_main_queue(), ^{ _deferredRendering = true; @@ -252,15 +261,18 @@ NSString* srcResource (id res) float w = [renderData.width floatValue] * scale; float h = [renderData.height floatValue] * scale; + for (GLRenderData *child in renderData.contextChildren) + weak_recDraw(child); + for (GLRenderData *child in renderData.children) weak_recDraw(child); - if (renderData.frameIndex == -1) { + if (renderData.fboId == -1) { glBindFramebuffer(GL_FRAMEBUFFER, defaultFBO); glViewport(0, 0, w, h); } else { - GLFBO *fbo = [GLShadersRegistry getFBO:[NSNumber numberWithInt:renderData.frameIndex]]; + GLFBO *fbo = [GLShadersRegistry getFBO:[NSNumber numberWithInt:renderData.fboId]]; [fbo setShapeWithWidth:w withHeight:h]; [fbo bind]; } @@ -285,7 +297,7 @@ NSString* srcResource (id res) glGetIntegerv(GL_FRAMEBUFFER_BINDING, &defaultFBO); - [self syncTargetTextures]; + [self syncContentTextures]; recDraw(_renderData); diff --git a/RNGL/GLCanvasManager.m b/RNGL/GLCanvasManager.m index 201ab2d..cf99b4d 100644 --- a/RNGL/GLCanvasManager.m +++ b/RNGL/GLCanvasManager.m @@ -18,10 +18,11 @@ RCT_EXPORT_MODULE(); return self; } -RCT_EXPORT_VIEW_PROPERTY(nbTargets, NSNumber); +RCT_EXPORT_VIEW_PROPERTY(nbContentTextures, NSNumber); RCT_EXPORT_VIEW_PROPERTY(opaque, BOOL); RCT_EXPORT_VIEW_PROPERTY(data, GLData); RCT_EXPORT_VIEW_PROPERTY(renderId, NSNumber); +RCT_EXPORT_VIEW_PROPERTY(imagesToPreload, NSArray); - (UIView *)view { diff --git a/RNGL/GLData.h b/RNGL/GLData.h index 9717c2f..610261f 100644 --- a/RNGL/GLData.h +++ b/RNGL/GLData.h @@ -1,17 +1,23 @@ #import +// Data format of gl-react-core + @interface GLData: NSObject @property (nonatomic) NSNumber *shader; @property (nonatomic) NSDictionary *uniforms; @property (nonatomic) NSNumber *width; @property (nonatomic) NSNumber *height; +@property (nonatomic) NSNumber *fboId; +@property (nonatomic) NSArray *contextChildren; @property (nonatomic) NSArray *children; -(instancetype)initWithShader: (NSNumber *)shader withUniforms: (NSDictionary *)uniforms withWidth: (NSNumber *)width withHeight: (NSNumber *)height + withFboId: (NSNumber *)fboId + withContextChildren: (NSArray *)contextChildren withChildren: (NSArray *)children; @end diff --git a/RNGL/GLData.m b/RNGL/GLData.m index 0146aac..2466854 100644 --- a/RNGL/GLData.m +++ b/RNGL/GLData.m @@ -6,6 +6,8 @@ withUniforms: (NSDictionary *)uniforms withWidth: (NSNumber *)width withHeight: (NSNumber *)height + withFboId: (NSNumber *)fboId + withContextChildren: (NSArray *)contextChildren withChildren: (NSArray *)children { if ((self = [super init])) { @@ -13,6 +15,8 @@ self.uniforms = uniforms; self.width = width; self.height = height; + self.fboId = fboId; + self.contextChildren = contextChildren; self.children = children; } return self; diff --git a/RNGL/GLRenderData.h b/RNGL/GLRenderData.h index d1a8301..44ecf9d 100644 --- a/RNGL/GLRenderData.h +++ b/RNGL/GLRenderData.h @@ -1,5 +1,7 @@ #import "GLShader.h" +// GLRenderData is the validated/gl'resolved version of GLData + @interface GLRenderData : NSObject @property (nonatomic) GLShader *shader; @@ -7,7 +9,8 @@ @property (nonatomic) NSDictionary *textures; @property (nonatomic) NSNumber *width; @property (nonatomic) NSNumber *height; -@property (nonatomic) int frameIndex; +@property (nonatomic) int fboId; +@property (nonatomic) NSArray *contextChildren; @property (nonatomic) NSArray *children; -(instancetype) initWithShader: (GLShader *)shader @@ -15,7 +18,8 @@ withTextures: (NSDictionary *)textures withWidth: (NSNumber *)width withHeight: (NSNumber *)height - withFrameIndex: (int)frameIndex + withFboId: (int)fboId + withContextChildren: (NSArray *)contextChildren withChildren: (NSArray *)children; @end diff --git a/RNGL/GLRenderData.m b/RNGL/GLRenderData.m index 28d6550..f4b6721 100644 --- a/RNGL/GLRenderData.m +++ b/RNGL/GLRenderData.m @@ -8,7 +8,8 @@ withTextures: (NSDictionary *)textures withWidth: (NSNumber *)width withHeight: (NSNumber *)height - withFrameIndex: (int)frameIndex + withFboId: (int)fboId + withContextChildren: (NSArray *)contextChildren withChildren: (NSArray *)children { @@ -18,7 +19,8 @@ self.textures = textures; self.width = width; self.height = height; - self.frameIndex = frameIndex; + self.fboId = fboId; + self.contextChildren = contextChildren; self.children = children; } return self; diff --git a/RNGL/RCTConvert+GLData.m b/RNGL/RCTConvert+GLData.m index 3172cb7..e65f49c 100644 --- a/RNGL/RCTConvert+GLData.m +++ b/RNGL/RCTConvert+GLData.m @@ -10,18 +10,28 @@ NSDictionary *uniforms = [self NSDictionary:json[@"uniforms"]]; NSNumber *width = [self NSNumber:json[@"width"]]; NSNumber *height = [self NSNumber:json[@"height"]]; + NSNumber *fboId = [self NSNumber:json[@"fboId"]]; + NSArray *contextChildrenJSON = [self NSArray: json[@"contextChildren"]]; NSArray *childrenJSON = [self NSArray: json[@"children"]]; - NSMutableArray *children = [NSMutableArray array]; + NSMutableArray *children = [NSMutableArray array]; for (NSObject *childJSON in childrenJSON) { GLData *child = [self GLData:childJSON]; [children addObject:child]; } + NSMutableArray *contextChildren = [NSMutableArray array]; + for (NSObject *childJSON in contextChildrenJSON) { + GLData *child = [self GLData:childJSON]; + [contextChildren addObject:child]; + } + return [[GLData alloc] initWithShader: shader withUniforms: uniforms withWidth: width withHeight: height + withFboId: fboId + withContextChildren: contextChildren withChildren: children]; } diff --git a/src/Target.js b/src/Target.js deleted file mode 100644 index c571a17..0000000 --- a/src/Target.js +++ /dev/null @@ -1,3 +0,0 @@ -const {createTarget} = require("gl-react-core"); -const React = require("react-native"); -module.exports = createTarget(React); diff --git a/src/Uniform.js b/src/Uniform.js new file mode 100644 index 0000000..b5bc1c2 --- /dev/null +++ b/src/Uniform.js @@ -0,0 +1,3 @@ +const {createUniform} = require("gl-react-core"); +const React = require("react-native"); +module.exports = createUniform(React); diff --git a/src/View.js b/src/View.js index 4613044..46b8809 100644 --- a/src/View.js +++ b/src/View.js @@ -1,7 +1,7 @@ const {createView} = require("gl-react-core"); const React = require("react-native"); const Shaders = require("./Shaders"); -const Target = require("./Target"); +const Uniform = require("./Uniform"); const Component = require("./Component"); const { @@ -11,7 +11,7 @@ const { const GLCanvas = requireNativeComponent("GLCanvas", null); -const renderVtarget = function (style, width, height, id, children) { +const renderVcontent = function (width, height, id, children) { const childrenStyle = { position: "absolute", top: 0, @@ -20,39 +20,32 @@ const renderVtarget = function (style, width, height, id, children) { height: height, overflow: "hidden" }; - return {children}; + return {children}; }; -const renderVGL = function (props, width, height, data, nbTargets, renderId) { +const renderVGL = function (props) { + const { width, height, ...restProps } = props; return ; }; -const renderVcontainer = function (style, width, height, targets, renderer) { - if (targets) { - const parentStyle = [ style, { - position: "relative", - width: width, - height: height, - overflow: "hidden" - }]; - return - {targets} - {renderer} - ; - } - else { - return renderer; - } +const renderVcontainer = function (width, height, contents, renderer) { + const parentStyle = { + position: "relative", + width: width, + height: height, + overflow: "hidden" + }; + return + {contents} + {renderer} + ; }; -const GLView = createView(React, Shaders, Target, Component, renderVcontainer, renderVtarget, renderVGL); +const GLView = createView(React, Shaders, Uniform, Component, renderVcontainer, renderVcontent, renderVGL); GLView.prototype.setNativeProps = function (props) { this.refs.native.setNativeProps(props); diff --git a/src/index.js b/src/index.js index 31468fd..37c3339 100644 --- a/src/index.js +++ b/src/index.js @@ -1,11 +1,11 @@ const Shaders = require("./Shaders"); const View = require("./View"); -const Target = require("./Target"); +const Uniform = require("./Uniform"); const Component = require("./Component"); module.exports = { Shaders, View, - Target, + Uniform, Component }; -- 2.26.2