@babylonjs/core 5.0.0-beta.8 → 5.0.0-rc.1
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/Actions/actionEvent.d.ts +3 -4
- package/Actions/actionEvent.js.map +1 -1
- package/Animations/animation.d.ts +4 -4
- package/Animations/animation.js +4 -4
- package/Animations/animation.js.map +1 -1
- package/Audio/sound.d.ts +12 -6
- package/Audio/sound.js +48 -24
- package/Audio/sound.js.map +1 -1
- package/Behaviors/Meshes/baseSixDofDragBehavior.js.map +1 -1
- package/Behaviors/Meshes/pointerDragBehavior.js.map +1 -1
- package/Cameras/Inputs/BaseCameraPointersInput.d.ts +1 -0
- package/Cameras/Inputs/BaseCameraPointersInput.js +4 -3
- package/Cameras/Inputs/BaseCameraPointersInput.js.map +1 -1
- package/Cameras/Inputs/arcRotateCameraMouseWheelInput.js +7 -5
- package/Cameras/Inputs/arcRotateCameraMouseWheelInput.js.map +1 -1
- package/Cameras/Inputs/followCameraMouseWheelInput.js.map +1 -1
- package/Cameras/VR/vrExperienceHelper.js.map +1 -1
- package/Cameras/arcRotateCamera.js +3 -3
- package/Cameras/arcRotateCamera.js.map +1 -1
- package/DeviceInput/Helpers/eventFactory.d.ts +6 -6
- package/DeviceInput/Helpers/eventFactory.js +34 -16
- package/DeviceInput/Helpers/eventFactory.js.map +1 -1
- package/DeviceInput/InputDevices/deviceEnums.d.ts +26 -3
- package/DeviceInput/InputDevices/deviceEnums.js +31 -7
- package/DeviceInput/InputDevices/deviceEnums.js.map +1 -1
- package/DeviceInput/InputDevices/deviceSource.d.ts +11 -3
- package/DeviceInput/InputDevices/deviceSource.js.map +1 -1
- package/DeviceInput/InputDevices/deviceSourceManager.d.ts +28 -10
- package/DeviceInput/InputDevices/deviceSourceManager.js +131 -7
- package/DeviceInput/InputDevices/deviceSourceManager.js.map +1 -1
- package/DeviceInput/InputDevices/deviceTypes.d.ts +1 -1
- package/DeviceInput/InputDevices/deviceTypes.js.map +1 -1
- package/DeviceInput/InputDevices/inputInterfaces.d.ts +3 -28
- package/DeviceInput/InputDevices/inputInterfaces.js.map +1 -1
- package/DeviceInput/InputDevices/internalDeviceSourceManager.d.ts +15 -30
- package/DeviceInput/InputDevices/internalDeviceSourceManager.js +40 -110
- package/DeviceInput/InputDevices/internalDeviceSourceManager.js.map +1 -1
- package/DeviceInput/InputDevices/nativeDeviceInputSystem.d.ts +3 -2
- package/DeviceInput/InputDevices/nativeDeviceInputSystem.js +7 -13
- package/DeviceInput/InputDevices/nativeDeviceInputSystem.js.map +1 -1
- package/DeviceInput/InputDevices/webDeviceInputSystem.d.ts +11 -8
- package/DeviceInput/InputDevices/webDeviceInputSystem.js +116 -110
- package/DeviceInput/InputDevices/webDeviceInputSystem.js.map +1 -1
- package/Engines/Extensions/engine.query.d.ts +7 -0
- package/Engines/Extensions/engine.query.js +12 -0
- package/Engines/Extensions/engine.query.js.map +1 -1
- package/Engines/Extensions/engine.renderTarget.d.ts +5 -0
- package/Engines/Extensions/engine.renderTarget.js.map +1 -1
- package/Engines/Extensions/engine.views.d.ts +7 -0
- package/Engines/Extensions/engine.views.js +12 -0
- package/Engines/Extensions/engine.views.js.map +1 -1
- package/Engines/engine.d.ts +6 -2
- package/Engines/engine.js.map +1 -1
- package/Engines/index.d.ts +1 -0
- package/Engines/index.js +1 -0
- package/Engines/index.js.map +1 -1
- package/Engines/nativeEngine.js +12 -11
- package/Engines/nativeEngine.js.map +1 -1
- package/Engines/thinEngine.js +2 -2
- package/Engines/thinEngine.js.map +1 -1
- package/Engines/webgpuEngine.js +2 -2
- package/Engines/webgpuEngine.js.map +1 -1
- package/Events/deviceInputEvents.d.ts +17 -18
- package/Events/deviceInputEvents.js.map +1 -1
- package/Gizmos/boundingBoxGizmo.js.map +1 -1
- package/Helpers/environmentHelper.js +2 -2
- package/Helpers/environmentHelper.js.map +1 -1
- package/Inputs/scene.inputManager.d.ts +0 -1
- package/Inputs/scene.inputManager.js +54 -28
- package/Inputs/scene.inputManager.js.map +1 -1
- package/Layers/effectLayer.d.ts +1 -0
- package/Layers/effectLayer.js +24 -0
- package/Layers/effectLayer.js.map +1 -1
- package/Loading/sceneLoader.js +4 -3
- package/Loading/sceneLoader.js.map +1 -1
- package/Materials/Node/Blocks/Dual/textureBlock.d.ts +6 -2
- package/Materials/Node/Blocks/Dual/textureBlock.js +50 -8
- package/Materials/Node/Blocks/Dual/textureBlock.js.map +1 -1
- package/Materials/PBR/pbrBaseMaterial.js +1 -0
- package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
- package/Materials/Textures/Procedurals/proceduralTexture.d.ts +1 -1
- package/Materials/Textures/Procedurals/proceduralTexture.js.map +1 -1
- package/Materials/Textures/dynamicTexture.d.ts +1 -1
- package/Materials/Textures/dynamicTexture.js.map +1 -1
- package/Materials/materialPluginBase.d.ts +5 -0
- package/Materials/materialPluginBase.js +5 -0
- package/Materials/materialPluginBase.js.map +1 -1
- package/Materials/materialPluginEvent.d.ts +1 -0
- package/Materials/materialPluginEvent.js.map +1 -1
- package/Materials/materialPluginManager.d.ts +1 -0
- package/Materials/materialPluginManager.js +20 -15
- package/Materials/materialPluginManager.js.map +1 -1
- package/Materials/standardMaterial.js +1 -0
- package/Materials/standardMaterial.js.map +1 -1
- package/Maths/math.vector.d.ts +5 -0
- package/Maths/math.vector.js +11 -0
- package/Maths/math.vector.js.map +1 -1
- package/Meshes/Builders/polygonBuilder.js +2 -1
- package/Meshes/Builders/polygonBuilder.js.map +1 -1
- package/Meshes/abstractMesh.d.ts +1 -1
- package/Meshes/abstractMesh.js.map +1 -1
- package/Meshes/instancedMesh.js +7 -4
- package/Meshes/instancedMesh.js.map +1 -1
- package/Meshes/mesh.js +21 -22
- package/Meshes/mesh.js.map +1 -1
- package/Meshes/mesh.vertexData.d.ts +2 -2
- package/Meshes/mesh.vertexData.js +100 -76
- package/Meshes/mesh.vertexData.js.map +1 -1
- package/Meshes/transformNode.d.ts +0 -2
- package/Meshes/transformNode.js +6 -5
- package/Meshes/transformNode.js.map +1 -1
- package/Misc/error.d.ts +51 -0
- package/Misc/error.js +66 -0
- package/Misc/error.js.map +1 -0
- package/Misc/fileTools.d.ts +4 -4
- package/Misc/fileTools.js +30 -16
- package/Misc/fileTools.js.map +1 -1
- package/Misc/index.d.ts +1 -0
- package/Misc/index.js +1 -0
- package/Misc/index.js.map +1 -1
- package/Misc/khronosTextureContainer2.d.ts +8 -7
- package/Misc/khronosTextureContainer2.js.map +1 -1
- package/Misc/videoRecorder.d.ts +1 -1
- package/Misc/videoRecorder.js +1 -1
- package/Misc/videoRecorder.js.map +1 -1
- package/Morph/morphTarget.d.ts +2 -1
- package/Morph/morphTarget.js +5 -1
- package/Morph/morphTarget.js.map +1 -1
- package/Morph/morphTargetManager.js +1 -1
- package/Morph/morphTargetManager.js.map +1 -1
- package/Particles/particleSystem.d.ts +13 -1
- package/Particles/particleSystem.js +27 -1
- package/Particles/particleSystem.js.map +1 -1
- package/Rendering/prePassRenderer.js +12 -2
- package/Rendering/prePassRenderer.js.map +1 -1
- package/Rendering/subSurfaceConfiguration.js +1 -1
- package/Rendering/subSurfaceConfiguration.js.map +1 -1
- package/Rendering/utilityLayerRenderer.js +2 -0
- package/Rendering/utilityLayerRenderer.js.map +1 -1
- package/Shaders/ShadersInclude/pointCloudVertex.js +1 -1
- package/Shaders/ShadersInclude/pointCloudVertex.js.map +1 -1
- package/Shaders/background.vertex.js +1 -1
- package/Shaders/background.vertex.js.map +1 -1
- package/Shaders/pbr.vertex.js +1 -1
- package/Shaders/pbr.vertex.js.map +1 -1
- package/XR/features/WebXRNearInteraction.js +4 -2
- package/XR/features/WebXRNearInteraction.js.map +1 -1
- package/XR/webXRSessionManager.js +1 -0
- package/XR/webXRSessionManager.js.map +1 -1
- package/package.json +4 -4
- package/scene.d.ts +1 -10
- package/scene.js +20 -39
- package/scene.js.map +1 -1
- package/types.d.ts +1 -1
- package/types.js.map +1 -1
- package/Misc/baseError.d.ts +0 -7
- package/Misc/baseError.js +0 -18
- package/Misc/baseError.js.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { __decorate, __extends } from "tslib";
|
|
2
|
-
import { serialize, serializeAsVector3, serializeAsMeshReference } from "../Misc/decorators.js";
|
|
2
|
+
import { serialize, serializeAsVector3, serializeAsMeshReference, serializeAsVector2 } from "../Misc/decorators.js";
|
|
3
3
|
import { Observable } from "../Misc/observable.js";
|
|
4
4
|
import { Matrix, Vector3, Vector2 } from "../Maths/math.vector.js";
|
|
5
5
|
import { Node } from "../node.js";
|
|
@@ -821,7 +821,7 @@ var ArcRotateCamera = /** @class */ (function (_super) {
|
|
|
821
821
|
localDirection.multiplyInPlace(this.panningAxis);
|
|
822
822
|
Vector3.TransformNormalToRef(localDirection, this._cameraTransformMatrix, this._transformedDirection);
|
|
823
823
|
// Eliminate y if mapPanning is enabled
|
|
824
|
-
if (this.mapPanning) {
|
|
824
|
+
if (this.mapPanning || !this.panningAxis.y) {
|
|
825
825
|
this._transformedDirection.y = 0;
|
|
826
826
|
}
|
|
827
827
|
if (!this._targetHost) {
|
|
@@ -1177,7 +1177,7 @@ var ArcRotateCamera = /** @class */ (function (_super) {
|
|
|
1177
1177
|
serialize()
|
|
1178
1178
|
], ArcRotateCamera.prototype, "zoomOnFactor", void 0);
|
|
1179
1179
|
__decorate([
|
|
1180
|
-
|
|
1180
|
+
serializeAsVector2()
|
|
1181
1181
|
], ArcRotateCamera.prototype, "targetScreenOffset", void 0);
|
|
1182
1182
|
__decorate([
|
|
1183
1183
|
serialize()
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arcRotateCamera.js","sourceRoot":"","sources":["../../../sourceES6/core/Cameras/arcRotateCamera.ts"],"names":[],"mappings":"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","sourcesContent":["import { serialize, serializeAsVector3, serializeAsMeshReference } from \"../Misc/decorators\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport { Nullable } from \"../types\";\r\nimport { Scene } from \"../scene\";\r\nimport { Matrix, Vector3, Vector2 } from \"../Maths/math.vector\";\r\nimport { Node } from \"../node\";\r\nimport { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { Mesh } from \"../Meshes/mesh\";\r\nimport { AutoRotationBehavior } from \"../Behaviors/Cameras/autoRotationBehavior\";\r\nimport { BouncingBehavior } from \"../Behaviors/Cameras/bouncingBehavior\";\r\nimport { FramingBehavior } from \"../Behaviors/Cameras/framingBehavior\";\r\nimport { Camera } from \"./camera\";\r\nimport { TargetCamera } from \"./targetCamera\";\r\nimport { ArcRotateCameraPointersInput } from \"../Cameras/Inputs/arcRotateCameraPointersInput\";\r\nimport { ArcRotateCameraKeyboardMoveInput } from \"../Cameras/Inputs/arcRotateCameraKeyboardMoveInput\";\r\nimport { ArcRotateCameraMouseWheelInput } from \"../Cameras/Inputs/arcRotateCameraMouseWheelInput\";\r\nimport { ArcRotateCameraInputsManager } from \"../Cameras/arcRotateCameraInputsManager\";\r\nimport { Epsilon } from \"../Maths/math.constants\";\r\nimport { Tools } from \"../Misc/tools\";\r\n\r\ndeclare type Collider = import(\"../Collisions/collider\").Collider;\r\n\r\nNode.AddNodeConstructor(\"ArcRotateCamera\", (name, scene) => {\r\n return () => new ArcRotateCamera(name, 0, 0, 1.0, Vector3.Zero(), scene);\r\n});\r\n\r\n/**\r\n * This represents an orbital type of camera.\r\n *\r\n * This camera always points towards a given target position and can be rotated around that target with the target as the centre of rotation. It can be controlled with cursors and mouse, or with touch events.\r\n * Think of this camera as one orbiting its target position, or more imaginatively as a spy satellite orbiting the earth. Its position relative to the target (earth) can be set by three parameters, alpha (radians) the longitudinal rotation, beta (radians) the latitudinal rotation and radius the distance from the target position.\r\n * @see https://doc.babylonjs.com/babylon101/cameras#arc-rotate-camera\r\n */\r\nexport class ArcRotateCamera extends TargetCamera {\r\n /**\r\n * Defines the rotation angle of the camera along the longitudinal axis.\r\n */\r\n @serialize()\r\n public alpha: number;\r\n\r\n /**\r\n * Defines the rotation angle of the camera along the latitudinal axis.\r\n */\r\n @serialize()\r\n public beta: number;\r\n\r\n /**\r\n * Defines the radius of the camera from it s target point.\r\n */\r\n @serialize()\r\n public radius: number;\r\n\r\n @serializeAsVector3(\"target\")\r\n protected _target: Vector3;\r\n @serializeAsMeshReference(\"targetHost\")\r\n protected _targetHost: Nullable<AbstractMesh>;\r\n\r\n /**\r\n * Defines the target point of the camera.\r\n * The camera looks towards it form the radius distance.\r\n * Please note that you can set the target to a mesh and thus the target will be copied from mesh.position\r\n */\r\n public get target(): Vector3 {\r\n return this._target;\r\n }\r\n public set target(value: Vector3) {\r\n this.setTarget(value);\r\n }\r\n\r\n /**\r\n * Defines the target mesh of the camera.\r\n * The camera looks towards it from the radius distance.\r\n */\r\n public get targetHost(): Nullable<AbstractMesh> {\r\n return this._targetHost;\r\n }\r\n public set targetHost(value: Nullable<AbstractMesh>) {\r\n if (value) {\r\n this.setTarget(value);\r\n }\r\n }\r\n\r\n /**\r\n * Return the current target position of the camera. This value is expressed in local space.\r\n * @returns the target position\r\n */\r\n public getTarget(): Vector3 {\r\n return this.target;\r\n }\r\n\r\n /**\r\n * Define the current local position of the camera in the scene\r\n */\r\n public get position(): Vector3 {\r\n return this._position;\r\n }\r\n\r\n public set position(newPosition: Vector3) {\r\n this.setPosition(newPosition);\r\n }\r\n\r\n protected _upToYMatrix: Matrix;\r\n protected _YToUpMatrix: Matrix;\r\n\r\n /**\r\n * The vector the camera should consider as up. (default is Vector3(0, 1, 0) as returned by Vector3.Up())\r\n * Setting this will copy the given vector to the camera's upVector, and set rotation matrices to and from Y up.\r\n * DO NOT set the up vector using copyFrom or copyFromFloats, as this bypasses setting the above matrices.\r\n */\r\n set upVector(vec: Vector3) {\r\n if (!this._upToYMatrix) {\r\n this._YToUpMatrix = new Matrix();\r\n this._upToYMatrix = new Matrix();\r\n\r\n this._upVector = Vector3.Zero();\r\n }\r\n\r\n vec.normalize();\r\n this._upVector.copyFrom(vec);\r\n this.setMatUp();\r\n }\r\n\r\n get upVector() {\r\n return this._upVector;\r\n }\r\n\r\n /**\r\n * Sets the Y-up to camera up-vector rotation matrix, and the up-vector to Y-up rotation matrix.\r\n */\r\n public setMatUp() {\r\n // from y-up to custom-up (used in _getViewMatrix)\r\n Matrix.RotationAlignToRef(Vector3.UpReadOnly, this._upVector, this._YToUpMatrix);\r\n\r\n // from custom-up to y-up (used in rebuildAnglesAndRadius)\r\n Matrix.RotationAlignToRef(this._upVector, Vector3.UpReadOnly, this._upToYMatrix);\r\n }\r\n\r\n /**\r\n * Current inertia value on the longitudinal axis.\r\n * The bigger this number the longer it will take for the camera to stop.\r\n */\r\n @serialize()\r\n public inertialAlphaOffset = 0;\r\n\r\n /**\r\n * Current inertia value on the latitudinal axis.\r\n * The bigger this number the longer it will take for the camera to stop.\r\n */\r\n @serialize()\r\n public inertialBetaOffset = 0;\r\n\r\n /**\r\n * Current inertia value on the radius axis.\r\n * The bigger this number the longer it will take for the camera to stop.\r\n */\r\n @serialize()\r\n public inertialRadiusOffset = 0;\r\n\r\n /**\r\n * Minimum allowed angle on the longitudinal axis.\r\n * This can help limiting how the Camera is able to move in the scene.\r\n */\r\n @serialize()\r\n public lowerAlphaLimit: Nullable<number> = null;\r\n\r\n /**\r\n * Maximum allowed angle on the longitudinal axis.\r\n * This can help limiting how the Camera is able to move in the scene.\r\n */\r\n @serialize()\r\n public upperAlphaLimit: Nullable<number> = null;\r\n\r\n /**\r\n * Minimum allowed angle on the latitudinal axis.\r\n * This can help limiting how the Camera is able to move in the scene.\r\n */\r\n @serialize()\r\n public lowerBetaLimit = 0.01;\r\n\r\n /**\r\n * Maximum allowed angle on the latitudinal axis.\r\n * This can help limiting how the Camera is able to move in the scene.\r\n */\r\n @serialize()\r\n public upperBetaLimit = Math.PI - 0.01;\r\n\r\n /**\r\n * Minimum allowed distance of the camera to the target (The camera can not get closer).\r\n * This can help limiting how the Camera is able to move in the scene.\r\n */\r\n @serialize()\r\n public lowerRadiusLimit: Nullable<number> = null;\r\n\r\n /**\r\n * Maximum allowed distance of the camera to the target (The camera can not get further).\r\n * This can help limiting how the Camera is able to move in the scene.\r\n */\r\n @serialize()\r\n public upperRadiusLimit: Nullable<number> = null;\r\n\r\n /**\r\n * Defines the current inertia value used during panning of the camera along the X axis.\r\n */\r\n @serialize()\r\n public inertialPanningX: number = 0;\r\n\r\n /**\r\n * Defines the current inertia value used during panning of the camera along the Y axis.\r\n */\r\n @serialize()\r\n public inertialPanningY: number = 0;\r\n\r\n /**\r\n * Defines the distance used to consider the camera in pan mode vs pinch/zoom.\r\n * Basically if your fingers moves away from more than this distance you will be considered\r\n * in pinch mode.\r\n */\r\n @serialize()\r\n public pinchToPanMaxDistance: number = 20;\r\n\r\n /**\r\n * Defines the maximum distance the camera can pan.\r\n * This could help keeping the camera always in your scene.\r\n */\r\n @serialize()\r\n public panningDistanceLimit: Nullable<number> = null;\r\n\r\n /**\r\n * Defines the target of the camera before panning.\r\n */\r\n @serializeAsVector3()\r\n public panningOriginTarget: Vector3 = Vector3.Zero();\r\n\r\n /**\r\n * Defines the value of the inertia used during panning.\r\n * 0 would mean stop inertia and one would mean no decelleration at all.\r\n */\r\n @serialize()\r\n public panningInertia = 0.9;\r\n\r\n //-- begin properties for backward compatibility for inputs\r\n\r\n /**\r\n * Gets or Set the pointer angular sensibility along the X axis or how fast is the camera rotating.\r\n */\r\n public get angularSensibilityX(): number {\r\n var pointers = <ArcRotateCameraPointersInput>this.inputs.attached[\"pointers\"];\r\n if (pointers) {\r\n return pointers.angularSensibilityX;\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n public set angularSensibilityX(value: number) {\r\n var pointers = <ArcRotateCameraPointersInput>this.inputs.attached[\"pointers\"];\r\n if (pointers) {\r\n pointers.angularSensibilityX = value;\r\n }\r\n }\r\n\r\n /**\r\n * Gets or Set the pointer angular sensibility along the Y axis or how fast is the camera rotating.\r\n */\r\n public get angularSensibilityY(): number {\r\n var pointers = <ArcRotateCameraPointersInput>this.inputs.attached[\"pointers\"];\r\n if (pointers) {\r\n return pointers.angularSensibilityY;\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n public set angularSensibilityY(value: number) {\r\n var pointers = <ArcRotateCameraPointersInput>this.inputs.attached[\"pointers\"];\r\n if (pointers) {\r\n pointers.angularSensibilityY = value;\r\n }\r\n }\r\n\r\n /**\r\n * Gets or Set the pointer pinch precision or how fast is the camera zooming.\r\n */\r\n public get pinchPrecision(): number {\r\n var pointers = <ArcRotateCameraPointersInput>this.inputs.attached[\"pointers\"];\r\n if (pointers) {\r\n return pointers.pinchPrecision;\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n public set pinchPrecision(value: number) {\r\n var pointers = <ArcRotateCameraPointersInput>this.inputs.attached[\"pointers\"];\r\n if (pointers) {\r\n pointers.pinchPrecision = value;\r\n }\r\n }\r\n\r\n /**\r\n * Gets or Set the pointer pinch delta percentage or how fast is the camera zooming.\r\n * It will be used instead of pinchDeltaPrecision if different from 0.\r\n * It defines the percentage of current camera.radius to use as delta when pinch zoom is used.\r\n */\r\n public get pinchDeltaPercentage(): number {\r\n var pointers = <ArcRotateCameraPointersInput>this.inputs.attached[\"pointers\"];\r\n if (pointers) {\r\n return pointers.pinchDeltaPercentage;\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n public set pinchDeltaPercentage(value: number) {\r\n var pointers = <ArcRotateCameraPointersInput>this.inputs.attached[\"pointers\"];\r\n if (pointers) {\r\n pointers.pinchDeltaPercentage = value;\r\n }\r\n }\r\n\r\n /**\r\n * Gets or Set the pointer use natural pinch zoom to override the pinch precision\r\n * and pinch delta percentage.\r\n * When useNaturalPinchZoom is true, multi touch zoom will zoom in such\r\n * that any object in the plane at the camera's target point will scale\r\n * perfectly with finger motion.\r\n */\r\n public get useNaturalPinchZoom(): boolean {\r\n var pointers = <ArcRotateCameraPointersInput>this.inputs.attached[\"pointers\"];\r\n if (pointers) {\r\n return pointers.useNaturalPinchZoom;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public set useNaturalPinchZoom(value: boolean) {\r\n var pointers = <ArcRotateCameraPointersInput>this.inputs.attached[\"pointers\"];\r\n if (pointers) {\r\n pointers.useNaturalPinchZoom = value;\r\n }\r\n }\r\n\r\n /**\r\n * Gets or Set the pointer panning sensibility or how fast is the camera moving.\r\n */\r\n public get panningSensibility(): number {\r\n var pointers = <ArcRotateCameraPointersInput>this.inputs.attached[\"pointers\"];\r\n if (pointers) {\r\n return pointers.panningSensibility;\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n public set panningSensibility(value: number) {\r\n var pointers = <ArcRotateCameraPointersInput>this.inputs.attached[\"pointers\"];\r\n if (pointers) {\r\n pointers.panningSensibility = value;\r\n }\r\n }\r\n\r\n /**\r\n * Gets or Set the list of keyboard keys used to control beta angle in a positive direction.\r\n */\r\n public get keysUp(): number[] {\r\n var keyboard = <ArcRotateCameraKeyboardMoveInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n return keyboard.keysUp;\r\n }\r\n\r\n return [];\r\n }\r\n\r\n public set keysUp(value: number[]) {\r\n var keyboard = <ArcRotateCameraKeyboardMoveInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n keyboard.keysUp = value;\r\n }\r\n }\r\n\r\n /**\r\n * Gets or Set the list of keyboard keys used to control beta angle in a negative direction.\r\n */\r\n public get keysDown(): number[] {\r\n var keyboard = <ArcRotateCameraKeyboardMoveInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n return keyboard.keysDown;\r\n }\r\n\r\n return [];\r\n }\r\n\r\n public set keysDown(value: number[]) {\r\n var keyboard = <ArcRotateCameraKeyboardMoveInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n keyboard.keysDown = value;\r\n }\r\n }\r\n\r\n /**\r\n * Gets or Set the list of keyboard keys used to control alpha angle in a negative direction.\r\n */\r\n public get keysLeft(): number[] {\r\n var keyboard = <ArcRotateCameraKeyboardMoveInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n return keyboard.keysLeft;\r\n }\r\n\r\n return [];\r\n }\r\n\r\n public set keysLeft(value: number[]) {\r\n var keyboard = <ArcRotateCameraKeyboardMoveInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n keyboard.keysLeft = value;\r\n }\r\n }\r\n\r\n /**\r\n * Gets or Set the list of keyboard keys used to control alpha angle in a positive direction.\r\n */\r\n public get keysRight(): number[] {\r\n var keyboard = <ArcRotateCameraKeyboardMoveInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n return keyboard.keysRight;\r\n }\r\n\r\n return [];\r\n }\r\n\r\n public set keysRight(value: number[]) {\r\n var keyboard = <ArcRotateCameraKeyboardMoveInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n keyboard.keysRight = value;\r\n }\r\n }\r\n\r\n /**\r\n * Gets or Set the mouse wheel precision or how fast is the camera zooming.\r\n */\r\n public get wheelPrecision(): number {\r\n var mousewheel = <ArcRotateCameraMouseWheelInput>this.inputs.attached[\"mousewheel\"];\r\n if (mousewheel) {\r\n return mousewheel.wheelPrecision;\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n public set wheelPrecision(value: number) {\r\n var mousewheel = <ArcRotateCameraMouseWheelInput>this.inputs.attached[\"mousewheel\"];\r\n if (mousewheel) {\r\n mousewheel.wheelPrecision = value;\r\n }\r\n }\r\n\r\n /**\r\n * Gets or Set the boolean value that controls whether or not the mouse wheel\r\n * zooms to the location of the mouse pointer or not. The default is false.\r\n */\r\n @serialize()\r\n public get zoomToMouseLocation(): boolean {\r\n var mousewheel = <ArcRotateCameraMouseWheelInput>this.inputs.attached[\"mousewheel\"];\r\n if (mousewheel) {\r\n return mousewheel.zoomToMouseLocation;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public set zoomToMouseLocation(value: boolean) {\r\n var mousewheel = <ArcRotateCameraMouseWheelInput>this.inputs.attached[\"mousewheel\"];\r\n if (mousewheel) {\r\n mousewheel.zoomToMouseLocation = value;\r\n }\r\n }\r\n\r\n /**\r\n * Gets or Set the mouse wheel delta percentage or how fast is the camera zooming.\r\n * It will be used instead of pinchDeltaPrecision if different from 0.\r\n * It defines the percentage of current camera.radius to use as delta when pinch zoom is used.\r\n */\r\n public get wheelDeltaPercentage(): number {\r\n var mousewheel = <ArcRotateCameraMouseWheelInput>this.inputs.attached[\"mousewheel\"];\r\n if (mousewheel) {\r\n return mousewheel.wheelDeltaPercentage;\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n public set wheelDeltaPercentage(value: number) {\r\n var mousewheel = <ArcRotateCameraMouseWheelInput>this.inputs.attached[\"mousewheel\"];\r\n if (mousewheel) {\r\n mousewheel.wheelDeltaPercentage = value;\r\n }\r\n }\r\n\r\n //-- end properties for backward compatibility for inputs\r\n\r\n /**\r\n * Defines how much the radius should be scaled while zooming on a particular mesh (through the zoomOn function)\r\n */\r\n @serialize()\r\n public zoomOnFactor = 1;\r\n\r\n /**\r\n * Defines a screen offset for the camera position.\r\n */\r\n @serialize()\r\n public targetScreenOffset = Vector2.Zero();\r\n\r\n /**\r\n * Allows the camera to be completely reversed.\r\n * If false the camera can not arrive upside down.\r\n */\r\n @serialize()\r\n public allowUpsideDown = true;\r\n\r\n /**\r\n * Define if double tap/click is used to restore the previously saved state of the camera.\r\n */\r\n @serialize()\r\n public useInputToRestoreState = true;\r\n\r\n /** @hidden */\r\n public _viewMatrix = new Matrix();\r\n /** @hidden */\r\n public _useCtrlForPanning: boolean;\r\n /** @hidden */\r\n public _panningMouseButton: number;\r\n\r\n /**\r\n * Defines the input associated to the camera.\r\n */\r\n public inputs: ArcRotateCameraInputsManager;\r\n\r\n /** @hidden */\r\n public _reset: () => void;\r\n\r\n /**\r\n * Defines the allowed panning axis.\r\n */\r\n public panningAxis: Vector3 = new Vector3(1, 1, 0);\r\n protected _transformedDirection: Vector3 = new Vector3();\r\n\r\n /**\r\n * Defines if camera will eliminate transform on y axis.\r\n */\r\n public mapPanning: boolean = false;\r\n\r\n // Behaviors\r\n private _bouncingBehavior: Nullable<BouncingBehavior>;\r\n\r\n /**\r\n * Gets the bouncing behavior of the camera if it has been enabled.\r\n * @see https://doc.babylonjs.com/how_to/camera_behaviors#bouncing-behavior\r\n */\r\n public get bouncingBehavior(): Nullable<BouncingBehavior> {\r\n return this._bouncingBehavior;\r\n }\r\n\r\n /**\r\n * Defines if the bouncing behavior of the camera is enabled on the camera.\r\n * @see https://doc.babylonjs.com/how_to/camera_behaviors#bouncing-behavior\r\n */\r\n public get useBouncingBehavior(): boolean {\r\n return this._bouncingBehavior != null;\r\n }\r\n\r\n public set useBouncingBehavior(value: boolean) {\r\n if (value === this.useBouncingBehavior) {\r\n return;\r\n }\r\n\r\n if (value) {\r\n this._bouncingBehavior = new BouncingBehavior();\r\n this.addBehavior(this._bouncingBehavior);\r\n } else if (this._bouncingBehavior) {\r\n this.removeBehavior(this._bouncingBehavior);\r\n this._bouncingBehavior = null;\r\n }\r\n }\r\n\r\n private _framingBehavior: Nullable<FramingBehavior>;\r\n\r\n /**\r\n * Gets the framing behavior of the camera if it has been enabled.\r\n * @see https://doc.babylonjs.com/how_to/camera_behaviors#framing-behavior\r\n */\r\n public get framingBehavior(): Nullable<FramingBehavior> {\r\n return this._framingBehavior;\r\n }\r\n\r\n /**\r\n * Defines if the framing behavior of the camera is enabled on the camera.\r\n * @see https://doc.babylonjs.com/how_to/camera_behaviors#framing-behavior\r\n */\r\n public get useFramingBehavior(): boolean {\r\n return this._framingBehavior != null;\r\n }\r\n\r\n public set useFramingBehavior(value: boolean) {\r\n if (value === this.useFramingBehavior) {\r\n return;\r\n }\r\n\r\n if (value) {\r\n this._framingBehavior = new FramingBehavior();\r\n this.addBehavior(this._framingBehavior);\r\n } else if (this._framingBehavior) {\r\n this.removeBehavior(this._framingBehavior);\r\n this._framingBehavior = null;\r\n }\r\n }\r\n\r\n private _autoRotationBehavior: Nullable<AutoRotationBehavior>;\r\n\r\n /**\r\n * Gets the auto rotation behavior of the camera if it has been enabled.\r\n * @see https://doc.babylonjs.com/how_to/camera_behaviors#autorotation-behavior\r\n */\r\n public get autoRotationBehavior(): Nullable<AutoRotationBehavior> {\r\n return this._autoRotationBehavior;\r\n }\r\n\r\n /**\r\n * Defines if the auto rotation behavior of the camera is enabled on the camera.\r\n * @see https://doc.babylonjs.com/how_to/camera_behaviors#autorotation-behavior\r\n */\r\n public get useAutoRotationBehavior(): boolean {\r\n return this._autoRotationBehavior != null;\r\n }\r\n\r\n public set useAutoRotationBehavior(value: boolean) {\r\n if (value === this.useAutoRotationBehavior) {\r\n return;\r\n }\r\n\r\n if (value) {\r\n this._autoRotationBehavior = new AutoRotationBehavior();\r\n this.addBehavior(this._autoRotationBehavior);\r\n } else if (this._autoRotationBehavior) {\r\n this.removeBehavior(this._autoRotationBehavior);\r\n this._autoRotationBehavior = null;\r\n }\r\n }\r\n\r\n /**\r\n * Observable triggered when the mesh target has been changed on the camera.\r\n */\r\n public onMeshTargetChangedObservable = new Observable<Nullable<AbstractMesh>>();\r\n\r\n /**\r\n * Event raised when the camera is colliding with a mesh.\r\n */\r\n public onCollide: (collidedMesh: AbstractMesh) => void;\r\n\r\n /**\r\n * Defines whether the camera should check collision with the objects oh the scene.\r\n * @see https://doc.babylonjs.com/babylon101/cameras,_mesh_collisions_and_gravity#how-can-i-do-this\r\n */\r\n public checkCollisions = false;\r\n\r\n /**\r\n * Defines the collision radius of the camera.\r\n * This simulates a sphere around the camera.\r\n * @see https://doc.babylonjs.com/babylon101/cameras,_mesh_collisions_and_gravity#arcrotatecamera\r\n */\r\n public collisionRadius = new Vector3(0.5, 0.5, 0.5);\r\n\r\n protected _collider: Collider;\r\n protected _previousPosition = Vector3.Zero();\r\n protected _collisionVelocity = Vector3.Zero();\r\n protected _newPosition = Vector3.Zero();\r\n protected _previousAlpha: number;\r\n protected _previousBeta: number;\r\n protected _previousRadius: number;\r\n //due to async collision inspection\r\n protected _collisionTriggered: boolean;\r\n\r\n protected _targetBoundingCenter: Nullable<Vector3>;\r\n\r\n private _computationVector: Vector3 = Vector3.Zero();\r\n\r\n /**\r\n * Instantiates a new ArcRotateCamera in a given scene\r\n * @param name Defines the name of the camera\r\n * @param alpha Defines the camera rotation along the longitudinal axis\r\n * @param beta Defines the camera rotation along the latitudinal axis\r\n * @param radius Defines the camera distance from its target\r\n * @param target Defines the camera target\r\n * @param scene Defines the scene the camera belongs to\r\n * @param setActiveOnSceneIfNoneActive Defines whether the camera should be marked as active if not other active cameras have been defined\r\n */\r\n constructor(name: string, alpha: number, beta: number, radius: number, target: Vector3, scene?: Scene, setActiveOnSceneIfNoneActive = true) {\r\n super(name, Vector3.Zero(), scene, setActiveOnSceneIfNoneActive);\r\n\r\n this._target = Vector3.Zero();\r\n if (target) {\r\n this.setTarget(target);\r\n }\r\n\r\n this.alpha = alpha;\r\n this.beta = beta;\r\n this.radius = radius;\r\n\r\n this.getViewMatrix();\r\n this.inputs = new ArcRotateCameraInputsManager(this);\r\n this.inputs.addKeyboard().addMouseWheel().addPointers();\r\n }\r\n\r\n // Cache\r\n /** @hidden */\r\n public _initCache(): void {\r\n super._initCache();\r\n this._cache._target = new Vector3(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE);\r\n this._cache.alpha = undefined;\r\n this._cache.beta = undefined;\r\n this._cache.radius = undefined;\r\n this._cache.targetScreenOffset = Vector2.Zero();\r\n }\r\n\r\n /** @hidden */\r\n public _updateCache(ignoreParentClass?: boolean): void {\r\n if (!ignoreParentClass) {\r\n super._updateCache();\r\n }\r\n\r\n this._cache._target.copyFrom(this._getTargetPosition());\r\n this._cache.alpha = this.alpha;\r\n this._cache.beta = this.beta;\r\n this._cache.radius = this.radius;\r\n this._cache.targetScreenOffset.copyFrom(this.targetScreenOffset);\r\n }\r\n\r\n protected _getTargetPosition(): Vector3 {\r\n if (this._targetHost && this._targetHost.getAbsolutePosition) {\r\n var pos: Vector3 = this._targetHost.getAbsolutePosition();\r\n if (this._targetBoundingCenter) {\r\n pos.addToRef(this._targetBoundingCenter, this._target);\r\n } else {\r\n this._target.copyFrom(pos);\r\n }\r\n }\r\n\r\n var lockedTargetPosition = this._getLockedTargetPosition();\r\n\r\n if (lockedTargetPosition) {\r\n return lockedTargetPosition;\r\n }\r\n\r\n return this._target;\r\n }\r\n\r\n private _storedAlpha: number;\r\n private _storedBeta: number;\r\n private _storedRadius: number;\r\n private _storedTarget: Vector3;\r\n private _storedTargetScreenOffset: Vector2;\r\n\r\n /**\r\n * Stores the current state of the camera (alpha, beta, radius and target)\r\n * @returns the camera itself\r\n */\r\n public storeState(): Camera {\r\n this._storedAlpha = this.alpha;\r\n this._storedBeta = this.beta;\r\n this._storedRadius = this.radius;\r\n this._storedTarget = this._getTargetPosition().clone();\r\n this._storedTargetScreenOffset = this.targetScreenOffset.clone();\r\n\r\n return super.storeState();\r\n }\r\n\r\n /**\r\n * @hidden\r\n * Restored camera state. You must call storeState() first\r\n */\r\n public _restoreStateValues(): boolean {\r\n if (!super._restoreStateValues()) {\r\n return false;\r\n }\r\n\r\n this.setTarget(this._storedTarget.clone());\r\n this.alpha = this._storedAlpha;\r\n this.beta = this._storedBeta;\r\n this.radius = this._storedRadius;\r\n this.targetScreenOffset = this._storedTargetScreenOffset.clone();\r\n\r\n this.inertialAlphaOffset = 0;\r\n this.inertialBetaOffset = 0;\r\n this.inertialRadiusOffset = 0;\r\n this.inertialPanningX = 0;\r\n this.inertialPanningY = 0;\r\n\r\n return true;\r\n }\r\n\r\n // Synchronized\r\n /** @hidden */\r\n public _isSynchronizedViewMatrix(): boolean {\r\n if (!super._isSynchronizedViewMatrix()) {\r\n return false;\r\n }\r\n\r\n return this._cache._target.equals(this._getTargetPosition()) && this._cache.alpha === this.alpha && this._cache.beta === this.beta && this._cache.radius === this.radius && this._cache.targetScreenOffset.equals(this.targetScreenOffset);\r\n }\r\n\r\n /**\r\n * Attach the input controls to a specific dom element to get the input from.\r\n * @param noPreventDefault Defines whether event caught by the controls should call preventdefault() (https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault)\r\n */\r\n public attachControl(noPreventDefault?: boolean): void;\r\n /**\r\n * Attach the input controls to a specific dom element to get the input from.\r\n * @param ignored defines an ignored parameter kept for backward compatibility. If you want to define the source input element, you can set engine.inputElement before calling camera.attachControl\r\n * @param noPreventDefault Defines whether event caught by the controls should call preventdefault() (https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault)\r\n */\r\n public attachControl(ignored: any, noPreventDefault?: boolean): void;\r\n /**\r\n * Attached controls to the current camera.\r\n * @param noPreventDefault Defines whether event caught by the controls should call preventdefault() (https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault)\r\n * @param useCtrlForPanning Defines whether ctrl is used for panning within the controls\r\n */\r\n public attachControl(noPreventDefault: boolean, useCtrlForPanning: boolean): void;\r\n /**\r\n * Attached controls to the current camera.\r\n * @param ignored defines an ignored parameter kept for backward compatibility. If you want to define the source input element, you can set engine.inputElement before calling camera.attachControl\r\n * @param noPreventDefault Defines whether event caught by the controls should call preventdefault() (https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault)\r\n * @param useCtrlForPanning Defines whether ctrl is used for panning within the controls\r\n */\r\n public attachControl(ignored: any, noPreventDefault: boolean, useCtrlForPanning: boolean): void;\r\n /**\r\n * Attached controls to the current camera.\r\n * @param noPreventDefault Defines whether event caught by the controls should call preventdefault() (https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault)\r\n * @param useCtrlForPanning Defines whether ctrl is used for panning within the controls\r\n * @param panningMouseButton Defines whether panning is allowed through mouse click button\r\n */\r\n public attachControl(noPreventDefault: boolean, useCtrlForPanning: boolean, panningMouseButton: number): void;\r\n /**\r\n * Attached controls to the current camera.\r\n * @param ignored defines an ignored parameter kept for backward compatibility. If you want to define the source input element, you can set engine.inputElement before calling camera.attachControl\r\n * @param noPreventDefault Defines whether event caught by the controls should call preventdefault() (https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault)\r\n * @param useCtrlForPanning Defines whether ctrl is used for panning within the controls\r\n * @param panningMouseButton Defines whether panning is allowed through mouse click button\r\n */\r\n public attachControl(ignored: any, noPreventDefault?: boolean, useCtrlForPanning: boolean | number = true, panningMouseButton: number = 2): void {\r\n noPreventDefault = Tools.BackCompatCameraNoPreventDefault(arguments);\r\n this._useCtrlForPanning = useCtrlForPanning as boolean;\r\n this._panningMouseButton = panningMouseButton;\r\n // backwards compatibility\r\n if (typeof arguments[0] === \"boolean\") {\r\n if (arguments.length > 1) {\r\n this._useCtrlForPanning = arguments[1];\r\n }\r\n if (arguments.length > 2) {\r\n this._panningMouseButton = arguments[2];\r\n }\r\n }\r\n\r\n this.inputs.attachElement(noPreventDefault);\r\n\r\n this._reset = () => {\r\n this.inertialAlphaOffset = 0;\r\n this.inertialBetaOffset = 0;\r\n this.inertialRadiusOffset = 0;\r\n this.inertialPanningX = 0;\r\n this.inertialPanningY = 0;\r\n };\r\n }\r\n\r\n /**\r\n * Detach the current controls from the specified dom element.\r\n */\r\n public detachControl(): void;\r\n /**\r\n * Detach the current controls from the specified dom element.\r\n * @param ignored defines an ignored parameter kept for backward compatibility. If you want to define the source input element, you can set engine.inputElement before calling camera.attachControl\r\n */\r\n public detachControl(ignored: any): void;\r\n /**\r\n * Detach the current controls from the specified dom element.\r\n * @param ignored defines an ignored parameter kept for backward compatibility. If you want to define the source input element, you can set engine.inputElement before calling camera.attachControl\r\n */\r\n public detachControl(ignored?: any): void {\r\n this.inputs.detachElement();\r\n\r\n if (this._reset) {\r\n this._reset();\r\n }\r\n }\r\n\r\n /** @hidden */\r\n public _checkInputs(): void {\r\n //if (async) collision inspection was triggered, don't update the camera's position - until the collision callback was called.\r\n if (this._collisionTriggered) {\r\n return;\r\n }\r\n\r\n this.inputs.checkInputs();\r\n // Inertia\r\n if (this.inertialAlphaOffset !== 0 || this.inertialBetaOffset !== 0 || this.inertialRadiusOffset !== 0) {\r\n let inertialAlphaOffset = this.inertialAlphaOffset;\r\n if (this.beta <= 0) {\r\n inertialAlphaOffset *= -1;\r\n }\r\n if (this.getScene().useRightHandedSystem) {\r\n inertialAlphaOffset *= -1;\r\n }\r\n if (this.parent && this.parent._getWorldMatrixDeterminant() < 0) {\r\n inertialAlphaOffset *= -1;\r\n }\r\n this.alpha += inertialAlphaOffset;\r\n\r\n this.beta += this.inertialBetaOffset;\r\n\r\n this.radius -= this.inertialRadiusOffset;\r\n this.inertialAlphaOffset *= this.inertia;\r\n this.inertialBetaOffset *= this.inertia;\r\n this.inertialRadiusOffset *= this.inertia;\r\n if (Math.abs(this.inertialAlphaOffset) < Epsilon) {\r\n this.inertialAlphaOffset = 0;\r\n }\r\n if (Math.abs(this.inertialBetaOffset) < Epsilon) {\r\n this.inertialBetaOffset = 0;\r\n }\r\n if (Math.abs(this.inertialRadiusOffset) < this.speed * Epsilon) {\r\n this.inertialRadiusOffset = 0;\r\n }\r\n }\r\n\r\n // Panning inertia\r\n if (this.inertialPanningX !== 0 || this.inertialPanningY !== 0) {\r\n let localDirection = new Vector3(this.inertialPanningX, this.inertialPanningY, this.inertialPanningY);\r\n\r\n this._viewMatrix.invertToRef(this._cameraTransformMatrix);\r\n localDirection.multiplyInPlace(this.panningAxis);\r\n Vector3.TransformNormalToRef(localDirection, this._cameraTransformMatrix, this._transformedDirection);\r\n // Eliminate y if mapPanning is enabled\r\n if (this.mapPanning) {\r\n this._transformedDirection.y = 0;\r\n }\r\n\r\n if (!this._targetHost) {\r\n if (this.panningDistanceLimit) {\r\n this._transformedDirection.addInPlace(this._target);\r\n var distanceSquared = Vector3.DistanceSquared(this._transformedDirection, this.panningOriginTarget);\r\n if (distanceSquared <= this.panningDistanceLimit * this.panningDistanceLimit) {\r\n this._target.copyFrom(this._transformedDirection);\r\n }\r\n } else {\r\n this._target.addInPlace(this._transformedDirection);\r\n }\r\n }\r\n\r\n this.inertialPanningX *= this.panningInertia;\r\n this.inertialPanningY *= this.panningInertia;\r\n\r\n if (Math.abs(this.inertialPanningX) < this.speed * Epsilon) {\r\n this.inertialPanningX = 0;\r\n }\r\n if (Math.abs(this.inertialPanningY) < this.speed * Epsilon) {\r\n this.inertialPanningY = 0;\r\n }\r\n }\r\n\r\n // Limits\r\n this._checkLimits();\r\n\r\n super._checkInputs();\r\n }\r\n\r\n protected _checkLimits() {\r\n if (this.lowerBetaLimit === null || this.lowerBetaLimit === undefined) {\r\n if (this.allowUpsideDown && this.beta > Math.PI) {\r\n this.beta = this.beta - 2 * Math.PI;\r\n }\r\n } else {\r\n if (this.beta < this.lowerBetaLimit) {\r\n this.beta = this.lowerBetaLimit;\r\n }\r\n }\r\n\r\n if (this.upperBetaLimit === null || this.upperBetaLimit === undefined) {\r\n if (this.allowUpsideDown && this.beta < -Math.PI) {\r\n this.beta = this.beta + 2 * Math.PI;\r\n }\r\n } else {\r\n if (this.beta > this.upperBetaLimit) {\r\n this.beta = this.upperBetaLimit;\r\n }\r\n }\r\n\r\n if (this.lowerAlphaLimit !== null && this.alpha < this.lowerAlphaLimit) {\r\n this.alpha = this.lowerAlphaLimit;\r\n }\r\n if (this.upperAlphaLimit !== null && this.alpha > this.upperAlphaLimit) {\r\n this.alpha = this.upperAlphaLimit;\r\n }\r\n\r\n if (this.lowerRadiusLimit !== null && this.radius < this.lowerRadiusLimit) {\r\n this.radius = this.lowerRadiusLimit;\r\n this.inertialRadiusOffset = 0;\r\n }\r\n if (this.upperRadiusLimit !== null && this.radius > this.upperRadiusLimit) {\r\n this.radius = this.upperRadiusLimit;\r\n this.inertialRadiusOffset = 0;\r\n }\r\n }\r\n\r\n /**\r\n * Rebuilds angles (alpha, beta) and radius from the give position and target\r\n */\r\n public rebuildAnglesAndRadius(): void {\r\n this._position.subtractToRef(this._getTargetPosition(), this._computationVector);\r\n\r\n // need to rotate to Y up equivalent if up vector not Axis.Y\r\n if (this._upVector.x !== 0 || this._upVector.y !== 1.0 || this._upVector.z !== 0) {\r\n Vector3.TransformCoordinatesToRef(this._computationVector, this._upToYMatrix, this._computationVector);\r\n }\r\n\r\n this.radius = this._computationVector.length();\r\n\r\n if (this.radius === 0) {\r\n this.radius = 0.0001; // Just to avoid division by zero\r\n }\r\n\r\n // Alpha\r\n const previousAlpha = this.alpha;\r\n if (this._computationVector.x === 0 && this._computationVector.z === 0) {\r\n this.alpha = Math.PI / 2; // avoid division by zero when looking along up axis, and set to acos(0)\r\n } else {\r\n this.alpha = Math.acos(this._computationVector.x / Math.sqrt(Math.pow(this._computationVector.x, 2) + Math.pow(this._computationVector.z, 2)));\r\n }\r\n\r\n if (this._computationVector.z < 0) {\r\n this.alpha = 2 * Math.PI - this.alpha;\r\n }\r\n\r\n // Calculate the number of revolutions between the new and old alpha values.\r\n const alphaCorrectionTurns = Math.round((previousAlpha - this.alpha) / (2.0 * Math.PI));\r\n // Adjust alpha so that its numerical representation is the closest one to the old value.\r\n this.alpha += alphaCorrectionTurns * 2.0 * Math.PI;\r\n\r\n // Beta\r\n this.beta = Math.acos(this._computationVector.y / this.radius);\r\n\r\n this._checkLimits();\r\n }\r\n\r\n /**\r\n * Use a position to define the current camera related information like alpha, beta and radius\r\n * @param position Defines the position to set the camera at\r\n */\r\n public setPosition(position: Vector3): void {\r\n if (this._position.equals(position)) {\r\n return;\r\n }\r\n this._position.copyFrom(position);\r\n\r\n this.rebuildAnglesAndRadius();\r\n }\r\n\r\n /**\r\n * Defines the target the camera should look at.\r\n * This will automatically adapt alpha beta and radius to fit within the new target.\r\n * @param target Defines the new target as a Vector or a mesh\r\n * @param toBoundingCenter In case of a mesh target, defines whether to target the mesh position or its bounding information center\r\n * @param allowSamePosition If false, prevents reapplying the new computed position if it is identical to the current one (optim)\r\n */\r\n public setTarget(target: AbstractMesh | Vector3, toBoundingCenter = false, allowSamePosition = false): void {\r\n if ((<any>target).getBoundingInfo) {\r\n if (toBoundingCenter) {\r\n this._targetBoundingCenter = (<any>target).getBoundingInfo().boundingBox.centerWorld.clone();\r\n } else {\r\n this._targetBoundingCenter = null;\r\n }\r\n (<AbstractMesh>target).computeWorldMatrix();\r\n this._targetHost = <AbstractMesh>target;\r\n this._target = this._getTargetPosition();\r\n\r\n this.onMeshTargetChangedObservable.notifyObservers(this._targetHost);\r\n } else {\r\n var newTarget = <Vector3>target;\r\n var currentTarget = this._getTargetPosition();\r\n if (currentTarget && !allowSamePosition && currentTarget.equals(newTarget)) {\r\n return;\r\n }\r\n this._targetHost = null;\r\n this._target = newTarget;\r\n this._targetBoundingCenter = null;\r\n this.onMeshTargetChangedObservable.notifyObservers(null);\r\n }\r\n\r\n this.rebuildAnglesAndRadius();\r\n }\r\n\r\n /** @hidden */\r\n public _getViewMatrix(): Matrix {\r\n // Compute\r\n var cosa = Math.cos(this.alpha);\r\n var sina = Math.sin(this.alpha);\r\n var cosb = Math.cos(this.beta);\r\n var sinb = Math.sin(this.beta);\r\n\r\n if (sinb === 0) {\r\n sinb = 0.0001;\r\n }\r\n\r\n if (this.radius === 0) {\r\n this.radius = 0.0001; // Just to avoid division by zero\r\n }\r\n\r\n var target = this._getTargetPosition();\r\n this._computationVector.copyFromFloats(this.radius * cosa * sinb, this.radius * cosb, this.radius * sina * sinb);\r\n\r\n // Rotate according to up vector\r\n if (this._upVector.x !== 0 || this._upVector.y !== 1.0 || this._upVector.z !== 0) {\r\n Vector3.TransformCoordinatesToRef(this._computationVector, this._YToUpMatrix, this._computationVector);\r\n }\r\n\r\n target.addToRef(this._computationVector, this._newPosition);\r\n if (this.getScene().collisionsEnabled && this.checkCollisions) {\r\n const coordinator = this.getScene().collisionCoordinator;\r\n if (!this._collider) {\r\n this._collider = coordinator.createCollider();\r\n }\r\n this._collider._radius = this.collisionRadius;\r\n this._newPosition.subtractToRef(this._position, this._collisionVelocity);\r\n this._collisionTriggered = true;\r\n coordinator.getNewPosition(this._position, this._collisionVelocity, this._collider, 3, null, this._onCollisionPositionChange, this.uniqueId);\r\n } else {\r\n this._position.copyFrom(this._newPosition);\r\n\r\n var up = this.upVector;\r\n if (this.allowUpsideDown && sinb < 0) {\r\n up = up.negate();\r\n }\r\n\r\n this._computeViewMatrix(this._position, target, up);\r\n\r\n this._viewMatrix.addAtIndex(12, this.targetScreenOffset.x);\r\n this._viewMatrix.addAtIndex(13, this.targetScreenOffset.y);\r\n }\r\n this._currentTarget = target;\r\n return this._viewMatrix;\r\n }\r\n\r\n protected _onCollisionPositionChange = (collisionId: number, newPosition: Vector3, collidedMesh: Nullable<AbstractMesh> = null) => {\r\n if (!collidedMesh) {\r\n this._previousPosition.copyFrom(this._position);\r\n } else {\r\n this.setPosition(newPosition);\r\n\r\n if (this.onCollide) {\r\n this.onCollide(collidedMesh);\r\n }\r\n }\r\n\r\n // Recompute because of constraints\r\n var cosa = Math.cos(this.alpha);\r\n var sina = Math.sin(this.alpha);\r\n var cosb = Math.cos(this.beta);\r\n var sinb = Math.sin(this.beta);\r\n\r\n if (sinb === 0) {\r\n sinb = 0.0001;\r\n }\r\n\r\n var target = this._getTargetPosition();\r\n this._computationVector.copyFromFloats(this.radius * cosa * sinb, this.radius * cosb, this.radius * sina * sinb);\r\n target.addToRef(this._computationVector, this._newPosition);\r\n this._position.copyFrom(this._newPosition);\r\n\r\n var up = this.upVector;\r\n if (this.allowUpsideDown && this.beta < 0) {\r\n up = up.clone();\r\n up = up.negate();\r\n }\r\n\r\n this._computeViewMatrix(this._position, target, up);\r\n this._viewMatrix.addAtIndex(12, this.targetScreenOffset.x);\r\n this._viewMatrix.addAtIndex(13, this.targetScreenOffset.y);\r\n\r\n this._collisionTriggered = false;\r\n };\r\n\r\n /**\r\n * Zooms on a mesh to be at the min distance where we could see it fully in the current viewport.\r\n * @param meshes Defines the mesh to zoom on\r\n * @param doNotUpdateMaxZ Defines whether or not maxZ should be updated whilst zooming on the mesh (this can happen if the mesh is big and the maxradius pretty small for instance)\r\n */\r\n public zoomOn(meshes?: AbstractMesh[], doNotUpdateMaxZ = false): void {\r\n meshes = meshes || this.getScene().meshes;\r\n\r\n var minMaxVector = Mesh.MinMax(meshes);\r\n var distance = Vector3.Distance(minMaxVector.min, minMaxVector.max);\r\n\r\n this.radius = distance * this.zoomOnFactor;\r\n\r\n this.focusOn({ min: minMaxVector.min, max: minMaxVector.max, distance: distance }, doNotUpdateMaxZ);\r\n }\r\n\r\n /**\r\n * Focus on a mesh or a bounding box. This adapts the target and maxRadius if necessary but does not update the current radius.\r\n * The target will be changed but the radius\r\n * @param meshesOrMinMaxVectorAndDistance Defines the mesh or bounding info to focus on\r\n * @param doNotUpdateMaxZ Defines whether or not maxZ should be updated whilst zooming on the mesh (this can happen if the mesh is big and the maxradius pretty small for instance)\r\n */\r\n public focusOn(meshesOrMinMaxVectorAndDistance: AbstractMesh[] | { min: Vector3; max: Vector3; distance: number }, doNotUpdateMaxZ = false): void {\r\n var meshesOrMinMaxVector: { min: Vector3; max: Vector3 };\r\n var distance: number;\r\n\r\n if ((<any>meshesOrMinMaxVectorAndDistance).min === undefined) {\r\n // meshes\r\n var meshes = <AbstractMesh[]>meshesOrMinMaxVectorAndDistance || this.getScene().meshes;\r\n meshesOrMinMaxVector = Mesh.MinMax(meshes);\r\n distance = Vector3.Distance(meshesOrMinMaxVector.min, meshesOrMinMaxVector.max);\r\n } else {\r\n //minMaxVector and distance\r\n var minMaxVectorAndDistance = <any>meshesOrMinMaxVectorAndDistance;\r\n meshesOrMinMaxVector = minMaxVectorAndDistance;\r\n distance = minMaxVectorAndDistance.distance;\r\n }\r\n\r\n this._target = Mesh.Center(meshesOrMinMaxVector);\r\n\r\n if (!doNotUpdateMaxZ) {\r\n this.maxZ = distance * 2;\r\n }\r\n }\r\n\r\n /**\r\n * @override\r\n * Override Camera.createRigCamera\r\n */\r\n public createRigCamera(name: string, cameraIndex: number): Camera {\r\n var alphaShift: number = 0;\r\n switch (this.cameraRigMode) {\r\n case Camera.RIG_MODE_STEREOSCOPIC_ANAGLYPH:\r\n case Camera.RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_PARALLEL:\r\n case Camera.RIG_MODE_STEREOSCOPIC_OVERUNDER:\r\n case Camera.RIG_MODE_STEREOSCOPIC_INTERLACED:\r\n case Camera.RIG_MODE_VR:\r\n alphaShift = this._cameraRigParams.stereoHalfAngle * (cameraIndex === 0 ? 1 : -1);\r\n break;\r\n case Camera.RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_CROSSEYED:\r\n alphaShift = this._cameraRigParams.stereoHalfAngle * (cameraIndex === 0 ? -1 : 1);\r\n break;\r\n }\r\n var rigCam = new ArcRotateCamera(name, this.alpha + alphaShift, this.beta, this.radius, this._target, this.getScene());\r\n rigCam._cameraRigParams = {};\r\n rigCam.isRigCamera = true;\r\n rigCam.rigParent = this;\r\n rigCam.upVector = this.upVector;\r\n return rigCam;\r\n }\r\n\r\n /**\r\n * @hidden\r\n * @override\r\n * Override Camera._updateRigCameras\r\n */\r\n public _updateRigCameras() {\r\n var camLeft = <ArcRotateCamera>this._rigCameras[0];\r\n var camRight = <ArcRotateCamera>this._rigCameras[1];\r\n\r\n camLeft.beta = camRight.beta = this.beta;\r\n\r\n switch (this.cameraRigMode) {\r\n case Camera.RIG_MODE_STEREOSCOPIC_ANAGLYPH:\r\n case Camera.RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_PARALLEL:\r\n case Camera.RIG_MODE_STEREOSCOPIC_OVERUNDER:\r\n case Camera.RIG_MODE_STEREOSCOPIC_INTERLACED:\r\n case Camera.RIG_MODE_VR:\r\n camLeft.alpha = this.alpha - this._cameraRigParams.stereoHalfAngle;\r\n camRight.alpha = this.alpha + this._cameraRigParams.stereoHalfAngle;\r\n break;\r\n case Camera.RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_CROSSEYED:\r\n camLeft.alpha = this.alpha + this._cameraRigParams.stereoHalfAngle;\r\n camRight.alpha = this.alpha - this._cameraRigParams.stereoHalfAngle;\r\n break;\r\n }\r\n super._updateRigCameras();\r\n }\r\n\r\n /**\r\n * Destroy the camera and release the current resources hold by it.\r\n */\r\n public dispose(): void {\r\n this.inputs.clear();\r\n super.dispose();\r\n }\r\n\r\n /**\r\n * Gets the current object class name.\r\n * @return the class name\r\n */\r\n public getClassName(): string {\r\n return \"ArcRotateCamera\";\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"arcRotateCamera.js","sourceRoot":"","sources":["../../../sourceES6/core/Cameras/arcRotateCamera.ts"],"names":[],"mappings":"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","sourcesContent":["import { serialize, serializeAsVector3, serializeAsMeshReference, serializeAsVector2 } from \"../Misc/decorators\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport { Nullable } from \"../types\";\r\nimport { Scene } from \"../scene\";\r\nimport { Matrix, Vector3, Vector2 } from \"../Maths/math.vector\";\r\nimport { Node } from \"../node\";\r\nimport { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { Mesh } from \"../Meshes/mesh\";\r\nimport { AutoRotationBehavior } from \"../Behaviors/Cameras/autoRotationBehavior\";\r\nimport { BouncingBehavior } from \"../Behaviors/Cameras/bouncingBehavior\";\r\nimport { FramingBehavior } from \"../Behaviors/Cameras/framingBehavior\";\r\nimport { Camera } from \"./camera\";\r\nimport { TargetCamera } from \"./targetCamera\";\r\nimport { ArcRotateCameraPointersInput } from \"../Cameras/Inputs/arcRotateCameraPointersInput\";\r\nimport { ArcRotateCameraKeyboardMoveInput } from \"../Cameras/Inputs/arcRotateCameraKeyboardMoveInput\";\r\nimport { ArcRotateCameraMouseWheelInput } from \"../Cameras/Inputs/arcRotateCameraMouseWheelInput\";\r\nimport { ArcRotateCameraInputsManager } from \"../Cameras/arcRotateCameraInputsManager\";\r\nimport { Epsilon } from \"../Maths/math.constants\";\r\nimport { Tools } from \"../Misc/tools\";\r\n\r\ndeclare type Collider = import(\"../Collisions/collider\").Collider;\r\n\r\nNode.AddNodeConstructor(\"ArcRotateCamera\", (name, scene) => {\r\n return () => new ArcRotateCamera(name, 0, 0, 1.0, Vector3.Zero(), scene);\r\n});\r\n\r\n/**\r\n * This represents an orbital type of camera.\r\n *\r\n * This camera always points towards a given target position and can be rotated around that target with the target as the centre of rotation. It can be controlled with cursors and mouse, or with touch events.\r\n * Think of this camera as one orbiting its target position, or more imaginatively as a spy satellite orbiting the earth. Its position relative to the target (earth) can be set by three parameters, alpha (radians) the longitudinal rotation, beta (radians) the latitudinal rotation and radius the distance from the target position.\r\n * @see https://doc.babylonjs.com/babylon101/cameras#arc-rotate-camera\r\n */\r\nexport class ArcRotateCamera extends TargetCamera {\r\n /**\r\n * Defines the rotation angle of the camera along the longitudinal axis.\r\n */\r\n @serialize()\r\n public alpha: number;\r\n\r\n /**\r\n * Defines the rotation angle of the camera along the latitudinal axis.\r\n */\r\n @serialize()\r\n public beta: number;\r\n\r\n /**\r\n * Defines the radius of the camera from it s target point.\r\n */\r\n @serialize()\r\n public radius: number;\r\n\r\n @serializeAsVector3(\"target\")\r\n protected _target: Vector3;\r\n @serializeAsMeshReference(\"targetHost\")\r\n protected _targetHost: Nullable<AbstractMesh>;\r\n\r\n /**\r\n * Defines the target point of the camera.\r\n * The camera looks towards it form the radius distance.\r\n * Please note that you can set the target to a mesh and thus the target will be copied from mesh.position\r\n */\r\n public get target(): Vector3 {\r\n return this._target;\r\n }\r\n public set target(value: Vector3) {\r\n this.setTarget(value);\r\n }\r\n\r\n /**\r\n * Defines the target mesh of the camera.\r\n * The camera looks towards it from the radius distance.\r\n */\r\n public get targetHost(): Nullable<AbstractMesh> {\r\n return this._targetHost;\r\n }\r\n public set targetHost(value: Nullable<AbstractMesh>) {\r\n if (value) {\r\n this.setTarget(value);\r\n }\r\n }\r\n\r\n /**\r\n * Return the current target position of the camera. This value is expressed in local space.\r\n * @returns the target position\r\n */\r\n public getTarget(): Vector3 {\r\n return this.target;\r\n }\r\n\r\n /**\r\n * Define the current local position of the camera in the scene\r\n */\r\n public get position(): Vector3 {\r\n return this._position;\r\n }\r\n\r\n public set position(newPosition: Vector3) {\r\n this.setPosition(newPosition);\r\n }\r\n\r\n protected _upToYMatrix: Matrix;\r\n protected _YToUpMatrix: Matrix;\r\n\r\n /**\r\n * The vector the camera should consider as up. (default is Vector3(0, 1, 0) as returned by Vector3.Up())\r\n * Setting this will copy the given vector to the camera's upVector, and set rotation matrices to and from Y up.\r\n * DO NOT set the up vector using copyFrom or copyFromFloats, as this bypasses setting the above matrices.\r\n */\r\n set upVector(vec: Vector3) {\r\n if (!this._upToYMatrix) {\r\n this._YToUpMatrix = new Matrix();\r\n this._upToYMatrix = new Matrix();\r\n\r\n this._upVector = Vector3.Zero();\r\n }\r\n\r\n vec.normalize();\r\n this._upVector.copyFrom(vec);\r\n this.setMatUp();\r\n }\r\n\r\n get upVector() {\r\n return this._upVector;\r\n }\r\n\r\n /**\r\n * Sets the Y-up to camera up-vector rotation matrix, and the up-vector to Y-up rotation matrix.\r\n */\r\n public setMatUp() {\r\n // from y-up to custom-up (used in _getViewMatrix)\r\n Matrix.RotationAlignToRef(Vector3.UpReadOnly, this._upVector, this._YToUpMatrix);\r\n\r\n // from custom-up to y-up (used in rebuildAnglesAndRadius)\r\n Matrix.RotationAlignToRef(this._upVector, Vector3.UpReadOnly, this._upToYMatrix);\r\n }\r\n\r\n /**\r\n * Current inertia value on the longitudinal axis.\r\n * The bigger this number the longer it will take for the camera to stop.\r\n */\r\n @serialize()\r\n public inertialAlphaOffset = 0;\r\n\r\n /**\r\n * Current inertia value on the latitudinal axis.\r\n * The bigger this number the longer it will take for the camera to stop.\r\n */\r\n @serialize()\r\n public inertialBetaOffset = 0;\r\n\r\n /**\r\n * Current inertia value on the radius axis.\r\n * The bigger this number the longer it will take for the camera to stop.\r\n */\r\n @serialize()\r\n public inertialRadiusOffset = 0;\r\n\r\n /**\r\n * Minimum allowed angle on the longitudinal axis.\r\n * This can help limiting how the Camera is able to move in the scene.\r\n */\r\n @serialize()\r\n public lowerAlphaLimit: Nullable<number> = null;\r\n\r\n /**\r\n * Maximum allowed angle on the longitudinal axis.\r\n * This can help limiting how the Camera is able to move in the scene.\r\n */\r\n @serialize()\r\n public upperAlphaLimit: Nullable<number> = null;\r\n\r\n /**\r\n * Minimum allowed angle on the latitudinal axis.\r\n * This can help limiting how the Camera is able to move in the scene.\r\n */\r\n @serialize()\r\n public lowerBetaLimit = 0.01;\r\n\r\n /**\r\n * Maximum allowed angle on the latitudinal axis.\r\n * This can help limiting how the Camera is able to move in the scene.\r\n */\r\n @serialize()\r\n public upperBetaLimit = Math.PI - 0.01;\r\n\r\n /**\r\n * Minimum allowed distance of the camera to the target (The camera can not get closer).\r\n * This can help limiting how the Camera is able to move in the scene.\r\n */\r\n @serialize()\r\n public lowerRadiusLimit: Nullable<number> = null;\r\n\r\n /**\r\n * Maximum allowed distance of the camera to the target (The camera can not get further).\r\n * This can help limiting how the Camera is able to move in the scene.\r\n */\r\n @serialize()\r\n public upperRadiusLimit: Nullable<number> = null;\r\n\r\n /**\r\n * Defines the current inertia value used during panning of the camera along the X axis.\r\n */\r\n @serialize()\r\n public inertialPanningX: number = 0;\r\n\r\n /**\r\n * Defines the current inertia value used during panning of the camera along the Y axis.\r\n */\r\n @serialize()\r\n public inertialPanningY: number = 0;\r\n\r\n /**\r\n * Defines the distance used to consider the camera in pan mode vs pinch/zoom.\r\n * Basically if your fingers moves away from more than this distance you will be considered\r\n * in pinch mode.\r\n */\r\n @serialize()\r\n public pinchToPanMaxDistance: number = 20;\r\n\r\n /**\r\n * Defines the maximum distance the camera can pan.\r\n * This could help keeping the camera always in your scene.\r\n */\r\n @serialize()\r\n public panningDistanceLimit: Nullable<number> = null;\r\n\r\n /**\r\n * Defines the target of the camera before panning.\r\n */\r\n @serializeAsVector3()\r\n public panningOriginTarget: Vector3 = Vector3.Zero();\r\n\r\n /**\r\n * Defines the value of the inertia used during panning.\r\n * 0 would mean stop inertia and one would mean no decelleration at all.\r\n */\r\n @serialize()\r\n public panningInertia = 0.9;\r\n\r\n //-- begin properties for backward compatibility for inputs\r\n\r\n /**\r\n * Gets or Set the pointer angular sensibility along the X axis or how fast is the camera rotating.\r\n */\r\n public get angularSensibilityX(): number {\r\n var pointers = <ArcRotateCameraPointersInput>this.inputs.attached[\"pointers\"];\r\n if (pointers) {\r\n return pointers.angularSensibilityX;\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n public set angularSensibilityX(value: number) {\r\n var pointers = <ArcRotateCameraPointersInput>this.inputs.attached[\"pointers\"];\r\n if (pointers) {\r\n pointers.angularSensibilityX = value;\r\n }\r\n }\r\n\r\n /**\r\n * Gets or Set the pointer angular sensibility along the Y axis or how fast is the camera rotating.\r\n */\r\n public get angularSensibilityY(): number {\r\n var pointers = <ArcRotateCameraPointersInput>this.inputs.attached[\"pointers\"];\r\n if (pointers) {\r\n return pointers.angularSensibilityY;\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n public set angularSensibilityY(value: number) {\r\n var pointers = <ArcRotateCameraPointersInput>this.inputs.attached[\"pointers\"];\r\n if (pointers) {\r\n pointers.angularSensibilityY = value;\r\n }\r\n }\r\n\r\n /**\r\n * Gets or Set the pointer pinch precision or how fast is the camera zooming.\r\n */\r\n public get pinchPrecision(): number {\r\n var pointers = <ArcRotateCameraPointersInput>this.inputs.attached[\"pointers\"];\r\n if (pointers) {\r\n return pointers.pinchPrecision;\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n public set pinchPrecision(value: number) {\r\n var pointers = <ArcRotateCameraPointersInput>this.inputs.attached[\"pointers\"];\r\n if (pointers) {\r\n pointers.pinchPrecision = value;\r\n }\r\n }\r\n\r\n /**\r\n * Gets or Set the pointer pinch delta percentage or how fast is the camera zooming.\r\n * It will be used instead of pinchDeltaPrecision if different from 0.\r\n * It defines the percentage of current camera.radius to use as delta when pinch zoom is used.\r\n */\r\n public get pinchDeltaPercentage(): number {\r\n var pointers = <ArcRotateCameraPointersInput>this.inputs.attached[\"pointers\"];\r\n if (pointers) {\r\n return pointers.pinchDeltaPercentage;\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n public set pinchDeltaPercentage(value: number) {\r\n var pointers = <ArcRotateCameraPointersInput>this.inputs.attached[\"pointers\"];\r\n if (pointers) {\r\n pointers.pinchDeltaPercentage = value;\r\n }\r\n }\r\n\r\n /**\r\n * Gets or Set the pointer use natural pinch zoom to override the pinch precision\r\n * and pinch delta percentage.\r\n * When useNaturalPinchZoom is true, multi touch zoom will zoom in such\r\n * that any object in the plane at the camera's target point will scale\r\n * perfectly with finger motion.\r\n */\r\n public get useNaturalPinchZoom(): boolean {\r\n var pointers = <ArcRotateCameraPointersInput>this.inputs.attached[\"pointers\"];\r\n if (pointers) {\r\n return pointers.useNaturalPinchZoom;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public set useNaturalPinchZoom(value: boolean) {\r\n var pointers = <ArcRotateCameraPointersInput>this.inputs.attached[\"pointers\"];\r\n if (pointers) {\r\n pointers.useNaturalPinchZoom = value;\r\n }\r\n }\r\n\r\n /**\r\n * Gets or Set the pointer panning sensibility or how fast is the camera moving.\r\n */\r\n public get panningSensibility(): number {\r\n var pointers = <ArcRotateCameraPointersInput>this.inputs.attached[\"pointers\"];\r\n if (pointers) {\r\n return pointers.panningSensibility;\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n public set panningSensibility(value: number) {\r\n var pointers = <ArcRotateCameraPointersInput>this.inputs.attached[\"pointers\"];\r\n if (pointers) {\r\n pointers.panningSensibility = value;\r\n }\r\n }\r\n\r\n /**\r\n * Gets or Set the list of keyboard keys used to control beta angle in a positive direction.\r\n */\r\n public get keysUp(): number[] {\r\n var keyboard = <ArcRotateCameraKeyboardMoveInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n return keyboard.keysUp;\r\n }\r\n\r\n return [];\r\n }\r\n\r\n public set keysUp(value: number[]) {\r\n var keyboard = <ArcRotateCameraKeyboardMoveInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n keyboard.keysUp = value;\r\n }\r\n }\r\n\r\n /**\r\n * Gets or Set the list of keyboard keys used to control beta angle in a negative direction.\r\n */\r\n public get keysDown(): number[] {\r\n var keyboard = <ArcRotateCameraKeyboardMoveInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n return keyboard.keysDown;\r\n }\r\n\r\n return [];\r\n }\r\n\r\n public set keysDown(value: number[]) {\r\n var keyboard = <ArcRotateCameraKeyboardMoveInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n keyboard.keysDown = value;\r\n }\r\n }\r\n\r\n /**\r\n * Gets or Set the list of keyboard keys used to control alpha angle in a negative direction.\r\n */\r\n public get keysLeft(): number[] {\r\n var keyboard = <ArcRotateCameraKeyboardMoveInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n return keyboard.keysLeft;\r\n }\r\n\r\n return [];\r\n }\r\n\r\n public set keysLeft(value: number[]) {\r\n var keyboard = <ArcRotateCameraKeyboardMoveInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n keyboard.keysLeft = value;\r\n }\r\n }\r\n\r\n /**\r\n * Gets or Set the list of keyboard keys used to control alpha angle in a positive direction.\r\n */\r\n public get keysRight(): number[] {\r\n var keyboard = <ArcRotateCameraKeyboardMoveInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n return keyboard.keysRight;\r\n }\r\n\r\n return [];\r\n }\r\n\r\n public set keysRight(value: number[]) {\r\n var keyboard = <ArcRotateCameraKeyboardMoveInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n keyboard.keysRight = value;\r\n }\r\n }\r\n\r\n /**\r\n * Gets or Set the mouse wheel precision or how fast is the camera zooming.\r\n */\r\n public get wheelPrecision(): number {\r\n var mousewheel = <ArcRotateCameraMouseWheelInput>this.inputs.attached[\"mousewheel\"];\r\n if (mousewheel) {\r\n return mousewheel.wheelPrecision;\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n public set wheelPrecision(value: number) {\r\n var mousewheel = <ArcRotateCameraMouseWheelInput>this.inputs.attached[\"mousewheel\"];\r\n if (mousewheel) {\r\n mousewheel.wheelPrecision = value;\r\n }\r\n }\r\n\r\n /**\r\n * Gets or Set the boolean value that controls whether or not the mouse wheel\r\n * zooms to the location of the mouse pointer or not. The default is false.\r\n */\r\n @serialize()\r\n public get zoomToMouseLocation(): boolean {\r\n var mousewheel = <ArcRotateCameraMouseWheelInput>this.inputs.attached[\"mousewheel\"];\r\n if (mousewheel) {\r\n return mousewheel.zoomToMouseLocation;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public set zoomToMouseLocation(value: boolean) {\r\n var mousewheel = <ArcRotateCameraMouseWheelInput>this.inputs.attached[\"mousewheel\"];\r\n if (mousewheel) {\r\n mousewheel.zoomToMouseLocation = value;\r\n }\r\n }\r\n\r\n /**\r\n * Gets or Set the mouse wheel delta percentage or how fast is the camera zooming.\r\n * It will be used instead of pinchDeltaPrecision if different from 0.\r\n * It defines the percentage of current camera.radius to use as delta when pinch zoom is used.\r\n */\r\n public get wheelDeltaPercentage(): number {\r\n var mousewheel = <ArcRotateCameraMouseWheelInput>this.inputs.attached[\"mousewheel\"];\r\n if (mousewheel) {\r\n return mousewheel.wheelDeltaPercentage;\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n public set wheelDeltaPercentage(value: number) {\r\n var mousewheel = <ArcRotateCameraMouseWheelInput>this.inputs.attached[\"mousewheel\"];\r\n if (mousewheel) {\r\n mousewheel.wheelDeltaPercentage = value;\r\n }\r\n }\r\n\r\n //-- end properties for backward compatibility for inputs\r\n\r\n /**\r\n * Defines how much the radius should be scaled while zooming on a particular mesh (through the zoomOn function)\r\n */\r\n @serialize()\r\n public zoomOnFactor = 1;\r\n\r\n /**\r\n * Defines a screen offset for the camera position.\r\n */\r\n @serializeAsVector2()\r\n public targetScreenOffset = Vector2.Zero();\r\n\r\n /**\r\n * Allows the camera to be completely reversed.\r\n * If false the camera can not arrive upside down.\r\n */\r\n @serialize()\r\n public allowUpsideDown = true;\r\n\r\n /**\r\n * Define if double tap/click is used to restore the previously saved state of the camera.\r\n */\r\n @serialize()\r\n public useInputToRestoreState = true;\r\n\r\n /** @hidden */\r\n public _viewMatrix = new Matrix();\r\n /** @hidden */\r\n public _useCtrlForPanning: boolean;\r\n /** @hidden */\r\n public _panningMouseButton: number;\r\n\r\n /**\r\n * Defines the input associated to the camera.\r\n */\r\n public inputs: ArcRotateCameraInputsManager;\r\n\r\n /** @hidden */\r\n public _reset: () => void;\r\n\r\n /**\r\n * Defines the allowed panning axis.\r\n */\r\n public panningAxis: Vector3 = new Vector3(1, 1, 0);\r\n protected _transformedDirection: Vector3 = new Vector3();\r\n\r\n /**\r\n * Defines if camera will eliminate transform on y axis.\r\n */\r\n public mapPanning: boolean = false;\r\n\r\n // Behaviors\r\n private _bouncingBehavior: Nullable<BouncingBehavior>;\r\n\r\n /**\r\n * Gets the bouncing behavior of the camera if it has been enabled.\r\n * @see https://doc.babylonjs.com/how_to/camera_behaviors#bouncing-behavior\r\n */\r\n public get bouncingBehavior(): Nullable<BouncingBehavior> {\r\n return this._bouncingBehavior;\r\n }\r\n\r\n /**\r\n * Defines if the bouncing behavior of the camera is enabled on the camera.\r\n * @see https://doc.babylonjs.com/how_to/camera_behaviors#bouncing-behavior\r\n */\r\n public get useBouncingBehavior(): boolean {\r\n return this._bouncingBehavior != null;\r\n }\r\n\r\n public set useBouncingBehavior(value: boolean) {\r\n if (value === this.useBouncingBehavior) {\r\n return;\r\n }\r\n\r\n if (value) {\r\n this._bouncingBehavior = new BouncingBehavior();\r\n this.addBehavior(this._bouncingBehavior);\r\n } else if (this._bouncingBehavior) {\r\n this.removeBehavior(this._bouncingBehavior);\r\n this._bouncingBehavior = null;\r\n }\r\n }\r\n\r\n private _framingBehavior: Nullable<FramingBehavior>;\r\n\r\n /**\r\n * Gets the framing behavior of the camera if it has been enabled.\r\n * @see https://doc.babylonjs.com/how_to/camera_behaviors#framing-behavior\r\n */\r\n public get framingBehavior(): Nullable<FramingBehavior> {\r\n return this._framingBehavior;\r\n }\r\n\r\n /**\r\n * Defines if the framing behavior of the camera is enabled on the camera.\r\n * @see https://doc.babylonjs.com/how_to/camera_behaviors#framing-behavior\r\n */\r\n public get useFramingBehavior(): boolean {\r\n return this._framingBehavior != null;\r\n }\r\n\r\n public set useFramingBehavior(value: boolean) {\r\n if (value === this.useFramingBehavior) {\r\n return;\r\n }\r\n\r\n if (value) {\r\n this._framingBehavior = new FramingBehavior();\r\n this.addBehavior(this._framingBehavior);\r\n } else if (this._framingBehavior) {\r\n this.removeBehavior(this._framingBehavior);\r\n this._framingBehavior = null;\r\n }\r\n }\r\n\r\n private _autoRotationBehavior: Nullable<AutoRotationBehavior>;\r\n\r\n /**\r\n * Gets the auto rotation behavior of the camera if it has been enabled.\r\n * @see https://doc.babylonjs.com/how_to/camera_behaviors#autorotation-behavior\r\n */\r\n public get autoRotationBehavior(): Nullable<AutoRotationBehavior> {\r\n return this._autoRotationBehavior;\r\n }\r\n\r\n /**\r\n * Defines if the auto rotation behavior of the camera is enabled on the camera.\r\n * @see https://doc.babylonjs.com/how_to/camera_behaviors#autorotation-behavior\r\n */\r\n public get useAutoRotationBehavior(): boolean {\r\n return this._autoRotationBehavior != null;\r\n }\r\n\r\n public set useAutoRotationBehavior(value: boolean) {\r\n if (value === this.useAutoRotationBehavior) {\r\n return;\r\n }\r\n\r\n if (value) {\r\n this._autoRotationBehavior = new AutoRotationBehavior();\r\n this.addBehavior(this._autoRotationBehavior);\r\n } else if (this._autoRotationBehavior) {\r\n this.removeBehavior(this._autoRotationBehavior);\r\n this._autoRotationBehavior = null;\r\n }\r\n }\r\n\r\n /**\r\n * Observable triggered when the mesh target has been changed on the camera.\r\n */\r\n public onMeshTargetChangedObservable = new Observable<Nullable<AbstractMesh>>();\r\n\r\n /**\r\n * Event raised when the camera is colliding with a mesh.\r\n */\r\n public onCollide: (collidedMesh: AbstractMesh) => void;\r\n\r\n /**\r\n * Defines whether the camera should check collision with the objects oh the scene.\r\n * @see https://doc.babylonjs.com/babylon101/cameras,_mesh_collisions_and_gravity#how-can-i-do-this\r\n */\r\n public checkCollisions = false;\r\n\r\n /**\r\n * Defines the collision radius of the camera.\r\n * This simulates a sphere around the camera.\r\n * @see https://doc.babylonjs.com/babylon101/cameras,_mesh_collisions_and_gravity#arcrotatecamera\r\n */\r\n public collisionRadius = new Vector3(0.5, 0.5, 0.5);\r\n\r\n protected _collider: Collider;\r\n protected _previousPosition = Vector3.Zero();\r\n protected _collisionVelocity = Vector3.Zero();\r\n protected _newPosition = Vector3.Zero();\r\n protected _previousAlpha: number;\r\n protected _previousBeta: number;\r\n protected _previousRadius: number;\r\n //due to async collision inspection\r\n protected _collisionTriggered: boolean;\r\n\r\n protected _targetBoundingCenter: Nullable<Vector3>;\r\n\r\n private _computationVector: Vector3 = Vector3.Zero();\r\n\r\n /**\r\n * Instantiates a new ArcRotateCamera in a given scene\r\n * @param name Defines the name of the camera\r\n * @param alpha Defines the camera rotation along the longitudinal axis\r\n * @param beta Defines the camera rotation along the latitudinal axis\r\n * @param radius Defines the camera distance from its target\r\n * @param target Defines the camera target\r\n * @param scene Defines the scene the camera belongs to\r\n * @param setActiveOnSceneIfNoneActive Defines whether the camera should be marked as active if not other active cameras have been defined\r\n */\r\n constructor(name: string, alpha: number, beta: number, radius: number, target: Vector3, scene?: Scene, setActiveOnSceneIfNoneActive = true) {\r\n super(name, Vector3.Zero(), scene, setActiveOnSceneIfNoneActive);\r\n\r\n this._target = Vector3.Zero();\r\n if (target) {\r\n this.setTarget(target);\r\n }\r\n\r\n this.alpha = alpha;\r\n this.beta = beta;\r\n this.radius = radius;\r\n\r\n this.getViewMatrix();\r\n this.inputs = new ArcRotateCameraInputsManager(this);\r\n this.inputs.addKeyboard().addMouseWheel().addPointers();\r\n }\r\n\r\n // Cache\r\n /** @hidden */\r\n public _initCache(): void {\r\n super._initCache();\r\n this._cache._target = new Vector3(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE);\r\n this._cache.alpha = undefined;\r\n this._cache.beta = undefined;\r\n this._cache.radius = undefined;\r\n this._cache.targetScreenOffset = Vector2.Zero();\r\n }\r\n\r\n /** @hidden */\r\n public _updateCache(ignoreParentClass?: boolean): void {\r\n if (!ignoreParentClass) {\r\n super._updateCache();\r\n }\r\n\r\n this._cache._target.copyFrom(this._getTargetPosition());\r\n this._cache.alpha = this.alpha;\r\n this._cache.beta = this.beta;\r\n this._cache.radius = this.radius;\r\n this._cache.targetScreenOffset.copyFrom(this.targetScreenOffset);\r\n }\r\n\r\n protected _getTargetPosition(): Vector3 {\r\n if (this._targetHost && this._targetHost.getAbsolutePosition) {\r\n var pos: Vector3 = this._targetHost.getAbsolutePosition();\r\n if (this._targetBoundingCenter) {\r\n pos.addToRef(this._targetBoundingCenter, this._target);\r\n } else {\r\n this._target.copyFrom(pos);\r\n }\r\n }\r\n\r\n var lockedTargetPosition = this._getLockedTargetPosition();\r\n\r\n if (lockedTargetPosition) {\r\n return lockedTargetPosition;\r\n }\r\n\r\n return this._target;\r\n }\r\n\r\n private _storedAlpha: number;\r\n private _storedBeta: number;\r\n private _storedRadius: number;\r\n private _storedTarget: Vector3;\r\n private _storedTargetScreenOffset: Vector2;\r\n\r\n /**\r\n * Stores the current state of the camera (alpha, beta, radius and target)\r\n * @returns the camera itself\r\n */\r\n public storeState(): Camera {\r\n this._storedAlpha = this.alpha;\r\n this._storedBeta = this.beta;\r\n this._storedRadius = this.radius;\r\n this._storedTarget = this._getTargetPosition().clone();\r\n this._storedTargetScreenOffset = this.targetScreenOffset.clone();\r\n\r\n return super.storeState();\r\n }\r\n\r\n /**\r\n * @hidden\r\n * Restored camera state. You must call storeState() first\r\n */\r\n public _restoreStateValues(): boolean {\r\n if (!super._restoreStateValues()) {\r\n return false;\r\n }\r\n\r\n this.setTarget(this._storedTarget.clone());\r\n this.alpha = this._storedAlpha;\r\n this.beta = this._storedBeta;\r\n this.radius = this._storedRadius;\r\n this.targetScreenOffset = this._storedTargetScreenOffset.clone();\r\n\r\n this.inertialAlphaOffset = 0;\r\n this.inertialBetaOffset = 0;\r\n this.inertialRadiusOffset = 0;\r\n this.inertialPanningX = 0;\r\n this.inertialPanningY = 0;\r\n\r\n return true;\r\n }\r\n\r\n // Synchronized\r\n /** @hidden */\r\n public _isSynchronizedViewMatrix(): boolean {\r\n if (!super._isSynchronizedViewMatrix()) {\r\n return false;\r\n }\r\n\r\n return this._cache._target.equals(this._getTargetPosition()) && this._cache.alpha === this.alpha && this._cache.beta === this.beta && this._cache.radius === this.radius && this._cache.targetScreenOffset.equals(this.targetScreenOffset);\r\n }\r\n\r\n /**\r\n * Attach the input controls to a specific dom element to get the input from.\r\n * @param noPreventDefault Defines whether event caught by the controls should call preventdefault() (https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault)\r\n */\r\n public attachControl(noPreventDefault?: boolean): void;\r\n /**\r\n * Attach the input controls to a specific dom element to get the input from.\r\n * @param ignored defines an ignored parameter kept for backward compatibility. If you want to define the source input element, you can set engine.inputElement before calling camera.attachControl\r\n * @param noPreventDefault Defines whether event caught by the controls should call preventdefault() (https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault)\r\n */\r\n public attachControl(ignored: any, noPreventDefault?: boolean): void;\r\n /**\r\n * Attached controls to the current camera.\r\n * @param noPreventDefault Defines whether event caught by the controls should call preventdefault() (https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault)\r\n * @param useCtrlForPanning Defines whether ctrl is used for panning within the controls\r\n */\r\n public attachControl(noPreventDefault: boolean, useCtrlForPanning: boolean): void;\r\n /**\r\n * Attached controls to the current camera.\r\n * @param ignored defines an ignored parameter kept for backward compatibility. If you want to define the source input element, you can set engine.inputElement before calling camera.attachControl\r\n * @param noPreventDefault Defines whether event caught by the controls should call preventdefault() (https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault)\r\n * @param useCtrlForPanning Defines whether ctrl is used for panning within the controls\r\n */\r\n public attachControl(ignored: any, noPreventDefault: boolean, useCtrlForPanning: boolean): void;\r\n /**\r\n * Attached controls to the current camera.\r\n * @param noPreventDefault Defines whether event caught by the controls should call preventdefault() (https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault)\r\n * @param useCtrlForPanning Defines whether ctrl is used for panning within the controls\r\n * @param panningMouseButton Defines whether panning is allowed through mouse click button\r\n */\r\n public attachControl(noPreventDefault: boolean, useCtrlForPanning: boolean, panningMouseButton: number): void;\r\n /**\r\n * Attached controls to the current camera.\r\n * @param ignored defines an ignored parameter kept for backward compatibility. If you want to define the source input element, you can set engine.inputElement before calling camera.attachControl\r\n * @param noPreventDefault Defines whether event caught by the controls should call preventdefault() (https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault)\r\n * @param useCtrlForPanning Defines whether ctrl is used for panning within the controls\r\n * @param panningMouseButton Defines whether panning is allowed through mouse click button\r\n */\r\n public attachControl(ignored: any, noPreventDefault?: boolean, useCtrlForPanning: boolean | number = true, panningMouseButton: number = 2): void {\r\n noPreventDefault = Tools.BackCompatCameraNoPreventDefault(arguments);\r\n this._useCtrlForPanning = useCtrlForPanning as boolean;\r\n this._panningMouseButton = panningMouseButton;\r\n // backwards compatibility\r\n if (typeof arguments[0] === \"boolean\") {\r\n if (arguments.length > 1) {\r\n this._useCtrlForPanning = arguments[1];\r\n }\r\n if (arguments.length > 2) {\r\n this._panningMouseButton = arguments[2];\r\n }\r\n }\r\n\r\n this.inputs.attachElement(noPreventDefault);\r\n\r\n this._reset = () => {\r\n this.inertialAlphaOffset = 0;\r\n this.inertialBetaOffset = 0;\r\n this.inertialRadiusOffset = 0;\r\n this.inertialPanningX = 0;\r\n this.inertialPanningY = 0;\r\n };\r\n }\r\n\r\n /**\r\n * Detach the current controls from the specified dom element.\r\n */\r\n public detachControl(): void;\r\n /**\r\n * Detach the current controls from the specified dom element.\r\n * @param ignored defines an ignored parameter kept for backward compatibility. If you want to define the source input element, you can set engine.inputElement before calling camera.attachControl\r\n */\r\n public detachControl(ignored: any): void;\r\n /**\r\n * Detach the current controls from the specified dom element.\r\n * @param ignored defines an ignored parameter kept for backward compatibility. If you want to define the source input element, you can set engine.inputElement before calling camera.attachControl\r\n */\r\n public detachControl(ignored?: any): void {\r\n this.inputs.detachElement();\r\n\r\n if (this._reset) {\r\n this._reset();\r\n }\r\n }\r\n\r\n /** @hidden */\r\n public _checkInputs(): void {\r\n //if (async) collision inspection was triggered, don't update the camera's position - until the collision callback was called.\r\n if (this._collisionTriggered) {\r\n return;\r\n }\r\n\r\n this.inputs.checkInputs();\r\n // Inertia\r\n if (this.inertialAlphaOffset !== 0 || this.inertialBetaOffset !== 0 || this.inertialRadiusOffset !== 0) {\r\n let inertialAlphaOffset = this.inertialAlphaOffset;\r\n if (this.beta <= 0) {\r\n inertialAlphaOffset *= -1;\r\n }\r\n if (this.getScene().useRightHandedSystem) {\r\n inertialAlphaOffset *= -1;\r\n }\r\n if (this.parent && this.parent._getWorldMatrixDeterminant() < 0) {\r\n inertialAlphaOffset *= -1;\r\n }\r\n this.alpha += inertialAlphaOffset;\r\n\r\n this.beta += this.inertialBetaOffset;\r\n\r\n this.radius -= this.inertialRadiusOffset;\r\n this.inertialAlphaOffset *= this.inertia;\r\n this.inertialBetaOffset *= this.inertia;\r\n this.inertialRadiusOffset *= this.inertia;\r\n if (Math.abs(this.inertialAlphaOffset) < Epsilon) {\r\n this.inertialAlphaOffset = 0;\r\n }\r\n if (Math.abs(this.inertialBetaOffset) < Epsilon) {\r\n this.inertialBetaOffset = 0;\r\n }\r\n if (Math.abs(this.inertialRadiusOffset) < this.speed * Epsilon) {\r\n this.inertialRadiusOffset = 0;\r\n }\r\n }\r\n\r\n // Panning inertia\r\n if (this.inertialPanningX !== 0 || this.inertialPanningY !== 0) {\r\n let localDirection = new Vector3(this.inertialPanningX, this.inertialPanningY, this.inertialPanningY);\r\n\r\n this._viewMatrix.invertToRef(this._cameraTransformMatrix);\r\n localDirection.multiplyInPlace(this.panningAxis);\r\n Vector3.TransformNormalToRef(localDirection, this._cameraTransformMatrix, this._transformedDirection);\r\n // Eliminate y if mapPanning is enabled\r\n if (this.mapPanning || !this.panningAxis.y) {\r\n this._transformedDirection.y = 0;\r\n }\r\n\r\n if (!this._targetHost) {\r\n if (this.panningDistanceLimit) {\r\n this._transformedDirection.addInPlace(this._target);\r\n var distanceSquared = Vector3.DistanceSquared(this._transformedDirection, this.panningOriginTarget);\r\n if (distanceSquared <= this.panningDistanceLimit * this.panningDistanceLimit) {\r\n this._target.copyFrom(this._transformedDirection);\r\n }\r\n } else {\r\n this._target.addInPlace(this._transformedDirection);\r\n }\r\n }\r\n\r\n this.inertialPanningX *= this.panningInertia;\r\n this.inertialPanningY *= this.panningInertia;\r\n\r\n if (Math.abs(this.inertialPanningX) < this.speed * Epsilon) {\r\n this.inertialPanningX = 0;\r\n }\r\n if (Math.abs(this.inertialPanningY) < this.speed * Epsilon) {\r\n this.inertialPanningY = 0;\r\n }\r\n }\r\n\r\n // Limits\r\n this._checkLimits();\r\n\r\n super._checkInputs();\r\n }\r\n\r\n protected _checkLimits() {\r\n if (this.lowerBetaLimit === null || this.lowerBetaLimit === undefined) {\r\n if (this.allowUpsideDown && this.beta > Math.PI) {\r\n this.beta = this.beta - 2 * Math.PI;\r\n }\r\n } else {\r\n if (this.beta < this.lowerBetaLimit) {\r\n this.beta = this.lowerBetaLimit;\r\n }\r\n }\r\n\r\n if (this.upperBetaLimit === null || this.upperBetaLimit === undefined) {\r\n if (this.allowUpsideDown && this.beta < -Math.PI) {\r\n this.beta = this.beta + 2 * Math.PI;\r\n }\r\n } else {\r\n if (this.beta > this.upperBetaLimit) {\r\n this.beta = this.upperBetaLimit;\r\n }\r\n }\r\n\r\n if (this.lowerAlphaLimit !== null && this.alpha < this.lowerAlphaLimit) {\r\n this.alpha = this.lowerAlphaLimit;\r\n }\r\n if (this.upperAlphaLimit !== null && this.alpha > this.upperAlphaLimit) {\r\n this.alpha = this.upperAlphaLimit;\r\n }\r\n\r\n if (this.lowerRadiusLimit !== null && this.radius < this.lowerRadiusLimit) {\r\n this.radius = this.lowerRadiusLimit;\r\n this.inertialRadiusOffset = 0;\r\n }\r\n if (this.upperRadiusLimit !== null && this.radius > this.upperRadiusLimit) {\r\n this.radius = this.upperRadiusLimit;\r\n this.inertialRadiusOffset = 0;\r\n }\r\n }\r\n\r\n /**\r\n * Rebuilds angles (alpha, beta) and radius from the give position and target\r\n */\r\n public rebuildAnglesAndRadius(): void {\r\n this._position.subtractToRef(this._getTargetPosition(), this._computationVector);\r\n\r\n // need to rotate to Y up equivalent if up vector not Axis.Y\r\n if (this._upVector.x !== 0 || this._upVector.y !== 1.0 || this._upVector.z !== 0) {\r\n Vector3.TransformCoordinatesToRef(this._computationVector, this._upToYMatrix, this._computationVector);\r\n }\r\n\r\n this.radius = this._computationVector.length();\r\n\r\n if (this.radius === 0) {\r\n this.radius = 0.0001; // Just to avoid division by zero\r\n }\r\n\r\n // Alpha\r\n const previousAlpha = this.alpha;\r\n if (this._computationVector.x === 0 && this._computationVector.z === 0) {\r\n this.alpha = Math.PI / 2; // avoid division by zero when looking along up axis, and set to acos(0)\r\n } else {\r\n this.alpha = Math.acos(this._computationVector.x / Math.sqrt(Math.pow(this._computationVector.x, 2) + Math.pow(this._computationVector.z, 2)));\r\n }\r\n\r\n if (this._computationVector.z < 0) {\r\n this.alpha = 2 * Math.PI - this.alpha;\r\n }\r\n\r\n // Calculate the number of revolutions between the new and old alpha values.\r\n const alphaCorrectionTurns = Math.round((previousAlpha - this.alpha) / (2.0 * Math.PI));\r\n // Adjust alpha so that its numerical representation is the closest one to the old value.\r\n this.alpha += alphaCorrectionTurns * 2.0 * Math.PI;\r\n\r\n // Beta\r\n this.beta = Math.acos(this._computationVector.y / this.radius);\r\n\r\n this._checkLimits();\r\n }\r\n\r\n /**\r\n * Use a position to define the current camera related information like alpha, beta and radius\r\n * @param position Defines the position to set the camera at\r\n */\r\n public setPosition(position: Vector3): void {\r\n if (this._position.equals(position)) {\r\n return;\r\n }\r\n this._position.copyFrom(position);\r\n\r\n this.rebuildAnglesAndRadius();\r\n }\r\n\r\n /**\r\n * Defines the target the camera should look at.\r\n * This will automatically adapt alpha beta and radius to fit within the new target.\r\n * @param target Defines the new target as a Vector or a mesh\r\n * @param toBoundingCenter In case of a mesh target, defines whether to target the mesh position or its bounding information center\r\n * @param allowSamePosition If false, prevents reapplying the new computed position if it is identical to the current one (optim)\r\n */\r\n public setTarget(target: AbstractMesh | Vector3, toBoundingCenter = false, allowSamePosition = false): void {\r\n if ((<any>target).getBoundingInfo) {\r\n if (toBoundingCenter) {\r\n this._targetBoundingCenter = (<any>target).getBoundingInfo().boundingBox.centerWorld.clone();\r\n } else {\r\n this._targetBoundingCenter = null;\r\n }\r\n (<AbstractMesh>target).computeWorldMatrix();\r\n this._targetHost = <AbstractMesh>target;\r\n this._target = this._getTargetPosition();\r\n\r\n this.onMeshTargetChangedObservable.notifyObservers(this._targetHost);\r\n } else {\r\n var newTarget = <Vector3>target;\r\n var currentTarget = this._getTargetPosition();\r\n if (currentTarget && !allowSamePosition && currentTarget.equals(newTarget)) {\r\n return;\r\n }\r\n this._targetHost = null;\r\n this._target = newTarget;\r\n this._targetBoundingCenter = null;\r\n this.onMeshTargetChangedObservable.notifyObservers(null);\r\n }\r\n\r\n this.rebuildAnglesAndRadius();\r\n }\r\n\r\n /** @hidden */\r\n public _getViewMatrix(): Matrix {\r\n // Compute\r\n var cosa = Math.cos(this.alpha);\r\n var sina = Math.sin(this.alpha);\r\n var cosb = Math.cos(this.beta);\r\n var sinb = Math.sin(this.beta);\r\n\r\n if (sinb === 0) {\r\n sinb = 0.0001;\r\n }\r\n\r\n if (this.radius === 0) {\r\n this.radius = 0.0001; // Just to avoid division by zero\r\n }\r\n\r\n var target = this._getTargetPosition();\r\n this._computationVector.copyFromFloats(this.radius * cosa * sinb, this.radius * cosb, this.radius * sina * sinb);\r\n\r\n // Rotate according to up vector\r\n if (this._upVector.x !== 0 || this._upVector.y !== 1.0 || this._upVector.z !== 0) {\r\n Vector3.TransformCoordinatesToRef(this._computationVector, this._YToUpMatrix, this._computationVector);\r\n }\r\n\r\n target.addToRef(this._computationVector, this._newPosition);\r\n if (this.getScene().collisionsEnabled && this.checkCollisions) {\r\n const coordinator = this.getScene().collisionCoordinator;\r\n if (!this._collider) {\r\n this._collider = coordinator.createCollider();\r\n }\r\n this._collider._radius = this.collisionRadius;\r\n this._newPosition.subtractToRef(this._position, this._collisionVelocity);\r\n this._collisionTriggered = true;\r\n coordinator.getNewPosition(this._position, this._collisionVelocity, this._collider, 3, null, this._onCollisionPositionChange, this.uniqueId);\r\n } else {\r\n this._position.copyFrom(this._newPosition);\r\n\r\n var up = this.upVector;\r\n if (this.allowUpsideDown && sinb < 0) {\r\n up = up.negate();\r\n }\r\n\r\n this._computeViewMatrix(this._position, target, up);\r\n\r\n this._viewMatrix.addAtIndex(12, this.targetScreenOffset.x);\r\n this._viewMatrix.addAtIndex(13, this.targetScreenOffset.y);\r\n }\r\n this._currentTarget = target;\r\n return this._viewMatrix;\r\n }\r\n\r\n protected _onCollisionPositionChange = (collisionId: number, newPosition: Vector3, collidedMesh: Nullable<AbstractMesh> = null) => {\r\n if (!collidedMesh) {\r\n this._previousPosition.copyFrom(this._position);\r\n } else {\r\n this.setPosition(newPosition);\r\n\r\n if (this.onCollide) {\r\n this.onCollide(collidedMesh);\r\n }\r\n }\r\n\r\n // Recompute because of constraints\r\n var cosa = Math.cos(this.alpha);\r\n var sina = Math.sin(this.alpha);\r\n var cosb = Math.cos(this.beta);\r\n var sinb = Math.sin(this.beta);\r\n\r\n if (sinb === 0) {\r\n sinb = 0.0001;\r\n }\r\n\r\n var target = this._getTargetPosition();\r\n this._computationVector.copyFromFloats(this.radius * cosa * sinb, this.radius * cosb, this.radius * sina * sinb);\r\n target.addToRef(this._computationVector, this._newPosition);\r\n this._position.copyFrom(this._newPosition);\r\n\r\n var up = this.upVector;\r\n if (this.allowUpsideDown && this.beta < 0) {\r\n up = up.clone();\r\n up = up.negate();\r\n }\r\n\r\n this._computeViewMatrix(this._position, target, up);\r\n this._viewMatrix.addAtIndex(12, this.targetScreenOffset.x);\r\n this._viewMatrix.addAtIndex(13, this.targetScreenOffset.y);\r\n\r\n this._collisionTriggered = false;\r\n };\r\n\r\n /**\r\n * Zooms on a mesh to be at the min distance where we could see it fully in the current viewport.\r\n * @param meshes Defines the mesh to zoom on\r\n * @param doNotUpdateMaxZ Defines whether or not maxZ should be updated whilst zooming on the mesh (this can happen if the mesh is big and the maxradius pretty small for instance)\r\n */\r\n public zoomOn(meshes?: AbstractMesh[], doNotUpdateMaxZ = false): void {\r\n meshes = meshes || this.getScene().meshes;\r\n\r\n var minMaxVector = Mesh.MinMax(meshes);\r\n var distance = Vector3.Distance(minMaxVector.min, minMaxVector.max);\r\n\r\n this.radius = distance * this.zoomOnFactor;\r\n\r\n this.focusOn({ min: minMaxVector.min, max: minMaxVector.max, distance: distance }, doNotUpdateMaxZ);\r\n }\r\n\r\n /**\r\n * Focus on a mesh or a bounding box. This adapts the target and maxRadius if necessary but does not update the current radius.\r\n * The target will be changed but the radius\r\n * @param meshesOrMinMaxVectorAndDistance Defines the mesh or bounding info to focus on\r\n * @param doNotUpdateMaxZ Defines whether or not maxZ should be updated whilst zooming on the mesh (this can happen if the mesh is big and the maxradius pretty small for instance)\r\n */\r\n public focusOn(meshesOrMinMaxVectorAndDistance: AbstractMesh[] | { min: Vector3; max: Vector3; distance: number }, doNotUpdateMaxZ = false): void {\r\n var meshesOrMinMaxVector: { min: Vector3; max: Vector3 };\r\n var distance: number;\r\n\r\n if ((<any>meshesOrMinMaxVectorAndDistance).min === undefined) {\r\n // meshes\r\n var meshes = <AbstractMesh[]>meshesOrMinMaxVectorAndDistance || this.getScene().meshes;\r\n meshesOrMinMaxVector = Mesh.MinMax(meshes);\r\n distance = Vector3.Distance(meshesOrMinMaxVector.min, meshesOrMinMaxVector.max);\r\n } else {\r\n //minMaxVector and distance\r\n var minMaxVectorAndDistance = <any>meshesOrMinMaxVectorAndDistance;\r\n meshesOrMinMaxVector = minMaxVectorAndDistance;\r\n distance = minMaxVectorAndDistance.distance;\r\n }\r\n\r\n this._target = Mesh.Center(meshesOrMinMaxVector);\r\n\r\n if (!doNotUpdateMaxZ) {\r\n this.maxZ = distance * 2;\r\n }\r\n }\r\n\r\n /**\r\n * @override\r\n * Override Camera.createRigCamera\r\n */\r\n public createRigCamera(name: string, cameraIndex: number): Camera {\r\n var alphaShift: number = 0;\r\n switch (this.cameraRigMode) {\r\n case Camera.RIG_MODE_STEREOSCOPIC_ANAGLYPH:\r\n case Camera.RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_PARALLEL:\r\n case Camera.RIG_MODE_STEREOSCOPIC_OVERUNDER:\r\n case Camera.RIG_MODE_STEREOSCOPIC_INTERLACED:\r\n case Camera.RIG_MODE_VR:\r\n alphaShift = this._cameraRigParams.stereoHalfAngle * (cameraIndex === 0 ? 1 : -1);\r\n break;\r\n case Camera.RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_CROSSEYED:\r\n alphaShift = this._cameraRigParams.stereoHalfAngle * (cameraIndex === 0 ? -1 : 1);\r\n break;\r\n }\r\n var rigCam = new ArcRotateCamera(name, this.alpha + alphaShift, this.beta, this.radius, this._target, this.getScene());\r\n rigCam._cameraRigParams = {};\r\n rigCam.isRigCamera = true;\r\n rigCam.rigParent = this;\r\n rigCam.upVector = this.upVector;\r\n return rigCam;\r\n }\r\n\r\n /**\r\n * @hidden\r\n * @override\r\n * Override Camera._updateRigCameras\r\n */\r\n public _updateRigCameras() {\r\n var camLeft = <ArcRotateCamera>this._rigCameras[0];\r\n var camRight = <ArcRotateCamera>this._rigCameras[1];\r\n\r\n camLeft.beta = camRight.beta = this.beta;\r\n\r\n switch (this.cameraRigMode) {\r\n case Camera.RIG_MODE_STEREOSCOPIC_ANAGLYPH:\r\n case Camera.RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_PARALLEL:\r\n case Camera.RIG_MODE_STEREOSCOPIC_OVERUNDER:\r\n case Camera.RIG_MODE_STEREOSCOPIC_INTERLACED:\r\n case Camera.RIG_MODE_VR:\r\n camLeft.alpha = this.alpha - this._cameraRigParams.stereoHalfAngle;\r\n camRight.alpha = this.alpha + this._cameraRigParams.stereoHalfAngle;\r\n break;\r\n case Camera.RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_CROSSEYED:\r\n camLeft.alpha = this.alpha + this._cameraRigParams.stereoHalfAngle;\r\n camRight.alpha = this.alpha - this._cameraRigParams.stereoHalfAngle;\r\n break;\r\n }\r\n super._updateRigCameras();\r\n }\r\n\r\n /**\r\n * Destroy the camera and release the current resources hold by it.\r\n */\r\n public dispose(): void {\r\n this.inputs.clear();\r\n super.dispose();\r\n }\r\n\r\n /**\r\n * Gets the current object class name.\r\n * @return the class name\r\n */\r\n public getClassName(): string {\r\n return \"ArcRotateCamera\";\r\n }\r\n}\r\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { IUIEvent } from "../../Events/deviceInputEvents";
|
|
2
2
|
import { Nullable } from "../../types";
|
|
3
3
|
import { DeviceType } from "../InputDevices/deviceEnums";
|
|
4
4
|
import { IDeviceInputSystem } from "../InputDevices/inputInterfaces";
|
|
@@ -15,9 +15,9 @@ export declare class DeviceEventFactory {
|
|
|
15
15
|
* @param currentState Current value for given input
|
|
16
16
|
* @param deviceInputSystem Reference to DeviceInputSystem
|
|
17
17
|
* @param elementToAttachTo HTMLElement to reference as target for inputs
|
|
18
|
-
* @returns
|
|
18
|
+
* @returns IUIEvent object
|
|
19
19
|
*/
|
|
20
|
-
static CreateDeviceEvent(deviceType: DeviceType, deviceSlot: number, inputIndex: number, currentState: Nullable<number>, deviceInputSystem: IDeviceInputSystem, elementToAttachTo?: any):
|
|
20
|
+
static CreateDeviceEvent(deviceType: DeviceType, deviceSlot: number, inputIndex: number, currentState: Nullable<number>, deviceInputSystem: IDeviceInputSystem, elementToAttachTo?: any): IUIEvent;
|
|
21
21
|
/**
|
|
22
22
|
* Creates pointer event
|
|
23
23
|
*
|
|
@@ -27,7 +27,7 @@ export declare class DeviceEventFactory {
|
|
|
27
27
|
* @param currentState Current value for given input
|
|
28
28
|
* @param deviceInputSystem Reference to DeviceInputSystem
|
|
29
29
|
* @param elementToAttachTo HTMLElement to reference as target for inputs
|
|
30
|
-
* @returns
|
|
30
|
+
* @returns IUIEvent object (Pointer)
|
|
31
31
|
*/
|
|
32
32
|
private static _createPointerEvent;
|
|
33
33
|
/**
|
|
@@ -38,7 +38,7 @@ export declare class DeviceEventFactory {
|
|
|
38
38
|
* @param currentState Current value for given input
|
|
39
39
|
* @param deviceInputSystem Reference to DeviceInputSystem
|
|
40
40
|
* @param elementToAttachTo HTMLElement to reference as target for inputs
|
|
41
|
-
* @returns
|
|
41
|
+
* @returns IUIEvent object (Wheel)
|
|
42
42
|
*/
|
|
43
43
|
private static _createWheelEvent;
|
|
44
44
|
/**
|
|
@@ -49,7 +49,7 @@ export declare class DeviceEventFactory {
|
|
|
49
49
|
* @param currentState Current value for given input
|
|
50
50
|
* @param deviceInputSystem Reference to DeviceInputSystem
|
|
51
51
|
* @param elementToAttachTo HTMLElement to reference as target for inputs
|
|
52
|
-
* @returns
|
|
52
|
+
* @returns IUIEvent object (Mouse)
|
|
53
53
|
*/
|
|
54
54
|
private static _createMouseEvent;
|
|
55
55
|
/**
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { EventConstants } from "../../Events/deviceInputEvents.js";
|
|
2
|
-
import { DeviceType, PointerInput } from "../InputDevices/deviceEnums.js";
|
|
2
|
+
import { DeviceType, NativePointerInput, PointerInput } from "../InputDevices/deviceEnums.js";
|
|
3
3
|
/**
|
|
4
4
|
* Class to wrap DeviceInputSystem data into an event object
|
|
5
5
|
*/
|
|
@@ -15,7 +15,7 @@ var DeviceEventFactory = /** @class */ (function () {
|
|
|
15
15
|
* @param currentState Current value for given input
|
|
16
16
|
* @param deviceInputSystem Reference to DeviceInputSystem
|
|
17
17
|
* @param elementToAttachTo HTMLElement to reference as target for inputs
|
|
18
|
-
* @returns
|
|
18
|
+
* @returns IUIEvent object
|
|
19
19
|
*/
|
|
20
20
|
DeviceEventFactory.CreateDeviceEvent = function (deviceType, deviceSlot, inputIndex, currentState, deviceInputSystem, elementToAttachTo) {
|
|
21
21
|
switch (deviceType) {
|
|
@@ -40,11 +40,20 @@ var DeviceEventFactory = /** @class */ (function () {
|
|
|
40
40
|
* @param currentState Current value for given input
|
|
41
41
|
* @param deviceInputSystem Reference to DeviceInputSystem
|
|
42
42
|
* @param elementToAttachTo HTMLElement to reference as target for inputs
|
|
43
|
-
* @returns
|
|
43
|
+
* @returns IUIEvent object (Pointer)
|
|
44
44
|
*/
|
|
45
45
|
DeviceEventFactory._createPointerEvent = function (deviceType, deviceSlot, inputIndex, currentState, deviceInputSystem, elementToAttachTo) {
|
|
46
46
|
var evt = this._createMouseEvent(deviceType, deviceSlot, inputIndex, currentState, deviceInputSystem, elementToAttachTo);
|
|
47
|
-
|
|
47
|
+
if (deviceType === DeviceType.Mouse) {
|
|
48
|
+
evt.deviceType = DeviceType.Mouse;
|
|
49
|
+
evt.pointerId = 1;
|
|
50
|
+
evt.pointerType = "mouse";
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
evt.deviceType = DeviceType.Touch;
|
|
54
|
+
evt.pointerId = deviceSlot;
|
|
55
|
+
evt.pointerType = "touch";
|
|
56
|
+
}
|
|
48
57
|
if (inputIndex === PointerInput.Move) {
|
|
49
58
|
evt.type = "pointermove";
|
|
50
59
|
}
|
|
@@ -62,7 +71,7 @@ var DeviceEventFactory = /** @class */ (function () {
|
|
|
62
71
|
* @param currentState Current value for given input
|
|
63
72
|
* @param deviceInputSystem Reference to DeviceInputSystem
|
|
64
73
|
* @param elementToAttachTo HTMLElement to reference as target for inputs
|
|
65
|
-
* @returns
|
|
74
|
+
* @returns IUIEvent object (Wheel)
|
|
66
75
|
*/
|
|
67
76
|
DeviceEventFactory._createWheelEvent = function (deviceType, deviceSlot, inputIndex, currentState, deviceInputSystem, elementToAttachTo) {
|
|
68
77
|
var evt = this._createMouseEvent(deviceType, deviceSlot, inputIndex, currentState, deviceInputSystem, elementToAttachTo);
|
|
@@ -81,27 +90,33 @@ var DeviceEventFactory = /** @class */ (function () {
|
|
|
81
90
|
* @param currentState Current value for given input
|
|
82
91
|
* @param deviceInputSystem Reference to DeviceInputSystem
|
|
83
92
|
* @param elementToAttachTo HTMLElement to reference as target for inputs
|
|
84
|
-
* @returns
|
|
93
|
+
* @returns IUIEvent object (Mouse)
|
|
85
94
|
*/
|
|
86
95
|
DeviceEventFactory._createMouseEvent = function (deviceType, deviceSlot, inputIndex, currentState, deviceInputSystem, elementToAttachTo) {
|
|
87
96
|
var evt = this._createEvent(elementToAttachTo);
|
|
88
97
|
var pointerX = deviceInputSystem.pollInput(deviceType, deviceSlot, PointerInput.Horizontal);
|
|
89
98
|
var pointerY = deviceInputSystem.pollInput(deviceType, deviceSlot, PointerInput.Vertical);
|
|
90
|
-
//
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
99
|
+
// Handle offsets/deltas based on existence of HTMLElement
|
|
100
|
+
if (elementToAttachTo) {
|
|
101
|
+
evt.movementX = 0;
|
|
102
|
+
evt.movementY = 0;
|
|
103
|
+
evt.offsetX = evt.movementX - elementToAttachTo.getBoundingClientRect().x;
|
|
104
|
+
evt.offsetY = evt.movementY - elementToAttachTo.getBoundingClientRect().y;
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
evt.movementX = deviceInputSystem.pollInput(deviceType, deviceSlot, NativePointerInput.DeltaHorizontal); // DeltaHorizontal
|
|
108
|
+
evt.movementY = deviceInputSystem.pollInput(deviceType, deviceSlot, NativePointerInput.DeltaVertical); // DeltaVertical
|
|
109
|
+
evt.offsetX = 0;
|
|
110
|
+
evt.offsetY = 0;
|
|
111
|
+
}
|
|
96
112
|
this._checkNonCharacterKeys(evt, deviceInputSystem);
|
|
97
113
|
evt.clientX = pointerX;
|
|
98
114
|
evt.clientY = pointerY;
|
|
99
|
-
evt.movementX = movementX;
|
|
100
|
-
evt.movementY = movementY;
|
|
101
|
-
evt.offsetX = offsetX;
|
|
102
|
-
evt.offsetY = offsetY;
|
|
103
115
|
evt.x = pointerX;
|
|
104
116
|
evt.y = pointerY;
|
|
117
|
+
evt.deviceType = deviceType;
|
|
118
|
+
evt.deviceSlot = deviceSlot;
|
|
119
|
+
evt.inputIndex = inputIndex;
|
|
105
120
|
return evt;
|
|
106
121
|
};
|
|
107
122
|
/**
|
|
@@ -115,6 +130,9 @@ var DeviceEventFactory = /** @class */ (function () {
|
|
|
115
130
|
DeviceEventFactory._createKeyboardEvent = function (inputIndex, currentState, deviceInputSystem, elementToAttachTo) {
|
|
116
131
|
var evt = this._createEvent(elementToAttachTo);
|
|
117
132
|
this._checkNonCharacterKeys(evt, deviceInputSystem);
|
|
133
|
+
evt.deviceType = DeviceType.Keyboard;
|
|
134
|
+
evt.deviceSlot = 0;
|
|
135
|
+
evt.inputIndex = inputIndex;
|
|
118
136
|
evt.type = currentState === 1 ? "keydown" : "keyup";
|
|
119
137
|
evt.key = String.fromCharCode(inputIndex);
|
|
120
138
|
evt.keyCode = inputIndex;
|