Skip to content

Commit ba16e24

Browse files
committed
Send viewports to Unity in AR mode - Should solve iOS and ML1 issues
1 parent a62cf75 commit ba16e24

File tree

10 files changed

+135
-22
lines changed

10 files changed

+135
-22
lines changed

Assets/WebGLTemplates/WebXR/webxr.js

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -625,7 +625,39 @@
625625
{
626626
if (session.isAR)
627627
{
628-
this.gameInstance.Module.WebXR.OnStartAR(pose.views.length);
628+
let eyeCount = 1;
629+
let leftRect = {
630+
x:0,
631+
y:0,
632+
w:1,
633+
h:1
634+
}
635+
let rightRect = {
636+
x:0.5,
637+
y:0,
638+
w:0.5,
639+
h:1
640+
}
641+
for (let view of pose.views) {
642+
let viewport = session.renderState.baseLayer.getViewport(view);
643+
if (view.eye === 'left') {
644+
if (viewport) {
645+
leftRect.x = viewport.x / glLayer.framebufferWidth;
646+
leftRect.y = viewport.y / glLayer.framebufferHeight;
647+
leftRect.w = viewport.width / glLayer.framebufferWidth;
648+
leftRect.h = viewport.height / glLayer.framebufferHeight;
649+
}
650+
} else if (view.eye === 'right') {
651+
eyeCount = 2;
652+
if (viewport) {
653+
rightRect.x = viewport.x / glLayer.framebufferWidth;
654+
rightRect.y = viewport.y / glLayer.framebufferHeight;
655+
rightRect.w = viewport.width / glLayer.framebufferWidth;
656+
rightRect.h = viewport.height / glLayer.framebufferHeight;
657+
}
658+
}
659+
}
660+
this.gameInstance.Module.WebXR.OnStartAR(eyeCount, leftRect, rightRect);
629661
} else {
630662
this.gameInstance.Module.WebXR.OnStartVR(pose.views.length);
631663
}

Assets/WebGLTemplates/WebXRFullView/webxr.js

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -625,7 +625,39 @@
625625
{
626626
if (session.isAR)
627627
{
628-
this.gameInstance.Module.WebXR.OnStartAR(pose.views.length);
628+
let eyeCount = 1;
629+
let leftRect = {
630+
x:0,
631+
y:0,
632+
w:1,
633+
h:1
634+
}
635+
let rightRect = {
636+
x:0.5,
637+
y:0,
638+
w:0.5,
639+
h:1
640+
}
641+
for (let view of pose.views) {
642+
let viewport = session.renderState.baseLayer.getViewport(view);
643+
if (view.eye === 'left') {
644+
if (viewport) {
645+
leftRect.x = viewport.x / glLayer.framebufferWidth;
646+
leftRect.y = viewport.y / glLayer.framebufferHeight;
647+
leftRect.w = viewport.width / glLayer.framebufferWidth;
648+
leftRect.h = viewport.height / glLayer.framebufferHeight;
649+
}
650+
} else if (view.eye === 'right') {
651+
eyeCount = 2;
652+
if (viewport) {
653+
rightRect.x = viewport.x / glLayer.framebufferWidth;
654+
rightRect.y = viewport.y / glLayer.framebufferHeight;
655+
rightRect.w = viewport.width / glLayer.framebufferWidth;
656+
rightRect.h = viewport.height / glLayer.framebufferHeight;
657+
}
658+
}
659+
}
660+
this.gameInstance.Module.WebXR.OnStartAR(eyeCount, leftRect, rightRect);
629661
} else {
630662
this.gameInstance.Module.WebXR.OnStartVR(pose.views.length);
631663
}

Assets/WebXR/Plugins/WebGL/webxr.c

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,16 @@
33

44
typedef void (*webxr_void)();
55
typedef void (*webxr_void_int)();
6+
typedef void (*webxr_void_int_float4_float4)(int32_t, float, float, float, float, float, float, float, float);
67
typedef void (*webxr_void_string)();
78

8-
webxr_void_int on_start_ar_ref;
9+
webxr_void_int_float4_float4 on_start_ar_ref;
910
webxr_void_int on_start_vr_ref;
1011
webxr_void on_end_xr_ref;
1112
webxr_void_string on_xr_capabilities_ref;
1213

1314
void set_webxr_events(
14-
webxr_void_int _on_start_ar,
15+
webxr_void_int_float4_float4 _on_start_ar,
1516
webxr_void_int _on_start_vr,
1617
webxr_void _on_end_xr,
1718
webxr_void_string _on_xr_capabilities
@@ -22,9 +23,13 @@ void set_webxr_events(
2223
on_xr_capabilities_ref = _on_xr_capabilities;
2324
}
2425

25-
void EMSCRIPTEN_KEEPALIVE on_start_ar(int views_count)
26+
void EMSCRIPTEN_KEEPALIVE on_start_ar(int views_count,
27+
float left_x, float left_y, float left_w, float left_h,
28+
float right_x, float right_y, float right_w, float right_h)
2629
{
27-
on_start_ar_ref(views_count);
30+
on_start_ar_ref(views_count,
31+
left_x, left_y, left_w, left_h,
32+
right_x, right_y, right_w, right_h);
2833
}
2934

3035
void EMSCRIPTEN_KEEPALIVE on_start_vr(int views_count)

Assets/WebXR/Plugins/WebGL/webxr.jspre

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,13 @@ setTimeout(function () {
2222

2323
Module['WebXR'] = Module['WebXR'] || {};
2424

25-
Module['WebXR'].OnStartAR = function (views_count) {
26-
this.OnStartARInternal = this.OnStartARInternal || Module.cwrap("on_start_ar", null, ["number"]);
27-
this.OnStartARInternal(views_count);
25+
Module['WebXR'].OnStartAR = function (views_count, left_rect, right_rect) {
26+
this.OnStartARInternal = this.OnStartARInternal || Module.cwrap("on_start_ar", null, ["number",
27+
"number", "number", "number", "number",
28+
"number", "number", "number", "number"]);
29+
this.OnStartARInternal(views_count,
30+
left_rect.x, left_rect.y, left_rect.w, left_rect.h,
31+
right_rect.x, right_rect.y, right_rect.w, right_rect.h);
2832
}
2933

3034
Module['WebXR'].OnStartVR = function (views_count) {

Assets/WebXR/Scripts/WebXRCamera.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ public class WebXRCamera : MonoBehaviour
66
{
77
private Camera cameraMain, cameraL, cameraR, cameraARL, cameraARR;
88
private WebXRState xrState = WebXRState.NORMAL;
9+
private Rect leftRect, rightRect;
910

1011
private int viewsCount = 1;
1112

@@ -37,8 +38,9 @@ void Update()
3738
cameraL.enabled = false;
3839
cameraR.enabled = false;
3940
cameraARL.enabled = viewsCount > 0;
40-
cameraARL.rect = new Rect(0, 0, 1f / (float)viewsCount, 1);
41+
cameraARL.rect = leftRect;
4142
cameraARR.enabled = viewsCount > 1;
43+
cameraARR.rect = rightRect;
4244
break;
4345
case WebXRState.VR:
4446
cameraMain.enabled = false;
@@ -57,10 +59,12 @@ void Update()
5759
}
5860
}
5961

60-
private void onXRChange(WebXRState state, int viewsCount)
62+
private void onXRChange(WebXRState state, int viewsCount, Rect leftRect, Rect rightRect)
6163
{
6264
xrState = state;
6365
this.viewsCount = viewsCount;
66+
this.leftRect = leftRect;
67+
this.rightRect = rightRect;
6468
switched = false;
6569
}
6670

Assets/WebXR/Scripts/WebXRManager.cs

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public class WebXRManager : MonoBehaviour
2424
public delegate void XRCapabilitiesUpdate(WebXRDisplayCapabilities capabilities);
2525
public event XRCapabilitiesUpdate OnXRCapabilitiesUpdate;
2626

27-
public delegate void XRChange(WebXRState state, int viewsCount);
27+
public delegate void XRChange(WebXRState state, int viewsCount, Rect leftRect, Rect rightRect);
2828
public event XRChange OnXRChange;
2929

3030
public delegate void HeadsetUpdate(
@@ -55,7 +55,7 @@ public delegate void HeadsetUpdate(
5555
private static extern void ListenWebXRData();
5656

5757
[DllImport("__Internal")]
58-
private static extern void set_webxr_events(Action<int> on_start_ar,
58+
private static extern void set_webxr_events(Action<int, float, float, float, float, float, float, float, float> on_start_ar,
5959
Action<int> on_start_vr,
6060
Action on_end_xr,
6161
Action<string> on_xr_capabilities);
@@ -137,28 +137,32 @@ public void OnXRCapabilities(WebXRDisplayCapabilities capabilities)
137137
OnXRCapabilitiesUpdate(capabilities);
138138
}
139139

140-
public void setXrState(WebXRState state, int viewsCount)
140+
public void setXrState(WebXRState state, int viewsCount, Rect leftRect, Rect rightRect)
141141
{
142142
this.xrState = state;
143143
if (OnXRChange != null)
144-
OnXRChange(state, viewsCount);
144+
OnXRChange(state, viewsCount, leftRect, rightRect);
145145
}
146146

147147
// received start VR from WebVR browser
148148
#if UNITY_WEBGL && !UNITY_EDITOR
149-
[MonoPInvokeCallback(typeof(Action<int>))]
149+
[MonoPInvokeCallback(typeof(Action<int, float, float, float, float, float, float, float, float>))]
150150
#endif
151-
public static void OnStartAR(int viewsCount)
151+
public static void OnStartAR(int viewsCount,
152+
float left_x, float left_y, float left_w, float left_h,
153+
float right_x, float right_y, float right_w, float right_h)
152154
{
153-
Instance.setXrState(WebXRState.AR, viewsCount);
155+
Instance.setXrState(WebXRState.AR, viewsCount,
156+
new Rect(left_x, left_y, left_w, left_h),
157+
new Rect(right_x, right_y, right_w, right_h));
154158
}
155159

156160
#if UNITY_WEBGL && !UNITY_EDITOR
157161
[MonoPInvokeCallback(typeof(Action<int>))]
158162
#endif
159163
public static void OnStartVR(int viewsCount)
160164
{
161-
Instance.setXrState(WebXRState.VR, viewsCount);
165+
Instance.setXrState(WebXRState.VR, viewsCount, new Rect(), new Rect());
162166
}
163167

164168
// receive end VR from WebVR browser
@@ -167,7 +171,7 @@ public static void OnStartVR(int viewsCount)
167171
#endif
168172
public static void OnEndXR()
169173
{
170-
Instance.setXrState(WebXRState.NORMAL, 1);
174+
Instance.setXrState(WebXRState.NORMAL, 1, new Rect(), new Rect());
171175
}
172176

173177
float[] GetMatrixFromSharedArray(int index)

Build/Build/Build.data.unityweb

1.32 KB
Binary file not shown.

Build/Build/Build.wasm

7.61 KB
Binary file not shown.

Build/Build/Build.wasm.framework.unityweb

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

Build/webxr.js

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -625,7 +625,39 @@
625625
{
626626
if (session.isAR)
627627
{
628-
this.gameInstance.Module.WebXR.OnStartAR(pose.views.length);
628+
let eyeCount = 1;
629+
let leftRect = {
630+
x:0,
631+
y:0,
632+
w:1,
633+
h:1
634+
}
635+
let rightRect = {
636+
x:0.5,
637+
y:0,
638+
w:0.5,
639+
h:1
640+
}
641+
for (let view of pose.views) {
642+
let viewport = session.renderState.baseLayer.getViewport(view);
643+
if (view.eye === 'left') {
644+
if (viewport) {
645+
leftRect.x = viewport.x / glLayer.framebufferWidth;
646+
leftRect.y = viewport.y / glLayer.framebufferHeight;
647+
leftRect.w = viewport.width / glLayer.framebufferWidth;
648+
leftRect.h = viewport.height / glLayer.framebufferHeight;
649+
}
650+
} else if (view.eye === 'right') {
651+
eyeCount = 2;
652+
if (viewport) {
653+
rightRect.x = viewport.x / glLayer.framebufferWidth;
654+
rightRect.y = viewport.y / glLayer.framebufferHeight;
655+
rightRect.w = viewport.width / glLayer.framebufferWidth;
656+
rightRect.h = viewport.height / glLayer.framebufferHeight;
657+
}
658+
}
659+
}
660+
this.gameInstance.Module.WebXR.OnStartAR(eyeCount, leftRect, rightRect);
629661
} else {
630662
this.gameInstance.Module.WebXR.OnStartVR(pose.views.length);
631663
}

0 commit comments

Comments
 (0)