Skip to content

Commit c2a02c6

Browse files
authored
Integrate XR support (BabylonJS#9)
This change brings XR support into the react native layer. One notable change here is with the camera permissions request code I added in the JS layer.
1 parent 48902c9 commit c2a02c6

File tree

11 files changed

+152
-19
lines changed

11 files changed

+152
-19
lines changed

Apps/Playground/App.tsx

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@
55
* @format
66
*/
77

8-
import React, { useState, FunctionComponent, useEffect } from 'react';
8+
import React, { useState, FunctionComponent, useEffect, useCallback } from 'react';
99
import { SafeAreaView, StatusBar, Button, View, Text, ViewProps } from 'react-native';
1010

1111
import { EngineView, useEngine } from 'react-native-babylon';
12-
import { Scene, Vector3, Mesh, ArcRotateCamera, Engine, Camera, PBRMetallicRoughnessMaterial, Color3 } from '@babylonjs/core';
12+
import { Scene, Vector3, Mesh, ArcRotateCamera, Camera, PBRMetallicRoughnessMaterial, Color3, TargetCamera, WebXRSessionManager } from '@babylonjs/core';
1313
import Slider from '@react-native-community/slider';
1414

1515
const EngineScreen: FunctionComponent<ViewProps> = (props: ViewProps) => {
@@ -19,11 +19,14 @@ const EngineScreen: FunctionComponent<ViewProps> = (props: ViewProps) => {
1919
const [toggleView, setToggleView] = useState(false);
2020
const [camera, setCamera] = useState<Camera>();
2121
const [box, setBox] = useState<Mesh>();
22+
const [scene, setScene] = useState<Scene>();
23+
const [xrSession, setXrSession] = useState<WebXRSessionManager>();
2224
const [scale, setScale] = useState<number>(defaultScale);
2325

2426
useEffect(() => {
2527
if (engine) {
2628
const scene = new Scene(engine);
29+
setScene(scene);
2730
scene.createDefaultCamera(true);
2831
(scene.activeCamera as ArcRotateCamera).beta -= Math.PI / 8;
2932
setCamera(scene.activeCamera!);
@@ -49,10 +52,28 @@ const EngineScreen: FunctionComponent<ViewProps> = (props: ViewProps) => {
4952
}
5053
}, [box, scale]);
5154

55+
const onToggleXr = useCallback(() => {
56+
(async () => {
57+
if (xrSession) {
58+
await xrSession.exitXRAsync();
59+
setXrSession(undefined);
60+
} else {
61+
if (box !== undefined && scene !== undefined) {
62+
const xr = await scene.createDefaultXRExperienceAsync({ disableDefaultUI: true, disableTeleportation: true })
63+
const session = await xr.baseExperience.enterXRAsync("immersive-vr", "unbounded", xr.renderTarget);
64+
setXrSession(session);
65+
box.position = (scene.activeCamera as TargetCamera).getFrontPosition(2);
66+
box.rotate(Vector3.Up(), 3.14159);
67+
}
68+
}
69+
})();
70+
}, [box, scene, xrSession]);
71+
5272
return (
5373
<>
5474
<View style={props.style}>
5575
<Button title="Toggle EngineView" onPress={() => { setToggleView(!toggleView) }} />
76+
<Button title={ xrSession ? "Stop XR" : "Start XR"} onPress={onToggleXr} />
5677
{ !toggleView &&
5778
<View style={{flex: 1}}>
5879
<EngineView style={props.style} camera={camera} />

Apps/Playground/android/app/src/main/AndroidManifest.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
package="com.playground">
33

44
<uses-permission android:name="android.permission.INTERNET" />
5+
<uses-permission android:name="android.permission.CAMERA"/>
56

67
<application
78
android:name=".MainApplication"
@@ -21,6 +22,7 @@
2122
</intent-filter>
2223
</activity>
2324
<activity android:name="com.facebook.react.devsupport.DevSettingsActivity" />
25+
<meta-data android:name="com.google.ar.core" android:value="optional" />
2426
</application>
2527

2628
</manifest>

Apps/Playground/node_modules/react-native-babylon/EngineHook.ts

Lines changed: 59 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Apps/Playground/node_modules/react-native-babylon/android/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Apps/Playground/node_modules/react-native-babylon/android/src/main/cpp/BabylonNativeInterop.cpp

Lines changed: 27 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Apps/Playground/node_modules/react-native-babylon/android/src/main/java/com/reactlibrary/BabylonModule.java

Lines changed: 10 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Apps/Playground/node_modules/react-native-babylon/android/src/main/java/com/reactlibrary/BabylonNativeInterop.java

Lines changed: 19 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Apps/Playground/node_modules/react-native-babylon/package.json

Lines changed: 2 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Apps/Playground/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@
1414
"@react-native-community/slider": "^2.0.9",
1515
"react": "16.9.0",
1616
"react-native": "0.62.1",
17-
"react-native-babylon": "./node_modules/react-native-babylon"
17+
"react-native-babylon": "./node_modules/react-native-babylon",
18+
"react-native-permissions": "^2.1.4"
1819
},
1920
"devDependencies": {
2021
"@babel/core": "^7.6.2",

0 commit comments

Comments
 (0)