Skip to content

Commit 629abf1

Browse files
authored
Merge pull request #147 from De-Panther/onxrchange_improvement
Changed how XR session switch is handled
2 parents 44fdb0d + 3d87a92 commit 629abf1

File tree

6 files changed

+79
-45
lines changed

6 files changed

+79
-45
lines changed

Packages/webxr/CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,11 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
55
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
66

77
## [Unreleased]
8+
### Changed
9+
- Scripts execution order.
10+
- How XR session switch is handled.
11+
- OnXRChange is called from the Update loop.
12+
813
### Fixed
914
- User scaling issue in FullView WebGLTemplates
1015

Packages/webxr/Runtime/Plugins/WebGL/webxr.jspre

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -809,15 +809,24 @@ setTimeout(function () {
809809
var thisXRMananger = this;
810810
session.requestReferenceSpace(refSpaceType).then(function (refSpace) {
811811
session.refSpace = refSpace;
812-
thisXRMananger.BrowserObject.resumeAsyncCallbacks();
813-
thisXRMananger.BrowserObject.mainLoop.resume();
812+
var tempRaf = function (time, xrFrame) {
813+
if (thisXRMananger.animate(xrFrame))
814+
{
815+
thisXRMananger.BrowserObject.resumeAsyncCallbacks();
816+
thisXRMananger.BrowserObject.mainLoop.resume();
817+
} else {
818+
// No XR session yet
819+
session.requestAnimationFrame(tempRaf);
820+
}
821+
}
822+
session.requestAnimationFrame(tempRaf);
814823
});
815824
}
816825

817826
XRManager.prototype.animate = function (frame) {
818827
var session = frame.session;
819828
if (!session) {
820-
return;
829+
return this.didNotifyUnity;
821830
}
822831

823832
var glLayer = session.renderState.baseLayer;
@@ -842,12 +851,12 @@ setTimeout(function () {
842851

843852
var pose = frame.getViewerPose(session.refSpace);
844853
if (!pose) {
845-
return;
854+
return this.didNotifyUnity;
846855
}
847856

848857
if (!session.isImmersive)
849858
{
850-
return;
859+
return this.didNotifyUnity;
851860
}
852861

853862
var xrData = this.xrData;
@@ -979,6 +988,7 @@ setTimeout(function () {
979988
}
980989
this.didNotifyUnity = true;
981990
}
991+
return this.didNotifyUnity;
982992
}
983993

984994
XRManager.prototype.updateUnityXRData = function (data) {

Packages/webxr/Runtime/Scripts/WebXRCamera.cs

Lines changed: 42 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace WebXR
44
{
5+
[DefaultExecutionOrder(-2019)]
56
public class WebXRCamera : MonoBehaviour
67
{
78
public enum CameraID
@@ -23,58 +24,61 @@ public enum CameraID
2324

2425
private int viewsCount = 1;
2526

26-
private bool switched = false;
27-
2827
private bool hasFollower = false;
2928

30-
void OnEnable()
29+
private void Awake()
30+
{
31+
SwitchXRState();
32+
}
33+
34+
private void OnEnable()
3135
{
3236
WebXRManager.OnXRChange += OnXRChange;
3337
WebXRManager.OnHeadsetUpdate += OnHeadsetUpdate;
3438
hasFollower = cameraFollower != null;
3539
}
36-
37-
void OnDisable()
40+
41+
private void OnDisable()
3842
{
3943
WebXRManager.OnXRChange -= OnXRChange;
4044
WebXRManager.OnHeadsetUpdate -= OnHeadsetUpdate;
4145
}
4246

43-
void Update()
47+
private void Update()
4448
{
45-
if (!switched)
49+
UpdateFollower();
50+
}
51+
52+
private void SwitchXRState()
53+
{
54+
switch (xrState)
4655
{
47-
switched = true;
48-
switch (xrState)
49-
{
50-
case WebXRState.AR:
51-
cameraMain.enabled = false;
52-
cameraL.enabled = false;
53-
cameraR.enabled = false;
54-
cameraARL.enabled = viewsCount > 0;
55-
cameraARL.rect = leftRect;
56-
cameraARR.enabled = viewsCount > 1;
57-
cameraARR.rect = rightRect;
58-
break;
59-
case WebXRState.VR:
60-
cameraMain.enabled = false;
61-
cameraL.enabled = viewsCount > 0;
62-
cameraL.rect = leftRect;
63-
cameraR.enabled = viewsCount > 1;
64-
cameraR.rect = rightRect;
65-
cameraARL.enabled = false;
66-
cameraARR.enabled = false;
67-
break;
68-
case WebXRState.NORMAL:
69-
cameraMain.enabled = true;
70-
cameraL.enabled = false;
71-
cameraR.enabled = false;
72-
cameraARL.enabled = false;
73-
cameraARR.enabled = false;
74-
break;
75-
}
56+
case WebXRState.AR:
57+
cameraMain.enabled = false;
58+
cameraL.enabled = false;
59+
cameraR.enabled = false;
60+
cameraARL.enabled = viewsCount > 0;
61+
cameraARL.rect = leftRect;
62+
cameraARR.enabled = viewsCount > 1;
63+
cameraARR.rect = rightRect;
64+
break;
65+
case WebXRState.VR:
66+
cameraMain.enabled = false;
67+
cameraL.enabled = viewsCount > 0;
68+
cameraL.rect = leftRect;
69+
cameraR.enabled = viewsCount > 1;
70+
cameraR.rect = rightRect;
71+
cameraARL.enabled = false;
72+
cameraARR.enabled = false;
73+
break;
74+
case WebXRState.NORMAL:
75+
cameraMain.enabled = true;
76+
cameraL.enabled = false;
77+
cameraR.enabled = false;
78+
cameraARL.enabled = false;
79+
cameraARR.enabled = false;
80+
break;
7681
}
77-
UpdateFollower();
7882
}
7983

8084
private void UpdateFollower()
@@ -153,7 +157,7 @@ private void OnXRChange(WebXRState state, int viewsCount, Rect leftRect, Rect ri
153157
this.viewsCount = viewsCount;
154158
this.leftRect = leftRect;
155159
this.rightRect = rightRect;
156-
switched = false;
160+
SwitchXRState();
157161
}
158162

159163
private void OnHeadsetUpdate(

Packages/webxr/Runtime/Scripts/WebXRController.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
namespace WebXR
99
{
10-
10+
[DefaultExecutionOrder(-2018)]
1111
public class WebXRController : MonoBehaviour
1212
{
1313
public enum ButtonTypes

Packages/webxr/Runtime/Scripts/WebXRManager.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
1+
using UnityEngine;
2+
13
namespace WebXR
24
{
35
public enum WebXRState { VR, AR, NORMAL }
46

7+
[DefaultExecutionOrder(-2020)]
58
public class WebXRManager : SubsystemLifecycleManager<WebXRSubsystem, WebXRSubsystemDescriptor>
69
{
710
public static WebXRManager Instance { get; private set; }

Packages/webxr/Runtime/XRPlugin/WebXRSubsystem.cs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,11 @@ private void UpdateControllersOnEnd()
8282

8383
internal void OnUpdate()
8484
{
85+
if (!reportedXRStateSwitch)
86+
{
87+
reportedXRStateSwitch = true;
88+
OnXRChange?.Invoke(xrState, viewsCount, leftRect, rightRect);
89+
}
8590
if (switchToEnd)
8691
{
8792
switchToEnd = false;
@@ -204,6 +209,10 @@ public static extern void set_webxr_events(Action<int, float, float, float, floa
204209
#endif
205210

206211
internal WebXRState xrState = WebXRState.NORMAL;
212+
private int viewsCount = 1;
213+
private Rect leftRect;
214+
private Rect rightRect;
215+
private bool reportedXRStateSwitch = true;
207216

208217
public delegate void XRCapabilitiesUpdate(WebXRDisplayCapabilities capabilities);
209218

@@ -300,8 +309,11 @@ public void OnInputProfiles(WebXRControllersProfiles controllersProfiles)
300309
public void setXrState(WebXRState state, int viewsCount, Rect leftRect, Rect rightRect)
301310
{
302311
this.xrState = state;
312+
this.viewsCount = viewsCount;
313+
this.leftRect = leftRect;
314+
this.rightRect = rightRect;
303315
viewerHitTestOn = false;
304-
OnXRChange?.Invoke(state, viewsCount, leftRect, rightRect);
316+
reportedXRStateSwitch = false;
305317
}
306318

307319
// received start AR from WebXR browser

0 commit comments

Comments
 (0)