From 8595492d8bab4adf4c27d8348263ee3cf04ad7ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABtan=20Renaudeau?= Date: Tue, 18 Aug 2015 18:58:08 +0200 Subject: [PATCH] improve logs, fix image issue, add Simple example, start docs - fix issue when setUniforms is called before setShader --- .../AdvancedEffects/.eslintrc => .eslintrc | 0 Examples/AdvancedEffects/package.json | 4 - Examples/Simple/.flowconfig | 47 ++ Examples/Simple/.gitignore | 28 + Examples/Simple/.npmignore | 27 + Examples/Simple/HelloGL.js | 28 + Examples/Simple/Sepia.js | 34 + .../Simple/Simple.xcodeproj/project.pbxproj | 790 ++++++++++++++++++ .../xcshareddata/xcschemes/Simple.xcscheme | 112 +++ Examples/Simple/SimpleTests/Info.plist | 24 + Examples/Simple/SimpleTests/SimpleTests.m | 65 ++ Examples/Simple/iOS/AppDelegate.h | 16 + Examples/Simple/iOS/AppDelegate.m | 60 ++ .../Simple/iOS/Base.lproj/LaunchScreen.xib | 42 + .../AppIcon.appiconset/Contents.json | 38 + Examples/Simple/iOS/Info.plist | 45 + Examples/Simple/iOS/main.jsbundle | 8 + Examples/Simple/iOS/main.m | 18 + Examples/Simple/index.ios.js | 62 ++ Examples/Simple/package.json | 12 + README.md | 24 +- RNGL/GLShader.h | 2 +- RNGL/GLShader.m | 60 +- RNGL/GLShadersRegistry.m | 8 +- RNGL/GLUtils.h | 2 +- RNGL/GLUtils.m | 4 +- RNGL/GLView.m | 4 +- book.json | 5 + docs/README.md | 13 + docs/api/README.md | 1 + docs/examples/1.md | 1 + index.js | 2 +- package.json | 4 + 33 files changed, 1542 insertions(+), 48 deletions(-) rename Examples/AdvancedEffects/.eslintrc => .eslintrc (100%) create mode 100644 Examples/Simple/.flowconfig create mode 100644 Examples/Simple/.gitignore create mode 100644 Examples/Simple/.npmignore create mode 100644 Examples/Simple/HelloGL.js create mode 100644 Examples/Simple/Sepia.js create mode 100644 Examples/Simple/Simple.xcodeproj/project.pbxproj create mode 100644 Examples/Simple/Simple.xcodeproj/xcshareddata/xcschemes/Simple.xcscheme create mode 100644 Examples/Simple/SimpleTests/Info.plist create mode 100644 Examples/Simple/SimpleTests/SimpleTests.m create mode 100644 Examples/Simple/iOS/AppDelegate.h create mode 100644 Examples/Simple/iOS/AppDelegate.m create mode 100644 Examples/Simple/iOS/Base.lproj/LaunchScreen.xib create mode 100644 Examples/Simple/iOS/Images.xcassets/AppIcon.appiconset/Contents.json create mode 100644 Examples/Simple/iOS/Info.plist create mode 100644 Examples/Simple/iOS/main.jsbundle create mode 100644 Examples/Simple/iOS/main.m create mode 100644 Examples/Simple/index.ios.js create mode 100644 Examples/Simple/package.json create mode 100644 book.json create mode 100644 docs/README.md create mode 100644 docs/api/README.md create mode 100644 docs/examples/1.md 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 c2fa6aa..a63afd1 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 0000000..8989253 --- /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 0000000..b927355 --- /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 0000000..c39012e --- /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 0000000..76530bf --- /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 0000000..9c4b301 --- /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 0000000..bbece9a --- /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 0000000..d4b3740 --- /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 0000000..886825c --- /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 0000000..4c8a242 --- /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 0000000..a9654d5 --- /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 0000000..d4e6402 --- /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 0000000..fa2518f --- /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 0000000..118c98f --- /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 0000000..ceb55dc --- /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 0000000..b702b30 --- /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 0000000..3d767fc --- /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 0000000..dc77208 --- /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 0000000..25bf407 --- /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 b00db60..1699430 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:** ![](docs/install-steps.png) -## 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 00ef044..2983552 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 b2094e8..65c99d0 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 5d80b1b..3eb7007 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 e45230c..dec5c07 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 1daabf8..ed8a00f 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 44b99d5..6c21bfe 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 0000000..183946d --- /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 0000000..120fda9 --- /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 0000000..fa33708 --- /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 0000000..8b13789 --- /dev/null +++ b/docs/examples/1.md @@ -0,0 +1 @@ + diff --git a/index.js b/index.js index 2d8925c..6bda85f 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 23a8bfd..15dcac6 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" } } -- 2.26.2