1 |
- {"ast":null,"code":"import { __decorate } from \"../tslib.es6.js\";\nimport { serialize, serializeAsVector3, serializeAsMeshReference, serializeAsVector2 } from \"../Misc/decorators.js\";\nimport { Observable } from \"../Misc/observable.js\";\nimport { Matrix, Vector3, Vector2, TmpVectors, Quaternion } from \"../Maths/math.vector.js\";\nimport { Clamp } from \"../Maths/math.scalar.functions.js\";\nimport { Node } from \"../node.js\";\nimport { Mesh } from \"../Meshes/mesh.js\";\nimport { AutoRotationBehavior } from \"../Behaviors/Cameras/autoRotationBehavior.js\";\nimport { BouncingBehavior } from \"../Behaviors/Cameras/bouncingBehavior.js\";\nimport { FramingBehavior } from \"../Behaviors/Cameras/framingBehavior.js\";\nimport { Camera } from \"./camera.js\";\nimport { TargetCamera } from \"./targetCamera.js\";\nimport { ArcRotateCameraInputsManager } from \"../Cameras/arcRotateCameraInputsManager.js\";\nimport { Epsilon } from \"../Maths/math.constants.js\";\nimport { Tools } from \"../Misc/tools.js\";\nimport { RegisterClass } from \"../Misc/typeStore.js\";\nNode.AddNodeConstructor(\"ArcRotateCamera\", (name, scene) => {\n return () => new ArcRotateCamera(name, 0, 0, 1.0, Vector3.Zero(), scene);\n});\n/**\n * This represents an orbital type of camera.\n *\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.\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.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/camera_introduction#arc-rotate-camera\n */\nexport class ArcRotateCamera extends TargetCamera {\n /**\n * Defines the target point of the camera.\n * The camera looks towards it from the radius distance.\n */\n get target() {\n return this._target;\n }\n set target(value) {\n this.setTarget(value);\n }\n /**\n * Defines the target transform node of the camera.\n * The camera looks towards it from the radius distance.\n * Please note that setting a target host will disable panning.\n */\n get targetHost() {\n return this._targetHost;\n }\n set targetHost(value) {\n if (value) {\n this.setTarget(value);\n }\n }\n /**\n * Return the current target position of the camera. This value is expressed in local space.\n * @returns the target position\n */\n getTarget() {\n return this.target;\n }\n /**\n * Define the current local position of the camera in the scene\n */\n get position() {\n return this._position;\n }\n set position(newPosition) {\n this.setPosition(newPosition);\n }\n /**\n * The vector the camera should consider as up. (default is Vector3(0, 1, 0) as returned by Vector3.Up())\n * Setting this will copy the given vector to the camera's upVector, and set rotation matrices to and from Y up.\n * DO NOT set the up vector using copyFrom or copyFromFloats, as this bypasses setting the above matrices.\n */\n set upVector(vec) {\n if (!this._upToYMatrix) {\n this._yToUpMatrix = new Matrix();\n this._upToYMatrix = new Matrix();\n this._upVector = Vector3.Zero();\n }\n vec.normalize();\n this._upVector.copyFrom(vec);\n this.setMatUp();\n }\n get upVector() {\n return this._upVector;\n }\n /**\n * Sets the Y-up to camera up-vector rotation matrix, and the up-vector to Y-up rotation matrix.\n */\n setMatUp() {\n // from y-up to custom-up (used in _getViewMatrix)\n Matrix.RotationAlignToRef(Vector3.UpReadOnly, this._upVector, this._yToUpMatrix);\n // from custom-up to y-up (used in rebuildAnglesAndRadius)\n Matrix.RotationAlignToRef(this._upVector, Vector3.UpReadOnly, this._upToYMatrix);\n }\n //-- begin properties for backward compatibility for inputs\n /**\n * Gets or Set the pointer angular sensibility along the X axis or how fast is the camera rotating.\n */\n get angularSensibilityX() {\n const pointers = this.inputs.attached[\"pointers\"];\n if (pointers) {\n return pointers.angularSensibilityX;\n }\n return 0;\n }\n set angularSensibilityX(value) {\n const pointers = this.inputs.attached[\"pointers\"];\n if (pointers) {\n pointers.angularSensibilityX = value;\n }\n }\n /**\n * Gets or Set the pointer angular sensibility along the Y axis or how fast is the camera rotating.\n */\n get angularSensibilityY() {\n const pointers = this.inputs.attached[\"pointers\"];\n if (pointers) {\n return pointers.angularSensibilityY;\n }\n return 0;\n }\n set angularSensibilityY(value) {\n const pointers = this.inputs.attached[\"pointers\"];\n if (pointers) {\n pointers.angularSensibilityY = value;\n }\n }\n /**\n * Gets or Set the pointer pinch precision or how fast is the camera zooming.\n */\n get pinchPrecision() {\n const pointers = this.inputs.attached[\"pointers\"];\n if (pointers) {\n return pointers.pinchPrecision;\n }\n return 0;\n }\n set pinchPrecision(value) {\n const pointers = this.inputs.attached[\"pointers\"];\n if (pointers) {\n pointers.pinchPrecision = value;\n }\n }\n /**\n * Gets or Set the pointer pinch delta percentage or how fast is the camera zooming.\n * It will be used instead of pinchPrecision if different from 0.\n * It defines the percentage of current camera.radius to use as delta when pinch zoom is used.\n */\n get pinchDeltaPercentage() {\n const pointers = this.inputs.attached[\"pointers\"];\n if (pointers) {\n return pointers.pinchDeltaPercentage;\n }\n return 0;\n }\n set pinchDeltaPercentage(value) {\n const pointers = this.inputs.attached[\"pointers\"];\n if (pointers) {\n pointers.pinchDeltaPercentage = value;\n }\n }\n /**\n * Gets or Set the pointer use natural pinch zoom to override the pinch precision\n * and pinch delta percentage.\n * When useNaturalPinchZoom is true, multi touch zoom will zoom in such\n * that any object in the plane at the camera's target point will scale\n * perfectly with finger motion.\n */\n get useNaturalPinchZoom() {\n const pointers = this.inputs.attached[\"pointers\"];\n if (pointers) {\n return pointers.useNaturalPinchZoom;\n }\n return false;\n }\n set useNaturalPinchZoom(value) {\n const pointers = this.inputs.attached[\"pointers\"];\n if (pointers) {\n pointers.useNaturalPinchZoom = value;\n }\n }\n /**\n * Gets or Set the pointer panning sensibility or how fast is the camera moving.\n */\n get panningSensibility() {\n const pointers = this.inputs.attached[\"pointers\"];\n if (pointers) {\n return pointers.panningSensibility;\n }\n return 0;\n }\n set panningSensibility(value) {\n const pointers = this.inputs.attached[\"pointers\"];\n if (pointers) {\n pointers.panningSensibility = value;\n }\n }\n /**\n * Gets or Set the list of keyboard keys used to control beta angle in a positive direction.\n */\n get keysUp() {\n const keyboard = this.inputs.attached[\"keyboard\"];\n if (keyboard) {\n return keyboard.keysUp;\n }\n return [];\n }\n set keysUp(value) {\n const keyboard = this.inputs.attached[\"keyboard\"];\n if (keyboard) {\n keyboard.keysUp = value;\n }\n }\n /**\n * Gets or Set the list of keyboard keys used to control beta angle in a negative direction.\n */\n get keysDown() {\n const keyboard = this.inputs.attached[\"keyboard\"];\n if (keyboard) {\n return keyboard.keysDown;\n }\n return [];\n }\n set keysDown(value) {\n const keyboard = this.inputs.attached[\"keyboard\"];\n if (keyboard) {\n keyboard.keysDown = value;\n }\n }\n /**\n * Gets or Set the list of keyboard keys used to control alpha angle in a negative direction.\n */\n get keysLeft() {\n const keyboard = this.inputs.attached[\"keyboard\"];\n if (keyboard) {\n return keyboard.keysLeft;\n }\n return [];\n }\n set keysLeft(value) {\n const keyboard = this.inputs.attached[\"keyboard\"];\n if (keyboard) {\n keyboard.keysLeft = value;\n }\n }\n /**\n * Gets or Set the list of keyboard keys used to control alpha angle in a positive direction.\n */\n get keysRight() {\n const keyboard = this.inputs.attached[\"keyboard\"];\n if (keyboard) {\n return keyboard.keysRight;\n }\n return [];\n }\n set keysRight(value) {\n const keyboard = this.inputs.attached[\"keyboard\"];\n if (keyboard) {\n keyboard.keysRight = value;\n }\n }\n /**\n * Gets or Set the mouse wheel precision or how fast is the camera zooming.\n */\n get wheelPrecision() {\n const mousewheel = this.inputs.attached[\"mousewheel\"];\n if (mousewheel) {\n return mousewheel.wheelPrecision;\n }\n return 0;\n }\n set wheelPrecision(value) {\n const mousewheel = this.inputs.attached[\"mousewheel\"];\n if (mousewheel) {\n mousewheel.wheelPrecision = value;\n }\n }\n /**\n * Gets or Set the boolean value that controls whether or not the mouse wheel\n * zooms to the location of the mouse pointer or not. The default is false.\n */\n get zoomToMouseLocation() {\n const mousewheel = this.inputs.attached[\"mousewheel\"];\n if (mousewheel) {\n return mousewheel.zoomToMouseLocation;\n }\n return false;\n }\n set zoomToMouseLocation(value) {\n const mousewheel = this.inputs.attached[\"mousewheel\"];\n if (mousewheel) {\n mousewheel.zoomToMouseLocation = value;\n }\n }\n /**\n * Gets or Set the mouse wheel delta percentage or how fast is the camera zooming.\n * It will be used instead of wheelPrecision if different from 0.\n * It defines the percentage of current camera.radius to use as delta when wheel zoom is used.\n */\n get wheelDeltaPercentage() {\n const mousewheel = this.inputs.attached[\"mousewheel\"];\n if (mousewheel) {\n return mousewheel.wheelDeltaPercentage;\n }\n return 0;\n }\n set wheelDeltaPercentage(value) {\n const mousewheel = this.inputs.attached[\"mousewheel\"];\n if (mousewheel) {\n mousewheel.wheelDeltaPercentage = value;\n }\n }\n /**\n * Gets the bouncing behavior of the camera if it has been enabled.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/behaviors/cameraBehaviors#bouncing-behavior\n */\n get bouncingBehavior() {\n return this._bouncingBehavior;\n }\n /**\n * Defines if the bouncing behavior of the camera is enabled on the camera.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/behaviors/cameraBehaviors#bouncing-behavior\n */\n get useBouncingBehavior() {\n return this._bouncingBehavior != null;\n }\n set useBouncingBehavior(value) {\n if (value === this.useBouncingBehavior) {\n return;\n }\n if (value) {\n this._bouncingBehavior = new BouncingBehavior();\n this.addBehavior(this._bouncingBehavior);\n } else if (this._bouncingBehavior) {\n this.removeBehavior(this._bouncingBehavior);\n this._bouncingBehavior = null;\n }\n }\n /**\n * Gets the framing behavior of the camera if it has been enabled.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/behaviors/cameraBehaviors#framing-behavior\n */\n get framingBehavior() {\n return this._framingBehavior;\n }\n /**\n * Defines if the framing behavior of the camera is enabled on the camera.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/behaviors/cameraBehaviors#framing-behavior\n */\n get useFramingBehavior() {\n return this._framingBehavior != null;\n }\n set useFramingBehavior(value) {\n if (value === this.useFramingBehavior) {\n return;\n }\n if (value) {\n this._framingBehavior = new FramingBehavior();\n this.addBehavior(this._framingBehavior);\n } else if (this._framingBehavior) {\n this.removeBehavior(this._framingBehavior);\n this._framingBehavior = null;\n }\n }\n /**\n * Gets the auto rotation behavior of the camera if it has been enabled.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/behaviors/cameraBehaviors#autorotation-behavior\n */\n get autoRotationBehavior() {\n return this._autoRotationBehavior;\n }\n /**\n * Defines if the auto rotation behavior of the camera is enabled on the camera.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/behaviors/cameraBehaviors#autorotation-behavior\n */\n get useAutoRotationBehavior() {\n return this._autoRotationBehavior != null;\n }\n set useAutoRotationBehavior(value) {\n if (value === this.useAutoRotationBehavior) {\n return;\n }\n if (value) {\n this._autoRotationBehavior = new AutoRotationBehavior();\n this.addBehavior(this._autoRotationBehavior);\n } else if (this._autoRotationBehavior) {\n this.removeBehavior(this._autoRotationBehavior);\n this._autoRotationBehavior = null;\n }\n }\n /**\n * Instantiates a new ArcRotateCamera in a given scene\n * @param name Defines the name of the camera\n * @param alpha Defines the camera rotation along the longitudinal axis\n * @param beta Defines the camera rotation along the latitudinal axis\n * @param radius Defines the camera distance from its target\n * @param target Defines the camera target\n * @param scene Defines the scene the camera belongs to\n * @param setActiveOnSceneIfNoneActive Defines whether the camera should be marked as active if not other active cameras have been defined\n */\n constructor(name, alpha, beta, radius, target, scene, setActiveOnSceneIfNoneActive = true) {\n super(name, Vector3.Zero(), scene, setActiveOnSceneIfNoneActive);\n /**\n * Current inertia value on the longitudinal axis.\n * The bigger this number the longer it will take for the camera to stop.\n */\n this.inertialAlphaOffset = 0;\n /**\n * Current inertia value on the latitudinal axis.\n * The bigger this number the longer it will take for the camera to stop.\n */\n this.inertialBetaOffset = 0;\n /**\n * Current inertia value on the radius axis.\n * The bigger this number the longer it will take for the camera to stop.\n */\n this.inertialRadiusOffset = 0;\n /**\n * Minimum allowed angle on the longitudinal axis.\n * This can help limiting how the Camera is able to move in the scene.\n */\n this.lowerAlphaLimit = null;\n /**\n * Maximum allowed angle on the longitudinal axis.\n * This can help limiting how the Camera is able to move in the scene.\n */\n this.upperAlphaLimit = null;\n /**\n * Minimum allowed angle on the latitudinal axis.\n * This can help limiting how the Camera is able to move in the scene.\n */\n this.lowerBetaLimit = 0.01;\n /**\n * Maximum allowed angle on the latitudinal axis.\n * This can help limiting how the Camera is able to move in the scene.\n */\n this.upperBetaLimit = Math.PI - 0.01;\n /**\n * Minimum allowed distance of the camera to the target (The camera can not get closer).\n * This can help limiting how the Camera is able to move in the scene.\n */\n this.lowerRadiusLimit = null;\n /**\n * Maximum allowed distance of the camera to the target (The camera can not get further).\n * This can help limiting how the Camera is able to move in the scene.\n */\n this.upperRadiusLimit = null;\n /**\n * Defines the current inertia value used during panning of the camera along the X axis.\n */\n this.inertialPanningX = 0;\n /**\n * Defines the current inertia value used during panning of the camera along the Y axis.\n */\n this.inertialPanningY = 0;\n /**\n * Defines the distance used to consider the camera in pan mode vs pinch/zoom.\n * Basically if your fingers moves away from more than this distance you will be considered\n * in pinch mode.\n */\n this.pinchToPanMaxDistance = 20;\n /**\n * Defines the maximum distance the camera can pan.\n * This could help keeping the camera always in your scene.\n */\n this.panningDistanceLimit = null;\n /**\n * Defines the target of the camera before panning.\n */\n this.panningOriginTarget = Vector3.Zero();\n /**\n * Defines the value of the inertia used during panning.\n * 0 would mean stop inertia and one would mean no deceleration at all.\n */\n this.panningInertia = 0.9;\n //-- end properties for backward compatibility for inputs\n /**\n * Defines how much the radius should be scaled while zooming on a particular mesh (through the zoomOn function)\n */\n this.zoomOnFactor = 1;\n /**\n * Defines a screen offset for the camera position.\n */\n this.targetScreenOffset = Vector2.Zero();\n /**\n * Allows the camera to be completely reversed.\n * If false the camera can not arrive upside down.\n */\n this.allowUpsideDown = true;\n /**\n * Define if double tap/click is used to restore the previously saved state of the camera.\n */\n this.useInputToRestoreState = true;\n /**\n * Factor for restoring information interpolation. default is 0 = off. Any value \\< 0 or \\> 1 will disable interpolation.\n */\n this.restoreStateInterpolationFactor = 0;\n /** @internal */\n this._viewMatrix = new Matrix();\n /**\n * Defines the allowed panning axis.\n */\n this.panningAxis = new Vector3(1, 1, 0);\n this._transformedDirection = new Vector3();\n /**\n * Defines if camera will eliminate transform on y axis.\n */\n this.mapPanning = false;\n // restoring state progressively\n this._progressiveRestore = false;\n /**\n * Observable triggered when the transform node target has been changed on the camera.\n */\n this.onMeshTargetChangedObservable = new Observable();\n /**\n * Defines whether the camera should check collision with the objects oh the scene.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/camera_collisions#how-can-i-do-this-\n */\n this.checkCollisions = false;\n /**\n * Defines the collision radius of the camera.\n * This simulates a sphere around the camera.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/camera_collisions#arcrotatecamera\n */\n this.collisionRadius = new Vector3(0.5, 0.5, 0.5);\n this._previousPosition = Vector3.Zero();\n this._collisionVelocity = Vector3.Zero();\n this._newPosition = Vector3.Zero();\n this._computationVector = Vector3.Zero();\n this._onCollisionPositionChange = (collisionId, newPosition, collidedMesh = null) => {\n if (!collidedMesh) {\n this._previousPosition.copyFrom(this._position);\n } else {\n this.setPosition(newPosition);\n if (this.onCollide) {\n this.onCollide(collidedMesh);\n }\n }\n // Recompute because of constraints\n const cosa = Math.cos(this.alpha);\n const sina = Math.sin(this.alpha);\n const cosb = Math.cos(this.beta);\n let sinb = Math.sin(this.beta);\n if (sinb === 0) {\n sinb = 0.0001;\n }\n const target = this._getTargetPosition();\n this._computationVector.copyFromFloats(this.radius * cosa * sinb, this.radius * cosb, this.radius * sina * sinb);\n target.addToRef(this._computationVector, this._newPosition);\n this._position.copyFrom(this._newPosition);\n let up = this.upVector;\n if (this.allowUpsideDown && this.beta < 0) {\n up = up.clone();\n up = up.negate();\n }\n this._computeViewMatrix(this._position, target, up);\n this._viewMatrix.addAtIndex(12, this.targetScreenOffset.x);\n this._viewMatrix.addAtIndex(13, this.targetScreenOffset.y);\n this._collisionTriggered = false;\n };\n this._target = Vector3.Zero();\n if (target) {\n this.setTarget(target);\n }\n this.alpha = alpha;\n this.beta = beta;\n this.radius = radius;\n this.getViewMatrix();\n this.inputs = new ArcRotateCameraInputsManager(this);\n this.inputs.addKeyboard().addMouseWheel().addPointers();\n }\n // Cache\n /** @internal */\n _initCache() {\n super._initCache();\n this._cache._target = new Vector3(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE);\n this._cache.alpha = undefined;\n this._cache.beta = undefined;\n this._cache.radius = undefined;\n this._cache.targetScreenOffset = Vector2.Zero();\n }\n /**\n * @internal\n */\n _updateCache(ignoreParentClass) {\n if (!ignoreParentClass) {\n super._updateCache();\n }\n this._cache._target.copyFrom(this._getTargetPosition());\n this._cache.alpha = this.alpha;\n this._cache.beta = this.beta;\n this._cache.radius = this.radius;\n this._cache.targetScreenOffset.copyFrom(this.targetScreenOffset);\n }\n _getTargetPosition() {\n if (this._targetHost && this._targetHost.getAbsolutePosition) {\n const pos = this._targetHost.getAbsolutePosition();\n if (this._targetBoundingCenter) {\n pos.addToRef(this._targetBoundingCenter, this._target);\n } else {\n this._target.copyFrom(pos);\n }\n }\n const lockedTargetPosition = this._getLockedTargetPosition();\n if (lockedTargetPosition) {\n return lockedTargetPosition;\n }\n return this._target;\n }\n /**\n * Stores the current state of the camera (alpha, beta, radius and target)\n * @returns the camera itself\n */\n storeState() {\n this._storedAlpha = this._goalAlpha = this.alpha;\n this._storedBeta = this._goalBeta = this.beta;\n this._storedRadius = this._goalRadius = this.radius;\n this._storedTarget = this._goalTarget = this._getTargetPosition().clone();\n this._storedTargetScreenOffset = this._goalTargetScreenOffset = this.targetScreenOffset.clone();\n return super.storeState();\n }\n /**\n * @internal\n * Restored camera state. You must call storeState() first\n */\n _restoreStateValues() {\n if (this.hasStateStored() && this.restoreStateInterpolationFactor > Epsilon && this.restoreStateInterpolationFactor < 1) {\n this.interpolateTo(this._storedAlpha, this._storedBeta, this._storedRadius, this._storedTarget, this._storedTargetScreenOffset);\n return true;\n }\n if (!super._restoreStateValues()) {\n return false;\n }\n this.setTarget(this._storedTarget.clone());\n this.alpha = this._storedAlpha;\n this.beta = this._storedBeta;\n this.radius = this._storedRadius;\n this.targetScreenOffset = this._storedTargetScreenOffset.clone();\n this.inertialAlphaOffset = 0;\n this.inertialBetaOffset = 0;\n this.inertialRadiusOffset = 0;\n this.inertialPanningX = 0;\n this.inertialPanningY = 0;\n return true;\n }\n /**\n * Interpolates the camera to a goal state.\n * @param alpha Defines the goal alpha.\n * @param beta Defines the goal beta.\n * @param radius Defines the goal radius.\n * @param target Defines the goal target.\n * @param targetScreenOffset Defines the goal target screen offset.\n */\n interpolateTo(alpha = this.alpha, beta = this.beta, radius = this.radius, target = this.target, targetScreenOffset = this.targetScreenOffset) {\n var _this$lowerAlphaLimit, _this$upperAlphaLimit, _this$lowerBetaLimit, _this$upperBetaLimit, _this$lowerRadiusLimi, _this$upperRadiusLimi;\n this._progressiveRestore = true;\n this.inertialAlphaOffset = 0;\n this.inertialBetaOffset = 0;\n this.inertialRadiusOffset = 0;\n this.inertialPanningX = 0;\n this.inertialPanningY = 0;\n alpha = Clamp(alpha, (_this$lowerAlphaLimit = this.lowerAlphaLimit) !== null && _this$lowerAlphaLimit !== void 0 ? _this$lowerAlphaLimit : -Infinity, (_this$upperAlphaLimit = this.upperAlphaLimit) !== null && _this$upperAlphaLimit !== void 0 ? _this$upperAlphaLimit : Infinity);\n beta = Clamp(beta, (_this$lowerBetaLimit = this.lowerBetaLimit) !== null && _this$lowerBetaLimit !== void 0 ? _this$lowerBetaLimit : -Infinity, (_this$upperBetaLimit = this.upperBetaLimit) !== null && _this$upperBetaLimit !== void 0 ? _this$upperBetaLimit : Infinity);\n radius = Clamp(radius, (_this$lowerRadiusLimi = this.lowerRadiusLimit) !== null && _this$lowerRadiusLimi !== void 0 ? _this$lowerRadiusLimi : -Infinity, (_this$upperRadiusLimi = this.upperRadiusLimit) !== null && _this$upperRadiusLimi !== void 0 ? _this$upperRadiusLimi : Infinity);\n this._goalAlpha = alpha;\n this._goalBeta = beta;\n this._goalRadius = radius;\n this._goalTarget = target;\n this._goalTargetScreenOffset = targetScreenOffset;\n }\n // Synchronized\n /** @internal */\n _isSynchronizedViewMatrix() {\n if (!super._isSynchronizedViewMatrix()) {\n return false;\n }\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);\n }\n /**\n * Attached controls to the current camera.\n * @param ignored defines an ignored parameter kept for backward compatibility.\n * @param noPreventDefault Defines whether event caught by the controls should call preventdefault() (https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault)\n * @param useCtrlForPanning Defines whether ctrl is used for panning within the controls\n * @param panningMouseButton Defines whether panning is allowed through mouse click button\n */\n attachControl(ignored, noPreventDefault, useCtrlForPanning = true, panningMouseButton = 2) {\n // eslint-disable-next-line prefer-rest-params\n const args = arguments;\n noPreventDefault = Tools.BackCompatCameraNoPreventDefault(args);\n this._useCtrlForPanning = useCtrlForPanning;\n this._panningMouseButton = panningMouseButton;\n // backwards compatibility\n if (typeof args[0] === \"boolean\") {\n if (args.length > 1) {\n this._useCtrlForPanning = args[1];\n }\n if (args.length > 2) {\n this._panningMouseButton = args[2];\n }\n }\n this.inputs.attachElement(noPreventDefault);\n this._reset = () => {\n this.inertialAlphaOffset = 0;\n this.inertialBetaOffset = 0;\n this.inertialRadiusOffset = 0;\n this.inertialPanningX = 0;\n this.inertialPanningY = 0;\n };\n }\n /**\n * Detach the current controls from the specified dom element.\n */\n detachControl() {\n this.inputs.detachElement();\n if (this._reset) {\n this._reset();\n }\n }\n /** @internal */\n _checkInputs() {\n //if (async) collision inspection was triggered, don't update the camera's position - until the collision callback was called.\n if (this._collisionTriggered) {\n return;\n }\n this.inputs.checkInputs();\n // progressive restore\n if (this._progressiveRestore) {\n const dt = this._scene.getEngine().getDeltaTime() / 1000;\n const t = 1 - Math.pow(2, -dt / this.restoreStateInterpolationFactor);\n // can't use tmp vector here because of assignment\n this.setTarget(Vector3.Lerp(this.getTarget(), this._goalTarget, t));\n // Using quaternion for smoother interpolation (and no Euler angles modulo)\n Quaternion.RotationAlphaBetaGammaToRef(this._goalAlpha, this._goalBeta, 0, TmpVectors.Quaternion[0]);\n Quaternion.RotationAlphaBetaGammaToRef(this.alpha, this.beta, 0, TmpVectors.Quaternion[1]);\n Quaternion.SlerpToRef(TmpVectors.Quaternion[1], TmpVectors.Quaternion[0], t, TmpVectors.Quaternion[2]);\n TmpVectors.Quaternion[2].normalize();\n TmpVectors.Quaternion[2].toAlphaBetaGammaToRef(TmpVectors.Vector3[0]);\n this.alpha = TmpVectors.Vector3[0].x;\n this.beta = TmpVectors.Vector3[0].y;\n this.radius += (this._goalRadius - this.radius) * t;\n Vector2.LerpToRef(this.targetScreenOffset, this._goalTargetScreenOffset, t, this.targetScreenOffset);\n // stop restoring when within close range or when user starts interacting\n if (Vector3.DistanceSquared(this.getTarget(), this._goalTarget) < Epsilon && TmpVectors.Quaternion[2].equalsWithEpsilon(TmpVectors.Quaternion[0]) && Math.pow(this._goalRadius - this.radius, 2) < Epsilon && Vector2.Distance(this.targetScreenOffset, this._goalTargetScreenOffset) < Epsilon || this.inertialAlphaOffset !== 0 || this.inertialBetaOffset !== 0 || this.inertialRadiusOffset !== 0 || this.inertialPanningX !== 0 || this.inertialPanningY !== 0) {\n this._progressiveRestore = false;\n }\n }\n // Inertia\n if (this.inertialAlphaOffset !== 0 || this.inertialBetaOffset !== 0 || this.inertialRadiusOffset !== 0) {\n const directionModifier = this.invertRotation ? -1 : 1;\n const handednessMultiplier = this._calculateHandednessMultiplier();\n let inertialAlphaOffset = this.inertialAlphaOffset * handednessMultiplier;\n if (this.beta < 0) {\n inertialAlphaOffset *= -1;\n }\n this.alpha += inertialAlphaOffset * directionModifier;\n this.beta += this.inertialBetaOffset * directionModifier;\n this.radius -= this.inertialRadiusOffset;\n this.inertialAlphaOffset *= this.inertia;\n this.inertialBetaOffset *= this.inertia;\n this.inertialRadiusOffset *= this.inertia;\n if (Math.abs(this.inertialAlphaOffset) < Epsilon) {\n this.inertialAlphaOffset = 0;\n }\n if (Math.abs(this.inertialBetaOffset) < Epsilon) {\n this.inertialBetaOffset = 0;\n }\n if (Math.abs(this.inertialRadiusOffset) < this.speed * Epsilon) {\n this.inertialRadiusOffset = 0;\n }\n }\n // Panning inertia\n if (this.inertialPanningX !== 0 || this.inertialPanningY !== 0) {\n const localDirection = new Vector3(this.inertialPanningX, this.inertialPanningY, this.inertialPanningY);\n this._viewMatrix.invertToRef(this._cameraTransformMatrix);\n localDirection.multiplyInPlace(this.panningAxis);\n Vector3.TransformNormalToRef(localDirection, this._cameraTransformMatrix, this._transformedDirection);\n // If mapPanning is enabled, we need to take the upVector into account and\n // make sure we're not panning in the y direction\n if (this.mapPanning) {\n const up = this.upVector;\n const right = Vector3.CrossToRef(this._transformedDirection, up, this._transformedDirection);\n Vector3.CrossToRef(up, right, this._transformedDirection);\n } else if (!this.panningAxis.y) {\n this._transformedDirection.y = 0;\n }\n if (!this._targetHost) {\n if (this.panningDistanceLimit) {\n this._transformedDirection.addInPlace(this._target);\n const distanceSquared = Vector3.DistanceSquared(this._transformedDirection, this.panningOriginTarget);\n if (distanceSquared <= this.panningDistanceLimit * this.panningDistanceLimit) {\n this._target.copyFrom(this._transformedDirection);\n }\n } else {\n if (this.parent) {\n const m = TmpVectors.Matrix[0];\n this.parent.getWorldMatrix().getRotationMatrixToRef(m);\n m.transposeToRef(m);\n Vector3.TransformCoordinatesToRef(this._transformedDirection, m, this._transformedDirection);\n }\n this._target.addInPlace(this._transformedDirection);\n }\n }\n this.inertialPanningX *= this.panningInertia;\n this.inertialPanningY *= this.panningInertia;\n if (Math.abs(this.inertialPanningX) < this.speed * Epsilon) {\n this.inertialPanningX = 0;\n }\n if (Math.abs(this.inertialPanningY) < this.speed * Epsilon) {\n this.inertialPanningY = 0;\n }\n }\n // Limits\n this._checkLimits();\n super._checkInputs();\n }\n _checkLimits() {\n if (this.lowerBetaLimit === null || this.lowerBetaLimit === undefined) {\n if (this.allowUpsideDown && this.beta > Math.PI) {\n this.beta = this.beta - 2 * Math.PI;\n }\n } else {\n if (this.beta < this.lowerBetaLimit) {\n this.beta = this.lowerBetaLimit;\n }\n }\n if (this.upperBetaLimit === null || this.upperBetaLimit === undefined) {\n if (this.allowUpsideDown && this.beta < -Math.PI) {\n this.beta = this.beta + 2 * Math.PI;\n }\n } else {\n if (this.beta > this.upperBetaLimit) {\n this.beta = this.upperBetaLimit;\n }\n }\n if (this.lowerAlphaLimit !== null && this.alpha < this.lowerAlphaLimit) {\n this.alpha = this.lowerAlphaLimit;\n }\n if (this.upperAlphaLimit !== null && this.alpha > this.upperAlphaLimit) {\n this.alpha = this.upperAlphaLimit;\n }\n if (this.lowerRadiusLimit !== null && this.radius < this.lowerRadiusLimit) {\n this.radius = this.lowerRadiusLimit;\n this.inertialRadiusOffset = 0;\n }\n if (this.upperRadiusLimit !== null && this.radius > this.upperRadiusLimit) {\n this.radius = this.upperRadiusLimit;\n this.inertialRadiusOffset = 0;\n }\n }\n /**\n * Rebuilds angles (alpha, beta) and radius from the give position and target\n */\n rebuildAnglesAndRadius() {\n this._position.subtractToRef(this._getTargetPosition(), this._computationVector);\n // need to rotate to Y up equivalent if up vector not Axis.Y\n if (this._upVector.x !== 0 || this._upVector.y !== 1.0 || this._upVector.z !== 0) {\n Vector3.TransformCoordinatesToRef(this._computationVector, this._upToYMatrix, this._computationVector);\n }\n this.radius = this._computationVector.length();\n if (this.radius === 0) {\n this.radius = 0.0001; // Just to avoid division by zero\n }\n // Alpha\n const previousAlpha = this.alpha;\n if (this._computationVector.x === 0 && this._computationVector.z === 0) {\n this.alpha = Math.PI / 2; // avoid division by zero when looking along up axis, and set to acos(0)\n } else {\n this.alpha = Math.acos(this._computationVector.x / Math.sqrt(Math.pow(this._computationVector.x, 2) + Math.pow(this._computationVector.z, 2)));\n }\n if (this._computationVector.z < 0) {\n this.alpha = 2 * Math.PI - this.alpha;\n }\n // Calculate the number of revolutions between the new and old alpha values.\n const alphaCorrectionTurns = Math.round((previousAlpha - this.alpha) / (2.0 * Math.PI));\n // Adjust alpha so that its numerical representation is the closest one to the old value.\n this.alpha += alphaCorrectionTurns * 2.0 * Math.PI;\n // Beta\n this.beta = Math.acos(this._computationVector.y / this.radius);\n this._checkLimits();\n }\n /**\n * Use a position to define the current camera related information like alpha, beta and radius\n * @param position Defines the position to set the camera at\n */\n setPosition(position) {\n if (this._position.equals(position)) {\n return;\n }\n this._position.copyFrom(position);\n this.rebuildAnglesAndRadius();\n }\n /**\n * Defines the target the camera should look at.\n * This will automatically adapt alpha beta and radius to fit within the new target.\n * Please note that setting a target as a mesh will disable panning.\n * @param target Defines the new target as a Vector or a transform node\n * @param toBoundingCenter In case of a mesh target, defines whether to target the mesh position or its bounding information center\n * @param allowSamePosition If false, prevents reapplying the new computed position if it is identical to the current one (optim)\n * @param cloneAlphaBetaRadius If true, replicate the current setup (alpha, beta, radius) on the new target\n */\n setTarget(target, toBoundingCenter = false, allowSamePosition = false, cloneAlphaBetaRadius = false) {\n var _this$overrideCloneAl;\n cloneAlphaBetaRadius = (_this$overrideCloneAl = this.overrideCloneAlphaBetaRadius) !== null && _this$overrideCloneAl !== void 0 ? _this$overrideCloneAl : cloneAlphaBetaRadius;\n if (target.computeWorldMatrix) {\n if (toBoundingCenter && target.getBoundingInfo) {\n this._targetBoundingCenter = target.getBoundingInfo().boundingBox.centerWorld.clone();\n } else {\n this._targetBoundingCenter = null;\n }\n target.computeWorldMatrix();\n this._targetHost = target;\n this._target = this._getTargetPosition();\n this.onMeshTargetChangedObservable.notifyObservers(this._targetHost);\n } else {\n const newTarget = target;\n const currentTarget = this._getTargetPosition();\n if (currentTarget && !allowSamePosition && currentTarget.equals(newTarget)) {\n return;\n }\n this._targetHost = null;\n this._target = newTarget;\n this._targetBoundingCenter = null;\n this.onMeshTargetChangedObservable.notifyObservers(null);\n }\n if (!cloneAlphaBetaRadius) {\n this.rebuildAnglesAndRadius();\n }\n }\n /** @internal */\n _getViewMatrix() {\n // Compute\n const cosa = Math.cos(this.alpha);\n const sina = Math.sin(this.alpha);\n const cosb = Math.cos(this.beta);\n let sinb = Math.sin(this.beta);\n if (sinb === 0) {\n sinb = 0.0001;\n }\n if (this.radius === 0) {\n this.radius = 0.0001; // Just to avoid division by zero\n }\n const target = this._getTargetPosition();\n this._computationVector.copyFromFloats(this.radius * cosa * sinb, this.radius * cosb, this.radius * sina * sinb);\n // Rotate according to up vector\n if (this._upVector.x !== 0 || this._upVector.y !== 1.0 || this._upVector.z !== 0) {\n Vector3.TransformCoordinatesToRef(this._computationVector, this._yToUpMatrix, this._computationVector);\n }\n target.addToRef(this._computationVector, this._newPosition);\n if (this.getScene().collisionsEnabled && this.checkCollisions) {\n const coordinator = this.getScene().collisionCoordinator;\n if (!this._collider) {\n this._collider = coordinator.createCollider();\n }\n this._collider._radius = this.collisionRadius;\n this._newPosition.subtractToRef(this._position, this._collisionVelocity);\n this._collisionTriggered = true;\n coordinator.getNewPosition(this._position, this._collisionVelocity, this._collider, 3, null, this._onCollisionPositionChange, this.uniqueId);\n } else {\n this._position.copyFrom(this._newPosition);\n let up = this.upVector;\n if (this.allowUpsideDown && sinb < 0) {\n up = up.negate();\n }\n this._computeViewMatrix(this._position, target, up);\n this._viewMatrix.addAtIndex(12, this.targetScreenOffset.x);\n this._viewMatrix.addAtIndex(13, this.targetScreenOffset.y);\n }\n this._currentTarget = target;\n return this._viewMatrix;\n }\n /**\n * Zooms on a mesh to be at the min distance where we could see it fully in the current viewport.\n * @param meshes Defines the mesh to zoom on\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)\n */\n zoomOn(meshes, doNotUpdateMaxZ = false) {\n meshes = meshes || this.getScene().meshes;\n const minMaxVector = Mesh.MinMax(meshes);\n let distance = this._calculateLowerRadiusFromModelBoundingSphere(minMaxVector.min, minMaxVector.max);\n // If there are defined limits, we need to take them into account\n distance = Math.max(Math.min(distance, this.upperRadiusLimit || Number.MAX_VALUE), this.lowerRadiusLimit || 0);\n this.radius = distance * this.zoomOnFactor;\n this.focusOn({\n min: minMaxVector.min,\n max: minMaxVector.max,\n distance: distance\n }, doNotUpdateMaxZ);\n }\n /**\n * Focus on a mesh or a bounding box. This adapts the target and maxRadius if necessary but does not update the current radius.\n * The target will be changed but the radius\n * @param meshesOrMinMaxVectorAndDistance Defines the mesh or bounding info to focus on\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)\n */\n focusOn(meshesOrMinMaxVectorAndDistance, doNotUpdateMaxZ = false) {\n let meshesOrMinMaxVector;\n let distance;\n if (meshesOrMinMaxVectorAndDistance.min === undefined) {\n // meshes\n const meshes = meshesOrMinMaxVectorAndDistance || this.getScene().meshes;\n meshesOrMinMaxVector = Mesh.MinMax(meshes);\n distance = Vector3.Distance(meshesOrMinMaxVector.min, meshesOrMinMaxVector.max);\n } else {\n //minMaxVector and distance\n const minMaxVectorAndDistance = meshesOrMinMaxVectorAndDistance;\n meshesOrMinMaxVector = minMaxVectorAndDistance;\n distance = minMaxVectorAndDistance.distance;\n }\n this._target = Mesh.Center(meshesOrMinMaxVector);\n if (!doNotUpdateMaxZ) {\n this.maxZ = distance * 2;\n }\n }\n /**\n * @override\n * Override Camera.createRigCamera\n * @param name the name of the camera\n * @param cameraIndex the index of the camera in the rig cameras array\n */\n createRigCamera(name, cameraIndex) {\n let alphaShift = 0;\n switch (this.cameraRigMode) {\n case Camera.RIG_MODE_STEREOSCOPIC_ANAGLYPH:\n case Camera.RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_PARALLEL:\n case Camera.RIG_MODE_STEREOSCOPIC_OVERUNDER:\n case Camera.RIG_MODE_STEREOSCOPIC_INTERLACED:\n case Camera.RIG_MODE_VR:\n alphaShift = this._cameraRigParams.stereoHalfAngle * (cameraIndex === 0 ? 1 : -1);\n break;\n case Camera.RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_CROSSEYED:\n alphaShift = this._cameraRigParams.stereoHalfAngle * (cameraIndex === 0 ? -1 : 1);\n break;\n }\n const rigCam = new ArcRotateCamera(name, this.alpha + alphaShift, this.beta, this.radius, this._target, this.getScene());\n rigCam._cameraRigParams = {};\n rigCam.isRigCamera = true;\n rigCam.rigParent = this;\n rigCam.upVector = this.upVector;\n rigCam.mode = this.mode;\n rigCam.orthoLeft = this.orthoLeft;\n rigCam.orthoRight = this.orthoRight;\n rigCam.orthoBottom = this.orthoBottom;\n rigCam.orthoTop = this.orthoTop;\n return rigCam;\n }\n /**\n * @internal\n * @override\n * Override Camera._updateRigCameras\n */\n _updateRigCameras() {\n const camLeft = this._rigCameras[0];\n const camRight = this._rigCameras[1];\n camLeft.beta = camRight.beta = this.beta;\n switch (this.cameraRigMode) {\n case Camera.RIG_MODE_STEREOSCOPIC_ANAGLYPH:\n case Camera.RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_PARALLEL:\n case Camera.RIG_MODE_STEREOSCOPIC_OVERUNDER:\n case Camera.RIG_MODE_STEREOSCOPIC_INTERLACED:\n case Camera.RIG_MODE_VR:\n camLeft.alpha = this.alpha - this._cameraRigParams.stereoHalfAngle;\n camRight.alpha = this.alpha + this._cameraRigParams.stereoHalfAngle;\n break;\n case Camera.RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_CROSSEYED:\n camLeft.alpha = this.alpha + this._cameraRigParams.stereoHalfAngle;\n camRight.alpha = this.alpha - this._cameraRigParams.stereoHalfAngle;\n break;\n }\n super._updateRigCameras();\n }\n /**\n * @internal\n */\n _calculateLowerRadiusFromModelBoundingSphere(minimumWorld, maximumWorld, radiusScale = 1) {\n const boxVectorGlobalDiagonal = Vector3.Distance(minimumWorld, maximumWorld);\n // Get aspect ratio in order to calculate frustum slope\n const engine = this.getScene().getEngine();\n const aspectRatio = engine.getAspectRatio(this);\n const frustumSlopeY = Math.tan(this.fov / 2);\n const frustumSlopeX = frustumSlopeY * aspectRatio;\n // Formula for setting distance\n // (Good explanation: http://stackoverflow.com/questions/2866350/move-camera-to-fit-3d-scene)\n const radiusWithoutFraming = boxVectorGlobalDiagonal * 0.5;\n // Horizon distance\n const radius = radiusWithoutFraming * radiusScale;\n const distanceForHorizontalFrustum = radius * Math.sqrt(1.0 + 1.0 / (frustumSlopeX * frustumSlopeX));\n const distanceForVerticalFrustum = radius * Math.sqrt(1.0 + 1.0 / (frustumSlopeY * frustumSlopeY));\n return Math.max(distanceForHorizontalFrustum, distanceForVerticalFrustum);\n }\n /**\n * Destroy the camera and release the current resources hold by it.\n */\n dispose() {\n this.inputs.clear();\n super.dispose();\n }\n /**\n * Gets the current object class name.\n * @returns the class name\n */\n getClassName() {\n return \"ArcRotateCamera\";\n }\n}\n__decorate([serialize()], ArcRotateCamera.prototype, \"alpha\", void 0);\n__decorate([serialize()], ArcRotateCamera.prototype, \"beta\", void 0);\n__decorate([serialize()], ArcRotateCamera.prototype, \"radius\", void 0);\n__decorate([serialize()], ArcRotateCamera.prototype, \"overrideCloneAlphaBetaRadius\", void 0);\n__decorate([serializeAsVector3(\"target\")], ArcRotateCamera.prototype, \"_target\", void 0);\n__decorate([serializeAsMeshReference(\"targetHost\")], ArcRotateCamera.prototype, \"_targetHost\", void 0);\n__decorate([serialize()], ArcRotateCamera.prototype, \"inertialAlphaOffset\", void 0);\n__decorate([serialize()], ArcRotateCamera.prototype, \"inertialBetaOffset\", void 0);\n__decorate([serialize()], ArcRotateCamera.prototype, \"inertialRadiusOffset\", void 0);\n__decorate([serialize()], ArcRotateCamera.prototype, \"lowerAlphaLimit\", void 0);\n__decorate([serialize()], ArcRotateCamera.prototype, \"upperAlphaLimit\", void 0);\n__decorate([serialize()], ArcRotateCamera.prototype, \"lowerBetaLimit\", void 0);\n__decorate([serialize()], ArcRotateCamera.prototype, \"upperBetaLimit\", void 0);\n__decorate([serialize()], ArcRotateCamera.prototype, \"lowerRadiusLimit\", void 0);\n__decorate([serialize()], ArcRotateCamera.prototype, \"upperRadiusLimit\", void 0);\n__decorate([serialize()], ArcRotateCamera.prototype, \"inertialPanningX\", void 0);\n__decorate([serialize()], ArcRotateCamera.prototype, \"inertialPanningY\", void 0);\n__decorate([serialize()], ArcRotateCamera.prototype, \"pinchToPanMaxDistance\", void 0);\n__decorate([serialize()], ArcRotateCamera.prototype, \"panningDistanceLimit\", void 0);\n__decorate([serializeAsVector3()], ArcRotateCamera.prototype, \"panningOriginTarget\", void 0);\n__decorate([serialize()], ArcRotateCamera.prototype, \"panningInertia\", void 0);\n__decorate([serialize()], ArcRotateCamera.prototype, \"zoomToMouseLocation\", null);\n__decorate([serialize()], ArcRotateCamera.prototype, \"zoomOnFactor\", void 0);\n__decorate([serializeAsVector2()], ArcRotateCamera.prototype, \"targetScreenOffset\", void 0);\n__decorate([serialize()], ArcRotateCamera.prototype, \"allowUpsideDown\", void 0);\n__decorate([serialize()], ArcRotateCamera.prototype, \"useInputToRestoreState\", void 0);\n__decorate([serialize()], ArcRotateCamera.prototype, \"restoreStateInterpolationFactor\", void 0);\n// Register Class Name\nRegisterClass(\"BABYLON.ArcRotateCamera\", ArcRotateCamera);","map":{"version":3,"names":["__decorate","serialize","serializeAsVector3","serializeAsMeshReference","serializeAsVector2","Observable","Matrix","Vector3","Vector2","TmpVectors","Quaternion","Clamp","Node","Mesh","AutoRotationBehavior","BouncingBehavior","FramingBehavior","Camera","TargetCamera","ArcRotateCameraInputsManager","Epsilon","Tools","RegisterClass","AddNodeConstructor","name","scene","ArcRotateCamera","Zero","target","_target","value","setTarget","targetHost","_targetHost","getTarget","position","_position","newPosition","setPosition","upVector","vec","_upToYMatrix","_yToUpMatrix","_upVector","normalize","copyFrom","setMatUp","RotationAlignToRef","UpReadOnly","angularSensibilityX","pointers","inputs","attached","angularSensibilityY","pinchPrecision","pinchDeltaPercentage","useNaturalPinchZoom","panningSensibility","keysUp","keyboard","keysDown","keysLeft","keysRight","wheelPrecision","mousewheel","zoomToMouseLocation","wheelDeltaPercentage","bouncingBehavior","_bouncingBehavior","useBouncingBehavior","addBehavior","removeBehavior","framingBehavior","_framingBehavior","useFramingBehavior","autoRotationBehavior","_autoRotationBehavior","useAutoRotationBehavior","constructor","alpha","beta","radius","setActiveOnSceneIfNoneActive","inertialAlphaOffset","inertialBetaOffset","inertialRadiusOffset","lowerAlphaLimit","upperAlphaLimit","lowerBetaLimit","upperBetaLimit","Math","PI","lowerRadiusLimit","upperRadiusLimit","inertialPanningX","inertialPanningY","pinchToPanMaxDistance","panningDistanceLimit","panningOriginTarget","panningInertia","zoomOnFactor","targetScreenOffset","allowUpsideDown","useInputToRestoreState","restoreStateInterpolationFactor","_viewMatrix","panningAxis","_transformedDirection","mapPanning","_progressiveRestore","onMeshTargetChangedObservable","checkCollisions","collisionRadius","_previousPosition","_collisionVelocity","_newPosition","_computationVector","_onCollisionPositionChange","collisionId","collidedMesh","onCollide","cosa","cos","sina","sin","cosb","sinb","_getTargetPosition","copyFromFloats","addToRef","up","clone","negate","_computeViewMatrix","addAtIndex","x","y","_collisionTriggered","getViewMatrix","addKeyboard","addMouseWheel","addPointers","_initCache","_cache","Number","MAX_VALUE","undefined","_updateCache","ignoreParentClass","getAbsolutePosition","pos","_targetBoundingCenter","lockedTargetPosition","_getLockedTargetPosition","storeState","_storedAlpha","_goalAlpha","_storedBeta","_goalBeta","_storedRadius","_goalRadius","_storedTarget","_goalTarget","_storedTargetScreenOffset","_goalTargetScreenOffset","_restoreStateValues","hasStateStored","interpolateTo","_this$lowerAlphaLimit","_this$upperAlphaLimit","_this$lowerBetaLimit","_this$upperBetaLimit","_this$lowerRadiusLimi","_this$upperRadiusLimi","Infinity","_isSynchronizedViewMatrix","equals","attachControl","ignored","noPreventDefault","useCtrlForPanning","panningMouseButton","args","arguments","BackCompatCameraNoPreventDefault","_useCtrlForPanning","_panningMouseButton","length","attachElement","_reset","detachControl","detachElement","_checkInputs","checkInputs","dt","_scene","getEngine","getDeltaTime","t","pow","Lerp","RotationAlphaBetaGammaToRef","SlerpToRef","toAlphaBetaGammaToRef","LerpToRef","DistanceSquared","equalsWithEpsilon","Distance","directionModifier","invertRotation","handednessMultiplier","_calculateHandednessMultiplier","inertia","abs","speed","localDirection","invertToRef","_cameraTransformMatrix","multiplyInPlace","TransformNormalToRef","right","CrossToRef","addInPlace","distanceSquared","parent","m","getWorldMatrix","getRotationMatrixToRef","transposeToRef","TransformCoordinatesToRef","_checkLimits","rebuildAnglesAndRadius","subtractToRef","z","previousAlpha","acos","sqrt","alphaCorrectionTurns","round","toBoundingCenter","allowSamePosition","cloneAlphaBetaRadius","_this$overrideCloneAl","overrideCloneAlphaBetaRadius","computeWorldMatrix","getBoundingInfo","boundingBox","centerWorld","notifyObservers","newTarget","currentTarget","_getViewMatrix","getScene","collisionsEnabled","coordinator","collisionCoordinator","_collider","createCollider","_radius","getNewPosition","uniqueId","_currentTarget","zoomOn","meshes","doNotUpdateMaxZ","minMaxVector","MinMax","distance","_calculateLowerRadiusFromModelBoundingSphere","min","max","focusOn","meshesOrMinMaxVectorAndDistance","meshesOrMinMaxVector","minMaxVectorAndDistance","Center","maxZ","createRigCamera","cameraIndex","alphaShift","cameraRigMode","RIG_MODE_STEREOSCOPIC_ANAGLYPH","RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_PARALLEL","RIG_MODE_STEREOSCOPIC_OVERUNDER","RIG_MODE_STEREOSCOPIC_INTERLACED","RIG_MODE_VR","_cameraRigParams","stereoHalfAngle","RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_CROSSEYED","rigCam","isRigCamera","rigParent","mode","orthoLeft","orthoRight","orthoBottom","orthoTop","_updateRigCameras","camLeft","_rigCameras","camRight","minimumWorld","maximumWorld","radiusScale","boxVectorGlobalDiagonal","engine","aspectRatio","getAspectRatio","frustumSlopeY","tan","fov","frustumSlopeX","radiusWithoutFraming","distanceForHorizontalFrustum","distanceForVerticalFrustum","dispose","clear","getClassName","prototype"],"sources":["F:/workspace/202226701027/huinongbao-app/node_modules/@babylonjs/core/Cameras/arcRotateCamera.js"],"sourcesContent":["import { __decorate } from \"../tslib.es6.js\";\nimport { serialize, serializeAsVector3, serializeAsMeshReference, serializeAsVector2 } from \"../Misc/decorators.js\";\nimport { Observable } from \"../Misc/observable.js\";\nimport { Matrix, Vector3, Vector2, TmpVectors, Quaternion } from \"../Maths/math.vector.js\";\nimport { Clamp } from \"../Maths/math.scalar.functions.js\";\nimport { Node } from \"../node.js\";\nimport { Mesh } from \"../Meshes/mesh.js\";\nimport { AutoRotationBehavior } from \"../Behaviors/Cameras/autoRotationBehavior.js\";\nimport { BouncingBehavior } from \"../Behaviors/Cameras/bouncingBehavior.js\";\nimport { FramingBehavior } from \"../Behaviors/Cameras/framingBehavior.js\";\nimport { Camera } from \"./camera.js\";\nimport { TargetCamera } from \"./targetCamera.js\";\nimport { ArcRotateCameraInputsManager } from \"../Cameras/arcRotateCameraInputsManager.js\";\nimport { Epsilon } from \"../Maths/math.constants.js\";\nimport { Tools } from \"../Misc/tools.js\";\nimport { RegisterClass } from \"../Misc/typeStore.js\";\nNode.AddNodeConstructor(\"ArcRotateCamera\", (name, scene) => {\n return () => new ArcRotateCamera(name, 0, 0, 1.0, Vector3.Zero(), scene);\n});\n/**\n * This represents an orbital type of camera.\n *\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.\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.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/camera_introduction#arc-rotate-camera\n */\nexport class ArcRotateCamera extends TargetCamera {\n /**\n * Defines the target point of the camera.\n * The camera looks towards it from the radius distance.\n */\n get target() {\n return this._target;\n }\n set target(value) {\n this.setTarget(value);\n }\n /**\n * Defines the target transform node of the camera.\n * The camera looks towards it from the radius distance.\n * Please note that setting a target host will disable panning.\n */\n get targetHost() {\n return this._targetHost;\n }\n set targetHost(value) {\n if (value) {\n this.setTarget(value);\n }\n }\n /**\n * Return the current target position of the camera. This value is expressed in local space.\n * @returns the target position\n */\n getTarget() {\n return this.target;\n }\n /**\n * Define the current local position of the camera in the scene\n */\n get position() {\n return this._position;\n }\n set position(newPosition) {\n this.setPosition(newPosition);\n }\n /**\n * The vector the camera should consider as up. (default is Vector3(0, 1, 0) as returned by Vector3.Up())\n * Setting this will copy the given vector to the camera's upVector, and set rotation matrices to and from Y up.\n * DO NOT set the up vector using copyFrom or copyFromFloats, as this bypasses setting the above matrices.\n */\n set upVector(vec) {\n if (!this._upToYMatrix) {\n this._yToUpMatrix = new Matrix();\n this._upToYMatrix = new Matrix();\n this._upVector = Vector3.Zero();\n }\n vec.normalize();\n this._upVector.copyFrom(vec);\n this.setMatUp();\n }\n get upVector() {\n return this._upVector;\n }\n /**\n * Sets the Y-up to camera up-vector rotation matrix, and the up-vector to Y-up rotation matrix.\n */\n setMatUp() {\n // from y-up to custom-up (used in _getViewMatrix)\n Matrix.RotationAlignToRef(Vector3.UpReadOnly, this._upVector, this._yToUpMatrix);\n // from custom-up to y-up (used in rebuildAnglesAndRadius)\n Matrix.RotationAlignToRef(this._upVector, Vector3.UpReadOnly, this._upToYMatrix);\n }\n //-- begin properties for backward compatibility for inputs\n /**\n * Gets or Set the pointer angular sensibility along the X axis or how fast is the camera rotating.\n */\n get angularSensibilityX() {\n const pointers = this.inputs.attached[\"pointers\"];\n if (pointers) {\n return pointers.angularSensibilityX;\n }\n return 0;\n }\n set angularSensibilityX(value) {\n const pointers = this.inputs.attached[\"pointers\"];\n if (pointers) {\n pointers.angularSensibilityX = value;\n }\n }\n /**\n * Gets or Set the pointer angular sensibility along the Y axis or how fast is the camera rotating.\n */\n get angularSensibilityY() {\n const pointers = this.inputs.attached[\"pointers\"];\n if (pointers) {\n return pointers.angularSensibilityY;\n }\n return 0;\n }\n set angularSensibilityY(value) {\n const pointers = this.inputs.attached[\"pointers\"];\n if (pointers) {\n pointers.angularSensibilityY = value;\n }\n }\n /**\n * Gets or Set the pointer pinch precision or how fast is the camera zooming.\n */\n get pinchPrecision() {\n const pointers = this.inputs.attached[\"pointers\"];\n if (pointers) {\n return pointers.pinchPrecision;\n }\n return 0;\n }\n set pinchPrecision(value) {\n const pointers = this.inputs.attached[\"pointers\"];\n if (pointers) {\n pointers.pinchPrecision = value;\n }\n }\n /**\n * Gets or Set the pointer pinch delta percentage or how fast is the camera zooming.\n * It will be used instead of pinchPrecision if different from 0.\n * It defines the percentage of current camera.radius to use as delta when pinch zoom is used.\n */\n get pinchDeltaPercentage() {\n const pointers = this.inputs.attached[\"pointers\"];\n if (pointers) {\n return pointers.pinchDeltaPercentage;\n }\n return 0;\n }\n set pinchDeltaPercentage(value) {\n const pointers = this.inputs.attached[\"pointers\"];\n if (pointers) {\n pointers.pinchDeltaPercentage = value;\n }\n }\n /**\n * Gets or Set the pointer use natural pinch zoom to override the pinch precision\n * and pinch delta percentage.\n * When useNaturalPinchZoom is true, multi touch zoom will zoom in such\n * that any object in the plane at the camera's target point will scale\n * perfectly with finger motion.\n */\n get useNaturalPinchZoom() {\n const pointers = this.inputs.attached[\"pointers\"];\n if (pointers) {\n return pointers.useNaturalPinchZoom;\n }\n return false;\n }\n set useNaturalPinchZoom(value) {\n const pointers = this.inputs.attached[\"pointers\"];\n if (pointers) {\n pointers.useNaturalPinchZoom = value;\n }\n }\n /**\n * Gets or Set the pointer panning sensibility or how fast is the camera moving.\n */\n get panningSensibility() {\n const pointers = this.inputs.attached[\"pointers\"];\n if (pointers) {\n return pointers.panningSensibility;\n }\n return 0;\n }\n set panningSensibility(value) {\n const pointers = this.inputs.attached[\"pointers\"];\n if (pointers) {\n pointers.panningSensibility = value;\n }\n }\n /**\n * Gets or Set the list of keyboard keys used to control beta angle in a positive direction.\n */\n get keysUp() {\n const keyboard = this.inputs.attached[\"keyboard\"];\n if (keyboard) {\n return keyboard.keysUp;\n }\n return [];\n }\n set keysUp(value) {\n const keyboard = this.inputs.attached[\"keyboard\"];\n if (keyboard) {\n keyboard.keysUp = value;\n }\n }\n /**\n * Gets or Set the list of keyboard keys used to control beta angle in a negative direction.\n */\n get keysDown() {\n const keyboard = this.inputs.attached[\"keyboard\"];\n if (keyboard) {\n return keyboard.keysDown;\n }\n return [];\n }\n set keysDown(value) {\n const keyboard = this.inputs.attached[\"keyboard\"];\n if (keyboard) {\n keyboard.keysDown = value;\n }\n }\n /**\n * Gets or Set the list of keyboard keys used to control alpha angle in a negative direction.\n */\n get keysLeft() {\n const keyboard = this.inputs.attached[\"keyboard\"];\n if (keyboard) {\n return keyboard.keysLeft;\n }\n return [];\n }\n set keysLeft(value) {\n const keyboard = this.inputs.attached[\"keyboard\"];\n if (keyboard) {\n keyboard.keysLeft = value;\n }\n }\n /**\n * Gets or Set the list of keyboard keys used to control alpha angle in a positive direction.\n */\n get keysRight() {\n const keyboard = this.inputs.attached[\"keyboard\"];\n if (keyboard) {\n return keyboard.keysRight;\n }\n return [];\n }\n set keysRight(value) {\n const keyboard = this.inputs.attached[\"keyboard\"];\n if (keyboard) {\n keyboard.keysRight = value;\n }\n }\n /**\n * Gets or Set the mouse wheel precision or how fast is the camera zooming.\n */\n get wheelPrecision() {\n const mousewheel = this.inputs.attached[\"mousewheel\"];\n if (mousewheel) {\n return mousewheel.wheelPrecision;\n }\n return 0;\n }\n set wheelPrecision(value) {\n const mousewheel = this.inputs.attached[\"mousewheel\"];\n if (mousewheel) {\n mousewheel.wheelPrecision = value;\n }\n }\n /**\n * Gets or Set the boolean value that controls whether or not the mouse wheel\n * zooms to the location of the mouse pointer or not. The default is false.\n */\n get zoomToMouseLocation() {\n const mousewheel = this.inputs.attached[\"mousewheel\"];\n if (mousewheel) {\n return mousewheel.zoomToMouseLocation;\n }\n return false;\n }\n set zoomToMouseLocation(value) {\n const mousewheel = this.inputs.attached[\"mousewheel\"];\n if (mousewheel) {\n mousewheel.zoomToMouseLocation = value;\n }\n }\n /**\n * Gets or Set the mouse wheel delta percentage or how fast is the camera zooming.\n * It will be used instead of wheelPrecision if different from 0.\n * It defines the percentage of current camera.radius to use as delta when wheel zoom is used.\n */\n get wheelDeltaPercentage() {\n const mousewheel = this.inputs.attached[\"mousewheel\"];\n if (mousewheel) {\n return mousewheel.wheelDeltaPercentage;\n }\n return 0;\n }\n set wheelDeltaPercentage(value) {\n const mousewheel = this.inputs.attached[\"mousewheel\"];\n if (mousewheel) {\n mousewheel.wheelDeltaPercentage = value;\n }\n }\n /**\n * Gets the bouncing behavior of the camera if it has been enabled.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/behaviors/cameraBehaviors#bouncing-behavior\n */\n get bouncingBehavior() {\n return this._bouncingBehavior;\n }\n /**\n * Defines if the bouncing behavior of the camera is enabled on the camera.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/behaviors/cameraBehaviors#bouncing-behavior\n */\n get useBouncingBehavior() {\n return this._bouncingBehavior != null;\n }\n set useBouncingBehavior(value) {\n if (value === this.useBouncingBehavior) {\n return;\n }\n if (value) {\n this._bouncingBehavior = new BouncingBehavior();\n this.addBehavior(this._bouncingBehavior);\n }\n else if (this._bouncingBehavior) {\n this.removeBehavior(this._bouncingBehavior);\n this._bouncingBehavior = null;\n }\n }\n /**\n * Gets the framing behavior of the camera if it has been enabled.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/behaviors/cameraBehaviors#framing-behavior\n */\n get framingBehavior() {\n return this._framingBehavior;\n }\n /**\n * Defines if the framing behavior of the camera is enabled on the camera.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/behaviors/cameraBehaviors#framing-behavior\n */\n get useFramingBehavior() {\n return this._framingBehavior != null;\n }\n set useFramingBehavior(value) {\n if (value === this.useFramingBehavior) {\n return;\n }\n if (value) {\n this._framingBehavior = new FramingBehavior();\n this.addBehavior(this._framingBehavior);\n }\n else if (this._framingBehavior) {\n this.removeBehavior(this._framingBehavior);\n this._framingBehavior = null;\n }\n }\n /**\n * Gets the auto rotation behavior of the camera if it has been enabled.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/behaviors/cameraBehaviors#autorotation-behavior\n */\n get autoRotationBehavior() {\n return this._autoRotationBehavior;\n }\n /**\n * Defines if the auto rotation behavior of the camera is enabled on the camera.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/behaviors/cameraBehaviors#autorotation-behavior\n */\n get useAutoRotationBehavior() {\n return this._autoRotationBehavior != null;\n }\n set useAutoRotationBehavior(value) {\n if (value === this.useAutoRotationBehavior) {\n return;\n }\n if (value) {\n this._autoRotationBehavior = new AutoRotationBehavior();\n this.addBehavior(this._autoRotationBehavior);\n }\n else if (this._autoRotationBehavior) {\n this.removeBehavior(this._autoRotationBehavior);\n this._autoRotationBehavior = null;\n }\n }\n /**\n * Instantiates a new ArcRotateCamera in a given scene\n * @param name Defines the name of the camera\n * @param alpha Defines the camera rotation along the longitudinal axis\n * @param beta Defines the camera rotation along the latitudinal axis\n * @param radius Defines the camera distance from its target\n * @param target Defines the camera target\n * @param scene Defines the scene the camera belongs to\n * @param setActiveOnSceneIfNoneActive Defines whether the camera should be marked as active if not other active cameras have been defined\n */\n constructor(name, alpha, beta, radius, target, scene, setActiveOnSceneIfNoneActive = true) {\n super(name, Vector3.Zero(), scene, setActiveOnSceneIfNoneActive);\n /**\n * Current inertia value on the longitudinal axis.\n * The bigger this number the longer it will take for the camera to stop.\n */\n this.inertialAlphaOffset = 0;\n /**\n * Current inertia value on the latitudinal axis.\n * The bigger this number the longer it will take for the camera to stop.\n */\n this.inertialBetaOffset = 0;\n /**\n * Current inertia value on the radius axis.\n * The bigger this number the longer it will take for the camera to stop.\n */\n this.inertialRadiusOffset = 0;\n /**\n * Minimum allowed angle on the longitudinal axis.\n * This can help limiting how the Camera is able to move in the scene.\n */\n this.lowerAlphaLimit = null;\n /**\n * Maximum allowed angle on the longitudinal axis.\n * This can help limiting how the Camera is able to move in the scene.\n */\n this.upperAlphaLimit = null;\n /**\n * Minimum allowed angle on the latitudinal axis.\n * This can help limiting how the Camera is able to move in the scene.\n */\n this.lowerBetaLimit = 0.01;\n /**\n * Maximum allowed angle on the latitudinal axis.\n * This can help limiting how the Camera is able to move in the scene.\n */\n this.upperBetaLimit = Math.PI - 0.01;\n /**\n * Minimum allowed distance of the camera to the target (The camera can not get closer).\n * This can help limiting how the Camera is able to move in the scene.\n */\n this.lowerRadiusLimit = null;\n /**\n * Maximum allowed distance of the camera to the target (The camera can not get further).\n * This can help limiting how the Camera is able to move in the scene.\n */\n this.upperRadiusLimit = null;\n /**\n * Defines the current inertia value used during panning of the camera along the X axis.\n */\n this.inertialPanningX = 0;\n /**\n * Defines the current inertia value used during panning of the camera along the Y axis.\n */\n this.inertialPanningY = 0;\n /**\n * Defines the distance used to consider the camera in pan mode vs pinch/zoom.\n * Basically if your fingers moves away from more than this distance you will be considered\n * in pinch mode.\n */\n this.pinchToPanMaxDistance = 20;\n /**\n * Defines the maximum distance the camera can pan.\n * This could help keeping the camera always in your scene.\n */\n this.panningDistanceLimit = null;\n /**\n * Defines the target of the camera before panning.\n */\n this.panningOriginTarget = Vector3.Zero();\n /**\n * Defines the value of the inertia used during panning.\n * 0 would mean stop inertia and one would mean no deceleration at all.\n */\n this.panningInertia = 0.9;\n //-- end properties for backward compatibility for inputs\n /**\n * Defines how much the radius should be scaled while zooming on a particular mesh (through the zoomOn function)\n */\n this.zoomOnFactor = 1;\n /**\n * Defines a screen offset for the camera position.\n */\n this.targetScreenOffset = Vector2.Zero();\n /**\n * Allows the camera to be completely reversed.\n * If false the camera can not arrive upside down.\n */\n this.allowUpsideDown = true;\n /**\n * Define if double tap/click is used to restore the previously saved state of the camera.\n */\n this.useInputToRestoreState = true;\n /**\n * Factor for restoring information interpolation. default is 0 = off. Any value \\< 0 or \\> 1 will disable interpolation.\n */\n this.restoreStateInterpolationFactor = 0;\n /** @internal */\n this._viewMatrix = new Matrix();\n /**\n * Defines the allowed panning axis.\n */\n this.panningAxis = new Vector3(1, 1, 0);\n this._transformedDirection = new Vector3();\n /**\n * Defines if camera will eliminate transform on y axis.\n */\n this.mapPanning = false;\n // restoring state progressively\n this._progressiveRestore = false;\n /**\n * Observable triggered when the transform node target has been changed on the camera.\n */\n this.onMeshTargetChangedObservable = new Observable();\n /**\n * Defines whether the camera should check collision with the objects oh the scene.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/camera_collisions#how-can-i-do-this-\n */\n this.checkCollisions = false;\n /**\n * Defines the collision radius of the camera.\n * This simulates a sphere around the camera.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/camera_collisions#arcrotatecamera\n */\n this.collisionRadius = new Vector3(0.5, 0.5, 0.5);\n this._previousPosition = Vector3.Zero();\n this._collisionVelocity = Vector3.Zero();\n this._newPosition = Vector3.Zero();\n this._computationVector = Vector3.Zero();\n this._onCollisionPositionChange = (collisionId, newPosition, collidedMesh = null) => {\n if (!collidedMesh) {\n this._previousPosition.copyFrom(this._position);\n }\n else {\n this.setPosition(newPosition);\n if (this.onCollide) {\n this.onCollide(collidedMesh);\n }\n }\n // Recompute because of constraints\n const cosa = Math.cos(this.alpha);\n const sina = Math.sin(this.alpha);\n const cosb = Math.cos(this.beta);\n let sinb = Math.sin(this.beta);\n if (sinb === 0) {\n sinb = 0.0001;\n }\n const target = this._getTargetPosition();\n this._computationVector.copyFromFloats(this.radius * cosa * sinb, this.radius * cosb, this.radius * sina * sinb);\n target.addToRef(this._computationVector, this._newPosition);\n this._position.copyFrom(this._newPosition);\n let up = this.upVector;\n if (this.allowUpsideDown && this.beta < 0) {\n up = up.clone();\n up = up.negate();\n }\n this._computeViewMatrix(this._position, target, up);\n this._viewMatrix.addAtIndex(12, this.targetScreenOffset.x);\n this._viewMatrix.addAtIndex(13, this.targetScreenOffset.y);\n this._collisionTriggered = false;\n };\n this._target = Vector3.Zero();\n if (target) {\n this.setTarget(target);\n }\n this.alpha = alpha;\n this.beta = beta;\n this.radius = radius;\n this.getViewMatrix();\n this.inputs = new ArcRotateCameraInputsManager(this);\n this.inputs.addKeyboard().addMouseWheel().addPointers();\n }\n // Cache\n /** @internal */\n _initCache() {\n super._initCache();\n this._cache._target = new Vector3(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE);\n this._cache.alpha = undefined;\n this._cache.beta = undefined;\n this._cache.radius = undefined;\n this._cache.targetScreenOffset = Vector2.Zero();\n }\n /**\n * @internal\n */\n _updateCache(ignoreParentClass) {\n if (!ignoreParentClass) {\n super._updateCache();\n }\n this._cache._target.copyFrom(this._getTargetPosition());\n this._cache.alpha = this.alpha;\n this._cache.beta = this.beta;\n this._cache.radius = this.radius;\n this._cache.targetScreenOffset.copyFrom(this.targetScreenOffset);\n }\n _getTargetPosition() {\n if (this._targetHost && this._targetHost.getAbsolutePosition) {\n const pos = this._targetHost.getAbsolutePosition();\n if (this._targetBoundingCenter) {\n pos.addToRef(this._targetBoundingCenter, this._target);\n }\n else {\n this._target.copyFrom(pos);\n }\n }\n const lockedTargetPosition = this._getLockedTargetPosition();\n if (lockedTargetPosition) {\n return lockedTargetPosition;\n }\n return this._target;\n }\n /**\n * Stores the current state of the camera (alpha, beta, radius and target)\n * @returns the camera itself\n */\n storeState() {\n this._storedAlpha = this._goalAlpha = this.alpha;\n this._storedBeta = this._goalBeta = this.beta;\n this._storedRadius = this._goalRadius = this.radius;\n this._storedTarget = this._goalTarget = this._getTargetPosition().clone();\n this._storedTargetScreenOffset = this._goalTargetScreenOffset = this.targetScreenOffset.clone();\n return super.storeState();\n }\n /**\n * @internal\n * Restored camera state. You must call storeState() first\n */\n _restoreStateValues() {\n if (this.hasStateStored() && this.restoreStateInterpolationFactor > Epsilon && this.restoreStateInterpolationFactor < 1) {\n this.interpolateTo(this._storedAlpha, this._storedBeta, this._storedRadius, this._storedTarget, this._storedTargetScreenOffset);\n return true;\n }\n if (!super._restoreStateValues()) {\n return false;\n }\n this.setTarget(this._storedTarget.clone());\n this.alpha = this._storedAlpha;\n this.beta = this._storedBeta;\n this.radius = this._storedRadius;\n this.targetScreenOffset = this._storedTargetScreenOffset.clone();\n this.inertialAlphaOffset = 0;\n this.inertialBetaOffset = 0;\n this.inertialRadiusOffset = 0;\n this.inertialPanningX = 0;\n this.inertialPanningY = 0;\n return true;\n }\n /**\n * Interpolates the camera to a goal state.\n * @param alpha Defines the goal alpha.\n * @param beta Defines the goal beta.\n * @param radius Defines the goal radius.\n * @param target Defines the goal target.\n * @param targetScreenOffset Defines the goal target screen offset.\n */\n interpolateTo(alpha = this.alpha, beta = this.beta, radius = this.radius, target = this.target, targetScreenOffset = this.targetScreenOffset) {\n this._progressiveRestore = true;\n this.inertialAlphaOffset = 0;\n this.inertialBetaOffset = 0;\n this.inertialRadiusOffset = 0;\n this.inertialPanningX = 0;\n this.inertialPanningY = 0;\n alpha = Clamp(alpha, this.lowerAlphaLimit ?? -Infinity, this.upperAlphaLimit ?? Infinity);\n beta = Clamp(beta, this.lowerBetaLimit ?? -Infinity, this.upperBetaLimit ?? Infinity);\n radius = Clamp(radius, this.lowerRadiusLimit ?? -Infinity, this.upperRadiusLimit ?? Infinity);\n this._goalAlpha = alpha;\n this._goalBeta = beta;\n this._goalRadius = radius;\n this._goalTarget = target;\n this._goalTargetScreenOffset = targetScreenOffset;\n }\n // Synchronized\n /** @internal */\n _isSynchronizedViewMatrix() {\n if (!super._isSynchronizedViewMatrix()) {\n return false;\n }\n return (this._cache._target.equals(this._getTargetPosition()) &&\n this._cache.alpha === this.alpha &&\n this._cache.beta === this.beta &&\n this._cache.radius === this.radius &&\n this._cache.targetScreenOffset.equals(this.targetScreenOffset));\n }\n /**\n * Attached controls to the current camera.\n * @param ignored defines an ignored parameter kept for backward compatibility.\n * @param noPreventDefault Defines whether event caught by the controls should call preventdefault() (https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault)\n * @param useCtrlForPanning Defines whether ctrl is used for panning within the controls\n * @param panningMouseButton Defines whether panning is allowed through mouse click button\n */\n attachControl(ignored, noPreventDefault, useCtrlForPanning = true, panningMouseButton = 2) {\n // eslint-disable-next-line prefer-rest-params\n const args = arguments;\n noPreventDefault = Tools.BackCompatCameraNoPreventDefault(args);\n this._useCtrlForPanning = useCtrlForPanning;\n this._panningMouseButton = panningMouseButton;\n // backwards compatibility\n if (typeof args[0] === \"boolean\") {\n if (args.length > 1) {\n this._useCtrlForPanning = args[1];\n }\n if (args.length > 2) {\n this._panningMouseButton = args[2];\n }\n }\n this.inputs.attachElement(noPreventDefault);\n this._reset = () => {\n this.inertialAlphaOffset = 0;\n this.inertialBetaOffset = 0;\n this.inertialRadiusOffset = 0;\n this.inertialPanningX = 0;\n this.inertialPanningY = 0;\n };\n }\n /**\n * Detach the current controls from the specified dom element.\n */\n detachControl() {\n this.inputs.detachElement();\n if (this._reset) {\n this._reset();\n }\n }\n /** @internal */\n _checkInputs() {\n //if (async) collision inspection was triggered, don't update the camera's position - until the collision callback was called.\n if (this._collisionTriggered) {\n return;\n }\n this.inputs.checkInputs();\n // progressive restore\n if (this._progressiveRestore) {\n const dt = this._scene.getEngine().getDeltaTime() / 1000;\n const t = 1 - Math.pow(2, -dt / this.restoreStateInterpolationFactor);\n // can't use tmp vector here because of assignment\n this.setTarget(Vector3.Lerp(this.getTarget(), this._goalTarget, t));\n // Using quaternion for smoother interpolation (and no Euler angles modulo)\n Quaternion.RotationAlphaBetaGammaToRef(this._goalAlpha, this._goalBeta, 0, TmpVectors.Quaternion[0]);\n Quaternion.RotationAlphaBetaGammaToRef(this.alpha, this.beta, 0, TmpVectors.Quaternion[1]);\n Quaternion.SlerpToRef(TmpVectors.Quaternion[1], TmpVectors.Quaternion[0], t, TmpVectors.Quaternion[2]);\n TmpVectors.Quaternion[2].normalize();\n TmpVectors.Quaternion[2].toAlphaBetaGammaToRef(TmpVectors.Vector3[0]);\n this.alpha = TmpVectors.Vector3[0].x;\n this.beta = TmpVectors.Vector3[0].y;\n this.radius += (this._goalRadius - this.radius) * t;\n Vector2.LerpToRef(this.targetScreenOffset, this._goalTargetScreenOffset, t, this.targetScreenOffset);\n // stop restoring when within close range or when user starts interacting\n if ((Vector3.DistanceSquared(this.getTarget(), this._goalTarget) < Epsilon &&\n TmpVectors.Quaternion[2].equalsWithEpsilon(TmpVectors.Quaternion[0]) &&\n Math.pow(this._goalRadius - this.radius, 2) < Epsilon &&\n Vector2.Distance(this.targetScreenOffset, this._goalTargetScreenOffset) < Epsilon) ||\n this.inertialAlphaOffset !== 0 ||\n this.inertialBetaOffset !== 0 ||\n this.inertialRadiusOffset !== 0 ||\n this.inertialPanningX !== 0 ||\n this.inertialPanningY !== 0) {\n this._progressiveRestore = false;\n }\n }\n // Inertia\n if (this.inertialAlphaOffset !== 0 || this.inertialBetaOffset !== 0 || this.inertialRadiusOffset !== 0) {\n const directionModifier = this.invertRotation ? -1 : 1;\n const handednessMultiplier = this._calculateHandednessMultiplier();\n let inertialAlphaOffset = this.inertialAlphaOffset * handednessMultiplier;\n if (this.beta < 0) {\n inertialAlphaOffset *= -1;\n }\n this.alpha += inertialAlphaOffset * directionModifier;\n this.beta += this.inertialBetaOffset * directionModifier;\n this.radius -= this.inertialRadiusOffset;\n this.inertialAlphaOffset *= this.inertia;\n this.inertialBetaOffset *= this.inertia;\n this.inertialRadiusOffset *= this.inertia;\n if (Math.abs(this.inertialAlphaOffset) < Epsilon) {\n this.inertialAlphaOffset = 0;\n }\n if (Math.abs(this.inertialBetaOffset) < Epsilon) {\n this.inertialBetaOffset = 0;\n }\n if (Math.abs(this.inertialRadiusOffset) < this.speed * Epsilon) {\n this.inertialRadiusOffset = 0;\n }\n }\n // Panning inertia\n if (this.inertialPanningX !== 0 || this.inertialPanningY !== 0) {\n const localDirection = new Vector3(this.inertialPanningX, this.inertialPanningY, this.inertialPanningY);\n this._viewMatrix.invertToRef(this._cameraTransformMatrix);\n localDirection.multiplyInPlace(this.panningAxis);\n Vector3.TransformNormalToRef(localDirection, this._cameraTransformMatrix, this._transformedDirection);\n // If mapPanning is enabled, we need to take the upVector into account and\n // make sure we're not panning in the y direction\n if (this.mapPanning) {\n const up = this.upVector;\n const right = Vector3.CrossToRef(this._transformedDirection, up, this._transformedDirection);\n Vector3.CrossToRef(up, right, this._transformedDirection);\n }\n else if (!this.panningAxis.y) {\n this._transformedDirection.y = 0;\n }\n if (!this._targetHost) {\n if (this.panningDistanceLimit) {\n this._transformedDirection.addInPlace(this._target);\n const distanceSquared = Vector3.DistanceSquared(this._transformedDirection, this.panningOriginTarget);\n if (distanceSquared <= this.panningDistanceLimit * this.panningDistanceLimit) {\n this._target.copyFrom(this._transformedDirection);\n }\n }\n else {\n if (this.parent) {\n const m = TmpVectors.Matrix[0];\n this.parent.getWorldMatrix().getRotationMatrixToRef(m);\n m.transposeToRef(m);\n Vector3.TransformCoordinatesToRef(this._transformedDirection, m, this._transformedDirection);\n }\n this._target.addInPlace(this._transformedDirection);\n }\n }\n this.inertialPanningX *= this.panningInertia;\n this.inertialPanningY *= this.panningInertia;\n if (Math.abs(this.inertialPanningX) < this.speed * Epsilon) {\n this.inertialPanningX = 0;\n }\n if (Math.abs(this.inertialPanningY) < this.speed * Epsilon) {\n this.inertialPanningY = 0;\n }\n }\n // Limits\n this._checkLimits();\n super._checkInputs();\n }\n _checkLimits() {\n if (this.lowerBetaLimit === null || this.lowerBetaLimit === undefined) {\n if (this.allowUpsideDown && this.beta > Math.PI) {\n this.beta = this.beta - 2 * Math.PI;\n }\n }\n else {\n if (this.beta < this.lowerBetaLimit) {\n this.beta = this.lowerBetaLimit;\n }\n }\n if (this.upperBetaLimit === null || this.upperBetaLimit === undefined) {\n if (this.allowUpsideDown && this.beta < -Math.PI) {\n this.beta = this.beta + 2 * Math.PI;\n }\n }\n else {\n if (this.beta > this.upperBetaLimit) {\n this.beta = this.upperBetaLimit;\n }\n }\n if (this.lowerAlphaLimit !== null && this.alpha < this.lowerAlphaLimit) {\n this.alpha = this.lowerAlphaLimit;\n }\n if (this.upperAlphaLimit !== null && this.alpha > this.upperAlphaLimit) {\n this.alpha = this.upperAlphaLimit;\n }\n if (this.lowerRadiusLimit !== null && this.radius < this.lowerRadiusLimit) {\n this.radius = this.lowerRadiusLimit;\n this.inertialRadiusOffset = 0;\n }\n if (this.upperRadiusLimit !== null && this.radius > this.upperRadiusLimit) {\n this.radius = this.upperRadiusLimit;\n this.inertialRadiusOffset = 0;\n }\n }\n /**\n * Rebuilds angles (alpha, beta) and radius from the give position and target\n */\n rebuildAnglesAndRadius() {\n this._position.subtractToRef(this._getTargetPosition(), this._computationVector);\n // need to rotate to Y up equivalent if up vector not Axis.Y\n if (this._upVector.x !== 0 || this._upVector.y !== 1.0 || this._upVector.z !== 0) {\n Vector3.TransformCoordinatesToRef(this._computationVector, this._upToYMatrix, this._computationVector);\n }\n this.radius = this._computationVector.length();\n if (this.radius === 0) {\n this.radius = 0.0001; // Just to avoid division by zero\n }\n // Alpha\n const previousAlpha = this.alpha;\n if (this._computationVector.x === 0 && this._computationVector.z === 0) {\n this.alpha = Math.PI / 2; // avoid division by zero when looking along up axis, and set to acos(0)\n }\n else {\n this.alpha = Math.acos(this._computationVector.x / Math.sqrt(Math.pow(this._computationVector.x, 2) + Math.pow(this._computationVector.z, 2)));\n }\n if (this._computationVector.z < 0) {\n this.alpha = 2 * Math.PI - this.alpha;\n }\n // Calculate the number of revolutions between the new and old alpha values.\n const alphaCorrectionTurns = Math.round((previousAlpha - this.alpha) / (2.0 * Math.PI));\n // Adjust alpha so that its numerical representation is the closest one to the old value.\n this.alpha += alphaCorrectionTurns * 2.0 * Math.PI;\n // Beta\n this.beta = Math.acos(this._computationVector.y / this.radius);\n this._checkLimits();\n }\n /**\n * Use a position to define the current camera related information like alpha, beta and radius\n * @param position Defines the position to set the camera at\n */\n setPosition(position) {\n if (this._position.equals(position)) {\n return;\n }\n this._position.copyFrom(position);\n this.rebuildAnglesAndRadius();\n }\n /**\n * Defines the target the camera should look at.\n * This will automatically adapt alpha beta and radius to fit within the new target.\n * Please note that setting a target as a mesh will disable panning.\n * @param target Defines the new target as a Vector or a transform node\n * @param toBoundingCenter In case of a mesh target, defines whether to target the mesh position or its bounding information center\n * @param allowSamePosition If false, prevents reapplying the new computed position if it is identical to the current one (optim)\n * @param cloneAlphaBetaRadius If true, replicate the current setup (alpha, beta, radius) on the new target\n */\n setTarget(target, toBoundingCenter = false, allowSamePosition = false, cloneAlphaBetaRadius = false) {\n cloneAlphaBetaRadius = this.overrideCloneAlphaBetaRadius ?? cloneAlphaBetaRadius;\n if (target.computeWorldMatrix) {\n if (toBoundingCenter && target.getBoundingInfo) {\n this._targetBoundingCenter = target.getBoundingInfo().boundingBox.centerWorld.clone();\n }\n else {\n this._targetBoundingCenter = null;\n }\n target.computeWorldMatrix();\n this._targetHost = target;\n this._target = this._getTargetPosition();\n this.onMeshTargetChangedObservable.notifyObservers(this._targetHost);\n }\n else {\n const newTarget = target;\n const currentTarget = this._getTargetPosition();\n if (currentTarget && !allowSamePosition && currentTarget.equals(newTarget)) {\n return;\n }\n this._targetHost = null;\n this._target = newTarget;\n this._targetBoundingCenter = null;\n this.onMeshTargetChangedObservable.notifyObservers(null);\n }\n if (!cloneAlphaBetaRadius) {\n this.rebuildAnglesAndRadius();\n }\n }\n /** @internal */\n _getViewMatrix() {\n // Compute\n const cosa = Math.cos(this.alpha);\n const sina = Math.sin(this.alpha);\n const cosb = Math.cos(this.beta);\n let sinb = Math.sin(this.beta);\n if (sinb === 0) {\n sinb = 0.0001;\n }\n if (this.radius === 0) {\n this.radius = 0.0001; // Just to avoid division by zero\n }\n const target = this._getTargetPosition();\n this._computationVector.copyFromFloats(this.radius * cosa * sinb, this.radius * cosb, this.radius * sina * sinb);\n // Rotate according to up vector\n if (this._upVector.x !== 0 || this._upVector.y !== 1.0 || this._upVector.z !== 0) {\n Vector3.TransformCoordinatesToRef(this._computationVector, this._yToUpMatrix, this._computationVector);\n }\n target.addToRef(this._computationVector, this._newPosition);\n if (this.getScene().collisionsEnabled && this.checkCollisions) {\n const coordinator = this.getScene().collisionCoordinator;\n if (!this._collider) {\n this._collider = coordinator.createCollider();\n }\n this._collider._radius = this.collisionRadius;\n this._newPosition.subtractToRef(this._position, this._collisionVelocity);\n this._collisionTriggered = true;\n coordinator.getNewPosition(this._position, this._collisionVelocity, this._collider, 3, null, this._onCollisionPositionChange, this.uniqueId);\n }\n else {\n this._position.copyFrom(this._newPosition);\n let up = this.upVector;\n if (this.allowUpsideDown && sinb < 0) {\n up = up.negate();\n }\n this._computeViewMatrix(this._position, target, up);\n this._viewMatrix.addAtIndex(12, this.targetScreenOffset.x);\n this._viewMatrix.addAtIndex(13, this.targetScreenOffset.y);\n }\n this._currentTarget = target;\n return this._viewMatrix;\n }\n /**\n * Zooms on a mesh to be at the min distance where we could see it fully in the current viewport.\n * @param meshes Defines the mesh to zoom on\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)\n */\n zoomOn(meshes, doNotUpdateMaxZ = false) {\n meshes = meshes || this.getScene().meshes;\n const minMaxVector = Mesh.MinMax(meshes);\n let distance = this._calculateLowerRadiusFromModelBoundingSphere(minMaxVector.min, minMaxVector.max);\n // If there are defined limits, we need to take them into account\n distance = Math.max(Math.min(distance, this.upperRadiusLimit || Number.MAX_VALUE), this.lowerRadiusLimit || 0);\n this.radius = distance * this.zoomOnFactor;\n this.focusOn({ min: minMaxVector.min, max: minMaxVector.max, distance: distance }, doNotUpdateMaxZ);\n }\n /**\n * Focus on a mesh or a bounding box. This adapts the target and maxRadius if necessary but does not update the current radius.\n * The target will be changed but the radius\n * @param meshesOrMinMaxVectorAndDistance Defines the mesh or bounding info to focus on\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)\n */\n focusOn(meshesOrMinMaxVectorAndDistance, doNotUpdateMaxZ = false) {\n let meshesOrMinMaxVector;\n let distance;\n if (meshesOrMinMaxVectorAndDistance.min === undefined) {\n // meshes\n const meshes = meshesOrMinMaxVectorAndDistance || this.getScene().meshes;\n meshesOrMinMaxVector = Mesh.MinMax(meshes);\n distance = Vector3.Distance(meshesOrMinMaxVector.min, meshesOrMinMaxVector.max);\n }\n else {\n //minMaxVector and distance\n const minMaxVectorAndDistance = meshesOrMinMaxVectorAndDistance;\n meshesOrMinMaxVector = minMaxVectorAndDistance;\n distance = minMaxVectorAndDistance.distance;\n }\n this._target = Mesh.Center(meshesOrMinMaxVector);\n if (!doNotUpdateMaxZ) {\n this.maxZ = distance * 2;\n }\n }\n /**\n * @override\n * Override Camera.createRigCamera\n * @param name the name of the camera\n * @param cameraIndex the index of the camera in the rig cameras array\n */\n createRigCamera(name, cameraIndex) {\n let alphaShift = 0;\n switch (this.cameraRigMode) {\n case Camera.RIG_MODE_STEREOSCOPIC_ANAGLYPH:\n case Camera.RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_PARALLEL:\n case Camera.RIG_MODE_STEREOSCOPIC_OVERUNDER:\n case Camera.RIG_MODE_STEREOSCOPIC_INTERLACED:\n case Camera.RIG_MODE_VR:\n alphaShift = this._cameraRigParams.stereoHalfAngle * (cameraIndex === 0 ? 1 : -1);\n break;\n case Camera.RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_CROSSEYED:\n alphaShift = this._cameraRigParams.stereoHalfAngle * (cameraIndex === 0 ? -1 : 1);\n break;\n }\n const rigCam = new ArcRotateCamera(name, this.alpha + alphaShift, this.beta, this.radius, this._target, this.getScene());\n rigCam._cameraRigParams = {};\n rigCam.isRigCamera = true;\n rigCam.rigParent = this;\n rigCam.upVector = this.upVector;\n rigCam.mode = this.mode;\n rigCam.orthoLeft = this.orthoLeft;\n rigCam.orthoRight = this.orthoRight;\n rigCam.orthoBottom = this.orthoBottom;\n rigCam.orthoTop = this.orthoTop;\n return rigCam;\n }\n /**\n * @internal\n * @override\n * Override Camera._updateRigCameras\n */\n _updateRigCameras() {\n const camLeft = this._rigCameras[0];\n const camRight = this._rigCameras[1];\n camLeft.beta = camRight.beta = this.beta;\n switch (this.cameraRigMode) {\n case Camera.RIG_MODE_STEREOSCOPIC_ANAGLYPH:\n case Camera.RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_PARALLEL:\n case Camera.RIG_MODE_STEREOSCOPIC_OVERUNDER:\n case Camera.RIG_MODE_STEREOSCOPIC_INTERLACED:\n case Camera.RIG_MODE_VR:\n camLeft.alpha = this.alpha - this._cameraRigParams.stereoHalfAngle;\n camRight.alpha = this.alpha + this._cameraRigParams.stereoHalfAngle;\n break;\n case Camera.RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_CROSSEYED:\n camLeft.alpha = this.alpha + this._cameraRigParams.stereoHalfAngle;\n camRight.alpha = this.alpha - this._cameraRigParams.stereoHalfAngle;\n break;\n }\n super._updateRigCameras();\n }\n /**\n * @internal\n */\n _calculateLowerRadiusFromModelBoundingSphere(minimumWorld, maximumWorld, radiusScale = 1) {\n const boxVectorGlobalDiagonal = Vector3.Distance(minimumWorld, maximumWorld);\n // Get aspect ratio in order to calculate frustum slope\n const engine = this.getScene().getEngine();\n const aspectRatio = engine.getAspectRatio(this);\n const frustumSlopeY = Math.tan(this.fov / 2);\n const frustumSlopeX = frustumSlopeY * aspectRatio;\n // Formula for setting distance\n // (Good explanation: http://stackoverflow.com/questions/2866350/move-camera-to-fit-3d-scene)\n const radiusWithoutFraming = boxVectorGlobalDiagonal * 0.5;\n // Horizon distance\n const radius = radiusWithoutFraming * radiusScale;\n const distanceForHorizontalFrustum = radius * Math.sqrt(1.0 + 1.0 / (frustumSlopeX * frustumSlopeX));\n const distanceForVerticalFrustum = radius * Math.sqrt(1.0 + 1.0 / (frustumSlopeY * frustumSlopeY));\n return Math.max(distanceForHorizontalFrustum, distanceForVerticalFrustum);\n }\n /**\n * Destroy the camera and release the current resources hold by it.\n */\n dispose() {\n this.inputs.clear();\n super.dispose();\n }\n /**\n * Gets the current object class name.\n * @returns the class name\n */\n getClassName() {\n return \"ArcRotateCamera\";\n }\n}\n__decorate([\n serialize()\n], ArcRotateCamera.prototype, \"alpha\", void 0);\n__decorate([\n serialize()\n], ArcRotateCamera.prototype, \"beta\", void 0);\n__decorate([\n serialize()\n], ArcRotateCamera.prototype, \"radius\", void 0);\n__decorate([\n serialize()\n], ArcRotateCamera.prototype, \"overrideCloneAlphaBetaRadius\", void 0);\n__decorate([\n serializeAsVector3(\"target\")\n], ArcRotateCamera.prototype, \"_target\", void 0);\n__decorate([\n serializeAsMeshReference(\"targetHost\")\n], ArcRotateCamera.prototype, \"_targetHost\", void 0);\n__decorate([\n serialize()\n], ArcRotateCamera.prototype, \"inertialAlphaOffset\", void 0);\n__decorate([\n serialize()\n], ArcRotateCamera.prototype, \"inertialBetaOffset\", void 0);\n__decorate([\n serialize()\n], ArcRotateCamera.prototype, \"inertialRadiusOffset\", void 0);\n__decorate([\n serialize()\n], ArcRotateCamera.prototype, \"lowerAlphaLimit\", void 0);\n__decorate([\n serialize()\n], ArcRotateCamera.prototype, \"upperAlphaLimit\", void 0);\n__decorate([\n serialize()\n], ArcRotateCamera.prototype, \"lowerBetaLimit\", void 0);\n__decorate([\n serialize()\n], ArcRotateCamera.prototype, \"upperBetaLimit\", void 0);\n__decorate([\n serialize()\n], ArcRotateCamera.prototype, \"lowerRadiusLimit\", void 0);\n__decorate([\n serialize()\n], ArcRotateCamera.prototype, \"upperRadiusLimit\", void 0);\n__decorate([\n serialize()\n], ArcRotateCamera.prototype, \"inertialPanningX\", void 0);\n__decorate([\n serialize()\n], ArcRotateCamera.prototype, \"inertialPanningY\", void 0);\n__decorate([\n serialize()\n], ArcRotateCamera.prototype, \"pinchToPanMaxDistance\", void 0);\n__decorate([\n serialize()\n], ArcRotateCamera.prototype, \"panningDistanceLimit\", void 0);\n__decorate([\n serializeAsVector3()\n], ArcRotateCamera.prototype, \"panningOriginTarget\", void 0);\n__decorate([\n serialize()\n], ArcRotateCamera.prototype, \"panningInertia\", void 0);\n__decorate([\n serialize()\n], ArcRotateCamera.prototype, \"zoomToMouseLocation\", null);\n__decorate([\n serialize()\n], ArcRotateCamera.prototype, \"zoomOnFactor\", void 0);\n__decorate([\n serializeAsVector2()\n], ArcRotateCamera.prototype, \"targetScreenOffset\", void 0);\n__decorate([\n serialize()\n], ArcRotateCamera.prototype, \"allowUpsideDown\", void 0);\n__decorate([\n serialize()\n], ArcRotateCamera.prototype, \"useInputToRestoreState\", void 0);\n__decorate([\n serialize()\n], ArcRotateCamera.prototype, \"restoreStateInterpolationFactor\", void 0);\n// Register Class Name\nRegisterClass(\"BABYLON.ArcRotateCamera\", ArcRotateCamera);\n"],"mappings":"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","ignoreList":[]},"metadata":{},"sourceType":"module","externalDependencies":[]}
|