Skip to content
This repository was archived by the owner on Jul 22, 2024. It is now read-only.

Commit ec95a92

Browse files
authored
Merge pull request #213 from delapuente/issue-125-free-flight
Introducing FreeFlight fallback
2 parents 9e0e829 + f1c2e90 commit ec95a92

15 files changed

+399
-83
lines changed

Assets/WebGLTemplates/WebVR/styles/webvr.css

+2
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@ a:link, a:visited {
130130
position: absolute;
131131
top: 0;
132132
width: 100%;
133+
pointer-events: none;
133134
}
134135

135136
#instruction button {
@@ -148,6 +149,7 @@ a:link, a:visited {
148149
display: none;
149150
max-width: 50%;
150151
padding: 10px 30px;
152+
pointer-events: all;
151153
}
152154

153155
.panel[data-enabled='true'] {

Assets/WebGLTemplates/WebVR/webvr.js

+64-47
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,14 @@
22
'use strict';
33

44
var defaultHeight = 1.5;
5-
var entervrButton = document.querySelector('#entervr');
6-
var container = document.querySelector('#game');
7-
var status = document.querySelector('#status');
8-
var icons = document.querySelector('#icons');
9-
var controller = document.querySelector('#motion-controller');
5+
6+
var enterVRButton = document.getElementById('entervr');
7+
var gameContainer = document.getElementById('game');
8+
var vrHardwareStatus = document.getElementById('status');
9+
var statusIcons = document.getElementById('icons');
10+
var controllerIconTemplate = document.getElementById('motion-controller');
11+
var noVRInstructions = document.getElementById('novr');
12+
1013
var windowRaf = window.requestAnimationFrame;
1114
var vrDisplay = null;
1215
var canvas = null;
@@ -46,25 +49,34 @@
4649
}
4750

4851
function onUnity (msg) {
49-
// Measure Round-Trip Time from Unity.
50-
if (msg.detail === 'Timer') {
51-
var delta = window.performance.now() - testTimeStart;
52-
console.log('return time (ms): ',delta);
53-
testTimeStart = null;
54-
return;
55-
}
52+
// This way of passing messages is deprecated. Use rich objects instead.
53+
if (typeof msg.detail === 'string') {
54+
// Measure Round-Trip Time from Unity.
55+
if (msg.detail === 'Timer') {
56+
var delta = window.performance.now() - testTimeStart;
57+
console.log('return time (ms): ',delta);
58+
testTimeStart = null;
59+
return;
60+
}
5661

57-
// Wait for Unity to render the frame; then submit the frame to the VR display.
58-
if (msg.detail === 'PostRender') {
59-
submitNextFrame = vrDisplay && vrDisplay.isPresenting;
60-
if (submitNextFrame) {
61-
vrDisplay.requestAnimationFrame(onAnimate);
62+
// Wait for Unity to render the frame; then submit the frame to the VR display.
63+
if (msg.detail === 'PostRender') {
64+
submitNextFrame = vrDisplay && vrDisplay.isPresenting;
65+
if (submitNextFrame) {
66+
vrDisplay.requestAnimationFrame(onAnimate);
67+
}
68+
}
69+
70+
// Handle quick VR/normal toggling.
71+
if (msg.detail.indexOf('ConfigureToggleVRKeyName') === 0) {
72+
toggleVRKeyName = msg.detail.split(':')[1];
6273
}
6374
}
6475

65-
// Handle quick VR/normal toggling.
66-
if (msg.detail.indexOf('ConfigureToggleVRKeyName') === 0) {
67-
toggleVRKeyName = msg.detail.split(':')[1];
76+
// Handle an UI command
77+
if (msg.detail.type === 'ShowPanel') {
78+
var panelId = document.getElementById(msg.detail.panelId);
79+
showInstruction(panelId);
6880
}
6981
}
7082

@@ -88,7 +100,7 @@
88100
return vrDisplay.requestPresent([{source: canvas}]).then(function () {
89101
// Start stereo rendering in Unity.
90102
console.log('Entered VR mode');
91-
gameInstance.SendMessage('WebVRCameraSet', 'Begin');
103+
gameInstance.SendMessage('WebVRCameraSet', 'OnStartVR');
92104
}).catch(function (err) {
93105
console.error('Unable to enter VR mode:', err);
94106
});
@@ -101,7 +113,7 @@
101113
}
102114
function done () {
103115
// End stereo rendering in Unity.
104-
gameInstance.SendMessage('WebVRCameraSet', 'End');
116+
gameInstance.SendMessage('WebVRCameraSet', 'OnEndVR');
105117
onResize();
106118
}
107119
return vrDisplay.exitPresent().then(function () {
@@ -223,11 +235,11 @@
223235
// scale game container so we get a proper sized mirror of VR content to desktop.
224236
var scaleX = window.innerWidth / renderWidth;
225237
var scaleY = window.innerHeight / renderHeight;
226-
container.setAttribute('style', `transform: scale(${scaleX}, ${scaleY}); transform-origin: top left;`);
238+
gameContainer.setAttribute('style', `transform: scale(${scaleX}, ${scaleY}); transform-origin: top left;`);
227239
} else {
228240
canvas.width = window.innerWidth;
229241
canvas.height = window.innerHeight;
230-
container.style.transform = '';
242+
gameContainer.style.transform = '';
231243
}
232244
}
233245

@@ -242,6 +254,7 @@
242254
}
243255

244256
function showInstruction (el) {
257+
if (el.dataset.enabled) { return; }
245258
var confirmButton = el.querySelector('button');
246259
el.dataset.enabled = true;
247260
confirmButton.addEventListener('click', onConfirm);
@@ -252,19 +265,19 @@
252265
}
253266

254267
function updateStatus () {
255-
if (parseInt(status.dataset.gamepads) !== vrGamepads.length) {
268+
if (parseInt(vrHardwareStatus.dataset.gamepads) !== vrGamepads.length) {
256269
var controllerClassName = 'controller-icon';
257-
var controlIcons = icons.getElementsByClassName(controllerClassName);
270+
var controlIcons = statusIcons.getElementsByClassName(controllerClassName);
258271
while (controlIcons.length > 0) {
259272
controlIcons[0].parentNode.removeChild(controlIcons[0]);
260273
}
261274

262275
vrGamepads.forEach(function (gamepad) {
263-
var controllerIcon = document.importNode(controller.content, true);
276+
var controllerIcon = document.importNode(controllerIconTemplate.content, true);
264277
controllerIcon.querySelector('img').className = controllerClassName;
265-
icons.appendChild(controllerIcon);
278+
statusIcons.appendChild(controllerIcon);
266279
});
267-
status.dataset.gamepads = vrGamepads.length;
280+
vrHardwareStatus.dataset.gamepads = vrGamepads.length;
268281
}
269282
}
270283

@@ -287,26 +300,30 @@
287300
frameData = new VRFrameData();
288301

289302
return navigator.getVRDisplays().then(function(displays) {
290-
if (!displays.length) {
291-
return null;
303+
var canPresent = false;
304+
var hasPosition = false;
305+
var hasOrientation = false;
306+
var hasExternalDisplay = false;
307+
308+
if (displays.length) {
309+
vrDisplay = displays[displays.length - 1];
310+
canPresent = vrDisplay.capabilities.canPresent;
311+
hasPosition = vrDisplay.capabilities.hasPosition;
312+
hasOrientation = vrDisplay.capabilities.hasOrientation;
313+
hasExternalDisplay = vrDisplay.capabilities.hasExternalDisplay;
292314
}
293315

294-
vrDisplay = displays[displays.length - 1];
295-
296-
if (!vrDisplay) {
297-
return null;
298-
}
316+
enterVRButton.dataset.enabled = canPresent;
299317

300-
if (isPolyfilled(vrDisplay)) {
301-
showInstruction(document.querySelector('#novr'));
302-
} else {
303-
status.dataset.enabled = 'true';
304-
}
305-
306-
if (vrDisplay.capabilities && vrDisplay.capabilities.canPresent) {
307-
// Enable button to toggle entering/exiting VR.
308-
entervrButton.dataset.enabled = 'true';
309-
}
318+
gameInstance.SendMessage(
319+
'WebVRCameraSet', 'OnVRCapabilities',
320+
JSON.stringify({
321+
canPresent: canPresent,
322+
hasPosition: hasPosition,
323+
hasOrientation: hasOrientation,
324+
hasExternalDisplay: hasExternalDisplay
325+
})
326+
);
310327

311328
return vrDisplay;
312329
}).catch(function (err) {
@@ -335,7 +352,7 @@
335352
window.addEventListener('keyup', onKeyUp, false);
336353
document.addEventListener('UnityLoaded', onUnityLoaded, false);
337354
document.addEventListener('Unity', onUnity);
338-
entervrButton.addEventListener('click', onToggleVR, false);
355+
enterVRButton.addEventListener('click', onToggleVR, false);
339356

340357
onResize();
341358

Assets/WebVR/Plugins/WebGL/webvr.jslib

+4
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,9 @@ mergeInto(LibraryManager.library, {
1414

1515
ConfigureToggleVRKeyName: function (keyName) {
1616
document.dispatchEvent(new CustomEvent('Unity', {detail: 'ConfigureToggleVRKeyName:' + Pointer_stringify(keyName)}));
17+
},
18+
19+
ShowPanel: function (panelId) {
20+
document.dispatchEvent(new CustomEvent('Unity', {detail: {type: 'ShowPanel', panelId: Pointer_stringify(panelId)}}));
1721
}
1822
});

Assets/WebVR/Prefabs/WebVRCameraSet.prefab

+24
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ GameObject:
7575
- component: {fileID: 20329244052411564}
7676
- component: {fileID: 124144808855090856}
7777
- component: {fileID: 92017933162973034}
78+
- component: {fileID: 114089120386618070}
7879
m_Layer: 0
7980
m_Name: CameraMain
8081
m_TagString: Untagged
@@ -273,6 +274,29 @@ Behaviour:
273274
m_PrefabInternal: {fileID: 100100000}
274275
m_GameObject: {fileID: 1147971983220084}
275276
m_Enabled: 1
277+
--- !u!114 &114089120386618070
278+
MonoBehaviour:
279+
m_ObjectHideFlags: 1
280+
m_PrefabParentObject: {fileID: 0}
281+
m_PrefabInternal: {fileID: 100100000}
282+
m_GameObject: {fileID: 1614126958852788}
283+
m_Enabled: 1
284+
m_EditorHideFlags: 0
285+
m_Script: {fileID: 11500000, guid: 683f145ef879be447ba25c1080ac1984, type: 3}
286+
m_Name:
287+
m_EditorClassIdentifier:
288+
rotationEnabled: 1
289+
translationEnabled: 1
290+
noVROffset: {x: 0, y: 1.2, z: 0}
291+
rotationSpeed: 90
292+
translationSpeed: 7
293+
rotationDeadDistance: 0.001
294+
moveForwardKeys: 7700000011010000
295+
moveBackwardKeys: 7300000012010000
296+
strideRightKeys: 6400000013010000
297+
strideLeftKeys: 6100000014010000
298+
moveUpwardKeys: 72000000
299+
moveDownwardKeys: 66000000
276300
--- !u!114 &114951743782495552
277301
MonoBehaviour:
278302
m_ObjectHideFlags: 1

Assets/WebVR/Scenes/WebVR.unity

+2-12
Original file line numberDiff line numberDiff line change
@@ -788,7 +788,7 @@ Prefab:
788788
objectReference: {fileID: 0}
789789
- target: {fileID: 400030, guid: 013217fcf4bba4f3380d9159876fa8ea, type: 3}
790790
propertyPath: m_RootOrder
791-
value: 2
791+
value: 1
792792
objectReference: {fileID: 0}
793793
- target: {fileID: 9500000, guid: 013217fcf4bba4f3380d9159876fa8ea, type: 3}
794794
propertyPath: m_Enabled
@@ -970,7 +970,7 @@ Prefab:
970970
objectReference: {fileID: 0}
971971
- target: {fileID: 400030, guid: c99aacc3accab4fdaadab5e3ea13b9c7, type: 3}
972972
propertyPath: m_RootOrder
973-
value: 1
973+
value: 2
974974
objectReference: {fileID: 0}
975975
- target: {fileID: 9500000, guid: c99aacc3accab4fdaadab5e3ea13b9c7, type: 3}
976976
propertyPath: m_Enabled
@@ -1601,16 +1601,6 @@ Prefab:
16011601
propertyPath: m_RootOrder
16021602
value: 0
16031603
objectReference: {fileID: 0}
1604-
- target: {fileID: 114951743782495552, guid: 78df02845d4b54181b4ca9188aba0671,
1605-
type: 2}
1606-
propertyPath: rightHandObject
1607-
value:
1608-
objectReference: {fileID: 1269233424}
1609-
- target: {fileID: 114951743782495552, guid: 78df02845d4b54181b4ca9188aba0671,
1610-
type: 2}
1611-
propertyPath: leftHandObject
1612-
value:
1613-
objectReference: {fileID: 821505835}
16141604
m_RemovedComponents: []
16151605
m_ParentPrefab: {fileID: 100100000, guid: 78df02845d4b54181b4ca9188aba0671, type: 2}
16161606
m_IsPrefabParent: 0

Assets/WebVR/Scripts/Input.meta

+10
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)