three-stdlib 2.28.10 → 2.28.12
Sign up to get free protection for your applications and to get access to all the features.
- package/controls/ArcballControls.cjs.map +1 -1
- package/controls/ArcballControls.js.map +1 -1
- package/controls/DeviceOrientationControls.cjs.map +1 -1
- package/controls/DeviceOrientationControls.js.map +1 -1
- package/controls/DragControls.cjs.map +1 -1
- package/controls/DragControls.js.map +1 -1
- package/controls/FlyControls.cjs +1 -1
- package/controls/FlyControls.cjs.map +1 -1
- package/controls/FlyControls.js +1 -1
- package/controls/FlyControls.js.map +1 -1
- package/controls/OrbitControls.cjs.map +1 -1
- package/controls/OrbitControls.js.map +1 -1
- package/controls/PointerLockControls.cjs.map +1 -1
- package/controls/PointerLockControls.js.map +1 -1
- package/controls/TrackballControls.cjs +0 -2
- package/controls/TrackballControls.cjs.map +1 -1
- package/controls/TrackballControls.js +0 -2
- package/controls/TrackballControls.js.map +1 -1
- package/controls/TransformControls.cjs +2 -2
- package/controls/TransformControls.cjs.map +1 -1
- package/controls/TransformControls.js +2 -2
- package/controls/TransformControls.js.map +1 -1
- package/controls/experimental/CameraControls.cjs.map +1 -1
- package/controls/experimental/CameraControls.js.map +1 -1
- package/loaders/EXRLoader.cjs +1 -1
- package/loaders/EXRLoader.cjs.map +1 -1
- package/loaders/EXRLoader.js +1 -1
- package/loaders/EXRLoader.js.map +1 -1
- package/loaders/FontLoader.cjs.map +1 -1
- package/loaders/FontLoader.js.map +1 -1
- package/loaders/HDRCubeTextureLoader.cjs +3 -1
- package/loaders/HDRCubeTextureLoader.cjs.map +1 -1
- package/loaders/HDRCubeTextureLoader.d.ts +1 -1
- package/loaders/HDRCubeTextureLoader.js +3 -1
- package/loaders/HDRCubeTextureLoader.js.map +1 -1
- package/modifiers/CurveModifier.cjs.map +1 -1
- package/modifiers/CurveModifier.js.map +1 -1
- package/modifiers/TessellateModifier.cjs.map +1 -1
- package/modifiers/TessellateModifier.js.map +1 -1
- package/package.json +1 -1
- package/postprocessing/BloomPass.cjs.map +1 -1
- package/postprocessing/BloomPass.d.ts +16 -3
- package/postprocessing/BloomPass.js.map +1 -1
- package/postprocessing/DotScreenPass.cjs.map +1 -1
- package/postprocessing/DotScreenPass.d.ts +3 -2
- package/postprocessing/DotScreenPass.js.map +1 -1
- package/postprocessing/FilmPass.cjs.map +1 -1
- package/postprocessing/FilmPass.d.ts +3 -2
- package/postprocessing/FilmPass.js.map +1 -1
- package/postprocessing/GlitchPass.cjs.map +1 -1
- package/postprocessing/GlitchPass.d.ts +3 -2
- package/postprocessing/GlitchPass.js.map +1 -1
- package/postprocessing/WaterPass.cjs +2 -2
- package/postprocessing/WaterPass.cjs.map +1 -1
- package/postprocessing/WaterPass.d.ts +7 -2
- package/postprocessing/WaterPass.js +3 -3
- package/postprocessing/WaterPass.js.map +1 -1
- package/webxr/OculusHandModel.cjs.map +1 -1
- package/webxr/OculusHandModel.js.map +1 -1
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"DeviceOrientationControls.cjs","sources":["../../src/controls/DeviceOrientationControls.ts"],"sourcesContent":["import { Camera, Euler, EventDispatcher, MathUtils, Quaternion, Vector3 } from 'three'\n\n/**\n * W3C Device Orientation control (http://w3c.github.io/deviceorientation/spec-source-orientation.html)\n */\n\nclass DeviceOrientationControls extends EventDispatcher {\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 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":";;;;;;;;;AAMA,MAAM,kCAAkCA,MAAAA,gBAAgB;AAAA;AAAA,EAWtD,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;
|
1
|
+
{"version":3,"file":"DeviceOrientationControls.cjs","sources":["../../src/controls/DeviceOrientationControls.ts"],"sourcesContent":["import { Camera, Euler, EventDispatcher, MathUtils, Quaternion, Vector3 } from 'three'\n\n/**\n * W3C Device Orientation control (http://w3c.github.io/deviceorientation/spec-source-orientation.html)\n */\n\nclass DeviceOrientationControls extends EventDispatcher {\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":";;;;;;;;;AAMA,MAAM,kCAAkCA,MAAAA,gBAAgB;AAAA;AAAA,EAWtD,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 +1 @@
|
|
1
|
-
{"version":3,"file":"DeviceOrientationControls.js","sources":["../../src/controls/DeviceOrientationControls.ts"],"sourcesContent":["import { Camera, Euler, EventDispatcher, MathUtils, Quaternion, Vector3 } from 'three'\n\n/**\n * W3C Device Orientation control (http://w3c.github.io/deviceorientation/spec-source-orientation.html)\n */\n\nclass DeviceOrientationControls extends EventDispatcher {\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 this.dispatchEvent(this.changeEvent)\n }\n }\n }\n\n public dispose = (): void => this.disconnect()\n}\n\nexport { DeviceOrientationControls }\n"],"names":[],"mappings":";;;;;;;AAMA,MAAM,kCAAkC,gBAAgB;AAAA;AAAA,EAWtD,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;
|
1
|
+
{"version":3,"file":"DeviceOrientationControls.js","sources":["../../src/controls/DeviceOrientationControls.ts"],"sourcesContent":["import { Camera, Euler, EventDispatcher, MathUtils, Quaternion, Vector3 } from 'three'\n\n/**\n * W3C Device Orientation control (http://w3c.github.io/deviceorientation/spec-source-orientation.html)\n */\n\nclass DeviceOrientationControls extends EventDispatcher {\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":";;;;;;;AAMA,MAAM,kCAAkC,gBAAgB;AAAA;AAAA,EAWtD,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;"}
|
@@ -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 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 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 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 this.dispatchEvent({ type: 'dragstart', object: this._selected })\n }\n }\n\n private onMouseCancel = (): void => {\n if (this._selected) {\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 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 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 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":";;;;;;;;;AAEA,MAAM,qBAAqBA,MAAAA,gBAAgB;AAAA,EAoBzC,YAAY,UAAsB,SAAiB,aAA0B;AACrE;AApBD,mCAAU;AACV,0CAAiB;AAEhB;AACA;AACA;AAEA,kCAAS,IAAIC,MAAAA;AACb,sCAAa,IAAIC,MAAAA;AAEjB,kCAAS,IAAIC,MAAAA;AACb,mCAAU,IAAIC,MAAAA;AACd,yCAAgB,IAAIA,MAAAA;AACpB,0CAAiB,IAAIA,MAAAA;AACrB,0CAAiB,IAAIC,MAAAA;AACrB,0CAAiC,CAAA;AACjC,qCAA6B;AAC7B,oCAA4B;AAY7B,oCAAW,MAAY;AAC5B,WAAK,YAAY,iBAAiB,eAAe,KAAK,aAAa;AACnE,WAAK,YAAY,iBAAiB,eAAe,KAAK,aAAa;AACnE,WAAK,YAAY,iBAAiB,aAAa,KAAK,eAAe;AACnE,WAAK,YAAY,iBAAiB,gBAAgB,KAAK,eAAe;AACtE,WAAK,YAAY,iBAAiB,aAAa,KAAK,WAAW;AAC/D,WAAK,YAAY,iBAAiB,cAAc,KAAK,YAAY;AACjE,WAAK,YAAY,iBAAiB,YAAY,KAAK,UAAU;AAAA,IAAA;AAGxD,sCAAa,MAAY;AAC9B,WAAK,YAAY,oBAAoB,eAAe,KAAK,aAAa;AACtE,WAAK,YAAY,oBAAoB,eAAe,KAAK,aAAa;AACtE,WAAK,YAAY,oBAAoB,aAAa,KAAK,eAAe;AACtE,WAAK,YAAY,oBAAoB,gBAAgB,KAAK,eAAe;AACzE,WAAK,YAAY,oBAAoB,aAAa,KAAK,WAAW;AAClE,WAAK,YAAY,oBAAoB,cAAc,KAAK,YAAY;AACpE,WAAK,YAAY,oBAAoB,YAAY,KAAK,UAAU;AAE3D,WAAA,YAAY,MAAM,SAAS;AAAA,IAAA;AAI3B;AAAA,mCAAU,MAAY,KAAK;AAE3B,sCAAa,MAAkB,KAAK;AAEpC,wCAAe,MAAiB,KAAK;AAEpC,uCAAc,CAAC,UAA4B;AAC3C,YAAA,OAAO,KAAK,YAAY,sBAAsB;AAE/C,WAAA,OAAO,KAAM,MAAM,UAAU,KAAK,QAAQ,KAAK,QAAS,IAAI;AAC5D,WAAA,OAAO,IAAI,GAAG,MAAM,UAAU,KAAK,OAAO,KAAK,UAAU,IAAI;AAElE,WAAK,WAAW,cAAc,KAAK,QAAQ,KAAK,OAAO;AAEnD,UAAA,KAAK,aAAa,KAAK,SAAS;AAC9B,YAAA,KAAK,WAAW,IAAI,eAAe,KAAK,QAAQ,KAAK,aAAa,GAAG;AACvE,eAAK,UAAU,SAAS,KAAK,KAAK,cAAc,IAAI,KAAK,OAAO,EAAE,aAAa,KAAK,cAAc,CAAC;AAAA,QACrG;AAEA,aAAK,cAAc,EAAE,MAAM,QAAQ,QAAQ,KAAK,WAAW;AAE3D;AAAA,MACF;AAEA,WAAK,eAAe,SAAS;AAE7B,WAAK,WAAW,cAAc,KAAK,QAAQ,KAAK,OAAO;AACvD,WAAK,WAAW,iBAAiB,KAAK,UAAU,MAAM,KAAK,cAAc;AAErE,UAAA,KAAK,eAAe,SAAS,GAAG;AAClC,cAAM,SAAS,KAAK,eAAe,CAAC,EAAE;AAEtC,aAAK,OAAO;AAAA,UACV,KAAK,QAAQ,kBAAkB,KAAK,OAAO,MAAM;AAAA,UACjD,KAAK,eAAe,sBAAsB,OAAO,WAAW;AAAA,QAAA;AAG1D,YAAA,KAAK,aAAa,QAAQ;AAC5B,eAAK,cAAc,EAAE,MAAM,WAAW,OAAQ,CAAA;AAEzC,eAAA,YAAY,MAAM,SAAS;AAChC,eAAK,WAAW;AAAA,QAClB;AAAA,MAAA,OACK;AACD,YAAA,KAAK,aAAa,MAAM;AAC1B,eAAK,cAAc,EAAE,MAAM,YAAY,QAAQ,KAAK,UAAU;AAEzD,eAAA,YAAY,MAAM,SAAS;AAChC,eAAK,WAAW;AAAA,QAClB;AAAA,MACF;AAAA,IAAA;AAGM,uCAAc,MAAY;AAChC,WAAK,eAAe,SAAS;AAE7B,WAAK,WAAW,cAAc,KAAK,QAAQ,KAAK,OAAO;AACvD,WAAK,WAAW,iBAAiB,KAAK,UAAU,MAAM,KAAK,cAAc;AAErE,UAAA,KAAK,eAAe,SAAS,GAAG;AAC7B,aAAA,YAAY,KAAK,mBAAmB,OAAO,KAAK,SAAS,CAAC,IAAI,KAAK,eAAe,CAAC,EAAE;AAEtF,YAAA,KAAK,WAAW,IAAI,eAAe,KAAK,QAAQ,KAAK,aAAa,KAAK,KAAK,UAAU,QAAQ;AAChG,eAAK,eAAe,KAAK,KAAK,UAAU,OAAO,WAAW,EAAE;AAC5D,eAAK,QAAQ,KAAK,KAAK,aAAa,EAAE,IAAI,KAAK,eAAe,sBAAsB,KAAK,UAAU,WAAW,CAAC;AAAA,QACjH;AAEK,aAAA,YAAY,MAAM,SAAS;AAEhC,aAAK,cAAc,EAAE,MAAM,aAAa,QAAQ,KAAK,WAAW;AAAA,MAClE;AAAA,IAAA;AAGM,yCAAgB,MAAY;AAClC,UAAI,KAAK,WAAW;AAClB,aAAK,cAAc,EAAE,MAAM,WAAW,QAAQ,KAAK,WAAW;AAE9D,aAAK,YAAY;AAAA,MACnB;AAEA,WAAK,YAAY,MAAM,SAAS,KAAK,WAAW,YAAY;AAAA,IAAA;AAGtD,yCAAgB,CAAC,UAA8B;AACrD,cAAQ,MAAM,aAAa;AAAA,QACzB,KAAK;AAAA,QACL,KAAK;AACH,eAAK,YAAY,KAAK;AACtB;AAAA,MAGJ;AAAA,IAAA;AAGM,yCAAgB,CAAC,UAA8B;AACrD,cAAQ,MAAM,aAAa;AAAA,QACzB,KAAK;AAAA,QACL,KAAK;AACH,eAAK,YAAY;AACjB;AAAA,MAGJ;AAAA,IAAA;AAGM,2CAAkB,CAAC,UAA8B;AACvD,cAAQ,MAAM,aAAa;AAAA,QACzB,KAAK;AAAA,QACL,KAAK;AACH,eAAK,cAAc;AACnB;AAAA,MAGJ;AAAA,IAAA;AAGM,uCAAc,CAAC,UAA4B;AACjD,YAAM,eAAe;AACf,YAAA,WAAW,MAAM,eAAe,CAAC;AAEjC,YAAA,OAAO,KAAK,YAAY,sBAAsB;AAE/C,WAAA,OAAO,KAAM,SAAS,UAAU,KAAK,QAAQ,KAAK,QAAS,IAAI;AAC/D,WAAA,OAAO,IAAI,GAAG,SAAS,UAAU,KAAK,OAAO,KAAK,UAAU,IAAI;AAErE,WAAK,WAAW,cAAc,KAAK,QAAQ,KAAK,OAAO;AAEnD,UAAA,KAAK,aAAa,KAAK,SAAS;AAC9B,YAAA,KAAK,WAAW,IAAI,eAAe,KAAK,QAAQ,KAAK,aAAa,GAAG;AACvE,eAAK,UAAU,SAAS,KAAK,KAAK,cAAc,IAAI,KAAK,OAAO,EAAE,aAAa,KAAK,cAAc,CAAC;AAAA,QACrG;AAEA,aAAK,cAAc,EAAE,MAAM,QAAQ,QAAQ,KAAK,WAAW;AAE3D;AAAA,MACF;AAAA,IAAA;AAGM,wCAAe,CAAC,UAA4B;AAClD,YAAM,eAAe;AACf,YAAA,WAAW,MAAM,eAAe,CAAC;AAEjC,YAAA,OAAO,KAAK,YAAY,sBAAsB;AAE/C,WAAA,OAAO,KAAM,SAAS,UAAU,KAAK,QAAQ,KAAK,QAAS,IAAI;AAC/D,WAAA,OAAO,IAAI,GAAG,SAAS,UAAU,KAAK,OAAO,KAAK,UAAU,IAAI;AAErE,WAAK,eAAe,SAAS;AAE7B,WAAK,WAAW,cAAc,KAAK,QAAQ,KAAK,OAAO;AACvD,WAAK,WAAW,iBAAiB,KAAK,UAAU,MAAM,KAAK,cAAc;AAErE,UAAA,KAAK,eAAe,SAAS,GAAG;AAC7B,aAAA,YAAY,KAAK,mBAAmB,OAAO,KAAK,SAAS,CAAC,IAAI,KAAK,eAAe,CAAC,EAAE;AAE1F,aAAK,OAAO;AAAA,UACV,KAAK,QAAQ,kBAAkB,KAAK,OAAO,MAAM;AAAA,UACjD,KAAK,eAAe,sBAAsB,KAAK,UAAU,WAAW;AAAA,QAAA;AAGlE,YAAA,KAAK,WAAW,IAAI,eAAe,KAAK,QAAQ,KAAK,aAAa,KAAK,KAAK,UAAU,QAAQ;AAChG,eAAK,eAAe,KAAK,KAAK,UAAU,OAAO,WAAW,EAAE;AAC5D,eAAK,QAAQ,KAAK,KAAK,aAAa,EAAE,IAAI,KAAK,eAAe,sBAAsB,KAAK,UAAU,WAAW,CAAC;AAAA,QACjH;AAEK,aAAA,YAAY,MAAM,SAAS;AAEhC,aAAK,cAAc,EAAE,MAAM,aAAa,QAAQ,KAAK,WAAW;AAAA,MAClE;AAAA,IAAA;AAGM,sCAAa,CAAC,UAA4B;AAChD,YAAM,eAAe;AAErB,UAAI,KAAK,WAAW;AAClB,aAAK,cAAc,EAAE,MAAM,WAAW,QAAQ,KAAK,WAAW;AAE9D,aAAK,YAAY;AAAA,MACnB;AAEK,WAAA,YAAY,MAAM,SAAS;AAAA,IAAA;AAlNhC,SAAK,WAAW;AAChB,SAAK,UAAU;AACf,SAAK,cAAc;AAEnB,SAAK,SAAS;AAAA,EAChB;AA+MF;;"}
|
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 +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 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 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 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 this.dispatchEvent({ type: 'dragstart', object: this._selected })\n }\n }\n\n private onMouseCancel = (): void => {\n if (this._selected) {\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 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 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 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, 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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"}
|
package/controls/FlyControls.cjs
CHANGED
@@ -220,7 +220,7 @@ class FlyControls extends THREE.EventDispatcher {
|
|
220
220
|
// https://github.com/mrdoob/three.js/issues/20575
|
221
221
|
__publicField(this, "connect", (domElement) => {
|
222
222
|
this.domElement = domElement;
|
223
|
-
if (
|
223
|
+
if (!(domElement instanceof Document)) {
|
224
224
|
domElement.setAttribute("tabindex", -1);
|
225
225
|
}
|
226
226
|
this.domElement.addEventListener("contextmenu", contextmenu);
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"FlyControls.cjs","sources":["../../src/controls/FlyControls.ts"],"sourcesContent":["import { Camera, EventDispatcher, Quaternion, Vector3 } from 'three'\n\nfunction contextmenu(event: Event): void {\n event.preventDefault()\n}\n\nclass FlyControls extends EventDispatcher {\n public object: Camera\n public domElement: HTMLElement | Document = null!\n\n public movementSpeed = 1.0\n public rollSpeed = 0.005\n\n public dragToLook = false\n public autoForward = false\n\n private changeEvent = { type: 'change' }\n private EPS = 0.000001\n\n private tmpQuaternion = new Quaternion()\n\n private mouseStatus = 0\n\n private movementSpeedMultiplier = 1\n\n private moveState = {\n up: 0,\n down: 0,\n left: 0,\n right: 0,\n forward: 0,\n back: 0,\n pitchUp: 0,\n pitchDown: 0,\n yawLeft: 0,\n yawRight: 0,\n rollLeft: 0,\n rollRight: 0,\n }\n private moveVector = new Vector3(0, 0, 0)\n private rotationVector = new Vector3(0, 0, 0)\n\n constructor(object: Camera, domElement?: HTMLElement | Document) {\n super()\n\n this.object = object\n\n // connect events\n if (domElement !== undefined) this.connect(domElement)\n\n this.updateMovementVector()\n this.updateRotationVector()\n }\n\n private keydown = (event: KeyboardEvent): void => {\n if (event.altKey) {\n return\n }\n\n switch (event.code) {\n case 'ShiftLeft':\n case 'ShiftRight':\n this.movementSpeedMultiplier = 0.1\n break\n\n case 'KeyW':\n this.moveState.forward = 1\n break\n case 'KeyS':\n this.moveState.back = 1\n break\n\n case 'KeyA':\n this.moveState.left = 1\n break\n case 'KeyD':\n this.moveState.right = 1\n break\n\n case 'KeyR':\n this.moveState.up = 1\n break\n case 'KeyF':\n this.moveState.down = 1\n break\n\n case 'ArrowUp':\n this.moveState.pitchUp = 1\n break\n case 'ArrowDown':\n this.moveState.pitchDown = 1\n break\n\n case 'ArrowLeft':\n this.moveState.yawLeft = 1\n break\n case 'ArrowRight':\n this.moveState.yawRight = 1\n break\n\n case 'KeyQ':\n this.moveState.rollLeft = 1\n break\n case 'KeyE':\n this.moveState.rollRight = 1\n break\n }\n\n this.updateMovementVector()\n this.updateRotationVector()\n }\n\n private keyup = (event: KeyboardEvent): void => {\n switch (event.code) {\n case 'ShiftLeft':\n case 'ShiftRight':\n this.movementSpeedMultiplier = 1\n break\n\n case 'KeyW':\n this.moveState.forward = 0\n break\n case 'KeyS':\n this.moveState.back = 0\n break\n\n case 'KeyA':\n this.moveState.left = 0\n break\n case 'KeyD':\n this.moveState.right = 0\n break\n\n case 'KeyR':\n this.moveState.up = 0\n break\n case 'KeyF':\n this.moveState.down = 0\n break\n\n case 'ArrowUp':\n this.moveState.pitchUp = 0\n break\n case 'ArrowDown':\n this.moveState.pitchDown = 0\n break\n\n case 'ArrowLeft':\n this.moveState.yawLeft = 0\n break\n case 'ArrowRight':\n this.moveState.yawRight = 0\n break\n\n case 'KeyQ':\n this.moveState.rollLeft = 0\n break\n case 'KeyE':\n this.moveState.rollRight = 0\n break\n }\n\n this.updateMovementVector()\n this.updateRotationVector()\n }\n\n private pointerdown = (event: MouseEvent): void => {\n if (this.dragToLook) {\n this.mouseStatus++\n } else {\n switch (event.button) {\n case 0:\n this.moveState.forward = 1\n break\n case 2:\n this.moveState.back = 1\n break\n }\n\n this.updateMovementVector()\n }\n }\n\n private pointermove = (event: MouseEvent): void => {\n if (!this.dragToLook || this.mouseStatus > 0) {\n const container = this.getContainerDimensions()\n const halfWidth = container.size[0] / 2\n const halfHeight = container.size[1] / 2\n\n this.moveState.yawLeft = -(event.pageX - container.offset[0] - halfWidth) / halfWidth\n this.moveState.pitchDown = (event.pageY - container.offset[1] - halfHeight) / halfHeight\n\n this.updateRotationVector()\n }\n }\n\n private pointerup = (event: MouseEvent): void => {\n if (this.dragToLook) {\n this.mouseStatus--\n\n this.moveState.yawLeft = this.moveState.pitchDown = 0\n } else {\n switch (event.button) {\n case 0:\n this.moveState.forward = 0\n break\n case 2:\n this.moveState.back = 0\n break\n }\n\n this.updateMovementVector()\n }\n\n this.updateRotationVector()\n }\n\n private lastQuaternion = new Quaternion()\n private lastPosition = new Vector3()\n\n public update = (delta: number): void => {\n const moveMult = delta * this.movementSpeed\n const rotMult = delta * this.rollSpeed\n\n this.object.translateX(this.moveVector.x * moveMult)\n this.object.translateY(this.moveVector.y * moveMult)\n this.object.translateZ(this.moveVector.z * moveMult)\n\n this.tmpQuaternion\n .set(this.rotationVector.x * rotMult, this.rotationVector.y * rotMult, this.rotationVector.z * rotMult, 1)\n .normalize()\n this.object.quaternion.multiply(this.tmpQuaternion)\n\n if (\n this.lastPosition.distanceToSquared(this.object.position) > this.EPS ||\n 8 * (1 - this.lastQuaternion.dot(this.object.quaternion)) > this.EPS\n ) {\n this.dispatchEvent(this.changeEvent)\n this.lastQuaternion.copy(this.object.quaternion)\n this.lastPosition.copy(this.object.position)\n }\n }\n\n private updateMovementVector = (): void => {\n const forward = this.moveState.forward || (this.autoForward && !this.moveState.back) ? 1 : 0\n\n this.moveVector.x = -this.moveState.left + this.moveState.right\n this.moveVector.y = -this.moveState.down + this.moveState.up\n this.moveVector.z = -forward + this.moveState.back\n }\n\n private updateRotationVector = (): void => {\n this.rotationVector.x = -this.moveState.pitchDown + this.moveState.pitchUp\n this.rotationVector.y = -this.moveState.yawRight + this.moveState.yawLeft\n this.rotationVector.z = -this.moveState.rollRight + this.moveState.rollLeft\n }\n\n private getContainerDimensions = (): {\n size: number[]\n offset: number[]\n } => {\n if (this.domElement != document && !(this.domElement instanceof Document)) {\n return {\n size: [this.domElement.offsetWidth, this.domElement.offsetHeight],\n offset: [this.domElement.offsetLeft, this.domElement.offsetTop],\n }\n } else {\n return {\n size: [window.innerWidth, window.innerHeight],\n offset: [0, 0],\n }\n }\n }\n\n // https://github.com/mrdoob/three.js/issues/20575\n public connect = (domElement: HTMLElement | Document): void => {\n this.domElement = domElement\n\n if (domElement && !(domElement instanceof Document)) {\n domElement.setAttribute('tabindex', -1 as any)\n }\n\n this.domElement.addEventListener('contextmenu', contextmenu)\n ;(this.domElement as HTMLElement).addEventListener('pointermove', this.pointermove)\n ;(this.domElement as HTMLElement).addEventListener('pointerdown', this.pointerdown)\n ;(this.domElement as HTMLElement).addEventListener('pointerup', this.pointerup)\n\n window.addEventListener('keydown', this.keydown)\n window.addEventListener('keyup', this.keyup)\n }\n\n public dispose = (): void => {\n this.domElement.removeEventListener('contextmenu', contextmenu)\n ;(this.domElement as HTMLElement).removeEventListener('pointermove', this.pointermove)\n ;(this.domElement as HTMLElement).removeEventListener('pointerdown', this.pointerdown)\n ;(this.domElement as HTMLElement).removeEventListener('pointerup', this.pointerup)\n\n window.removeEventListener('keydown', this.keydown)\n window.removeEventListener('keyup', this.keyup)\n }\n}\n\nexport { FlyControls }\n"],"names":["EventDispatcher","Quaternion","Vector3"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"FlyControls.cjs","sources":["../../src/controls/FlyControls.ts"],"sourcesContent":["import { Camera, EventDispatcher, Quaternion, Vector3 } from 'three'\n\nfunction contextmenu(event: Event): void {\n event.preventDefault()\n}\n\nclass FlyControls extends EventDispatcher {\n public object: Camera\n public domElement: HTMLElement | Document = null!\n\n public movementSpeed = 1.0\n public rollSpeed = 0.005\n\n public dragToLook = false\n public autoForward = false\n\n private changeEvent = { type: 'change' }\n private EPS = 0.000001\n\n private tmpQuaternion = new Quaternion()\n\n private mouseStatus = 0\n\n private movementSpeedMultiplier = 1\n\n private moveState = {\n up: 0,\n down: 0,\n left: 0,\n right: 0,\n forward: 0,\n back: 0,\n pitchUp: 0,\n pitchDown: 0,\n yawLeft: 0,\n yawRight: 0,\n rollLeft: 0,\n rollRight: 0,\n }\n private moveVector = new Vector3(0, 0, 0)\n private rotationVector = new Vector3(0, 0, 0)\n\n constructor(object: Camera, domElement?: HTMLElement | Document) {\n super()\n\n this.object = object\n\n // connect events\n if (domElement !== undefined) this.connect(domElement)\n\n this.updateMovementVector()\n this.updateRotationVector()\n }\n\n private keydown = (event: KeyboardEvent): void => {\n if (event.altKey) {\n return\n }\n\n switch (event.code) {\n case 'ShiftLeft':\n case 'ShiftRight':\n this.movementSpeedMultiplier = 0.1\n break\n\n case 'KeyW':\n this.moveState.forward = 1\n break\n case 'KeyS':\n this.moveState.back = 1\n break\n\n case 'KeyA':\n this.moveState.left = 1\n break\n case 'KeyD':\n this.moveState.right = 1\n break\n\n case 'KeyR':\n this.moveState.up = 1\n break\n case 'KeyF':\n this.moveState.down = 1\n break\n\n case 'ArrowUp':\n this.moveState.pitchUp = 1\n break\n case 'ArrowDown':\n this.moveState.pitchDown = 1\n break\n\n case 'ArrowLeft':\n this.moveState.yawLeft = 1\n break\n case 'ArrowRight':\n this.moveState.yawRight = 1\n break\n\n case 'KeyQ':\n this.moveState.rollLeft = 1\n break\n case 'KeyE':\n this.moveState.rollRight = 1\n break\n }\n\n this.updateMovementVector()\n this.updateRotationVector()\n }\n\n private keyup = (event: KeyboardEvent): void => {\n switch (event.code) {\n case 'ShiftLeft':\n case 'ShiftRight':\n this.movementSpeedMultiplier = 1\n break\n\n case 'KeyW':\n this.moveState.forward = 0\n break\n case 'KeyS':\n this.moveState.back = 0\n break\n\n case 'KeyA':\n this.moveState.left = 0\n break\n case 'KeyD':\n this.moveState.right = 0\n break\n\n case 'KeyR':\n this.moveState.up = 0\n break\n case 'KeyF':\n this.moveState.down = 0\n break\n\n case 'ArrowUp':\n this.moveState.pitchUp = 0\n break\n case 'ArrowDown':\n this.moveState.pitchDown = 0\n break\n\n case 'ArrowLeft':\n this.moveState.yawLeft = 0\n break\n case 'ArrowRight':\n this.moveState.yawRight = 0\n break\n\n case 'KeyQ':\n this.moveState.rollLeft = 0\n break\n case 'KeyE':\n this.moveState.rollRight = 0\n break\n }\n\n this.updateMovementVector()\n this.updateRotationVector()\n }\n\n private pointerdown = (event: MouseEvent): void => {\n if (this.dragToLook) {\n this.mouseStatus++\n } else {\n switch (event.button) {\n case 0:\n this.moveState.forward = 1\n break\n case 2:\n this.moveState.back = 1\n break\n }\n\n this.updateMovementVector()\n }\n }\n\n private pointermove = (event: MouseEvent): void => {\n if (!this.dragToLook || this.mouseStatus > 0) {\n const container = this.getContainerDimensions()\n const halfWidth = container.size[0] / 2\n const halfHeight = container.size[1] / 2\n\n this.moveState.yawLeft = -(event.pageX - container.offset[0] - halfWidth) / halfWidth\n this.moveState.pitchDown = (event.pageY - container.offset[1] - halfHeight) / halfHeight\n\n this.updateRotationVector()\n }\n }\n\n private pointerup = (event: MouseEvent): void => {\n if (this.dragToLook) {\n this.mouseStatus--\n\n this.moveState.yawLeft = this.moveState.pitchDown = 0\n } else {\n switch (event.button) {\n case 0:\n this.moveState.forward = 0\n break\n case 2:\n this.moveState.back = 0\n break\n }\n\n this.updateMovementVector()\n }\n\n this.updateRotationVector()\n }\n\n private lastQuaternion = new Quaternion()\n private lastPosition = new Vector3()\n\n public update = (delta: number): void => {\n const moveMult = delta * this.movementSpeed\n const rotMult = delta * this.rollSpeed\n\n this.object.translateX(this.moveVector.x * moveMult)\n this.object.translateY(this.moveVector.y * moveMult)\n this.object.translateZ(this.moveVector.z * moveMult)\n\n this.tmpQuaternion\n .set(this.rotationVector.x * rotMult, this.rotationVector.y * rotMult, this.rotationVector.z * rotMult, 1)\n .normalize()\n this.object.quaternion.multiply(this.tmpQuaternion)\n\n if (\n this.lastPosition.distanceToSquared(this.object.position) > this.EPS ||\n 8 * (1 - this.lastQuaternion.dot(this.object.quaternion)) > this.EPS\n ) {\n // @ts-ignore\n this.dispatchEvent(this.changeEvent)\n this.lastQuaternion.copy(this.object.quaternion)\n this.lastPosition.copy(this.object.position)\n }\n }\n\n private updateMovementVector = (): void => {\n const forward = this.moveState.forward || (this.autoForward && !this.moveState.back) ? 1 : 0\n\n this.moveVector.x = -this.moveState.left + this.moveState.right\n this.moveVector.y = -this.moveState.down + this.moveState.up\n this.moveVector.z = -forward + this.moveState.back\n }\n\n private updateRotationVector = (): void => {\n this.rotationVector.x = -this.moveState.pitchDown + this.moveState.pitchUp\n this.rotationVector.y = -this.moveState.yawRight + this.moveState.yawLeft\n this.rotationVector.z = -this.moveState.rollRight + this.moveState.rollLeft\n }\n\n private getContainerDimensions = (): {\n size: number[]\n offset: number[]\n } => {\n if (this.domElement != document && !(this.domElement instanceof Document)) {\n return {\n size: [this.domElement.offsetWidth, this.domElement.offsetHeight],\n offset: [this.domElement.offsetLeft, this.domElement.offsetTop],\n }\n } else {\n return {\n size: [window.innerWidth, window.innerHeight],\n offset: [0, 0],\n }\n }\n }\n\n // https://github.com/mrdoob/three.js/issues/20575\n public connect = (domElement: HTMLElement | Document): void => {\n this.domElement = domElement\n\n if (!(domElement instanceof Document)) {\n domElement.setAttribute('tabindex', -1 as any)\n }\n\n this.domElement.addEventListener('contextmenu', contextmenu)\n ;(this.domElement as HTMLElement).addEventListener('pointermove', this.pointermove)\n ;(this.domElement as HTMLElement).addEventListener('pointerdown', this.pointerdown)\n ;(this.domElement as HTMLElement).addEventListener('pointerup', this.pointerup)\n\n window.addEventListener('keydown', this.keydown)\n window.addEventListener('keyup', this.keyup)\n }\n\n public dispose = (): void => {\n this.domElement.removeEventListener('contextmenu', contextmenu)\n ;(this.domElement as HTMLElement).removeEventListener('pointermove', this.pointermove)\n ;(this.domElement as HTMLElement).removeEventListener('pointerdown', this.pointerdown)\n ;(this.domElement as HTMLElement).removeEventListener('pointerup', this.pointerup)\n\n window.removeEventListener('keydown', this.keydown)\n window.removeEventListener('keyup', this.keyup)\n }\n}\n\nexport { FlyControls }\n"],"names":["EventDispatcher","Quaternion","Vector3"],"mappings":"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"}
|
package/controls/FlyControls.js
CHANGED
@@ -218,7 +218,7 @@ class FlyControls extends EventDispatcher {
|
|
218
218
|
// https://github.com/mrdoob/three.js/issues/20575
|
219
219
|
__publicField(this, "connect", (domElement) => {
|
220
220
|
this.domElement = domElement;
|
221
|
-
if (
|
221
|
+
if (!(domElement instanceof Document)) {
|
222
222
|
domElement.setAttribute("tabindex", -1);
|
223
223
|
}
|
224
224
|
this.domElement.addEventListener("contextmenu", contextmenu);
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"FlyControls.js","sources":["../../src/controls/FlyControls.ts"],"sourcesContent":["import { Camera, EventDispatcher, Quaternion, Vector3 } from 'three'\n\nfunction contextmenu(event: Event): void {\n event.preventDefault()\n}\n\nclass FlyControls extends EventDispatcher {\n public object: Camera\n public domElement: HTMLElement | Document = null!\n\n public movementSpeed = 1.0\n public rollSpeed = 0.005\n\n public dragToLook = false\n public autoForward = false\n\n private changeEvent = { type: 'change' }\n private EPS = 0.000001\n\n private tmpQuaternion = new Quaternion()\n\n private mouseStatus = 0\n\n private movementSpeedMultiplier = 1\n\n private moveState = {\n up: 0,\n down: 0,\n left: 0,\n right: 0,\n forward: 0,\n back: 0,\n pitchUp: 0,\n pitchDown: 0,\n yawLeft: 0,\n yawRight: 0,\n rollLeft: 0,\n rollRight: 0,\n }\n private moveVector = new Vector3(0, 0, 0)\n private rotationVector = new Vector3(0, 0, 0)\n\n constructor(object: Camera, domElement?: HTMLElement | Document) {\n super()\n\n this.object = object\n\n // connect events\n if (domElement !== undefined) this.connect(domElement)\n\n this.updateMovementVector()\n this.updateRotationVector()\n }\n\n private keydown = (event: KeyboardEvent): void => {\n if (event.altKey) {\n return\n }\n\n switch (event.code) {\n case 'ShiftLeft':\n case 'ShiftRight':\n this.movementSpeedMultiplier = 0.1\n break\n\n case 'KeyW':\n this.moveState.forward = 1\n break\n case 'KeyS':\n this.moveState.back = 1\n break\n\n case 'KeyA':\n this.moveState.left = 1\n break\n case 'KeyD':\n this.moveState.right = 1\n break\n\n case 'KeyR':\n this.moveState.up = 1\n break\n case 'KeyF':\n this.moveState.down = 1\n break\n\n case 'ArrowUp':\n this.moveState.pitchUp = 1\n break\n case 'ArrowDown':\n this.moveState.pitchDown = 1\n break\n\n case 'ArrowLeft':\n this.moveState.yawLeft = 1\n break\n case 'ArrowRight':\n this.moveState.yawRight = 1\n break\n\n case 'KeyQ':\n this.moveState.rollLeft = 1\n break\n case 'KeyE':\n this.moveState.rollRight = 1\n break\n }\n\n this.updateMovementVector()\n this.updateRotationVector()\n }\n\n private keyup = (event: KeyboardEvent): void => {\n switch (event.code) {\n case 'ShiftLeft':\n case 'ShiftRight':\n this.movementSpeedMultiplier = 1\n break\n\n case 'KeyW':\n this.moveState.forward = 0\n break\n case 'KeyS':\n this.moveState.back = 0\n break\n\n case 'KeyA':\n this.moveState.left = 0\n break\n case 'KeyD':\n this.moveState.right = 0\n break\n\n case 'KeyR':\n this.moveState.up = 0\n break\n case 'KeyF':\n this.moveState.down = 0\n break\n\n case 'ArrowUp':\n this.moveState.pitchUp = 0\n break\n case 'ArrowDown':\n this.moveState.pitchDown = 0\n break\n\n case 'ArrowLeft':\n this.moveState.yawLeft = 0\n break\n case 'ArrowRight':\n this.moveState.yawRight = 0\n break\n\n case 'KeyQ':\n this.moveState.rollLeft = 0\n break\n case 'KeyE':\n this.moveState.rollRight = 0\n break\n }\n\n this.updateMovementVector()\n this.updateRotationVector()\n }\n\n private pointerdown = (event: MouseEvent): void => {\n if (this.dragToLook) {\n this.mouseStatus++\n } else {\n switch (event.button) {\n case 0:\n this.moveState.forward = 1\n break\n case 2:\n this.moveState.back = 1\n break\n }\n\n this.updateMovementVector()\n }\n }\n\n private pointermove = (event: MouseEvent): void => {\n if (!this.dragToLook || this.mouseStatus > 0) {\n const container = this.getContainerDimensions()\n const halfWidth = container.size[0] / 2\n const halfHeight = container.size[1] / 2\n\n this.moveState.yawLeft = -(event.pageX - container.offset[0] - halfWidth) / halfWidth\n this.moveState.pitchDown = (event.pageY - container.offset[1] - halfHeight) / halfHeight\n\n this.updateRotationVector()\n }\n }\n\n private pointerup = (event: MouseEvent): void => {\n if (this.dragToLook) {\n this.mouseStatus--\n\n this.moveState.yawLeft = this.moveState.pitchDown = 0\n } else {\n switch (event.button) {\n case 0:\n this.moveState.forward = 0\n break\n case 2:\n this.moveState.back = 0\n break\n }\n\n this.updateMovementVector()\n }\n\n this.updateRotationVector()\n }\n\n private lastQuaternion = new Quaternion()\n private lastPosition = new Vector3()\n\n public update = (delta: number): void => {\n const moveMult = delta * this.movementSpeed\n const rotMult = delta * this.rollSpeed\n\n this.object.translateX(this.moveVector.x * moveMult)\n this.object.translateY(this.moveVector.y * moveMult)\n this.object.translateZ(this.moveVector.z * moveMult)\n\n this.tmpQuaternion\n .set(this.rotationVector.x * rotMult, this.rotationVector.y * rotMult, this.rotationVector.z * rotMult, 1)\n .normalize()\n this.object.quaternion.multiply(this.tmpQuaternion)\n\n if (\n this.lastPosition.distanceToSquared(this.object.position) > this.EPS ||\n 8 * (1 - this.lastQuaternion.dot(this.object.quaternion)) > this.EPS\n ) {\n this.dispatchEvent(this.changeEvent)\n this.lastQuaternion.copy(this.object.quaternion)\n this.lastPosition.copy(this.object.position)\n }\n }\n\n private updateMovementVector = (): void => {\n const forward = this.moveState.forward || (this.autoForward && !this.moveState.back) ? 1 : 0\n\n this.moveVector.x = -this.moveState.left + this.moveState.right\n this.moveVector.y = -this.moveState.down + this.moveState.up\n this.moveVector.z = -forward + this.moveState.back\n }\n\n private updateRotationVector = (): void => {\n this.rotationVector.x = -this.moveState.pitchDown + this.moveState.pitchUp\n this.rotationVector.y = -this.moveState.yawRight + this.moveState.yawLeft\n this.rotationVector.z = -this.moveState.rollRight + this.moveState.rollLeft\n }\n\n private getContainerDimensions = (): {\n size: number[]\n offset: number[]\n } => {\n if (this.domElement != document && !(this.domElement instanceof Document)) {\n return {\n size: [this.domElement.offsetWidth, this.domElement.offsetHeight],\n offset: [this.domElement.offsetLeft, this.domElement.offsetTop],\n }\n } else {\n return {\n size: [window.innerWidth, window.innerHeight],\n offset: [0, 0],\n }\n }\n }\n\n // https://github.com/mrdoob/three.js/issues/20575\n public connect = (domElement: HTMLElement | Document): void => {\n this.domElement = domElement\n\n if (domElement && !(domElement instanceof Document)) {\n domElement.setAttribute('tabindex', -1 as any)\n }\n\n this.domElement.addEventListener('contextmenu', contextmenu)\n ;(this.domElement as HTMLElement).addEventListener('pointermove', this.pointermove)\n ;(this.domElement as HTMLElement).addEventListener('pointerdown', this.pointerdown)\n ;(this.domElement as HTMLElement).addEventListener('pointerup', this.pointerup)\n\n window.addEventListener('keydown', this.keydown)\n window.addEventListener('keyup', this.keyup)\n }\n\n public dispose = (): void => {\n this.domElement.removeEventListener('contextmenu', contextmenu)\n ;(this.domElement as HTMLElement).removeEventListener('pointermove', this.pointermove)\n ;(this.domElement as HTMLElement).removeEventListener('pointerdown', this.pointerdown)\n ;(this.domElement as HTMLElement).removeEventListener('pointerup', this.pointerup)\n\n window.removeEventListener('keydown', this.keydown)\n window.removeEventListener('keyup', this.keyup)\n }\n}\n\nexport { FlyControls }\n"],"names":[],"mappings":"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"}
|
1
|
+
{"version":3,"file":"FlyControls.js","sources":["../../src/controls/FlyControls.ts"],"sourcesContent":["import { Camera, EventDispatcher, Quaternion, Vector3 } from 'three'\n\nfunction contextmenu(event: Event): void {\n event.preventDefault()\n}\n\nclass FlyControls extends EventDispatcher {\n public object: Camera\n public domElement: HTMLElement | Document = null!\n\n public movementSpeed = 1.0\n public rollSpeed = 0.005\n\n public dragToLook = false\n public autoForward = false\n\n private changeEvent = { type: 'change' }\n private EPS = 0.000001\n\n private tmpQuaternion = new Quaternion()\n\n private mouseStatus = 0\n\n private movementSpeedMultiplier = 1\n\n private moveState = {\n up: 0,\n down: 0,\n left: 0,\n right: 0,\n forward: 0,\n back: 0,\n pitchUp: 0,\n pitchDown: 0,\n yawLeft: 0,\n yawRight: 0,\n rollLeft: 0,\n rollRight: 0,\n }\n private moveVector = new Vector3(0, 0, 0)\n private rotationVector = new Vector3(0, 0, 0)\n\n constructor(object: Camera, domElement?: HTMLElement | Document) {\n super()\n\n this.object = object\n\n // connect events\n if (domElement !== undefined) this.connect(domElement)\n\n this.updateMovementVector()\n this.updateRotationVector()\n }\n\n private keydown = (event: KeyboardEvent): void => {\n if (event.altKey) {\n return\n }\n\n switch (event.code) {\n case 'ShiftLeft':\n case 'ShiftRight':\n this.movementSpeedMultiplier = 0.1\n break\n\n case 'KeyW':\n this.moveState.forward = 1\n break\n case 'KeyS':\n this.moveState.back = 1\n break\n\n case 'KeyA':\n this.moveState.left = 1\n break\n case 'KeyD':\n this.moveState.right = 1\n break\n\n case 'KeyR':\n this.moveState.up = 1\n break\n case 'KeyF':\n this.moveState.down = 1\n break\n\n case 'ArrowUp':\n this.moveState.pitchUp = 1\n break\n case 'ArrowDown':\n this.moveState.pitchDown = 1\n break\n\n case 'ArrowLeft':\n this.moveState.yawLeft = 1\n break\n case 'ArrowRight':\n this.moveState.yawRight = 1\n break\n\n case 'KeyQ':\n this.moveState.rollLeft = 1\n break\n case 'KeyE':\n this.moveState.rollRight = 1\n break\n }\n\n this.updateMovementVector()\n this.updateRotationVector()\n }\n\n private keyup = (event: KeyboardEvent): void => {\n switch (event.code) {\n case 'ShiftLeft':\n case 'ShiftRight':\n this.movementSpeedMultiplier = 1\n break\n\n case 'KeyW':\n this.moveState.forward = 0\n break\n case 'KeyS':\n this.moveState.back = 0\n break\n\n case 'KeyA':\n this.moveState.left = 0\n break\n case 'KeyD':\n this.moveState.right = 0\n break\n\n case 'KeyR':\n this.moveState.up = 0\n break\n case 'KeyF':\n this.moveState.down = 0\n break\n\n case 'ArrowUp':\n this.moveState.pitchUp = 0\n break\n case 'ArrowDown':\n this.moveState.pitchDown = 0\n break\n\n case 'ArrowLeft':\n this.moveState.yawLeft = 0\n break\n case 'ArrowRight':\n this.moveState.yawRight = 0\n break\n\n case 'KeyQ':\n this.moveState.rollLeft = 0\n break\n case 'KeyE':\n this.moveState.rollRight = 0\n break\n }\n\n this.updateMovementVector()\n this.updateRotationVector()\n }\n\n private pointerdown = (event: MouseEvent): void => {\n if (this.dragToLook) {\n this.mouseStatus++\n } else {\n switch (event.button) {\n case 0:\n this.moveState.forward = 1\n break\n case 2:\n this.moveState.back = 1\n break\n }\n\n this.updateMovementVector()\n }\n }\n\n private pointermove = (event: MouseEvent): void => {\n if (!this.dragToLook || this.mouseStatus > 0) {\n const container = this.getContainerDimensions()\n const halfWidth = container.size[0] / 2\n const halfHeight = container.size[1] / 2\n\n this.moveState.yawLeft = -(event.pageX - container.offset[0] - halfWidth) / halfWidth\n this.moveState.pitchDown = (event.pageY - container.offset[1] - halfHeight) / halfHeight\n\n this.updateRotationVector()\n }\n }\n\n private pointerup = (event: MouseEvent): void => {\n if (this.dragToLook) {\n this.mouseStatus--\n\n this.moveState.yawLeft = this.moveState.pitchDown = 0\n } else {\n switch (event.button) {\n case 0:\n this.moveState.forward = 0\n break\n case 2:\n this.moveState.back = 0\n break\n }\n\n this.updateMovementVector()\n }\n\n this.updateRotationVector()\n }\n\n private lastQuaternion = new Quaternion()\n private lastPosition = new Vector3()\n\n public update = (delta: number): void => {\n const moveMult = delta * this.movementSpeed\n const rotMult = delta * this.rollSpeed\n\n this.object.translateX(this.moveVector.x * moveMult)\n this.object.translateY(this.moveVector.y * moveMult)\n this.object.translateZ(this.moveVector.z * moveMult)\n\n this.tmpQuaternion\n .set(this.rotationVector.x * rotMult, this.rotationVector.y * rotMult, this.rotationVector.z * rotMult, 1)\n .normalize()\n this.object.quaternion.multiply(this.tmpQuaternion)\n\n if (\n this.lastPosition.distanceToSquared(this.object.position) > this.EPS ||\n 8 * (1 - this.lastQuaternion.dot(this.object.quaternion)) > this.EPS\n ) {\n // @ts-ignore\n this.dispatchEvent(this.changeEvent)\n this.lastQuaternion.copy(this.object.quaternion)\n this.lastPosition.copy(this.object.position)\n }\n }\n\n private updateMovementVector = (): void => {\n const forward = this.moveState.forward || (this.autoForward && !this.moveState.back) ? 1 : 0\n\n this.moveVector.x = -this.moveState.left + this.moveState.right\n this.moveVector.y = -this.moveState.down + this.moveState.up\n this.moveVector.z = -forward + this.moveState.back\n }\n\n private updateRotationVector = (): void => {\n this.rotationVector.x = -this.moveState.pitchDown + this.moveState.pitchUp\n this.rotationVector.y = -this.moveState.yawRight + this.moveState.yawLeft\n this.rotationVector.z = -this.moveState.rollRight + this.moveState.rollLeft\n }\n\n private getContainerDimensions = (): {\n size: number[]\n offset: number[]\n } => {\n if (this.domElement != document && !(this.domElement instanceof Document)) {\n return {\n size: [this.domElement.offsetWidth, this.domElement.offsetHeight],\n offset: [this.domElement.offsetLeft, this.domElement.offsetTop],\n }\n } else {\n return {\n size: [window.innerWidth, window.innerHeight],\n offset: [0, 0],\n }\n }\n }\n\n // https://github.com/mrdoob/three.js/issues/20575\n public connect = (domElement: HTMLElement | Document): void => {\n this.domElement = domElement\n\n if (!(domElement instanceof Document)) {\n domElement.setAttribute('tabindex', -1 as any)\n }\n\n this.domElement.addEventListener('contextmenu', contextmenu)\n ;(this.domElement as HTMLElement).addEventListener('pointermove', this.pointermove)\n ;(this.domElement as HTMLElement).addEventListener('pointerdown', this.pointerdown)\n ;(this.domElement as HTMLElement).addEventListener('pointerup', this.pointerup)\n\n window.addEventListener('keydown', this.keydown)\n window.addEventListener('keyup', this.keyup)\n }\n\n public dispose = (): void => {\n this.domElement.removeEventListener('contextmenu', contextmenu)\n ;(this.domElement as HTMLElement).removeEventListener('pointermove', this.pointermove)\n ;(this.domElement as HTMLElement).removeEventListener('pointerdown', this.pointerdown)\n ;(this.domElement as HTMLElement).removeEventListener('pointerup', this.pointerup)\n\n window.removeEventListener('keydown', this.keydown)\n window.removeEventListener('keyup', this.keyup)\n }\n}\n\nexport { FlyControls }\n"],"names":[],"mappings":"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"}
|