1 line
6.4 KiB
Plaintext
1 line
6.4 KiB
Plaintext
|
|
{"version":3,"file":"PointerLockControls.cjs","sources":["../../src/controls/PointerLockControls.ts"],"sourcesContent":["import { Euler, Camera, Vector3 } from 'three'\nimport { EventDispatcher } from './EventDispatcher'\n\nconst _euler = /* @__PURE__ */ new Euler(0, 0, 0, 'YXZ')\nconst _vector = /* @__PURE__ */ new Vector3()\nconst _changeEvent = { type: 'change' }\nconst _lockEvent = { type: 'lock' }\nconst _unlockEvent = { type: 'unlock' }\nconst _MOUSE_SENSITIVITY = 0.002\nconst _PI_2 = Math.PI / 2\n\nexport interface PointerLockControlsEventMap {\n /**\n * Fires when the user moves the mouse.\n */\n change: {}\n\n /**\n * Fires when the pointer lock status is \"locked\" (in other words: the mouse is captured).\n */\n lock: {}\n\n /**\n * Fires when the pointer lock status is \"unlocked\" (in other words: the mouse is not captured anymore).\n */\n unlock: {}\n}\n\nclass PointerLockControls extends EventDispatcher<PointerLockControlsEventMap> {\n public camera: Camera\n public domElement?: HTMLElement\n public isLocked: boolean\n public minPolarAngle: number\n public maxPolarAngle: number\n public pointerSpeed: number\n\n constructor(camera: Camera, domElement?: HTMLElement) {\n super()\n\n this.camera = camera\n this.domElement = domElement\n this.isLocked = false\n\n // Set to constrain the pitch of the camera\n // Range is 0 to Math.PI radians\n this.minPolarAngle = 0 // radians\n this.maxPolarAngle = Math.PI // radians\n\n this.pointerSpeed = 1.0\n if (domElement) this.connect(domElement)\n }\n\n private onMouseMove = (event: MouseEvent): void => {\n if (!this.domElement || this.isLocked === false) return\n _euler.setFromQuaternion(this.camera.quaternion)\n _euler.y -= event.movementX * _MOUSE_SENSITIVITY * this.pointerSpeed\n _euler.x -= event.movementY * _MOUSE_SENSITIVITY * this.pointerSpeed\n _euler.x = Math.max(_PI_2 - this.maxPolarAngle, Math.min(_PI_2 - this.minPolarAngle, _euler.x))\n this.camera.quaternion.setFromEuler(_euler)\n // @ts-ignore\n this.dispatchEvent(_changeEvent)\n }\n\n private onPointerlockChange = (): void => {\n if (!this.domElement) return\n if (this.domElement.ownerDocument.pointerLockElement === this.domElement) {\n // @ts-ignore\n this.dispatchEvent(_lockEvent)\n this.isLocked = true\n } else {\n // @ts-ignore\n this.dispatchEvent(_unlockEvent)\n this.isLocked = false\n }\n }\n\n private onPointerlockError = (): void => {\n console.error('THREE.PointerLockControls: Unable to use Pointer Lock API')\n }\n\n public connect = (domElement: HTMLElement): void => {\n this.domElement = domElement || this.domElement\n if (!this.domElement) return\n this.domElement.ownerDocument.addEventListener('mousemove', this.onMouseMove)\n this.domElement.ownerDocument.addEventListener('pointerlockchange', this.onPointerlockChange)\n this.domElement.ownerDocument.addEventListener('pointerlockerror', this.onPointerlockError)\n }\n\n public disconnect = (): void => {\n if (!this.domElement) return\n this.domElement.ownerDocument.removeEventListener('mousemove', this.onMouseMove)\n this.domElement.ownerDocument.removeEventListener('pointerlockchange', this.onPointerlockChange)\n this.domElement.ownerDocument.removeEventListener('pointerlockerror', this.onPointerlockError)\n }\n\n public dispose = (): void => {\n this.disconnect()\n }\n\n public getObject = (): Camera => {\n // retaining this method for backward compatibility\n return this.camera\n }\n\n private direction = new Vector3(0, 0, -1)\n public getDirection = (v: Vector3): Vector3 => {\n return v.copy(this.direction).applyQuaternion(this.camera.quaternion)\n }\n\n public moveForward = (distance: number): void => {\n // move forward parallel to the xz-plane\n // assumes camera.up is y-up\n _vector.setFromMatrixColumn(this.camera.matrix, 0)\n _vector.crossVectors(this.camera.up, _vector)\n this.camera.position.addScaledVector(_vector, distance)\n }\n\n pu
|