Babylon React Native brings the power and flexibility of Babylon.js into a React Native environment via Babylon Native.
See this from the Babylon Native repo.
React Native applications targeting JavaScriptCore on iOS or Hermes will not have JIT enabled. This may cause performance issues for JavaScript heavy scenarios.
Babylon React Native relies heavily on newer React Native constructs including JSI to get the performance characteristics required for real time rendering. JSI allows for direct synchronous communication between native code and JavaScript code, but is incompatible with "remote debugging." If you need to debug your JavaScript code that uses Babylon React Native, you should enable Hermes and use "direct debugging" (e.g. chrome://inspect or edge://inspect). See the React Native documentation for more info.
See the package usage for installation instructions and/or the Playground app's App.tsx for example usage. You can also clone this sample repo to quickly get started.
Note: Official support for React Native frameworks, like Expo, is not provided by BabylonReactNative. While BabylonReactNative may work with these frameworks, we do not conduct testing, bug fixes, or feature development to ensure compatibility.
This quick overview will help you get started developing in the Babylon React Native repository. We support development on Windows and MacOS, but assume the use of PowerShell in the instructions below (unless otherwise noted).
If you are interested in making contributions, be sure to also review CONTRIBUTING.md.
Required Tools: git, Node.js (16.13.0+)
Step 1 for all development environments and targets is to clone the repo. Use a git-enabled terminal to follow the steps below.
git clone https://github.com/BabylonJS/BabylonReactNative
Then, a React Native target must be chosen. For a React-Native 0.64 build:
cd Apps/Playground
npm ci
npm run select 0.64
Selecting the React Native install will also install all NPM packages and its dependencies for the Playground sample/test app.
:warning: When setting up the Playground app for UWP, the
npm run select
command must be run with Administrator rights, because of the symbolic links. Not doing so will result in this build error will popup when trying to run the Playground:The path cannot be traversed because it contains an untrusted mount point.
This will also automatically do the following to prepare your repo for development:
pod install
to install cocoa pod depdendenciesAfter merging upstream changes in the future, you will need to either run npm install
again, or run individual commands for the above operations (e.g. git submodule update --init --submodule
/ npm run iosCMake
/ pod install
).
Required Tools: Android Studio (including NDK 21.4.7075529), CMake, Ninja, JDK 13
PATH
environment variable must include the path to adb (typically ~/Library/Android/sdk/platform-tools/).PATH
environment variable must include the path to Ninja, or Ninja must be installed via a package manager.ANDROID_HOME
environment variable must be defined (typically ~/Library/Android/sdk).ANDROID_SDK_ROOT
environment variable must be defined (typically ~/Library/Android/sdk).ANDROID_AVD_HOME
environment variable must be defined if you plan to use Android emulators (typically ~/.android/avd).JAVA_HOME
environment variable must be defined to point to the correct version of the JDK (typically /usr/libexec/java_home -v 13).You can typically configure your environment by editing ~/.zshrc
and adding the following:
export PATH=$PATH:~/Library/Android/sdk/platform-tools/
export PATH=$PATH:~/path_to_ninja_binary/ # Only for manual installations of Ninja (not package manager-based installations).
export ANDROID_HOME=~/Library/Android/sdk
export ANDROID_SDK_ROOT=~/Library/Android/sdk
export ANDROID_AVD_HOME=~/.android/avd
export JAVA_HOME=$(/usr/libexec/java_home -v 13)
Required Tools: Android Studio (including NDK 21.4.7075529), CMake, Ninja, Visual Studio 2022
PATH
environment variable must include the path to adb (typically %LOCALAPPDATA%/Android/sdk/platform-tools/).PATH
environment variable must include the path to Ninja, or Ninja must be installed via a package manager. ANDROID_HOME
environment variable must be defined (typically %LOCALAPPDATA%/Android/sdk).JAVA_HOME
environment variable must be defined (typically %ProgramFiles%/Android/Android Studio/jre).Required Tools: Android Studio (including NDK 21.4.7075529)
With Ubuntu, you can install needed packages by this command:
sudo apt-get install adb ninja-build openjdk-14-jdk android-sdk
Update PATH with this commands:
export ANDROID_HOME=$HOME/Android/Sdk
export PATH=$PATH:$ANDROID_HOME/emulator
export PATH=$PATH:$ANDROID_HOME/tools
export PATH=$PATH:$ANDROID_HOME/tools/bin
export PATH=$PATH:$ANDROID_HOME/platform-tools
npm run android
, you can start it manually by running npm run start
in a terminal.npm run android --verbose
can give some hints.~/Android/Sdk/emulator/emulator @name_of_your_image
.ld: library not found for -lBabylonNative
appears when building for iOS, this is because of CMake 3.26+. use 3.24 or remove CONFIGURATION_BUILD_DIR
entries for every .pbxproj
file.On either Mac or Windows, NPM is used to build and run the Playground sample/test app from the command line. Open a command prompt at the root of the BabylonReactNative repo if you don't have one already open.
cd Apps/Playground/Playground
npm run android
After having run the above commands, you can also open Apps/Playground/android
in Android Studio and run the app from there.
iOS can only be built on a Mac.
cd Apps/Playground/Playground
npm run ios
After having run the above commands, you can also open Apps/Playground/ios/Playground.xcworkspace
in XCode and run the app from there.
UWP can only be built on a PC. CMake
must be manually run to generate project definitions for BabylonNative dependencies.
npm ci
in Apps\Playground\Playground.npm ci
in Package.npx gulp buildUWP
in Package. This command will run cmake and build BabylonNative dependencies. It may take a while to complete.npm run windows
.
Note: if you experience build issues for Apps\Playground related to autolinking, try running
npx react-native autolink-windows
in the Apps\Playground\Playground folder. You can also runnpm run windows-verbose
to view logging.
When making local changes, the following manual test steps should be performed within the Playground app to prevent regressions. These should be checked on Android and iOS, and ideally in both debug and release, but minimally in release.
R
key on the keyboard to reload the JS engine and make sure rendering restarts successfully.If you want to test using a local build of the NPM package with your own React Native app, you can do so with a gulp
command on a Mac (this requires a Mac as it builds binaries for both iOS and Android).
cd Package
npm install
gulp pack
The NPM package will be built into the Package
directory where the gulp
command was run. Once the local NPM package has been built, it can be installed into a project using npm
.
cd <directory of your React Native app>
npm install <root directory of your BabylonReactNative clone>/Package/Assembled/babylonjs-react-native-0.0.1.tgz
If you wish to test the locally-built NPM packages with the apps in the PackageTest
directory, before running npm install
be sure to run:
cd Apps\PackageTest\<package test app version>
npm uninstall @babylon/react-native
# If you're also updating the react-native-windows package:
npm uninstall @bablyon/react-native-windows
This will allow the local package dependencies to update without the package-lock.json file worrying about new content without a new version number. You can then run the above command to install the locally-built NPM modules located in Package/Assembled
.
If you want to consume @babylonjs/react-native
as source in your React Native app (for debugging or for iterating on the code when making a contribution), you can install the package source directory as an npm package.
cd <directory of your React Native app>
npm install <root directory of your BabylonReactNative clone>/Modules/@babylonjs/react-native
cd ios
pod install
This will create a symbolic link in your node_modules
directory to the @babylonjs/react-native
source directory. However, this also requires a custom metro.config.js
as the Metro bundler does not support symbolic links by default. See the GitHub issue on this for a solution.
For iOS the XCode project needs to be generated with CMake
as described above and added to your xcworkspace
.
React Native | Babylon React Native |
---|---|
0.64 | 1.4.0, 1.4.1, 1.4.2, 1.4.3, 1.4.4, 1.5.0, 1.5.1, 1.6.0, 1.6.1, 1.6.3, 1.8.1, 1.8.2, 1.8.5 |
0.65 -> 0.68 | 1.4.0, 1.4.1, 1.4.2, 1.4.3, 1.4.4, 1.5.0, 1.5.1, 1.6.0, 1.6.1, 1.6.3, 1.8.1, 1.8.2, 1.8.5 |
0.69 | 1.4.0, 1.4.1, 1.4.2, 1.4.3, 1.4.4, 1.5.0, 1.5.1, 1.6.0, 1.6.1, 1.6.3, 1.8.1, 1.8.2, 1.8.5 |
0.70 | 1.5.0, 1.5.1, 1.6.0, 1.6.1, 1.6.3, 1.8.1, 1.8.2, 1.8.5 |
0.71 -> 0.73 | 1.6.0, 1.6.1, 1.6.3, 1.8.1, 1.8.2, 1.8.5 |
Here are the package names for Android/iOS and Windows:
React Native | Android/iOS Package | Windows Package |
---|---|---|
0.64 | @babylonjs/react-native-iosandroid-0-64 | @babylonjs/react-native-windows-0-64 |
0.65 -> 0.68 | @babylonjs/react-native-iosandroid-0-65 | @babylonjs/react-native-windows-0-65 |
0.69 | @babylonjs/react-native-iosandroid-0-69 | @babylonjs/react-native-windows-0-69 |
0.70 | @babylonjs/react-native-iosandroid-0-70 | @babylonjs/react-native-windows-0-70 |
0.71 -> 0.73 | @babylonjs/react-native-iosandroid-0-71 | @babylonjs/react-native-windows-0-71 |
Also, @babylonjs/react-native is a needed dependency for all platforms.
Depending on the Babylon React Native NPM package version, some Babylon.js NPM dependency versions may or may not be compatible. Here is a compatibility list that has been tested:
Babylon React Native | Babylon.js (@babylonjs/core, @babylonjs/loaders, ...) |
---|---|
1.4.0 | 5.27.1 |
1.4.1 | 5.32.2, 5.33.0, 5.33.1, 5.33.2, 5.34.0, 5.35.0 |
1.4.2 | 5.35.1, 5.36.0, 5.37.0, 5.38.0, 5.39.0, 5.42.0, 5.42.1 |
1.4.3 | 5.42.2, 5.43.0, 5.43.1, 5.43.2, 5.44.0, 5.45.0, 5.45.1, 5.45.2, 5.46.0, 5.47.0, 5.47.1, 5.48.0, 5.48.1, 5.49.0, 5.49.1, 5.49.2, 5.50.0, 5.50.1, 5.51.0, 5.52.0, 5.53.0, 5.54.0, 5.55.0, 5.56.0, 5.57.0, 5.57.1, 6.0.0, 6.1.0, 6.2.0, 6.3.1, 6.4.0, 6.4.1 |
1.4.4 | 5.42.2, 5.43.0, 5.43.1, 5.43.2, 5.44.0, 5.45.0, 5.45.1, 5.45.2, 5.46.0, 5.47.0, 5.47.1, 5.48.0, 5.48.1, 5.49.0, 5.49.1, 5.49.2, 5.50.0, 5.50.1, 5.51.0, 5.52.0, 5.53.0, 5.54.0, 5.55.0, 5.56.0, 5.57.0, 5.57.1, 6.0.0, 6.1.0, 6.2.0, 6.3.0, 6.3.1, 6.4.0, 6.4.1 |
1.5.0 | 5.42.2, 5.43.0, 5.43.1, 5.43.2, 5.44.0, 5.45.0, 5.45.1, 5.45.2, 5.46.0, 5.47.0, 5.47.1, 5.48.0, 5.48.1, 5.49.0, 5.49.1, 5.49.2, 5.50.0, 5.50.1, 5.51.0, 5.52.0, 5.53.0, 5.54.0, 5.55.0, 5.56.0, 5.57.0, 5.57.1, 6.0.0, 6.1.0, 6.2.0, 6.3.0, 6.3.1, 6.4.0, 6.4.1 |
1.5.1 | 5.42.2, 5.43.0, 5.43.1, 5.43.2, 5.44.0, 5.45.0, 5.45.1, 5.45.2, 5.46.0, 5.47.0, 5.47.1, 5.48.0, 5.48.1, 5.49.0, 5.49.1, 5.49.2, 5.50.0, 5.50.1, 5.51.0, 5.52.0, 5.53.0, 5.54.0, 5.55.0, 5.56.0, 5.57.0, 5.57.1, 6.0.0, 6.1.0, 6.2.0, 6.3.0, 6.3.1, 6.4.0, 6.4.1 |
1.6.0 | 5.42.2, 5.43.0, 5.43.1, 5.43.2, 5.44.0, 5.45.0, 5.45.1, 5.45.2, 5.46.0, 5.47.0, 5.48.0, 5.48.1, 5.49.1 |
1.6.1 | 5.42.2, 5.43.0, 5.43.1, 5.43.2, 5.44.0, 5.45.0, 5.45.1, 5.45.2, 5.46.0, 5.47.0, 5.48.0, 5.48.1, 5.49.1 |
1.6.3 | 5.53.1, 5.54.0, 5.55.0, 5.56.0, 5.57.0, 5.57.1, 6.0.0, 6.1.0, 6.2.0, 6.3.0, 6.3.1, 6.4.0, 6.4.1, 6.5.0, 6.5.1, 6.6.0, 6.6.1, 6.7.0, 6.8.1, 6.9.0, 6.11.2, 6.12.0, 6.12.1,6.12.2, 6.12.3, 6.14.0 |
1.8.1,1.8.2, 1.8.5 | 5.53.1, 5.54.0, 5.55.0, 5.56.0, 5.57.0, 5.57.1, 6.0.0, 6.1.0, 6.2.0, 6.3.0, 6.3.1, 6.4.0, 6.4.1, 6.5.0, 6.5.1, 6.6.0, 6.6.1, 6.7.0, 6.8.1, 6.9.0, 6.11.2, 6.12.0, 6.12.1,6.12.2, 6.12.3, 6.14.0 |
If you believe you have found a security vulnerability in this repository, please see SECURITY.md.