three-stdlib 2.34.0 → 2.34.1
Sign up to get free protection for your applications and to get access to all the features.
- package/controls/ArcballControls.cjs +2 -1
- package/controls/ArcballControls.cjs.map +1 -1
- package/controls/ArcballControls.d.ts +4 -2
- package/controls/ArcballControls.js +2 -1
- package/controls/ArcballControls.js.map +1 -1
- package/controls/DeviceOrientationControls.cjs +2 -1
- package/controls/DeviceOrientationControls.cjs.map +1 -1
- package/controls/DeviceOrientationControls.d.ts +4 -2
- package/controls/DeviceOrientationControls.js +2 -1
- package/controls/DeviceOrientationControls.js.map +1 -1
- package/controls/DragControls.cjs +2 -1
- package/controls/DragControls.cjs.map +1 -1
- package/controls/DragControls.d.ts +35 -2
- package/controls/DragControls.js +2 -1
- package/controls/DragControls.js.map +1 -1
- package/controls/EventDispatcher.cjs +78 -0
- package/controls/EventDispatcher.cjs.map +1 -0
- package/controls/EventDispatcher.d.ts +41 -0
- package/controls/EventDispatcher.js +78 -0
- package/controls/EventDispatcher.js.map +1 -0
- package/controls/FirstPersonControls.cjs +2 -1
- package/controls/FirstPersonControls.cjs.map +1 -1
- package/controls/FirstPersonControls.d.ts +3 -2
- package/controls/FirstPersonControls.js +2 -1
- package/controls/FirstPersonControls.js.map +1 -1
- package/controls/FlyControls.cjs +2 -1
- package/controls/FlyControls.cjs.map +1 -1
- package/controls/FlyControls.d.ts +9 -2
- package/controls/FlyControls.js +2 -1
- package/controls/FlyControls.js.map +1 -1
- package/controls/OrbitControls.cjs +2 -1
- package/controls/OrbitControls.cjs.map +1 -1
- package/controls/OrbitControls.d.ts +4 -2
- package/controls/OrbitControls.js +2 -1
- package/controls/OrbitControls.js.map +1 -1
- package/controls/PointerLockControls.cjs +4 -5
- package/controls/PointerLockControls.cjs.map +1 -1
- package/controls/PointerLockControls.d.ts +17 -2
- package/controls/PointerLockControls.js +4 -5
- package/controls/PointerLockControls.js.map +1 -1
- package/controls/StandardControlsEventMap.d.ts +14 -0
- package/controls/TrackballControls.cjs +2 -1
- package/controls/TrackballControls.cjs.map +1 -1
- package/controls/TrackballControls.d.ts +4 -2
- package/controls/TrackballControls.js +2 -1
- package/controls/TrackballControls.js.map +1 -1
- package/controls/experimental/CameraControls.cjs +2 -1
- package/controls/experimental/CameraControls.cjs.map +1 -1
- package/controls/experimental/CameraControls.d.ts +3 -2
- package/controls/experimental/CameraControls.js +2 -1
- package/controls/experimental/CameraControls.js.map +1 -1
- package/package.json +1 -1
@@ -7,7 +7,8 @@ var __publicField = (obj, key, value) => {
|
|
7
7
|
};
|
8
8
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
9
9
|
const THREE = require("three");
|
10
|
-
|
10
|
+
const EventDispatcher = require("./EventDispatcher.cjs");
|
11
|
+
class DeviceOrientationControls extends EventDispatcher.EventDispatcher {
|
11
12
|
// radians
|
12
13
|
constructor(object) {
|
13
14
|
super();
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"DeviceOrientationControls.cjs","sources":["../../src/controls/DeviceOrientationControls.ts"],"sourcesContent":["import { Camera, Euler,
|
1
|
+
{"version":3,"file":"DeviceOrientationControls.cjs","sources":["../../src/controls/DeviceOrientationControls.ts"],"sourcesContent":["import { Camera, Euler, MathUtils, Quaternion, Vector3 } from 'three'\nimport { EventDispatcher } from './EventDispatcher'\nimport { StandardControlsEventMap } from './StandardControlsEventMap'\n\n/**\n * W3C Device Orientation control (http://w3c.github.io/deviceorientation/spec-source-orientation.html)\n */\n\nclass DeviceOrientationControls extends EventDispatcher<StandardControlsEventMap> {\n public object: Camera\n\n private changeEvent = { type: 'change' }\n private EPS = 0.000001\n\n public enabled = true\n public deviceOrientation: Partial<DeviceOrientationEvent> = { alpha: 0, beta: 0, gamma: 0 }\n public screenOrientation: string | number = 0\n public alphaOffset = 0 // radians\n\n constructor(object: Camera) {\n super()\n\n this.object = object\n this.object.rotation.reorder('YXZ')\n\n this.connect()\n }\n\n private onDeviceOrientationChangeEvent = (event: DeviceOrientationEvent): void => {\n this.deviceOrientation = event\n }\n\n private onScreenOrientationChangeEvent = (): void => {\n this.screenOrientation = window.orientation || 0\n }\n\n // The angles alpha, beta and gamma form a set of intrinsic Tait-Bryan angles of type Z-X'-Y''\n\n private zee = new Vector3(0, 0, 1)\n private euler = new Euler()\n private q0 = new Quaternion()\n private q1 = new Quaternion(-Math.sqrt(0.5), 0, 0, Math.sqrt(0.5)) // - PI/2 around the x-axis\n private setObjectQuaternion = (\n quaternion: Quaternion,\n alpha: number,\n beta: number,\n gamma: number,\n orient: number,\n ): void => {\n this.euler.set(beta, alpha, -gamma, 'YXZ') // 'ZXY' for the device, but 'YXZ' for us\n quaternion.setFromEuler(this.euler) // orient the device\n quaternion.multiply(this.q1) // camera looks out the back of the device, not the top\n quaternion.multiply(this.q0.setFromAxisAngle(this.zee, -orient)) // adjust for screen orientation\n }\n\n public connect = (): void => {\n this.onScreenOrientationChangeEvent() // run once on load\n\n // iOS 13+\n\n if (\n window.DeviceOrientationEvent !== undefined &&\n // @ts-ignore\n typeof window.DeviceOrientationEvent.requestPermission === 'function'\n ) {\n // @ts-ignore\n window.DeviceOrientationEvent.requestPermission()\n .then((response: any) => {\n if (response == 'granted') {\n window.addEventListener('orientationchange', this.onScreenOrientationChangeEvent)\n window.addEventListener('deviceorientation', this.onDeviceOrientationChangeEvent)\n }\n })\n .catch((error: any) => {\n console.error('THREE.DeviceOrientationControls: Unable to use DeviceOrientation API:', error)\n })\n } else {\n window.addEventListener('orientationchange', this.onScreenOrientationChangeEvent)\n window.addEventListener('deviceorientation', this.onDeviceOrientationChangeEvent)\n }\n\n this.enabled = true\n }\n\n public disconnect = (): void => {\n window.removeEventListener('orientationchange', this.onScreenOrientationChangeEvent)\n window.removeEventListener('deviceorientation', this.onDeviceOrientationChangeEvent)\n\n this.enabled = false\n }\n\n private lastQuaternion = new Quaternion()\n public update = (): void => {\n if (this.enabled === false) return\n\n const device = this.deviceOrientation\n\n if (device) {\n const alpha = device.alpha ? MathUtils.degToRad(device.alpha) + this.alphaOffset : 0 // Z\n const beta = device.beta ? MathUtils.degToRad(device.beta) : 0 // X'\n const gamma = device.gamma ? MathUtils.degToRad(device.gamma) : 0 // Y''\n const orient = this.screenOrientation ? MathUtils.degToRad(this.screenOrientation as number) : 0 // O\n\n this.setObjectQuaternion(this.object.quaternion, alpha, beta, gamma, orient)\n\n if (8 * (1 - this.lastQuaternion.dot(this.object.quaternion)) > this.EPS) {\n this.lastQuaternion.copy(this.object.quaternion)\n // @ts-ignore\n this.dispatchEvent(this.changeEvent)\n }\n }\n }\n\n public dispose = (): void => this.disconnect()\n}\n\nexport { DeviceOrientationControls }\n"],"names":["EventDispatcher","Vector3","Euler","Quaternion","MathUtils"],"mappings":";;;;;;;;;;AAQA,MAAM,kCAAkCA,gBAAAA,gBAA0C;AAAA;AAAA,EAWhF,YAAY,QAAgB;AACpB;AAXD;AAEC,uCAAc,EAAE,MAAM;AACtB,+BAAM;AAEP,mCAAU;AACV,6CAAqD,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO;AACjF,6CAAqC;AACrC,uCAAc;AAWb,0DAAiC,CAAC,UAAwC;AAChF,WAAK,oBAAoB;AAAA,IAAA;AAGnB,0DAAiC,MAAY;AAC9C,WAAA,oBAAoB,OAAO,eAAe;AAAA,IAAA;AAKzC;AAAA,+BAAM,IAAIC,MAAQ,QAAA,GAAG,GAAG,CAAC;AACzB,iCAAQ,IAAIC,MAAAA;AACZ,8BAAK,IAAIC,MAAAA;AACT,8BAAK,IAAIA,MAAW,WAAA,CAAC,KAAK,KAAK,GAAG,GAAG,GAAG,GAAG,KAAK,KAAK,GAAG,CAAC;AACzD;AAAA,+CAAsB,CAC5B,YACA,OACA,MACA,OACA,WACS;AACT,WAAK,MAAM,IAAI,MAAM,OAAO,CAAC,OAAO,KAAK;AAC9B,iBAAA,aAAa,KAAK,KAAK;AACvB,iBAAA,SAAS,KAAK,EAAE;AAChB,iBAAA,SAAS,KAAK,GAAG,iBAAiB,KAAK,KAAK,CAAC,MAAM,CAAC;AAAA,IAAA;AAG1D,mCAAU,MAAY;AAC3B,WAAK,+BAA+B;AAIpC,UACE,OAAO,2BAA2B;AAAA,MAElC,OAAO,OAAO,uBAAuB,sBAAsB,YAC3D;AAEA,eAAO,uBAAuB,kBAC3B,EAAA,KAAK,CAAC,aAAkB;AACvB,cAAI,YAAY,WAAW;AAClB,mBAAA,iBAAiB,qBAAqB,KAAK,8BAA8B;AACzE,mBAAA,iBAAiB,qBAAqB,KAAK,8BAA8B;AAAA,UAClF;AAAA,QAAA,CACD,EACA,MAAM,CAAC,UAAe;AACb,kBAAA,MAAM,yEAAyE,KAAK;AAAA,QAAA,CAC7F;AAAA,MAAA,OACE;AACE,eAAA,iBAAiB,qBAAqB,KAAK,8BAA8B;AACzE,eAAA,iBAAiB,qBAAqB,KAAK,8BAA8B;AAAA,MAClF;AAEA,WAAK,UAAU;AAAA,IAAA;AAGV,sCAAa,MAAY;AACvB,aAAA,oBAAoB,qBAAqB,KAAK,8BAA8B;AAC5E,aAAA,oBAAoB,qBAAqB,KAAK,8BAA8B;AAEnF,WAAK,UAAU;AAAA,IAAA;AAGT,0CAAiB,IAAIA,MAAAA;AACtB,kCAAS,MAAY;AAC1B,UAAI,KAAK,YAAY;AAAO;AAE5B,YAAM,SAAS,KAAK;AAEpB,UAAI,QAAQ;AACJ,cAAA,QAAQ,OAAO,QAAQC,gBAAU,SAAS,OAAO,KAAK,IAAI,KAAK,cAAc;AACnF,cAAM,OAAO,OAAO,OAAOA,MAAAA,UAAU,SAAS,OAAO,IAAI,IAAI;AAC7D,cAAM,QAAQ,OAAO,QAAQA,MAAAA,UAAU,SAAS,OAAO,KAAK,IAAI;AAChE,cAAM,SAAS,KAAK,oBAAoBA,MAAAA,UAAU,SAAS,KAAK,iBAA2B,IAAI;AAE/F,aAAK,oBAAoB,KAAK,OAAO,YAAY,OAAO,MAAM,OAAO,MAAM;AAEvE,YAAA,KAAK,IAAI,KAAK,eAAe,IAAI,KAAK,OAAO,UAAU,KAAK,KAAK,KAAK;AACxE,eAAK,eAAe,KAAK,KAAK,OAAO,UAAU;AAE1C,eAAA,cAAc,KAAK,WAAW;AAAA,QACrC;AAAA,MACF;AAAA,IAAA;AAGK,mCAAU,MAAY,KAAK;AA3FhC,SAAK,SAAS;AACT,SAAA,OAAO,SAAS,QAAQ,KAAK;AAElC,SAAK,QAAQ;AAAA,EACf;AAwFF;;"}
|
@@ -1,8 +1,10 @@
|
|
1
|
-
import { Camera
|
1
|
+
import { Camera } from 'three';
|
2
|
+
import { EventDispatcher } from './EventDispatcher';
|
3
|
+
import { StandardControlsEventMap } from './StandardControlsEventMap';
|
2
4
|
/**
|
3
5
|
* W3C Device Orientation control (http://w3c.github.io/deviceorientation/spec-source-orientation.html)
|
4
6
|
*/
|
5
|
-
declare class DeviceOrientationControls extends EventDispatcher {
|
7
|
+
declare class DeviceOrientationControls extends EventDispatcher<StandardControlsEventMap> {
|
6
8
|
object: Camera;
|
7
9
|
private changeEvent;
|
8
10
|
private EPS;
|
@@ -4,7 +4,8 @@ var __publicField = (obj, key, value) => {
|
|
4
4
|
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
5
5
|
return value;
|
6
6
|
};
|
7
|
-
import {
|
7
|
+
import { Vector3, Euler, Quaternion, MathUtils } from "three";
|
8
|
+
import { EventDispatcher } from "./EventDispatcher.js";
|
8
9
|
class DeviceOrientationControls extends EventDispatcher {
|
9
10
|
// radians
|
10
11
|
constructor(object) {
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"DeviceOrientationControls.js","sources":["../../src/controls/DeviceOrientationControls.ts"],"sourcesContent":["import { Camera, Euler,
|
1
|
+
{"version":3,"file":"DeviceOrientationControls.js","sources":["../../src/controls/DeviceOrientationControls.ts"],"sourcesContent":["import { Camera, Euler, MathUtils, Quaternion, Vector3 } from 'three'\nimport { EventDispatcher } from './EventDispatcher'\nimport { StandardControlsEventMap } from './StandardControlsEventMap'\n\n/**\n * W3C Device Orientation control (http://w3c.github.io/deviceorientation/spec-source-orientation.html)\n */\n\nclass DeviceOrientationControls extends EventDispatcher<StandardControlsEventMap> {\n public object: Camera\n\n private changeEvent = { type: 'change' }\n private EPS = 0.000001\n\n public enabled = true\n public deviceOrientation: Partial<DeviceOrientationEvent> = { alpha: 0, beta: 0, gamma: 0 }\n public screenOrientation: string | number = 0\n public alphaOffset = 0 // radians\n\n constructor(object: Camera) {\n super()\n\n this.object = object\n this.object.rotation.reorder('YXZ')\n\n this.connect()\n }\n\n private onDeviceOrientationChangeEvent = (event: DeviceOrientationEvent): void => {\n this.deviceOrientation = event\n }\n\n private onScreenOrientationChangeEvent = (): void => {\n this.screenOrientation = window.orientation || 0\n }\n\n // The angles alpha, beta and gamma form a set of intrinsic Tait-Bryan angles of type Z-X'-Y''\n\n private zee = new Vector3(0, 0, 1)\n private euler = new Euler()\n private q0 = new Quaternion()\n private q1 = new Quaternion(-Math.sqrt(0.5), 0, 0, Math.sqrt(0.5)) // - PI/2 around the x-axis\n private setObjectQuaternion = (\n quaternion: Quaternion,\n alpha: number,\n beta: number,\n gamma: number,\n orient: number,\n ): void => {\n this.euler.set(beta, alpha, -gamma, 'YXZ') // 'ZXY' for the device, but 'YXZ' for us\n quaternion.setFromEuler(this.euler) // orient the device\n quaternion.multiply(this.q1) // camera looks out the back of the device, not the top\n quaternion.multiply(this.q0.setFromAxisAngle(this.zee, -orient)) // adjust for screen orientation\n }\n\n public connect = (): void => {\n this.onScreenOrientationChangeEvent() // run once on load\n\n // iOS 13+\n\n if (\n window.DeviceOrientationEvent !== undefined &&\n // @ts-ignore\n typeof window.DeviceOrientationEvent.requestPermission === 'function'\n ) {\n // @ts-ignore\n window.DeviceOrientationEvent.requestPermission()\n .then((response: any) => {\n if (response == 'granted') {\n window.addEventListener('orientationchange', this.onScreenOrientationChangeEvent)\n window.addEventListener('deviceorientation', this.onDeviceOrientationChangeEvent)\n }\n })\n .catch((error: any) => {\n console.error('THREE.DeviceOrientationControls: Unable to use DeviceOrientation API:', error)\n })\n } else {\n window.addEventListener('orientationchange', this.onScreenOrientationChangeEvent)\n window.addEventListener('deviceorientation', this.onDeviceOrientationChangeEvent)\n }\n\n this.enabled = true\n }\n\n public disconnect = (): void => {\n window.removeEventListener('orientationchange', this.onScreenOrientationChangeEvent)\n window.removeEventListener('deviceorientation', this.onDeviceOrientationChangeEvent)\n\n this.enabled = false\n }\n\n private lastQuaternion = new Quaternion()\n public update = (): void => {\n if (this.enabled === false) return\n\n const device = this.deviceOrientation\n\n if (device) {\n const alpha = device.alpha ? MathUtils.degToRad(device.alpha) + this.alphaOffset : 0 // Z\n const beta = device.beta ? MathUtils.degToRad(device.beta) : 0 // X'\n const gamma = device.gamma ? MathUtils.degToRad(device.gamma) : 0 // Y''\n const orient = this.screenOrientation ? MathUtils.degToRad(this.screenOrientation as number) : 0 // O\n\n this.setObjectQuaternion(this.object.quaternion, alpha, beta, gamma, orient)\n\n if (8 * (1 - this.lastQuaternion.dot(this.object.quaternion)) > this.EPS) {\n this.lastQuaternion.copy(this.object.quaternion)\n // @ts-ignore\n this.dispatchEvent(this.changeEvent)\n }\n }\n }\n\n public dispose = (): void => this.disconnect()\n}\n\nexport { DeviceOrientationControls }\n"],"names":[],"mappings":";;;;;;;;AAQA,MAAM,kCAAkC,gBAA0C;AAAA;AAAA,EAWhF,YAAY,QAAgB;AACpB;AAXD;AAEC,uCAAc,EAAE,MAAM;AACtB,+BAAM;AAEP,mCAAU;AACV,6CAAqD,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO;AACjF,6CAAqC;AACrC,uCAAc;AAWb,0DAAiC,CAAC,UAAwC;AAChF,WAAK,oBAAoB;AAAA,IAAA;AAGnB,0DAAiC,MAAY;AAC9C,WAAA,oBAAoB,OAAO,eAAe;AAAA,IAAA;AAKzC;AAAA,+BAAM,IAAI,QAAQ,GAAG,GAAG,CAAC;AACzB,iCAAQ,IAAI;AACZ,8BAAK,IAAI;AACT,8BAAK,IAAI,WAAW,CAAC,KAAK,KAAK,GAAG,GAAG,GAAG,GAAG,KAAK,KAAK,GAAG,CAAC;AACzD;AAAA,+CAAsB,CAC5B,YACA,OACA,MACA,OACA,WACS;AACT,WAAK,MAAM,IAAI,MAAM,OAAO,CAAC,OAAO,KAAK;AAC9B,iBAAA,aAAa,KAAK,KAAK;AACvB,iBAAA,SAAS,KAAK,EAAE;AAChB,iBAAA,SAAS,KAAK,GAAG,iBAAiB,KAAK,KAAK,CAAC,MAAM,CAAC;AAAA,IAAA;AAG1D,mCAAU,MAAY;AAC3B,WAAK,+BAA+B;AAIpC,UACE,OAAO,2BAA2B;AAAA,MAElC,OAAO,OAAO,uBAAuB,sBAAsB,YAC3D;AAEA,eAAO,uBAAuB,kBAC3B,EAAA,KAAK,CAAC,aAAkB;AACvB,cAAI,YAAY,WAAW;AAClB,mBAAA,iBAAiB,qBAAqB,KAAK,8BAA8B;AACzE,mBAAA,iBAAiB,qBAAqB,KAAK,8BAA8B;AAAA,UAClF;AAAA,QAAA,CACD,EACA,MAAM,CAAC,UAAe;AACb,kBAAA,MAAM,yEAAyE,KAAK;AAAA,QAAA,CAC7F;AAAA,MAAA,OACE;AACE,eAAA,iBAAiB,qBAAqB,KAAK,8BAA8B;AACzE,eAAA,iBAAiB,qBAAqB,KAAK,8BAA8B;AAAA,MAClF;AAEA,WAAK,UAAU;AAAA,IAAA;AAGV,sCAAa,MAAY;AACvB,aAAA,oBAAoB,qBAAqB,KAAK,8BAA8B;AAC5E,aAAA,oBAAoB,qBAAqB,KAAK,8BAA8B;AAEnF,WAAK,UAAU;AAAA,IAAA;AAGT,0CAAiB,IAAI;AACtB,kCAAS,MAAY;AAC1B,UAAI,KAAK,YAAY;AAAO;AAE5B,YAAM,SAAS,KAAK;AAEpB,UAAI,QAAQ;AACJ,cAAA,QAAQ,OAAO,QAAQ,UAAU,SAAS,OAAO,KAAK,IAAI,KAAK,cAAc;AACnF,cAAM,OAAO,OAAO,OAAO,UAAU,SAAS,OAAO,IAAI,IAAI;AAC7D,cAAM,QAAQ,OAAO,QAAQ,UAAU,SAAS,OAAO,KAAK,IAAI;AAChE,cAAM,SAAS,KAAK,oBAAoB,UAAU,SAAS,KAAK,iBAA2B,IAAI;AAE/F,aAAK,oBAAoB,KAAK,OAAO,YAAY,OAAO,MAAM,OAAO,MAAM;AAEvE,YAAA,KAAK,IAAI,KAAK,eAAe,IAAI,KAAK,OAAO,UAAU,KAAK,KAAK,KAAK;AACxE,eAAK,eAAe,KAAK,KAAK,OAAO,UAAU;AAE1C,eAAA,cAAc,KAAK,WAAW;AAAA,QACrC;AAAA,MACF;AAAA,IAAA;AAGK,mCAAU,MAAY,KAAK;AA3FhC,SAAK,SAAS;AACT,SAAA,OAAO,SAAS,QAAQ,KAAK;AAElC,SAAK,QAAQ;AAAA,EACf;AAwFF;"}
|
@@ -7,7 +7,8 @@ var __publicField = (obj, key, value) => {
|
|
7
7
|
};
|
8
8
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
9
9
|
const THREE = require("three");
|
10
|
-
|
10
|
+
const EventDispatcher = require("./EventDispatcher.cjs");
|
11
|
+
class DragControls extends EventDispatcher.EventDispatcher {
|
11
12
|
constructor(_objects, _camera, _domElement) {
|
12
13
|
super();
|
13
14
|
__publicField(this, "enabled", true);
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"DragControls.cjs","sources":["../../src/controls/DragControls.ts"],"sourcesContent":["import { Camera, EventDispatcher, Intersection, Matrix4, Object3D, Plane, Raycaster, Vector2, Vector3 } from 'three'\n\nclass DragControls extends EventDispatcher {\n public enabled = true\n public transformGroup = false\n\n private _objects: Object3D[]\n private _camera: Camera\n private _domElement: HTMLElement\n\n private _plane = new Plane()\n private _raycaster = new Raycaster()\n\n private _mouse = new Vector2()\n private _offset = new Vector3()\n private _intersection = new Vector3()\n private _worldPosition = new Vector3()\n private _inverseMatrix = new Matrix4()\n private _intersections: Intersection[] = []\n private _selected: Object3D | null = null\n private _hovered: Object3D | null = null\n\n constructor(_objects: Object3D[], _camera: Camera, _domElement: HTMLElement) {\n super()\n\n this._objects = _objects\n this._camera = _camera\n this._domElement = _domElement\n\n this.activate()\n }\n\n public activate = (): void => {\n this._domElement.addEventListener('pointermove', this.onPointerMove)\n this._domElement.addEventListener('pointerdown', this.onPointerDown)\n this._domElement.addEventListener('pointerup', this.onPointerCancel)\n this._domElement.addEventListener('pointerleave', this.onPointerCancel)\n this._domElement.addEventListener('touchmove', this.onTouchMove)\n this._domElement.addEventListener('touchstart', this.onTouchStart)\n this._domElement.addEventListener('touchend', this.onTouchEnd)\n }\n\n public deactivate = (): void => {\n this._domElement.removeEventListener('pointermove', this.onPointerMove)\n this._domElement.removeEventListener('pointerdown', this.onPointerDown)\n this._domElement.removeEventListener('pointerup', this.onPointerCancel)\n this._domElement.removeEventListener('pointerleave', this.onPointerCancel)\n this._domElement.removeEventListener('touchmove', this.onTouchMove)\n this._domElement.removeEventListener('touchstart', this.onTouchStart)\n this._domElement.removeEventListener('touchend', this.onTouchEnd)\n\n this._domElement.style.cursor = ''\n }\n\n // TODO: confirm if this can be removed?\n public dispose = (): void => this.deactivate()\n\n public getObjects = (): Object3D[] => this._objects\n\n public getRaycaster = (): Raycaster => this._raycaster\n\n private onMouseMove = (event: MouseEvent): void => {\n const rect = this._domElement.getBoundingClientRect()\n\n this._mouse.x = ((event.clientX - rect.left) / rect.width) * 2 - 1\n this._mouse.y = -((event.clientY - rect.top) / rect.height) * 2 + 1\n\n this._raycaster.setFromCamera(this._mouse, this._camera)\n\n if (this._selected && this.enabled) {\n if (this._raycaster.ray.intersectPlane(this._plane, this._intersection)) {\n this._selected.position.copy(this._intersection.sub(this._offset).applyMatrix4(this._inverseMatrix))\n }\n\n // @ts-ignore\n this.dispatchEvent({ type: 'drag', object: this._selected })\n\n return\n }\n\n this._intersections.length = 0\n\n this._raycaster.setFromCamera(this._mouse, this._camera)\n this._raycaster.intersectObjects(this._objects, true, this._intersections)\n\n if (this._intersections.length > 0) {\n const object = this._intersections[0].object\n\n this._plane.setFromNormalAndCoplanarPoint(\n this._camera.getWorldDirection(this._plane.normal),\n this._worldPosition.setFromMatrixPosition(object.matrixWorld),\n )\n\n if (this._hovered !== object) {\n // @ts-ignore\n this.dispatchEvent({ type: 'hoveron', object })\n\n this._domElement.style.cursor = 'pointer'\n this._hovered = object\n }\n } else {\n if (this._hovered !== null) {\n // @ts-ignore\n this.dispatchEvent({ type: 'hoveroff', object: this._hovered })\n\n this._domElement.style.cursor = 'auto'\n this._hovered = null\n }\n }\n }\n\n private onMouseDown = (): void => {\n this._intersections.length = 0\n\n this._raycaster.setFromCamera(this._mouse, this._camera)\n this._raycaster.intersectObjects(this._objects, true, this._intersections)\n\n if (this._intersections.length > 0) {\n this._selected = this.transformGroup === true ? this._objects[0] : this._intersections[0].object\n\n if (this._raycaster.ray.intersectPlane(this._plane, this._intersection) && this._selected.parent) {\n this._inverseMatrix.copy(this._selected.parent.matrixWorld).invert()\n this._offset.copy(this._intersection).sub(this._worldPosition.setFromMatrixPosition(this._selected.matrixWorld))\n }\n\n this._domElement.style.cursor = 'move'\n\n // @ts-ignore\n this.dispatchEvent({ type: 'dragstart', object: this._selected })\n }\n }\n\n private onMouseCancel = (): void => {\n if (this._selected) {\n // @ts-ignore\n this.dispatchEvent({ type: 'dragend', object: this._selected })\n\n this._selected = null\n }\n\n this._domElement.style.cursor = this._hovered ? 'pointer' : 'auto'\n }\n\n private onPointerMove = (event: PointerEvent): void => {\n switch (event.pointerType) {\n case 'mouse':\n case 'pen':\n this.onMouseMove(event)\n break\n\n // TODO touch\n }\n }\n\n private onPointerDown = (event: PointerEvent): void => {\n switch (event.pointerType) {\n case 'mouse':\n case 'pen':\n this.onMouseDown()\n break\n\n // TODO touch\n }\n }\n\n private onPointerCancel = (event: PointerEvent): void => {\n switch (event.pointerType) {\n case 'mouse':\n case 'pen':\n this.onMouseCancel()\n break\n\n // TODO touch\n }\n }\n\n private onTouchMove = (event: TouchEvent): void => {\n event.preventDefault()\n const newEvent = event.changedTouches[0]\n\n const rect = this._domElement.getBoundingClientRect()\n\n this._mouse.x = ((newEvent.clientX - rect.left) / rect.width) * 2 - 1\n this._mouse.y = -((newEvent.clientY - rect.top) / rect.height) * 2 + 1\n\n this._raycaster.setFromCamera(this._mouse, this._camera)\n\n if (this._selected && this.enabled) {\n if (this._raycaster.ray.intersectPlane(this._plane, this._intersection)) {\n this._selected.position.copy(this._intersection.sub(this._offset).applyMatrix4(this._inverseMatrix))\n }\n\n // @ts-ignore\n this.dispatchEvent({ type: 'drag', object: this._selected })\n\n return\n }\n }\n\n private onTouchStart = (event: TouchEvent): void => {\n event.preventDefault()\n const newEvent = event.changedTouches[0]\n\n const rect = this._domElement.getBoundingClientRect()\n\n this._mouse.x = ((newEvent.clientX - rect.left) / rect.width) * 2 - 1\n this._mouse.y = -((newEvent.clientY - rect.top) / rect.height) * 2 + 1\n\n this._intersections.length = 0\n\n this._raycaster.setFromCamera(this._mouse, this._camera)\n this._raycaster.intersectObjects(this._objects, true, this._intersections)\n\n if (this._intersections.length > 0) {\n this._selected = this.transformGroup === true ? this._objects[0] : this._intersections[0].object\n\n this._plane.setFromNormalAndCoplanarPoint(\n this._camera.getWorldDirection(this._plane.normal),\n this._worldPosition.setFromMatrixPosition(this._selected.matrixWorld),\n )\n\n if (this._raycaster.ray.intersectPlane(this._plane, this._intersection) && this._selected.parent) {\n this._inverseMatrix.copy(this._selected.parent.matrixWorld).invert()\n this._offset.copy(this._intersection).sub(this._worldPosition.setFromMatrixPosition(this._selected.matrixWorld))\n }\n\n this._domElement.style.cursor = 'move'\n\n // @ts-ignore\n this.dispatchEvent({ type: 'dragstart', object: this._selected })\n }\n }\n\n private onTouchEnd = (event: TouchEvent): void => {\n event.preventDefault()\n\n if (this._selected) {\n // @ts-ignore\n this.dispatchEvent({ type: 'dragend', object: this._selected })\n\n this._selected = null\n }\n\n this._domElement.style.cursor = 'auto'\n }\n}\n\nexport { DragControls }\n"],"names":["EventDispatcher","Plane","Raycaster","Vector2","Vector3","Matrix4"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"DragControls.cjs","sources":["../../src/controls/DragControls.ts"],"sourcesContent":["import { Camera, Intersection, Matrix4, Object3D, Plane, Raycaster, Vector2, Vector3 } from 'three'\nimport { EventDispatcher } from './EventDispatcher'\n\nexport interface DragControlsEventMap {\n /**\n * Fires when the pointer is moved onto a 3D object, or onto one of its children.\n */\n hoveron: { object: Object3D };\n\n /**\n * Fires when the pointer is moved out of a 3D object.\n */\n hoveroff: { object: Object3D };\n\n /**\n * Fires when the user starts to drag a 3D object.\n */\n dragstart: { object: Object3D };\n\n /**\n * Fires when the user drags a 3D object.\n */\n drag: { object: Object3D };\n\n /**\n * Fires when the user has finished dragging a 3D object.\n */\n dragend: { object: Object3D };\n}\n\nclass DragControls extends EventDispatcher<DragControlsEventMap> {\n public enabled = true\n public transformGroup = false\n\n private _objects: Object3D[]\n private _camera: Camera\n private _domElement: HTMLElement\n\n private _plane = new Plane()\n private _raycaster = new Raycaster()\n\n private _mouse = new Vector2()\n private _offset = new Vector3()\n private _intersection = new Vector3()\n private _worldPosition = new Vector3()\n private _inverseMatrix = new Matrix4()\n private _intersections: Intersection[] = []\n private _selected: Object3D | null = null\n private _hovered: Object3D | null = null\n\n constructor(_objects: Object3D[], _camera: Camera, _domElement: HTMLElement) {\n super()\n\n this._objects = _objects\n this._camera = _camera\n this._domElement = _domElement\n\n this.activate()\n }\n\n public activate = (): void => {\n this._domElement.addEventListener('pointermove', this.onPointerMove)\n this._domElement.addEventListener('pointerdown', this.onPointerDown)\n this._domElement.addEventListener('pointerup', this.onPointerCancel)\n this._domElement.addEventListener('pointerleave', this.onPointerCancel)\n this._domElement.addEventListener('touchmove', this.onTouchMove)\n this._domElement.addEventListener('touchstart', this.onTouchStart)\n this._domElement.addEventListener('touchend', this.onTouchEnd)\n }\n\n public deactivate = (): void => {\n this._domElement.removeEventListener('pointermove', this.onPointerMove)\n this._domElement.removeEventListener('pointerdown', this.onPointerDown)\n this._domElement.removeEventListener('pointerup', this.onPointerCancel)\n this._domElement.removeEventListener('pointerleave', this.onPointerCancel)\n this._domElement.removeEventListener('touchmove', this.onTouchMove)\n this._domElement.removeEventListener('touchstart', this.onTouchStart)\n this._domElement.removeEventListener('touchend', this.onTouchEnd)\n\n this._domElement.style.cursor = ''\n }\n\n // TODO: confirm if this can be removed?\n public dispose = (): void => this.deactivate()\n\n public getObjects = (): Object3D[] => this._objects\n\n public getRaycaster = (): Raycaster => this._raycaster\n\n private onMouseMove = (event: MouseEvent): void => {\n const rect = this._domElement.getBoundingClientRect()\n\n this._mouse.x = ((event.clientX - rect.left) / rect.width) * 2 - 1\n this._mouse.y = -((event.clientY - rect.top) / rect.height) * 2 + 1\n\n this._raycaster.setFromCamera(this._mouse, this._camera)\n\n if (this._selected && this.enabled) {\n if (this._raycaster.ray.intersectPlane(this._plane, this._intersection)) {\n this._selected.position.copy(this._intersection.sub(this._offset).applyMatrix4(this._inverseMatrix))\n }\n\n // @ts-ignore\n this.dispatchEvent({ type: 'drag', object: this._selected })\n\n return\n }\n\n this._intersections.length = 0\n\n this._raycaster.setFromCamera(this._mouse, this._camera)\n this._raycaster.intersectObjects(this._objects, true, this._intersections)\n\n if (this._intersections.length > 0) {\n const object = this._intersections[0].object\n\n this._plane.setFromNormalAndCoplanarPoint(\n this._camera.getWorldDirection(this._plane.normal),\n this._worldPosition.setFromMatrixPosition(object.matrixWorld),\n )\n\n if (this._hovered !== object) {\n // @ts-ignore\n this.dispatchEvent({ type: 'hoveron', object })\n\n this._domElement.style.cursor = 'pointer'\n this._hovered = object\n }\n } else {\n if (this._hovered !== null) {\n // @ts-ignore\n this.dispatchEvent({ type: 'hoveroff', object: this._hovered })\n\n this._domElement.style.cursor = 'auto'\n this._hovered = null\n }\n }\n }\n\n private onMouseDown = (): void => {\n this._intersections.length = 0\n\n this._raycaster.setFromCamera(this._mouse, this._camera)\n this._raycaster.intersectObjects(this._objects, true, this._intersections)\n\n if (this._intersections.length > 0) {\n this._selected = this.transformGroup === true ? this._objects[0] : this._intersections[0].object\n\n if (this._raycaster.ray.intersectPlane(this._plane, this._intersection) && this._selected.parent) {\n this._inverseMatrix.copy(this._selected.parent.matrixWorld).invert()\n this._offset.copy(this._intersection).sub(this._worldPosition.setFromMatrixPosition(this._selected.matrixWorld))\n }\n\n this._domElement.style.cursor = 'move'\n\n // @ts-ignore\n this.dispatchEvent({ type: 'dragstart', object: this._selected })\n }\n }\n\n private onMouseCancel = (): void => {\n if (this._selected) {\n // @ts-ignore\n this.dispatchEvent({ type: 'dragend', object: this._selected })\n\n this._selected = null\n }\n\n this._domElement.style.cursor = this._hovered ? 'pointer' : 'auto'\n }\n\n private onPointerMove = (event: PointerEvent): void => {\n switch (event.pointerType) {\n case 'mouse':\n case 'pen':\n this.onMouseMove(event)\n break\n\n // TODO touch\n }\n }\n\n private onPointerDown = (event: PointerEvent): void => {\n switch (event.pointerType) {\n case 'mouse':\n case 'pen':\n this.onMouseDown()\n break\n\n // TODO touch\n }\n }\n\n private onPointerCancel = (event: PointerEvent): void => {\n switch (event.pointerType) {\n case 'mouse':\n case 'pen':\n this.onMouseCancel()\n break\n\n // TODO touch\n }\n }\n\n private onTouchMove = (event: TouchEvent): void => {\n event.preventDefault()\n const newEvent = event.changedTouches[0]\n\n const rect = this._domElement.getBoundingClientRect()\n\n this._mouse.x = ((newEvent.clientX - rect.left) / rect.width) * 2 - 1\n this._mouse.y = -((newEvent.clientY - rect.top) / rect.height) * 2 + 1\n\n this._raycaster.setFromCamera(this._mouse, this._camera)\n\n if (this._selected && this.enabled) {\n if (this._raycaster.ray.intersectPlane(this._plane, this._intersection)) {\n this._selected.position.copy(this._intersection.sub(this._offset).applyMatrix4(this._inverseMatrix))\n }\n\n // @ts-ignore\n this.dispatchEvent({ type: 'drag', object: this._selected })\n\n return\n }\n }\n\n private onTouchStart = (event: TouchEvent): void => {\n event.preventDefault()\n const newEvent = event.changedTouches[0]\n\n const rect = this._domElement.getBoundingClientRect()\n\n this._mouse.x = ((newEvent.clientX - rect.left) / rect.width) * 2 - 1\n this._mouse.y = -((newEvent.clientY - rect.top) / rect.height) * 2 + 1\n\n this._intersections.length = 0\n\n this._raycaster.setFromCamera(this._mouse, this._camera)\n this._raycaster.intersectObjects(this._objects, true, this._intersections)\n\n if (this._intersections.length > 0) {\n this._selected = this.transformGroup === true ? this._objects[0] : this._intersections[0].object\n\n this._plane.setFromNormalAndCoplanarPoint(\n this._camera.getWorldDirection(this._plane.normal),\n this._worldPosition.setFromMatrixPosition(this._selected.matrixWorld),\n )\n\n if (this._raycaster.ray.intersectPlane(this._plane, this._intersection) && this._selected.parent) {\n this._inverseMatrix.copy(this._selected.parent.matrixWorld).invert()\n this._offset.copy(this._intersection).sub(this._worldPosition.setFromMatrixPosition(this._selected.matrixWorld))\n }\n\n this._domElement.style.cursor = 'move'\n\n // @ts-ignore\n this.dispatchEvent({ type: 'dragstart', object: this._selected })\n }\n }\n\n private onTouchEnd = (event: TouchEvent): void => {\n event.preventDefault()\n\n if (this._selected) {\n // @ts-ignore\n this.dispatchEvent({ type: 'dragend', object: this._selected })\n\n this._selected = null\n }\n\n this._domElement.style.cursor = 'auto'\n }\n}\n\nexport { DragControls }\n"],"names":["EventDispatcher","Plane","Raycaster","Vector2","Vector3","Matrix4"],"mappings":"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"}
|
@@ -1,5 +1,38 @@
|
|
1
|
-
import { Camera,
|
2
|
-
|
1
|
+
import { Camera, Object3D, Raycaster } from 'three';
|
2
|
+
import { EventDispatcher } from './EventDispatcher';
|
3
|
+
export interface DragControlsEventMap {
|
4
|
+
/**
|
5
|
+
* Fires when the pointer is moved onto a 3D object, or onto one of its children.
|
6
|
+
*/
|
7
|
+
hoveron: {
|
8
|
+
object: Object3D;
|
9
|
+
};
|
10
|
+
/**
|
11
|
+
* Fires when the pointer is moved out of a 3D object.
|
12
|
+
*/
|
13
|
+
hoveroff: {
|
14
|
+
object: Object3D;
|
15
|
+
};
|
16
|
+
/**
|
17
|
+
* Fires when the user starts to drag a 3D object.
|
18
|
+
*/
|
19
|
+
dragstart: {
|
20
|
+
object: Object3D;
|
21
|
+
};
|
22
|
+
/**
|
23
|
+
* Fires when the user drags a 3D object.
|
24
|
+
*/
|
25
|
+
drag: {
|
26
|
+
object: Object3D;
|
27
|
+
};
|
28
|
+
/**
|
29
|
+
* Fires when the user has finished dragging a 3D object.
|
30
|
+
*/
|
31
|
+
dragend: {
|
32
|
+
object: Object3D;
|
33
|
+
};
|
34
|
+
}
|
35
|
+
declare class DragControls extends EventDispatcher<DragControlsEventMap> {
|
3
36
|
enabled: boolean;
|
4
37
|
transformGroup: boolean;
|
5
38
|
private _objects;
|
package/controls/DragControls.js
CHANGED
@@ -4,7 +4,8 @@ var __publicField = (obj, key, value) => {
|
|
4
4
|
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
5
5
|
return value;
|
6
6
|
};
|
7
|
-
import {
|
7
|
+
import { Plane, Raycaster, Vector2, Vector3, Matrix4 } from "three";
|
8
|
+
import { EventDispatcher } from "./EventDispatcher.js";
|
8
9
|
class DragControls extends EventDispatcher {
|
9
10
|
constructor(_objects, _camera, _domElement) {
|
10
11
|
super();
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"DragControls.js","sources":["../../src/controls/DragControls.ts"],"sourcesContent":["import { Camera, EventDispatcher, Intersection, Matrix4, Object3D, Plane, Raycaster, Vector2, Vector3 } from 'three'\n\nclass DragControls extends EventDispatcher {\n public enabled = true\n public transformGroup = false\n\n private _objects: Object3D[]\n private _camera: Camera\n private _domElement: HTMLElement\n\n private _plane = new Plane()\n private _raycaster = new Raycaster()\n\n private _mouse = new Vector2()\n private _offset = new Vector3()\n private _intersection = new Vector3()\n private _worldPosition = new Vector3()\n private _inverseMatrix = new Matrix4()\n private _intersections: Intersection[] = []\n private _selected: Object3D | null = null\n private _hovered: Object3D | null = null\n\n constructor(_objects: Object3D[], _camera: Camera, _domElement: HTMLElement) {\n super()\n\n this._objects = _objects\n this._camera = _camera\n this._domElement = _domElement\n\n this.activate()\n }\n\n public activate = (): void => {\n this._domElement.addEventListener('pointermove', this.onPointerMove)\n this._domElement.addEventListener('pointerdown', this.onPointerDown)\n this._domElement.addEventListener('pointerup', this.onPointerCancel)\n this._domElement.addEventListener('pointerleave', this.onPointerCancel)\n this._domElement.addEventListener('touchmove', this.onTouchMove)\n this._domElement.addEventListener('touchstart', this.onTouchStart)\n this._domElement.addEventListener('touchend', this.onTouchEnd)\n }\n\n public deactivate = (): void => {\n this._domElement.removeEventListener('pointermove', this.onPointerMove)\n this._domElement.removeEventListener('pointerdown', this.onPointerDown)\n this._domElement.removeEventListener('pointerup', this.onPointerCancel)\n this._domElement.removeEventListener('pointerleave', this.onPointerCancel)\n this._domElement.removeEventListener('touchmove', this.onTouchMove)\n this._domElement.removeEventListener('touchstart', this.onTouchStart)\n this._domElement.removeEventListener('touchend', this.onTouchEnd)\n\n this._domElement.style.cursor = ''\n }\n\n // TODO: confirm if this can be removed?\n public dispose = (): void => this.deactivate()\n\n public getObjects = (): Object3D[] => this._objects\n\n public getRaycaster = (): Raycaster => this._raycaster\n\n private onMouseMove = (event: MouseEvent): void => {\n const rect = this._domElement.getBoundingClientRect()\n\n this._mouse.x = ((event.clientX - rect.left) / rect.width) * 2 - 1\n this._mouse.y = -((event.clientY - rect.top) / rect.height) * 2 + 1\n\n this._raycaster.setFromCamera(this._mouse, this._camera)\n\n if (this._selected && this.enabled) {\n if (this._raycaster.ray.intersectPlane(this._plane, this._intersection)) {\n this._selected.position.copy(this._intersection.sub(this._offset).applyMatrix4(this._inverseMatrix))\n }\n\n // @ts-ignore\n this.dispatchEvent({ type: 'drag', object: this._selected })\n\n return\n }\n\n this._intersections.length = 0\n\n this._raycaster.setFromCamera(this._mouse, this._camera)\n this._raycaster.intersectObjects(this._objects, true, this._intersections)\n\n if (this._intersections.length > 0) {\n const object = this._intersections[0].object\n\n this._plane.setFromNormalAndCoplanarPoint(\n this._camera.getWorldDirection(this._plane.normal),\n this._worldPosition.setFromMatrixPosition(object.matrixWorld),\n )\n\n if (this._hovered !== object) {\n // @ts-ignore\n this.dispatchEvent({ type: 'hoveron', object })\n\n this._domElement.style.cursor = 'pointer'\n this._hovered = object\n }\n } else {\n if (this._hovered !== null) {\n // @ts-ignore\n this.dispatchEvent({ type: 'hoveroff', object: this._hovered })\n\n this._domElement.style.cursor = 'auto'\n this._hovered = null\n }\n }\n }\n\n private onMouseDown = (): void => {\n this._intersections.length = 0\n\n this._raycaster.setFromCamera(this._mouse, this._camera)\n this._raycaster.intersectObjects(this._objects, true, this._intersections)\n\n if (this._intersections.length > 0) {\n this._selected = this.transformGroup === true ? this._objects[0] : this._intersections[0].object\n\n if (this._raycaster.ray.intersectPlane(this._plane, this._intersection) && this._selected.parent) {\n this._inverseMatrix.copy(this._selected.parent.matrixWorld).invert()\n this._offset.copy(this._intersection).sub(this._worldPosition.setFromMatrixPosition(this._selected.matrixWorld))\n }\n\n this._domElement.style.cursor = 'move'\n\n // @ts-ignore\n this.dispatchEvent({ type: 'dragstart', object: this._selected })\n }\n }\n\n private onMouseCancel = (): void => {\n if (this._selected) {\n // @ts-ignore\n this.dispatchEvent({ type: 'dragend', object: this._selected })\n\n this._selected = null\n }\n\n this._domElement.style.cursor = this._hovered ? 'pointer' : 'auto'\n }\n\n private onPointerMove = (event: PointerEvent): void => {\n switch (event.pointerType) {\n case 'mouse':\n case 'pen':\n this.onMouseMove(event)\n break\n\n // TODO touch\n }\n }\n\n private onPointerDown = (event: PointerEvent): void => {\n switch (event.pointerType) {\n case 'mouse':\n case 'pen':\n this.onMouseDown()\n break\n\n // TODO touch\n }\n }\n\n private onPointerCancel = (event: PointerEvent): void => {\n switch (event.pointerType) {\n case 'mouse':\n case 'pen':\n this.onMouseCancel()\n break\n\n // TODO touch\n }\n }\n\n private onTouchMove = (event: TouchEvent): void => {\n event.preventDefault()\n const newEvent = event.changedTouches[0]\n\n const rect = this._domElement.getBoundingClientRect()\n\n this._mouse.x = ((newEvent.clientX - rect.left) / rect.width) * 2 - 1\n this._mouse.y = -((newEvent.clientY - rect.top) / rect.height) * 2 + 1\n\n this._raycaster.setFromCamera(this._mouse, this._camera)\n\n if (this._selected && this.enabled) {\n if (this._raycaster.ray.intersectPlane(this._plane, this._intersection)) {\n this._selected.position.copy(this._intersection.sub(this._offset).applyMatrix4(this._inverseMatrix))\n }\n\n // @ts-ignore\n this.dispatchEvent({ type: 'drag', object: this._selected })\n\n return\n }\n }\n\n private onTouchStart = (event: TouchEvent): void => {\n event.preventDefault()\n const newEvent = event.changedTouches[0]\n\n const rect = this._domElement.getBoundingClientRect()\n\n this._mouse.x = ((newEvent.clientX - rect.left) / rect.width) * 2 - 1\n this._mouse.y = -((newEvent.clientY - rect.top) / rect.height) * 2 + 1\n\n this._intersections.length = 0\n\n this._raycaster.setFromCamera(this._mouse, this._camera)\n this._raycaster.intersectObjects(this._objects, true, this._intersections)\n\n if (this._intersections.length > 0) {\n this._selected = this.transformGroup === true ? this._objects[0] : this._intersections[0].object\n\n this._plane.setFromNormalAndCoplanarPoint(\n this._camera.getWorldDirection(this._plane.normal),\n this._worldPosition.setFromMatrixPosition(this._selected.matrixWorld),\n )\n\n if (this._raycaster.ray.intersectPlane(this._plane, this._intersection) && this._selected.parent) {\n this._inverseMatrix.copy(this._selected.parent.matrixWorld).invert()\n this._offset.copy(this._intersection).sub(this._worldPosition.setFromMatrixPosition(this._selected.matrixWorld))\n }\n\n this._domElement.style.cursor = 'move'\n\n // @ts-ignore\n this.dispatchEvent({ type: 'dragstart', object: this._selected })\n }\n }\n\n private onTouchEnd = (event: TouchEvent): void => {\n event.preventDefault()\n\n if (this._selected) {\n // @ts-ignore\n this.dispatchEvent({ type: 'dragend', object: this._selected })\n\n this._selected = null\n }\n\n this._domElement.style.cursor = 'auto'\n }\n}\n\nexport { DragControls }\n"],"names":[],"mappings":"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"}
|
1
|
+
{"version":3,"file":"DragControls.js","sources":["../../src/controls/DragControls.ts"],"sourcesContent":["import { Camera, Intersection, Matrix4, Object3D, Plane, Raycaster, Vector2, Vector3 } from 'three'\nimport { EventDispatcher } from './EventDispatcher'\n\nexport interface DragControlsEventMap {\n /**\n * Fires when the pointer is moved onto a 3D object, or onto one of its children.\n */\n hoveron: { object: Object3D };\n\n /**\n * Fires when the pointer is moved out of a 3D object.\n */\n hoveroff: { object: Object3D };\n\n /**\n * Fires when the user starts to drag a 3D object.\n */\n dragstart: { object: Object3D };\n\n /**\n * Fires when the user drags a 3D object.\n */\n drag: { object: Object3D };\n\n /**\n * Fires when the user has finished dragging a 3D object.\n */\n dragend: { object: Object3D };\n}\n\nclass DragControls extends EventDispatcher<DragControlsEventMap> {\n public enabled = true\n public transformGroup = false\n\n private _objects: Object3D[]\n private _camera: Camera\n private _domElement: HTMLElement\n\n private _plane = new Plane()\n private _raycaster = new Raycaster()\n\n private _mouse = new Vector2()\n private _offset = new Vector3()\n private _intersection = new Vector3()\n private _worldPosition = new Vector3()\n private _inverseMatrix = new Matrix4()\n private _intersections: Intersection[] = []\n private _selected: Object3D | null = null\n private _hovered: Object3D | null = null\n\n constructor(_objects: Object3D[], _camera: Camera, _domElement: HTMLElement) {\n super()\n\n this._objects = _objects\n this._camera = _camera\n this._domElement = _domElement\n\n this.activate()\n }\n\n public activate = (): void => {\n this._domElement.addEventListener('pointermove', this.onPointerMove)\n this._domElement.addEventListener('pointerdown', this.onPointerDown)\n this._domElement.addEventListener('pointerup', this.onPointerCancel)\n this._domElement.addEventListener('pointerleave', this.onPointerCancel)\n this._domElement.addEventListener('touchmove', this.onTouchMove)\n this._domElement.addEventListener('touchstart', this.onTouchStart)\n this._domElement.addEventListener('touchend', this.onTouchEnd)\n }\n\n public deactivate = (): void => {\n this._domElement.removeEventListener('pointermove', this.onPointerMove)\n this._domElement.removeEventListener('pointerdown', this.onPointerDown)\n this._domElement.removeEventListener('pointerup', this.onPointerCancel)\n this._domElement.removeEventListener('pointerleave', this.onPointerCancel)\n this._domElement.removeEventListener('touchmove', this.onTouchMove)\n this._domElement.removeEventListener('touchstart', this.onTouchStart)\n this._domElement.removeEventListener('touchend', this.onTouchEnd)\n\n this._domElement.style.cursor = ''\n }\n\n // TODO: confirm if this can be removed?\n public dispose = (): void => this.deactivate()\n\n public getObjects = (): Object3D[] => this._objects\n\n public getRaycaster = (): Raycaster => this._raycaster\n\n private onMouseMove = (event: MouseEvent): void => {\n const rect = this._domElement.getBoundingClientRect()\n\n this._mouse.x = ((event.clientX - rect.left) / rect.width) * 2 - 1\n this._mouse.y = -((event.clientY - rect.top) / rect.height) * 2 + 1\n\n this._raycaster.setFromCamera(this._mouse, this._camera)\n\n if (this._selected && this.enabled) {\n if (this._raycaster.ray.intersectPlane(this._plane, this._intersection)) {\n this._selected.position.copy(this._intersection.sub(this._offset).applyMatrix4(this._inverseMatrix))\n }\n\n // @ts-ignore\n this.dispatchEvent({ type: 'drag', object: this._selected })\n\n return\n }\n\n this._intersections.length = 0\n\n this._raycaster.setFromCamera(this._mouse, this._camera)\n this._raycaster.intersectObjects(this._objects, true, this._intersections)\n\n if (this._intersections.length > 0) {\n const object = this._intersections[0].object\n\n this._plane.setFromNormalAndCoplanarPoint(\n this._camera.getWorldDirection(this._plane.normal),\n this._worldPosition.setFromMatrixPosition(object.matrixWorld),\n )\n\n if (this._hovered !== object) {\n // @ts-ignore\n this.dispatchEvent({ type: 'hoveron', object })\n\n this._domElement.style.cursor = 'pointer'\n this._hovered = object\n }\n } else {\n if (this._hovered !== null) {\n // @ts-ignore\n this.dispatchEvent({ type: 'hoveroff', object: this._hovered })\n\n this._domElement.style.cursor = 'auto'\n this._hovered = null\n }\n }\n }\n\n private onMouseDown = (): void => {\n this._intersections.length = 0\n\n this._raycaster.setFromCamera(this._mouse, this._camera)\n this._raycaster.intersectObjects(this._objects, true, this._intersections)\n\n if (this._intersections.length > 0) {\n this._selected = this.transformGroup === true ? this._objects[0] : this._intersections[0].object\n\n if (this._raycaster.ray.intersectPlane(this._plane, this._intersection) && this._selected.parent) {\n this._inverseMatrix.copy(this._selected.parent.matrixWorld).invert()\n this._offset.copy(this._intersection).sub(this._worldPosition.setFromMatrixPosition(this._selected.matrixWorld))\n }\n\n this._domElement.style.cursor = 'move'\n\n // @ts-ignore\n this.dispatchEvent({ type: 'dragstart', object: this._selected })\n }\n }\n\n private onMouseCancel = (): void => {\n if (this._selected) {\n // @ts-ignore\n this.dispatchEvent({ type: 'dragend', object: this._selected })\n\n this._selected = null\n }\n\n this._domElement.style.cursor = this._hovered ? 'pointer' : 'auto'\n }\n\n private onPointerMove = (event: PointerEvent): void => {\n switch (event.pointerType) {\n case 'mouse':\n case 'pen':\n this.onMouseMove(event)\n break\n\n // TODO touch\n }\n }\n\n private onPointerDown = (event: PointerEvent): void => {\n switch (event.pointerType) {\n case 'mouse':\n case 'pen':\n this.onMouseDown()\n break\n\n // TODO touch\n }\n }\n\n private onPointerCancel = (event: PointerEvent): void => {\n switch (event.pointerType) {\n case 'mouse':\n case 'pen':\n this.onMouseCancel()\n break\n\n // TODO touch\n }\n }\n\n private onTouchMove = (event: TouchEvent): void => {\n event.preventDefault()\n const newEvent = event.changedTouches[0]\n\n const rect = this._domElement.getBoundingClientRect()\n\n this._mouse.x = ((newEvent.clientX - rect.left) / rect.width) * 2 - 1\n this._mouse.y = -((newEvent.clientY - rect.top) / rect.height) * 2 + 1\n\n this._raycaster.setFromCamera(this._mouse, this._camera)\n\n if (this._selected && this.enabled) {\n if (this._raycaster.ray.intersectPlane(this._plane, this._intersection)) {\n this._selected.position.copy(this._intersection.sub(this._offset).applyMatrix4(this._inverseMatrix))\n }\n\n // @ts-ignore\n this.dispatchEvent({ type: 'drag', object: this._selected })\n\n return\n }\n }\n\n private onTouchStart = (event: TouchEvent): void => {\n event.preventDefault()\n const newEvent = event.changedTouches[0]\n\n const rect = this._domElement.getBoundingClientRect()\n\n this._mouse.x = ((newEvent.clientX - rect.left) / rect.width) * 2 - 1\n this._mouse.y = -((newEvent.clientY - rect.top) / rect.height) * 2 + 1\n\n this._intersections.length = 0\n\n this._raycaster.setFromCamera(this._mouse, this._camera)\n this._raycaster.intersectObjects(this._objects, true, this._intersections)\n\n if (this._intersections.length > 0) {\n this._selected = this.transformGroup === true ? this._objects[0] : this._intersections[0].object\n\n this._plane.setFromNormalAndCoplanarPoint(\n this._camera.getWorldDirection(this._plane.normal),\n this._worldPosition.setFromMatrixPosition(this._selected.matrixWorld),\n )\n\n if (this._raycaster.ray.intersectPlane(this._plane, this._intersection) && this._selected.parent) {\n this._inverseMatrix.copy(this._selected.parent.matrixWorld).invert()\n this._offset.copy(this._intersection).sub(this._worldPosition.setFromMatrixPosition(this._selected.matrixWorld))\n }\n\n this._domElement.style.cursor = 'move'\n\n // @ts-ignore\n this.dispatchEvent({ type: 'dragstart', object: this._selected })\n }\n }\n\n private onTouchEnd = (event: TouchEvent): void => {\n event.preventDefault()\n\n if (this._selected) {\n // @ts-ignore\n this.dispatchEvent({ type: 'dragend', object: this._selected })\n\n this._selected = null\n }\n\n this._domElement.style.cursor = 'auto'\n }\n}\n\nexport { DragControls }\n"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,78 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __defProp = Object.defineProperty;
|
3
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
4
|
+
var __publicField = (obj, key, value) => {
|
5
|
+
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
6
|
+
return value;
|
7
|
+
};
|
8
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
9
|
+
class EventDispatcher {
|
10
|
+
constructor() {
|
11
|
+
// not defined in @types/three
|
12
|
+
__publicField(this, "_listeners");
|
13
|
+
}
|
14
|
+
/**
|
15
|
+
* Adds a listener to an event type.
|
16
|
+
* @param type The type of event to listen to.
|
17
|
+
* @param listener The function that gets called when the event is fired.
|
18
|
+
*/
|
19
|
+
addEventListener(type, listener) {
|
20
|
+
if (this._listeners === void 0)
|
21
|
+
this._listeners = {};
|
22
|
+
const listeners = this._listeners;
|
23
|
+
if (listeners[type] === void 0) {
|
24
|
+
listeners[type] = [];
|
25
|
+
}
|
26
|
+
if (listeners[type].indexOf(listener) === -1) {
|
27
|
+
listeners[type].push(listener);
|
28
|
+
}
|
29
|
+
}
|
30
|
+
/**
|
31
|
+
* Checks if listener is added to an event type.
|
32
|
+
* @param type The type of event to listen to.
|
33
|
+
* @param listener The function that gets called when the event is fired.
|
34
|
+
*/
|
35
|
+
hasEventListener(type, listener) {
|
36
|
+
if (this._listeners === void 0)
|
37
|
+
return false;
|
38
|
+
const listeners = this._listeners;
|
39
|
+
return listeners[type] !== void 0 && listeners[type].indexOf(listener) !== -1;
|
40
|
+
}
|
41
|
+
/**
|
42
|
+
* Removes a listener from an event type.
|
43
|
+
* @param type The type of the listener that gets removed.
|
44
|
+
* @param listener The listener function that gets removed.
|
45
|
+
*/
|
46
|
+
removeEventListener(type, listener) {
|
47
|
+
if (this._listeners === void 0)
|
48
|
+
return;
|
49
|
+
const listeners = this._listeners;
|
50
|
+
const listenerArray = listeners[type];
|
51
|
+
if (listenerArray !== void 0) {
|
52
|
+
const index = listenerArray.indexOf(listener);
|
53
|
+
if (index !== -1) {
|
54
|
+
listenerArray.splice(index, 1);
|
55
|
+
}
|
56
|
+
}
|
57
|
+
}
|
58
|
+
/**
|
59
|
+
* Fire an event type.
|
60
|
+
* @param event The event that gets fired.
|
61
|
+
*/
|
62
|
+
dispatchEvent(event) {
|
63
|
+
if (this._listeners === void 0)
|
64
|
+
return;
|
65
|
+
const listeners = this._listeners;
|
66
|
+
const listenerArray = listeners[event.type];
|
67
|
+
if (listenerArray !== void 0) {
|
68
|
+
event.target = this;
|
69
|
+
const array = listenerArray.slice(0);
|
70
|
+
for (let i = 0, l = array.length; i < l; i++) {
|
71
|
+
array[i].call(this, event);
|
72
|
+
}
|
73
|
+
event.target = null;
|
74
|
+
}
|
75
|
+
}
|
76
|
+
}
|
77
|
+
exports.EventDispatcher = EventDispatcher;
|
78
|
+
//# sourceMappingURL=EventDispatcher.cjs.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"EventDispatcher.cjs","sources":["../../src/controls/EventDispatcher.ts"],"sourcesContent":["/*\nDue to @types/three r168 breaking change\nwe have to manually copy the EventDispatcher class from three.js.\nSo this files merges the declarations from https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/three/src/core/EventDispatcher.d.ts\nwith the implementation from https://github.com/mrdoob/three.js/blob/dev/src/core/EventDispatcher.js\nMore info in https://github.com/pmndrs/three-stdlib/issues/387\n*/\n\n/**\n * The minimal basic Event that can be dispatched by a {@link EventDispatcher<>}.\n */\nexport interface BaseEvent<TEventType extends string = string> {\n readonly type: TEventType;\n // not defined in @types/three\n target: any;\n}\n\n/**\n * The minimal expected contract of a fired Event that was dispatched by a {@link EventDispatcher<>}.\n */\nexport interface Event<TEventType extends string = string, TTarget = unknown> {\n readonly type: TEventType;\n readonly target: TTarget;\n}\n\nexport type EventListener<TEventData, TEventType extends string, TTarget> = (\n event: TEventData & Event<TEventType, TTarget>,\n) => void;\n\nexport class EventDispatcher<TEventMap extends {} = {}> {\n // not defined in @types/three\n private _listeners: any;\n\n /**\n * Adds a listener to an event type.\n * @param type The type of event to listen to.\n * @param listener The function that gets called when the event is fired.\n */\n\taddEventListener<T extends Extract<keyof TEventMap, string>>(\n type: T,\n listener: EventListener<TEventMap[T], T, this>,\n ): void {\n\n\t\tif ( this._listeners === undefined ) this._listeners = {};\n\n\t\tconst listeners = this._listeners;\n\n\t\tif ( listeners[ type ] === undefined ) {\n\n\t\t\tlisteners[ type ] = [];\n\n\t\t}\n\n\t\tif ( listeners[ type ].indexOf( listener ) === - 1 ) {\n\n\t\t\tlisteners[ type ].push( listener );\n\n\t\t}\n\n\t}\n\n\t/**\n * Checks if listener is added to an event type.\n * @param type The type of event to listen to.\n * @param listener The function that gets called when the event is fired.\n */\n hasEventListener<T extends Extract<keyof TEventMap, string>>(\n type: T,\n listener: EventListener<TEventMap[T], T, this>,\n ): boolean {\n\n\t\tif ( this._listeners === undefined ) return false;\n\n\t\tconst listeners = this._listeners;\n\n\t\treturn listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== - 1;\n\n\t}\n\n\t/**\n * Removes a listener from an event type.\n * @param type The type of the listener that gets removed.\n * @param listener The listener function that gets removed.\n */\n removeEventListener<T extends Extract<keyof TEventMap, string>>(\n type: T,\n listener: EventListener<TEventMap[T], T, this>,\n ): void {\n\n\t\tif ( this._listeners === undefined ) return;\n\n\t\tconst listeners = this._listeners;\n\t\tconst listenerArray = listeners[ type ];\n\n\t\tif ( listenerArray !== undefined ) {\n\n\t\t\tconst index = listenerArray.indexOf( listener );\n\n\t\t\tif ( index !== - 1 ) {\n\n\t\t\t\tlistenerArray.splice( index, 1 );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n * Fire an event type.\n * @param event The event that gets fired.\n */\n dispatchEvent<T extends Extract<keyof TEventMap, string>>(event: BaseEvent<T> & TEventMap[T]): void {\n\n\t\tif ( this._listeners === undefined ) return;\n\n\t\tconst listeners = this._listeners;\n\t\tconst listenerArray = listeners[ event.type ];\n\n\t\tif ( listenerArray !== undefined ) {\n\n\t\t\tevent.target = this;\n\n\t\t\t// Make a copy, in case listeners are removed while iterating.\n\t\t\tconst array = listenerArray.slice( 0 );\n\n\t\t\tfor ( let i = 0, l = array.length; i < l; i ++ ) {\n\n\t\t\t\tarray[ i ].call( this, event );\n\n\t\t\t}\n\n\t\t\tevent.target = null;\n\n\t\t}\n\n\t}\n\n}"],"names":[],"mappings":";;;;;;;;AA6BO,MAAM,gBAA2C;AAAA,EAAjD;AAEK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOX,iBACO,MACA,UACI;AAEV,QAAK,KAAK,eAAe;AAAY,WAAK,aAAa;AAEvD,UAAM,YAAY,KAAK;AAElB,QAAA,UAAW,IAAK,MAAM,QAAY;AAE3B,gBAAA,IAAK,IAAI;IAErB;AAEA,QAAK,UAAW,IAAK,EAAE,QAAS,QAAS,MAAM,IAAM;AAEzC,gBAAA,IAAK,EAAE,KAAM,QAAS;AAAA,IAElC;AAAA,EAED;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOG,iBACI,MACA,UACO;AAEb,QAAK,KAAK,eAAe;AAAmB,aAAA;AAE5C,UAAM,YAAY,KAAK;AAEhB,WAAA,UAAW,IAAK,MAAM,UAAa,UAAW,IAAK,EAAE,QAAS,QAAS,MAAM;AAAA,EAErF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOG,oBACI,MACA,UACI;AAEV,QAAK,KAAK,eAAe;AAAY;AAErC,UAAM,YAAY,KAAK;AACjB,UAAA,gBAAgB,UAAW,IAAK;AAEtC,QAAK,kBAAkB,QAAY;AAE5B,YAAA,QAAQ,cAAc,QAAS,QAAS;AAE9C,UAAK,UAAU,IAAM;AAEN,sBAAA,OAAQ,OAAO,CAAE;AAAA,MAEhC;AAAA,IAED;AAAA,EAED;AAAA;AAAA;AAAA;AAAA;AAAA,EAMG,cAA0D,OAA0C;AAEtG,QAAK,KAAK,eAAe;AAAY;AAErC,UAAM,YAAY,KAAK;AACjB,UAAA,gBAAgB,UAAW,MAAM,IAAK;AAE5C,QAAK,kBAAkB,QAAY;AAElC,YAAM,SAAS;AAGT,YAAA,QAAQ,cAAc,MAAO,CAAE;AAErC,eAAU,IAAI,GAAG,IAAI,MAAM,QAAQ,IAAI,GAAG,KAAO;AAEhD,cAAO,CAAE,EAAE,KAAM,MAAM,KAAM;AAAA,MAE9B;AAEA,YAAM,SAAS;AAAA,IAEhB;AAAA,EAED;AAED;;"}
|
@@ -0,0 +1,41 @@
|
|
1
|
+
/**
|
2
|
+
* The minimal basic Event that can be dispatched by a {@link EventDispatcher<>}.
|
3
|
+
*/
|
4
|
+
export interface BaseEvent<TEventType extends string = string> {
|
5
|
+
readonly type: TEventType;
|
6
|
+
target: any;
|
7
|
+
}
|
8
|
+
/**
|
9
|
+
* The minimal expected contract of a fired Event that was dispatched by a {@link EventDispatcher<>}.
|
10
|
+
*/
|
11
|
+
export interface Event<TEventType extends string = string, TTarget = unknown> {
|
12
|
+
readonly type: TEventType;
|
13
|
+
readonly target: TTarget;
|
14
|
+
}
|
15
|
+
export type EventListener<TEventData, TEventType extends string, TTarget> = (event: TEventData & Event<TEventType, TTarget>) => void;
|
16
|
+
export declare class EventDispatcher<TEventMap extends {} = {}> {
|
17
|
+
private _listeners;
|
18
|
+
/**
|
19
|
+
* Adds a listener to an event type.
|
20
|
+
* @param type The type of event to listen to.
|
21
|
+
* @param listener The function that gets called when the event is fired.
|
22
|
+
*/
|
23
|
+
addEventListener<T extends Extract<keyof TEventMap, string>>(type: T, listener: EventListener<TEventMap[T], T, this>): void;
|
24
|
+
/**
|
25
|
+
* Checks if listener is added to an event type.
|
26
|
+
* @param type The type of event to listen to.
|
27
|
+
* @param listener The function that gets called when the event is fired.
|
28
|
+
*/
|
29
|
+
hasEventListener<T extends Extract<keyof TEventMap, string>>(type: T, listener: EventListener<TEventMap[T], T, this>): boolean;
|
30
|
+
/**
|
31
|
+
* Removes a listener from an event type.
|
32
|
+
* @param type The type of the listener that gets removed.
|
33
|
+
* @param listener The listener function that gets removed.
|
34
|
+
*/
|
35
|
+
removeEventListener<T extends Extract<keyof TEventMap, string>>(type: T, listener: EventListener<TEventMap[T], T, this>): void;
|
36
|
+
/**
|
37
|
+
* Fire an event type.
|
38
|
+
* @param event The event that gets fired.
|
39
|
+
*/
|
40
|
+
dispatchEvent<T extends Extract<keyof TEventMap, string>>(event: BaseEvent<T> & TEventMap[T]): void;
|
41
|
+
}
|
@@ -0,0 +1,78 @@
|
|
1
|
+
var __defProp = Object.defineProperty;
|
2
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
3
|
+
var __publicField = (obj, key, value) => {
|
4
|
+
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
5
|
+
return value;
|
6
|
+
};
|
7
|
+
class EventDispatcher {
|
8
|
+
constructor() {
|
9
|
+
// not defined in @types/three
|
10
|
+
__publicField(this, "_listeners");
|
11
|
+
}
|
12
|
+
/**
|
13
|
+
* Adds a listener to an event type.
|
14
|
+
* @param type The type of event to listen to.
|
15
|
+
* @param listener The function that gets called when the event is fired.
|
16
|
+
*/
|
17
|
+
addEventListener(type, listener) {
|
18
|
+
if (this._listeners === void 0)
|
19
|
+
this._listeners = {};
|
20
|
+
const listeners = this._listeners;
|
21
|
+
if (listeners[type] === void 0) {
|
22
|
+
listeners[type] = [];
|
23
|
+
}
|
24
|
+
if (listeners[type].indexOf(listener) === -1) {
|
25
|
+
listeners[type].push(listener);
|
26
|
+
}
|
27
|
+
}
|
28
|
+
/**
|
29
|
+
* Checks if listener is added to an event type.
|
30
|
+
* @param type The type of event to listen to.
|
31
|
+
* @param listener The function that gets called when the event is fired.
|
32
|
+
*/
|
33
|
+
hasEventListener(type, listener) {
|
34
|
+
if (this._listeners === void 0)
|
35
|
+
return false;
|
36
|
+
const listeners = this._listeners;
|
37
|
+
return listeners[type] !== void 0 && listeners[type].indexOf(listener) !== -1;
|
38
|
+
}
|
39
|
+
/**
|
40
|
+
* Removes a listener from an event type.
|
41
|
+
* @param type The type of the listener that gets removed.
|
42
|
+
* @param listener The listener function that gets removed.
|
43
|
+
*/
|
44
|
+
removeEventListener(type, listener) {
|
45
|
+
if (this._listeners === void 0)
|
46
|
+
return;
|
47
|
+
const listeners = this._listeners;
|
48
|
+
const listenerArray = listeners[type];
|
49
|
+
if (listenerArray !== void 0) {
|
50
|
+
const index = listenerArray.indexOf(listener);
|
51
|
+
if (index !== -1) {
|
52
|
+
listenerArray.splice(index, 1);
|
53
|
+
}
|
54
|
+
}
|
55
|
+
}
|
56
|
+
/**
|
57
|
+
* Fire an event type.
|
58
|
+
* @param event The event that gets fired.
|
59
|
+
*/
|
60
|
+
dispatchEvent(event) {
|
61
|
+
if (this._listeners === void 0)
|
62
|
+
return;
|
63
|
+
const listeners = this._listeners;
|
64
|
+
const listenerArray = listeners[event.type];
|
65
|
+
if (listenerArray !== void 0) {
|
66
|
+
event.target = this;
|
67
|
+
const array = listenerArray.slice(0);
|
68
|
+
for (let i = 0, l = array.length; i < l; i++) {
|
69
|
+
array[i].call(this, event);
|
70
|
+
}
|
71
|
+
event.target = null;
|
72
|
+
}
|
73
|
+
}
|
74
|
+
}
|
75
|
+
export {
|
76
|
+
EventDispatcher
|
77
|
+
};
|
78
|
+
//# sourceMappingURL=EventDispatcher.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"EventDispatcher.js","sources":["../../src/controls/EventDispatcher.ts"],"sourcesContent":["/*\nDue to @types/three r168 breaking change\nwe have to manually copy the EventDispatcher class from three.js.\nSo this files merges the declarations from https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/three/src/core/EventDispatcher.d.ts\nwith the implementation from https://github.com/mrdoob/three.js/blob/dev/src/core/EventDispatcher.js\nMore info in https://github.com/pmndrs/three-stdlib/issues/387\n*/\n\n/**\n * The minimal basic Event that can be dispatched by a {@link EventDispatcher<>}.\n */\nexport interface BaseEvent<TEventType extends string = string> {\n readonly type: TEventType;\n // not defined in @types/three\n target: any;\n}\n\n/**\n * The minimal expected contract of a fired Event that was dispatched by a {@link EventDispatcher<>}.\n */\nexport interface Event<TEventType extends string = string, TTarget = unknown> {\n readonly type: TEventType;\n readonly target: TTarget;\n}\n\nexport type EventListener<TEventData, TEventType extends string, TTarget> = (\n event: TEventData & Event<TEventType, TTarget>,\n) => void;\n\nexport class EventDispatcher<TEventMap extends {} = {}> {\n // not defined in @types/three\n private _listeners: any;\n\n /**\n * Adds a listener to an event type.\n * @param type The type of event to listen to.\n * @param listener The function that gets called when the event is fired.\n */\n\taddEventListener<T extends Extract<keyof TEventMap, string>>(\n type: T,\n listener: EventListener<TEventMap[T], T, this>,\n ): void {\n\n\t\tif ( this._listeners === undefined ) this._listeners = {};\n\n\t\tconst listeners = this._listeners;\n\n\t\tif ( listeners[ type ] === undefined ) {\n\n\t\t\tlisteners[ type ] = [];\n\n\t\t}\n\n\t\tif ( listeners[ type ].indexOf( listener ) === - 1 ) {\n\n\t\t\tlisteners[ type ].push( listener );\n\n\t\t}\n\n\t}\n\n\t/**\n * Checks if listener is added to an event type.\n * @param type The type of event to listen to.\n * @param listener The function that gets called when the event is fired.\n */\n hasEventListener<T extends Extract<keyof TEventMap, string>>(\n type: T,\n listener: EventListener<TEventMap[T], T, this>,\n ): boolean {\n\n\t\tif ( this._listeners === undefined ) return false;\n\n\t\tconst listeners = this._listeners;\n\n\t\treturn listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== - 1;\n\n\t}\n\n\t/**\n * Removes a listener from an event type.\n * @param type The type of the listener that gets removed.\n * @param listener The listener function that gets removed.\n */\n removeEventListener<T extends Extract<keyof TEventMap, string>>(\n type: T,\n listener: EventListener<TEventMap[T], T, this>,\n ): void {\n\n\t\tif ( this._listeners === undefined ) return;\n\n\t\tconst listeners = this._listeners;\n\t\tconst listenerArray = listeners[ type ];\n\n\t\tif ( listenerArray !== undefined ) {\n\n\t\t\tconst index = listenerArray.indexOf( listener );\n\n\t\t\tif ( index !== - 1 ) {\n\n\t\t\t\tlistenerArray.splice( index, 1 );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n * Fire an event type.\n * @param event The event that gets fired.\n */\n dispatchEvent<T extends Extract<keyof TEventMap, string>>(event: BaseEvent<T> & TEventMap[T]): void {\n\n\t\tif ( this._listeners === undefined ) return;\n\n\t\tconst listeners = this._listeners;\n\t\tconst listenerArray = listeners[ event.type ];\n\n\t\tif ( listenerArray !== undefined ) {\n\n\t\t\tevent.target = this;\n\n\t\t\t// Make a copy, in case listeners are removed while iterating.\n\t\t\tconst array = listenerArray.slice( 0 );\n\n\t\t\tfor ( let i = 0, l = array.length; i < l; i ++ ) {\n\n\t\t\t\tarray[ i ].call( this, event );\n\n\t\t\t}\n\n\t\t\tevent.target = null;\n\n\t\t}\n\n\t}\n\n}"],"names":[],"mappings":";;;;;;AA6BO,MAAM,gBAA2C;AAAA,EAAjD;AAEK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOX,iBACO,MACA,UACI;AAEV,QAAK,KAAK,eAAe;AAAY,WAAK,aAAa;AAEvD,UAAM,YAAY,KAAK;AAElB,QAAA,UAAW,IAAK,MAAM,QAAY;AAE3B,gBAAA,IAAK,IAAI;IAErB;AAEA,QAAK,UAAW,IAAK,EAAE,QAAS,QAAS,MAAM,IAAM;AAEzC,gBAAA,IAAK,EAAE,KAAM,QAAS;AAAA,IAElC;AAAA,EAED;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOG,iBACI,MACA,UACO;AAEb,QAAK,KAAK,eAAe;AAAmB,aAAA;AAE5C,UAAM,YAAY,KAAK;AAEhB,WAAA,UAAW,IAAK,MAAM,UAAa,UAAW,IAAK,EAAE,QAAS,QAAS,MAAM;AAAA,EAErF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOG,oBACI,MACA,UACI;AAEV,QAAK,KAAK,eAAe;AAAY;AAErC,UAAM,YAAY,KAAK;AACjB,UAAA,gBAAgB,UAAW,IAAK;AAEtC,QAAK,kBAAkB,QAAY;AAE5B,YAAA,QAAQ,cAAc,QAAS,QAAS;AAE9C,UAAK,UAAU,IAAM;AAEN,sBAAA,OAAQ,OAAO,CAAE;AAAA,MAEhC;AAAA,IAED;AAAA,EAED;AAAA;AAAA;AAAA;AAAA;AAAA,EAMG,cAA0D,OAA0C;AAEtG,QAAK,KAAK,eAAe;AAAY;AAErC,UAAM,YAAY,KAAK;AACjB,UAAA,gBAAgB,UAAW,MAAM,IAAK;AAE5C,QAAK,kBAAkB,QAAY;AAElC,YAAM,SAAS;AAGT,YAAA,QAAQ,cAAc,MAAO,CAAE;AAErC,eAAU,IAAI,GAAG,IAAI,MAAM,QAAQ,IAAI,GAAG,KAAO;AAEhD,cAAO,CAAE,EAAE,KAAM,MAAM,KAAM;AAAA,MAE9B;AAEA,YAAM,SAAS;AAAA,IAEhB;AAAA,EAED;AAED;"}
|
@@ -7,8 +7,9 @@ var __publicField = (obj, key, value) => {
|
|
7
7
|
};
|
8
8
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
9
9
|
const THREE = require("three");
|
10
|
+
const EventDispatcher = require("./EventDispatcher.cjs");
|
10
11
|
const targetPosition = new THREE.Vector3();
|
11
|
-
class FirstPersonControls extends
|
12
|
+
class FirstPersonControls extends EventDispatcher.EventDispatcher {
|
12
13
|
constructor(object, domElement) {
|
13
14
|
super();
|
14
15
|
__publicField(this, "object");
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"FirstPersonControls.cjs","sources":["../../src/controls/FirstPersonControls.ts"],"sourcesContent":["import { MathUtils, Spherical, Vector3, EventDispatcher, Camera } from 'three'\n\nconst targetPosition = new Vector3()\n\nexport class FirstPersonControls extends EventDispatcher {\n public object: Camera\n public domElement?: HTMLElement | null\n\n public enabled = true\n\n public movementSpeed = 1.0\n public lookSpeed = 0.005\n\n public lookVertical = true\n public autoForward = false\n\n public activeLook = true\n\n public heightSpeed = false\n public heightCoef = 1.0\n public heightMin = 0.0\n public heightMax = 1.0\n\n public constrainVertical = false\n public verticalMin = 0\n public verticalMax = Math.PI\n\n public mouseDragOn = false\n\n // internals\n\n private autoSpeedFactor = 0.0\n\n private mouseX = 0\n private mouseY = 0\n\n private moveForward = false\n private moveBackward = false\n private moveLeft = false\n private moveRight = false\n private moveUp = false\n private moveDown = false\n\n private viewHalfX = 0\n private viewHalfY = 0\n\n private lat = 0\n private lon = 0\n\n private lookDirection = new Vector3()\n private spherical = new Spherical()\n readonly target = new Vector3()\n\n constructor(object: Camera, domElement?: HTMLElement | null) {\n super()\n\n this.object = object\n this.domElement = domElement\n\n this.setOrientation()\n\n if (domElement) this.connect(domElement)\n }\n\n public connect = (domElement: HTMLElement): void => {\n domElement.setAttribute('tabindex', '-1')\n\n domElement.style.touchAction = 'none'\n\n domElement.addEventListener('contextmenu', this.contextmenu)\n domElement.addEventListener('mousemove', this.onMouseMove)\n domElement.addEventListener('mousedown', this.onMouseDown)\n domElement.addEventListener('mouseup', this.onMouseUp)\n\n this.domElement = domElement\n\n window.addEventListener('keydown', this.onKeyDown)\n window.addEventListener('keyup', this.onKeyUp)\n\n this.handleResize()\n }\n\n public dispose = (): void => {\n this.domElement?.removeEventListener('contextmenu', this.contextmenu)\n this.domElement?.removeEventListener('mousedown', this.onMouseDown)\n this.domElement?.removeEventListener('mousemove', this.onMouseMove)\n this.domElement?.removeEventListener('mouseup', this.onMouseUp)\n\n window.removeEventListener('keydown', this.onKeyDown)\n window.removeEventListener('keyup', this.onKeyUp)\n }\n\n public handleResize = (): void => {\n if (this.domElement) {\n this.viewHalfX = this.domElement.offsetWidth / 2\n this.viewHalfY = this.domElement.offsetHeight / 2\n }\n }\n\n private onMouseDown = (event: MouseEvent): void => {\n this.domElement?.focus()\n\n if (this.activeLook) {\n switch (event.button) {\n case 0:\n this.moveForward = true\n break\n case 2:\n this.moveBackward = true\n break\n }\n }\n\n this.mouseDragOn = true\n }\n\n private onMouseUp = (event: MouseEvent): void => {\n if (this.activeLook) {\n switch (event.button) {\n case 0:\n this.moveForward = false\n break\n case 2:\n this.moveBackward = false\n break\n }\n }\n\n this.mouseDragOn = false\n }\n\n private onMouseMove = (event: MouseEvent): void => {\n if (this.domElement) {\n this.mouseX = event.pageX - this.domElement.offsetLeft - this.viewHalfX\n this.mouseY = event.pageY - this.domElement.offsetTop - this.viewHalfY\n }\n }\n\n private onKeyDown = (event: KeyboardEvent): void => {\n switch (event.code) {\n case 'ArrowUp':\n case 'KeyW':\n this.moveForward = true\n break\n\n case 'ArrowLeft':\n case 'KeyA':\n this.moveLeft = true\n break\n\n case 'ArrowDown':\n case 'KeyS':\n this.moveBackward = true\n break\n\n case 'ArrowRight':\n case 'KeyD':\n this.moveRight = true\n break\n\n case 'KeyR':\n this.moveUp = true\n break\n case 'KeyF':\n this.moveDown = true\n break\n }\n }\n\n private onKeyUp = (event: KeyboardEvent): void => {\n switch (event.code) {\n case 'ArrowUp':\n case 'KeyW':\n this.moveForward = false\n break\n\n case 'ArrowLeft':\n case 'KeyA':\n this.moveLeft = false\n break\n\n case 'ArrowDown':\n case 'KeyS':\n this.moveBackward = false\n break\n\n case 'ArrowRight':\n case 'KeyD':\n this.moveRight = false\n break\n\n case 'KeyR':\n this.moveUp = false\n break\n case 'KeyF':\n this.moveDown = false\n break\n }\n }\n\n public lookAt = (x: Vector3 | number, y?: number, z?: number): this => {\n if (x instanceof Vector3) {\n this.target.copy(x)\n } else if (y && z) {\n this.target.set(x, y, z)\n }\n\n this.object.lookAt(this.target)\n\n this.setOrientation()\n\n return this\n }\n\n public update = (delta: number): void => {\n if (!this.enabled) return\n\n if (this.heightSpeed) {\n const y = MathUtils.clamp(this.object.position.y, this.heightMin, this.heightMax)\n const heightDelta = y - this.heightMin\n\n this.autoSpeedFactor = delta * (heightDelta * this.heightCoef)\n } else {\n this.autoSpeedFactor = 0.0\n }\n\n const actualMoveSpeed = delta * this.movementSpeed\n\n if (this.moveForward || (this.autoForward && !this.moveBackward)) {\n this.object.translateZ(-(actualMoveSpeed + this.autoSpeedFactor))\n }\n if (this.moveBackward) this.object.translateZ(actualMoveSpeed)\n\n if (this.moveLeft) this.object.translateX(-actualMoveSpeed)\n if (this.moveRight) this.object.translateX(actualMoveSpeed)\n\n if (this.moveUp) this.object.translateY(actualMoveSpeed)\n if (this.moveDown) this.object.translateY(-actualMoveSpeed)\n\n let actualLookSpeed = delta * this.lookSpeed\n\n if (!this.activeLook) {\n actualLookSpeed = 0\n }\n\n let verticalLookRatio = 1\n\n if (this.constrainVertical) {\n verticalLookRatio = Math.PI / (this.verticalMax - this.verticalMin)\n }\n\n this.lon -= this.mouseX * actualLookSpeed\n if (this.lookVertical) this.lat -= this.mouseY * actualLookSpeed * verticalLookRatio\n\n this.lat = Math.max(-85, Math.min(85, this.lat))\n\n let phi = MathUtils.degToRad(90 - this.lat)\n const theta = MathUtils.degToRad(this.lon)\n\n if (this.constrainVertical) {\n phi = MathUtils.mapLinear(phi, 0, Math.PI, this.verticalMin, this.verticalMax)\n }\n\n const position = this.object.position\n\n targetPosition.setFromSphericalCoords(1, phi, theta).add(position)\n\n this.object.lookAt(targetPosition)\n }\n\n private contextmenu = (event: Event): void => event.preventDefault()\n\n private setOrientation = (): void => {\n this.lookDirection.set(0, 0, -1).applyQuaternion(this.object.quaternion)\n this.spherical.setFromVector3(this.lookDirection)\n this.lat = 90 - MathUtils.radToDeg(this.spherical.phi)\n this.lon = MathUtils.radToDeg(this.spherical.theta)\n }\n}\n"],"names":["Vector3","EventDispatcher","Spherical","MathUtils"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"FirstPersonControls.cjs","sources":["../../src/controls/FirstPersonControls.ts"],"sourcesContent":["import { MathUtils, Spherical, Vector3, Camera } from 'three'\nimport { EventDispatcher } from './EventDispatcher'\nimport { StandardControlsEventMap } from './StandardControlsEventMap'\n\nconst targetPosition = new Vector3()\n\nexport class FirstPersonControls extends EventDispatcher<{}> {\n public object: Camera\n public domElement?: HTMLElement | null\n\n public enabled = true\n\n public movementSpeed = 1.0\n public lookSpeed = 0.005\n\n public lookVertical = true\n public autoForward = false\n\n public activeLook = true\n\n public heightSpeed = false\n public heightCoef = 1.0\n public heightMin = 0.0\n public heightMax = 1.0\n\n public constrainVertical = false\n public verticalMin = 0\n public verticalMax = Math.PI\n\n public mouseDragOn = false\n\n // internals\n\n private autoSpeedFactor = 0.0\n\n private mouseX = 0\n private mouseY = 0\n\n private moveForward = false\n private moveBackward = false\n private moveLeft = false\n private moveRight = false\n private moveUp = false\n private moveDown = false\n\n private viewHalfX = 0\n private viewHalfY = 0\n\n private lat = 0\n private lon = 0\n\n private lookDirection = new Vector3()\n private spherical = new Spherical()\n readonly target = new Vector3()\n\n constructor(object: Camera, domElement?: HTMLElement | null) {\n super()\n\n this.object = object\n this.domElement = domElement\n\n this.setOrientation()\n\n if (domElement) this.connect(domElement)\n }\n\n public connect = (domElement: HTMLElement): void => {\n domElement.setAttribute('tabindex', '-1')\n\n domElement.style.touchAction = 'none'\n\n domElement.addEventListener('contextmenu', this.contextmenu)\n domElement.addEventListener('mousemove', this.onMouseMove)\n domElement.addEventListener('mousedown', this.onMouseDown)\n domElement.addEventListener('mouseup', this.onMouseUp)\n\n this.domElement = domElement\n\n window.addEventListener('keydown', this.onKeyDown)\n window.addEventListener('keyup', this.onKeyUp)\n\n this.handleResize()\n }\n\n public dispose = (): void => {\n this.domElement?.removeEventListener('contextmenu', this.contextmenu)\n this.domElement?.removeEventListener('mousedown', this.onMouseDown)\n this.domElement?.removeEventListener('mousemove', this.onMouseMove)\n this.domElement?.removeEventListener('mouseup', this.onMouseUp)\n\n window.removeEventListener('keydown', this.onKeyDown)\n window.removeEventListener('keyup', this.onKeyUp)\n }\n\n public handleResize = (): void => {\n if (this.domElement) {\n this.viewHalfX = this.domElement.offsetWidth / 2\n this.viewHalfY = this.domElement.offsetHeight / 2\n }\n }\n\n private onMouseDown = (event: MouseEvent): void => {\n this.domElement?.focus()\n\n if (this.activeLook) {\n switch (event.button) {\n case 0:\n this.moveForward = true\n break\n case 2:\n this.moveBackward = true\n break\n }\n }\n\n this.mouseDragOn = true\n }\n\n private onMouseUp = (event: MouseEvent): void => {\n if (this.activeLook) {\n switch (event.button) {\n case 0:\n this.moveForward = false\n break\n case 2:\n this.moveBackward = false\n break\n }\n }\n\n this.mouseDragOn = false\n }\n\n private onMouseMove = (event: MouseEvent): void => {\n if (this.domElement) {\n this.mouseX = event.pageX - this.domElement.offsetLeft - this.viewHalfX\n this.mouseY = event.pageY - this.domElement.offsetTop - this.viewHalfY\n }\n }\n\n private onKeyDown = (event: KeyboardEvent): void => {\n switch (event.code) {\n case 'ArrowUp':\n case 'KeyW':\n this.moveForward = true\n break\n\n case 'ArrowLeft':\n case 'KeyA':\n this.moveLeft = true\n break\n\n case 'ArrowDown':\n case 'KeyS':\n this.moveBackward = true\n break\n\n case 'ArrowRight':\n case 'KeyD':\n this.moveRight = true\n break\n\n case 'KeyR':\n this.moveUp = true\n break\n case 'KeyF':\n this.moveDown = true\n break\n }\n }\n\n private onKeyUp = (event: KeyboardEvent): void => {\n switch (event.code) {\n case 'ArrowUp':\n case 'KeyW':\n this.moveForward = false\n break\n\n case 'ArrowLeft':\n case 'KeyA':\n this.moveLeft = false\n break\n\n case 'ArrowDown':\n case 'KeyS':\n this.moveBackward = false\n break\n\n case 'ArrowRight':\n case 'KeyD':\n this.moveRight = false\n break\n\n case 'KeyR':\n this.moveUp = false\n break\n case 'KeyF':\n this.moveDown = false\n break\n }\n }\n\n public lookAt = (x: Vector3 | number, y?: number, z?: number): this => {\n if (x instanceof Vector3) {\n this.target.copy(x)\n } else if (y && z) {\n this.target.set(x, y, z)\n }\n\n this.object.lookAt(this.target)\n\n this.setOrientation()\n\n return this\n }\n\n public update = (delta: number): void => {\n if (!this.enabled) return\n\n if (this.heightSpeed) {\n const y = MathUtils.clamp(this.object.position.y, this.heightMin, this.heightMax)\n const heightDelta = y - this.heightMin\n\n this.autoSpeedFactor = delta * (heightDelta * this.heightCoef)\n } else {\n this.autoSpeedFactor = 0.0\n }\n\n const actualMoveSpeed = delta * this.movementSpeed\n\n if (this.moveForward || (this.autoForward && !this.moveBackward)) {\n this.object.translateZ(-(actualMoveSpeed + this.autoSpeedFactor))\n }\n if (this.moveBackward) this.object.translateZ(actualMoveSpeed)\n\n if (this.moveLeft) this.object.translateX(-actualMoveSpeed)\n if (this.moveRight) this.object.translateX(actualMoveSpeed)\n\n if (this.moveUp) this.object.translateY(actualMoveSpeed)\n if (this.moveDown) this.object.translateY(-actualMoveSpeed)\n\n let actualLookSpeed = delta * this.lookSpeed\n\n if (!this.activeLook) {\n actualLookSpeed = 0\n }\n\n let verticalLookRatio = 1\n\n if (this.constrainVertical) {\n verticalLookRatio = Math.PI / (this.verticalMax - this.verticalMin)\n }\n\n this.lon -= this.mouseX * actualLookSpeed\n if (this.lookVertical) this.lat -= this.mouseY * actualLookSpeed * verticalLookRatio\n\n this.lat = Math.max(-85, Math.min(85, this.lat))\n\n let phi = MathUtils.degToRad(90 - this.lat)\n const theta = MathUtils.degToRad(this.lon)\n\n if (this.constrainVertical) {\n phi = MathUtils.mapLinear(phi, 0, Math.PI, this.verticalMin, this.verticalMax)\n }\n\n const position = this.object.position\n\n targetPosition.setFromSphericalCoords(1, phi, theta).add(position)\n\n this.object.lookAt(targetPosition)\n }\n\n private contextmenu = (event: Event): void => event.preventDefault()\n\n private setOrientation = (): void => {\n this.lookDirection.set(0, 0, -1).applyQuaternion(this.object.quaternion)\n this.spherical.setFromVector3(this.lookDirection)\n this.lat = 90 - MathUtils.radToDeg(this.spherical.phi)\n this.lon = MathUtils.radToDeg(this.spherical.theta)\n }\n}\n"],"names":["Vector3","EventDispatcher","Spherical","MathUtils"],"mappings":"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"}
|
@@ -1,5 +1,6 @@
|
|
1
|
-
import { Vector3,
|
2
|
-
|
1
|
+
import { Vector3, Camera } from 'three';
|
2
|
+
import { EventDispatcher } from './EventDispatcher';
|
3
|
+
export declare class FirstPersonControls extends EventDispatcher<{}> {
|
3
4
|
object: Camera;
|
4
5
|
domElement?: HTMLElement | null;
|
5
6
|
enabled: boolean;
|
@@ -4,7 +4,8 @@ var __publicField = (obj, key, value) => {
|
|
4
4
|
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
5
5
|
return value;
|
6
6
|
};
|
7
|
-
import { Vector3,
|
7
|
+
import { Vector3, Spherical, MathUtils } from "three";
|
8
|
+
import { EventDispatcher } from "./EventDispatcher.js";
|
8
9
|
const targetPosition = new Vector3();
|
9
10
|
class FirstPersonControls extends EventDispatcher {
|
10
11
|
constructor(object, domElement) {
|