You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
earthquake_3d_viewer_front/three/manual/examples/offscreencanvas-worker-orbi...

130 lines
2.0 KiB
JavaScript

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 );
};