three-stdlib 2.34.0 → 2.35.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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/helpers/RaycasterHelper.d.ts +33 -0
- 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) {
|