diff --git a/Examples/AdvancedEffects/.eslintrc b/.eslintrc
similarity index 100%
rename from Examples/AdvancedEffects/.eslintrc
rename to .eslintrc
diff --git a/Examples/AdvancedEffects/package.json b/Examples/AdvancedEffects/package.json
index c2fa6aa52c6f3bf76c32cfa810ae7669765afe87..a63afd1f5c47763fb574e2ea94c8ec7b4a426857 100644
--- a/Examples/AdvancedEffects/package.json
+++ b/Examples/AdvancedEffects/package.json
@@ -9,9 +9,5 @@
"gl-react-native": "../..",
"glsl-transitions": "^2015.8.17",
"react-native": "^0.9.0"
- },
- "devDependencies": {
- "eslint": "^1.1.0",
- "eslint-plugin-react": "^3.2.3"
}
}
diff --git a/Examples/Simple/.flowconfig b/Examples/Simple/.flowconfig
new file mode 100644
index 0000000000000000000000000000000000000000..8989253d43ac5e1bc1ef96cc48dbf7545fa32648
--- /dev/null
+++ b/Examples/Simple/.flowconfig
@@ -0,0 +1,47 @@
+[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/reconciler/ReactInstanceHandles.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/renderers/shared/event/eventPlugins/ResponderSyntheticEvent.js
+.*/node_modules/react-tools/src/renderers/shared/event/eventPlugins/ResponderTouchHistoryStore.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
+
+suppress_type=$FlowIssue
+suppress_type=$FlowFixMe
+suppress_type=$FixMe
+
+suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(>=0\\.\\(1[0-3]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)
+suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(>=0\\.\\(1[0-3]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)? #[0-9]+
+suppress_comment=\\(.\\|\n\\)*\\$FlowFixedInNextDeploy
+
+[version]
+0.13.1
diff --git a/Examples/Simple/.gitignore b/Examples/Simple/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..b927355df441e39ce66c8525523dbe592d1f2d97
--- /dev/null
+++ b/Examples/Simple/.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/Simple/.npmignore b/Examples/Simple/.npmignore
new file mode 100644
index 0000000000000000000000000000000000000000..c39012e9e737a6c38a42deb0c22ca3cafd1f232e
--- /dev/null
+++ b/Examples/Simple/.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/Simple/HelloGL.js b/Examples/Simple/HelloGL.js
new file mode 100644
index 0000000000000000000000000000000000000000..76530bfa5fa82af45b4f9067cc9d390682c10cda
--- /dev/null
+++ b/Examples/Simple/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 React.Component {
+ render () {
+ const { width, height } = this.props;
+ return ;
+ }
+}
+
+module.exports = HelloGL;
diff --git a/Examples/Simple/Sepia.js b/Examples/Simple/Sepia.js
new file mode 100644
index 0000000000000000000000000000000000000000..9c4b301bbe6e84ac3f1b6dbe82a14795ae28247b
--- /dev/null
+++ b/Examples/Simple/Sepia.js
@@ -0,0 +1,34 @@
+const React = require("react-native");
+const GL = require("gl-react-native");
+
+const shaders = GL.Shaders.create({
+ sepia: {
+ frag: `
+precision highp float;
+varying vec2 uv;
+uniform sampler2D image;
+uniform float factor;
+
+const vec3 sepia = vec3(0.44, 0.26, 0.08);
+
+void main () {
+ vec4 c = texture2D(image, uv);
+ gl_FragColor = vec4(mix(c.rgb, sepia, factor), c.a);
+}
+ `
+ }
+});
+
+class Sepia extends React.Component {
+ render () {
+ const { width, height, factor, image } = this.props;
+ return ;
+ }
+}
+
+module.exports = Sepia;
diff --git a/Examples/Simple/Simple.xcodeproj/project.pbxproj b/Examples/Simple/Simple.xcodeproj/project.pbxproj
new file mode 100644
index 0000000000000000000000000000000000000000..bbece9aa727b2a043e66d678b95d247c8c060b33
--- /dev/null
+++ b/Examples/Simple/Simple.xcodeproj/project.pbxproj
@@ -0,0 +1,790 @@
+// !$*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 /* SimpleTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* SimpleTests.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 */; };
+ 34807FB71B838E5100EF7400 /* libRNGL.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 34807FB41B838E4300EF7400 /* 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 = Simple;
+ };
+ 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;
+ };
+ 34807FB31B838E4300EF7400 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 34807FA41B838E4300EF7400 /* RNGL.xcodeproj */;
+ proxyType = 2;
+ remoteGlobalIDString = 34B330031B821571003856F8;
+ remoteInfo = RNGL;
+ };
+ 34807FB51B838E4300EF7400 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 34807FA41B838E4300EF7400 /* 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; name = main.jsbundle; path = iOS/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 /* SimpleTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SimpleTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
+ 00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+ 00E356F21AD99517003FC87E /* SimpleTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SimpleTests.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 /* Simple.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Simple.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = iOS/AppDelegate.h; sourceTree = ""; };
+ 13B07FB01A68108700A75B9A /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = iOS/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; name = Images.xcassets; path = iOS/Images.xcassets; sourceTree = ""; };
+ 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = iOS/Info.plist; sourceTree = ""; };
+ 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = iOS/main.m; sourceTree = ""; };
+ 146833FF1AC3E56700842450 /* React.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = React.xcodeproj; path = "node_modules/react-native/React/React.xcodeproj"; sourceTree = ""; };
+ 34807FA41B838E4300EF7400 /* 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 = (
+ 34807FB71B838E5100EF7400 /* 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 /* SimpleTests */ = {
+ isa = PBXGroup;
+ children = (
+ 00E356F21AD99517003FC87E /* SimpleTests.m */,
+ 00E356F01AD99517003FC87E /* Supporting Files */,
+ );
+ path = SimpleTests;
+ 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 /* Simple */ = {
+ isa = PBXGroup;
+ children = (
+ 008F07F21AC5B25A0029DE68 /* main.jsbundle */,
+ 13B07FAF1A68108700A75B9A /* AppDelegate.h */,
+ 13B07FB01A68108700A75B9A /* AppDelegate.m */,
+ 13B07FB51A68108700A75B9A /* Images.xcassets */,
+ 13B07FB61A68108700A75B9A /* Info.plist */,
+ 13B07FB11A68108700A75B9A /* LaunchScreen.xib */,
+ 13B07FB71A68108700A75B9A /* main.m */,
+ );
+ name = Simple;
+ sourceTree = "";
+ };
+ 146834001AC3E56700842450 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 146834041AC3E56700842450 /* libReact.a */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ 34807FA51B838E4300EF7400 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 34807FB41B838E4300EF7400 /* libRNGL.a */,
+ 34807FB61B838E4300EF7400 /* RNGLTests.xctest */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ 78C398B11ACF4ADC00677621 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 78C398B91ACF4ADC00677621 /* libRCTLinking.a */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ 832341AE1AAA6A7D00B99B32 /* Libraries */ = {
+ isa = PBXGroup;
+ children = (
+ 34807FA41B838E4300EF7400 /* 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 /* Simple */,
+ 832341AE1AAA6A7D00B99B32 /* Libraries */,
+ 00E356EF1AD99517003FC87E /* SimpleTests */,
+ 83CBBA001A601CBA00E9B192 /* Products */,
+ );
+ indentWidth = 2;
+ sourceTree = "";
+ tabWidth = 2;
+ };
+ 83CBBA001A601CBA00E9B192 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 13B07F961A680F5B00A75B9A /* Simple.app */,
+ 00E356EE1AD99517003FC87E /* SimpleTests.xctest */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 00E356ED1AD99517003FC87E /* SimpleTests */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "SimpleTests" */;
+ buildPhases = (
+ 00E356EA1AD99517003FC87E /* Sources */,
+ 00E356EB1AD99517003FC87E /* Frameworks */,
+ 00E356EC1AD99517003FC87E /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 00E356F51AD99517003FC87E /* PBXTargetDependency */,
+ );
+ name = SimpleTests;
+ productName = SimpleTests;
+ productReference = 00E356EE1AD99517003FC87E /* SimpleTests.xctest */;
+ productType = "com.apple.product-type.bundle.unit-test";
+ };
+ 13B07F861A680F5B00A75B9A /* Simple */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "Simple" */;
+ buildPhases = (
+ 13B07F871A680F5B00A75B9A /* Sources */,
+ 13B07F8C1A680F5B00A75B9A /* Frameworks */,
+ 13B07F8E1A680F5B00A75B9A /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = Simple;
+ productName = "Hello World";
+ productReference = 13B07F961A680F5B00A75B9A /* Simple.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 "Simple" */;
+ 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 = 34807FA51B838E4300EF7400 /* Products */;
+ ProjectRef = 34807FA41B838E4300EF7400 /* RNGL.xcodeproj */;
+ },
+ );
+ projectRoot = "";
+ targets = (
+ 13B07F861A680F5B00A75B9A /* Simple */,
+ 00E356ED1AD99517003FC87E /* SimpleTests */,
+ );
+ };
+/* 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;
+ };
+ 34807FB41B838E4300EF7400 /* libRNGL.a */ = {
+ isa = PBXReferenceProxy;
+ fileType = archive.ar;
+ path = libRNGL.a;
+ remoteRef = 34807FB31B838E4300EF7400 /* PBXContainerItemProxy */;
+ sourceTree = BUILT_PRODUCTS_DIR;
+ };
+ 34807FB61B838E4300EF7400 /* RNGLTests.xctest */ = {
+ isa = PBXReferenceProxy;
+ fileType = wrapper.cfbundle;
+ path = RNGLTests.xctest;
+ remoteRef = 34807FB51B838E4300EF7400 /* 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 /* SimpleTests.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 /* Simple */;
+ targetProxy = 00E356F41AD99517003FC87E /* PBXContainerItemProxy */;
+ };
+/* End PBXTargetDependency section */
+
+/* Begin PBXVariantGroup section */
+ 13B07FB11A68108700A75B9A /* LaunchScreen.xib */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 13B07FB21A68108700A75B9A /* Base */,
+ );
+ name = LaunchScreen.xib;
+ path = iOS;
+ 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 = SimpleTests/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)/Simple.app/Simple";
+ };
+ 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 = SimpleTests/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)/Simple.app/Simple";
+ };
+ 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 = iOS/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
+ OTHER_LDFLAGS = "-ObjC";
+ PRODUCT_NAME = Simple;
+ };
+ 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 = iOS/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
+ OTHER_LDFLAGS = "-ObjC";
+ PRODUCT_NAME = Simple;
+ };
+ 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 "SimpleTests" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 00E356F61AD99517003FC87E /* Debug */,
+ 00E356F71AD99517003FC87E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "Simple" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 13B07F941A680F5B00A75B9A /* Debug */,
+ 13B07F951A680F5B00A75B9A /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "Simple" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 83CBBA201A601CBA00E9B192 /* Debug */,
+ 83CBBA211A601CBA00E9B192 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */;
+}
diff --git a/Examples/Simple/Simple.xcodeproj/xcshareddata/xcschemes/Simple.xcscheme b/Examples/Simple/Simple.xcodeproj/xcshareddata/xcschemes/Simple.xcscheme
new file mode 100644
index 0000000000000000000000000000000000000000..d4b3740a0dbf2541df5891ddf7f705adb874e98c
--- /dev/null
+++ b/Examples/Simple/Simple.xcodeproj/xcshareddata/xcschemes/Simple.xcscheme
@@ -0,0 +1,112 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Examples/Simple/SimpleTests/Info.plist b/Examples/Simple/SimpleTests/Info.plist
new file mode 100644
index 0000000000000000000000000000000000000000..886825ccc9bf0da2b9bfb8d8ebf0737db7ca1114
--- /dev/null
+++ b/Examples/Simple/SimpleTests/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/Simple/SimpleTests/SimpleTests.m b/Examples/Simple/SimpleTests/SimpleTests.m
new file mode 100644
index 0000000000000000000000000000000000000000..4c8a242758bfbcf6b614eaf9894c9a14f57aed56
--- /dev/null
+++ b/Examples/Simple/SimpleTests/SimpleTests.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 SimpleTests : XCTestCase
+
+@end
+
+@implementation SimpleTests
+
+
+- (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/Simple/iOS/AppDelegate.h b/Examples/Simple/iOS/AppDelegate.h
new file mode 100644
index 0000000000000000000000000000000000000000..a9654d5e01b18c52fc334bdec2a796ce7e055dbf
--- /dev/null
+++ b/Examples/Simple/iOS/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/Simple/iOS/AppDelegate.m b/Examples/Simple/iOS/AppDelegate.m
new file mode 100644
index 0000000000000000000000000000000000000000..d4e640210e4b6fbdaf5627e6e174c1cd65adee67
--- /dev/null
+++ b/Examples/Simple/iOS/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:@"Simple"
+ 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/Simple/iOS/Base.lproj/LaunchScreen.xib b/Examples/Simple/iOS/Base.lproj/LaunchScreen.xib
new file mode 100644
index 0000000000000000000000000000000000000000..fa2518f3c6bbe1791349b7a506e1a75fd7261be8
--- /dev/null
+++ b/Examples/Simple/iOS/Base.lproj/LaunchScreen.xib
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Examples/Simple/iOS/Images.xcassets/AppIcon.appiconset/Contents.json b/Examples/Simple/iOS/Images.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 0000000000000000000000000000000000000000..118c98f7461bf98b2bc7e061150d8021121ad277
--- /dev/null
+++ b/Examples/Simple/iOS/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/Simple/iOS/Info.plist b/Examples/Simple/iOS/Info.plist
new file mode 100644
index 0000000000000000000000000000000000000000..ceb55dcb24d6c3fe5e458066551cd660039ad013
--- /dev/null
+++ b/Examples/Simple/iOS/Info.plist
@@ -0,0 +1,45 @@
+
+
+
+
+ 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
+
+ NSAppTransportSecurity
+
+ NSAllowsArbitraryLoads
+
+
+ NSLocationWhenInUseUsageDescription
+
+ UILaunchStoryboardName
+ LaunchScreen
+ UIRequiredDeviceCapabilities
+
+ armv7
+
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+
+ UIViewControllerBasedStatusBarAppearance
+
+
+
diff --git a/Examples/Simple/iOS/main.jsbundle b/Examples/Simple/iOS/main.jsbundle
new file mode 100644
index 0000000000000000000000000000000000000000..b702b30c66dc4c7ac8c9313cbed231d094bf9338
--- /dev/null
+++ b/Examples/Simple/iOS/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/Simple/iOS/main.m b/Examples/Simple/iOS/main.m
new file mode 100644
index 0000000000000000000000000000000000000000..3d767fcbb9fced39e810debe402ff7f1ed523d34
--- /dev/null
+++ b/Examples/Simple/iOS/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/Simple/index.ios.js b/Examples/Simple/index.ios.js
new file mode 100644
index 0000000000000000000000000000000000000000..dc772089cb6933a1dc35d22e9e0591052313172e
--- /dev/null
+++ b/Examples/Simple/index.ios.js
@@ -0,0 +1,62 @@
+const React = require("react-native");
+const {
+ AppRegistry,
+ StyleSheet,
+ Text,
+ View,
+ ScrollView,
+} = React;
+
+const HelloGL = require("./HelloGL");
+const Sepia = require("./Sepia");
+
+const Simple = React.createClass({
+ render: function() {
+ return
+
+ Welcome to GL React Native!
+
+
+ 1. Hello GL
+
+
+
+
+ 2. Sepia on an Image
+
+
+
+
+ ;
+ }
+});
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ backgroundColor: "#fff",
+ },
+ title: {
+ fontSize: 20,
+ textAlign: "center",
+ margin: 5,
+ marginBottom: 20,
+ fontWeight: "bold"
+ },
+ demos: {
+ flex: 1,
+ justifyContent: "center",
+ alignItems: "center",
+ },
+ demoTitle: {
+ fontSize: 20,
+ margin: 5,
+ fontStyle: "italic"
+ },
+});
+
+AppRegistry.registerComponent("Simple", () => Simple);
diff --git a/Examples/Simple/package.json b/Examples/Simple/package.json
new file mode 100644
index 0000000000000000000000000000000000000000..25bf40762b2e42a7e5b184349e62273a462a5c86
--- /dev/null
+++ b/Examples/Simple/package.json
@@ -0,0 +1,12 @@
+{
+ "name": "Simple",
+ "version": "0.0.1",
+ "private": true,
+ "scripts": {
+ "start": "node_modules/react-native/packager/packager.sh"
+ },
+ "dependencies": {
+ "gl-react-native": "file:../..",
+ "react-native": "^0.9.0"
+ }
+}
diff --git a/README.md b/README.md
index b00db60693c6ab8ecbbd8783546885a01668b363..16994300c923003bea0c2f52c3f9612ccad3d13e 100644
--- a/README.md
+++ b/README.md
@@ -2,31 +2,43 @@
`gl-react-native` implements OpenGL bindings for react-native.
-It lets you implements complex effects on top of images and components
+It lets you implement complex effects on top of images and components
and in the Virtual DOM descriptive paradigm.
-More technically, `gl-react-native` allows you to write a fragment shader that renders either: in a standalone way, using images, or over any UI content.
+More technically, `gl-react-native` allows you to write a fragment shader that covers a View. This shader can render: some graphics/demos, any effects over images, any effects over any UI content.
A React version also exists: [`gl-react`](http://github.com/ProjectSeptemberInc/gl-react).
+## Focus
+
+- **Virtual DOM and immutable** paradigm: OpenGL is a low level imperative and mutable API. This library takes the best of it to expose it in a immutable and descriptive way.
+- **Performance**
+- **Developer experience**: the application does not crash if developer make mistakes, it uses React Native error message to display GLSL errors and help him developing the effects with Live Reload support.
+- **Uniform bindings**: The library implements binding from the JavaScript objects to the OpenGL GLSL language types (bool, int, float, vec2, vec3, vec4, mat2, mat3, mat4, sampler2D...)
+- **Support for images** as texture uniform.
+- **Support for UIView rasterisation** as a texture uniform.
+
## Installation
-a few steps are required to install gl-react-native:
+a few steps are required to install `gl-react-native`:
-### install the dependency from your React Native application.
+**Install the dependency from your React Native application:**
```
npm i --save gl-react-native
```
-### Configure your React Native Application
+**Configure your React Native Application:**

-## Credits / Inspiration
+## Influence / Credits
- [stack.gl](http://stack.gl/) approach
- [GLSL.io](http://glsl.io/) and [Diaporama](https://github.com/gre/diaporama)
- Source code of [React Native](https://github.com/facebook/react-native)
+
+
+## Documentation
diff --git a/RNGL/GLShader.h b/RNGL/GLShader.h
index 00ef044823f0503c4dcec524f9e16174b7b14216..2983552720cba3f4efdcc0c36ad32c67209842a0 100644
--- a/RNGL/GLShader.h
+++ b/RNGL/GLShader.h
@@ -11,7 +11,7 @@
/**
* Create a new shader with a vertex and fragment
*/
-- (instancetype)initWithContext: (EAGLContext*)context withVert:(NSString *)vert withFrag:(NSString *)frag;
+- (instancetype)initWithContext: (EAGLContext*)context withName:(NSString *)name withVert:(NSString *)vert withFrag:(NSString *)frag;
/**
* Bind the shader program as the current one
diff --git a/RNGL/GLShader.m b/RNGL/GLShader.m
index b2094e8fc7a0922fb65d0a35462ea1b390d52b8d..65c99d0424730e2c051f68545b34c0e0538248a3 100644
--- a/RNGL/GLShader.m
+++ b/RNGL/GLShader.m
@@ -12,6 +12,7 @@
*/
@implementation GLShader
{
+ NSString *_name;
EAGLContext *_context; // Context related to this shader
GLuint program; // Program of the shader
GLuint buffer; // the buffer currently contains 2 static triangles covering the surface
@@ -20,10 +21,11 @@
NSDictionary *_uniformLocations; // The uniform locations cache
}
-- (instancetype)initWithContext: (EAGLContext*)context withVert:(NSString *)vert withFrag:(NSString *)frag
+- (instancetype)initWithContext: (EAGLContext*)context withName:(NSString *)name withVert:(NSString *)vert withFrag:(NSString *)frag
{
self = [super init];
if (self) {
+ _name = name;
_context = context;
_vert = vert;
_frag = frag;
@@ -41,7 +43,7 @@
- (bool) ensureContext
{
if (![EAGLContext setCurrentContext:_context]) {
- RCTLogError(@"Failed to set current OpenGL context");
+ RCTLogError(@"Shader '%@': Failed to set current OpenGL context", _name);
return false;
}
return true;
@@ -51,7 +53,7 @@
{
if (![self ensureContext]) return;
if ( glIsProgram(program) != GL_TRUE ){
- RCTLogError(@"not a program!");
+ RCTLogError(@"Shader '%@': not a program!", _name);
return;
}
glUseProgram(program);
@@ -63,7 +65,7 @@
- (void) setUniform: (NSString *)name withValue:(id)value
{
if ([_uniformLocations objectForKey:name] == nil) {
- RCTLogError(@"uniform '%@' does not exist", name);
+ RCTLogError(@"Shader '%@': uniform '%@' does not exist", _name, name);
return;
}
GLint location = [_uniformLocations[name] intValue];
@@ -74,7 +76,7 @@
case GL_FLOAT: {
NSNumber *v = [RCTConvert NSNumber:value];
if (!v) {
- RCTLogError(@"uniform '%@' should be a float", name);
+ RCTLogError(@"Shader '%@': uniform '%@' should be a float", _name, name);
return;
}
glUniform1f(location, [v floatValue]);
@@ -84,7 +86,7 @@
case GL_INT: {
NSNumber *v = [RCTConvert NSNumber:value];
if (!v) {
- RCTLogError(@"uniform '%@' should be a int", name);
+ RCTLogError(@"Shader '%@': uniform '%@' should be a int", _name, name);
return;
}
glUniform1i(location, [v intValue]);
@@ -100,14 +102,14 @@
case GL_FLOAT_VEC2: {
NSArray *v = [RCTConvert NSArray:value];
if (!v || [v count]!=2) {
- RCTLogError(@"uniform '%@' should be an array of 2 numbers", name);
+ RCTLogError(@"Shader '%@': uniform '%@' should be an array of 2 numbers", _name, name);
return;
}
GLfloat arr[2];
for (int i=0; i<2; i++) {
NSNumber *n = [RCTConvert NSNumber: v[i]];
if (!n) {
- RCTLogError(@"uniform '%@' array should only contains numbers", name);
+ RCTLogError(@"Shader '%@': uniform '%@' array should only contains numbers", _name, name);
return;
}
arr[i] = [n floatValue];
@@ -119,14 +121,14 @@
case GL_FLOAT_VEC3: {
NSArray *v = [RCTConvert NSArray:value];
if (!v || [v count]!=3) {
- RCTLogError(@"uniform '%@' should be an array of 3 numbers", name);
+ RCTLogError(@"Shader '%@': uniform '%@' should be an array of 3 numbers", _name, name);
return;
}
GLfloat arr[3];
for (int i=0; i<3; i++) {
NSNumber *n = [RCTConvert NSNumber: v[i]];
if (!n) {
- RCTLogError(@"uniform '%@' array should only contains numbers", name);
+ RCTLogError(@"Shader '%@': uniform '%@' array should only contains numbers", _name, name);
return;
}
arr[i] = [n floatValue];
@@ -138,14 +140,14 @@
case GL_FLOAT_VEC4: {
NSArray *v = [RCTConvert NSArray:value];
if (!v || [v count]!=4) {
- RCTLogError(@"uniform '%@' should be an array of 4 numbers", name);
+ RCTLogError(@"Shader '%@': uniform '%@' should be an array of 4 numbers", _name, name);
return;
}
GLfloat arr[4];
for (int i=0; i<4; i++) {
NSNumber *n = [RCTConvert NSNumber: v[i]];
if (!n) {
- RCTLogError(@"uniform '%@' array should only contains numbers", name);
+ RCTLogError(@"Shader '%@': uniform '%@' array should only contains numbers", _name, name);
return;
}
arr[i] = [n floatValue];
@@ -158,14 +160,14 @@
case GL_INT_VEC2: {
NSArray *v = [RCTConvert NSArray:value];
if (!v || [v count]!=2) {
- RCTLogError(@"uniform '%@' should be an array of 2 numbers", name);
+ RCTLogError(@"Shader '%@': uniform '%@' should be an array of 2 numbers", _name, name);
return;
}
GLint arr[2];
for (int i=0; i<2; i++) {
NSNumber *n = [RCTConvert NSNumber: v[i]];
if (!n) {
- RCTLogError(@"uniform '%@' array should only contains numbers", name);
+ RCTLogError(@"Shader '%@': uniform '%@' array should only contains numbers", _name, name);
return;
}
arr[i] = [n intValue];
@@ -178,14 +180,14 @@
case GL_INT_VEC3: {
NSArray *v = [RCTConvert NSArray:value];
if (!v || [v count]!=3) {
- RCTLogError(@"uniform '%@' should be an array of 3 numbers", name);
+ RCTLogError(@"Shader '%@': uniform '%@' should be an array of 3 numbers", _name, name);
return;
}
GLint arr[3];
for (int i=0; i<3; i++) {
NSNumber *n = [RCTConvert NSNumber: v[i]];
if (!n) {
- RCTLogError(@"uniform '%@' array should only contains numbers", name);
+ RCTLogError(@"Shader '%@': uniform '%@' array should only contains numbers", _name, name);
return;
}
arr[i] = [n intValue];
@@ -198,14 +200,14 @@
case GL_INT_VEC4: {
NSArray *v = [RCTConvert NSArray:value];
if (!v || [v count]!=4) {
- RCTLogError(@"uniform '%@' should be an array of 4 numbers", name);
+ RCTLogError(@"Shader '%@': uniform '%@' should be an array of 4 numbers", _name, name);
return;
}
GLint arr[4];
for (int i=0; i<4; i++) {
NSNumber *n = [RCTConvert NSNumber: v[i]];
if (!n) {
- RCTLogError(@"uniform '%@' array should only contains numbers", name);
+ RCTLogError(@"Shader '%@': uniform '%@' array should only contains numbers", _name, name);
return;
}
arr[i] = [n intValue];
@@ -217,14 +219,14 @@
case GL_FLOAT_MAT2: {
NSArray *v = [RCTConvert NSArray:value];
if (!v || [v count]!=4) {
- RCTLogError(@"uniform '%@' should be an array of 4 numbers (matrix)", name);
+ RCTLogError(@"Shader '%@': uniform '%@' should be an array of 4 numbers (matrix)", _name, name);
return;
}
GLfloat arr[4];
for (int i=0; i<4; i++) {
NSNumber *n = [RCTConvert NSNumber: v[i]];
if (!n) {
- RCTLogError(@"uniform '%@' array should only contains numbers", name);
+ RCTLogError(@"Shader '%@': uniform '%@' array should only contains numbers", _name, name);
return;
}
arr[i] = [n floatValue];
@@ -236,14 +238,14 @@
case GL_FLOAT_MAT3: {
NSArray *v = [RCTConvert NSArray:value];
if (!v || [v count]!=9) {
- RCTLogError(@"uniform '%@' should be an array of 9 numbers (matrix)", name);
+ RCTLogError(@"Shader '%@': uniform '%@' should be an array of 9 numbers (matrix)", _name, name);
return;
}
GLfloat arr[9];
for (int i=0; i<9; i++) {
NSNumber *n = [RCTConvert NSNumber: v[i]];
if (!n) {
- RCTLogError(@"uniform '%@' array should only contains numbers", name);
+ RCTLogError(@"Shader '%@': uniform '%@' array should only contains numbers", _name, name);
return;
}
arr[i] = [n floatValue];
@@ -255,14 +257,14 @@
case GL_FLOAT_MAT4: {
NSArray *v = [RCTConvert NSArray:value];
if (!v || [v count]!=16) {
- RCTLogError(@"uniform '%@' should be an array of 16 numbers (matrix)", name);
+ RCTLogError(@"Shader '%@': uniform '%@' should be an array of 16 numbers (matrix)", _name, name);
return;
}
GLfloat arr[16];
for (int i=0; i<16; i++) {
NSNumber *n = [RCTConvert NSNumber: v[i]];
if (!n) {
- RCTLogError(@"uniform '%@' array should only contains numbers", name);
+ RCTLogError(@"Shader '%@': uniform '%@' array should only contains numbers", _name, name);
return;
}
arr[i] = [n floatValue];
@@ -279,7 +281,7 @@
}
default:
- RCTLogError(@"uniform '%@': unsupported type %i", name, type);
+ RCTLogError(@"Shader '%@': uniform '%@': unsupported type %i", _name, name, type);
}
}
@@ -292,7 +294,7 @@
GLchar messages[256];
glGetProgramInfoLog(program, sizeof(messages), 0, &messages[0]);
NSString *messageString = [NSString stringWithUTF8String:messages];
- RCTLogError(@"GL: Validation failed %@", messageString);
+ RCTLogError(@"Shader '%@': Validation failed %@", _name, messageString);
}
}
@@ -325,10 +327,10 @@
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- GLuint vertex = compileShader(_vert, GL_VERTEX_SHADER);
+ GLuint vertex = compileShader(_name, _vert, GL_VERTEX_SHADER);
if (vertex == -1) return;
- GLuint fragment = compileShader(_frag, GL_FRAGMENT_SHADER);
+ GLuint fragment = compileShader(_name, _frag, GL_FRAGMENT_SHADER);
if (fragment == -1) return;
program = glCreateProgram();
@@ -342,7 +344,7 @@
GLchar messages[256];
glGetProgramInfoLog(program, sizeof(messages), 0, &messages[0]);
NSString *messageString = [NSString stringWithUTF8String:messages];
- RCTLogError(@"GL: Linking failed %@", messageString);
+ RCTLogError(@"Shader '%@': Linking failed %@", _name, messageString);
return;
}
diff --git a/RNGL/GLShadersRegistry.m b/RNGL/GLShadersRegistry.m
index 5d80b1bb941562a748ea08c0c3d87237e79e6831..3eb7007f145cbdc02244176ff88081a92200910b 100644
--- a/RNGL/GLShadersRegistry.m
+++ b/RNGL/GLShadersRegistry.m
@@ -37,9 +37,13 @@ RCT_EXPORT_MODULE();
static NSString* fullViewportVert = @"attribute vec2 position;varying vec2 uv;void main() {gl_Position = vec4(position,0.0,1.0);uv = vec2(0.5, 0.5) * (position+vec2(1.0, 1.0));}";
-RCT_EXPORT_METHOD(register:(nonnull NSNumber *)id withConfig:(NSDictionary *)config) {
+RCT_EXPORT_METHOD(register:(nonnull NSNumber *)id withConfig:(NSDictionary *)config withName:(NSString *)name) {
NSString *frag = [RCTConvert NSString:config[@"frag"]];
- GLShader *shader = [[GLShader alloc] initWithContext:_context withVert:fullViewportVert withFrag:frag];
+ if (!frag) {
+ RCTLogError(@"Shader '%@': missing frag field", name);
+ return;
+ }
+ GLShader *shader = [[GLShader alloc] initWithContext:_context withName:name withVert:fullViewportVert withFrag:frag];
_shaders[id] = shader;
}
diff --git a/RNGL/GLUtils.h b/RNGL/GLUtils.h
index e45230c19397f083ae9bdabd8d3f54d90100821a..dec5c071e6314d995a19b44ada404353df3c4c4c 100644
--- a/RNGL/GLUtils.h
+++ b/RNGL/GLUtils.h
@@ -1,7 +1,7 @@
#import
#import "ImageData.h"
-GLuint compileShader (NSString* shaderString, GLenum shaderType);
+GLuint compileShader (NSString *shaderName, NSString *shaderString, GLenum shaderType);
ImageData* genPixelsEmpty (int width, int height);
ImageData* genPixelsRandom (int width, int height);
diff --git a/RNGL/GLUtils.m b/RNGL/GLUtils.m
index 1daabf8f2132c7721e29ec820ff4d1b5b3fd0dd8..ed8a00f3654a2db103020773f5c9dd3816f96504 100644
--- a/RNGL/GLUtils.m
+++ b/RNGL/GLUtils.m
@@ -2,7 +2,7 @@
#import "GLUtils.h"
#import "RCTLog.h"
-GLuint compileShader (NSString* shaderString, GLenum shaderType) {
+GLuint compileShader (NSString* shaderName, NSString* shaderString, GLenum shaderType) {
GLuint shaderHandle = glCreateShader(shaderType);
@@ -18,7 +18,7 @@ GLuint compileShader (NSString* shaderString, GLenum shaderType) {
GLchar messages[256];
glGetShaderInfoLog(shaderHandle, sizeof(messages), 0, &messages[0]);
NSString *messageString = [NSString stringWithUTF8String:messages];
- RCTLogError(@"GL: Shader Failed to compile: %@", messageString);
+ RCTLogError(@"Shader '%@' failed to compile: %@", shaderName, messageString);
return -1;
}
diff --git a/RNGL/GLView.m b/RNGL/GLView.m
index 44b99d5d26fb8f8608551eddd06117cfac460bb8..6c21bfe5e4c48743acb92e83660668d6842b2c28 100644
--- a/RNGL/GLView.m
+++ b/RNGL/GLView.m
@@ -69,8 +69,8 @@ RCT_NOT_IMPLEMENTED(-init)
_textures = textures;
_textureUnits = textureUnits;
- // use the shader's context (currently it is the same for all shaders)
- [self setContext:glShader.context];
+ [self setContext:glShader.context]; // use the shader's context (currently it is the same for all shaders)
+ [self setUniforms:_uniforms]; // Ensure uniforms are not set before
[self setNeedsDisplay];
}
diff --git a/book.json b/book.json
new file mode 100644
index 0000000000000000000000000000000000000000..183946d41ca0a67411a6e619c94d00a63e2790b9
--- /dev/null
+++ b/book.json
@@ -0,0 +1,5 @@
+{
+ "structure": {
+ "summary": "docs/README.md"
+ }
+}
diff --git a/docs/README.md b/docs/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..120fda936fca2c2eeb25a46033cdd3eaf61447ba
--- /dev/null
+++ b/docs/README.md
@@ -0,0 +1,13 @@
+# Summary
+
+* [The API](api/README.md)
+ * [GL.Shaders.create](api/Shaders.create.md)
+ * [GL.View](api/View.md)
+ * [GL.Target](api/Target.md)
+* Examples
+ * [Hello World](examples/1.md)
+ * [Effects over Image](examples/2.md)
+ * [Effects over anything](examples/3.md)
+ * [Animation](examples/4.md)
+ * [Touch responsive](examples/5.md)
+ * [Upload Indicator](examples/6.md)
diff --git a/docs/api/README.md b/docs/api/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..fa337080f42a84b548bad8dcb14bbf11b5b6093f
--- /dev/null
+++ b/docs/api/README.md
@@ -0,0 +1 @@
+# The API
diff --git a/docs/examples/1.md b/docs/examples/1.md
new file mode 100644
index 0000000000000000000000000000000000000000..8b137891791fe96927ad78e64b0aad7bded08bdc
--- /dev/null
+++ b/docs/examples/1.md
@@ -0,0 +1 @@
+
diff --git a/index.js b/index.js
index 2d8925cb69d206a81b235e0f72aacf4fb58fe1ba..6bda85fe120c74eff701ef8f79dc4ebc12e47757 100644
--- a/index.js
+++ b/index.js
@@ -19,7 +19,7 @@ const Shaders = {
invariant(typeof shader === "object" && typeof shader.frag === "string",
"invalid shader given to Shaders.create(). A valid shader is a { frag: String }");
const id = _uid ++;
- GLShadersRegistry.register(id, shader);
+ GLShadersRegistry.register(id, shader, key);
result[key] = id;
}
return result;
diff --git a/package.json b/package.json
index 23a8bfd1c1dd1bae51759b0ee723e3953c6809e7..15dcac6abe4a1529a14db669d10438d8ed57314d 100644
--- a/package.json
+++ b/package.json
@@ -19,5 +19,9 @@
"dependencies": {
"invariant": "^2.1.0",
"react-native": "^0.9.0"
+ },
+ "devDependencies": {
+ "eslint": "^1.1.0",
+ "eslint-plugin-react": "^3.2.3"
}
}