UNPKG

@pmndrs/handle

Version:

framework agnostic expandable handle implementation for threejs

45 lines (44 loc) 1.72 kB
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); }; } }