@pmndrs/handle
Version:
framework agnostic expandable handle implementation for threejs
45 lines (44 loc) • 1.72 kB
JavaScript
import { Vector2, Vector3 } from 'three';
import { defaultScreenCameraApply } from './camera.js';
import { ScreenHandleStore } from './store.js';
import { average, convertScreenSpaceMovementToGlobalPan } from './utils.js';
const vector2Helper = new Vector2();
const initialHelper = new Vector2();
const resultHelper = new Vector3();
export class PanScreenHandleStore extends ScreenHandleStore {
canvas;
filter;
customApply;
speed;
space;
constructor(canvas, store, getCamera, filter, customApply, speed, space) {
super((initial, map) => {
if (!this.filter(map)) {
return;
}
average(vector2Helper, map, 'currentScreenPosition');
average(initialHelper, map, 'initialScreenPosition');
vector2Helper.sub(initialHelper);
convertScreenSpaceMovementToGlobalPan(store.getState(), getCamera(), vector2Helper, resultHelper, this.speed ?? 1, this.space ?? 'screen');
const [x, y, z] = initial;
resultHelper.x += x;
resultHelper.y += y;
resultHelper.z += z;
(this.customApply ?? defaultScreenCameraApply)({ origin: resultHelper.toArray() }, store);
}, () => store.getState().origin);
this.canvas = canvas;
this.filter = filter;
this.customApply = customApply;
this.speed = speed;
this.space = space;
}
bind(scene) {
const fn = (e) => e.preventDefault();
this.canvas.addEventListener('contextmenu', fn);
const superUnbind = super.bind(scene);
return () => {
superUnbind();
this.canvas.removeEventListener('contextmenu', fn);
};
}
}