Counter-Strike/www/assets/threejs/pointer-lock.js
Daniel Maixner c46b72ef36 initial
2022-09-11 14:11:27 +02:00

108 lines
3.8 KiB
JavaScript

(function () {
const _PI_2 = Math.PI / 2;
const _euler = new THREE.Euler(0, 0, 0, 'YXZ');
const _vector = new THREE.Vector3();
class PointerLockControls {
constructor(camera, domElement) {
const scope = this;
this.domElement = domElement;
this.isLocked = false; // Set to constrain the pitch of the camera
// Range is 0 to Math.PI radians
this.minPolarAngle = 0; // radians
this.maxPolarAngle = Math.PI; // radians
this.pointerSpeed = 1.0;
function onMouseMove(event) {
if (scope.isLocked === false) {
return
}
const movementX = event.movementX || event.mozMovementX || event.webkitMovementX || 0;
const movementY = event.movementY || event.mozMovementY || event.webkitMovementY || 0;
_euler.setFromQuaternion(camera.quaternion);
_euler.y -= movementX * 0.002 * scope.pointerSpeed;
_euler.x -= movementY * 0.002 * scope.pointerSpeed;
_euler.x = Math.max(_PI_2 - scope.maxPolarAngle, Math.min(_PI_2 - scope.minPolarAngle, _euler.x));
camera.quaternion.setFromEuler(_euler);
}
function onPointerlockChange() {
if (scope.domElement.ownerDocument.pointerLockElement === scope.domElement) {
scope.isLocked = true;
} else {
scope.isLocked = false;
}
}
function onPointerlockError() {
console.error('THREE.PointerLockControls: Unable to use Pointer Lock API');
}
this.connect = function () {
scope.domElement.ownerDocument.addEventListener('mousemove', onMouseMove);
scope.domElement.ownerDocument.addEventListener('pointerlockchange', onPointerlockChange);
scope.domElement.ownerDocument.addEventListener('pointerlockerror', onPointerlockError);
};
this.disconnect = function () {
scope.domElement.ownerDocument.removeEventListener('mousemove', onMouseMove);
scope.domElement.ownerDocument.removeEventListener('pointerlockchange', onPointerlockChange);
scope.domElement.ownerDocument.removeEventListener('pointerlockerror', onPointerlockError);
};
this.dispose = function () {
this.disconnect();
};
this.getObject = function () {
// retaining this method for backward compatibility
return camera;
};
this.getDirection = function () {
const direction = new THREE.Vector3(0, 0, -1);
return function (v) {
return v.copy(direction).applyQuaternion(camera.quaternion);
};
}();
this.moveForward = function (distance) {
// move forward parallel to the xz-plane
// assumes camera.up is y-up
_vector.setFromMatrixColumn(camera.matrix, 0);
_vector.crossVectors(camera.up, _vector);
camera.position.addScaledVector(_vector, distance);
};
this.moveRight = function (distance) {
_vector.setFromMatrixColumn(camera.matrix, 0);
camera.position.addScaledVector(_vector, distance);
};
this.lock = function () {
this.domElement.requestPointerLock();
};
this.unlock = function () {
scope.domElement.ownerDocument.exitPointerLock();
};
this.connect();
}
}
THREE.PointerLockControls = PointerLockControls;
})();