@onerjs/core 8.31.0 → 8.31.2

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 (124) hide show
  1. package/Animations/animationGroup.js +1 -4
  2. package/Animations/animationGroup.js.map +1 -1
  3. package/Behaviors/Cameras/interpolatingBehavior.d.ts +8 -2
  4. package/Behaviors/Cameras/interpolatingBehavior.js +58 -6
  5. package/Behaviors/Cameras/interpolatingBehavior.js.map +1 -1
  6. package/Cameras/Inputs/freeCameraDeviceOrientationInput.js +11 -9
  7. package/Cameras/Inputs/freeCameraDeviceOrientationInput.js.map +1 -1
  8. package/Cameras/Inputs/geospatialCameraKeyboardInput.d.ts +81 -0
  9. package/Cameras/Inputs/geospatialCameraKeyboardInput.js +223 -0
  10. package/Cameras/Inputs/geospatialCameraKeyboardInput.js.map +1 -0
  11. package/Cameras/Inputs/geospatialCameraMouseWheelInput.js +1 -1
  12. package/Cameras/Inputs/geospatialCameraMouseWheelInput.js.map +1 -1
  13. package/Cameras/Inputs/geospatialCameraPointersInput.d.ts +8 -20
  14. package/Cameras/Inputs/geospatialCameraPointersInput.js +35 -75
  15. package/Cameras/Inputs/geospatialCameraPointersInput.js.map +1 -1
  16. package/Cameras/Limits/geospatialLimits.d.ts +60 -0
  17. package/Cameras/Limits/geospatialLimits.js +89 -0
  18. package/Cameras/Limits/geospatialLimits.js.map +1 -0
  19. package/Cameras/Stereoscopic/stereoscopicScreenUniversalCamera.js +1 -1
  20. package/Cameras/Stereoscopic/stereoscopicScreenUniversalCamera.js.map +1 -1
  21. package/Cameras/VR/vrExperienceHelper.js +2 -2
  22. package/Cameras/VR/vrExperienceHelper.js.map +1 -1
  23. package/Cameras/cameraMovement.js +1 -1
  24. package/Cameras/cameraMovement.js.map +1 -1
  25. package/Cameras/deviceOrientationCamera.js +5 -3
  26. package/Cameras/deviceOrientationCamera.js.map +1 -1
  27. package/Cameras/flyCamera.d.ts +2 -1
  28. package/Cameras/flyCamera.js.map +1 -1
  29. package/Cameras/geospatialCamera.d.ts +78 -49
  30. package/Cameras/geospatialCamera.js +210 -191
  31. package/Cameras/geospatialCamera.js.map +1 -1
  32. package/Cameras/geospatialCameraInputsManager.d.ts +5 -0
  33. package/Cameras/geospatialCameraInputsManager.js +9 -0
  34. package/Cameras/geospatialCameraInputsManager.js.map +1 -1
  35. package/Cameras/geospatialCameraMovement.d.ts +66 -0
  36. package/Cameras/geospatialCameraMovement.js +199 -0
  37. package/Cameras/geospatialCameraMovement.js.map +1 -0
  38. package/Cameras/targetCamera.d.ts +1 -1
  39. package/Cameras/targetCamera.js +2 -2
  40. package/Cameras/targetCamera.js.map +1 -1
  41. package/Engines/Native/nativeInterfaces.d.ts +14 -6
  42. package/Engines/Native/nativeInterfaces.js +6 -1
  43. package/Engines/Native/nativeInterfaces.js.map +1 -1
  44. package/Engines/abstractEngine.js +2 -2
  45. package/Engines/abstractEngine.js.map +1 -1
  46. package/Engines/nativeEngine.js +2 -2
  47. package/Engines/nativeEngine.js.map +1 -1
  48. package/FlowGraph/Blocks/Data/Math/flowGraphVectorMathBlocks.js +1 -1
  49. package/FlowGraph/Blocks/Data/Math/flowGraphVectorMathBlocks.js.map +1 -1
  50. package/FlowGraph/flowGraphMath.d.ts +25 -0
  51. package/FlowGraph/flowGraphMath.js +40 -0
  52. package/FlowGraph/flowGraphMath.js.map +1 -0
  53. package/Materials/GaussianSplatting/gaussianSplattingMaterial.js +1 -1
  54. package/Materials/GaussianSplatting/gaussianSplattingMaterial.js.map +1 -1
  55. package/Materials/Node/Blocks/GaussianSplatting/gaussianSplattingBlock.js +5 -1
  56. package/Materials/Node/Blocks/GaussianSplatting/gaussianSplattingBlock.js.map +1 -1
  57. package/Materials/Node/Blocks/GaussianSplatting/splatReaderBlock.js +6 -5
  58. package/Materials/Node/Blocks/GaussianSplatting/splatReaderBlock.js.map +1 -1
  59. package/Materials/shaderMaterial.js +4 -2
  60. package/Materials/shaderMaterial.js.map +1 -1
  61. package/Maths/math.vector.functions.d.ts +5 -24
  62. package/Maths/math.vector.functions.js +32 -35
  63. package/Maths/math.vector.functions.js.map +1 -1
  64. package/Meshes/GaussianSplatting/gaussianSplattingMesh.d.ts +1 -0
  65. package/Meshes/GaussianSplatting/gaussianSplattingMesh.js +51 -16
  66. package/Meshes/GaussianSplatting/gaussianSplattingMesh.js.map +1 -1
  67. package/Meshes/csg2.js +1 -1
  68. package/Meshes/csg2.js.map +1 -1
  69. package/Meshes/thinInstanceMesh.js +15 -0
  70. package/Meshes/thinInstanceMesh.js.map +1 -1
  71. package/Misc/fileTools.js.map +1 -1
  72. package/Misc/tools.d.ts +3 -0
  73. package/Misc/tools.js +43 -4
  74. package/Misc/tools.js.map +1 -1
  75. package/Particles/Node/Blocks/Update/basicPositionUpdateBlock.js +2 -2
  76. package/Particles/Node/Blocks/Update/basicPositionUpdateBlock.js.map +1 -1
  77. package/Particles/Node/Blocks/particleInputBlock.js +1 -0
  78. package/Particles/Node/Blocks/particleInputBlock.js.map +1 -1
  79. package/Particles/Node/Blocks/systemBlock.d.ts +8 -8
  80. package/Particles/Node/Blocks/systemBlock.js +12 -12
  81. package/Particles/Node/Blocks/systemBlock.js.map +1 -1
  82. package/Particles/Node/Enums/nodeParticleContextualSources.d.ts +3 -1
  83. package/Particles/Node/Enums/nodeParticleContextualSources.js +2 -0
  84. package/Particles/Node/Enums/nodeParticleContextualSources.js.map +1 -1
  85. package/Particles/Node/nodeParticleBuildState.d.ts +5 -5
  86. package/Particles/Node/nodeParticleBuildState.js +9 -7
  87. package/Particles/Node/nodeParticleBuildState.js.map +1 -1
  88. package/Particles/Node/nodeParticleSystemSet.helper.js +288 -149
  89. package/Particles/Node/nodeParticleSystemSet.helper.js.map +1 -1
  90. package/Particles/particle.d.ts +4 -0
  91. package/Particles/particle.js +2 -0
  92. package/Particles/particle.js.map +1 -1
  93. package/Particles/thinParticleSystem.d.ts +0 -4
  94. package/Particles/thinParticleSystem.function.d.ts +1 -1
  95. package/Particles/thinParticleSystem.function.js +9 -6
  96. package/Particles/thinParticleSystem.function.js.map +1 -1
  97. package/Particles/thinParticleSystem.js +1 -3
  98. package/Particles/thinParticleSystem.js.map +1 -1
  99. package/Shaders/ShadersInclude/gaussianSplatting.js +5 -1
  100. package/Shaders/ShadersInclude/gaussianSplatting.js.map +1 -1
  101. package/Shaders/ShadersInclude/gaussianSplattingUboDeclaration.js +2 -1
  102. package/Shaders/ShadersInclude/gaussianSplattingUboDeclaration.js.map +1 -1
  103. package/Shaders/ShadersInclude/gaussianSplattingVertexDeclaration.js +1 -1
  104. package/Shaders/ShadersInclude/gaussianSplattingVertexDeclaration.js.map +1 -1
  105. package/Shaders/gaussianSplatting.vertex.js +3 -3
  106. package/Shaders/gaussianSplatting.vertex.js.map +1 -1
  107. package/Shaders/gaussianSplattingDepth.vertex.js +2 -2
  108. package/Shaders/gaussianSplattingDepth.vertex.js.map +1 -1
  109. package/ShadersWGSL/ShadersInclude/gaussianSplatting.js +35 -1
  110. package/ShadersWGSL/ShadersInclude/gaussianSplatting.js.map +1 -1
  111. package/ShadersWGSL/ShadersInclude/gaussianSplattingUboDeclaration.js +2 -1
  112. package/ShadersWGSL/ShadersInclude/gaussianSplattingUboDeclaration.js.map +1 -1
  113. package/ShadersWGSL/ShadersInclude/gaussianSplattingVertexDeclaration.js +1 -2
  114. package/ShadersWGSL/ShadersInclude/gaussianSplattingVertexDeclaration.js.map +1 -1
  115. package/ShadersWGSL/gaussianSplatting.vertex.js +3 -3
  116. package/ShadersWGSL/gaussianSplatting.vertex.js.map +1 -1
  117. package/ShadersWGSL/gaussianSplattingDepth.vertex.js +2 -2
  118. package/ShadersWGSL/gaussianSplattingDepth.vertex.js.map +1 -1
  119. package/XR/webXRCamera.d.ts +5 -1
  120. package/XR/webXRCamera.js +2 -2
  121. package/XR/webXRCamera.js.map +1 -1
  122. package/XR/webXRExperienceHelper.js +1 -1
  123. package/XR/webXRExperienceHelper.js.map +1 -1
  124. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"cameraMovement.js","sourceRoot":"","sources":["../../../../dev/core/src/Cameras/cameraMovement.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Scene } from \"../scene\";\r\nimport { Vector3 } from \"../Maths/math.vector\";\r\nimport { Epsilon } from \"../Maths/math.constants\";\r\nimport type { InterpolatingBehavior } from \"../Behaviors/Cameras/interpolatingBehavior\";\r\n\r\nconst FrameDurationAt60FPS = 1000 / 60;\r\n/**\r\n * @experimental\r\n * This class is subject to change as geospatial camera evolves.\r\n *\r\n * It is intended to hold all logic related to converting input pixel deltas into current frame deltas, taking speed / framerate into account\r\n * to ensure smooth frame-rate-independent movement\r\n */\r\nexport class CameraMovement {\r\n protected _scene: Scene;\r\n\r\n /**\r\n * Should be set by input classes to indicates whether there is active input this frame\r\n * This helps us differentiate between 0 pixel delta due to no input vs user actively holding still\r\n */\r\n public activeInput: boolean = false;\r\n\r\n /**\r\n * ------------ Speed ----------------\r\n * Speed defines the amount of camera movement expected per input pixel movement\r\n * -----------------------------------\r\n */\r\n /**\r\n * Desired coordinate unit movement per input pixel when zooming\r\n */\r\n public zoomSpeed: number = 1;\r\n /**\r\n * Desired coordinate unit movement per input pixel when panning\r\n */\r\n public panSpeed: number = 1;\r\n /**\r\n * Desired radians movement per input pixel when rotating along x axis\r\n */\r\n public rotationXSpeed: number = 1;\r\n /**\r\n * Desired radians movement per input pixel when rotating along y axis\r\n */\r\n public rotationYSpeed: number = 1;\r\n\r\n /**\r\n * ----------- Speed multipliers ---------------\r\n * Multipliers allow movement classes to modify the effective speed dynamically per-frame\r\n * (ex: scale zoom based on distance from target)\r\n * -----------------------------------\r\n */\r\n /**\r\n * Multiplied atop zoom speed. Used to dynamically adjust zoom speed based on per-frame context (ex: zoom faster when further from target)\r\n */\r\n protected _zoomSpeedMultiplier: number = 1;\r\n /**\r\n * Multiplied atop pan speed. Used to dynamically adjust pan speed based on per-frame context (ex: pan slowly when close to target)\r\n */\r\n protected _panSpeedMultiplier: number = 1;\r\n\r\n /**\r\n * ---------- Inertia ----------------\r\n * Inertia represents the decay factor per-frame applied to the velocity when there is no user input.\r\n * 0 = No inertia, instant stop (velocity immediately becomes 0)\r\n * 0.5 = Strong decay, velocity halves every frame at 60fps\r\n * 0.9 = Moderate inertia, velocity retains 90% per frame at 60fps\r\n * 0.95 = High inertia, smooth glide, velocity retains 95% per frame at 60fps\r\n * 1 = Infinite inertia, never stops (velocity never decays)\r\n * -----------------------------------\r\n */\r\n /**\r\n * Inertia applied to the zoom velocity when there is no user input.\r\n * Higher inertia === slower decay, velocity retains more of its value each frame\r\n */\r\n public zoomInertia: number = 0.9;\r\n /**\r\n * Inertia applied to the panning velocity when there is no user input.\r\n * Higher inertia === slower decay, velocity retains more of its value each frame\r\n */\r\n public panInertia: number = 0.9;\r\n /**\r\n * Inertia applied to the rotation velocity when there is no user input.\r\n * Higher inertia === slower decay, velocity retains more of its value each frame\r\n */\r\n public rotationInertia: number = 0.9;\r\n\r\n /**\r\n * ---------- Accumulated Pixel Deltas -----------\r\n * Pixel inputs accumulated throughout the frame by input classes (reset each frame after processing)\r\n * -----------------------------------\r\n */\r\n /**\r\n * Accumulated pixel delta (by input classes) for zoom this frame\r\n * Read by computeCurrentFrameDeltas() function and converted into currentFrameTranslationDelta (taking speed into account)\r\n * Reset to zero after each frame\r\n */\r\n public zoomAccumulatedPixels: number = 0;\r\n /**\r\n * Accumulated pixel delta (by input classes) for panning this frame\r\n * Read by computeCurrentFrameDeltas() function and converted into currentFrameTranslationDelta (taking speed into account)\r\n * Reset to zero after each frame\r\n */\r\n public panAccumulatedPixels: Vector3 = new Vector3();\r\n /**\r\n * Accumulated pixel delta (by input classes) for rotation this frame\r\n * Read by computeCurrentFrameDeltas() function and converted into currentFrameTranslationDelta (taking speed into account)\r\n * Reset to zero after each frame\r\n */\r\n public rotationAccumulatedPixels: Vector3 = new Vector3();\r\n\r\n /**\r\n * ---------- Current Frame Movement Deltas -----------\r\n * Deltas read on each frame by camera class in order to move the camera\r\n * -----------------------------------\r\n */\r\n /**\r\n * Zoom delta to apply to camera this frame, computed by computeCurrentFrameDeltas() from zoomPixelDelta (taking speed into account)\r\n */\r\n public zoomDeltaCurrentFrame: number = 0;\r\n /**\r\n * Pan delta to apply to camera this frame, computed by computeCurrentFrameDeltas() from panPixelDelta (taking speed into account)\r\n */\r\n public panDeltaCurrentFrame: Vector3 = Vector3.Zero();\r\n /**\r\n * Rotation delta to apply to camera this frame, computed by computeCurrentFrameDeltas() from rotationPixelDelta (taking speed into account)\r\n */\r\n public rotationDeltaCurrentFrame: Vector3 = Vector3.Zero();\r\n\r\n /**\r\n * ---------- Velocity -----------\r\n * Used to track velocity between frames for inertia calculation\r\n * -----------------------------------\r\n */\r\n /**\r\n * Zoom velocity used for inertia calculations (movement / time)\r\n */\r\n protected _zoomVelocity: number = 0;\r\n /**\r\n * Pan velocity used for inertia calculations (movement / time)\r\n */\r\n private _panVelocity: Vector3 = new Vector3();\r\n /**\r\n * Rotation velocity used for inertia calculations (movement / time)\r\n */\r\n private _rotationVelocity: Vector3 = new Vector3();\r\n\r\n /**\r\n * Used when calculating inertial decay. Default to 60fps\r\n */\r\n private _prevFrameTimeMs: number = FrameDurationAt60FPS;\r\n\r\n constructor(\r\n scene: Scene,\r\n protected _cameraPosition: Vector3,\r\n protected _behavior?: InterpolatingBehavior\r\n ) {\r\n this._scene = scene;\r\n }\r\n\r\n /**\r\n * When called, will take the accumulated pixel deltas set by input classes and convert them into current frame deltas, stored in currentFrameMovementDelta properties\r\n * Takes speed, scaling, inertia, and framerate into account to ensure smooth movement\r\n * Zeros out pixelDeltas before returning\r\n */\r\n public computeCurrentFrameDeltas(): void {\r\n const deltaTimeMs = this._scene.getEngine().getDeltaTime();\r\n\r\n this.panDeltaCurrentFrame.setAll(0);\r\n this.rotationDeltaCurrentFrame.setAll(0);\r\n this.zoomDeltaCurrentFrame = 0;\r\n\r\n const hasUserInput = this.panAccumulatedPixels.length() > 0 || this.rotationAccumulatedPixels.length() > 0 || this.zoomAccumulatedPixels !== 0;\r\n\r\n if (hasUserInput && this._behavior?.isInterpolating) {\r\n this._behavior.stopAllAnimations();\r\n }\r\n\r\n this._panVelocity.copyFromFloats(\r\n this._calculateCurrentVelocity(this._panVelocity.x, this.panAccumulatedPixels.x, this.panSpeed * this._panSpeedMultiplier, this.panInertia),\r\n this._calculateCurrentVelocity(this._panVelocity.y, this.panAccumulatedPixels.y, this.panSpeed * this._panSpeedMultiplier, this.panInertia),\r\n this._calculateCurrentVelocity(this._panVelocity.z, this.panAccumulatedPixels.z, this.panSpeed * this._panSpeedMultiplier, this.panInertia)\r\n );\r\n this._panVelocity.scaleToRef(deltaTimeMs, this.panDeltaCurrentFrame);\r\n\r\n this._rotationVelocity.copyFromFloats(\r\n this._calculateCurrentVelocity(this._rotationVelocity.x, this.rotationAccumulatedPixels.x, this.rotationXSpeed, this.rotationInertia),\r\n this._calculateCurrentVelocity(this._rotationVelocity.y, this.rotationAccumulatedPixels.y, this.rotationYSpeed, this.rotationInertia),\r\n this._calculateCurrentVelocity(this._rotationVelocity.z, this.rotationAccumulatedPixels.z, this.rotationYSpeed, this.rotationInertia)\r\n );\r\n this._rotationVelocity.scaleToRef(deltaTimeMs, this.rotationDeltaCurrentFrame);\r\n\r\n this._zoomVelocity = this._calculateCurrentVelocity(this._zoomVelocity, this.zoomAccumulatedPixels, this.zoomSpeed * this._zoomSpeedMultiplier, this.zoomInertia);\r\n this.zoomDeltaCurrentFrame = this._zoomVelocity * deltaTimeMs;\r\n\r\n this._prevFrameTimeMs = deltaTimeMs;\r\n this.zoomAccumulatedPixels = 0;\r\n this.panAccumulatedPixels.setAll(0);\r\n this.rotationAccumulatedPixels.setAll(0);\r\n }\r\n\r\n public get isInterpolating(): boolean {\r\n return !!this._behavior?.isInterpolating;\r\n }\r\n\r\n private _calculateCurrentVelocity(velocityRef: number, pixelDelta: number, speedFactor: number, inertialDecayFactor: number): number {\r\n let inputVelocity = velocityRef;\r\n const deltaTimeMs = this._scene.getEngine().getDeltaTime();\r\n\r\n // If we are actively recieving input or have accumulated some pixel delta since last frame, calculate inputVelocity (inertia doesn't kickin yet)\r\n if (pixelDelta !== 0 || this.activeInput) {\r\n const pixelsPerMs = pixelDelta / deltaTimeMs;\r\n inputVelocity = pixelsPerMs * speedFactor;\r\n } else if (!this.activeInput && inputVelocity !== 0) {\r\n // If we are not receiving input and velocity isn't already zero, apply inertial decay to decelerate velocity\r\n const frameIndependentDecay = Math.pow(inertialDecayFactor, this._prevFrameTimeMs / FrameDurationAt60FPS);\r\n inputVelocity *= frameIndependentDecay;\r\n if (Math.abs(inputVelocity) <= Epsilon) {\r\n inputVelocity = 0;\r\n }\r\n }\r\n\r\n return inputVelocity;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"cameraMovement.js","sourceRoot":"","sources":["../../../../dev/core/src/Cameras/cameraMovement.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Scene } from \"../scene\";\r\nimport { Vector3 } from \"../Maths/math.vector\";\r\nimport { Epsilon } from \"../Maths/math.constants\";\r\nimport type { InterpolatingBehavior } from \"../Behaviors/Cameras/interpolatingBehavior\";\r\n\r\nconst FrameDurationAt60FPS = 1000 / 60;\r\n/**\r\n * @experimental\r\n * This class is subject to change as geospatial camera evolves.\r\n *\r\n * It is intended to hold all logic related to converting input pixel deltas into current frame deltas, taking speed / framerate into account\r\n * to ensure smooth frame-rate-independent movement\r\n */\r\nexport class CameraMovement {\r\n protected _scene: Scene;\r\n\r\n /**\r\n * Should be set by input classes to indicates whether there is active input this frame\r\n * This helps us differentiate between 0 pixel delta due to no input vs user actively holding still\r\n */\r\n public activeInput: boolean = false;\r\n\r\n /**\r\n * ------------ Speed ----------------\r\n * Speed defines the amount of camera movement expected per input pixel movement\r\n * -----------------------------------\r\n */\r\n /**\r\n * Desired coordinate unit movement per input pixel when zooming\r\n */\r\n public zoomSpeed: number = 1;\r\n /**\r\n * Desired coordinate unit movement per input pixel when panning\r\n */\r\n public panSpeed: number = 1;\r\n /**\r\n * Desired radians movement per input pixel when rotating along x axis\r\n */\r\n public rotationXSpeed: number = 1;\r\n /**\r\n * Desired radians movement per input pixel when rotating along y axis\r\n */\r\n public rotationYSpeed: number = 1;\r\n\r\n /**\r\n * ----------- Speed multipliers ---------------\r\n * Multipliers allow movement classes to modify the effective speed dynamically per-frame\r\n * (ex: scale zoom based on distance from target)\r\n * -----------------------------------\r\n */\r\n /**\r\n * Multiplied atop zoom speed. Used to dynamically adjust zoom speed based on per-frame context (ex: zoom faster when further from target)\r\n */\r\n protected _zoomSpeedMultiplier: number = 1;\r\n /**\r\n * Multiplied atop pan speed. Used to dynamically adjust pan speed based on per-frame context (ex: pan slowly when close to target)\r\n */\r\n protected _panSpeedMultiplier: number = 1;\r\n\r\n /**\r\n * ---------- Inertia ----------------\r\n * Inertia represents the decay factor per-frame applied to the velocity when there is no user input.\r\n * 0 = No inertia, instant stop (velocity immediately becomes 0)\r\n * 0.5 = Strong decay, velocity halves every frame at 60fps\r\n * 0.9 = Moderate inertia, velocity retains 90% per frame at 60fps\r\n * 0.95 = High inertia, smooth glide, velocity retains 95% per frame at 60fps\r\n * 1 = Infinite inertia, never stops (velocity never decays)\r\n * -----------------------------------\r\n */\r\n /**\r\n * Inertia applied to the zoom velocity when there is no user input.\r\n * Higher inertia === slower decay, velocity retains more of its value each frame\r\n */\r\n public zoomInertia: number = 0.9;\r\n /**\r\n * Inertia applied to the panning velocity when there is no user input.\r\n * Higher inertia === slower decay, velocity retains more of its value each frame\r\n */\r\n public panInertia: number = 0.9;\r\n /**\r\n * Inertia applied to the rotation velocity when there is no user input.\r\n * Higher inertia === slower decay, velocity retains more of its value each frame\r\n */\r\n public rotationInertia: number = 0.9;\r\n\r\n /**\r\n * ---------- Accumulated Pixel Deltas -----------\r\n * Pixel inputs accumulated throughout the frame by input classes (reset each frame after processing)\r\n * -----------------------------------\r\n */\r\n /**\r\n * Accumulated pixel delta (by input classes) for zoom this frame\r\n * Read by computeCurrentFrameDeltas() function and converted into currentFrameTranslationDelta (taking speed into account)\r\n * Reset to zero after each frame\r\n */\r\n public zoomAccumulatedPixels: number = 0;\r\n /**\r\n * Accumulated pixel delta (by input classes) for panning this frame\r\n * Read by computeCurrentFrameDeltas() function and converted into currentFrameTranslationDelta (taking speed into account)\r\n * Reset to zero after each frame\r\n */\r\n public panAccumulatedPixels: Vector3 = new Vector3();\r\n /**\r\n * Accumulated pixel delta (by input classes) for rotation this frame\r\n * Read by computeCurrentFrameDeltas() function and converted into currentFrameTranslationDelta (taking speed into account)\r\n * Reset to zero after each frame\r\n */\r\n public rotationAccumulatedPixels: Vector3 = new Vector3();\r\n\r\n /**\r\n * ---------- Current Frame Movement Deltas -----------\r\n * Deltas read on each frame by camera class in order to move the camera\r\n * -----------------------------------\r\n */\r\n /**\r\n * Zoom delta to apply to camera this frame, computed by computeCurrentFrameDeltas() from zoomPixelDelta (taking speed into account)\r\n */\r\n public zoomDeltaCurrentFrame: number = 0;\r\n /**\r\n * Pan delta to apply to camera this frame, computed by computeCurrentFrameDeltas() from panPixelDelta (taking speed into account)\r\n */\r\n public panDeltaCurrentFrame: Vector3 = Vector3.Zero();\r\n /**\r\n * Rotation delta to apply to camera this frame, computed by computeCurrentFrameDeltas() from rotationPixelDelta (taking speed into account)\r\n */\r\n public rotationDeltaCurrentFrame: Vector3 = Vector3.Zero();\r\n\r\n /**\r\n * ---------- Velocity -----------\r\n * Used to track velocity between frames for inertia calculation\r\n * -----------------------------------\r\n */\r\n /**\r\n * Zoom velocity used for inertia calculations (movement / time)\r\n */\r\n protected _zoomVelocity: number = 0;\r\n /**\r\n * Pan velocity used for inertia calculations (movement / time)\r\n */\r\n private _panVelocity: Vector3 = new Vector3();\r\n /**\r\n * Rotation velocity used for inertia calculations (movement / time)\r\n */\r\n private _rotationVelocity: Vector3 = new Vector3();\r\n\r\n /**\r\n * Used when calculating inertial decay. Default to 60fps\r\n */\r\n private _prevFrameTimeMs: number = FrameDurationAt60FPS;\r\n\r\n constructor(\r\n scene: Scene,\r\n protected _cameraPosition: Vector3,\r\n protected _behavior?: InterpolatingBehavior\r\n ) {\r\n this._scene = scene;\r\n }\r\n\r\n /**\r\n * When called, will take the accumulated pixel deltas set by input classes and convert them into current frame deltas, stored in currentFrameMovementDelta properties\r\n * Takes speed, scaling, inertia, and framerate into account to ensure smooth movement\r\n * Zeros out pixelDeltas before returning\r\n */\r\n public computeCurrentFrameDeltas(): void {\r\n const deltaTimeMs = this._scene.getEngine().getDeltaTime();\r\n\r\n this.panDeltaCurrentFrame.setAll(0);\r\n this.rotationDeltaCurrentFrame.setAll(0);\r\n this.zoomDeltaCurrentFrame = 0;\r\n\r\n const hasUserInput = this.panAccumulatedPixels.lengthSquared() > 0 || this.rotationAccumulatedPixels.lengthSquared() > 0 || this.zoomAccumulatedPixels !== 0;\r\n\r\n if (hasUserInput && this._behavior?.isInterpolating) {\r\n this._behavior.stopAllAnimations();\r\n }\r\n\r\n this._panVelocity.copyFromFloats(\r\n this._calculateCurrentVelocity(this._panVelocity.x, this.panAccumulatedPixels.x, this.panSpeed * this._panSpeedMultiplier, this.panInertia),\r\n this._calculateCurrentVelocity(this._panVelocity.y, this.panAccumulatedPixels.y, this.panSpeed * this._panSpeedMultiplier, this.panInertia),\r\n this._calculateCurrentVelocity(this._panVelocity.z, this.panAccumulatedPixels.z, this.panSpeed * this._panSpeedMultiplier, this.panInertia)\r\n );\r\n this._panVelocity.scaleToRef(deltaTimeMs, this.panDeltaCurrentFrame);\r\n\r\n this._rotationVelocity.copyFromFloats(\r\n this._calculateCurrentVelocity(this._rotationVelocity.x, this.rotationAccumulatedPixels.x, this.rotationXSpeed, this.rotationInertia),\r\n this._calculateCurrentVelocity(this._rotationVelocity.y, this.rotationAccumulatedPixels.y, this.rotationYSpeed, this.rotationInertia),\r\n this._calculateCurrentVelocity(this._rotationVelocity.z, this.rotationAccumulatedPixels.z, this.rotationYSpeed, this.rotationInertia)\r\n );\r\n this._rotationVelocity.scaleToRef(deltaTimeMs, this.rotationDeltaCurrentFrame);\r\n\r\n this._zoomVelocity = this._calculateCurrentVelocity(this._zoomVelocity, this.zoomAccumulatedPixels, this.zoomSpeed * this._zoomSpeedMultiplier, this.zoomInertia);\r\n this.zoomDeltaCurrentFrame = this._zoomVelocity * deltaTimeMs;\r\n\r\n this._prevFrameTimeMs = deltaTimeMs;\r\n this.zoomAccumulatedPixels = 0;\r\n this.panAccumulatedPixels.setAll(0);\r\n this.rotationAccumulatedPixels.setAll(0);\r\n }\r\n\r\n public get isInterpolating(): boolean {\r\n return !!this._behavior?.isInterpolating;\r\n }\r\n\r\n private _calculateCurrentVelocity(velocityRef: number, pixelDelta: number, speedFactor: number, inertialDecayFactor: number): number {\r\n let inputVelocity = velocityRef;\r\n const deltaTimeMs = this._scene.getEngine().getDeltaTime();\r\n\r\n // If we are actively recieving input or have accumulated some pixel delta since last frame, calculate inputVelocity (inertia doesn't kickin yet)\r\n if (pixelDelta !== 0 || this.activeInput) {\r\n const pixelsPerMs = pixelDelta / deltaTimeMs;\r\n inputVelocity = pixelsPerMs * speedFactor;\r\n } else if (!this.activeInput && inputVelocity !== 0) {\r\n // If we are not receiving input and velocity isn't already zero, apply inertial decay to decelerate velocity\r\n const frameIndependentDecay = Math.pow(inertialDecayFactor, this._prevFrameTimeMs / FrameDurationAt60FPS);\r\n inputVelocity *= frameIndependentDecay;\r\n if (Math.abs(inputVelocity) <= Epsilon) {\r\n inputVelocity = 0;\r\n }\r\n }\r\n\r\n return inputVelocity;\r\n }\r\n}\r\n"]}
@@ -76,9 +76,11 @@ export class DeviceOrientationCamera extends FreeCamera {
76
76
  */
77
77
  _checkInputs() {
78
78
  super._checkInputs();
79
- this._quaternionCache.copyFrom(this.rotationQuaternion);
80
- if (this._initialQuaternion) {
81
- this._initialQuaternion.multiplyToRef(this.rotationQuaternion, this.rotationQuaternion);
79
+ if (this.rotationQuaternion) {
80
+ this._quaternionCache.copyFrom(this.rotationQuaternion);
81
+ if (this._initialQuaternion) {
82
+ this._initialQuaternion.multiplyToRef(this.rotationQuaternion, this.rotationQuaternion);
83
+ }
82
84
  }
83
85
  }
84
86
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"deviceOrientationCamera.js","sourceRoot":"","sources":["../../../../dev/core/src/Cameras/deviceOrientationCamera.ts"],"names":[],"mappings":"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","sourcesContent":["import { FreeCamera } from \"./freeCamera\";\r\nimport type { Scene } from \"../scene\";\r\nimport { Quaternion, Vector3 } from \"../Maths/math.vector\";\r\nimport { Node } from \"../node\";\r\n\r\nimport \"./Inputs/freeCameraDeviceOrientationInput\";\r\nimport { Axis } from \"../Maths/math.axis\";\r\n\r\nNode.AddNodeConstructor(\"DeviceOrientationCamera\", (name, scene) => {\r\n return () => new DeviceOrientationCamera(name, Vector3.Zero(), scene);\r\n});\r\n\r\n// We're mainly based on the logic defined into the FreeCamera code\r\n/**\r\n * This is a camera specifically designed to react to device orientation events such as a modern mobile device\r\n * being tilted forward or back and left or right.\r\n */\r\nexport class DeviceOrientationCamera extends FreeCamera {\r\n private _initialQuaternion: Quaternion;\r\n private _quaternionCache: Quaternion;\r\n private _tmpDragQuaternion = new Quaternion();\r\n private _disablePointerInputWhenUsingDeviceOrientation = true;\r\n\r\n /**\r\n * Creates a new device orientation camera\r\n * @param name The name of the camera\r\n * @param position The start position camera\r\n * @param scene The scene the camera belongs to\r\n */\r\n constructor(name: string, position: Vector3, scene?: Scene) {\r\n super(name, position, scene);\r\n this._quaternionCache = new Quaternion();\r\n this.inputs.addDeviceOrientation();\r\n\r\n // When the orientation sensor fires it's first event, disable mouse input\r\n if (this.inputs._deviceOrientationInput) {\r\n this.inputs._deviceOrientationInput._onDeviceOrientationChangedObservable.addOnce(() => {\r\n if (this._disablePointerInputWhenUsingDeviceOrientation) {\r\n if (this.inputs._mouseInput) {\r\n this.inputs._mouseInput._allowCameraRotation = false;\r\n this.inputs._mouseInput.onPointerMovedObservable.add((e) => {\r\n if (this._dragFactor != 0) {\r\n if (!this._initialQuaternion) {\r\n this._initialQuaternion = new Quaternion();\r\n }\r\n // Rotate the initial space around the y axis to allow users to \"turn around\" via touch/mouse\r\n Quaternion.FromEulerAnglesToRef(0, e.offsetX * this._dragFactor, 0, this._tmpDragQuaternion);\r\n this._initialQuaternion.multiplyToRef(this._tmpDragQuaternion, this._initialQuaternion);\r\n }\r\n });\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating that pointer input must be disabled on first orientation sensor update (Default: true)\r\n */\r\n public get disablePointerInputWhenUsingDeviceOrientation() {\r\n return this._disablePointerInputWhenUsingDeviceOrientation;\r\n }\r\n\r\n public set disablePointerInputWhenUsingDeviceOrientation(value: boolean) {\r\n this._disablePointerInputWhenUsingDeviceOrientation = value;\r\n }\r\n\r\n private _dragFactor = 0;\r\n /**\r\n * Enabled turning on the y axis when the orientation sensor is active\r\n * @param dragFactor the factor that controls the turn speed (default: 1/300)\r\n */\r\n public enableHorizontalDragging(dragFactor = 1 / 300) {\r\n this._dragFactor = dragFactor;\r\n }\r\n\r\n /**\r\n * Gets the current instance class name (\"DeviceOrientationCamera\").\r\n * This helps avoiding instanceof at run time.\r\n * @returns the class name\r\n */\r\n public override getClassName(): string {\r\n return \"DeviceOrientationCamera\";\r\n }\r\n\r\n /**\r\n * @internal\r\n * Checks and applies the current values of the inputs to the camera. (Internal use only)\r\n */\r\n public override _checkInputs(): void {\r\n super._checkInputs();\r\n this._quaternionCache.copyFrom(this.rotationQuaternion);\r\n if (this._initialQuaternion) {\r\n this._initialQuaternion.multiplyToRef(this.rotationQuaternion, this.rotationQuaternion);\r\n }\r\n }\r\n\r\n /**\r\n * Reset the camera to its default orientation on the specified axis only.\r\n * @param axis The axis to reset\r\n */\r\n public resetToCurrentRotation(axis: Axis = Axis.Y): void {\r\n //can only work if this camera has a rotation quaternion already.\r\n if (!this.rotationQuaternion) {\r\n return;\r\n }\r\n\r\n if (!this._initialQuaternion) {\r\n this._initialQuaternion = new Quaternion();\r\n }\r\n\r\n this._initialQuaternion.copyFrom(this._quaternionCache || this.rotationQuaternion);\r\n const list = [\"x\", \"y\", \"z\"];\r\n\r\n for (const axisName of list) {\r\n if (!(<any>axis)[axisName]) {\r\n (<any>this._initialQuaternion)[axisName] = 0;\r\n } else {\r\n (<any>this._initialQuaternion)[axisName] *= -1;\r\n }\r\n }\r\n this._initialQuaternion.normalize();\r\n //force rotation update\r\n this._initialQuaternion.multiplyToRef(this.rotationQuaternion, this.rotationQuaternion);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"deviceOrientationCamera.js","sourceRoot":"","sources":["../../../../dev/core/src/Cameras/deviceOrientationCamera.ts"],"names":[],"mappings":"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","sourcesContent":["import { FreeCamera } from \"./freeCamera\";\r\nimport type { Scene } from \"../scene\";\r\nimport { Quaternion, Vector3 } from \"../Maths/math.vector\";\r\nimport { Node } from \"../node\";\r\n\r\nimport \"./Inputs/freeCameraDeviceOrientationInput\";\r\nimport { Axis } from \"../Maths/math.axis\";\r\nimport type { Nullable } from \"../types\";\r\n\r\nNode.AddNodeConstructor(\"DeviceOrientationCamera\", (name, scene) => {\r\n return () => new DeviceOrientationCamera(name, Vector3.Zero(), scene);\r\n});\r\n\r\n// We're mainly based on the logic defined into the FreeCamera code\r\n/**\r\n * This is a camera specifically designed to react to device orientation events such as a modern mobile device\r\n * being tilted forward or back and left or right.\r\n */\r\nexport class DeviceOrientationCamera extends FreeCamera {\r\n private _initialQuaternion: Nullable<Quaternion>;\r\n private _quaternionCache: Quaternion;\r\n private _tmpDragQuaternion = new Quaternion();\r\n private _disablePointerInputWhenUsingDeviceOrientation = true;\r\n\r\n /**\r\n * Creates a new device orientation camera\r\n * @param name The name of the camera\r\n * @param position The start position camera\r\n * @param scene The scene the camera belongs to\r\n */\r\n constructor(name: string, position: Vector3, scene?: Scene) {\r\n super(name, position, scene);\r\n this._quaternionCache = new Quaternion();\r\n this.inputs.addDeviceOrientation();\r\n\r\n // When the orientation sensor fires it's first event, disable mouse input\r\n if (this.inputs._deviceOrientationInput) {\r\n this.inputs._deviceOrientationInput._onDeviceOrientationChangedObservable.addOnce(() => {\r\n if (this._disablePointerInputWhenUsingDeviceOrientation) {\r\n if (this.inputs._mouseInput) {\r\n this.inputs._mouseInput._allowCameraRotation = false;\r\n this.inputs._mouseInput.onPointerMovedObservable.add((e) => {\r\n if (this._dragFactor != 0) {\r\n if (!this._initialQuaternion) {\r\n this._initialQuaternion = new Quaternion();\r\n }\r\n // Rotate the initial space around the y axis to allow users to \"turn around\" via touch/mouse\r\n Quaternion.FromEulerAnglesToRef(0, e.offsetX * this._dragFactor, 0, this._tmpDragQuaternion);\r\n this._initialQuaternion.multiplyToRef(this._tmpDragQuaternion, this._initialQuaternion);\r\n }\r\n });\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating that pointer input must be disabled on first orientation sensor update (Default: true)\r\n */\r\n public get disablePointerInputWhenUsingDeviceOrientation() {\r\n return this._disablePointerInputWhenUsingDeviceOrientation;\r\n }\r\n\r\n public set disablePointerInputWhenUsingDeviceOrientation(value: boolean) {\r\n this._disablePointerInputWhenUsingDeviceOrientation = value;\r\n }\r\n\r\n private _dragFactor = 0;\r\n /**\r\n * Enabled turning on the y axis when the orientation sensor is active\r\n * @param dragFactor the factor that controls the turn speed (default: 1/300)\r\n */\r\n public enableHorizontalDragging(dragFactor = 1 / 300) {\r\n this._dragFactor = dragFactor;\r\n }\r\n\r\n /**\r\n * Gets the current instance class name (\"DeviceOrientationCamera\").\r\n * This helps avoiding instanceof at run time.\r\n * @returns the class name\r\n */\r\n public override getClassName(): string {\r\n return \"DeviceOrientationCamera\";\r\n }\r\n\r\n /**\r\n * @internal\r\n * Checks and applies the current values of the inputs to the camera. (Internal use only)\r\n */\r\n public override _checkInputs(): void {\r\n super._checkInputs();\r\n if (this.rotationQuaternion) {\r\n this._quaternionCache.copyFrom(this.rotationQuaternion);\r\n if (this._initialQuaternion) {\r\n this._initialQuaternion.multiplyToRef(this.rotationQuaternion, this.rotationQuaternion);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Reset the camera to its default orientation on the specified axis only.\r\n * @param axis The axis to reset\r\n */\r\n public resetToCurrentRotation(axis: Axis = Axis.Y): void {\r\n //can only work if this camera has a rotation quaternion already.\r\n if (!this.rotationQuaternion) {\r\n return;\r\n }\r\n\r\n if (!this._initialQuaternion) {\r\n this._initialQuaternion = new Quaternion();\r\n }\r\n\r\n this._initialQuaternion.copyFrom(this._quaternionCache || this.rotationQuaternion);\r\n const list = [\"x\", \"y\", \"z\"];\r\n\r\n for (const axisName of list) {\r\n if (!(<any>axis)[axisName]) {\r\n (<any>this._initialQuaternion)[axisName] = 0;\r\n } else {\r\n (<any>this._initialQuaternion)[axisName] *= -1;\r\n }\r\n }\r\n this._initialQuaternion.normalize();\r\n //force rotation update\r\n this._initialQuaternion.multiplyToRef(this.rotationQuaternion, this.rotationQuaternion);\r\n }\r\n}\r\n"]}
@@ -1,3 +1,4 @@
1
+ import type { Nullable } from "../types.js";
1
2
  import type { Scene } from "../scene.js";
2
3
  import type { Quaternion } from "../Maths/math.vector.js";
3
4
  import { Vector3 } from "../Maths/math.vector.js";
@@ -37,7 +38,7 @@ export declare class FlyCamera extends TargetCamera {
37
38
  * Define the current local rotation of the camera as a quaternion to prevent Gimbal lock.
38
39
  * This overrides and empties cameraRotation.
39
40
  */
40
- rotationQuaternion: Quaternion;
41
+ rotationQuaternion: Nullable<Quaternion>;
41
42
  /**
42
43
  * Track Roll to maintain the wanted Rolling when looking around.
43
44
  */
@@ -1 +1 @@
1
- {"version":3,"file":"flyCamera.js","sourceRoot":"","sources":["../../../../dev/core/src/Cameras/flyCamera.ts"],"names":[],"mappings":"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","sourcesContent":["import { serialize, serializeAsVector3 } from \"../Misc/decorators\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { Scene } from \"../scene\";\r\nimport type { Quaternion } from \"../Maths/math.vector\";\r\nimport { Vector3 } from \"../Maths/math.vector\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { TargetCamera } from \"./targetCamera\";\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\";\r\nimport { RegisterClass } from \"../Misc/typeStore\";\r\n\r\nimport type { Collider } from \"../Collisions/collider\";\r\nimport { AbstractEngine } from \"core/Engines/abstractEngine\";\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: 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\nRegisterClass(\"BABYLON.FlyCamera\", FlyCamera);\r\n"]}
1
+ {"version":3,"file":"flyCamera.js","sourceRoot":"","sources":["../../../../dev/core/src/Cameras/flyCamera.ts"],"names":[],"mappings":"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","sourcesContent":["import { serialize, serializeAsVector3 } from \"../Misc/decorators\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { Scene } from \"../scene\";\r\nimport type { Quaternion } from \"../Maths/math.vector\";\r\nimport { Vector3 } from \"../Maths/math.vector\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { TargetCamera } from \"./targetCamera\";\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\";\r\nimport { RegisterClass } from \"../Misc/typeStore\";\r\n\r\nimport type { Collider } from \"../Collisions/collider\";\r\nimport { AbstractEngine } from \"core/Engines/abstractEngine\";\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\nRegisterClass(\"BABYLON.FlyCamera\", FlyCamera);\r\n"]}
@@ -3,85 +3,114 @@ import { Vector3, Matrix } from "../Maths/math.vector.js";
3
3
  import { Camera } from "./camera.js";
4
4
  import type { Scene } from "../scene.js";
5
5
  import type { MeshPredicate } from "../Culling/ray.core.js";
6
- import type { Nullable } from "../types.js";
6
+ import { GeospatialLimits } from "./Limits/geospatialLimits.js";
7
+ import { GeospatialCameraMovement } from "./geospatialCameraMovement.js";
8
+ import type { IVector3Like } from "../Maths/math.like.js";
9
+ import type { EasingFunction } from "../Animations/easing.js";
7
10
  type CameraOptions = {
8
11
  planetRadius: number;
9
- minAltitude?: number;
10
- maxAltitude?: number;
11
- restingAltitude?: number;
12
12
  };
13
13
  /**
14
14
  * @experimental
15
15
  * This camera's movements are limited to a camera orbiting a globe, and as the API evolves it will introduce conversions between cartesian coordinates and true lat/long/alt
16
16
  *
17
17
  * Please note this is marked as experimental and the API (including the constructor!) will change until we remove that flag
18
- *
19
- * Still TODO:
20
- * - Pitch/yaw limits, input speeds
21
- * - ZoomToPoint
22
- * - Conversion between lat/long/alt and cartesian coordinates
23
18
  */
24
19
  export declare class GeospatialCamera extends Camera {
25
20
  inputs: GeospatialCameraInputsManager;
26
- /** @internal */
27
- _perFrameGeocentricTranslation: Vector3;
28
- /** @internal */
29
- _perFrameGeocentricRotation: Vector3;
30
- /** @internal */
31
- _perFrameZoom: number;
32
21
  /** If supplied, will be used when picking the globe */
33
22
  pickPredicate?: MeshPredicate;
34
- /**
35
- * Enables rotation around a specific point, instead of default rotation around center
36
- * @internal
37
- */
38
- _alternateRotationPt: Nullable<Vector3>;
39
- /** The point on the globe that we are anchoring around. If no alternate rotation point is supplied, this will represent the center of screen*/
40
- get center(): Vector3;
41
- private _tempGeocentricNormal;
42
- private _tempRotationAxis;
43
- private _tempRotationMatrix;
44
- private _tempPickingRay;
23
+ /** Movement controller that turns input pixelDeltas into currentFrameDeltas used by camera*/
24
+ readonly movement: GeospatialCameraMovement;
45
25
  private _tempPosition;
46
26
  private _viewMatrix;
47
27
  private _isViewMatrixDirty;
48
28
  private _lookAtVector;
49
- private _planetRadius;
50
- private _minAltitude;
51
- private _maxAltitude?;
52
- private _maxCameraRadius?;
53
- private _restingAltitude;
54
- /** Target of camera when looking along lookAtVector from current position. This does not necessarily represent a point on the globe */
55
- private get _target();
29
+ /** Behavior used for smooth flying animations */
30
+ private _flyingBehavior;
31
+ private _flyToTargets;
32
+ constructor(name: string, scene: Scene, options: CameraOptions, pickPredicate?: MeshPredicate);
33
+ private _center;
34
+ /** The point on the globe that we are anchoring around. If no alternate rotation point is supplied, this will represent the center of screen*/
35
+ get center(): Vector3;
36
+ /**
37
+ * Sets the camera position to orbit around a new center point
38
+ * @param center The world position (ECEF) to orbit around
39
+ */
40
+ set center(center: IVector3Like);
41
+ private _yaw;
42
+ /**
43
+ * Gets the camera's yaw (rotation around the geocentric normal) in radians
44
+ */
45
+ get yaw(): number;
46
+ /**
47
+ * Sets the camera's yaw (rotation around the geocentric normal)
48
+ * @param yaw The desired yaw angle in radians (0 = north, π/2 = east)
49
+ */
50
+ set yaw(yaw: number);
51
+ private _pitch;
52
+ /**
53
+ * Gets the camera's pitch (angle from looking straight at globe)
54
+ * Pitch is measured from looking straight down at planet center:
55
+ * - zero pitch = looking straight at planet center (down)
56
+ * - positive pitch = tilting up away from planet
57
+ * - π/2 pitch = looking at horizon (perpendicular to geocentric normal)
58
+ */
59
+ get pitch(): number;
60
+ /**
61
+ * Sets the camera's pitch (angle from looking straight at globe)
62
+ * @param pitch The desired pitch angle in radians (0 = looking at planet center, π/2 = looking at horizon)
63
+ */
64
+ set pitch(pitch: number);
65
+ private _radius;
66
+ get radius(): number;
67
+ /**
68
+ * Sets the camera's distance from the current center point
69
+ * @param radius The desired radius
70
+ */
71
+ set radius(radius: number);
72
+ protected _checkLimits(): void;
73
+ private _tempVect;
74
+ private _tempEast;
75
+ private _tempNorth;
76
+ private _tempUp;
77
+ private _setOrientation;
56
78
  /** The point around which the camera will geocentrically rotate. Uses center (pt we are anchored to) if no alternateRotationPt is defined */
57
79
  private get _geocentricRotationPt();
58
- constructor(name: string, scene: Scene, options: CameraOptions, pickPredicate?: MeshPredicate);
80
+ /**
81
+ * If camera is actively in flight, will update the target properties and use up the remaining duration from original flyTo call
82
+ *
83
+ * To start a new flyTo curve entirely, call into flyToAsync again (it will stop the inflight animation)
84
+ * @param targetYaw
85
+ * @param targetPitch
86
+ * @param targetRadius
87
+ * @param targetCenter
88
+ */
89
+ updateFlyToDestination(targetYaw?: number, targetPitch?: number, targetRadius?: number, targetCenter?: Vector3): void;
90
+ /**
91
+ * Animate camera towards passed in property values. If undefined, will use current value
92
+ * @param targetYaw
93
+ * @param targetPitch
94
+ * @param targetRadius
95
+ * @param targetCenter
96
+ * @param flightDurationMs
97
+ * @param easingFunction
98
+ * @returns Promise that will return when the animation is complete (or interuppted by pointer input)
99
+ */
100
+ flyToAsync(targetYaw?: number, targetPitch?: number, targetRadius?: number, targetCenter?: Vector3, flightDurationMs?: number, easingFunction?: EasingFunction): Promise<void>;
101
+ private _limits;
102
+ get limits(): GeospatialLimits;
59
103
  private _resetToDefault;
60
104
  /** @internal */
61
105
  _getViewMatrix(): Matrix;
62
106
  /** @internal */
63
107
  _isSynchronizedViewMatrix(): boolean;
64
- /**
65
- * Applies rotation correction to the camera by calculating a changeOfBasis matrix from the camera's current position to the new position
66
- * and transforming the lookAt and up vectors by that matrix before updating the camera position and marking the view matrix as dirty
67
- * @param newPos The camera's desired position, before correction is applied
68
- */
69
- private _applyRotationCorrectionAndSetPos;
70
- /**
71
- * When the geocentric normal has any translation change (due to dragging), we must ensure the camera remains orbiting around the world origin
72
- * We thus need to perform 2 correction steps
73
- * 1. Translation correction that keeps the camera at the same radius as before the drag
74
- * 2. Rotation correction that keeps the camera facing the globe (so that as we pan, the globe stays centered on screen)
75
- */
76
108
  private _applyGeocentricTranslation;
77
109
  /**
78
110
  * This rotation keeps the camera oriented towards the globe as it orbits around it. This is different from cameraCentricRotation which is when the camera rotates around its own axis
79
111
  */
80
112
  private _applyGeocentricRotation;
81
- private _clampZoomDistance;
82
113
  private _applyZoom;
83
- private _moveCameraAlongVectorByDistance;
84
- private get _pickAlongLook();
85
114
  _checkInputs(): void;
86
115
  attachControl(noPreventDefault?: boolean): void;
87
116
  detachControl(): void;