@onerjs/core 8.53.1 → 8.53.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/Animations/animationGroup.pure.d.ts +2 -1
  2. package/Animations/animationGroup.pure.js +5 -1
  3. package/Animations/animationGroup.pure.js.map +1 -1
  4. package/Cameras/Inputs/flyCameraKeyboardInput.js +9 -1
  5. package/Cameras/Inputs/flyCameraKeyboardInput.js.map +1 -1
  6. package/Cameras/Inputs/flyCameraMouseInput.d.ts +2 -0
  7. package/Cameras/Inputs/flyCameraMouseInput.js +14 -2
  8. package/Cameras/Inputs/flyCameraMouseInput.js.map +1 -1
  9. package/Cameras/Inputs/freeCameraKeyboardMoveInput.js +25 -5
  10. package/Cameras/Inputs/freeCameraKeyboardMoveInput.js.map +1 -1
  11. package/Cameras/Inputs/freeCameraMouseInput.d.ts +14 -0
  12. package/Cameras/Inputs/freeCameraMouseInput.js +26 -4
  13. package/Cameras/Inputs/freeCameraMouseInput.js.map +1 -1
  14. package/Cameras/Inputs/freeCameraTouchInput.js +16 -5
  15. package/Cameras/Inputs/freeCameraTouchInput.js.map +1 -1
  16. package/Cameras/Inputs/geospatialCameraKeyboardInput.js +8 -1
  17. package/Cameras/Inputs/geospatialCameraKeyboardInput.js.map +1 -1
  18. package/Cameras/arcRotateCamera.pure.js.map +1 -1
  19. package/Cameras/flyCamera.pure.d.ts +8 -0
  20. package/Cameras/flyCamera.pure.js.map +1 -1
  21. package/Cameras/freeCamera.pure.d.ts +8 -0
  22. package/Cameras/freeCamera.pure.js.map +1 -1
  23. package/Cameras/index.d.ts +1 -0
  24. package/Cameras/index.js +1 -0
  25. package/Cameras/index.js.map +1 -1
  26. package/Cameras/pure.d.ts +1 -0
  27. package/Cameras/pure.js +1 -0
  28. package/Cameras/pure.js.map +1 -1
  29. package/Cameras/targetCamera.pure.d.ts +18 -0
  30. package/Cameras/targetCamera.pure.js +68 -25
  31. package/Cameras/targetCamera.pure.js.map +1 -1
  32. package/Cameras/targetCameraMovement.d.ts +56 -0
  33. package/Cameras/targetCameraMovement.js +63 -0
  34. package/Cameras/targetCameraMovement.js.map +1 -0
  35. package/Engines/AbstractEngine/abstractEngine.scissor.d.ts +18 -0
  36. package/Engines/AbstractEngine/abstractEngine.scissor.js +2 -0
  37. package/Engines/AbstractEngine/abstractEngine.scissor.js.map +1 -0
  38. package/Engines/abstractEngine.pure.js +2 -2
  39. package/Engines/abstractEngine.pure.js.map +1 -1
  40. package/Engines/engine.d.ts +1 -0
  41. package/Engines/engine.js +1 -0
  42. package/Engines/engine.js.map +1 -1
  43. package/Engines/engine.pure.d.ts +0 -12
  44. package/Engines/engine.pure.js +0 -20
  45. package/Engines/engine.pure.js.map +1 -1
  46. package/Engines/pure.d.ts +1 -0
  47. package/Engines/pure.js +1 -0
  48. package/Engines/pure.js.map +1 -1
  49. package/Engines/thinEngine.scissor.d.ts +6 -0
  50. package/Engines/thinEngine.scissor.js +9 -0
  51. package/Engines/thinEngine.scissor.js.map +1 -0
  52. package/Engines/thinEngine.scissor.pure.d.ts +6 -0
  53. package/Engines/thinEngine.scissor.pure.js +24 -0
  54. package/Engines/thinEngine.scissor.pure.js.map +1 -0
  55. package/Engines/thinNativeEngine.pure.js.map +1 -1
  56. package/Engines/webgpuEngine.pure.js.map +1 -1
  57. package/Materials/GreasedLine/greasedLinePluginMaterialShadersGLSL.js +10 -3
  58. package/Materials/GreasedLine/greasedLinePluginMaterialShadersGLSL.js.map +1 -1
  59. package/Misc/tools.pure.js +1 -1
  60. package/Misc/tools.pure.js.map +1 -1
  61. package/Shaders/greasedLine.vertex.js +19 -3
  62. package/Shaders/greasedLine.vertex.js.map +1 -1
  63. package/package.json +1 -1
  64. package/scene.pure.js +3 -0
  65. package/scene.pure.js.map +1 -1
@@ -4,6 +4,7 @@ import { type Scene } from "../scene.pure.js";
4
4
  import { type Quaternion, Vector3 } from "../Maths/math.vector.pure.js";
5
5
  import { type AbstractMesh } from "../Meshes/abstractMesh.pure.js";
6
6
  import { TargetCamera } from "./targetCamera.pure.js";
7
+ import { type TargetCameraMovement } from "./targetCameraMovement.js";
7
8
  import { FlyCameraInputsManager } from "./flyCameraInputsManager.js";
8
9
  /**
9
10
  * This is a flying camera, designed for 3D movement and rotation in all directions,
@@ -65,6 +66,13 @@ export declare class FlyCamera extends TargetCamera {
65
66
  * The inputs manager loads all the input sources, such as keyboard and mouse.
66
67
  */
67
68
  inputs: FlyCameraInputsManager;
69
+ /**
70
+ * Framerate-independent movement controller for the fly camera, exposing the configurable
71
+ * {@link InputMapper} (`movement.input`) consulted by {@link FlyCameraMouseInput}. Narrows the
72
+ * inherited {@link TargetCamera.movement} to {@link TargetCameraMovement}; the instance is
73
+ * created by the {@link TargetCamera} constructor.
74
+ */
75
+ movement: TargetCameraMovement;
68
76
  /**
69
77
  * Gets the input sensibility for mouse input.
70
78
  * Higher values reduce sensitivity.
@@ -1 +1 @@
1
- {"version":3,"file":"flyCamera.pure.js","sourceRoot":"","sources":["../../../../dev/core/src/Cameras/flyCamera.pure.ts"],"names":[],"mappings":"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","sourcesContent":["/** This file must only contain pure code and pure imports */\r\n\r\nimport { serialize, serializeAsVector3 } from \"../Misc/decorators\";\r\nimport { type Nullable } from \"../types\";\r\nimport { type Scene } from \"../scene.pure\";\r\nimport { type Quaternion, Vector3 } from \"../Maths/math.vector.pure\";\r\nimport { type AbstractMesh } from \"../Meshes/abstractMesh.pure\";\r\nimport { TargetCamera } from \"./targetCamera.pure\";\r\nimport { FlyCameraInputsManager } from \"./flyCameraInputsManager\";\r\nimport { type FlyCameraMouseInput } from \"../Cameras/Inputs/flyCameraMouseInput\";\r\nimport { type FlyCameraKeyboardInput } from \"../Cameras/Inputs/flyCameraKeyboardInput\";\r\nimport { Tools } from \"../Misc/tools.pure\";\r\n\r\nimport { type Collider } from \"../Collisions/collider\";\r\nimport { AbstractEngine } from \"core/Engines/abstractEngine.pure\";\r\nimport { RegisterClass } from \"../Misc/typeStore\";\r\n\r\n/**\r\n * This is a flying camera, designed for 3D movement and rotation in all directions,\r\n * such as in a 3D Space Shooter or a Flight Simulator.\r\n */\r\nexport class FlyCamera extends TargetCamera {\r\n /**\r\n * Define the collision ellipsoid of the camera.\r\n * This is helpful for simulating a camera body, like a player's body.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/camera_collisions#arcrotatecamera\r\n */\r\n @serializeAsVector3()\r\n public ellipsoid = new Vector3(1, 1, 1);\r\n\r\n /**\r\n * Define an offset for the position of the ellipsoid around the camera.\r\n * This can be helpful if the camera is attached away from the player's body center,\r\n * such as at its head.\r\n */\r\n @serializeAsVector3()\r\n public ellipsoidOffset = new Vector3(0, 0, 0);\r\n\r\n /**\r\n * Enable or disable collisions of the camera with the rest of the scene objects.\r\n */\r\n @serialize()\r\n public checkCollisions = false;\r\n\r\n /**\r\n * Enable or disable gravity on the camera.\r\n */\r\n @serialize()\r\n public applyGravity = false;\r\n\r\n /**\r\n * Define the current direction the camera is moving to.\r\n */\r\n public override cameraDirection = Vector3.Zero();\r\n\r\n /**\r\n * Define the current local rotation of the camera as a quaternion to prevent Gimbal lock.\r\n * This overrides and empties cameraRotation.\r\n */\r\n public override rotationQuaternion: Nullable<Quaternion>;\r\n\r\n /**\r\n * Track Roll to maintain the wanted Rolling when looking around.\r\n */\r\n public _trackRoll: number = 0;\r\n\r\n /**\r\n * Slowly correct the Roll to its original value after a Pitch+Yaw rotation.\r\n */\r\n public rollCorrect: number = 100;\r\n\r\n /**\r\n * Mimic a banked turn, Rolling the camera when Yawing.\r\n * It's recommended to use rollCorrect = 10 for faster banking correction.\r\n */\r\n public bankedTurn: boolean = false;\r\n\r\n /**\r\n * Limit in radians for how much Roll banking will add. (Default: 90°)\r\n */\r\n public bankedTurnLimit: number = Math.PI / 2;\r\n\r\n /**\r\n * Value of 0 disables the banked Roll.\r\n * Value of 1 is equal to the Yaw angle in radians.\r\n */\r\n public bankedTurnMultiplier: number = 1;\r\n\r\n /**\r\n * The inputs manager loads all the input sources, such as keyboard and mouse.\r\n */\r\n public override inputs: FlyCameraInputsManager;\r\n\r\n /**\r\n * Gets the input sensibility for mouse input.\r\n * Higher values reduce sensitivity.\r\n */\r\n public get angularSensibility(): number {\r\n const mouse = <FlyCameraMouseInput>this.inputs.attached[\"mouse\"];\r\n if (mouse) {\r\n return mouse.angularSensibility;\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n /**\r\n * Sets the input sensibility for a mouse input.\r\n * Higher values reduce sensitivity.\r\n */\r\n public set angularSensibility(value: number) {\r\n const mouse = <FlyCameraMouseInput>this.inputs.attached[\"mouse\"];\r\n if (mouse) {\r\n mouse.angularSensibility = value;\r\n }\r\n }\r\n\r\n /**\r\n * Get the keys for camera movement forward.\r\n */\r\n public get keysForward(): number[] {\r\n const keyboard = <FlyCameraKeyboardInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n return keyboard.keysForward;\r\n }\r\n\r\n return [];\r\n }\r\n\r\n /**\r\n * Set the keys for camera movement forward.\r\n */\r\n public set keysForward(value: number[]) {\r\n const keyboard = <FlyCameraKeyboardInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n keyboard.keysForward = value;\r\n }\r\n }\r\n\r\n /**\r\n * Get the keys for camera movement backward.\r\n */\r\n public get keysBackward(): number[] {\r\n const keyboard = <FlyCameraKeyboardInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n return keyboard.keysBackward;\r\n }\r\n\r\n return [];\r\n }\r\n\r\n public set keysBackward(value: number[]) {\r\n const keyboard = <FlyCameraKeyboardInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n keyboard.keysBackward = value;\r\n }\r\n }\r\n\r\n /**\r\n * Get the keys for camera movement up.\r\n */\r\n public get keysUp(): number[] {\r\n const keyboard = <FlyCameraKeyboardInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n return keyboard.keysUp;\r\n }\r\n\r\n return [];\r\n }\r\n\r\n /**\r\n * Set the keys for camera movement up.\r\n */\r\n public set keysUp(value: number[]) {\r\n const keyboard = <FlyCameraKeyboardInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n keyboard.keysUp = value;\r\n }\r\n }\r\n\r\n /**\r\n * Get the keys for camera movement down.\r\n */\r\n public get keysDown(): number[] {\r\n const keyboard = <FlyCameraKeyboardInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n return keyboard.keysDown;\r\n }\r\n\r\n return [];\r\n }\r\n\r\n /**\r\n * Set the keys for camera movement down.\r\n */\r\n public set keysDown(value: number[]) {\r\n const keyboard = <FlyCameraKeyboardInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n keyboard.keysDown = value;\r\n }\r\n }\r\n\r\n /**\r\n * Get the keys for camera movement left.\r\n */\r\n public get keysLeft(): number[] {\r\n const keyboard = <FlyCameraKeyboardInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n return keyboard.keysLeft;\r\n }\r\n\r\n return [];\r\n }\r\n\r\n /**\r\n * Set the keys for camera movement left.\r\n */\r\n public set keysLeft(value: number[]) {\r\n const keyboard = <FlyCameraKeyboardInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n keyboard.keysLeft = value;\r\n }\r\n }\r\n\r\n /**\r\n * Set the keys for camera movement right.\r\n */\r\n public get keysRight(): number[] {\r\n const keyboard = <FlyCameraKeyboardInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n return keyboard.keysRight;\r\n }\r\n\r\n return [];\r\n }\r\n\r\n /**\r\n * Set the keys for camera movement right.\r\n */\r\n public set keysRight(value: number[]) {\r\n const keyboard = <FlyCameraKeyboardInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n keyboard.keysRight = value;\r\n }\r\n }\r\n\r\n /**\r\n * Event raised when the camera collides with a mesh in the scene.\r\n */\r\n public onCollide: (collidedMesh: AbstractMesh) => void;\r\n\r\n private _collider: Collider;\r\n private _needMoveForGravity = false;\r\n private _oldPosition = Vector3.Zero();\r\n private _diffPosition = Vector3.Zero();\r\n private _newPosition = Vector3.Zero();\r\n\r\n /** @internal */\r\n public _localDirection: Vector3;\r\n /** @internal */\r\n public _transformedDirection: Vector3;\r\n\r\n /**\r\n * Instantiates a FlyCamera.\r\n * This is a flying camera, designed for 3D movement and rotation in all directions,\r\n * such as in a 3D Space Shooter or a Flight Simulator.\r\n * @param name Define the name of the camera in the scene.\r\n * @param position Define the starting position of the camera in the scene.\r\n * @param scene Define the scene the camera belongs to.\r\n * @param setActiveOnSceneIfNoneActive Defines whether the camera should be marked as active, if no other camera has been defined as active.\r\n */\r\n constructor(name: string, position: Vector3, scene?: Scene, setActiveOnSceneIfNoneActive = true) {\r\n super(name, position, scene, setActiveOnSceneIfNoneActive);\r\n this.inputs = new FlyCameraInputsManager(this);\r\n this.inputs.addKeyboard().addMouse();\r\n }\r\n\r\n /**\r\n * Attach the input controls to a specific dom element to get the input from.\r\n * @param noPreventDefault Defines whether event caught by the controls should call preventdefault() (https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault)\r\n */\r\n public override attachControl(noPreventDefault?: boolean): void;\r\n /**\r\n * Attached controls to the current camera.\r\n * @param ignored defines an ignored parameter kept for backward compatibility.\r\n * @param noPreventDefault Defines whether event caught by the controls should call preventdefault() (https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault)\r\n */\r\n public override attachControl(ignored: any, noPreventDefault?: boolean): void {\r\n noPreventDefault = Tools.BackCompatCameraNoPreventDefault(arguments);\r\n this.inputs.attachElement(noPreventDefault);\r\n }\r\n\r\n /**\r\n * Detach a control from the HTML DOM element.\r\n * The camera will stop reacting to that input.\r\n */\r\n public override detachControl(): void {\r\n this.inputs.detachElement();\r\n\r\n this.cameraDirection = new Vector3(0, 0, 0);\r\n }\r\n\r\n // Collisions.\r\n private _collisionMask = -1;\r\n\r\n /**\r\n * Get the mask that the camera ignores in collision events.\r\n */\r\n public get collisionMask(): number {\r\n return this._collisionMask;\r\n }\r\n\r\n /**\r\n * Set the mask that the camera ignores in collision events.\r\n */\r\n public set collisionMask(mask: number) {\r\n this._collisionMask = !isNaN(mask) ? mask : -1;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _collideWithWorld(displacement: Vector3): void {\r\n let globalPosition: Vector3;\r\n\r\n if (this.parent) {\r\n globalPosition = Vector3.TransformCoordinates(this.position, this.parent.getWorldMatrix());\r\n } else {\r\n globalPosition = this.position;\r\n }\r\n\r\n globalPosition.subtractFromFloatsToRef(0, this.ellipsoid.y, 0, this._oldPosition);\r\n this._oldPosition.addInPlace(this.ellipsoidOffset);\r\n const coordinator = this.getScene().collisionCoordinator;\r\n\r\n if (!this._collider) {\r\n this._collider = coordinator.createCollider();\r\n }\r\n\r\n this._collider._radius = this.ellipsoid;\r\n this._collider.collisionMask = this._collisionMask;\r\n\r\n // No need for clone, as long as gravity is not on.\r\n let actualDisplacement = displacement;\r\n\r\n // Add gravity to direction to prevent dual-collision checking.\r\n if (this.applyGravity) {\r\n // This prevents mending with cameraDirection, a global variable of the fly camera class.\r\n actualDisplacement = displacement.add(this.getScene().gravity);\r\n }\r\n\r\n coordinator.getNewPosition(this._oldPosition, actualDisplacement, this._collider, 3, null, this._onCollisionPositionChange, this.uniqueId);\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n private _onCollisionPositionChange = (collisionId: number, newPosition: Vector3, collidedMesh: Nullable<AbstractMesh> = null) => {\r\n const updatePosition = (newPos: Vector3) => {\r\n this._newPosition.copyFrom(newPos);\r\n\r\n this._newPosition.subtractToRef(this._oldPosition, this._diffPosition);\r\n\r\n if (this._diffPosition.length() > AbstractEngine.CollisionsEpsilon) {\r\n this.position.addInPlace(this._diffPosition);\r\n if (this.onCollide && collidedMesh) {\r\n this.onCollide(collidedMesh);\r\n }\r\n }\r\n };\r\n\r\n updatePosition(newPosition);\r\n };\r\n\r\n /** @internal */\r\n public override _checkInputs(): void {\r\n if (!this._localDirection) {\r\n this._localDirection = Vector3.Zero();\r\n this._transformedDirection = Vector3.Zero();\r\n }\r\n\r\n this.inputs.checkInputs();\r\n\r\n super._checkInputs();\r\n }\r\n\r\n /**\r\n * Enable movement without a user input. This allows gravity to always be applied.\r\n */\r\n public set needMoveForGravity(value: boolean) {\r\n this._needMoveForGravity = value;\r\n }\r\n\r\n /**\r\n * When true, gravity is applied whether there is user input or not.\r\n */\r\n public get needMoveForGravity(): boolean {\r\n return this._needMoveForGravity;\r\n }\r\n\r\n /** @internal */\r\n public override _decideIfNeedsToMove(): boolean {\r\n return this._needMoveForGravity || Math.abs(this.cameraDirection.x) > 0 || Math.abs(this.cameraDirection.y) > 0 || Math.abs(this.cameraDirection.z) > 0;\r\n }\r\n\r\n /** @internal */\r\n public override _updatePosition(): void {\r\n if (this.checkCollisions && this.getScene().collisionsEnabled) {\r\n this._collideWithWorld(this.cameraDirection);\r\n } else {\r\n super._updatePosition();\r\n }\r\n }\r\n\r\n /**\r\n * Restore the Roll to its target value at the rate specified.\r\n * @param rate - Higher means slower restoring.\r\n * @internal\r\n */\r\n public restoreRoll(rate: number): void {\r\n const limit = this._trackRoll; // Target Roll.\r\n const z = this.rotation.z; // Current Roll.\r\n const delta = limit - z; // Difference in Roll.\r\n\r\n const minRad = 0.001; // Tenth of a radian is a barely noticable difference.\r\n\r\n // If the difference is noticable, restore the Roll.\r\n if (Math.abs(delta) >= minRad) {\r\n // Change Z rotation towards the target Roll.\r\n this.rotation.z += delta / rate;\r\n\r\n // Match when near enough.\r\n if (Math.abs(limit - this.rotation.z) <= minRad) {\r\n this.rotation.z = limit;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Destroy the camera and release the current resources held by it.\r\n */\r\n public override dispose(): void {\r\n this.inputs.clear();\r\n super.dispose();\r\n }\r\n\r\n /**\r\n * Get the current object class name.\r\n * @returns the class name.\r\n */\r\n public override getClassName(): string {\r\n return \"FlyCamera\";\r\n }\r\n}\r\n\r\n// Register Class Name\r\n\r\nlet _Registered = false;\r\n/**\r\n * Register side effects for flyCamera.\r\n * Safe to call multiple times; only the first call has an effect.\r\n */\r\nexport function RegisterFlyCamera(): void {\r\n if (_Registered) {\r\n return;\r\n }\r\n _Registered = true;\r\n\r\n RegisterClass(\"BABYLON.FlyCamera\", FlyCamera);\r\n}\r\n"]}
1
+ {"version":3,"file":"flyCamera.pure.js","sourceRoot":"","sources":["../../../../dev/core/src/Cameras/flyCamera.pure.ts"],"names":[],"mappings":"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","sourcesContent":["/** This file must only contain pure code and pure imports */\r\n\r\nimport { serialize, serializeAsVector3 } from \"../Misc/decorators\";\r\nimport { type Nullable } from \"../types\";\r\nimport { type Scene } from \"../scene.pure\";\r\nimport { type Quaternion, Vector3 } from \"../Maths/math.vector.pure\";\r\nimport { type AbstractMesh } from \"../Meshes/abstractMesh.pure\";\r\nimport { TargetCamera } from \"./targetCamera.pure\";\r\nimport { type TargetCameraMovement } from \"./targetCameraMovement\";\r\nimport { FlyCameraInputsManager } from \"./flyCameraInputsManager\";\r\nimport { type FlyCameraMouseInput } from \"../Cameras/Inputs/flyCameraMouseInput\";\r\nimport { type FlyCameraKeyboardInput } from \"../Cameras/Inputs/flyCameraKeyboardInput\";\r\nimport { Tools } from \"../Misc/tools.pure\";\r\n\r\nimport { type Collider } from \"../Collisions/collider\";\r\nimport { AbstractEngine } from \"core/Engines/abstractEngine.pure\";\r\nimport { RegisterClass } from \"../Misc/typeStore\";\r\n\r\n/**\r\n * This is a flying camera, designed for 3D movement and rotation in all directions,\r\n * such as in a 3D Space Shooter or a Flight Simulator.\r\n */\r\nexport class FlyCamera extends TargetCamera {\r\n /**\r\n * Define the collision ellipsoid of the camera.\r\n * This is helpful for simulating a camera body, like a player's body.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/camera_collisions#arcrotatecamera\r\n */\r\n @serializeAsVector3()\r\n public ellipsoid = new Vector3(1, 1, 1);\r\n\r\n /**\r\n * Define an offset for the position of the ellipsoid around the camera.\r\n * This can be helpful if the camera is attached away from the player's body center,\r\n * such as at its head.\r\n */\r\n @serializeAsVector3()\r\n public ellipsoidOffset = new Vector3(0, 0, 0);\r\n\r\n /**\r\n * Enable or disable collisions of the camera with the rest of the scene objects.\r\n */\r\n @serialize()\r\n public checkCollisions = false;\r\n\r\n /**\r\n * Enable or disable gravity on the camera.\r\n */\r\n @serialize()\r\n public applyGravity = false;\r\n\r\n /**\r\n * Define the current direction the camera is moving to.\r\n */\r\n public override cameraDirection = Vector3.Zero();\r\n\r\n /**\r\n * Define the current local rotation of the camera as a quaternion to prevent Gimbal lock.\r\n * This overrides and empties cameraRotation.\r\n */\r\n public override rotationQuaternion: Nullable<Quaternion>;\r\n\r\n /**\r\n * Track Roll to maintain the wanted Rolling when looking around.\r\n */\r\n public _trackRoll: number = 0;\r\n\r\n /**\r\n * Slowly correct the Roll to its original value after a Pitch+Yaw rotation.\r\n */\r\n public rollCorrect: number = 100;\r\n\r\n /**\r\n * Mimic a banked turn, Rolling the camera when Yawing.\r\n * It's recommended to use rollCorrect = 10 for faster banking correction.\r\n */\r\n public bankedTurn: boolean = false;\r\n\r\n /**\r\n * Limit in radians for how much Roll banking will add. (Default: 90°)\r\n */\r\n public bankedTurnLimit: number = Math.PI / 2;\r\n\r\n /**\r\n * Value of 0 disables the banked Roll.\r\n * Value of 1 is equal to the Yaw angle in radians.\r\n */\r\n public bankedTurnMultiplier: number = 1;\r\n\r\n /**\r\n * The inputs manager loads all the input sources, such as keyboard and mouse.\r\n */\r\n public override inputs: FlyCameraInputsManager;\r\n\r\n /**\r\n * Framerate-independent movement controller for the fly camera, exposing the configurable\r\n * {@link InputMapper} (`movement.input`) consulted by {@link FlyCameraMouseInput}. Narrows the\r\n * inherited {@link TargetCamera.movement} to {@link TargetCameraMovement}; the instance is\r\n * created by the {@link TargetCamera} constructor.\r\n */\r\n public override movement: TargetCameraMovement;\r\n\r\n /**\r\n * Gets the input sensibility for mouse input.\r\n * Higher values reduce sensitivity.\r\n */\r\n public get angularSensibility(): number {\r\n const mouse = <FlyCameraMouseInput>this.inputs.attached[\"mouse\"];\r\n if (mouse) {\r\n return mouse.angularSensibility;\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n /**\r\n * Sets the input sensibility for a mouse input.\r\n * Higher values reduce sensitivity.\r\n */\r\n public set angularSensibility(value: number) {\r\n const mouse = <FlyCameraMouseInput>this.inputs.attached[\"mouse\"];\r\n if (mouse) {\r\n mouse.angularSensibility = value;\r\n }\r\n }\r\n\r\n /**\r\n * Get the keys for camera movement forward.\r\n */\r\n public get keysForward(): number[] {\r\n const keyboard = <FlyCameraKeyboardInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n return keyboard.keysForward;\r\n }\r\n\r\n return [];\r\n }\r\n\r\n /**\r\n * Set the keys for camera movement forward.\r\n */\r\n public set keysForward(value: number[]) {\r\n const keyboard = <FlyCameraKeyboardInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n keyboard.keysForward = value;\r\n }\r\n }\r\n\r\n /**\r\n * Get the keys for camera movement backward.\r\n */\r\n public get keysBackward(): number[] {\r\n const keyboard = <FlyCameraKeyboardInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n return keyboard.keysBackward;\r\n }\r\n\r\n return [];\r\n }\r\n\r\n public set keysBackward(value: number[]) {\r\n const keyboard = <FlyCameraKeyboardInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n keyboard.keysBackward = value;\r\n }\r\n }\r\n\r\n /**\r\n * Get the keys for camera movement up.\r\n */\r\n public get keysUp(): number[] {\r\n const keyboard = <FlyCameraKeyboardInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n return keyboard.keysUp;\r\n }\r\n\r\n return [];\r\n }\r\n\r\n /**\r\n * Set the keys for camera movement up.\r\n */\r\n public set keysUp(value: number[]) {\r\n const keyboard = <FlyCameraKeyboardInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n keyboard.keysUp = value;\r\n }\r\n }\r\n\r\n /**\r\n * Get the keys for camera movement down.\r\n */\r\n public get keysDown(): number[] {\r\n const keyboard = <FlyCameraKeyboardInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n return keyboard.keysDown;\r\n }\r\n\r\n return [];\r\n }\r\n\r\n /**\r\n * Set the keys for camera movement down.\r\n */\r\n public set keysDown(value: number[]) {\r\n const keyboard = <FlyCameraKeyboardInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n keyboard.keysDown = value;\r\n }\r\n }\r\n\r\n /**\r\n * Get the keys for camera movement left.\r\n */\r\n public get keysLeft(): number[] {\r\n const keyboard = <FlyCameraKeyboardInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n return keyboard.keysLeft;\r\n }\r\n\r\n return [];\r\n }\r\n\r\n /**\r\n * Set the keys for camera movement left.\r\n */\r\n public set keysLeft(value: number[]) {\r\n const keyboard = <FlyCameraKeyboardInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n keyboard.keysLeft = value;\r\n }\r\n }\r\n\r\n /**\r\n * Set the keys for camera movement right.\r\n */\r\n public get keysRight(): number[] {\r\n const keyboard = <FlyCameraKeyboardInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n return keyboard.keysRight;\r\n }\r\n\r\n return [];\r\n }\r\n\r\n /**\r\n * Set the keys for camera movement right.\r\n */\r\n public set keysRight(value: number[]) {\r\n const keyboard = <FlyCameraKeyboardInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n keyboard.keysRight = value;\r\n }\r\n }\r\n\r\n /**\r\n * Event raised when the camera collides with a mesh in the scene.\r\n */\r\n public onCollide: (collidedMesh: AbstractMesh) => void;\r\n\r\n private _collider: Collider;\r\n private _needMoveForGravity = false;\r\n private _oldPosition = Vector3.Zero();\r\n private _diffPosition = Vector3.Zero();\r\n private _newPosition = Vector3.Zero();\r\n\r\n /** @internal */\r\n public _localDirection: Vector3;\r\n /** @internal */\r\n public _transformedDirection: Vector3;\r\n\r\n /**\r\n * Instantiates a FlyCamera.\r\n * This is a flying camera, designed for 3D movement and rotation in all directions,\r\n * such as in a 3D Space Shooter or a Flight Simulator.\r\n * @param name Define the name of the camera in the scene.\r\n * @param position Define the starting position of the camera in the scene.\r\n * @param scene Define the scene the camera belongs to.\r\n * @param setActiveOnSceneIfNoneActive Defines whether the camera should be marked as active, if no other camera has been defined as active.\r\n */\r\n constructor(name: string, position: Vector3, scene?: Scene, setActiveOnSceneIfNoneActive = true) {\r\n super(name, position, scene, setActiveOnSceneIfNoneActive);\r\n this.inputs = new FlyCameraInputsManager(this);\r\n this.inputs.addKeyboard().addMouse();\r\n }\r\n\r\n /**\r\n * Attach the input controls to a specific dom element to get the input from.\r\n * @param noPreventDefault Defines whether event caught by the controls should call preventdefault() (https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault)\r\n */\r\n public override attachControl(noPreventDefault?: boolean): void;\r\n /**\r\n * Attached controls to the current camera.\r\n * @param ignored defines an ignored parameter kept for backward compatibility.\r\n * @param noPreventDefault Defines whether event caught by the controls should call preventdefault() (https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault)\r\n */\r\n public override attachControl(ignored: any, noPreventDefault?: boolean): void {\r\n noPreventDefault = Tools.BackCompatCameraNoPreventDefault(arguments);\r\n this.inputs.attachElement(noPreventDefault);\r\n }\r\n\r\n /**\r\n * Detach a control from the HTML DOM element.\r\n * The camera will stop reacting to that input.\r\n */\r\n public override detachControl(): void {\r\n this.inputs.detachElement();\r\n\r\n this.cameraDirection = new Vector3(0, 0, 0);\r\n }\r\n\r\n // Collisions.\r\n private _collisionMask = -1;\r\n\r\n /**\r\n * Get the mask that the camera ignores in collision events.\r\n */\r\n public get collisionMask(): number {\r\n return this._collisionMask;\r\n }\r\n\r\n /**\r\n * Set the mask that the camera ignores in collision events.\r\n */\r\n public set collisionMask(mask: number) {\r\n this._collisionMask = !isNaN(mask) ? mask : -1;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _collideWithWorld(displacement: Vector3): void {\r\n let globalPosition: Vector3;\r\n\r\n if (this.parent) {\r\n globalPosition = Vector3.TransformCoordinates(this.position, this.parent.getWorldMatrix());\r\n } else {\r\n globalPosition = this.position;\r\n }\r\n\r\n globalPosition.subtractFromFloatsToRef(0, this.ellipsoid.y, 0, this._oldPosition);\r\n this._oldPosition.addInPlace(this.ellipsoidOffset);\r\n const coordinator = this.getScene().collisionCoordinator;\r\n\r\n if (!this._collider) {\r\n this._collider = coordinator.createCollider();\r\n }\r\n\r\n this._collider._radius = this.ellipsoid;\r\n this._collider.collisionMask = this._collisionMask;\r\n\r\n // No need for clone, as long as gravity is not on.\r\n let actualDisplacement = displacement;\r\n\r\n // Add gravity to direction to prevent dual-collision checking.\r\n if (this.applyGravity) {\r\n // This prevents mending with cameraDirection, a global variable of the fly camera class.\r\n actualDisplacement = displacement.add(this.getScene().gravity);\r\n }\r\n\r\n coordinator.getNewPosition(this._oldPosition, actualDisplacement, this._collider, 3, null, this._onCollisionPositionChange, this.uniqueId);\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n private _onCollisionPositionChange = (collisionId: number, newPosition: Vector3, collidedMesh: Nullable<AbstractMesh> = null) => {\r\n const updatePosition = (newPos: Vector3) => {\r\n this._newPosition.copyFrom(newPos);\r\n\r\n this._newPosition.subtractToRef(this._oldPosition, this._diffPosition);\r\n\r\n if (this._diffPosition.length() > AbstractEngine.CollisionsEpsilon) {\r\n this.position.addInPlace(this._diffPosition);\r\n if (this.onCollide && collidedMesh) {\r\n this.onCollide(collidedMesh);\r\n }\r\n }\r\n };\r\n\r\n updatePosition(newPosition);\r\n };\r\n\r\n /** @internal */\r\n public override _checkInputs(): void {\r\n if (!this._localDirection) {\r\n this._localDirection = Vector3.Zero();\r\n this._transformedDirection = Vector3.Zero();\r\n }\r\n\r\n this.inputs.checkInputs();\r\n\r\n super._checkInputs();\r\n }\r\n\r\n /**\r\n * Enable movement without a user input. This allows gravity to always be applied.\r\n */\r\n public set needMoveForGravity(value: boolean) {\r\n this._needMoveForGravity = value;\r\n }\r\n\r\n /**\r\n * When true, gravity is applied whether there is user input or not.\r\n */\r\n public get needMoveForGravity(): boolean {\r\n return this._needMoveForGravity;\r\n }\r\n\r\n /** @internal */\r\n public override _decideIfNeedsToMove(): boolean {\r\n return this._needMoveForGravity || Math.abs(this.cameraDirection.x) > 0 || Math.abs(this.cameraDirection.y) > 0 || Math.abs(this.cameraDirection.z) > 0;\r\n }\r\n\r\n /** @internal */\r\n public override _updatePosition(): void {\r\n if (this.checkCollisions && this.getScene().collisionsEnabled) {\r\n this._collideWithWorld(this.cameraDirection);\r\n } else {\r\n super._updatePosition();\r\n }\r\n }\r\n\r\n /**\r\n * Restore the Roll to its target value at the rate specified.\r\n * @param rate - Higher means slower restoring.\r\n * @internal\r\n */\r\n public restoreRoll(rate: number): void {\r\n const limit = this._trackRoll; // Target Roll.\r\n const z = this.rotation.z; // Current Roll.\r\n const delta = limit - z; // Difference in Roll.\r\n\r\n const minRad = 0.001; // Tenth of a radian is a barely noticable difference.\r\n\r\n // If the difference is noticable, restore the Roll.\r\n if (Math.abs(delta) >= minRad) {\r\n // Change Z rotation towards the target Roll.\r\n this.rotation.z += delta / rate;\r\n\r\n // Match when near enough.\r\n if (Math.abs(limit - this.rotation.z) <= minRad) {\r\n this.rotation.z = limit;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Destroy the camera and release the current resources held by it.\r\n */\r\n public override dispose(): void {\r\n this.inputs.clear();\r\n super.dispose();\r\n }\r\n\r\n /**\r\n * Get the current object class name.\r\n * @returns the class name.\r\n */\r\n public override getClassName(): string {\r\n return \"FlyCamera\";\r\n }\r\n}\r\n\r\n// Register Class Name\r\n\r\nlet _Registered = false;\r\n/**\r\n * Register side effects for flyCamera.\r\n * Safe to call multiple times; only the first call has an effect.\r\n */\r\nexport function RegisterFlyCamera(): void {\r\n if (_Registered) {\r\n return;\r\n }\r\n _Registered = true;\r\n\r\n RegisterClass(\"BABYLON.FlyCamera\", FlyCamera);\r\n}\r\n"]}
@@ -3,6 +3,7 @@ import { Vector3 } from "../Maths/math.vector.pure.js";
3
3
  import { type AbstractMesh } from "../Meshes/abstractMesh.pure.js";
4
4
  import { type Scene } from "../scene.pure.js";
5
5
  import { TargetCamera } from "./targetCamera.pure.js";
6
+ import { type TargetCameraMovement } from "./targetCameraMovement.js";
6
7
  import { FreeCameraInputsManager } from "./freeCameraInputsManager.pure.js";
7
8
  /**
8
9
  * This represents a free type of camera. It can be useful in First Person Shooter game for instance.
@@ -34,6 +35,13 @@ export declare class FreeCamera extends TargetCamera {
34
35
  * Define the input manager associated to the camera.
35
36
  */
36
37
  inputs: FreeCameraInputsManager;
38
+ /**
39
+ * Framerate-independent movement controller for the free camera, exposing the configurable
40
+ * {@link InputMapper} (`movement.input`) consulted by the free-camera input classes. Narrows
41
+ * the inherited {@link TargetCamera.movement} to {@link TargetCameraMovement}; the instance is
42
+ * created by the {@link TargetCamera} constructor.
43
+ */
44
+ movement: TargetCameraMovement;
37
45
  /**
38
46
  * Gets the input sensibility for a mouse input. (default is 2000.0)
39
47
  * Higher values reduce sensitivity.
@@ -1 +1 @@
1
- {"version":3,"file":"freeCamera.pure.js","sourceRoot":"","sources":["../../../../dev/core/src/Cameras/freeCamera.pure.ts"],"names":[],"mappings":"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","sourcesContent":["/** This file must only contain pure code and pure imports */\r\n\r\nimport { type Nullable } from \"../types\";\r\nimport { serializeAsVector3, serialize } from \"../Misc/decorators\";\r\nimport { Vector3, Vector2 } from \"../Maths/math.vector.pure\";\r\nimport { type AbstractMesh } from \"../Meshes/abstractMesh.pure\";\r\nimport { type Scene } from \"../scene.pure\";\r\nimport { TargetCamera } from \"./targetCamera.pure\";\r\nimport { FreeCameraInputsManager } from \"./freeCameraInputsManager.pure\";\r\nimport { type FreeCameraMouseInput } from \"../Cameras/Inputs/freeCameraMouseInput\";\r\nimport { type FreeCameraKeyboardMoveInput } from \"../Cameras/Inputs/freeCameraKeyboardMoveInput\";\r\nimport { Tools } from \"../Misc/tools.pure\";\r\n\r\nimport { type Collider } from \"../Collisions/collider\";\r\nimport { AbstractEngine } from \"core/Engines/abstractEngine.pure\";\r\nimport { RegisterClass } from \"../Misc/typeStore\";\r\n\r\n/**\r\n * This represents a free type of camera. It can be useful in First Person Shooter game for instance.\r\n * Please consider using the new UniversalCamera instead as it adds more functionality like the gamepad.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/camera_introduction#universal-camera\r\n */\r\nexport class FreeCamera extends TargetCamera {\r\n /**\r\n * Define the collision ellipsoid of the camera.\r\n * This is helpful to simulate a camera body like the player body around the camera\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/camera_collisions#arcrotatecamera\r\n */\r\n @serializeAsVector3()\r\n public ellipsoid = new Vector3(0.5, 1, 0.5);\r\n\r\n /**\r\n * Define an offset for the position of the ellipsoid around the camera.\r\n * This can be helpful to determine the center of the body near the gravity center of the body\r\n * instead of its head.\r\n */\r\n @serializeAsVector3()\r\n public ellipsoidOffset = new Vector3(0, 0, 0);\r\n\r\n /**\r\n * Enable or disable collisions of the camera with the rest of the scene objects.\r\n */\r\n @serialize()\r\n public checkCollisions = false;\r\n\r\n /**\r\n * Enable or disable gravity on the camera.\r\n */\r\n @serialize()\r\n public applyGravity = false;\r\n\r\n /**\r\n * Define the input manager associated to the camera.\r\n */\r\n public override inputs: FreeCameraInputsManager;\r\n\r\n /**\r\n * Gets the input sensibility for a mouse input. (default is 2000.0)\r\n * Higher values reduce sensitivity.\r\n */\r\n public get angularSensibility(): number {\r\n const mouse = <FreeCameraMouseInput>this.inputs.attached[\"mouse\"];\r\n if (mouse) {\r\n return mouse.angularSensibility;\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n /**\r\n * Sets the input sensibility for a mouse input. (default is 2000.0)\r\n * Higher values reduce sensitivity.\r\n */\r\n public set angularSensibility(value: number) {\r\n const mouse = <FreeCameraMouseInput>this.inputs.attached[\"mouse\"];\r\n if (mouse) {\r\n mouse.angularSensibility = value;\r\n }\r\n }\r\n\r\n /**\r\n * Gets or Set the list of keyboard keys used to control the forward move of the camera.\r\n */\r\n public get keysUp(): number[] {\r\n const keyboard = <FreeCameraKeyboardMoveInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n return keyboard.keysUp;\r\n }\r\n\r\n return [];\r\n }\r\n\r\n public set keysUp(value: number[]) {\r\n const keyboard = <FreeCameraKeyboardMoveInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n keyboard.keysUp = value;\r\n }\r\n }\r\n\r\n /**\r\n * Gets or Set the list of keyboard keys used to control the upward move of the camera.\r\n */\r\n public get keysUpward(): number[] {\r\n const keyboard = <FreeCameraKeyboardMoveInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n return keyboard.keysUpward;\r\n }\r\n\r\n return [];\r\n }\r\n\r\n public set keysUpward(value: number[]) {\r\n const keyboard = <FreeCameraKeyboardMoveInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n keyboard.keysUpward = value;\r\n }\r\n }\r\n\r\n /**\r\n * Gets or Set the list of keyboard keys used to control the backward move of the camera.\r\n */\r\n public get keysDown(): number[] {\r\n const keyboard = <FreeCameraKeyboardMoveInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n return keyboard.keysDown;\r\n }\r\n\r\n return [];\r\n }\r\n\r\n public set keysDown(value: number[]) {\r\n const keyboard = <FreeCameraKeyboardMoveInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n keyboard.keysDown = value;\r\n }\r\n }\r\n\r\n /**\r\n * Gets or Set the list of keyboard keys used to control the downward move of the camera.\r\n */\r\n public get keysDownward(): number[] {\r\n const keyboard = <FreeCameraKeyboardMoveInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n return keyboard.keysDownward;\r\n }\r\n\r\n return [];\r\n }\r\n\r\n public set keysDownward(value: number[]) {\r\n const keyboard = <FreeCameraKeyboardMoveInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n keyboard.keysDownward = value;\r\n }\r\n }\r\n\r\n /**\r\n * Gets or Set the list of keyboard keys used to control the left strafe move of the camera.\r\n */\r\n public get keysLeft(): number[] {\r\n const keyboard = <FreeCameraKeyboardMoveInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n return keyboard.keysLeft;\r\n }\r\n\r\n return [];\r\n }\r\n\r\n public set keysLeft(value: number[]) {\r\n const keyboard = <FreeCameraKeyboardMoveInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n keyboard.keysLeft = value;\r\n }\r\n }\r\n\r\n /**\r\n * Gets or Set the list of keyboard keys used to control the right strafe move of the camera.\r\n */\r\n public get keysRight(): number[] {\r\n const keyboard = <FreeCameraKeyboardMoveInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n return keyboard.keysRight;\r\n }\r\n\r\n return [];\r\n }\r\n\r\n public set keysRight(value: number[]) {\r\n const keyboard = <FreeCameraKeyboardMoveInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n keyboard.keysRight = value;\r\n }\r\n }\r\n\r\n /**\r\n * Gets or Set the list of keyboard keys used to control the left rotation move of the camera.\r\n */\r\n public get keysRotateLeft(): number[] {\r\n const keyboard = <FreeCameraKeyboardMoveInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n return keyboard.keysRotateLeft;\r\n }\r\n\r\n return [];\r\n }\r\n\r\n public set keysRotateLeft(value: number[]) {\r\n const keyboard = <FreeCameraKeyboardMoveInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n keyboard.keysRotateLeft = value;\r\n }\r\n }\r\n\r\n /**\r\n * Gets or Set the list of keyboard keys used to control the right rotation move of the camera.\r\n */\r\n public get keysRotateRight(): number[] {\r\n const keyboard = <FreeCameraKeyboardMoveInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n return keyboard.keysRotateRight;\r\n }\r\n\r\n return [];\r\n }\r\n\r\n public set keysRotateRight(value: number[]) {\r\n const keyboard = <FreeCameraKeyboardMoveInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n keyboard.keysRotateRight = value;\r\n }\r\n }\r\n\r\n /**\r\n * Gets or Set the list of keyboard keys used to control the up rotation move of the camera.\r\n */\r\n public get keysRotateUp(): number[] {\r\n const keyboard = <FreeCameraKeyboardMoveInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n return keyboard.keysRotateUp;\r\n }\r\n\r\n return [];\r\n }\r\n\r\n public set keysRotateUp(value: number[]) {\r\n const keyboard = <FreeCameraKeyboardMoveInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n keyboard.keysRotateUp = value;\r\n }\r\n }\r\n\r\n /**\r\n * Gets or Set the list of keyboard keys used to control the down rotation move of the camera.\r\n */\r\n public get keysRotateDown(): number[] {\r\n const keyboard = <FreeCameraKeyboardMoveInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n return keyboard.keysRotateDown;\r\n }\r\n\r\n return [];\r\n }\r\n\r\n public set keysRotateDown(value: number[]) {\r\n const keyboard = <FreeCameraKeyboardMoveInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n keyboard.keysRotateDown = value;\r\n }\r\n }\r\n\r\n /**\r\n * Event raised when the camera collide with a mesh in the scene.\r\n */\r\n public onCollide: (collidedMesh: AbstractMesh) => void;\r\n\r\n private _collider: Collider;\r\n private _needMoveForGravity = false;\r\n private _oldPosition = Vector3.Zero();\r\n private _diffPosition = Vector3.Zero();\r\n private _newPosition = Vector3.Zero();\r\n\r\n /** @internal */\r\n public _localDirection: Vector3;\r\n /** @internal */\r\n public _transformedDirection: Vector3;\r\n\r\n /**\r\n * Instantiates a Free Camera.\r\n * This represents a free type of camera. It can be useful in First Person Shooter game for instance.\r\n * Please consider using the new UniversalCamera instead as it adds more functionality like touch to this camera.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/camera_introduction#universal-camera\r\n * @param name Define the name of the camera in the scene\r\n * @param position Define the start position of the camera in the scene\r\n * @param scene Define the scene the camera belongs to\r\n * @param setActiveOnSceneIfNoneActive Defines whether the camera should be marked as active if not other active cameras have been defined\r\n */\r\n constructor(name: string, position: Vector3, scene?: Scene, setActiveOnSceneIfNoneActive = true) {\r\n super(name, position, scene, setActiveOnSceneIfNoneActive);\r\n this.inputs = new FreeCameraInputsManager(this);\r\n this.inputs.addKeyboard().addMouse();\r\n }\r\n\r\n /**\r\n * Attach the input controls to a specific dom element to get the input from.\r\n * @param noPreventDefault Defines whether event caught by the controls should call preventdefault() (https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault)\r\n */\r\n public override attachControl(noPreventDefault?: boolean): void;\r\n /**\r\n * Attach the input controls to a specific dom element to get the input from.\r\n * @param ignored defines an ignored parameter kept for backward compatibility.\r\n * @param noPreventDefault Defines whether event caught by the controls should call preventdefault() (https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault)\r\n * BACK COMPAT SIGNATURE ONLY.\r\n */\r\n public override attachControl(ignored: any, noPreventDefault?: boolean): void;\r\n /**\r\n * Attached controls to the current camera.\r\n * @param ignored defines an ignored parameter kept for backward compatibility.\r\n * @param noPreventDefault Defines whether event caught by the controls should call preventdefault() (https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault)\r\n */\r\n public override attachControl(ignored?: any, noPreventDefault?: boolean): void {\r\n noPreventDefault = Tools.BackCompatCameraNoPreventDefault(arguments);\r\n this.inputs.attachElement(noPreventDefault);\r\n }\r\n\r\n /**\r\n * Detach the current controls from the specified dom element.\r\n */\r\n public override detachControl(): void {\r\n this.inputs.detachElement();\r\n\r\n this.cameraDirection = new Vector3(0, 0, 0);\r\n this.cameraRotation = new Vector2(0, 0);\r\n }\r\n\r\n // Collisions\r\n private _collisionMask = -1;\r\n\r\n /**\r\n * Define a collision mask to limit the list of object the camera can collide with\r\n */\r\n public get collisionMask(): number {\r\n return this._collisionMask;\r\n }\r\n\r\n public set collisionMask(mask: number) {\r\n this._collisionMask = !isNaN(mask) ? mask : -1;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _collideWithWorld(displacement: Vector3): void {\r\n let globalPosition: Vector3;\r\n\r\n if (this.parent) {\r\n globalPosition = Vector3.TransformCoordinates(this.position, this.parent.getWorldMatrix());\r\n } else {\r\n globalPosition = this.position;\r\n }\r\n\r\n globalPosition.subtractFromFloatsToRef(0, this.ellipsoid.y, 0, this._oldPosition);\r\n this._oldPosition.addInPlace(this.ellipsoidOffset);\r\n\r\n const coordinator = this.getScene().collisionCoordinator;\r\n if (!this._collider) {\r\n this._collider = coordinator.createCollider();\r\n }\r\n\r\n this._collider._radius = this.ellipsoid;\r\n this._collider.collisionMask = this._collisionMask;\r\n\r\n //no need for clone, as long as gravity is not on.\r\n let actualDisplacement = displacement;\r\n\r\n //add gravity to the direction to prevent the dual-collision checking\r\n if (this.applyGravity) {\r\n //this prevents mending with cameraDirection, a global variable of the free camera class.\r\n actualDisplacement = displacement.add(this.getScene().gravity);\r\n }\r\n\r\n coordinator.getNewPosition(this._oldPosition, actualDisplacement, this._collider, 3, null, this._onCollisionPositionChange, this.uniqueId);\r\n }\r\n\r\n private _onCollisionPositionChange = (collisionId: number, newPosition: Vector3, collidedMesh: Nullable<AbstractMesh> = null) => {\r\n this._newPosition.copyFrom(newPosition);\r\n\r\n this._newPosition.subtractToRef(this._oldPosition, this._diffPosition);\r\n\r\n if (this._diffPosition.length() > AbstractEngine.CollisionsEpsilon) {\r\n this.position.addToRef(this._diffPosition, this._deferredPositionUpdate);\r\n if (!this._deferOnly) {\r\n this.position.copyFrom(this._deferredPositionUpdate);\r\n } else {\r\n this._deferredUpdated = true;\r\n }\r\n // call onCollide, if defined. Note that in case of deferred update, the actual position change might happen in the next frame.\r\n if (this.onCollide && collidedMesh) {\r\n this.onCollide(collidedMesh);\r\n }\r\n }\r\n };\r\n\r\n /** @internal */\r\n public override _checkInputs(): void {\r\n if (!this._localDirection) {\r\n this._localDirection = Vector3.Zero();\r\n this._transformedDirection = Vector3.Zero();\r\n }\r\n\r\n this.inputs.checkInputs();\r\n\r\n super._checkInputs();\r\n }\r\n\r\n /**\r\n * Enable movement without a user input. This allows gravity to always be applied.\r\n */\r\n public set needMoveForGravity(value: boolean) {\r\n this._needMoveForGravity = value;\r\n }\r\n\r\n /**\r\n * When true, gravity is applied whether there is user input or not.\r\n */\r\n public get needMoveForGravity(): boolean {\r\n return this._needMoveForGravity;\r\n }\r\n\r\n /** @internal */\r\n public override _decideIfNeedsToMove(): boolean {\r\n return this._needMoveForGravity || Math.abs(this.cameraDirection.x) > 0 || Math.abs(this.cameraDirection.y) > 0 || Math.abs(this.cameraDirection.z) > 0;\r\n }\r\n\r\n /** @internal */\r\n public override _updatePosition(): void {\r\n if (this.checkCollisions && this.getScene().collisionsEnabled) {\r\n this._collideWithWorld(this.cameraDirection);\r\n } else {\r\n super._updatePosition();\r\n }\r\n }\r\n\r\n /**\r\n * Destroy the camera and release the current resources hold by it.\r\n */\r\n public override dispose(): void {\r\n this.inputs.clear();\r\n super.dispose();\r\n }\r\n\r\n /**\r\n * Gets the current object class name.\r\n * @returns the class name\r\n */\r\n public override getClassName(): string {\r\n return \"FreeCamera\";\r\n }\r\n}\r\n\r\n// Register Class Name\r\n\r\nlet _Registered = false;\r\n/**\r\n * Register side effects for freeCamera.\r\n * Safe to call multiple times; only the first call has an effect.\r\n */\r\nexport function RegisterFreeCamera(): void {\r\n if (_Registered) {\r\n return;\r\n }\r\n _Registered = true;\r\n\r\n RegisterClass(\"BABYLON.FreeCamera\", FreeCamera);\r\n}\r\n"]}
1
+ {"version":3,"file":"freeCamera.pure.js","sourceRoot":"","sources":["../../../../dev/core/src/Cameras/freeCamera.pure.ts"],"names":[],"mappings":"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","sourcesContent":["/** This file must only contain pure code and pure imports */\r\n\r\nimport { type Nullable } from \"../types\";\r\nimport { serializeAsVector3, serialize } from \"../Misc/decorators\";\r\nimport { Vector3, Vector2 } from \"../Maths/math.vector.pure\";\r\nimport { type AbstractMesh } from \"../Meshes/abstractMesh.pure\";\r\nimport { type Scene } from \"../scene.pure\";\r\nimport { TargetCamera } from \"./targetCamera.pure\";\r\nimport { type TargetCameraMovement } from \"./targetCameraMovement\";\r\nimport { FreeCameraInputsManager } from \"./freeCameraInputsManager.pure\";\r\nimport { type FreeCameraMouseInput } from \"../Cameras/Inputs/freeCameraMouseInput\";\r\nimport { type FreeCameraKeyboardMoveInput } from \"../Cameras/Inputs/freeCameraKeyboardMoveInput\";\r\nimport { Tools } from \"../Misc/tools.pure\";\r\n\r\nimport { type Collider } from \"../Collisions/collider\";\r\nimport { AbstractEngine } from \"core/Engines/abstractEngine.pure\";\r\nimport { RegisterClass } from \"../Misc/typeStore\";\r\n\r\n/**\r\n * This represents a free type of camera. It can be useful in First Person Shooter game for instance.\r\n * Please consider using the new UniversalCamera instead as it adds more functionality like the gamepad.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/camera_introduction#universal-camera\r\n */\r\nexport class FreeCamera extends TargetCamera {\r\n /**\r\n * Define the collision ellipsoid of the camera.\r\n * This is helpful to simulate a camera body like the player body around the camera\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/camera_collisions#arcrotatecamera\r\n */\r\n @serializeAsVector3()\r\n public ellipsoid = new Vector3(0.5, 1, 0.5);\r\n\r\n /**\r\n * Define an offset for the position of the ellipsoid around the camera.\r\n * This can be helpful to determine the center of the body near the gravity center of the body\r\n * instead of its head.\r\n */\r\n @serializeAsVector3()\r\n public ellipsoidOffset = new Vector3(0, 0, 0);\r\n\r\n /**\r\n * Enable or disable collisions of the camera with the rest of the scene objects.\r\n */\r\n @serialize()\r\n public checkCollisions = false;\r\n\r\n /**\r\n * Enable or disable gravity on the camera.\r\n */\r\n @serialize()\r\n public applyGravity = false;\r\n\r\n /**\r\n * Define the input manager associated to the camera.\r\n */\r\n public override inputs: FreeCameraInputsManager;\r\n\r\n /**\r\n * Framerate-independent movement controller for the free camera, exposing the configurable\r\n * {@link InputMapper} (`movement.input`) consulted by the free-camera input classes. Narrows\r\n * the inherited {@link TargetCamera.movement} to {@link TargetCameraMovement}; the instance is\r\n * created by the {@link TargetCamera} constructor.\r\n */\r\n public override movement: TargetCameraMovement;\r\n\r\n /**\r\n * Gets the input sensibility for a mouse input. (default is 2000.0)\r\n * Higher values reduce sensitivity.\r\n */\r\n public get angularSensibility(): number {\r\n const mouse = <FreeCameraMouseInput>this.inputs.attached[\"mouse\"];\r\n if (mouse) {\r\n return mouse.angularSensibility;\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n /**\r\n * Sets the input sensibility for a mouse input. (default is 2000.0)\r\n * Higher values reduce sensitivity.\r\n */\r\n public set angularSensibility(value: number) {\r\n const mouse = <FreeCameraMouseInput>this.inputs.attached[\"mouse\"];\r\n if (mouse) {\r\n mouse.angularSensibility = value;\r\n }\r\n }\r\n\r\n /**\r\n * Gets or Set the list of keyboard keys used to control the forward move of the camera.\r\n */\r\n public get keysUp(): number[] {\r\n const keyboard = <FreeCameraKeyboardMoveInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n return keyboard.keysUp;\r\n }\r\n\r\n return [];\r\n }\r\n\r\n public set keysUp(value: number[]) {\r\n const keyboard = <FreeCameraKeyboardMoveInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n keyboard.keysUp = value;\r\n }\r\n }\r\n\r\n /**\r\n * Gets or Set the list of keyboard keys used to control the upward move of the camera.\r\n */\r\n public get keysUpward(): number[] {\r\n const keyboard = <FreeCameraKeyboardMoveInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n return keyboard.keysUpward;\r\n }\r\n\r\n return [];\r\n }\r\n\r\n public set keysUpward(value: number[]) {\r\n const keyboard = <FreeCameraKeyboardMoveInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n keyboard.keysUpward = value;\r\n }\r\n }\r\n\r\n /**\r\n * Gets or Set the list of keyboard keys used to control the backward move of the camera.\r\n */\r\n public get keysDown(): number[] {\r\n const keyboard = <FreeCameraKeyboardMoveInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n return keyboard.keysDown;\r\n }\r\n\r\n return [];\r\n }\r\n\r\n public set keysDown(value: number[]) {\r\n const keyboard = <FreeCameraKeyboardMoveInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n keyboard.keysDown = value;\r\n }\r\n }\r\n\r\n /**\r\n * Gets or Set the list of keyboard keys used to control the downward move of the camera.\r\n */\r\n public get keysDownward(): number[] {\r\n const keyboard = <FreeCameraKeyboardMoveInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n return keyboard.keysDownward;\r\n }\r\n\r\n return [];\r\n }\r\n\r\n public set keysDownward(value: number[]) {\r\n const keyboard = <FreeCameraKeyboardMoveInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n keyboard.keysDownward = value;\r\n }\r\n }\r\n\r\n /**\r\n * Gets or Set the list of keyboard keys used to control the left strafe move of the camera.\r\n */\r\n public get keysLeft(): number[] {\r\n const keyboard = <FreeCameraKeyboardMoveInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n return keyboard.keysLeft;\r\n }\r\n\r\n return [];\r\n }\r\n\r\n public set keysLeft(value: number[]) {\r\n const keyboard = <FreeCameraKeyboardMoveInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n keyboard.keysLeft = value;\r\n }\r\n }\r\n\r\n /**\r\n * Gets or Set the list of keyboard keys used to control the right strafe move of the camera.\r\n */\r\n public get keysRight(): number[] {\r\n const keyboard = <FreeCameraKeyboardMoveInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n return keyboard.keysRight;\r\n }\r\n\r\n return [];\r\n }\r\n\r\n public set keysRight(value: number[]) {\r\n const keyboard = <FreeCameraKeyboardMoveInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n keyboard.keysRight = value;\r\n }\r\n }\r\n\r\n /**\r\n * Gets or Set the list of keyboard keys used to control the left rotation move of the camera.\r\n */\r\n public get keysRotateLeft(): number[] {\r\n const keyboard = <FreeCameraKeyboardMoveInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n return keyboard.keysRotateLeft;\r\n }\r\n\r\n return [];\r\n }\r\n\r\n public set keysRotateLeft(value: number[]) {\r\n const keyboard = <FreeCameraKeyboardMoveInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n keyboard.keysRotateLeft = value;\r\n }\r\n }\r\n\r\n /**\r\n * Gets or Set the list of keyboard keys used to control the right rotation move of the camera.\r\n */\r\n public get keysRotateRight(): number[] {\r\n const keyboard = <FreeCameraKeyboardMoveInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n return keyboard.keysRotateRight;\r\n }\r\n\r\n return [];\r\n }\r\n\r\n public set keysRotateRight(value: number[]) {\r\n const keyboard = <FreeCameraKeyboardMoveInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n keyboard.keysRotateRight = value;\r\n }\r\n }\r\n\r\n /**\r\n * Gets or Set the list of keyboard keys used to control the up rotation move of the camera.\r\n */\r\n public get keysRotateUp(): number[] {\r\n const keyboard = <FreeCameraKeyboardMoveInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n return keyboard.keysRotateUp;\r\n }\r\n\r\n return [];\r\n }\r\n\r\n public set keysRotateUp(value: number[]) {\r\n const keyboard = <FreeCameraKeyboardMoveInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n keyboard.keysRotateUp = value;\r\n }\r\n }\r\n\r\n /**\r\n * Gets or Set the list of keyboard keys used to control the down rotation move of the camera.\r\n */\r\n public get keysRotateDown(): number[] {\r\n const keyboard = <FreeCameraKeyboardMoveInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n return keyboard.keysRotateDown;\r\n }\r\n\r\n return [];\r\n }\r\n\r\n public set keysRotateDown(value: number[]) {\r\n const keyboard = <FreeCameraKeyboardMoveInput>this.inputs.attached[\"keyboard\"];\r\n if (keyboard) {\r\n keyboard.keysRotateDown = value;\r\n }\r\n }\r\n\r\n /**\r\n * Event raised when the camera collide with a mesh in the scene.\r\n */\r\n public onCollide: (collidedMesh: AbstractMesh) => void;\r\n\r\n private _collider: Collider;\r\n private _needMoveForGravity = false;\r\n private _oldPosition = Vector3.Zero();\r\n private _diffPosition = Vector3.Zero();\r\n private _newPosition = Vector3.Zero();\r\n\r\n /** @internal */\r\n public _localDirection: Vector3;\r\n /** @internal */\r\n public _transformedDirection: Vector3;\r\n\r\n /**\r\n * Instantiates a Free Camera.\r\n * This represents a free type of camera. It can be useful in First Person Shooter game for instance.\r\n * Please consider using the new UniversalCamera instead as it adds more functionality like touch to this camera.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/camera_introduction#universal-camera\r\n * @param name Define the name of the camera in the scene\r\n * @param position Define the start position of the camera in the scene\r\n * @param scene Define the scene the camera belongs to\r\n * @param setActiveOnSceneIfNoneActive Defines whether the camera should be marked as active if not other active cameras have been defined\r\n */\r\n constructor(name: string, position: Vector3, scene?: Scene, setActiveOnSceneIfNoneActive = true) {\r\n super(name, position, scene, setActiveOnSceneIfNoneActive);\r\n this.inputs = new FreeCameraInputsManager(this);\r\n this.inputs.addKeyboard().addMouse();\r\n }\r\n\r\n /**\r\n * Attach the input controls to a specific dom element to get the input from.\r\n * @param noPreventDefault Defines whether event caught by the controls should call preventdefault() (https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault)\r\n */\r\n public override attachControl(noPreventDefault?: boolean): void;\r\n /**\r\n * Attach the input controls to a specific dom element to get the input from.\r\n * @param ignored defines an ignored parameter kept for backward compatibility.\r\n * @param noPreventDefault Defines whether event caught by the controls should call preventdefault() (https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault)\r\n * BACK COMPAT SIGNATURE ONLY.\r\n */\r\n public override attachControl(ignored: any, noPreventDefault?: boolean): void;\r\n /**\r\n * Attached controls to the current camera.\r\n * @param ignored defines an ignored parameter kept for backward compatibility.\r\n * @param noPreventDefault Defines whether event caught by the controls should call preventdefault() (https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault)\r\n */\r\n public override attachControl(ignored?: any, noPreventDefault?: boolean): void {\r\n noPreventDefault = Tools.BackCompatCameraNoPreventDefault(arguments);\r\n this.inputs.attachElement(noPreventDefault);\r\n }\r\n\r\n /**\r\n * Detach the current controls from the specified dom element.\r\n */\r\n public override detachControl(): void {\r\n this.inputs.detachElement();\r\n\r\n this.cameraDirection = new Vector3(0, 0, 0);\r\n this.cameraRotation = new Vector2(0, 0);\r\n }\r\n\r\n // Collisions\r\n private _collisionMask = -1;\r\n\r\n /**\r\n * Define a collision mask to limit the list of object the camera can collide with\r\n */\r\n public get collisionMask(): number {\r\n return this._collisionMask;\r\n }\r\n\r\n public set collisionMask(mask: number) {\r\n this._collisionMask = !isNaN(mask) ? mask : -1;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _collideWithWorld(displacement: Vector3): void {\r\n let globalPosition: Vector3;\r\n\r\n if (this.parent) {\r\n globalPosition = Vector3.TransformCoordinates(this.position, this.parent.getWorldMatrix());\r\n } else {\r\n globalPosition = this.position;\r\n }\r\n\r\n globalPosition.subtractFromFloatsToRef(0, this.ellipsoid.y, 0, this._oldPosition);\r\n this._oldPosition.addInPlace(this.ellipsoidOffset);\r\n\r\n const coordinator = this.getScene().collisionCoordinator;\r\n if (!this._collider) {\r\n this._collider = coordinator.createCollider();\r\n }\r\n\r\n this._collider._radius = this.ellipsoid;\r\n this._collider.collisionMask = this._collisionMask;\r\n\r\n //no need for clone, as long as gravity is not on.\r\n let actualDisplacement = displacement;\r\n\r\n //add gravity to the direction to prevent the dual-collision checking\r\n if (this.applyGravity) {\r\n //this prevents mending with cameraDirection, a global variable of the free camera class.\r\n actualDisplacement = displacement.add(this.getScene().gravity);\r\n }\r\n\r\n coordinator.getNewPosition(this._oldPosition, actualDisplacement, this._collider, 3, null, this._onCollisionPositionChange, this.uniqueId);\r\n }\r\n\r\n private _onCollisionPositionChange = (collisionId: number, newPosition: Vector3, collidedMesh: Nullable<AbstractMesh> = null) => {\r\n this._newPosition.copyFrom(newPosition);\r\n\r\n this._newPosition.subtractToRef(this._oldPosition, this._diffPosition);\r\n\r\n if (this._diffPosition.length() > AbstractEngine.CollisionsEpsilon) {\r\n this.position.addToRef(this._diffPosition, this._deferredPositionUpdate);\r\n if (!this._deferOnly) {\r\n this.position.copyFrom(this._deferredPositionUpdate);\r\n } else {\r\n this._deferredUpdated = true;\r\n }\r\n // call onCollide, if defined. Note that in case of deferred update, the actual position change might happen in the next frame.\r\n if (this.onCollide && collidedMesh) {\r\n this.onCollide(collidedMesh);\r\n }\r\n }\r\n };\r\n\r\n /** @internal */\r\n public override _checkInputs(): void {\r\n if (!this._localDirection) {\r\n this._localDirection = Vector3.Zero();\r\n this._transformedDirection = Vector3.Zero();\r\n }\r\n\r\n this.inputs.checkInputs();\r\n\r\n super._checkInputs();\r\n }\r\n\r\n /**\r\n * Enable movement without a user input. This allows gravity to always be applied.\r\n */\r\n public set needMoveForGravity(value: boolean) {\r\n this._needMoveForGravity = value;\r\n }\r\n\r\n /**\r\n * When true, gravity is applied whether there is user input or not.\r\n */\r\n public get needMoveForGravity(): boolean {\r\n return this._needMoveForGravity;\r\n }\r\n\r\n /** @internal */\r\n public override _decideIfNeedsToMove(): boolean {\r\n return this._needMoveForGravity || Math.abs(this.cameraDirection.x) > 0 || Math.abs(this.cameraDirection.y) > 0 || Math.abs(this.cameraDirection.z) > 0;\r\n }\r\n\r\n /** @internal */\r\n public override _updatePosition(): void {\r\n if (this.checkCollisions && this.getScene().collisionsEnabled) {\r\n this._collideWithWorld(this.cameraDirection);\r\n } else {\r\n super._updatePosition();\r\n }\r\n }\r\n\r\n /**\r\n * Destroy the camera and release the current resources hold by it.\r\n */\r\n public override dispose(): void {\r\n this.inputs.clear();\r\n super.dispose();\r\n }\r\n\r\n /**\r\n * Gets the current object class name.\r\n * @returns the class name\r\n */\r\n public override getClassName(): string {\r\n return \"FreeCamera\";\r\n }\r\n}\r\n\r\n// Register Class Name\r\n\r\nlet _Registered = false;\r\n/**\r\n * Register side effects for freeCamera.\r\n * Safe to call multiple times; only the first call has an effect.\r\n */\r\nexport function RegisterFreeCamera(): void {\r\n if (_Registered) {\r\n return;\r\n }\r\n _Registered = true;\r\n\r\n RegisterClass(\"BABYLON.FreeCamera\", FreeCamera);\r\n}\r\n"]}
@@ -21,5 +21,6 @@ export * from "./RigModes/index.js";
21
21
  export * from "./geospatialCamera.js";
22
22
  export * from "./inputMapper.js";
23
23
  export * from "./cameraMovement.js";
24
+ export * from "./targetCameraMovement.js";
24
25
  export * from "./geospatialCameraMovement.js";
25
26
  export * from "./arcRotateCameraMovement.js";
package/Cameras/index.js CHANGED
@@ -22,6 +22,7 @@ export * from "./RigModes/index.js";
22
22
  export * from "./geospatialCamera.js";
23
23
  export * from "./inputMapper.js";
24
24
  export * from "./cameraMovement.js";
25
+ export * from "./targetCameraMovement.js";
25
26
  export * from "./geospatialCameraMovement.js";
26
27
  export * from "./arcRotateCameraMovement.js";
27
28
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../dev/core/src/Cameras/index.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC;AACtC,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC;AAClC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,aAAa,CAAC;AAC5B,cAAc,0BAA0B,CAAC;AACzC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,0BAA0B,CAAC;AACzC,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,2BAA2B,CAAC","sourcesContent":["/* eslint-disable @typescript-eslint/no-restricted-imports */\r\nexport * from \"./Inputs/index\";\r\nexport * from \"./cameraInputsManager\";\r\nexport * from \"./camera\";\r\nexport * from \"./targetCamera\";\r\nexport * from \"./freeCamera\";\r\nexport * from \"./freeCameraInputsManager\";\r\nexport * from \"./touchCamera\";\r\nexport * from \"./arcRotateCamera\";\r\nexport * from \"./arcRotateCameraInputsManager\";\r\nexport * from \"./deviceOrientationCamera\";\r\nexport * from \"./flyCamera\";\r\nexport * from \"./flyCameraInputsManager\";\r\nexport * from \"./followCamera\";\r\nexport * from \"./followCameraInputsManager\";\r\nexport * from \"./gamepadCamera\";\r\nexport * from \"./Stereoscopic/index\";\r\nexport * from \"./universalCamera\";\r\nexport * from \"./virtualJoysticksCamera\";\r\nexport * from \"./VR/index\";\r\nexport * from \"./RigModes/index\";\r\nexport * from \"./geospatialCamera\";\r\nexport * from \"./inputMapper\";\r\nexport * from \"./cameraMovement\";\r\nexport * from \"./geospatialCameraMovement\";\r\nexport * from \"./arcRotateCameraMovement\";\r\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../dev/core/src/Cameras/index.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC;AACtC,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC;AAClC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,aAAa,CAAC;AAC5B,cAAc,0BAA0B,CAAC;AACzC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,0BAA0B,CAAC;AACzC,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC;AACvC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,2BAA2B,CAAC","sourcesContent":["/* eslint-disable @typescript-eslint/no-restricted-imports */\r\nexport * from \"./Inputs/index\";\r\nexport * from \"./cameraInputsManager\";\r\nexport * from \"./camera\";\r\nexport * from \"./targetCamera\";\r\nexport * from \"./freeCamera\";\r\nexport * from \"./freeCameraInputsManager\";\r\nexport * from \"./touchCamera\";\r\nexport * from \"./arcRotateCamera\";\r\nexport * from \"./arcRotateCameraInputsManager\";\r\nexport * from \"./deviceOrientationCamera\";\r\nexport * from \"./flyCamera\";\r\nexport * from \"./flyCameraInputsManager\";\r\nexport * from \"./followCamera\";\r\nexport * from \"./followCameraInputsManager\";\r\nexport * from \"./gamepadCamera\";\r\nexport * from \"./Stereoscopic/index\";\r\nexport * from \"./universalCamera\";\r\nexport * from \"./virtualJoysticksCamera\";\r\nexport * from \"./VR/index\";\r\nexport * from \"./RigModes/index\";\r\nexport * from \"./geospatialCamera\";\r\nexport * from \"./inputMapper\";\r\nexport * from \"./cameraMovement\";\r\nexport * from \"./targetCameraMovement\";\r\nexport * from \"./geospatialCameraMovement\";\r\nexport * from \"./arcRotateCameraMovement\";\r\n"]}
package/Cameras/pure.d.ts CHANGED
@@ -22,5 +22,6 @@ export * from "./RigModes/pure.js";
22
22
  export * from "./geospatialCamera.pure.js";
23
23
  export * from "./inputMapper.js";
24
24
  export * from "./cameraMovement.js";
25
+ export * from "./targetCameraMovement.js";
25
26
  export * from "./geospatialCameraMovement.js";
26
27
  export * from "./arcRotateCameraMovement.js";
package/Cameras/pure.js CHANGED
@@ -23,6 +23,7 @@ export * from "./RigModes/pure.js";
23
23
  export * from "./geospatialCamera.pure.js";
24
24
  export * from "./inputMapper.js";
25
25
  export * from "./cameraMovement.js";
26
+ export * from "./targetCameraMovement.js";
26
27
  export * from "./geospatialCameraMovement.js";
27
28
  export * from "./arcRotateCameraMovement.js";
28
29
  //# sourceMappingURL=pure.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pure.js","sourceRoot":"","sources":["../../../../dev/core/src/Cameras/pure.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,6DAA6D;AAC7D,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AACtC,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qCAAqC,CAAC;AACpD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,kBAAkB,CAAC;AACjC,cAAc,0BAA0B,CAAC;AACzC,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,yBAAyB,CAAC;AACxC,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,2BAA2B,CAAC","sourcesContent":["/** Pure barrel — re-exports only side-effect-free modules */\n/* eslint-disable @typescript-eslint/no-restricted-imports */\nexport * from \"./Inputs/pure\";\nexport * from \"./cameraInputsManager\";\nexport * from \"./camera.pure\";\nexport * from \"./targetCamera.pure\";\nexport * from \"./freeCamera.pure\";\nexport * from \"./freeCameraInputsManager.pure\";\nexport * from \"./touchCamera.pure\";\nexport * from \"./arcRotateCamera.pure\";\nexport * from \"./arcRotateCameraInputsManager.pure\";\nexport * from \"./deviceOrientationCamera.pure\";\nexport * from \"./flyCamera.pure\";\nexport * from \"./flyCameraInputsManager\";\nexport * from \"./followCamera.pure\";\nexport * from \"./followCameraInputsManager\";\nexport * from \"./gamepadCamera.pure\";\nexport * from \"./Stereoscopic/pure\";\nexport * from \"./universalCamera.pure\";\nexport * from \"./virtualJoysticksCamera.pure\";\nexport * from \"./VR/pure\";\nexport * from \"./RigModes/pure\";\nexport * from \"./geospatialCamera.pure\";\nexport * from \"./inputMapper\";\nexport * from \"./cameraMovement\";\nexport * from \"./geospatialCameraMovement\";\nexport * from \"./arcRotateCameraMovement\";\n"]}
1
+ {"version":3,"file":"pure.js","sourceRoot":"","sources":["../../../../dev/core/src/Cameras/pure.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,6DAA6D;AAC7D,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AACtC,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qCAAqC,CAAC;AACpD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,kBAAkB,CAAC;AACjC,cAAc,0BAA0B,CAAC;AACzC,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,yBAAyB,CAAC;AACxC,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC;AACvC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,2BAA2B,CAAC","sourcesContent":["/** Pure barrel — re-exports only side-effect-free modules */\n/* eslint-disable @typescript-eslint/no-restricted-imports */\nexport * from \"./Inputs/pure\";\nexport * from \"./cameraInputsManager\";\nexport * from \"./camera.pure\";\nexport * from \"./targetCamera.pure\";\nexport * from \"./freeCamera.pure\";\nexport * from \"./freeCameraInputsManager.pure\";\nexport * from \"./touchCamera.pure\";\nexport * from \"./arcRotateCamera.pure\";\nexport * from \"./arcRotateCameraInputsManager.pure\";\nexport * from \"./deviceOrientationCamera.pure\";\nexport * from \"./flyCamera.pure\";\nexport * from \"./flyCameraInputsManager\";\nexport * from \"./followCamera.pure\";\nexport * from \"./followCameraInputsManager\";\nexport * from \"./gamepadCamera.pure\";\nexport * from \"./Stereoscopic/pure\";\nexport * from \"./universalCamera.pure\";\nexport * from \"./virtualJoysticksCamera.pure\";\nexport * from \"./VR/pure\";\nexport * from \"./RigModes/pure\";\nexport * from \"./geospatialCamera.pure\";\nexport * from \"./inputMapper\";\nexport * from \"./cameraMovement\";\nexport * from \"./targetCameraMovement\";\nexport * from \"./geospatialCameraMovement\";\nexport * from \"./arcRotateCameraMovement\";\n"]}
@@ -3,6 +3,7 @@ import { type Nullable } from "../types.js";
3
3
  import { Camera } from "./camera.pure.js";
4
4
  import { type Scene } from "../scene.pure.js";
5
5
  import { Quaternion, Matrix, Vector3, Vector2 } from "../Maths/math.vector.pure.js";
6
+ import { type CameraMovement } from "./cameraMovement.js";
6
7
  /**
7
8
  * A target camera takes a mesh or position as a target and continues to look at it while it moves.
8
9
  * This is the base of the follow, arc rotate cameras and Free camera
@@ -20,6 +21,23 @@ export declare class TargetCamera extends Camera {
20
21
  * Define the current rotation the camera is rotating to
21
22
  */
22
23
  cameraRotation: Vector2;
24
+ /**
25
+ * Framerate-independent movement controller shared by the TargetCamera family
26
+ * (FreeCamera/FlyCamera/FollowCamera). Provides inertial physics and the configurable
27
+ * input map. Subclasses may replace it with a specialized {@link CameraMovement}
28
+ * (for example ArcRotateCamera uses ArcRotateCameraMovement).
29
+ */
30
+ movement: CameraMovement;
31
+ /**
32
+ * Defines the inertia (decay coefficient applied per reference frame at 60fps) of the camera.
33
+ * This helps giving a smooth feeling to the camera movement.
34
+ *
35
+ * Override of {@link Camera.inertia} that writes through to the {@link movement} system so the
36
+ * framerate-independent pan/rotation glide stays in sync. Setting this updates the movement
37
+ * system immediately (matching the accessor convergence used by {@link ArcRotateCamera}).
38
+ */
39
+ get inertia(): number;
40
+ set inertia(value: number);
23
41
  /**
24
42
  * When set, the up vector of the camera will be updated by the rotation of the camera
25
43
  */
@@ -6,6 +6,7 @@ import { Quaternion, Matrix, Vector3, Vector2, TmpVectors } from "../Maths/math.
6
6
  import { Epsilon } from "../Maths/math.constants.js";
7
7
  import { Axis } from "../Maths/math.axis.js";
8
8
  import { Node } from "../node.js";
9
+ import { TargetCameraMovement } from "./targetCameraMovement.js";
9
10
  // Temporary cache variables to avoid allocations.
10
11
  const TmpMatrix = /*#__PURE__*/ Matrix.Zero();
11
12
  const TmpQuaternion = /*#__PURE__*/ Quaternion.Identity();
@@ -15,6 +16,26 @@ const TmpQuaternion = /*#__PURE__*/ Quaternion.Identity();
15
16
  * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras
16
17
  */
17
18
  export class TargetCamera extends Camera {
19
+ /**
20
+ * Defines the inertia (decay coefficient applied per reference frame at 60fps) of the camera.
21
+ * This helps giving a smooth feeling to the camera movement.
22
+ *
23
+ * Override of {@link Camera.inertia} that writes through to the {@link movement} system so the
24
+ * framerate-independent pan/rotation glide stays in sync. Setting this updates the movement
25
+ * system immediately (matching the accessor convergence used by {@link ArcRotateCamera}).
26
+ */
27
+ get inertia() {
28
+ return super.inertia;
29
+ }
30
+ set inertia(value) {
31
+ super.inertia = value;
32
+ // `movement` is constructed in this class' constructor; guard for the base-constructor
33
+ // assignment that runs before it exists.
34
+ if (this.movement) {
35
+ this.movement.panInertia = value;
36
+ this.movement.rotationInertia = value;
37
+ }
38
+ }
18
39
  /**
19
40
  * Instantiates a target camera that takes a mesh or position as a target and continues to look at it while it moves.
20
41
  * This is the base of the follow, arc rotate cameras and Free camera
@@ -91,6 +112,11 @@ export class TargetCamera extends Camera {
91
112
  this._referencePoint = Vector3.Forward(this.getScene().useRightHandedSystem);
92
113
  // Set the y component of the rotation to Math.PI in right-handed system for backwards compatibility.
93
114
  this.rotation = new Vector3(0, this.getScene().useRightHandedSystem ? Math.PI : 0, 0);
115
+ this.movement = new TargetCameraMovement(this.getScene(), this.position);
116
+ // Seed movement-system inertia from the value set during base/subclass construction.
117
+ // After this point, the `inertia` setter on this class pushes directly to movement.
118
+ this.movement.panInertia = this.inertia;
119
+ this.movement.rotationInertia = this.inertia;
94
120
  }
95
121
  /**
96
122
  * Gets the position in front of the camera at a given distance.
@@ -269,9 +295,44 @@ export class TargetCamera extends Camera {
269
295
  }
270
296
  /** @internal */
271
297
  _checkInputs() {
298
+ // Fold this frame's raw input — written to `cameraDirection`/`cameraRotation` by the input
299
+ // classes (and honored from direct external writes) — into the movement system, then let it
300
+ // produce framerate-independent per-frame deltas (input plus inertial glide). The applied
301
+ // delta is written back into `cameraDirection`/`cameraRotation` purely as a within-frame
302
+ // hand-off so the collision, gravity, and rotation-constraint logic below reads it unchanged.
303
+ // Both fields are reset to 0 at the end of this method (the inertial glide now lives in the
304
+ // movement system's velocity, not in these fields), so external code polling them *after*
305
+ // `_checkInputs()` reads 0 rather than the legacy residual glide value.
306
+ const movement = this.movement;
307
+ movement.panAccumulatedPixels.addInPlace(this.cameraDirection);
308
+ movement.rotationAccumulatedPixels.x += this.cameraRotation.x;
309
+ movement.rotationAccumulatedPixels.y += this.cameraRotation.y;
310
+ movement.computeCurrentFrameDeltas();
311
+ this.cameraDirection.copyFrom(movement.panDeltaCurrentFrame);
312
+ this.cameraRotation.set(movement.rotationDeltaCurrentFrame.x, movement.rotationDeltaCurrentFrame.y);
313
+ // Backward-compat glide cutoff: honor the legacy `_panningEpsilon` / `_rotationEpsilon` knobs.
314
+ // Legacy `_checkInputs` snapped `cameraDirection`/`cameraRotation` to 0 once a component fell
315
+ // below `speed * _panningEpsilon` / `speed * _rotationEpsilon`, ending inertial glide at that
316
+ // threshold. The framerate-independent port moved glide into the movement system's velocity, so
317
+ // we mirror that cutoff here: when this frame's emitted glide delta is below the legacy limit,
318
+ // zero the delta AND reset the movement velocity so glide terminates at the same point (and the
319
+ // public knobs stay meaningful). Active drags produce deltas well above the limit, so this only
320
+ // triggers on the decaying tail.
321
+ const inertialPanningLimit = this.speed * this._panningEpsilon;
322
+ if (Math.abs(this.cameraDirection.x) < inertialPanningLimit &&
323
+ Math.abs(this.cameraDirection.y) < inertialPanningLimit &&
324
+ Math.abs(this.cameraDirection.z) < inertialPanningLimit) {
325
+ this.cameraDirection.setAll(0);
326
+ movement.resetPanVelocity();
327
+ }
328
+ const inertialRotationLimit = this.speed * this._rotationEpsilon;
329
+ if (Math.abs(this.cameraRotation.x) < inertialRotationLimit && Math.abs(this.cameraRotation.y) < inertialRotationLimit) {
330
+ this.cameraRotation.set(0, 0);
331
+ movement.resetRotationVelocity();
332
+ }
272
333
  const directionMultiplier = this.invertRotation ? -this.inverseRotationSpeed : 1.0;
273
334
  const needToMove = this._decideIfNeedsToMove();
274
- const needToRotate = this.cameraRotation.x || this.cameraRotation.y;
335
+ const needToRotate = !!(this.cameraRotation.x || this.cameraRotation.y);
275
336
  this._deferredUpdated = false;
276
337
  this._deferredRotationUpdate.copyFrom(this.rotation);
277
338
  this._deferredPositionUpdate.copyFrom(this.position);
@@ -320,30 +381,12 @@ export class TargetCamera extends Camera {
320
381
  }
321
382
  }
322
383
  }
323
- const inertialPanningLimit = this.speed * this._panningEpsilon;
324
- const inertialRotationLimit = this.speed * this._rotationEpsilon;
325
- // Inertia
326
- if (needToMove) {
327
- if (Math.abs(this.cameraDirection.x) < inertialPanningLimit) {
328
- this.cameraDirection.x = 0;
329
- }
330
- if (Math.abs(this.cameraDirection.y) < inertialPanningLimit) {
331
- this.cameraDirection.y = 0;
332
- }
333
- if (Math.abs(this.cameraDirection.z) < inertialPanningLimit) {
334
- this.cameraDirection.z = 0;
335
- }
336
- this.cameraDirection.scaleInPlace(this.inertia);
337
- }
338
- if (needToRotate) {
339
- if (Math.abs(this.cameraRotation.x) < inertialRotationLimit) {
340
- this.cameraRotation.x = 0;
341
- }
342
- if (Math.abs(this.cameraRotation.y) < inertialRotationLimit) {
343
- this.cameraRotation.y = 0;
344
- }
345
- this.cameraRotation.scaleInPlace(this.inertia);
346
- }
384
+ // The movement system now owns inertial decay (framerate-independent), so reset the
385
+ // per-frame delta surfaces. Glide persists inside the movement velocity and is re-emitted
386
+ // next frame via `computeCurrentFrameDeltas`; zeroing here prevents the just-applied delta
387
+ // from being re-folded into the accumulators on the next frame.
388
+ this.cameraDirection.setAll(0);
389
+ this.cameraRotation.set(0, 0);
347
390
  super._checkInputs();
348
391
  }
349
392
  _updateCameraRotationMatrix() {