You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

96 lines
2.0 KiB

2 years ago
import {init} from './shared-orbitcontrols.js';
import {EventDispatcher} from 'https://cdn.skypack.dev/three@0.136.0/build/three.module.js';
function noop() {
}
class ElementProxyReceiver extends EventDispatcher {
constructor() {
super();
// because OrbitControls try to set style.touchAction;
this.style = {};
}
get clientWidth() {
return this.width;
}
get clientHeight() {
return this.height;
}
// OrbitControls call these as of r132. Maybe we should implement them
setPointerCapture() { }
releasePointerCapture() { }
getBoundingClientRect() {
return {
left: this.left,
top: this.top,
width: this.width,
height: this.height,
right: this.left + this.width,
bottom: this.top + this.height,
};
}
handleEvent(data) {
if (data.type === 'size') {
this.left = data.left;
this.top = data.top;
this.width = data.width;
this.height = data.height;
return;
}
data.preventDefault = noop;
data.stopPropagation = noop;
this.dispatchEvent(data);
}
focus() {
// no-op
}
}
class ProxyManager {
constructor() {
this.targets = {};
this.handleEvent = this.handleEvent.bind(this);
}
makeProxy(data) {
const {id} = data;
const proxy = new ElementProxyReceiver();
this.targets[id] = proxy;
}
getProxy(id) {
return this.targets[id];
}
handleEvent(data) {
this.targets[data.id].handleEvent(data.data);
}
}
const proxyManager = new ProxyManager();
function start(data) {
const proxy = proxyManager.getProxy(data.canvasId);
proxy.ownerDocument = proxy; // HACK!
self.document = {}; // HACK!
init({
canvas: data.canvas,
inputElement: proxy,
});
}
function makeProxy(data) {
proxyManager.makeProxy(data);
}
const handlers = {
start,
makeProxy,
event: proxyManager.handleEvent,
};
self.onmessage = function(e) {
const fn = handlers[e.data.type];
if (typeof fn !== 'function') {
throw new Error('no handler for type: ' + e.data.type);
}
fn(e.data);
};