@@ -9,7 +9,7 @@ import React, { useState, FunctionComponent, useEffect, useCallback } from 'reac
99import { SafeAreaView , StatusBar , Button , View , Text , ViewProps , Image } from 'react-native' ;
1010
1111import { EngineView , useEngine , EngineViewCallbacks } from '@babylonjs/react-native' ;
12- import { Scene , Vector3 , ArcRotateCamera , Camera , WebXRSessionManager , SceneLoader , TransformNode , DeviceSourceManager , DeviceType , DeviceSource , PointerInput } from '@babylonjs/core' ;
12+ import { Scene , Vector3 , ArcRotateCamera , Camera , WebXRSessionManager , SceneLoader , TransformNode , DeviceSourceManager , DeviceType , DeviceSource , PointerInput , WebXRTrackingState } from '@babylonjs/core' ;
1313import '@babylonjs/loaders' ;
1414import Slider from '@react-native-community/slider' ;
1515
@@ -26,6 +26,7 @@ const EngineScreen: FunctionComponent<ViewProps> = (props: ViewProps) => {
2626 const [ scale , setScale ] = useState < number > ( defaultScale ) ;
2727 const [ snapshotData , setSnapshotData ] = useState < string > ( ) ;
2828 const [ engineViewCallbacks , setEngineViewCallbacks ] = useState < EngineViewCallbacks > ( ) ;
29+ const [ trackingState , setTrackingState ] = useState < WebXRTrackingState > ( ) ;
2930
3031 useEffect ( ( ) => {
3132 if ( engine ) {
@@ -74,16 +75,27 @@ const EngineScreen: FunctionComponent<ViewProps> = (props: ViewProps) => {
7475 }
7576 } , [ rootNode , scale ] ) ;
7677
78+ const trackingStateToString = ( trackingState : WebXRTrackingState | undefined ) : string => {
79+ return trackingState === undefined ? "" : WebXRTrackingState [ trackingState ] ;
80+ } ;
81+
7782 const onToggleXr = useCallback ( ( ) => {
7883 ( async ( ) => {
7984 if ( xrSession ) {
8085 await xrSession . exitXRAsync ( ) ;
8186 setXrSession ( undefined ) ;
87+ setTrackingState ( undefined ) ;
8288 } else {
8389 if ( rootNode !== undefined && scene !== undefined ) {
8490 const xr = await scene . createDefaultXRExperienceAsync ( { disableDefaultUI : true , disableTeleportation : true } )
8591 const session = await xr . baseExperience . enterXRAsync ( "immersive-ar" , "unbounded" , xr . renderTarget ) ;
8692 setXrSession ( session ) ;
93+
94+ setTrackingState ( xr . baseExperience . camera . trackingState ) ;
95+ xr . baseExperience . camera . onTrackingStateChanged . add ( ( newTrackingState ) => {
96+ setTrackingState ( newTrackingState ) ;
97+ } ) ;
98+
8799 // TODO: Figure out why getFrontPosition stopped working
88100 //box.position = (scene.activeCamera as TargetCamera).getFrontPosition(2);
89101 const cameraRay = scene . activeCamera ! . getForwardRay ( 1 ) ;
@@ -119,6 +131,7 @@ const EngineScreen: FunctionComponent<ViewProps> = (props: ViewProps) => {
119131 }
120132 < EngineView style = { props . style } camera = { camera } onInitialized = { onInitialized } />
121133 < Slider style = { { position : 'absolute' , minHeight : 50 , margin : 10 , left : 0 , right : 0 , bottom : 0 } } minimumValue = { 0.2 } maximumValue = { 2 } value = { defaultScale } onValueChange = { setScale } />
134+ < Text style = { { fontSize : 12 , color : 'yellow' , position : 'absolute' , margin : 10 } } > { trackingStateToString ( trackingState ) } </ Text >
122135 </ View >
123136 }
124137 { toggleView &&
0 commit comments