From 4fb35f89abfeeaf2a10e3466985938cd159e0277 Mon Sep 17 00:00:00 2001
From: Avaer Kazmer
Date: Sun, 17 Nov 2019 19:16:57 -0500
Subject: [PATCH 01/21] Break out ew.js registration into separate pass
---
ew.js | 43 ++++++++++++++++++++++++++++++++-----------
1 file changed, 32 insertions(+), 11 deletions(-)
diff --git a/ew.js b/ew.js
index e8e3b03..50a8157 100644
--- a/ew.js
+++ b/ew.js
@@ -144,16 +144,6 @@ customElements.define('xr-engine-template', XREngineTemplate, {
extends: 'template',
});
-(async () => {
-
-navigator.serviceWorker.register('/sw.js');
-
-if (navigator.serviceWorker.controller) {
- GlobalContext.loadPromise.resolve();
-} else {
- window.location.reload();
-}
-
['keydown', 'keyup', 'keypress', 'paste'].forEach(type => {
window.addEventListener(type, e => {
const event = {
@@ -544,4 +534,35 @@ core.animate = (timestamp, frame, referenceSpace) => {
};
core.setSession(null);
-})();
+export default {
+ async register() {
+ await navigator.serviceWorker.register('/sw.js');
+
+ if (!navigator.serviceWorker.controller) {
+ await new Promise((accept, reject) => {
+ const _controllerchange = () => {
+ if (navigator.serviceWorker.controller) {
+ navigator.serviceWorker.removeEventListener('controllerchange', _controllerchange);
+ clearTimeout(timeout);
+ accept();
+ }
+ };
+ navigator.serviceWorker.addEventListener('controllerchange', _controllerchange);
+ const timeout = setTimeout(() => {
+ console.warn('ew timed out');
+ debugger;
+ }, 10 * 1000);
+ });
+ }
+
+ console.log('got registration', window.registration);
+
+ GlobalContext.loadPromise.resolve();
+ },
+ async unregister() {
+ const registrations = await navigator.serviceWorker.getRegistrations();
+ for (let i = 0; i < registrations.length; i++) {
+ registrations[i].unregister();
+ }
+ },
+};
From b5367e1406928899bf31998bbd10fa8c44df76c4 Mon Sep 17 00:00:00 2001
From: Avaer Kazmer
Date: Sun, 17 Nov 2019 22:01:46 -0500
Subject: [PATCH 02/21] Add ew.js unregister await
---
ew.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/ew.js b/ew.js
index 50a8157..813ab86 100644
--- a/ew.js
+++ b/ew.js
@@ -562,7 +562,7 @@ export default {
async unregister() {
const registrations = await navigator.serviceWorker.getRegistrations();
for (let i = 0; i < registrations.length; i++) {
- registrations[i].unregister();
+ await registrations[i].unregister();
}
},
};
From 0cba46f5a4d4570559665291c4591b3feb667c3b Mon Sep 17 00:00:00 2001
From: Avaer Kazmer
Date: Sun, 17 Nov 2019 22:02:03 -0500
Subject: [PATCH 03/21] Rename xr-engine canvas event to load
---
src/xr-engine.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/xr-engine.js b/src/xr-engine.js
index 955955e..21741fe 100644
--- a/src/xr-engine.js
+++ b/src/xr-engine.js
@@ -115,7 +115,7 @@ const XREngineProto = {
this.insertAdjacentElement('afterend', win.canvas);
}
- this.dispatchEvent(new MessageEvent('canvas', {
+ this.dispatchEvent(new MessageEvent('load', {
data: win.canvas,
}));
}
From 622bbc5a56044951ff3911c3173a66571071e5ab Mon Sep 17 00:00:00 2001
From: Avaer Kazmer
Date: Sun, 17 Nov 2019 22:07:39 -0500
Subject: [PATCH 04/21] Move back to canvas event instead of load
---
src/xr-engine.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/xr-engine.js b/src/xr-engine.js
index 21741fe..955955e 100644
--- a/src/xr-engine.js
+++ b/src/xr-engine.js
@@ -115,7 +115,7 @@ const XREngineProto = {
this.insertAdjacentElement('afterend', win.canvas);
}
- this.dispatchEvent(new MessageEvent('load', {
+ this.dispatchEvent(new MessageEvent('canvas', {
data: win.canvas,
}));
}
From d336003dcff890ab08740010a3d0d2debfcfcc62 Mon Sep 17 00:00:00 2001
From: Avaer Kazmer
Date: Mon, 18 Nov 2019 01:28:08 -0500
Subject: [PATCH 05/21] Only process attached xr-iframe nodes
---
src/xr-iframe.js | 15 ++++++++++++++-
1 file changed, 14 insertions(+), 1 deletion(-)
diff --git a/src/xr-iframe.js b/src/xr-iframe.js
index 158e40a..02bc032 100644
--- a/src/xr-iframe.js
+++ b/src/xr-iframe.js
@@ -42,15 +42,28 @@ class XRIFrame extends HTMLElement {
this.contentWindow = null;
this.xrOffset = new XRRigidTransform();
+ this.connected = false;
this._highlight = null;
this._extents = [];
this._loadDistance = Infinity;
this._data = {};
}
+ connectedCallback() {
+ this.connected = true;
+
+ const {observedAttributes} = XRIFrame;
+ for (let i = 0; i < observedAttributes.length; i++) {
+ const attributeName = observedAttributes[i];
+ this.attributeChangedCallback(attributeName, null, this.getAttribute(attributeName));
+ }
+ }
+ disconnectedCallback() {
+ this.connected = false;
+ }
async attributeChangedCallback(name, oldValue, newValue) {
await GlobalContext.loadPromise;
- if (newValue !== oldValue) {
+ if (this.connected && newValue !== oldValue) {
if (name === 'src') {
let url = this.getAttribute('src');
From 5fa349bc6b976efc4783046b92ca2aaf177df024 Mon Sep 17 00:00:00 2001
From: Avaer Kazmer
Date: Mon, 18 Nov 2019 03:20:30 -0500
Subject: [PATCH 06/21] Update XR.js inputSources to new WebXR spec
---
src/XR.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/XR.js b/src/XR.js
index a9c7408..1a21b18 100644
--- a/src/XR.js
+++ b/src/XR.js
@@ -103,7 +103,7 @@ class XRSession extends EventTarget {
/* requestFrameOfReference() { // non-standard
return this.requestReferenceSpace.apply(this, arguments);
} */
- getInputSources() {
+ get inputSources() {
return this._inputSources.filter(inputSource => inputSource.connected);
}
requestAnimationFrame(fn) {
@@ -151,7 +151,7 @@ class XRSession extends EventTarget {
this.dispatchEvent(new CustomEvent('end'));
}
update() {
- const inputSources = this.getInputSources();
+ const {inputSources} = this;
const gamepads = GlobalContext.getGamepads();
for (let i = 0; i < inputSources.length; i++) {
From b412b9feaabc26abf7d094b7b982ae058be08ae5 Mon Sep 17 00:00:00 2001
From: Avaer Kazmer
Date: Mon, 18 Nov 2019 04:04:25 -0500
Subject: [PATCH 07/21] Bugfix xr-iframe connected detection load promise wait
---
src/xr-iframe.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/xr-iframe.js b/src/xr-iframe.js
index 02bc032..09fda5e 100644
--- a/src/xr-iframe.js
+++ b/src/xr-iframe.js
@@ -61,9 +61,9 @@ class XRIFrame extends HTMLElement {
this.connected = false;
}
async attributeChangedCallback(name, oldValue, newValue) {
- await GlobalContext.loadPromise;
-
if (this.connected && newValue !== oldValue) {
+ await GlobalContext.loadPromise;
+
if (name === 'src') {
let url = this.getAttribute('src');
From 4052fdab4b53b55961c50a3dc5b731ed605436bf Mon Sep 17 00:00:00 2001
From: Avaer Kazmer
Date: Mon, 18 Nov 2019 18:04:46 -0500
Subject: [PATCH 08/21] Bugfix cryptovoxels rewrite in sw.js
---
sw.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/sw.js b/sw.js
index 19f5b10..6578eda 100644
--- a/sw.js
+++ b/sw.js
@@ -123,7 +123,7 @@ const _rewriteResExt = (url, originalUrl, headers, res) => {
return _rewriteResText(res, jsString => {
const result = jsString
.replace(/https:\/\/www\.cryptovoxels\.com\//g, '/')
- .replace('n._attached&&n.getEngine().enableVR()', 'n.getEngine().enableVR()')
+ .replace('r.enterVR()}))', 'r.enterVR()})),setTimeout(() => {this._btnVR.click();})')
.replace(/this\._rigCameras\[0\]\.viewport=new ([a-zA-Z0-9\.]+)\(0\,0\,\.5\,1\)/g, 'this._rigCameras[0].viewport=new $1(0,0,new FakeXRDisplay().stereo?0.5:1,1)')
.replace(/this\._rigCameras\[1\]\.viewport=new ([a-zA-Z0-9\.]+)\(\.5\,0\,\.5\,1\)/g, 'this._rigCameras[1].viewport=new $1(new FakeXRDisplay().stereo?0.5:0,0,new FakeXRDisplay().stereo?0.5:0,1)')
return result;
From 833af7bc916989e43245f8d1523834bfc4d588ca Mon Sep 17 00:00:00 2001
From: Avaer Kazmer
Date: Mon, 18 Nov 2019 20:31:11 -0500
Subject: [PATCH 09/21] Small dead code cleanup
---
ew.js | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/ew.js b/ew.js
index 813ab86..04c98f9 100644
--- a/ew.js
+++ b/ew.js
@@ -295,8 +295,8 @@ window.addEventListener('contextmenu', e => {
e.preventDefault();
});
-const topVrPresentState = {
- /* hmdType: null,
+/* const topVrPresentState = {
+ hmdType: null,
windowHandle: null,
fbo: null,
msFbo: 0,
@@ -307,8 +307,8 @@ const topVrPresentState = {
mesher: null,
planeTracker: null,
handTracker: null,
- eyeTracker: null, */
-};
+ eyeTracker: null,
+}; */
const requests = [];
const handleRequest = req => {
From 3a18c1a6b82179c03cf2bf34c0d74e8e171a2467 Mon Sep 17 00:00:00 2001
From: Avaer Kazmer
Date: Mon, 18 Nov 2019 20:32:18 -0500
Subject: [PATCH 10/21] Bugfix drop event routing
---
ew.js | 100 ++++++++++++++++++----------------------------
src/WindowBase.js | 5 +++
2 files changed, 43 insertions(+), 62 deletions(-)
diff --git a/ew.js b/ew.js
index 04c98f9..5276942 100644
--- a/ew.js
+++ b/ew.js
@@ -220,76 +220,52 @@ window.addEventListener('resize', e => {
});
window.document.addEventListener('pointerlockchange', e => {
const pointerLockElement = !!window.document.pointerLockElement;
-
for (let i = 0; i < windows.length; i++) {
windows[i].emit('pointerlockchange', {
pointerLockElement,
});
}
});
-window.addEventListener('drop', e => {
- console.log('drop event', e);
- /* const _readFiles = paths => {
- const result = [];
-
- return Promise.all(paths.map(p =>
- new Promise((accept, reject) => {
- fs.lstat(p, (err, stats) => {
- if (!err) {
- if (stats.isFile()) {
- fs.readFile(p, (err, data) => {
- if (!err) {
- const file = new window.Blob([data]);
- file.name = path.basename(p);
- file.path = p;
- result.push(file);
-
- accept();
- } else {
- reject(err);
- }
- });
- } else if (stats.isDirectory()) {
- fs.readdir(p, (err, fileNames) => {
- if (!err) {
- _readFiles(fileNames.map(fileName => path.join(p, fileName)))
- .then(files => {
- result.push.apply(result, files);
-
- accept();
- })
- .catch(err => {
- reject(err);
- });
- } else {
- reject(err);
- }
- });
- } else {
- accept();
- }
- } else {
- reject(err);
- }
- });
- })
- ))
- .then(() => result);
- };
+window.document.addEventListener('drop', e => {
+ const {
+ clientX,
+ clientY,
+ pageX,
+ pageY,
+ offsetX,
+ offsetY,
+ screenX,
+ screenY,
+ movementX,
+ movementY,
+ ctrlKey,
+ shiftKey,
+ altKey,
+ metaKey,
+ button,
+ dataTransfer,
+ } = e;
- _readFiles(data.paths)
- .then(files => {
- const dataTransfer = new window.DataTransfer({
- files,
- });
- const e = new window.DragEvent('drop');
- e.dataTransfer = dataTransfer;
- canvas.dispatchEvent(e);
- })
- .catch(err => {
- console.warn(err.stack);
+ for (let i = 0; i < windows.length; i++) {
+ windows[i].emit('drop', {
+ clientX,
+ clientY,
+ pageX,
+ pageY,
+ offsetX,
+ offsetY,
+ screenX,
+ screenY,
+ movementX,
+ movementY,
+ ctrlKey,
+ shiftKey,
+ altKey,
+ metaKey,
+ button,
+ dataTransfer,
});
- break; */
+ }
});
window.addEventListener('contextmenu', e => {
e.preventDefault();
diff --git a/src/WindowBase.js b/src/WindowBase.js
index 426133b..fc5ea8b 100644
--- a/src/WindowBase.js
+++ b/src/WindowBase.js
@@ -230,6 +230,11 @@ const _oninitmessage = async e => {
target = 'input';
break;
}
+ case 'drop': {
+ constructor = DragEvent;
+ target = 'document';
+ break;
+ }
default: {
constructor = function(type) {
return new Event(type, {
From f4a2abc8404cfd9a108dacdbca9d211bbb90370a Mon Sep 17 00:00:00 2001
From: Avaer Kazmer
Date: Mon, 18 Nov 2019 20:46:54 -0500
Subject: [PATCH 11/21] Scope mouse events capture to xr-engine top canvas
---
ew.js | 36 ------------------------------------
src/xr-engine.js | 37 +++++++++++++++++++++++++++++++++++--
2 files changed, 35 insertions(+), 38 deletions(-)
diff --git a/ew.js b/ew.js
index 5276942..ec78884 100644
--- a/ew.js
+++ b/ew.js
@@ -173,42 +173,6 @@ customElements.define('xr-engine-template', XREngineTemplate, {
}
});
});
-['mousedown', 'mouseup', 'click', 'dblclick', 'mousemove', 'wheel'].forEach(type => {
- window.addEventListener(type, e => {
- const event = {
- altKey: e.altKey,
- button: e.button,
- buttons: e.buttons,
- clientX: e.clientX,
- clientY: e.clientY,
- ctrlKey: e.ctrlKey,
- deltaMode: e.deltaMode,
- deltaX: e.deltaX,
- deltaY: e.deltaY,
- deltaZ: e.deltaZ,
- // detail: e.detail,
- layerX: e.layerX,
- layerY: e.layerY,
- metaKey: e.metaKey,
- movementX: e.movementX,
- movementY: e.movementY,
- offsetX: e.offsetX,
- offsetY: e.offsetY,
- pageX: e.pageX,
- pageY: e.pageY,
- screenX: e.screenX,
- screenY: e.screenY,
- shiftKey: e.shiftKey,
- // timeStamp: e.timeStamp,
- which: e.which,
- x: e.x,
- y: e.y,
- };
- for (let i = 0; i < windows.length; i++) {
- windows[i].emit(type, event);
- }
- });
-});
window.addEventListener('resize', e => {
xrState.metrics[0] = window.innerWidth;
xrState.metrics[1] = window.innerHeight;
diff --git a/src/xr-engine.js b/src/xr-engine.js
index 955955e..7c88f51 100644
--- a/src/xr-engine.js
+++ b/src/xr-engine.js
@@ -78,8 +78,41 @@ const XREngineProto = {
win.canvas.height = GlobalContext.xrState.renderHeight[0];
win.canvas.style.width = '100%';
win.canvas.style.height = '100%';
- win.canvas.addEventListener('mousedown', e => {
- e.preventDefault();
+ ['mousedown', 'mouseup', 'click', 'dblclick', 'mousemove', 'wheel'].forEach(type => {
+ win.canvas.addEventListener(type, e => {
+ const event = {
+ altKey: e.altKey,
+ button: e.button,
+ buttons: e.buttons,
+ clientX: e.clientX,
+ clientY: e.clientY,
+ ctrlKey: e.ctrlKey,
+ deltaMode: e.deltaMode,
+ deltaX: e.deltaX,
+ deltaY: e.deltaY,
+ deltaZ: e.deltaZ,
+ // detail: e.detail,
+ layerX: e.layerX,
+ layerY: e.layerY,
+ metaKey: e.metaKey,
+ movementX: e.movementX,
+ movementY: e.movementY,
+ offsetX: e.offsetX,
+ offsetY: e.offsetY,
+ pageX: e.pageX,
+ pageY: e.pageY,
+ screenX: e.screenX,
+ screenY: e.screenY,
+ shiftKey: e.shiftKey,
+ // timeStamp: e.timeStamp,
+ which: e.which,
+ x: e.x,
+ y: e.y,
+ };
+ for (let i = 0; i < GlobalContext.windows.length; i++) {
+ GlobalContext.windows[i].emit(type, event);
+ }
+ });
});
win.canvas.addEventListener('mouseenter', e => {
const {x, y, width, height} = win.canvas.getBoundingClientRect();
From 3f13e18905077c7d227bcf42a532543642d7d3fe Mon Sep 17 00:00:00 2001
From: Avaer Kazmer
Date: Mon, 18 Nov 2019 21:00:36 -0500
Subject: [PATCH 12/21] Read initial xr-engine root canvas metrics before
mouseenter event
---
src/xr-engine.js | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/src/xr-engine.js b/src/xr-engine.js
index 7c88f51..1f6b772 100644
--- a/src/xr-engine.js
+++ b/src/xr-engine.js
@@ -114,13 +114,14 @@ const XREngineProto = {
}
});
});
- win.canvas.addEventListener('mouseenter', e => {
+ const _mouseenter = () => {
const {x, y, width, height} = win.canvas.getBoundingClientRect();
GlobalContext.xrState.canvasViewport[0] = x;
GlobalContext.xrState.canvasViewport[1] = y;
GlobalContext.xrState.canvasViewport[2] = width;
GlobalContext.xrState.canvasViewport[3] = height;
- });
+ };
+ win.canvas.addEventListener('mouseenter', _mouseenter);
win.ctx = win.canvas.getContext(window.WebGL2RenderingContext ? 'webgl2' : 'webgl', {
antialias: true,
alpha: true,
@@ -151,6 +152,8 @@ const XREngineProto = {
this.dispatchEvent(new MessageEvent('canvas', {
data: win.canvas,
}));
+
+ _mouseenter();
}
return win.ctx;
};
From 6d856f387228b8ce898a76af303fbd3a0259c539 Mon Sep 17 00:00:00 2001
From: Avaer Kazmer
Date: Tue, 19 Nov 2019 03:59:42 -0500
Subject: [PATCH 13/21] Do not emit inner enterXr on child windows
---
src/Window.js | 4 ++--
src/xr-engine.js | 4 ++--
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/src/Window.js b/src/Window.js
index 6fb9a03..12163be 100644
--- a/src/Window.js
+++ b/src/Window.js
@@ -844,7 +844,7 @@ self.onrunasync = req => {
self.tickAnimationFrame(req);
break;
}
- case 'enterXr': {
+ /* case 'enterXr': {
console.log('handle enter xr', GlobalContext.id);
self.vrdisplaypresentchange();
for (let i = 0; i < windows.length; i++) {
@@ -862,7 +862,7 @@ self.onrunasync = req => {
});
}
break;
- }
+ } */
case 'response': {
const {keypath} = req;
diff --git a/src/xr-engine.js b/src/xr-engine.js
index 1f6b772..f2aab18 100644
--- a/src/xr-engine.js
+++ b/src/xr-engine.js
@@ -247,9 +247,9 @@ const XREngineProto = {
win.canvas.width = fullWidth;
win.canvas.height = height;
- await win.runAsync({
+ /* await win.runAsync({
method: 'enterXr',
- });
+ }); */
console.log('XR setup complete');
});
From 80c969d78a2e4b211809cc3efc49222de870b9d6 Mon Sep 17 00:00:00 2001
From: Avaer Kazmer
Date: Tue, 19 Nov 2019 04:50:48 -0500
Subject: [PATCH 14/21] Small DOMPoint references cleanup
---
src/XR.js | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/src/XR.js b/src/XR.js
index 1a21b18..2911bb0 100644
--- a/src/XR.js
+++ b/src/XR.js
@@ -696,10 +696,10 @@ class XRBoundedReferenceSpace extends XRReferenceSpace {
super();
this.boundsGeometry = [
- new GlobalContext.DOMPoint(-3, -3),
- new GlobalContext.DOMPoint(3, -3),
- new GlobalContext.DOMPoint(3, 3),
- new GlobalContext.DOMPoint(-3, 3),
+ new DOMPoint(-3, -3),
+ new DOMPoint(3, -3),
+ new DOMPoint(3, 3),
+ new DOMPoint(-3, 3),
];
this.emulatedHeight = 0;
}
From 0fdd37e2ddc771e80d93831d26c942679c6a4b02 Mon Sep 17 00:00:00 2001
From: Avaer Kazmer
Date: Tue, 19 Nov 2019 06:27:34 -0500
Subject: [PATCH 15/21] Comment out dead xrState entry
---
ew.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/ew.js b/ew.js
index ec78884..e7d104c 100644
--- a/ew.js
+++ b/ew.js
@@ -128,7 +128,7 @@ const xrState = (() => {
result.msDepthTex = _makeTypedArray(Uint32Array, 1);
result.aaEnabled = _makeTypedArray(Uint32Array, 1);
result.fakeVrDisplayEnabled = _makeTypedArray(Uint32Array, 1);
- result.blobId = _makeTypedArray(Uint32Array, 1);
+ // result.blobId = _makeTypedArray(Uint32Array, 1);
return result;
})();
From ce83bfc378bb9b9c9d655b81b5c38df28b93637b Mon Sep 17 00:00:00 2001
From: Avaer Kazmer
Date: Tue, 19 Nov 2019 06:35:20 -0500
Subject: [PATCH 16/21] Bugfix ew.js to account for handedness
---
ew.js | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/ew.js b/ew.js
index e7d104c..ce22522 100644
--- a/ew.js
+++ b/ew.js
@@ -413,7 +413,8 @@ core.animate = (timestamp, frame, referenceSpace) => {
// console.log('got gamepads', gamepads);
// debugger;
const _loadGamepad = i => {
- const inputSource = inputSources[i];
+ const handedness = i === 0 ? 'left' : 'right';
+ const inputSource = inputSources.find(inputSource => inputSource.handedness === handedness);
const xrGamepad = xrState.gamepads[i];
let pose, gamepad;
From f663e8464544fb9e8aecfd3200f1db206144e4e9 Mon Sep 17 00:00:00 2001
From: Avaer Kazmer
Date: Tue, 19 Nov 2019 20:42:18 -0500
Subject: [PATCH 17/21] Add custom DOMPoint implementation
---
src/Window.js | 1 +
src/XR.js | 34 ++++++++++++++++++++++++++++++++++
2 files changed, 35 insertions(+)
diff --git a/src/Window.js b/src/Window.js
index 12163be..466c7c3 100644
--- a/src/Window.js
+++ b/src/Window.js
@@ -362,6 +362,7 @@ const _fetchText = src => fetch(src)
window.XRPose = XR.XRPose;
window.XRViewerPose = XR.XRViewerPose;
window.XRInputSource = XR.XRInputSource;
+ window.DOMPoint = XR.DOMPoint;
window.XRRay = XR.XRRay;
window.XRInputPose = XR.XRInputPose;
window.XRInputSourceEvent = XR.XRInputSourceEvent;
diff --git a/src/XR.js b/src/XR.js
index 2911bb0..62aa9b3 100644
--- a/src/XR.js
+++ b/src/XR.js
@@ -492,6 +492,39 @@ class XRInputSource {
}
}
+class DOMPoint {
+ constructor(x, y, z, w) {
+ if (typeof x === 'object') {
+ this._buffer = x;
+ } else {
+ if (x === undefined) {
+ x = 0;
+ }
+ if (y === undefined) {
+ y = 0;
+ }
+ if (z === undefined) {
+ z = 0;
+ }
+ if (w === undefined) {
+ w = 1;
+ }
+ this._buffer = Float32Array.from([x, y, z, w]);
+ }
+ }
+ get x() { return this._buffer[0]; }
+ set x(x) { this._buffer[0] = x; }
+ get y() { return this._buffer[1]; }
+ set y(y) { this._buffer[1] = y; }
+ get z() { return this._buffer[2]; }
+ set z(z) { this._buffer[2] = z; }
+ get w() { return this._buffer[3]; }
+ set w(w) { this._buffer[3] = w; }
+ fromPoint(p) {
+ return new DOMPoint(p.x, p.y, p.z, p.w);
+ }
+}
+
class XRRay { // non-standard
constructor() {
this.origin = new DOMPoint();
@@ -717,6 +750,7 @@ export {
XRPose,
XRViewerPose,
XRInputSource,
+ DOMPoint,
XRRay,
XRInputPose,
XRInputSourceEvent,
From ad5ea305aada035976d1d7440af37e8c619b44dd Mon Sep 17 00:00:00 2001
From: Avaer Kazmer
Date: Tue, 19 Nov 2019 20:42:54 -0500
Subject: [PATCH 18/21] Use custom DOMPoint implementation for XRRidigTransform
---
src/XR.js | 59 ++++++++++++++++++++++++++----------------------
src/xr-iframe.js | 12 +++++-----
2 files changed, 38 insertions(+), 33 deletions(-)
diff --git a/src/XR.js b/src/XR.js
index 62aa9b3..8a7beb1 100644
--- a/src/XR.js
+++ b/src/XR.js
@@ -472,9 +472,14 @@ class XRInputSource {
this._xrStateGamepad = xrStateGamepad;
this.targetRaySpace = new XRSpace();
+ this.targetRaySpace._pose.transform.position._buffer = xrStateGamepad.position;
+ this.targetRaySpace._pose.transform.orientation._buffer = xrStateGamepad.orientation;
this.targetRaySpace._pose._realViewMatrix = xrStateGamepad.transformMatrix;
this.targetRaySpace._pose._localViewMatrix = this.targetRaySpace._pose.transform.inverse.matrix;
- this.gripSpace = new XRSpace();
+
+ this.gripSpace = new XRSpace(); // XXX make separate
+ this.gripSpace._pose.transform.position._buffer = xrStateGamepad.position;
+ this.gripSpace._pose.transform.orientation._buffer = xrStateGamepad.orientation;
this.gripSpace._pose._realViewMatrix = xrStateGamepad.transformMatrix;
this.gripSpace._pose._localViewMatrix = this.targetRaySpace._pose.transform.inverse.matrix;
@@ -577,30 +582,30 @@ class XRRigidTransform extends EventTarget {
scale = {x: 1, y: 1, z: 1};
}
- this._position[0] = position.x;
- this._position[1] = position.y;
- this._position[2] = position.z;
+ this._position._buffer[0] = position.x;
+ this._position._buffer[1] = position.y;
+ this._position._buffer[2] = position.z;
- this._orientation[0] = orientation.x;
- this._orientation[1] = orientation.y;
- this._orientation[2] = orientation.z;
- this._orientation[3] = orientation.w;
+ this._orientation._buffer[0] = orientation.x;
+ this._orientation._buffer[1] = orientation.y;
+ this._orientation._buffer[2] = orientation.z;
+ this._orientation._buffer[3] = orientation.w;
- this._scale[0] = scale.x;
- this._scale[1] = scale.y;
- this._scale[2] = scale.z;
+ this._scale._buffer[0] = scale.x;
+ this._scale._buffer[1] = scale.y;
+ this._scale._buffer[2] = scale.z;
localMatrix
- .compose(localVector.fromArray(this._position), localQuaternion.fromArray(this._orientation), localVector2.fromArray(this._scale))
+ .compose(localVector.fromArray(this._position._buffer), localQuaternion.fromArray(this._orientation._buffer), localVector2.fromArray(this._scale._buffer))
.toArray(this.matrix);
localMatrix
.getInverse(localMatrix)
.toArray(this.matrixInverse);
localMatrix
.decompose(localVector, localQuaternion, localVector2);
- localVector.toArray(this._positionInverse);
- localQuaternion.toArray(this._orientationInverse);
- localVector2.toArray(this._scaleInverse);
+ localVector.toArray(this._positionInverse._buffer);
+ localQuaternion.toArray(this._orientationInverse._buffer);
+ localVector2.toArray(this._scaleInverse._buffer);
}
if (!this._inverse) {
@@ -615,13 +620,13 @@ class XRRigidTransform extends EventTarget {
{
let index = this._inverse ? ((3 + 4 + 3 + 16) * Float32Array.BYTES_PER_ELEMENT) : 0;
- this._position = new Float32Array(this._buffer, index, 3);
+ this._position = new DOMPoint(new Float32Array(this._buffer, index, 3));
index += 3 * Float32Array.BYTES_PER_ELEMENT;
- this._orientation = new Float32Array(this._buffer, index, 4);
+ this._orientation = new DOMPoint(new Float32Array(this._buffer, index, 4));
index += 4 * Float32Array.BYTES_PER_ELEMENT;
- this._scale = new Float32Array(this._buffer, index, 3);
+ this._scale = new DOMPoint(new Float32Array(this._buffer, index, 3));
index += 3 * Float32Array.BYTES_PER_ELEMENT;
this.matrix = new Float32Array(this._buffer, index, 16);
@@ -630,13 +635,13 @@ class XRRigidTransform extends EventTarget {
{
let index = this._inverse ? 0 : ((3 + 4 + 3 + 16) * Float32Array.BYTES_PER_ELEMENT);
- this._positionInverse = new Float32Array(this._buffer, index, 3);
+ this._positionInverse = new DOMPoint(new Float32Array(this._buffer, index, 3));
index += 3 * Float32Array.BYTES_PER_ELEMENT;
- this._orientationInverse = new Float32Array(this._buffer, index, 4);
+ this._orientationInverse = new DOMPoint(new Float32Array(this._buffer, index, 4));
index += 4 * Float32Array.BYTES_PER_ELEMENT;
- this._scaleInverse = new Float32Array(this._buffer, index, 3);
+ this._scaleInverse = new DOMPoint(new Float32Array(this._buffer, index, 3));
index += 3 * Float32Array.BYTES_PER_ELEMENT;
this.matrixInverse = new Float32Array(this._buffer, index, 16);
@@ -686,9 +691,9 @@ class XRRigidTransform extends EventTarget {
pushUpdate() {
localMatrix
.compose(
- localVector.fromArray(this._position),
- localQuaternion.fromArray(this._orientation),
- localVector2.fromArray(this._scale)
+ localVector.fromArray(this._position._buffer),
+ localQuaternion.fromArray(this._orientation._buffer),
+ localVector2.fromArray(this._scale._buffer)
)
.toArray(this.matrix);
localMatrix
@@ -696,9 +701,9 @@ class XRRigidTransform extends EventTarget {
.toArray(this.matrixInverse);
localMatrix
.decompose(localVector, localQuaternion, localVector2);
- localVector.toArray(this._positionInverse);
- localQuaternion.toArray(this._orientationInverse);
- localVector2.toArray(this._scaleInverse);
+ localVector.toArray(this._positionInverse._buffer);
+ localQuaternion.toArray(this._orientationInverse._buffer);
+ localVector2.toArray(this._scaleInverse._buffer);
GlobalContext.xrState.offsetEpoch[0]++;
}
diff --git a/src/xr-iframe.js b/src/xr-iframe.js
index 09fda5e..dbb19a2 100644
--- a/src/xr-iframe.js
+++ b/src/xr-iframe.js
@@ -128,15 +128,15 @@ class XRIFrame extends HTMLElement {
const {key, value} = event;
if (key === 'position') {
this.position = value;
- this.xrOffset._position.set(value);
+ this.xrOffset._position._buffer.set(value);
this.xrOffset.pushUpdate();
} else if (key === 'orientation') {
this.orientation = value;
- this.xrOffset._orientation.set(value);
+ this.xrOffset._orientation._buffer.set(value);
this.xrOffset.pushUpdate();
} else if (key === 'scale') {
this.scale = value;
- this.xrOffset._scale.set(value);
+ this.xrOffset._scale._buffer.set(value);
this.xrOffset.pushUpdate();
}
},
@@ -166,7 +166,7 @@ class XRIFrame extends HTMLElement {
if (position.length === 3) {
position = position.map(s => parseFloat(s));
if (position.every(n => isFinite(n))) {
- this.xrOffset._position.set(position);
+ this.xrOffset._position._buffer.set(position);
this.xrOffset.pushUpdate();
}
}
@@ -175,7 +175,7 @@ class XRIFrame extends HTMLElement {
if (orientation.length === 4) {
orientation = orientation.map(s => parseFloat(s));
if (orientation.every(n => isFinite(n))) {
- this.xrOffset._orientation.set(orientation);
+ this.xrOffset._orientation._buffer.set(orientation);
this.xrOffset.pushUpdate();
}
}
@@ -184,7 +184,7 @@ class XRIFrame extends HTMLElement {
if (scale.length === 3) {
scale = scale.map(s => parseFloat(s));
if (scale.every(n => isFinite(n))) {
- this.xrOffset._scale.set(scale);
+ this.xrOffset._scale._buffer.set(scale);
this.xrOffset.pushUpdate();
}
}
From 33edb9dcd655aea9c9e7d9600725fbd997ef2e3c Mon Sep 17 00:00:00 2001
From: Avaer Kazmer
Date: Tue, 19 Nov 2019 21:02:06 -0500
Subject: [PATCH 19/21] Remove dead VR.js code
---
src/VR.js | 12 ------------
1 file changed, 12 deletions(-)
diff --git a/src/VR.js b/src/VR.js
index 05a8a18..76897d4 100644
--- a/src/VR.js
+++ b/src/VR.js
@@ -456,18 +456,6 @@ class FakeXRDisplay {
GlobalContext.xrState.fakeVrDisplayEnabled[0] = 0;
}
- /* get width() {
- return GlobalContext.xrState.renderWidth[0]*2;
- }
- set width(width) {
- GlobalContext.xrState.renderWidth[0] = width/2;
- }
- get height() {
- return GlobalContext.xrState.renderHeight[0];
- }
- set height(height) {
- GlobalContext.xrState.renderHeight[0] = height;
- } */
get width() {
if (GlobalContext.xrState.stereo[0]) {
return GlobalContext.xrState.renderWidth[0];
From e64698142cda5836c5e68b59cb28827531885c10 Mon Sep 17 00:00:00 2001
From: Avaer Kazmer
Date: Wed, 20 Nov 2019 02:50:44 -0500
Subject: [PATCH 20/21] Bugfix core reference space capture on change
---
src/xr-engine.js | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/xr-engine.js b/src/xr-engine.js
index f2aab18..083cabf 100644
--- a/src/xr-engine.js
+++ b/src/xr-engine.js
@@ -217,6 +217,7 @@ const XREngineProto = {
}
if (referenceSpaceType !== lastReferenceSpaceType) {
+ core.setReferenceSpace(referenceSpace);
console.log(`referenceSpace changed to ${referenceSpaceType}`);
}
};
From a08901855b23e935aadabcd7648fe509975dbdf2 Mon Sep 17 00:00:00 2001
From: Avaer Kazmer
Date: Wed, 20 Nov 2019 03:24:03 -0500
Subject: [PATCH 21/21] Absorb initial vrdisplayconnect metrics in ew.js
---
ew.js | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
diff --git a/ew.js b/ew.js
index ce22522..d0ed33c 100644
--- a/ew.js
+++ b/ew.js
@@ -234,6 +234,23 @@ window.document.addEventListener('drop', e => {
window.addEventListener('contextmenu', e => {
e.preventDefault();
});
+window.addEventListener('vrdisplayconnect', e => {
+ const {display} = e;
+ const eyeParameters = ['left', 'right'].map(eye => display.getEyeParameters(eye));
+ const width = Math.max(eyeParameters[0].renderWidth, eyeParameters[1].renderWidth);
+ const height = Math.max(eyeParameters[0].renderHeight, eyeParameters[1].renderHeight);
+
+ xrState.renderWidth[0] = width;
+ xrState.renderHeight[0] = height;
+
+ for (let i = 0; i < windows.length; i++) {
+ const win = windows[i];
+ if (win.canvas) {
+ win.canvas.width = width * 2;
+ win.canvas.height = height;
+ }
+ }
+});
/* const topVrPresentState = {
hmdType: null,