diff --git a/Examples/AdvancedEffects/src/Intro.js b/Examples/AdvancedEffects/src/Intro.js
index c77196f844219149cc5bc122c253ab0e65b92dfa..dc243e9c5e7a098d07fc8d7ce68f95deb357df52 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/AdvancedEffects/src/Transition.js b/Examples/AdvancedEffects/src/Transition.js
index 6262249b0da543d970589b82fad2b8f231855eac..146405e904263c228f83d699fc610ee6a2023cf5 100644
--- a/Examples/AdvancedEffects/src/Transition.js
+++ b/Examples/AdvancedEffects/src/Transition.js
@@ -6,6 +6,7 @@ class Transition extends React.Component {
const { width, height, shader, progress, from, to, uniforms } = this.props;
const scale = React.PixelRatio.get();
return true}
onMoveShouldSetResponder={() => true}
onResponderMove={this.onResponderMove}
diff --git a/Examples/Simple/Blur1D.js b/Examples/Simple/Blur1D.js
index e1647a6a0e404e89b0bd0698a2a98d74a82a4ad0..120225540211ac1119a799951799e70b31c7eb63 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 d822a42858985ae38bc3d5d16c41f8af32c70955..85f3eb6c9f40627575afab6de6792e36563bfdb4 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 0000000000000000000000000000000000000000..438e495d48dcafad14e33471e3598bc22ca4553e
--- /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 0000000000000000000000000000000000000000..b927355df441e39ce66c8525523dbe592d1f2d97
--- /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 0000000000000000000000000000000000000000..c39012e9e737a6c38a42deb0c22ca3cafd1f232e
--- /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 0000000000000000000000000000000000000000..c206217b5f693ccd754ddce098016eb37e73bf30
--- /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 0000000000000000000000000000000000000000..c541b600f85aaaa65bda1bfbbb50cefc7a0daff5
--- /dev/null
+++ b/Examples/Tests/Blur.js
@@ -0,0 +1,53 @@
+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 || 0);
+ }
+}
+
+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 0000000000000000000000000000000000000000..39b9a05972bd1ff94366c428118b4f62880beb64
--- /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 0000000000000000000000000000000000000000..74939fc297b0819508cc0338791888b5ec47dfe3
--- /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 0000000000000000000000000000000000000000..84393e1783408a0642f760443574222f3fa4dea3
--- /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 0000000000000000000000000000000000000000..e495b69acaa3c0c4c690cd28465aab561aa4ba6b
--- /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 0000000000000000000000000000000000000000..44e7bd423acaf1391fdd1bb36af1e9d320484431
--- /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 0000000000000000000000000000000000000000..85a1280ad9e310309eb6aea6f57a347ef50e2007
--- /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 0000000000000000000000000000000000000000..2e65a43b3eea10ccfcb594fbb467f8c6aa061cd0
--- /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 0000000000000000000000000000000000000000..a9654d5e01b18c52fc334bdec2a796ce7e055dbf
--- /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 0000000000000000000000000000000000000000..1f1e1dd4f44a1eee95b5df4649bfda406e1d773c
--- /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 0000000000000000000000000000000000000000..a774c3c7ea9de59d4e9b91d75136816d7bf6d194
--- /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 0000000000000000000000000000000000000000..118c98f7461bf98b2bc7e061150d8021121ad277
--- /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 0000000000000000000000000000000000000000..cddf0766c98062f1dd64392a23039b111ccaaf59
--- /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 0000000000000000000000000000000000000000..b702b30c66dc4c7ac8c9313cbed231d094bf9338
--- /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 0000000000000000000000000000000000000000..3d767fcbb9fced39e810debe402ff7f1ed523d34
--- /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 0000000000000000000000000000000000000000..886825ccc9bf0da2b9bfb8d8ebf0737db7ca1114
--- /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 0000000000000000000000000000000000000000..318f1bb67b3f5b9f07ad0539b1d4d08404f1e988
--- /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 0000000000000000000000000000000000000000..fa78cea0128e346b980aa3103228f625f41391f2
--- /dev/null
+++ b/Examples/Tests/index.ios.js
@@ -0,0 +1,85 @@
+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");
+
+class Tests extends React.Component {
+
+ constructor (props) {
+ super(props);
+ this.onLoad = this.onLoad.bind(this);
+ this.onProgress = this.onProgress.bind(this);
+ }
+ onLoad () {
+ console.log("LOADED");
+ }
+ onProgress ({nativeEvent: { progress, loaded, total }}) {
+ console.log("PROGRESS", progress, loaded, total);
+ }
+ render () {
+ const helloGL =
+ ;
+
+ const txt =
+
+ {[0,1,2,3].map(i =>
+ Hello World {i}
+ )}
+ ;
+
+ const img = "http://i.imgur.com/zJIxPEo.jpg?t="+Date.now();
+
+ 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 0000000000000000000000000000000000000000..405c8651f1aef91c221a87de17b76e6f35b5fa5b
--- /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 90090f1813a4a204b9556d3cef19be10c2b556e0..7a8019e0f5da225a9365ba0f7f3f90a103d6c229 100644
--- a/RNGL/GLCanvas.h
+++ b/RNGL/GLCanvas.h
@@ -5,10 +5,13 @@
@property (nonatomic) GLData *data;
@property (nonatomic) BOOL opaque;
-@property (nonatomic) NSNumber *nbTargets;
+@property (nonatomic) NSNumber *nbContentTextures;
@property (nonatomic) NSNumber *renderId;
+@property (nonatomic) NSArray *imagesToPreload;
+@property (nonatomic, assign) BOOL onProgress;
+@property (nonatomic, assign) BOOL onLoad;
- (instancetype)initWithBridge:(RCTBridge *)bridge
- withContext:(EAGLContext*)context;
+ withContext:(EAGLContext *)context;
@end
diff --git a/RNGL/GLCanvas.m b/RNGL/GLCanvas.m
index c36af0802bb721744851d33eb55762845d60da0a..a501b60c439b4a2c07b52a6bda8974fcfe1ef942 100644
--- a/RNGL/GLCanvas.m
+++ b/RNGL/GLCanvas.m
@@ -2,6 +2,7 @@
#import "RCTBridge.h"
#import "RCTUtils.h"
#import "RCTConvert.h"
+#import "RCTEventDispatcher.h"
#import "RCTLog.h"
#import "GLCanvas.h"
#import "GLShader.h"
@@ -9,31 +10,37 @@
#import "GLTexture.h"
#import "GLImage.h"
#import "GLRenderData.h"
+#import "UIView+React.h"
// For reference, see implementation of gl-shader's GLCanvas
@implementation GLCanvas
{
RCTBridge *_bridge; // bridge is required to instanciate GLReactImage
-
+
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;
+
+ NSMutableArray *_preloaded;
+ BOOL _preloadingDone;
}
- (instancetype)initWithBridge:(RCTBridge *)bridge
- withContext:(EAGLContext*)context
+ withContext:(EAGLContext *)context
{
if ((self = [super init])) {
_bridge = bridge;
_images = @{};
+ _preloaded = [[NSMutableArray alloc] init];
+ _preloadingDone = false;
self.context = context;
}
return self;
@@ -41,6 +48,38 @@
RCT_NOT_IMPLEMENTED(-init)
+-(void)setImagesToPreload:(NSArray *)imagesToPreload
+{
+ if (_preloadingDone) return;
+ if ([imagesToPreload count] == 0) {
+ [self dispatchOnLoad];
+ _preloadingDone = true;
+ }
+ else {
+ _preloadingDone = false;
+ }
+ _imagesToPreload = imagesToPreload;
+}
+
+- (void)dispatchOnLoad
+{
+ if (_onLoad) {
+ [_bridge.eventDispatcher sendInputEventWithName:@"load" body:@{ @"target": self.reactTag }];
+ }
+}
+
+- (void)dispatchOnProgress: (double)progress withLoaded:(int)loaded withTotal:(int)total
+{
+ if (_onProgress) {
+ NSDictionary *event =
+ @{
+ @"target": self.reactTag,
+ @"progress": @(progress),
+ @"loaded": @(loaded),
+ @"total": @(total) };
+ [_bridge.eventDispatcher sendInputEventWithName:@"progress" body:event];
+ }
+}
- (void)setOpaque:(BOOL)opaque
{
@@ -63,7 +102,7 @@ NSString* srcResource (id res)
- (void)setRenderId:(NSNumber *)renderId
{
- if (_nbTargets > 0) {
+ if (_nbContentTextures > 0) {
[self setNeedsDisplay];
}
}
@@ -83,27 +122,25 @@ NSString* srcResource (id res)
{
[EAGLContext setCurrentContext:self.context];
@autoreleasepool {
-
+
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 +156,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];
}
@@ -137,7 +174,7 @@ NSString* srcResource (id res)
if (!src) {
RCTLogError(@"invalid uniform '%@' texture value '%@'", uniformName, value);
}
-
+
GLImage *image = images[src];
if (image == nil) {
image = prevImages[src];
@@ -146,7 +183,7 @@ NSString* srcResource (id res)
}
if (image == nil) {
image = [[GLImage alloc] initWithBridge:_bridge withOnLoad:^{
- [self setNeedsDisplay];
+ [self onImageLoad:src];
}];
image.src = src;
images[src] = image;
@@ -173,48 +210,89 @@ NSString* srcResource (id res)
RCTLogError(@"All defined uniforms must be provided. Missing '%@'", uniformName);
}
}
-
- 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
+- (int)countPreloaded
+{
+ int nb = 0;
+ for (id toload in _imagesToPreload) {
+ if ([_preloaded containsObject:srcResource(toload)])
+ nb++;
+ }
+ return nb;
+}
+
+- (void)onImageLoad:(NSString *)loaded
+{
+ if (!_preloadingDone) {
+ [_preloaded addObject:loaded];
+ int count = [self countPreloaded];
+ int total = (int) [_imagesToPreload count];
+ double progress = ((double) count) / ((double) total);
+ [self dispatchOnProgress:progress withLoaded:count withTotal:total];
+ if (count == total) {
+ [self dispatchOnLoad];
+ _preloadingDone = true;
+ [self requestSyncData];
+ }
+ }
+ else {
+ // Any texture image load will trigger a future re-sync of data (if no preloaded)
+ [self requestSyncData];
+ }
+}
+
+- (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 +302,12 @@ NSString* srcResource (id res)
- (void)drawRect:(CGRect)rect
{
- BOOL needsDeferredRendering = _nbTargets > 0;
+ if (!_preloadingDone) {
+ glClearColor(0.0, 0.0, 0.0, 0.0);
+ glClear(GL_COLOR_BUFFER_BIT);
+ return;
+ }
+ BOOL needsDeferredRendering = _nbContentTextures > 0;
if (needsDeferredRendering && !_deferredRendering) {
dispatch_async(dispatch_get_main_queue(), ^{
_deferredRendering = true;
@@ -252,15 +335,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 +371,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 201ab2d239de1c9f3fd38fee33356b45569edd61..d3c934c2e496703c4785c28ea1d865661494c4b8 100644
--- a/RNGL/GLCanvasManager.m
+++ b/RNGL/GLCanvasManager.m
@@ -18,10 +18,13 @@ 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);
+RCT_EXPORT_VIEW_PROPERTY(onLoad, BOOL);
+RCT_EXPORT_VIEW_PROPERTY(onProgress, BOOL);
- (UIView *)view
{
diff --git a/RNGL/GLData.h b/RNGL/GLData.h
index 9717c2fe13f7ae5a56933a953e6801638adfb06a..610261f101d699a562ee315a5f0e20cf19050280 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 0146aacf57d44c6e1f26f5afb1e1868c41c7bd27..246685431b6c4b4b8181950600ab8f28282ac212 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/GLImage.m b/RNGL/GLImage.m
index 53334fcae9583b97e70f4ebd2ab3058268d8b94c..9635e2d4545b18217aa64a02c672c19ff3c065fb 100644
--- a/RNGL/GLImage.m
+++ b/RNGL/GLImage.m
@@ -80,7 +80,9 @@ RCT_NOT_IMPLEMENTED(-init)
if (![_src hasPrefix:@"http://"] && ![_src hasPrefix:@"https://"]) {
self.image = [UIImage imageNamed:_src];
- if(_onload) _onload();
+ dispatch_async(dispatch_get_main_queue(), ^{
+ if (_onload) _onload();
+ });
} else {
_loading = [_bridge.imageLoader loadImageWithTag:_src
size:CGSizeZero
diff --git a/RNGL/GLRenderData.h b/RNGL/GLRenderData.h
index d1a83019d9a05a1a53cca556a9beea3cbedd990d..44ecf9d2fe03aa86509f21c650e658791bcde221 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 28d6550cc92c0ad3a95b9fd58d31dc4a2a73e3f6..f4b6721c6ec01c8eeecf037813ed5a5f8e02633f 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 3172cb7917ece6da1f3053ef21be494c6eec4ea3..e65f49cd84f828339c39663fbdfffb8900124148 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/package.json b/package.json
index 9c0e2f46b25c7db7982d19e867c16972ff68f363..f87974b8eaa0e4813d31587dfef279e7f26e44dc 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "gl-react-native",
- "version": "0.1.7",
+ "version": "1.0.0-rc1",
"description": "OpenGL bindings for react-native to implement complex effects over images and components, in the descriptive VDOM paradigm",
"main": "src/index.js",
"repository": {
@@ -25,7 +25,7 @@
"dependencies": {
"invariant": "2.1.0",
"react-native": ">=0.9.0 <0.11.0",
- "gl-react-core": "^0.1.1"
+ "gl-react-core": "1.0.0-rc1"
},
"devDependencies": {
"eslint": "^1.3.1",
diff --git a/src/Target.js b/src/Target.js
deleted file mode 100644
index c571a17bb25da9b77edf7aac0aee614b2413aa92..0000000000000000000000000000000000000000
--- 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 0000000000000000000000000000000000000000..b5bc1c2c08e88591bd49f2edf5afad9f470dab6d
--- /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 46130443f1e15f921ac9202dd51ea8192e3b3b47..4227fc75e95f6cfbd0ee5c31151768c958fbbd15 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 31468fd08d38b3a43f764792ceab5554230a5fa4..37c3339b44799eda08d79004dd0e47a80783e27e 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
};