@babylonjs/core 5.50.1 → 5.52.0

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 (118) hide show
  1. package/Animations/animatable.d.ts +5 -3
  2. package/Animations/animatable.js +10 -7
  3. package/Animations/animatable.js.map +1 -1
  4. package/Animations/animationGroup.js +3 -1
  5. package/Animations/animationGroup.js.map +1 -1
  6. package/Animations/runtimeAnimation.d.ts +1 -0
  7. package/Animations/runtimeAnimation.js +1 -0
  8. package/Animations/runtimeAnimation.js.map +1 -1
  9. package/Cameras/Inputs/freeCameraKeyboardMoveInput.d.ts +8 -0
  10. package/Cameras/Inputs/freeCameraKeyboardMoveInput.js +28 -2
  11. package/Cameras/Inputs/freeCameraKeyboardMoveInput.js.map +1 -1
  12. package/Cameras/freeCamera.d.ts +10 -0
  13. package/Cameras/freeCamera.js +32 -0
  14. package/Cameras/freeCamera.js.map +1 -1
  15. package/Cameras/targetCamera.js +4 -1
  16. package/Cameras/targetCamera.js.map +1 -1
  17. package/Engines/engineCapabilities.d.ts +2 -0
  18. package/Engines/engineCapabilities.js.map +1 -1
  19. package/Engines/nativeEngine.js +1 -0
  20. package/Engines/nativeEngine.js.map +1 -1
  21. package/Engines/nullEngine.js +1 -0
  22. package/Engines/nullEngine.js.map +1 -1
  23. package/Engines/thinEngine.js +3 -2
  24. package/Engines/thinEngine.js.map +1 -1
  25. package/Engines/webgpuEngine.js +1 -0
  26. package/Engines/webgpuEngine.js.map +1 -1
  27. package/Inputs/scene.inputManager.d.ts +6 -3
  28. package/Inputs/scene.inputManager.js +67 -12
  29. package/Inputs/scene.inputManager.js.map +1 -1
  30. package/Materials/Node/Blocks/Dual/sceneDepthBlock.d.ts +4 -0
  31. package/Materials/Node/Blocks/Dual/sceneDepthBlock.js +37 -2
  32. package/Materials/Node/Blocks/Dual/sceneDepthBlock.js.map +1 -1
  33. package/Materials/Node/nodeMaterialDecorator.d.ts +1 -1
  34. package/Materials/Node/nodeMaterialDecorator.js.map +1 -1
  35. package/Materials/PBR/pbrMaterial.js +1 -0
  36. package/Materials/PBR/pbrMaterial.js.map +1 -1
  37. package/Materials/Textures/cubeTexture.js +7 -1
  38. package/Materials/Textures/cubeTexture.js.map +1 -1
  39. package/Meshes/mesh.js +2 -2
  40. package/Meshes/mesh.js.map +1 -1
  41. package/Meshes/mesh.vertexData.d.ts +4 -1
  42. package/Meshes/mesh.vertexData.js +21 -17
  43. package/Meshes/mesh.vertexData.js.map +1 -1
  44. package/Misc/decorators.d.ts +8 -0
  45. package/Misc/decorators.js +22 -12
  46. package/Misc/decorators.js.map +1 -1
  47. package/Misc/environmentTextureTools.js +7 -0
  48. package/Misc/environmentTextureTools.js.map +1 -1
  49. package/Misc/khronosTextureContainer.js +4 -0
  50. package/Misc/khronosTextureContainer.js.map +1 -1
  51. package/Misc/observable.js +3 -0
  52. package/Misc/observable.js.map +1 -1
  53. package/Misc/sceneRecorder.js +3 -0
  54. package/Misc/sceneRecorder.js.map +1 -1
  55. package/Misc/virtualJoystick.js +2 -2
  56. package/Misc/virtualJoystick.js.map +1 -1
  57. package/Morph/morphTargetManager.js +7 -1
  58. package/Morph/morphTargetManager.js.map +1 -1
  59. package/Particles/gpuParticleSystem.js +18 -14
  60. package/Particles/gpuParticleSystem.js.map +1 -1
  61. package/Physics/v2/IPhysicsEnginePlugin.d.ts +126 -19
  62. package/Physics/v2/IPhysicsEnginePlugin.js +6 -0
  63. package/Physics/v2/IPhysicsEnginePlugin.js.map +1 -1
  64. package/Physics/v2/physicsAggregate.d.ts +7 -1
  65. package/Physics/v2/physicsAggregate.js +21 -7
  66. package/Physics/v2/physicsAggregate.js.map +1 -1
  67. package/Physics/v2/physicsBody.d.ts +24 -15
  68. package/Physics/v2/physicsBody.js +46 -20
  69. package/Physics/v2/physicsBody.js.map +1 -1
  70. package/Physics/v2/physicsEngineComponent.d.ts +10 -0
  71. package/Physics/v2/physicsEngineComponent.js +27 -0
  72. package/Physics/v2/physicsEngineComponent.js.map +1 -1
  73. package/Physics/v2/physicsMaterial.d.ts +52 -46
  74. package/Physics/v2/physicsMaterial.js +23 -80
  75. package/Physics/v2/physicsMaterial.js.map +1 -1
  76. package/Physics/v2/physicsShape.d.ts +27 -2
  77. package/Physics/v2/physicsShape.js +52 -1
  78. package/Physics/v2/physicsShape.js.map +1 -1
  79. package/PostProcesses/RenderPipeline/Pipelines/ssao2RenderingPipeline.d.ts +59 -13
  80. package/PostProcesses/RenderPipeline/Pipelines/ssao2RenderingPipeline.js +131 -56
  81. package/PostProcesses/RenderPipeline/Pipelines/ssao2RenderingPipeline.js.map +1 -1
  82. package/PostProcesses/RenderPipeline/Pipelines/ssrRenderingPipeline.d.ts +65 -13
  83. package/PostProcesses/RenderPipeline/Pipelines/ssrRenderingPipeline.js +218 -80
  84. package/PostProcesses/RenderPipeline/Pipelines/ssrRenderingPipeline.js.map +1 -1
  85. package/Rendering/depthRenderer.js +1 -1
  86. package/Rendering/depthRenderer.js.map +1 -1
  87. package/Rendering/depthRendererSceneComponent.d.ts +2 -1
  88. package/Rendering/depthRendererSceneComponent.js +2 -2
  89. package/Rendering/depthRendererSceneComponent.js.map +1 -1
  90. package/Rendering/geometryBufferRenderer.d.ts +8 -2
  91. package/Rendering/geometryBufferRenderer.js +32 -10
  92. package/Rendering/geometryBufferRenderer.js.map +1 -1
  93. package/Rendering/prePassRenderer.d.ts +18 -2
  94. package/Rendering/prePassRenderer.js +72 -26
  95. package/Rendering/prePassRenderer.js.map +1 -1
  96. package/Shaders/ShadersInclude/screenSpaceRayTrace.js +3 -3
  97. package/Shaders/ShadersInclude/screenSpaceRayTrace.js.map +1 -1
  98. package/Shaders/geometry.fragment.js +2 -2
  99. package/Shaders/geometry.fragment.js.map +1 -1
  100. package/Shaders/screenSpaceReflection2.fragment.js +20 -10
  101. package/Shaders/screenSpaceReflection2.fragment.js.map +1 -1
  102. package/Shaders/screenSpaceReflection2Blur.fragment.js +1 -1
  103. package/Shaders/screenSpaceReflection2Blur.fragment.js.map +1 -1
  104. package/Shaders/screenSpaceReflection2BlurCombiner.fragment.js +9 -2
  105. package/Shaders/screenSpaceReflection2BlurCombiner.fragment.js.map +1 -1
  106. package/Shaders/sprites.fragment.js +6 -1
  107. package/Shaders/sprites.fragment.js.map +1 -1
  108. package/Shaders/ssao2.fragment.js +0 -2
  109. package/Shaders/ssao2.fragment.js.map +1 -1
  110. package/Sprites/spriteManager.d.ts +7 -0
  111. package/Sprites/spriteManager.js +27 -0
  112. package/Sprites/spriteManager.js.map +1 -1
  113. package/Sprites/spriteRenderer.d.ts +8 -0
  114. package/Sprites/spriteRenderer.js +42 -19
  115. package/Sprites/spriteRenderer.js.map +1 -1
  116. package/assetContainer.js +5 -1
  117. package/assetContainer.js.map +1 -1
  118. package/package.json +1 -1
@@ -199,6 +199,9 @@ export class Observable {
199
199
  * @internal
200
200
  */
201
201
  _deferUnregister(observer) {
202
+ if (observer._willBeUnregistered) {
203
+ return;
204
+ }
202
205
  this._numObserversMarkedAsDeleted++;
203
206
  observer.unregisterOnNextCall = false;
204
207
  observer._willBeUnregistered = true;
@@ -1 +1 @@
1
- {"version":3,"file":"observable.js","sourceRoot":"","sources":["../../../../lts/core/generated/Misc/observable.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"../types\";\r\n\r\n/**\r\n * A class serves as a medium between the observable and its observers\r\n */\r\nexport class EventState {\r\n /**\r\n * Create a new EventState\r\n * @param mask defines the mask associated with this state\r\n * @param skipNextObservers defines a flag which will instruct the observable to skip following observers when set to true\r\n * @param target defines the original target of the state\r\n * @param currentTarget defines the current target of the state\r\n */\r\n constructor(mask: number, skipNextObservers = false, target?: any, currentTarget?: any) {\r\n this.initialize(mask, skipNextObservers, target, currentTarget);\r\n }\r\n\r\n /**\r\n * Initialize the current event state\r\n * @param mask defines the mask associated with this state\r\n * @param skipNextObservers defines a flag which will instruct the observable to skip following observers when set to true\r\n * @param target defines the original target of the state\r\n * @param currentTarget defines the current target of the state\r\n * @returns the current event state\r\n */\r\n public initialize(mask: number, skipNextObservers = false, target?: any, currentTarget?: any): EventState {\r\n this.mask = mask;\r\n this.skipNextObservers = skipNextObservers;\r\n this.target = target;\r\n this.currentTarget = currentTarget;\r\n return this;\r\n }\r\n\r\n /**\r\n * An Observer can set this property to true to prevent subsequent observers of being notified\r\n */\r\n public skipNextObservers: boolean;\r\n\r\n /**\r\n * Get the mask value that were used to trigger the event corresponding to this EventState object\r\n */\r\n public mask: number;\r\n\r\n /**\r\n * The object that originally notified the event\r\n */\r\n public target?: any;\r\n\r\n /**\r\n * The current object in the bubbling phase\r\n */\r\n public currentTarget?: any;\r\n\r\n /**\r\n * This will be populated with the return value of the last function that was executed.\r\n * If it is the first function in the callback chain it will be the event data.\r\n */\r\n public lastReturnValue?: any;\r\n\r\n /**\r\n * User defined information that will be sent to observers\r\n */\r\n public userInfo?: any;\r\n}\r\n\r\n/**\r\n * Represent an Observer registered to a given Observable object.\r\n */\r\nexport class Observer<T> {\r\n /** @internal */\r\n public _willBeUnregistered = false;\r\n /**\r\n * Gets or sets a property defining that the observer as to be unregistered after the next notification\r\n */\r\n public unregisterOnNextCall = false;\r\n\r\n /**\r\n * Creates a new observer\r\n * @param callback defines the callback to call when the observer is notified\r\n * @param mask defines the mask of the observer (used to filter notifications)\r\n * @param scope defines the current scope used to restore the JS context\r\n */\r\n constructor(\r\n /**\r\n * Defines the callback to call when the observer is notified\r\n */\r\n public callback: (eventData: T, eventState: EventState) => void,\r\n /**\r\n * Defines the mask of the observer (used to filter notifications)\r\n */\r\n public mask: number,\r\n /**\r\n * Defines the current scope used to restore the JS context\r\n */\r\n public scope: any = null\r\n ) {}\r\n}\r\n\r\n/**\r\n * The Observable class is a simple implementation of the Observable pattern.\r\n *\r\n * There's one slight particularity though: a given Observable can notify its observer using a particular mask value, only the Observers registered with this mask value will be notified.\r\n * This enable a more fine grained execution without having to rely on multiple different Observable objects.\r\n * For instance you may have a given Observable that have four different types of notifications: Move (mask = 0x01), Stop (mask = 0x02), Turn Right (mask = 0X04), Turn Left (mask = 0X08).\r\n * A given observer can register itself with only Move and Stop (mask = 0x03), then it will only be notified when one of these two occurs and will never be for Turn Left/Right.\r\n */\r\nexport class Observable<T> {\r\n private _observers = new Array<Observer<T>>();\r\n private _numObserversMarkedAsDeleted = 0;\r\n private _hasNotified = false;\r\n private _lastNotifiedValue?: T;\r\n\r\n /**\r\n * @internal\r\n */\r\n public _eventState: EventState;\r\n\r\n private _onObserverAdded: Nullable<(observer: Observer<T>) => void>;\r\n\r\n /**\r\n * Create an observable from a Promise.\r\n * @param promise a promise to observe for fulfillment.\r\n * @param onErrorObservable an observable to notify if a promise was rejected.\r\n * @returns the new Observable\r\n */\r\n public static FromPromise<T, E = Error>(promise: Promise<T>, onErrorObservable?: Observable<E>): Observable<T> {\r\n const observable = new Observable<T>();\r\n\r\n promise\r\n .then((ret: T) => {\r\n observable.notifyObservers(ret);\r\n })\r\n .catch((err) => {\r\n if (onErrorObservable) {\r\n onErrorObservable.notifyObservers(err as E);\r\n } else {\r\n throw err;\r\n }\r\n });\r\n\r\n return observable;\r\n }\r\n\r\n /**\r\n * Gets the list of observers\r\n * Note that observers that were recently deleted may still be present in the list because they are only really deleted on the next javascript tick!\r\n */\r\n public get observers(): Array<Observer<T>> {\r\n return this._observers;\r\n }\r\n\r\n /**\r\n * Creates a new observable\r\n * @param onObserverAdded defines a callback to call when a new observer is added\r\n * @param notifyIfTriggered If set to true the observable will notify when an observer was added if the observable was already triggered.\r\n */\r\n constructor(\r\n onObserverAdded?: (observer: Observer<T>) => void,\r\n /**\r\n * If set to true the observable will notify when an observer was added if the observable was already triggered.\r\n * This is helpful to single-state observables like the scene onReady or the dispose observable.\r\n */\r\n public notifyIfTriggered = false\r\n ) {\r\n this._eventState = new EventState(0);\r\n\r\n if (onObserverAdded) {\r\n this._onObserverAdded = onObserverAdded;\r\n }\r\n }\r\n\r\n /**\r\n * Create a new Observer with the specified callback\r\n * @param callback the callback that will be executed for that Observer\r\n * @param mask the mask used to filter observers\r\n * @param insertFirst if true the callback will be inserted at the first position, hence executed before the others ones. If false (default behavior) the callback will be inserted at the last position, executed after all the others already present.\r\n * @param scope optional scope for the callback to be called from\r\n * @param unregisterOnFirstCall defines if the observer as to be unregistered after the next notification\r\n * @returns the new observer created for the callback\r\n */\r\n public add(\r\n callback: (eventData: T, eventState: EventState) => void,\r\n mask: number = -1,\r\n insertFirst = false,\r\n scope: any = null,\r\n unregisterOnFirstCall = false\r\n ): Nullable<Observer<T>> {\r\n if (!callback) {\r\n return null;\r\n }\r\n\r\n const observer = new Observer(callback, mask, scope);\r\n observer.unregisterOnNextCall = unregisterOnFirstCall;\r\n\r\n if (insertFirst) {\r\n this._observers.unshift(observer);\r\n } else {\r\n this._observers.push(observer);\r\n }\r\n\r\n if (this._onObserverAdded) {\r\n this._onObserverAdded(observer);\r\n }\r\n\r\n // If the observable was already triggered and the observable is set to notify if triggered, notify the new observer\r\n if (this._hasNotified && this.notifyIfTriggered) {\r\n if (this._lastNotifiedValue !== undefined) {\r\n this.notifyObserver(observer, this._lastNotifiedValue);\r\n }\r\n }\r\n\r\n return observer;\r\n }\r\n\r\n /**\r\n * Create a new Observer with the specified callback and unregisters after the next notification\r\n * @param callback the callback that will be executed for that Observer\r\n * @returns the new observer created for the callback\r\n */\r\n public addOnce(callback: (eventData: T, eventState: EventState) => void): Nullable<Observer<T>> {\r\n return this.add(callback, undefined, undefined, undefined, true);\r\n }\r\n\r\n /**\r\n * Remove an Observer from the Observable object\r\n * @param observer the instance of the Observer to remove\r\n * @returns false if it doesn't belong to this Observable\r\n */\r\n public remove(observer: Nullable<Observer<T>>): boolean {\r\n if (!observer) {\r\n return false;\r\n }\r\n\r\n const index = this._observers.indexOf(observer);\r\n\r\n if (index !== -1) {\r\n this._deferUnregister(observer);\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Remove a callback from the Observable object\r\n * @param callback the callback to remove\r\n * @param scope optional scope. If used only the callbacks with this scope will be removed\r\n * @returns false if it doesn't belong to this Observable\r\n */\r\n public removeCallback(callback: (eventData: T, eventState: EventState) => void, scope?: any): boolean {\r\n for (let index = 0; index < this._observers.length; index++) {\r\n const observer = this._observers[index];\r\n if (observer._willBeUnregistered) {\r\n continue;\r\n }\r\n if (observer.callback === callback && (!scope || scope === observer.scope)) {\r\n this._deferUnregister(observer);\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _deferUnregister(observer: Observer<T>): void {\r\n this._numObserversMarkedAsDeleted++;\r\n observer.unregisterOnNextCall = false;\r\n observer._willBeUnregistered = true;\r\n setTimeout(() => {\r\n this._remove(observer);\r\n }, 0);\r\n }\r\n\r\n // This should only be called when not iterating over _observers to avoid callback skipping.\r\n // Removes an observer from the _observer Array.\r\n private _remove(observer: Nullable<Observer<T>>, updateCounter = true): boolean {\r\n if (!observer) {\r\n return false;\r\n }\r\n\r\n const index = this._observers.indexOf(observer);\r\n\r\n if (index !== -1) {\r\n if (updateCounter) {\r\n this._numObserversMarkedAsDeleted--;\r\n }\r\n this._observers.splice(index, 1);\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Moves the observable to the top of the observer list making it get called first when notified\r\n * @param observer the observer to move\r\n */\r\n public makeObserverTopPriority(observer: Observer<T>) {\r\n this._remove(observer, false);\r\n this._observers.unshift(observer);\r\n }\r\n\r\n /**\r\n * Moves the observable to the bottom of the observer list making it get called last when notified\r\n * @param observer the observer to move\r\n */\r\n public makeObserverBottomPriority(observer: Observer<T>) {\r\n this._remove(observer, false);\r\n this._observers.push(observer);\r\n }\r\n\r\n /**\r\n * Notify all Observers by calling their respective callback with the given data\r\n * Will return true if all observers were executed, false if an observer set skipNextObservers to true, then prevent the subsequent ones to execute\r\n * @param eventData defines the data to send to all observers\r\n * @param mask defines the mask of the current notification (observers with incompatible mask (ie mask & observer.mask === 0) will not be notified)\r\n * @param target defines the original target of the state\r\n * @param currentTarget defines the current target of the state\r\n * @param userInfo defines any user info to send to observers\r\n * @returns false if the complete observer chain was not processed (because one observer set the skipNextObservers to true)\r\n */\r\n public notifyObservers(eventData: T, mask: number = -1, target?: any, currentTarget?: any, userInfo?: any): boolean {\r\n // this prevents potential memory leaks - if an object is disposed but the observable doesn't get cleared.\r\n if (this.notifyIfTriggered) {\r\n this._hasNotified = true;\r\n this._lastNotifiedValue = eventData;\r\n }\r\n if (!this._observers.length) {\r\n return true;\r\n }\r\n\r\n const state = this._eventState;\r\n state.mask = mask;\r\n state.target = target;\r\n state.currentTarget = currentTarget;\r\n state.skipNextObservers = false;\r\n state.lastReturnValue = eventData;\r\n state.userInfo = userInfo;\r\n\r\n for (const obs of this._observers) {\r\n if (obs._willBeUnregistered) {\r\n continue;\r\n }\r\n\r\n if (obs.mask & mask) {\r\n if (obs.unregisterOnNextCall) {\r\n this._deferUnregister(obs);\r\n }\r\n\r\n if (obs.scope) {\r\n state.lastReturnValue = obs.callback.apply(obs.scope, [eventData, state]);\r\n } else {\r\n state.lastReturnValue = obs.callback(eventData, state);\r\n }\r\n }\r\n if (state.skipNextObservers) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Notify a specific observer\r\n * @param observer defines the observer to notify\r\n * @param eventData defines the data to be sent to each callback\r\n * @param mask is used to filter observers defaults to -1\r\n */\r\n public notifyObserver(observer: Observer<T>, eventData: T, mask: number = -1): void {\r\n // this prevents potential memory leaks - if an object is disposed but the observable doesn't get cleared.\r\n if (this.notifyIfTriggered) {\r\n this._hasNotified = true;\r\n this._lastNotifiedValue = eventData;\r\n }\r\n if (observer._willBeUnregistered) {\r\n return;\r\n }\r\n\r\n const state = this._eventState;\r\n state.mask = mask;\r\n state.skipNextObservers = false;\r\n\r\n if (observer.unregisterOnNextCall) {\r\n this._deferUnregister(observer);\r\n }\r\n\r\n observer.callback(eventData, state);\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if the observable has at least one observer\r\n * @returns true is the Observable has at least one Observer registered\r\n */\r\n public hasObservers(): boolean {\r\n return this._observers.length - this._numObserversMarkedAsDeleted > 0;\r\n }\r\n\r\n /**\r\n * Clear the list of observers\r\n */\r\n public clear(): void {\r\n this._observers.length = 0;\r\n this._onObserverAdded = null;\r\n this._numObserversMarkedAsDeleted = 0;\r\n this.cleanLastNotifiedState();\r\n }\r\n\r\n /**\r\n * Clean the last notified state - both the internal last value and the has-notified flag\r\n */\r\n public cleanLastNotifiedState(): void {\r\n this._hasNotified = false;\r\n this._lastNotifiedValue = undefined;\r\n }\r\n\r\n /**\r\n * Clone the current observable\r\n * @returns a new observable\r\n */\r\n public clone(): Observable<T> {\r\n const result = new Observable<T>();\r\n\r\n result._observers = this._observers.slice(0);\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Does this observable handles observer registered with a given mask\r\n * @param mask defines the mask to be tested\r\n * @returns whether or not one observer registered with the given mask is handled\r\n **/\r\n public hasSpecificMask(mask: number = -1): boolean {\r\n for (const obs of this._observers) {\r\n if (obs.mask & mask || obs.mask === mask) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"observable.js","sourceRoot":"","sources":["../../../../lts/core/generated/Misc/observable.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"../types\";\r\n\r\n/**\r\n * A class serves as a medium between the observable and its observers\r\n */\r\nexport class EventState {\r\n /**\r\n * Create a new EventState\r\n * @param mask defines the mask associated with this state\r\n * @param skipNextObservers defines a flag which will instruct the observable to skip following observers when set to true\r\n * @param target defines the original target of the state\r\n * @param currentTarget defines the current target of the state\r\n */\r\n constructor(mask: number, skipNextObservers = false, target?: any, currentTarget?: any) {\r\n this.initialize(mask, skipNextObservers, target, currentTarget);\r\n }\r\n\r\n /**\r\n * Initialize the current event state\r\n * @param mask defines the mask associated with this state\r\n * @param skipNextObservers defines a flag which will instruct the observable to skip following observers when set to true\r\n * @param target defines the original target of the state\r\n * @param currentTarget defines the current target of the state\r\n * @returns the current event state\r\n */\r\n public initialize(mask: number, skipNextObservers = false, target?: any, currentTarget?: any): EventState {\r\n this.mask = mask;\r\n this.skipNextObservers = skipNextObservers;\r\n this.target = target;\r\n this.currentTarget = currentTarget;\r\n return this;\r\n }\r\n\r\n /**\r\n * An Observer can set this property to true to prevent subsequent observers of being notified\r\n */\r\n public skipNextObservers: boolean;\r\n\r\n /**\r\n * Get the mask value that were used to trigger the event corresponding to this EventState object\r\n */\r\n public mask: number;\r\n\r\n /**\r\n * The object that originally notified the event\r\n */\r\n public target?: any;\r\n\r\n /**\r\n * The current object in the bubbling phase\r\n */\r\n public currentTarget?: any;\r\n\r\n /**\r\n * This will be populated with the return value of the last function that was executed.\r\n * If it is the first function in the callback chain it will be the event data.\r\n */\r\n public lastReturnValue?: any;\r\n\r\n /**\r\n * User defined information that will be sent to observers\r\n */\r\n public userInfo?: any;\r\n}\r\n\r\n/**\r\n * Represent an Observer registered to a given Observable object.\r\n */\r\nexport class Observer<T> {\r\n /** @internal */\r\n public _willBeUnregistered = false;\r\n /**\r\n * Gets or sets a property defining that the observer as to be unregistered after the next notification\r\n */\r\n public unregisterOnNextCall = false;\r\n\r\n /**\r\n * Creates a new observer\r\n * @param callback defines the callback to call when the observer is notified\r\n * @param mask defines the mask of the observer (used to filter notifications)\r\n * @param scope defines the current scope used to restore the JS context\r\n */\r\n constructor(\r\n /**\r\n * Defines the callback to call when the observer is notified\r\n */\r\n public callback: (eventData: T, eventState: EventState) => void,\r\n /**\r\n * Defines the mask of the observer (used to filter notifications)\r\n */\r\n public mask: number,\r\n /**\r\n * Defines the current scope used to restore the JS context\r\n */\r\n public scope: any = null\r\n ) {}\r\n}\r\n\r\n/**\r\n * The Observable class is a simple implementation of the Observable pattern.\r\n *\r\n * There's one slight particularity though: a given Observable can notify its observer using a particular mask value, only the Observers registered with this mask value will be notified.\r\n * This enable a more fine grained execution without having to rely on multiple different Observable objects.\r\n * For instance you may have a given Observable that have four different types of notifications: Move (mask = 0x01), Stop (mask = 0x02), Turn Right (mask = 0X04), Turn Left (mask = 0X08).\r\n * A given observer can register itself with only Move and Stop (mask = 0x03), then it will only be notified when one of these two occurs and will never be for Turn Left/Right.\r\n */\r\nexport class Observable<T> {\r\n private _observers = new Array<Observer<T>>();\r\n private _numObserversMarkedAsDeleted = 0;\r\n private _hasNotified = false;\r\n private _lastNotifiedValue?: T;\r\n\r\n /**\r\n * @internal\r\n */\r\n public _eventState: EventState;\r\n\r\n private _onObserverAdded: Nullable<(observer: Observer<T>) => void>;\r\n\r\n /**\r\n * Create an observable from a Promise.\r\n * @param promise a promise to observe for fulfillment.\r\n * @param onErrorObservable an observable to notify if a promise was rejected.\r\n * @returns the new Observable\r\n */\r\n public static FromPromise<T, E = Error>(promise: Promise<T>, onErrorObservable?: Observable<E>): Observable<T> {\r\n const observable = new Observable<T>();\r\n\r\n promise\r\n .then((ret: T) => {\r\n observable.notifyObservers(ret);\r\n })\r\n .catch((err) => {\r\n if (onErrorObservable) {\r\n onErrorObservable.notifyObservers(err as E);\r\n } else {\r\n throw err;\r\n }\r\n });\r\n\r\n return observable;\r\n }\r\n\r\n /**\r\n * Gets the list of observers\r\n * Note that observers that were recently deleted may still be present in the list because they are only really deleted on the next javascript tick!\r\n */\r\n public get observers(): Array<Observer<T>> {\r\n return this._observers;\r\n }\r\n\r\n /**\r\n * Creates a new observable\r\n * @param onObserverAdded defines a callback to call when a new observer is added\r\n * @param notifyIfTriggered If set to true the observable will notify when an observer was added if the observable was already triggered.\r\n */\r\n constructor(\r\n onObserverAdded?: (observer: Observer<T>) => void,\r\n /**\r\n * If set to true the observable will notify when an observer was added if the observable was already triggered.\r\n * This is helpful to single-state observables like the scene onReady or the dispose observable.\r\n */\r\n public notifyIfTriggered = false\r\n ) {\r\n this._eventState = new EventState(0);\r\n\r\n if (onObserverAdded) {\r\n this._onObserverAdded = onObserverAdded;\r\n }\r\n }\r\n\r\n /**\r\n * Create a new Observer with the specified callback\r\n * @param callback the callback that will be executed for that Observer\r\n * @param mask the mask used to filter observers\r\n * @param insertFirst if true the callback will be inserted at the first position, hence executed before the others ones. If false (default behavior) the callback will be inserted at the last position, executed after all the others already present.\r\n * @param scope optional scope for the callback to be called from\r\n * @param unregisterOnFirstCall defines if the observer as to be unregistered after the next notification\r\n * @returns the new observer created for the callback\r\n */\r\n public add(\r\n callback: (eventData: T, eventState: EventState) => void,\r\n mask: number = -1,\r\n insertFirst = false,\r\n scope: any = null,\r\n unregisterOnFirstCall = false\r\n ): Nullable<Observer<T>> {\r\n if (!callback) {\r\n return null;\r\n }\r\n\r\n const observer = new Observer(callback, mask, scope);\r\n observer.unregisterOnNextCall = unregisterOnFirstCall;\r\n\r\n if (insertFirst) {\r\n this._observers.unshift(observer);\r\n } else {\r\n this._observers.push(observer);\r\n }\r\n\r\n if (this._onObserverAdded) {\r\n this._onObserverAdded(observer);\r\n }\r\n\r\n // If the observable was already triggered and the observable is set to notify if triggered, notify the new observer\r\n if (this._hasNotified && this.notifyIfTriggered) {\r\n if (this._lastNotifiedValue !== undefined) {\r\n this.notifyObserver(observer, this._lastNotifiedValue);\r\n }\r\n }\r\n\r\n return observer;\r\n }\r\n\r\n /**\r\n * Create a new Observer with the specified callback and unregisters after the next notification\r\n * @param callback the callback that will be executed for that Observer\r\n * @returns the new observer created for the callback\r\n */\r\n public addOnce(callback: (eventData: T, eventState: EventState) => void): Nullable<Observer<T>> {\r\n return this.add(callback, undefined, undefined, undefined, true);\r\n }\r\n\r\n /**\r\n * Remove an Observer from the Observable object\r\n * @param observer the instance of the Observer to remove\r\n * @returns false if it doesn't belong to this Observable\r\n */\r\n public remove(observer: Nullable<Observer<T>>): boolean {\r\n if (!observer) {\r\n return false;\r\n }\r\n\r\n const index = this._observers.indexOf(observer);\r\n\r\n if (index !== -1) {\r\n this._deferUnregister(observer);\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Remove a callback from the Observable object\r\n * @param callback the callback to remove\r\n * @param scope optional scope. If used only the callbacks with this scope will be removed\r\n * @returns false if it doesn't belong to this Observable\r\n */\r\n public removeCallback(callback: (eventData: T, eventState: EventState) => void, scope?: any): boolean {\r\n for (let index = 0; index < this._observers.length; index++) {\r\n const observer = this._observers[index];\r\n if (observer._willBeUnregistered) {\r\n continue;\r\n }\r\n if (observer.callback === callback && (!scope || scope === observer.scope)) {\r\n this._deferUnregister(observer);\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _deferUnregister(observer: Observer<T>): void {\r\n if (observer._willBeUnregistered) {\r\n return;\r\n }\r\n this._numObserversMarkedAsDeleted++;\r\n observer.unregisterOnNextCall = false;\r\n observer._willBeUnregistered = true;\r\n setTimeout(() => {\r\n this._remove(observer);\r\n }, 0);\r\n }\r\n\r\n // This should only be called when not iterating over _observers to avoid callback skipping.\r\n // Removes an observer from the _observer Array.\r\n private _remove(observer: Nullable<Observer<T>>, updateCounter = true): boolean {\r\n if (!observer) {\r\n return false;\r\n }\r\n\r\n const index = this._observers.indexOf(observer);\r\n\r\n if (index !== -1) {\r\n if (updateCounter) {\r\n this._numObserversMarkedAsDeleted--;\r\n }\r\n this._observers.splice(index, 1);\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Moves the observable to the top of the observer list making it get called first when notified\r\n * @param observer the observer to move\r\n */\r\n public makeObserverTopPriority(observer: Observer<T>) {\r\n this._remove(observer, false);\r\n this._observers.unshift(observer);\r\n }\r\n\r\n /**\r\n * Moves the observable to the bottom of the observer list making it get called last when notified\r\n * @param observer the observer to move\r\n */\r\n public makeObserverBottomPriority(observer: Observer<T>) {\r\n this._remove(observer, false);\r\n this._observers.push(observer);\r\n }\r\n\r\n /**\r\n * Notify all Observers by calling their respective callback with the given data\r\n * Will return true if all observers were executed, false if an observer set skipNextObservers to true, then prevent the subsequent ones to execute\r\n * @param eventData defines the data to send to all observers\r\n * @param mask defines the mask of the current notification (observers with incompatible mask (ie mask & observer.mask === 0) will not be notified)\r\n * @param target defines the original target of the state\r\n * @param currentTarget defines the current target of the state\r\n * @param userInfo defines any user info to send to observers\r\n * @returns false if the complete observer chain was not processed (because one observer set the skipNextObservers to true)\r\n */\r\n public notifyObservers(eventData: T, mask: number = -1, target?: any, currentTarget?: any, userInfo?: any): boolean {\r\n // this prevents potential memory leaks - if an object is disposed but the observable doesn't get cleared.\r\n if (this.notifyIfTriggered) {\r\n this._hasNotified = true;\r\n this._lastNotifiedValue = eventData;\r\n }\r\n if (!this._observers.length) {\r\n return true;\r\n }\r\n\r\n const state = this._eventState;\r\n state.mask = mask;\r\n state.target = target;\r\n state.currentTarget = currentTarget;\r\n state.skipNextObservers = false;\r\n state.lastReturnValue = eventData;\r\n state.userInfo = userInfo;\r\n\r\n for (const obs of this._observers) {\r\n if (obs._willBeUnregistered) {\r\n continue;\r\n }\r\n\r\n if (obs.mask & mask) {\r\n if (obs.unregisterOnNextCall) {\r\n this._deferUnregister(obs);\r\n }\r\n\r\n if (obs.scope) {\r\n state.lastReturnValue = obs.callback.apply(obs.scope, [eventData, state]);\r\n } else {\r\n state.lastReturnValue = obs.callback(eventData, state);\r\n }\r\n }\r\n if (state.skipNextObservers) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Notify a specific observer\r\n * @param observer defines the observer to notify\r\n * @param eventData defines the data to be sent to each callback\r\n * @param mask is used to filter observers defaults to -1\r\n */\r\n public notifyObserver(observer: Observer<T>, eventData: T, mask: number = -1): void {\r\n // this prevents potential memory leaks - if an object is disposed but the observable doesn't get cleared.\r\n if (this.notifyIfTriggered) {\r\n this._hasNotified = true;\r\n this._lastNotifiedValue = eventData;\r\n }\r\n if (observer._willBeUnregistered) {\r\n return;\r\n }\r\n\r\n const state = this._eventState;\r\n state.mask = mask;\r\n state.skipNextObservers = false;\r\n\r\n if (observer.unregisterOnNextCall) {\r\n this._deferUnregister(observer);\r\n }\r\n\r\n observer.callback(eventData, state);\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if the observable has at least one observer\r\n * @returns true is the Observable has at least one Observer registered\r\n */\r\n public hasObservers(): boolean {\r\n return this._observers.length - this._numObserversMarkedAsDeleted > 0;\r\n }\r\n\r\n /**\r\n * Clear the list of observers\r\n */\r\n public clear(): void {\r\n this._observers.length = 0;\r\n this._onObserverAdded = null;\r\n this._numObserversMarkedAsDeleted = 0;\r\n this.cleanLastNotifiedState();\r\n }\r\n\r\n /**\r\n * Clean the last notified state - both the internal last value and the has-notified flag\r\n */\r\n public cleanLastNotifiedState(): void {\r\n this._hasNotified = false;\r\n this._lastNotifiedValue = undefined;\r\n }\r\n\r\n /**\r\n * Clone the current observable\r\n * @returns a new observable\r\n */\r\n public clone(): Observable<T> {\r\n const result = new Observable<T>();\r\n\r\n result._observers = this._observers.slice(0);\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Does this observable handles observer registered with a given mask\r\n * @param mask defines the mask to be tested\r\n * @returns whether or not one observer registered with the given mask is handled\r\n **/\r\n public hasSpecificMask(mask: number = -1): boolean {\r\n for (const obs of this._observers) {\r\n if (obs.mask & mask || obs.mask === mask) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n}\r\n"]}
@@ -265,7 +265,10 @@ export class SceneRecorder {
265
265
  if (source.__state && source.__state.id !== undefined) {
266
266
  const targetEntity = finder(source.__state.id);
267
267
  if (targetEntity) {
268
+ // This first pass applies properties that aren't on the serialization list
268
269
  this._ApplyPropertiesToEntity(source, targetEntity);
270
+ // The second pass applies the serializable properties
271
+ SerializationHelper.ParseProperties(source, targetEntity, scene, null);
269
272
  }
270
273
  }
271
274
  else if (source.__state && source.__state.deleteId !== undefined) {
@@ -1 +1 @@
1
- {"version":3,"file":"sceneRecorder.js","sourceRoot":"","sources":["../../../../lts/core/generated/Misc/sceneRecorder.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\r\nimport type { Scene } from \"../scene\";\r\nimport type { Nullable } from \"../types\";\r\nimport { SceneSerializer } from \"./sceneSerializer\";\r\nimport { Mesh } from \"../Meshes/mesh\";\r\nimport { Light } from \"../Lights/light\";\r\nimport { Camera } from \"../Cameras/camera\";\r\nimport { Skeleton } from \"../Bones/skeleton\";\r\nimport { Material } from \"../Materials/material\";\r\nimport { MultiMaterial } from \"../Materials/multiMaterial\";\r\nimport { TransformNode } from \"../Meshes/transformNode\";\r\nimport { ParticleSystem } from \"../Particles/particleSystem\";\r\nimport { MorphTargetManager } from \"../Morph/morphTargetManager\";\r\nimport { ShadowGenerator } from \"../Lights/Shadows/shadowGenerator\";\r\nimport { PostProcess } from \"../PostProcesses/postProcess\";\r\nimport { Texture } from \"../Materials/Textures/texture\";\r\nimport { SerializationHelper } from \"./decorators\";\r\n\r\n/**\r\n * Class used to record delta files between 2 scene states\r\n */\r\nexport class SceneRecorder {\r\n private _trackedScene: Nullable<Scene> = null;\r\n private _savedJSON: any;\r\n\r\n /**\r\n * Track a given scene. This means the current scene state will be considered the original state\r\n * @param scene defines the scene to track\r\n */\r\n public track(scene: Scene) {\r\n this._trackedScene = scene;\r\n\r\n SerializationHelper.AllowLoadingUniqueId = true;\r\n this._savedJSON = SceneSerializer.Serialize(scene);\r\n SerializationHelper.AllowLoadingUniqueId = false;\r\n }\r\n\r\n /**\r\n * Get the delta between current state and original state\r\n * @returns a any containing the delta\r\n */\r\n public getDelta(): any {\r\n if (!this._trackedScene) {\r\n return null;\r\n }\r\n\r\n const currentForceSerializeBuffers = Texture.ForceSerializeBuffers;\r\n Texture.ForceSerializeBuffers = false;\r\n\r\n SerializationHelper.AllowLoadingUniqueId = true;\r\n const newJSON = SceneSerializer.Serialize(this._trackedScene);\r\n SerializationHelper.AllowLoadingUniqueId = false;\r\n const deltaJSON: any = {};\r\n\r\n for (const node in newJSON) {\r\n this._compareCollections(node, this._savedJSON[node], newJSON[node], deltaJSON);\r\n }\r\n\r\n Texture.ForceSerializeBuffers = currentForceSerializeBuffers;\r\n\r\n return deltaJSON;\r\n }\r\n\r\n private _compareArray(key: string, original: any[], current: any[], deltaJSON: any) {\r\n if (original.length === 0 && current.length === 0) {\r\n return true;\r\n }\r\n\r\n // Numbers?\r\n if ((original.length && !isNaN(original[0])) || (current.length && !isNaN(current[0]))) {\r\n if (original.length !== current.length) {\r\n return false;\r\n }\r\n\r\n if (original.length === 0) {\r\n return true;\r\n }\r\n for (let index = 0; index < original.length; index++) {\r\n if (original[index] !== current[index]) {\r\n deltaJSON[key] = current;\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n // let's use uniqueId to find similar objects\r\n const originalUniqueIds: number[] = [];\r\n for (let index = 0; index < original.length; index++) {\r\n const originalObject = original[index];\r\n const originalUniqueId = originalObject.uniqueId;\r\n\r\n originalUniqueIds.push(originalUniqueId);\r\n // Look for that object in current state\r\n const currentObjects = current.filter((c) => c.uniqueId === originalUniqueId);\r\n if (currentObjects.length) {\r\n // We have a candidate\r\n const currentObject = currentObjects[0];\r\n\r\n const newObject: any = {};\r\n if (!this._compareObjects(originalObject, currentObject, newObject)) {\r\n if (!deltaJSON[key]) {\r\n deltaJSON[key] = [];\r\n }\r\n newObject.__state = {\r\n id: currentObject.id || currentObject.name,\r\n };\r\n deltaJSON[key].push(newObject);\r\n }\r\n } else {\r\n // We need to delete\r\n const newObject: any = {\r\n __state: {\r\n deleteId: originalObject.id || originalObject.name,\r\n },\r\n };\r\n deltaJSON[key].push(newObject);\r\n }\r\n }\r\n\r\n // Checking for new objects\r\n for (let index = 0; index < current.length; index++) {\r\n const currentObject = current[index];\r\n const currentUniqueId = currentObject.uniqueId;\r\n\r\n // Object was added\r\n if (originalUniqueIds.indexOf(currentUniqueId) === -1) {\r\n if (!deltaJSON[key]) {\r\n deltaJSON[key] = [];\r\n }\r\n\r\n deltaJSON[key].push(currentObject);\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private _compareObjects(originalObjet: any, currentObject: any, deltaJSON: any) {\r\n let aDifferenceWasFound = false;\r\n\r\n for (const prop in originalObjet) {\r\n if (!Object.prototype.hasOwnProperty.call(originalObjet, prop)) {\r\n continue;\r\n }\r\n const originalValue = originalObjet[prop];\r\n const currentValue = currentObject[prop];\r\n let diffFound = false;\r\n\r\n if (Array.isArray(originalValue)) {\r\n diffFound = JSON.stringify(originalValue) !== JSON.stringify(currentValue);\r\n } else if (!isNaN(originalValue) || Object.prototype.toString.call(originalValue) == \"[object String]\") {\r\n diffFound = originalValue !== currentValue;\r\n } else if (typeof originalValue === \"object\" && typeof currentValue === \"object\") {\r\n const newObject = {};\r\n if (!this._compareObjects(originalValue, currentValue, newObject)) {\r\n deltaJSON[prop] = newObject;\r\n aDifferenceWasFound = true;\r\n }\r\n }\r\n\r\n if (diffFound) {\r\n aDifferenceWasFound = true;\r\n deltaJSON[prop] = currentValue;\r\n }\r\n }\r\n\r\n return !aDifferenceWasFound;\r\n }\r\n\r\n private _compareCollections(key: string, original: any[], current: any[], deltaJSON: any) {\r\n // Same ?\r\n if (original === current) {\r\n return;\r\n }\r\n\r\n if (original && current) {\r\n // Array?\r\n if (Array.isArray(original) && Array.isArray(current)) {\r\n if (this._compareArray(key, original, current, deltaJSON)) {\r\n return;\r\n }\r\n } else if (typeof original === \"object\" && typeof current === \"object\") {\r\n // Object\r\n const newObject = {};\r\n if (!this._compareObjects(original, current, newObject)) {\r\n deltaJSON[key] = newObject;\r\n }\r\n return;\r\n }\r\n }\r\n }\r\n\r\n private static GetShadowGeneratorById(scene: Scene, id: string) {\r\n const allGenerators = scene.lights.map((l) => l.getShadowGenerators());\r\n\r\n for (const generators of allGenerators) {\r\n if (generators) {\r\n const iterator = generators.values();\r\n for (let key = iterator.next(); key.done !== true; key = iterator.next()) {\r\n const generator = key.value;\r\n if (generator && generator.id === id) {\r\n return generator;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Apply a given delta to a given scene\r\n * @param deltaJSON defines the JSON containing the delta\r\n * @param scene defines the scene to apply the delta to\r\n */\r\n public static ApplyDelta(deltaJSON: any | string, scene: Scene) {\r\n if (typeof deltaJSON === \"string\") {\r\n deltaJSON = JSON.parse(deltaJSON);\r\n }\r\n\r\n // Scene\r\n const anyScene = scene as any;\r\n for (const prop in deltaJSON) {\r\n const source = deltaJSON[prop];\r\n const property = anyScene[prop];\r\n\r\n if (Array.isArray(property) || prop === \"shadowGenerators\") {\r\n // Restore array\r\n switch (prop) {\r\n case \"cameras\":\r\n this._ApplyDeltaForEntity(source, scene, scene.getCameraById.bind(scene), (data) => Camera.Parse(data, scene));\r\n break;\r\n case \"lights\":\r\n this._ApplyDeltaForEntity(source, scene, scene.getLightById.bind(scene), (data) => Light.Parse(data, scene));\r\n break;\r\n case \"shadowGenerators\":\r\n this._ApplyDeltaForEntity(\r\n source,\r\n scene,\r\n (id) => this.GetShadowGeneratorById(scene, id),\r\n (data) => ShadowGenerator.Parse(data, scene)\r\n );\r\n break;\r\n case \"meshes\":\r\n this._ApplyDeltaForEntity(source, scene, scene.getMeshById.bind(scene), (data) => Mesh.Parse(data, scene, \"\"));\r\n break;\r\n case \"skeletons\":\r\n this._ApplyDeltaForEntity(source, scene, scene.getSkeletonById.bind(scene), (data) => Skeleton.Parse(data, scene));\r\n break;\r\n case \"materials\":\r\n this._ApplyDeltaForEntity(source, scene, scene.getMaterialById.bind(scene), (data) => Material.Parse(data, scene, \"\"));\r\n break;\r\n case \"multiMaterials\":\r\n this._ApplyDeltaForEntity(source, scene, scene.getMaterialById.bind(scene), (data) => MultiMaterial.Parse(data, scene, \"\"));\r\n break;\r\n case \"transformNodes\":\r\n this._ApplyDeltaForEntity(source, scene, scene.getTransformNodeById.bind(scene), (data) => TransformNode.Parse(data, scene, \"\"));\r\n break;\r\n case \"particleSystems\":\r\n this._ApplyDeltaForEntity(source, scene, scene.getParticleSystemById.bind(scene), (data) => ParticleSystem.Parse(data, scene, \"\"));\r\n break;\r\n case \"morphTargetManagers\":\r\n this._ApplyDeltaForEntity(source, scene, scene.getMorphTargetById.bind(scene), (data) => MorphTargetManager.Parse(data, scene));\r\n break;\r\n case \"postProcesses\":\r\n this._ApplyDeltaForEntity(source, scene, scene.getPostProcessByName.bind(scene), (data) => PostProcess.Parse(data, scene, \"\"));\r\n break;\r\n }\r\n } else if (!isNaN(property)) {\r\n anyScene[prop] = source;\r\n } else if (property.fromArray) {\r\n property.fromArray(source);\r\n }\r\n }\r\n }\r\n\r\n private static _ApplyPropertiesToEntity(deltaJSON: any, entity: any) {\r\n for (const prop in deltaJSON) {\r\n const source = deltaJSON[prop];\r\n const property = entity[prop];\r\n\r\n if (property === undefined) {\r\n continue;\r\n }\r\n\r\n if (!isNaN(property) || Array.isArray(property)) {\r\n entity[prop] = source;\r\n } else if (property.fromArray) {\r\n property.fromArray(source);\r\n } else if (typeof property === \"object\" && property !== null) {\r\n this._ApplyPropertiesToEntity(source, property);\r\n }\r\n }\r\n }\r\n\r\n private static _ApplyDeltaForEntity(sources: any[], scene: Scene, finder: (id: string) => any, addNew: (data: any) => void) {\r\n for (const source of sources) {\r\n // Update\r\n if (source.__state && source.__state.id !== undefined) {\r\n const targetEntity = finder(source.__state.id);\r\n\r\n if (targetEntity) {\r\n this._ApplyPropertiesToEntity(source, targetEntity);\r\n }\r\n } else if (source.__state && source.__state.deleteId !== undefined) {\r\n const target = finder(source.__state.deleteId);\r\n target?.dispose();\r\n } else {\r\n // New\r\n addNew(source);\r\n }\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"sceneRecorder.js","sourceRoot":"","sources":["../../../../lts/core/generated/Misc/sceneRecorder.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\r\nimport type { Scene } from \"../scene\";\r\nimport type { Nullable } from \"../types\";\r\nimport { SceneSerializer } from \"./sceneSerializer\";\r\nimport { Mesh } from \"../Meshes/mesh\";\r\nimport { Light } from \"../Lights/light\";\r\nimport { Camera } from \"../Cameras/camera\";\r\nimport { Skeleton } from \"../Bones/skeleton\";\r\nimport { Material } from \"../Materials/material\";\r\nimport { MultiMaterial } from \"../Materials/multiMaterial\";\r\nimport { TransformNode } from \"../Meshes/transformNode\";\r\nimport { ParticleSystem } from \"../Particles/particleSystem\";\r\nimport { MorphTargetManager } from \"../Morph/morphTargetManager\";\r\nimport { ShadowGenerator } from \"../Lights/Shadows/shadowGenerator\";\r\nimport { PostProcess } from \"../PostProcesses/postProcess\";\r\nimport { Texture } from \"../Materials/Textures/texture\";\r\nimport { SerializationHelper } from \"./decorators\";\r\n\r\n/**\r\n * Class used to record delta files between 2 scene states\r\n */\r\nexport class SceneRecorder {\r\n private _trackedScene: Nullable<Scene> = null;\r\n private _savedJSON: any;\r\n\r\n /**\r\n * Track a given scene. This means the current scene state will be considered the original state\r\n * @param scene defines the scene to track\r\n */\r\n public track(scene: Scene) {\r\n this._trackedScene = scene;\r\n\r\n SerializationHelper.AllowLoadingUniqueId = true;\r\n this._savedJSON = SceneSerializer.Serialize(scene);\r\n SerializationHelper.AllowLoadingUniqueId = false;\r\n }\r\n\r\n /**\r\n * Get the delta between current state and original state\r\n * @returns a any containing the delta\r\n */\r\n public getDelta(): any {\r\n if (!this._trackedScene) {\r\n return null;\r\n }\r\n\r\n const currentForceSerializeBuffers = Texture.ForceSerializeBuffers;\r\n Texture.ForceSerializeBuffers = false;\r\n\r\n SerializationHelper.AllowLoadingUniqueId = true;\r\n const newJSON = SceneSerializer.Serialize(this._trackedScene);\r\n SerializationHelper.AllowLoadingUniqueId = false;\r\n const deltaJSON: any = {};\r\n\r\n for (const node in newJSON) {\r\n this._compareCollections(node, this._savedJSON[node], newJSON[node], deltaJSON);\r\n }\r\n\r\n Texture.ForceSerializeBuffers = currentForceSerializeBuffers;\r\n\r\n return deltaJSON;\r\n }\r\n\r\n private _compareArray(key: string, original: any[], current: any[], deltaJSON: any) {\r\n if (original.length === 0 && current.length === 0) {\r\n return true;\r\n }\r\n\r\n // Numbers?\r\n if ((original.length && !isNaN(original[0])) || (current.length && !isNaN(current[0]))) {\r\n if (original.length !== current.length) {\r\n return false;\r\n }\r\n\r\n if (original.length === 0) {\r\n return true;\r\n }\r\n for (let index = 0; index < original.length; index++) {\r\n if (original[index] !== current[index]) {\r\n deltaJSON[key] = current;\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n // let's use uniqueId to find similar objects\r\n const originalUniqueIds: number[] = [];\r\n for (let index = 0; index < original.length; index++) {\r\n const originalObject = original[index];\r\n const originalUniqueId = originalObject.uniqueId;\r\n\r\n originalUniqueIds.push(originalUniqueId);\r\n // Look for that object in current state\r\n const currentObjects = current.filter((c) => c.uniqueId === originalUniqueId);\r\n if (currentObjects.length) {\r\n // We have a candidate\r\n const currentObject = currentObjects[0];\r\n\r\n const newObject: any = {};\r\n if (!this._compareObjects(originalObject, currentObject, newObject)) {\r\n if (!deltaJSON[key]) {\r\n deltaJSON[key] = [];\r\n }\r\n newObject.__state = {\r\n id: currentObject.id || currentObject.name,\r\n };\r\n deltaJSON[key].push(newObject);\r\n }\r\n } else {\r\n // We need to delete\r\n const newObject: any = {\r\n __state: {\r\n deleteId: originalObject.id || originalObject.name,\r\n },\r\n };\r\n deltaJSON[key].push(newObject);\r\n }\r\n }\r\n\r\n // Checking for new objects\r\n for (let index = 0; index < current.length; index++) {\r\n const currentObject = current[index];\r\n const currentUniqueId = currentObject.uniqueId;\r\n\r\n // Object was added\r\n if (originalUniqueIds.indexOf(currentUniqueId) === -1) {\r\n if (!deltaJSON[key]) {\r\n deltaJSON[key] = [];\r\n }\r\n\r\n deltaJSON[key].push(currentObject);\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private _compareObjects(originalObjet: any, currentObject: any, deltaJSON: any) {\r\n let aDifferenceWasFound = false;\r\n\r\n for (const prop in originalObjet) {\r\n if (!Object.prototype.hasOwnProperty.call(originalObjet, prop)) {\r\n continue;\r\n }\r\n const originalValue = originalObjet[prop];\r\n const currentValue = currentObject[prop];\r\n let diffFound = false;\r\n\r\n if (Array.isArray(originalValue)) {\r\n diffFound = JSON.stringify(originalValue) !== JSON.stringify(currentValue);\r\n } else if (!isNaN(originalValue) || Object.prototype.toString.call(originalValue) == \"[object String]\") {\r\n diffFound = originalValue !== currentValue;\r\n } else if (typeof originalValue === \"object\" && typeof currentValue === \"object\") {\r\n const newObject = {};\r\n if (!this._compareObjects(originalValue, currentValue, newObject)) {\r\n deltaJSON[prop] = newObject;\r\n aDifferenceWasFound = true;\r\n }\r\n }\r\n\r\n if (diffFound) {\r\n aDifferenceWasFound = true;\r\n deltaJSON[prop] = currentValue;\r\n }\r\n }\r\n\r\n return !aDifferenceWasFound;\r\n }\r\n\r\n private _compareCollections(key: string, original: any[], current: any[], deltaJSON: any) {\r\n // Same ?\r\n if (original === current) {\r\n return;\r\n }\r\n\r\n if (original && current) {\r\n // Array?\r\n if (Array.isArray(original) && Array.isArray(current)) {\r\n if (this._compareArray(key, original, current, deltaJSON)) {\r\n return;\r\n }\r\n } else if (typeof original === \"object\" && typeof current === \"object\") {\r\n // Object\r\n const newObject = {};\r\n if (!this._compareObjects(original, current, newObject)) {\r\n deltaJSON[key] = newObject;\r\n }\r\n return;\r\n }\r\n }\r\n }\r\n\r\n private static GetShadowGeneratorById(scene: Scene, id: string) {\r\n const allGenerators = scene.lights.map((l) => l.getShadowGenerators());\r\n\r\n for (const generators of allGenerators) {\r\n if (generators) {\r\n const iterator = generators.values();\r\n for (let key = iterator.next(); key.done !== true; key = iterator.next()) {\r\n const generator = key.value;\r\n if (generator && generator.id === id) {\r\n return generator;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Apply a given delta to a given scene\r\n * @param deltaJSON defines the JSON containing the delta\r\n * @param scene defines the scene to apply the delta to\r\n */\r\n public static ApplyDelta(deltaJSON: any | string, scene: Scene) {\r\n if (typeof deltaJSON === \"string\") {\r\n deltaJSON = JSON.parse(deltaJSON);\r\n }\r\n\r\n // Scene\r\n const anyScene = scene as any;\r\n for (const prop in deltaJSON) {\r\n const source = deltaJSON[prop];\r\n const property = anyScene[prop];\r\n\r\n if (Array.isArray(property) || prop === \"shadowGenerators\") {\r\n // Restore array\r\n switch (prop) {\r\n case \"cameras\":\r\n this._ApplyDeltaForEntity(source, scene, scene.getCameraById.bind(scene), (data) => Camera.Parse(data, scene));\r\n break;\r\n case \"lights\":\r\n this._ApplyDeltaForEntity(source, scene, scene.getLightById.bind(scene), (data) => Light.Parse(data, scene));\r\n break;\r\n case \"shadowGenerators\":\r\n this._ApplyDeltaForEntity(\r\n source,\r\n scene,\r\n (id) => this.GetShadowGeneratorById(scene, id),\r\n (data) => ShadowGenerator.Parse(data, scene)\r\n );\r\n break;\r\n case \"meshes\":\r\n this._ApplyDeltaForEntity(source, scene, scene.getMeshById.bind(scene), (data) => Mesh.Parse(data, scene, \"\"));\r\n break;\r\n case \"skeletons\":\r\n this._ApplyDeltaForEntity(source, scene, scene.getSkeletonById.bind(scene), (data) => Skeleton.Parse(data, scene));\r\n break;\r\n case \"materials\":\r\n this._ApplyDeltaForEntity(source, scene, scene.getMaterialById.bind(scene), (data) => Material.Parse(data, scene, \"\"));\r\n break;\r\n case \"multiMaterials\":\r\n this._ApplyDeltaForEntity(source, scene, scene.getMaterialById.bind(scene), (data) => MultiMaterial.Parse(data, scene, \"\"));\r\n break;\r\n case \"transformNodes\":\r\n this._ApplyDeltaForEntity(source, scene, scene.getTransformNodeById.bind(scene), (data) => TransformNode.Parse(data, scene, \"\"));\r\n break;\r\n case \"particleSystems\":\r\n this._ApplyDeltaForEntity(source, scene, scene.getParticleSystemById.bind(scene), (data) => ParticleSystem.Parse(data, scene, \"\"));\r\n break;\r\n case \"morphTargetManagers\":\r\n this._ApplyDeltaForEntity(source, scene, scene.getMorphTargetById.bind(scene), (data) => MorphTargetManager.Parse(data, scene));\r\n break;\r\n case \"postProcesses\":\r\n this._ApplyDeltaForEntity(source, scene, scene.getPostProcessByName.bind(scene), (data) => PostProcess.Parse(data, scene, \"\"));\r\n break;\r\n }\r\n } else if (!isNaN(property)) {\r\n anyScene[prop] = source;\r\n } else if (property.fromArray) {\r\n property.fromArray(source);\r\n }\r\n }\r\n }\r\n\r\n private static _ApplyPropertiesToEntity(deltaJSON: any, entity: any) {\r\n for (const prop in deltaJSON) {\r\n const source = deltaJSON[prop];\r\n const property = entity[prop];\r\n\r\n if (property === undefined) {\r\n continue;\r\n }\r\n\r\n if (!isNaN(property) || Array.isArray(property)) {\r\n entity[prop] = source;\r\n } else if (property.fromArray) {\r\n property.fromArray(source);\r\n } else if (typeof property === \"object\" && property !== null) {\r\n this._ApplyPropertiesToEntity(source, property);\r\n }\r\n }\r\n }\r\n\r\n private static _ApplyDeltaForEntity(sources: any[], scene: Scene, finder: (id: string) => any, addNew: (data: any) => void) {\r\n for (const source of sources) {\r\n // Update\r\n if (source.__state && source.__state.id !== undefined) {\r\n const targetEntity = finder(source.__state.id);\r\n\r\n if (targetEntity) {\r\n // This first pass applies properties that aren't on the serialization list\r\n this._ApplyPropertiesToEntity(source, targetEntity);\r\n // The second pass applies the serializable properties\r\n SerializationHelper.ParseProperties(source, targetEntity, scene, null);\r\n }\r\n } else if (source.__state && source.__state.deleteId !== undefined) {\r\n const target = finder(source.__state.deleteId);\r\n target?.dispose();\r\n } else {\r\n // New\r\n addNew(source);\r\n }\r\n }\r\n }\r\n}\r\n"]}
@@ -386,8 +386,8 @@ export class VirtualJoystick {
386
386
  const jp = this._joystickPosition || this._joystickPointerStartPos;
387
387
  // clear container pixels
388
388
  VirtualJoystick._VJCanvasContext.clearRect(jp.x - this._clearContainerSizeOffset, jp.y - this._clearContainerSizeOffset, this._clearContainerSize, this._clearContainerSize);
389
- // clear puck pixels
390
- VirtualJoystick._VJCanvasContext.clearRect(this._joystickPreviousPointerPos.x - this._clearPuckSizeOffset, this._joystickPreviousPointerPos.y - this._clearPuckSizeOffset, this._clearPuckSize, this._clearPuckSize);
389
+ // clear puck pixels + 1 pixel for the change made before it moved
390
+ VirtualJoystick._VJCanvasContext.clearRect(this._joystickPreviousPointerPos.x - this._clearPuckSizeOffset - 1, this._joystickPreviousPointerPos.y - this._clearPuckSizeOffset - 1, this._clearPuckSize + 2, this._clearPuckSize + 2);
391
391
  }
392
392
  /**
393
393
  * Loads `urlPath` to be used for the container's image
@@ -1 +1 @@
1
- {"version":3,"file":"virtualJoystick.js","sourceRoot":"","sources":["../../../../lts/core/generated/Misc/virtualJoystick.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,qCAAqC;AACrC,oPAAoP;AACpP,qHAAqH;AAErH;;GAEG;AACH,MAAM,CAAN,IAAY,YAOX;AAPD,WAAY,YAAY;IACpB,aAAa;IACb,yCAAC,CAAA;IACD,aAAa;IACb,yCAAC,CAAA;IACD,aAAa;IACb,yCAAC,CAAA;AACL,CAAC,EAPW,YAAY,KAAZ,YAAY,QAOvB;AAyCD;;GAEG;AACH,MAAM,OAAO,eAAe;IAkChB,MAAM,CAAC,kBAAkB;QAC7B,OAAO;YACH,QAAQ,EAAE,EAAE;YACZ,aAAa,EAAE,EAAE;YACjB,KAAK,EAAE,MAAM;YACb,SAAS,EAAE,SAAS;YACpB,cAAc,EAAE,SAAS;YACzB,QAAQ,EAAE,SAAS;YACnB,aAAa,EAAE,KAAK;YACpB,gBAAgB,EAAE,KAAK;SAC1B,CAAC;IACN,CAAC;IAkCD;;;;OAIG;IACH,YAAY,YAAsB,EAAE,cAAuD;QApBnF,cAAS,GAAG,KAAK,CAAC;QAqBtB,MAAM,OAAO,GAAG;YACZ,GAAG,eAAe,CAAC,kBAAkB,EAAE;YACvC,GAAG,cAAc;SACpB,CAAC;QAEF,IAAI,YAAY,EAAE;YACd,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;SAC7B;aAAM;YACH,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;SAC9B;QAED,eAAe,CAAC,oBAAoB,EAAE,CAAC;QAEvC,sDAAsD;QACtD,sCAAsC;QACtC,IAAI,CAAC,2BAA2B,GAAG,YAAY,CAAC,CAAC,CAAC;QAClD,IAAI,CAAC,wBAAwB,GAAG,YAAY,CAAC,CAAC,CAAC;QAE/C,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;QAC9B,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;QAE3B,0BAA0B;QAC1B,IAAI,CAAC,QAAQ,GAAG,IAAI,gBAAgB,EAAyE,CAAC;QAC9G,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAEpC,IAAI,CAAC,oBAAoB,GAAG,EAAE,CAAC;QAC/B,IAAI,CAAC,oBAAoB,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAAC;QAEnE,IAAI,CAAC,SAAS,GAAG,GAAG,EAAE;YAClB,eAAe,CAAC,cAAc,GAAG,MAAM,CAAC,UAAU,CAAC;YACnD,eAAe,CAAC,eAAe,GAAG,MAAM,CAAC,WAAW,CAAC;YACrD,IAAI,eAAe,CAAC,MAAM,EAAE;gBACxB,eAAe,CAAC,MAAM,CAAC,KAAK,GAAG,eAAe,CAAC,cAAc,CAAC;gBAC9D,eAAe,CAAC,MAAM,CAAC,MAAM,GAAG,eAAe,CAAC,eAAe,CAAC;aACnE;YACD,eAAe,CAAC,UAAU,GAAG,eAAe,CAAC,cAAc,GAAG,CAAC,CAAC;QACpE,CAAC,CAAC;QAEF,0DAA0D;QAC1D,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE;YACzB,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YACzD,eAAe,CAAC,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;YAC1D,eAAe,CAAC,cAAc,GAAG,MAAM,CAAC,UAAU,CAAC;YACnD,eAAe,CAAC,eAAe,GAAG,MAAM,CAAC,WAAW,CAAC;YACrD,eAAe,CAAC,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC;YACjD,eAAe,CAAC,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC;YACnD,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC;YAC5C,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;YAC7C,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU,CAAC;YACnD,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,GAAG,aAAa,CAAC;YAC7D,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC;YACzC,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC;YAC1C,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC;YAC1C,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,GAAG,MAAM,CAAC,CAAC,yGAAyG;YAC5J,kCAAkC;YAClC,eAAe,CAAC,MAAM,CAAC,YAAY,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;YAC5D,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YAExD,IAAI,CAAC,OAAO,EAAE;gBACV,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;aACnE;YAED,eAAe,CAAC,gBAAgB,GAAG,OAAO,CAAC;YAC3C,eAAe,CAAC,gBAAgB,CAAC,WAAW,GAAG,SAAS,CAAC;YACzD,eAAe,CAAC,gBAAgB,CAAC,SAAS,GAAG,CAAC,CAAC;YAC/C,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;SACrD;QACD,eAAe,CAAC,UAAU,GAAG,eAAe,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;QAC9D,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC;QAEjD,yBAAyB;QACzB,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC;QAEpC,wBAAwB;QACxB,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;QAC3C,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QAEjC,IAAI,OAAO,CAAC,QAAQ,EAAE;YAClB,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;SAC5D;QACD,IAAI,OAAO,CAAC,SAAS,EAAE;YACnB,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;SACxC;QACD,IAAI,OAAO,CAAC,cAAc,EAAE;YACxB,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;SAClD;QACD,IAAI,OAAO,CAAC,aAAa,EAAE;YACvB,eAAe,CAAC,oBAAoB,EAAE,CAAC;SAC1C;QAED,2CAA2C;QAC3C,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;QAE3C,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAC,CAAC;QAC7B,4BAA4B;QAC5B,IAAI,CAAC,mBAAmB,GAAG,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7C,IAAI,CAAC,2BAA2B,GAAG,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACrD,2BAA2B;QAC3B,IAAI,CAAC,wBAAwB,GAAG,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAClD,IAAI,CAAC,oBAAoB,GAAG,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAE9C,IAAI,CAAC,wBAAwB,GAAG,CAAC,GAAG,EAAE,EAAE;YACpC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;QAC7B,CAAC,CAAC;QACF,IAAI,CAAC,wBAAwB,GAAG,CAAC,GAAG,EAAE,EAAE;YACpC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;QAC7B,CAAC,CAAC;QACF,IAAI,CAAC,sBAAsB,GAAG,CAAC,GAAG,EAAE,EAAE;YAClC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QAC3B,CAAC,CAAC;QAEF,eAAe,CAAC,MAAM,CAAC,gBAAgB,CAAC,aAAa,EAAE,IAAI,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;QAC7F,eAAe,CAAC,MAAM,CAAC,gBAAgB,CAAC,aAAa,EAAE,IAAI,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;QAC7F,eAAe,CAAC,MAAM,CAAC,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;QACzF,eAAe,CAAC,MAAM,CAAC,gBAAgB,CAAC,YAAY,EAAE,IAAI,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;QAC1F,eAAe,CAAC,MAAM,CAAC,gBAAgB,CACnC,aAAa,EACb,CAAC,GAAG,EAAE,EAAE;YACJ,GAAG,CAAC,cAAc,EAAE,CAAC,CAAC,uBAAuB;QACjD,CAAC,EACD,KAAK,CACR,CAAC;QACF,qBAAqB,CAAC,GAAG,EAAE;YACvB,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAChC,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;;OAGG;IACI,sBAAsB,CAAC,sBAA8B;QACxD,IAAI,CAAC,oBAAoB,GAAG,sBAAsB,CAAC;QACnD,IAAI,CAAC,oBAAoB,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAAC;IACvE,CAAC;IAEO,cAAc,CAAC,CAAe;QAClC,IAAI,yBAAkC,CAAC;QAEvC,CAAC,CAAC,cAAc,EAAE,CAAC;QAEnB,IAAI,IAAI,CAAC,aAAa,KAAK,IAAI,EAAE;YAC7B,yBAAyB,GAAG,CAAC,CAAC,OAAO,GAAG,eAAe,CAAC,UAAU,CAAC;SACtE;aAAM;YACH,yBAAyB,GAAG,CAAC,CAAC,OAAO,GAAG,eAAe,CAAC,UAAU,CAAC;SACtE;QAED,IAAI,yBAAyB,IAAI,IAAI,CAAC,kBAAkB,GAAG,CAAC,EAAE;YAC1D,0DAA0D;YAC1D,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAC,SAAS,CAAC;YAEtC,IAAI,IAAI,CAAC,iBAAiB,EAAE;gBACxB,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC;gBAC/D,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC;gBAC1D,IAAI,CAAC,2BAA2B,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC;gBAElE,qDAAqD;gBACrD,yCAAyC;gBACzC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;aAC1B;iBAAM;gBACH,IAAI,CAAC,wBAAwB,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC;gBAC5C,IAAI,CAAC,wBAAwB,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC;gBAC5C,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,wBAAwB,CAAC,KAAK,EAAE,CAAC;gBACjE,IAAI,CAAC,2BAA2B,GAAG,IAAI,CAAC,wBAAwB,CAAC,KAAK,EAAE,CAAC;aAC5E;YAED,IAAI,CAAC,oBAAoB,CAAC,CAAC,GAAG,CAAC,CAAC;YAChC,IAAI,CAAC,oBAAoB,CAAC,CAAC,GAAG,CAAC,CAAC;YAChC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;SAChD;aAAM;YACH,mEAAmE;YACnE,IAAI,eAAe,CAAC,oBAAoB,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE;gBAC1D,IAAI,CAAC,OAAO,EAAE,CAAC;gBACf,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;aACjH;SACJ;IACL,CAAC;IAEO,cAAc,CAAC,CAAe;QAClC,qFAAqF;QACrF,IAAI,IAAI,CAAC,kBAAkB,IAAI,CAAC,CAAC,SAAS,EAAE;YACxC,gCAAgC;YAChC,IAAI,IAAI,CAAC,gBAAgB,EAAE;gBACvB,MAAM,MAAM,GAAG,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,wBAAwB,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC,CAAC;gBACrH,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;gBAEjC,IAAI,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAE;oBAC/B,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC,CAAC;iBACtD;gBAED,IAAI,CAAC,mBAAmB,CAAC,CAAC,GAAG,IAAI,CAAC,wBAAwB,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;gBACxE,IAAI,CAAC,mBAAmB,CAAC,CAAC,GAAG,IAAI,CAAC,wBAAwB,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;aAC3E;iBAAM;gBACH,IAAI,CAAC,mBAAmB,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC;gBACvC,IAAI,CAAC,mBAAmB,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC;aAC1C;YAED,sBAAsB;YACtB,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,CAAC;YAC7D,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;YAE9F,oEAAoE;YACpE,6DAA6D;YAC7D,IAAI,CAAC,GAAG,eAAe,CAAC,oBAAoB,EAAE;gBAC1C,IAAI,IAAI,CAAC,aAAa,EAAE;oBACpB,IAAI,CAAC,mBAAmB,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,UAAU,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;iBACjG;qBAAM;oBACH,IAAI,CAAC,mBAAmB,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,UAAU,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;iBACjG;aACJ;YAED,MAAM,kBAAkB,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1D,MAAM,cAAc,GAAG,CAAC,kBAAkB,GAAG,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,oBAAoB,CAAC;YACtG,QAAQ,IAAI,CAAC,2BAA2B,EAAE;gBACtC,KAAK,YAAY,CAAC,CAAC;oBACf,IAAI,CAAC,aAAa,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC;oBACjE,MAAM;gBACV,KAAK,YAAY,CAAC,CAAC;oBACf,IAAI,CAAC,aAAa,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC;oBACjE,MAAM;gBACV,KAAK,YAAY,CAAC,CAAC;oBACf,IAAI,CAAC,aAAa,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC;oBACjE,MAAM;aACb;YACD,MAAM,eAAe,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACpD,MAAM,cAAc,GAAG,CAAC,eAAe,GAAG,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,oBAAoB,CAAC;YACnG,QAAQ,IAAI,CAAC,wBAAwB,EAAE;gBACnC,KAAK,YAAY,CAAC,CAAC;oBACf,IAAI,CAAC,aAAa,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC;oBACjE,MAAM;gBACV,KAAK,YAAY,CAAC,CAAC;oBACf,IAAI,CAAC,aAAa,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC;oBACjE,MAAM;gBACV,KAAK,YAAY,CAAC,CAAC;oBACf,IAAI,CAAC,aAAa,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC;oBACjE,MAAM;aACb;SACJ;aAAM;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;YACvD,IAAI,IAAI,EAAE;gBACL,IAAY,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC;gBAC3B,IAAY,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC;aAC/B;SACJ;IACL,CAAC;IAEO,YAAY,CAAC,CAAe;QAChC,IAAI,IAAI,CAAC,kBAAkB,IAAI,CAAC,CAAC,SAAS,EAAE;YACxC,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAE1B,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAC,CAAC;YAC7B,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;SACxB;aAAM;YACH,MAAM,KAAK,GAA2D,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;YAChH,IAAI,KAAK,EAAE;gBACP,eAAe,CAAC,gBAAgB,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,EAAE,KAAK,CAAC,KAAK,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;aAC1F;SACJ;QACD,IAAI,CAAC,oBAAoB,CAAC,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,CAAC,oBAAoB,CAAC,CAAC,GAAG,CAAC,CAAC;QAEhC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;IACjD,CAAC;IAED;;;OAGG;IACI,gBAAgB,CAAC,QAAgB;QACpC,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,IAAW,aAAa,CAAC,OAAe;QACpC,IAAI,CAAC,sBAAsB,GAAG,OAAO,CAAC;QACtC,IAAI,CAAC,mBAAmB,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,sBAAsB,GAAG,GAAG,CAAC,CAAC;QACjE,IAAI,CAAC,yBAAyB,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAmB,GAAG,CAAC,CAAC,CAAC;IACtE,CAAC;IACD,IAAW,aAAa;QACpB,OAAO,IAAI,CAAC,sBAAsB,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,IAAW,QAAQ,CAAC,OAAe;QAC/B,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC;QACjC,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,GAAG,GAAG,CAAC,CAAC;QACvD,IAAI,CAAC,oBAAoB,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC;IAC5D,CAAC;IACD,IAAW,QAAQ;QACf,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAClC,CAAC;IAED;;OAEG;IACI,aAAa;QAChB,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;QAE3B,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,IAAW,aAAa,CAAC,KAAc;QACnC,IAAI,IAAI,CAAC,cAAc,KAAK,KAAK,EAAE;YAC/B,OAAO;SACV;QAED,IAAI,KAAK,IAAI,IAAI,CAAC,iBAAiB,EAAE;YACjC,eAAe,CAAC,oBAAoB,EAAE,CAAC;YAEvC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;SAC9B;aAAM;YACH,eAAe,CAAC,oBAAoB,EAAE,CAAC;YAEvC,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;SAC/B;IACL,CAAC;IACD,IAAW,aAAa;QACpB,OAAO,IAAI,CAAC,cAAc,CAAC;IAC/B,CAAC;IAED;;;;OAIG;IACI,WAAW,CAAC,CAAS,EAAE,CAAS;QACnC,gEAAgE;QAChE,IAAI,IAAI,CAAC,wBAAwB,EAAE;YAC/B,IAAI,CAAC,kBAAkB,EAAE,CAAC;SAC7B;QAED,IAAI,CAAC,iBAAiB,GAAG,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/C,CAAC;IAED;;;OAGG;IACI,gBAAgB,CAAC,MAAiB;QACrC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IAC1B,CAAC;IAED;;;OAGG;IACI,mBAAmB,CAAC,IAAkB;QACzC,QAAQ,IAAI,EAAE;YACV,KAAK,YAAY,CAAC,CAAC,CAAC;YACpB,KAAK,YAAY,CAAC,CAAC,CAAC;YACpB,KAAK,YAAY,CAAC,CAAC;gBACf,IAAI,CAAC,2BAA2B,GAAG,IAAI,CAAC;gBACxC,MAAM;YACV;gBACI,IAAI,CAAC,2BAA2B,GAAG,YAAY,CAAC,CAAC,CAAC;gBAClD,MAAM;SACb;IACL,CAAC;IAED;;;OAGG;IACI,gBAAgB,CAAC,IAAkB;QACtC,QAAQ,IAAI,EAAE;YACV,KAAK,YAAY,CAAC,CAAC,CAAC;YACpB,KAAK,YAAY,CAAC,CAAC,CAAC;YACpB,KAAK,YAAY,CAAC,CAAC;gBACf,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC;gBACrC,MAAM;YACV;gBACI,IAAI,CAAC,wBAAwB,GAAG,YAAY,CAAC,CAAC,CAAC;gBAC/C,MAAM;SACb;IACL,CAAC;IAED;;OAEG;IACK,kBAAkB;QACtB,MAAM,EAAE,GAAG,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,wBAAwB,CAAC;QAEnE,yBAAyB;QACzB,eAAe,CAAC,gBAAgB,CAAC,SAAS,CACtC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,yBAAyB,EACrC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,yBAAyB,EACrC,IAAI,CAAC,mBAAmB,EACxB,IAAI,CAAC,mBAAmB,CAC3B,CAAC;QAEF,oBAAoB;QACpB,eAAe,CAAC,gBAAgB,CAAC,SAAS,CACtC,IAAI,CAAC,2BAA2B,CAAC,CAAC,GAAG,IAAI,CAAC,oBAAoB,EAC9D,IAAI,CAAC,2BAA2B,CAAC,CAAC,GAAG,IAAI,CAAC,oBAAoB,EAC9D,IAAI,CAAC,cAAc,EACnB,IAAI,CAAC,cAAc,CACtB,CAAC;IACN,CAAC;IAED;;;OAGG;IACI,iBAAiB,CAAC,OAAe;QACpC,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC;QAC1B,KAAK,CAAC,GAAG,GAAG,OAAO,CAAC;QAEpB,KAAK,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC,CAAC;IACxD,CAAC;IAED;;;OAGG;IACI,YAAY,CAAC,OAAe;QAC/B,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC;QAC1B,KAAK,CAAC,GAAG,GAAG,OAAO,CAAC;QAEpB,KAAK,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,CAAC;IACnD,CAAC;IAED;;OAEG;IACK,cAAc;QAClB,MAAM,EAAE,GAAG,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,wBAAwB,CAAC;QAEnE,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAE1B,IAAI,IAAI,CAAC,eAAe,EAAE;YACtB,eAAe,CAAC,gBAAgB,CAAC,SAAS,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,aAAa,GAAG,CAAC,EAAE,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC;SAC1K;aAAM;YACH,kBAAkB;YAClB,eAAe,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC;YAC7C,eAAe,CAAC,gBAAgB,CAAC,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC;YACnE,eAAe,CAAC,gBAAgB,CAAC,SAAS,GAAG,CAAC,CAAC;YAC/C,eAAe,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;YAC3F,eAAe,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC;YAC1C,eAAe,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC;YAE7C,kBAAkB;YAClB,eAAe,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC;YAC7C,eAAe,CAAC,gBAAgB,CAAC,SAAS,GAAG,CAAC,CAAC;YAC/C,eAAe,CAAC,gBAAgB,CAAC,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC;YACnE,eAAe,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;YACtF,eAAe,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC;YAC1C,eAAe,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC;SAChD;IACL,CAAC;IAED;;OAEG;IACK,SAAS;QACb,IAAI,IAAI,CAAC,UAAU,EAAE;YACjB,eAAe,CAAC,gBAAgB,CAAC,SAAS,CACtC,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,mBAAmB,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,EAC1C,IAAI,CAAC,mBAAmB,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,EAC1C,IAAI,CAAC,QAAQ,GAAG,CAAC,EACjB,IAAI,CAAC,QAAQ,GAAG,CAAC,CACpB,CAAC;SACL;aAAM;YACH,eAAe,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC;YAC7C,eAAe,CAAC,gBAAgB,CAAC,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC;YACnE,eAAe,CAAC,gBAAgB,CAAC,SAAS,GAAG,CAAC,CAAC;YAC/C,eAAe,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;YAClI,eAAe,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC;YAC1C,eAAe,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC;SAChD;IACL,CAAC;IAEO,oBAAoB;QACxB,4CAA4C;QAC5C,IAAI,IAAI,CAAC,SAAS,EAAE;YAChB,OAAO;SACV;QACD,IAAI,IAAI,CAAC,aAAa,EAAE;YACpB,IAAI,CAAC,cAAc,EAAE,CAAC;SACzB;QAED,IAAI,IAAI,CAAC,OAAO,EAAE;YACd,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;gBACjC,IAAmB,KAAM,CAAC,SAAS,KAAK,IAAI,CAAC,kBAAkB,EAAE;oBAC7D,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;wBACrB,IAAI,CAAC,cAAc,EAAE,CAAC;qBACzB;oBAED,IAAI,CAAC,SAAS,EAAE,CAAC;oBAEjB,uCAAuC;oBACvC,IAAI,CAAC,2BAA2B,GAAG,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,CAAC;iBACvE;qBAAM;oBACH,eAAe,CAAC,gBAAgB,CAAC,SAAS,CAAO,KAAM,CAAC,KAAK,GAAG,EAAE,EAAQ,KAAM,CAAC,KAAK,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;oBACrG,eAAe,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC;oBAC7C,eAAe,CAAC,gBAAgB,CAAC,SAAS,GAAG,OAAO,CAAC;oBACrD,eAAe,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC;oBAC7C,eAAe,CAAC,gBAAgB,CAAC,WAAW,GAAG,KAAK,CAAC;oBACrD,eAAe,CAAC,gBAAgB,CAAC,SAAS,GAAG,CAAC,CAAC;oBAC/C,eAAe,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;oBACjF,eAAe,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC;oBAC1C,eAAe,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC;oBACvC,KAAM,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC;oBACvB,KAAM,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC;iBAChC;YACL,CAAC,CAAC,CAAC;SACN;QACD,qBAAqB,CAAC,GAAG,EAAE;YACvB,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAChC,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;OAEG;IACI,aAAa;QAChB,IAAI,eAAe,CAAC,MAAM,EAAE;YACxB,eAAe,CAAC,MAAM,CAAC,mBAAmB,CAAC,aAAa,EAAE,IAAI,CAAC,wBAAwB,CAAC,CAAC;YACzF,eAAe,CAAC,MAAM,CAAC,mBAAmB,CAAC,aAAa,EAAE,IAAI,CAAC,wBAAwB,CAAC,CAAC;YACzF,eAAe,CAAC,MAAM,CAAC,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC,sBAAsB,CAAC,CAAC;YACrF,eAAe,CAAC,MAAM,CAAC,mBAAmB,CAAC,YAAY,EAAE,IAAI,CAAC,sBAAsB,CAAC,CAAC;YACtF,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;YACrD,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;YAClD,eAAe,CAAC,MAAM,GAAG,IAAI,CAAC;SACjC;QACD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;IAC1B,CAAC;;AAjlBD,4FAA4F;AAC7E,oCAAoB,GAAW,CAAC,CAAC;AACjC,oCAAoB,GAAW,CAAC,CAAC","sourcesContent":["import type { Nullable } from \"../types\";\r\nimport { Vector3, Vector2 } from \"../Maths/math.vector\";\r\nimport { StringDictionary } from \"./stringDictionary\";\r\n\r\n// Mainly based on these 2 articles :\r\n// Creating an universal virtual touch joystick working for all Touch models thanks to Hand.JS : http://blogs.msdn.com/b/davrous/archive/2013/02/22/creating-an-universal-virtual-touch-joystick-working-for-all-touch-models-thanks-to-hand-js.aspx\r\n// & on Seb Lee-Delisle original work: http://seb.ly/2011/04/multi-touch-game-controller-in-javascripthtml5-for-ipad/\r\n\r\n/**\r\n * Defines the potential axis of a Joystick\r\n */\r\nexport enum JoystickAxis {\r\n /** X axis */\r\n X,\r\n /** Y axis */\r\n Y,\r\n /** Z axis */\r\n Z,\r\n}\r\n\r\n/**\r\n * Represents the different customization options available\r\n * for VirtualJoystick\r\n */\r\ninterface VirtualJoystickCustomizations {\r\n /**\r\n * Size of the joystick's puck\r\n */\r\n puckSize: number;\r\n /**\r\n * Size of the joystick's container\r\n */\r\n containerSize: number;\r\n /**\r\n * Color of the joystick && puck\r\n */\r\n color: string;\r\n /**\r\n * Image URL for the joystick's puck\r\n */\r\n puckImage?: string;\r\n /**\r\n * Image URL for the joystick's container\r\n */\r\n containerImage?: string;\r\n /**\r\n * Defines the unmoving position of the joystick container\r\n */\r\n position?: { x: number; y: number };\r\n /**\r\n * Defines whether or not the joystick container is always visible\r\n */\r\n alwaysVisible: boolean;\r\n /**\r\n * Defines whether or not to limit the movement of the puck to the joystick's container\r\n */\r\n limitToContainer: boolean;\r\n}\r\n\r\n/**\r\n * Class used to define virtual joystick (used in touch mode)\r\n */\r\nexport class VirtualJoystick {\r\n /**\r\n * Gets or sets a boolean indicating that left and right values must be inverted\r\n */\r\n public reverseLeftRight: boolean;\r\n /**\r\n * Gets or sets a boolean indicating that up and down values must be inverted\r\n */\r\n public reverseUpDown: boolean;\r\n /**\r\n * Gets the offset value for the position (ie. the change of the position value)\r\n */\r\n public deltaPosition: Vector3;\r\n /**\r\n * Gets a boolean indicating if the virtual joystick was pressed\r\n */\r\n public pressed: boolean;\r\n /**\r\n * Canvas the virtual joystick will render onto, default z-index of this is 5\r\n */\r\n public static Canvas: Nullable<HTMLCanvasElement>;\r\n\r\n /**\r\n * boolean indicating whether or not the joystick's puck's movement should be limited to the joystick's container area\r\n */\r\n public limitToContainer: boolean;\r\n\r\n // Used to draw the virtual joystick inside a 2D canvas on top of the WebGL rendering canvas\r\n private static _GlobalJoystickIndex: number = 0;\r\n private static _AlwaysVisibleSticks: number = 0;\r\n private static _VJCanvasContext: CanvasRenderingContext2D;\r\n private static _VJCanvasWidth: number;\r\n private static _VJCanvasHeight: number;\r\n private static _HalfWidth: number;\r\n private static _GetDefaultOptions(): VirtualJoystickCustomizations {\r\n return {\r\n puckSize: 40,\r\n containerSize: 60,\r\n color: \"cyan\",\r\n puckImage: undefined,\r\n containerImage: undefined,\r\n position: undefined,\r\n alwaysVisible: false,\r\n limitToContainer: false,\r\n };\r\n }\r\n\r\n private _action: () => any;\r\n private _axisTargetedByLeftAndRight: JoystickAxis;\r\n private _axisTargetedByUpAndDown: JoystickAxis;\r\n private _joystickSensibility: number;\r\n private _inversedSensibility: number;\r\n private _joystickPointerId: number;\r\n private _joystickColor: string;\r\n private _joystickPointerPos: Vector2;\r\n private _joystickPreviousPointerPos: Vector2;\r\n private _joystickPointerStartPos: Vector2;\r\n private _deltaJoystickVector: Vector2;\r\n private _leftJoystick: boolean;\r\n private _touches: StringDictionary<{ x: number; y: number; prevX: number; prevY: number } | PointerEvent>;\r\n private _joystickPosition: Nullable<Vector2>;\r\n private _alwaysVisible: boolean;\r\n private _puckImage: HTMLImageElement;\r\n private _containerImage: HTMLImageElement;\r\n private _released = false;\r\n\r\n // size properties\r\n private _joystickPuckSize: number;\r\n private _joystickContainerSize: number;\r\n private _clearPuckSize: number;\r\n private _clearContainerSize: number;\r\n private _clearPuckSizeOffset: number;\r\n private _clearContainerSizeOffset: number;\r\n\r\n private _onPointerDownHandlerRef: (e: PointerEvent) => any;\r\n private _onPointerMoveHandlerRef: (e: PointerEvent) => any;\r\n private _onPointerUpHandlerRef: (e: PointerEvent) => any;\r\n private _onResize: (e: any) => any;\r\n\r\n /**\r\n * Creates a new virtual joystick\r\n * @param leftJoystick defines that the joystick is for left hand (false by default)\r\n * @param customizations Defines the options we want to customize the VirtualJoystick\r\n */\r\n constructor(leftJoystick?: boolean, customizations?: Partial<VirtualJoystickCustomizations>) {\r\n const options = {\r\n ...VirtualJoystick._GetDefaultOptions(),\r\n ...customizations,\r\n };\r\n\r\n if (leftJoystick) {\r\n this._leftJoystick = true;\r\n } else {\r\n this._leftJoystick = false;\r\n }\r\n\r\n VirtualJoystick._GlobalJoystickIndex++;\r\n\r\n // By default left & right arrow keys are moving the X\r\n // and up & down keys are moving the Y\r\n this._axisTargetedByLeftAndRight = JoystickAxis.X;\r\n this._axisTargetedByUpAndDown = JoystickAxis.Y;\r\n\r\n this.reverseLeftRight = false;\r\n this.reverseUpDown = false;\r\n\r\n // collections of pointers\r\n this._touches = new StringDictionary<{ x: number; y: number; prevX: number; prevY: number } | PointerEvent>();\r\n this.deltaPosition = Vector3.Zero();\r\n\r\n this._joystickSensibility = 25;\r\n this._inversedSensibility = 1 / (this._joystickSensibility / 1000);\r\n\r\n this._onResize = () => {\r\n VirtualJoystick._VJCanvasWidth = window.innerWidth;\r\n VirtualJoystick._VJCanvasHeight = window.innerHeight;\r\n if (VirtualJoystick.Canvas) {\r\n VirtualJoystick.Canvas.width = VirtualJoystick._VJCanvasWidth;\r\n VirtualJoystick.Canvas.height = VirtualJoystick._VJCanvasHeight;\r\n }\r\n VirtualJoystick._HalfWidth = VirtualJoystick._VJCanvasWidth / 2;\r\n };\r\n\r\n // injecting a canvas element on top of the canvas 3D game\r\n if (!VirtualJoystick.Canvas) {\r\n window.addEventListener(\"resize\", this._onResize, false);\r\n VirtualJoystick.Canvas = document.createElement(\"canvas\");\r\n VirtualJoystick._VJCanvasWidth = window.innerWidth;\r\n VirtualJoystick._VJCanvasHeight = window.innerHeight;\r\n VirtualJoystick.Canvas.width = window.innerWidth;\r\n VirtualJoystick.Canvas.height = window.innerHeight;\r\n VirtualJoystick.Canvas.style.width = \"100%\";\r\n VirtualJoystick.Canvas.style.height = \"100%\";\r\n VirtualJoystick.Canvas.style.position = \"absolute\";\r\n VirtualJoystick.Canvas.style.backgroundColor = \"transparent\";\r\n VirtualJoystick.Canvas.style.top = \"0px\";\r\n VirtualJoystick.Canvas.style.left = \"0px\";\r\n VirtualJoystick.Canvas.style.zIndex = \"5\";\r\n VirtualJoystick.Canvas.style.touchAction = \"none\"; // fix https://forum.babylonjs.com/t/virtualjoystick-needs-to-set-style-touch-action-none-explicitly/9562\r\n // Support for jQuery PEP polyfill\r\n VirtualJoystick.Canvas.setAttribute(\"touch-action\", \"none\");\r\n const context = VirtualJoystick.Canvas.getContext(\"2d\");\r\n\r\n if (!context) {\r\n throw new Error(\"Unable to create canvas for virtual joystick\");\r\n }\r\n\r\n VirtualJoystick._VJCanvasContext = context;\r\n VirtualJoystick._VJCanvasContext.strokeStyle = \"#ffffff\";\r\n VirtualJoystick._VJCanvasContext.lineWidth = 2;\r\n document.body.appendChild(VirtualJoystick.Canvas);\r\n }\r\n VirtualJoystick._HalfWidth = VirtualJoystick.Canvas.width / 2;\r\n this.pressed = false;\r\n this.limitToContainer = options.limitToContainer;\r\n\r\n // default joystick color\r\n this._joystickColor = options.color;\r\n\r\n // default joystick size\r\n this.containerSize = options.containerSize;\r\n this.puckSize = options.puckSize;\r\n\r\n if (options.position) {\r\n this.setPosition(options.position.x, options.position.y);\r\n }\r\n if (options.puckImage) {\r\n this.setPuckImage(options.puckImage);\r\n }\r\n if (options.containerImage) {\r\n this.setContainerImage(options.containerImage);\r\n }\r\n if (options.alwaysVisible) {\r\n VirtualJoystick._AlwaysVisibleSticks++;\r\n }\r\n\r\n // must come after position potentially set\r\n this.alwaysVisible = options.alwaysVisible;\r\n\r\n this._joystickPointerId = -1;\r\n // current joystick position\r\n this._joystickPointerPos = new Vector2(0, 0);\r\n this._joystickPreviousPointerPos = new Vector2(0, 0);\r\n // origin joystick position\r\n this._joystickPointerStartPos = new Vector2(0, 0);\r\n this._deltaJoystickVector = new Vector2(0, 0);\r\n\r\n this._onPointerDownHandlerRef = (evt) => {\r\n this._onPointerDown(evt);\r\n };\r\n this._onPointerMoveHandlerRef = (evt) => {\r\n this._onPointerMove(evt);\r\n };\r\n this._onPointerUpHandlerRef = (evt) => {\r\n this._onPointerUp(evt);\r\n };\r\n\r\n VirtualJoystick.Canvas.addEventListener(\"pointerdown\", this._onPointerDownHandlerRef, false);\r\n VirtualJoystick.Canvas.addEventListener(\"pointermove\", this._onPointerMoveHandlerRef, false);\r\n VirtualJoystick.Canvas.addEventListener(\"pointerup\", this._onPointerUpHandlerRef, false);\r\n VirtualJoystick.Canvas.addEventListener(\"pointerout\", this._onPointerUpHandlerRef, false);\r\n VirtualJoystick.Canvas.addEventListener(\r\n \"contextmenu\",\r\n (evt) => {\r\n evt.preventDefault(); // Disables system menu\r\n },\r\n false\r\n );\r\n requestAnimationFrame(() => {\r\n this._drawVirtualJoystick();\r\n });\r\n }\r\n\r\n /**\r\n * Defines joystick sensibility (ie. the ratio between a physical move and virtual joystick position change)\r\n * @param newJoystickSensibility defines the new sensibility\r\n */\r\n public setJoystickSensibility(newJoystickSensibility: number) {\r\n this._joystickSensibility = newJoystickSensibility;\r\n this._inversedSensibility = 1 / (this._joystickSensibility / 1000);\r\n }\r\n\r\n private _onPointerDown(e: PointerEvent) {\r\n let positionOnScreenCondition: boolean;\r\n\r\n e.preventDefault();\r\n\r\n if (this._leftJoystick === true) {\r\n positionOnScreenCondition = e.clientX < VirtualJoystick._HalfWidth;\r\n } else {\r\n positionOnScreenCondition = e.clientX > VirtualJoystick._HalfWidth;\r\n }\r\n\r\n if (positionOnScreenCondition && this._joystickPointerId < 0) {\r\n // First contact will be dedicated to the virtual joystick\r\n this._joystickPointerId = e.pointerId;\r\n\r\n if (this._joystickPosition) {\r\n this._joystickPointerStartPos = this._joystickPosition.clone();\r\n this._joystickPointerPos = this._joystickPosition.clone();\r\n this._joystickPreviousPointerPos = this._joystickPosition.clone();\r\n\r\n // in case the user only clicks down && doesn't move:\r\n // this ensures the delta is properly set\r\n this._onPointerMove(e);\r\n } else {\r\n this._joystickPointerStartPos.x = e.clientX;\r\n this._joystickPointerStartPos.y = e.clientY;\r\n this._joystickPointerPos = this._joystickPointerStartPos.clone();\r\n this._joystickPreviousPointerPos = this._joystickPointerStartPos.clone();\r\n }\r\n\r\n this._deltaJoystickVector.x = 0;\r\n this._deltaJoystickVector.y = 0;\r\n this.pressed = true;\r\n this._touches.add(e.pointerId.toString(), e);\r\n } else {\r\n // You can only trigger the action buttons with a joystick declared\r\n if (VirtualJoystick._GlobalJoystickIndex < 2 && this._action) {\r\n this._action();\r\n this._touches.add(e.pointerId.toString(), { x: e.clientX, y: e.clientY, prevX: e.clientX, prevY: e.clientY });\r\n }\r\n }\r\n }\r\n\r\n private _onPointerMove(e: PointerEvent) {\r\n // If the current pointer is the one associated to the joystick (first touch contact)\r\n if (this._joystickPointerId == e.pointerId) {\r\n // limit to container if need be\r\n if (this.limitToContainer) {\r\n const vector = new Vector2(e.clientX - this._joystickPointerStartPos.x, e.clientY - this._joystickPointerStartPos.y);\r\n const distance = vector.length();\r\n\r\n if (distance > this.containerSize) {\r\n vector.scaleInPlace(this.containerSize / distance);\r\n }\r\n\r\n this._joystickPointerPos.x = this._joystickPointerStartPos.x + vector.x;\r\n this._joystickPointerPos.y = this._joystickPointerStartPos.y + vector.y;\r\n } else {\r\n this._joystickPointerPos.x = e.clientX;\r\n this._joystickPointerPos.y = e.clientY;\r\n }\r\n\r\n // create delta vector\r\n this._deltaJoystickVector = this._joystickPointerPos.clone();\r\n this._deltaJoystickVector = this._deltaJoystickVector.subtract(this._joystickPointerStartPos);\r\n\r\n // if a joystick is always visible, there will be clipping issues if\r\n // you drag the puck from one over the container of the other\r\n if (0 < VirtualJoystick._AlwaysVisibleSticks) {\r\n if (this._leftJoystick) {\r\n this._joystickPointerPos.x = Math.min(VirtualJoystick._HalfWidth, this._joystickPointerPos.x);\r\n } else {\r\n this._joystickPointerPos.x = Math.max(VirtualJoystick._HalfWidth, this._joystickPointerPos.x);\r\n }\r\n }\r\n\r\n const directionLeftRight = this.reverseLeftRight ? -1 : 1;\r\n const deltaJoystickX = (directionLeftRight * this._deltaJoystickVector.x) / this._inversedSensibility;\r\n switch (this._axisTargetedByLeftAndRight) {\r\n case JoystickAxis.X:\r\n this.deltaPosition.x = Math.min(1, Math.max(-1, deltaJoystickX));\r\n break;\r\n case JoystickAxis.Y:\r\n this.deltaPosition.y = Math.min(1, Math.max(-1, deltaJoystickX));\r\n break;\r\n case JoystickAxis.Z:\r\n this.deltaPosition.z = Math.min(1, Math.max(-1, deltaJoystickX));\r\n break;\r\n }\r\n const directionUpDown = this.reverseUpDown ? 1 : -1;\r\n const deltaJoystickY = (directionUpDown * this._deltaJoystickVector.y) / this._inversedSensibility;\r\n switch (this._axisTargetedByUpAndDown) {\r\n case JoystickAxis.X:\r\n this.deltaPosition.x = Math.min(1, Math.max(-1, deltaJoystickY));\r\n break;\r\n case JoystickAxis.Y:\r\n this.deltaPosition.y = Math.min(1, Math.max(-1, deltaJoystickY));\r\n break;\r\n case JoystickAxis.Z:\r\n this.deltaPosition.z = Math.min(1, Math.max(-1, deltaJoystickY));\r\n break;\r\n }\r\n } else {\r\n const data = this._touches.get(e.pointerId.toString());\r\n if (data) {\r\n (data as any).x = e.clientX;\r\n (data as any).y = e.clientY;\r\n }\r\n }\r\n }\r\n\r\n private _onPointerUp(e: PointerEvent) {\r\n if (this._joystickPointerId == e.pointerId) {\r\n this._clearPreviousDraw();\r\n\r\n this._joystickPointerId = -1;\r\n this.pressed = false;\r\n } else {\r\n const touch = <{ x: number; y: number; prevX: number; prevY: number }>this._touches.get(e.pointerId.toString());\r\n if (touch) {\r\n VirtualJoystick._VJCanvasContext.clearRect(touch.prevX - 44, touch.prevY - 44, 88, 88);\r\n }\r\n }\r\n this._deltaJoystickVector.x = 0;\r\n this._deltaJoystickVector.y = 0;\r\n\r\n this._touches.remove(e.pointerId.toString());\r\n }\r\n\r\n /**\r\n * Change the color of the virtual joystick\r\n * @param newColor a string that must be a CSS color value (like \"red\") or the hexa value (like \"#FF0000\")\r\n */\r\n public setJoystickColor(newColor: string) {\r\n this._joystickColor = newColor;\r\n }\r\n\r\n /**\r\n * Size of the joystick's container\r\n */\r\n public set containerSize(newSize: number) {\r\n this._joystickContainerSize = newSize;\r\n this._clearContainerSize = ~~(this._joystickContainerSize * 2.1);\r\n this._clearContainerSizeOffset = ~~(this._clearContainerSize / 2);\r\n }\r\n public get containerSize() {\r\n return this._joystickContainerSize;\r\n }\r\n\r\n /**\r\n * Size of the joystick's puck\r\n */\r\n public set puckSize(newSize: number) {\r\n this._joystickPuckSize = newSize;\r\n this._clearPuckSize = ~~(this._joystickPuckSize * 2.1);\r\n this._clearPuckSizeOffset = ~~(this._clearPuckSize / 2);\r\n }\r\n public get puckSize() {\r\n return this._joystickPuckSize;\r\n }\r\n\r\n /**\r\n * Clears the set position of the joystick\r\n */\r\n public clearPosition() {\r\n this.alwaysVisible = false;\r\n\r\n this._joystickPosition = null;\r\n }\r\n\r\n /**\r\n * Defines whether or not the joystick container is always visible\r\n */\r\n public set alwaysVisible(value: boolean) {\r\n if (this._alwaysVisible === value) {\r\n return;\r\n }\r\n\r\n if (value && this._joystickPosition) {\r\n VirtualJoystick._AlwaysVisibleSticks++;\r\n\r\n this._alwaysVisible = true;\r\n } else {\r\n VirtualJoystick._AlwaysVisibleSticks--;\r\n\r\n this._alwaysVisible = false;\r\n }\r\n }\r\n public get alwaysVisible() {\r\n return this._alwaysVisible;\r\n }\r\n\r\n /**\r\n * Sets the constant position of the Joystick container\r\n * @param x X axis coordinate\r\n * @param y Y axis coordinate\r\n */\r\n public setPosition(x: number, y: number) {\r\n // just in case position is moved while the container is visible\r\n if (this._joystickPointerStartPos) {\r\n this._clearPreviousDraw();\r\n }\r\n\r\n this._joystickPosition = new Vector2(x, y);\r\n }\r\n\r\n /**\r\n * Defines a callback to call when the joystick is touched\r\n * @param action defines the callback\r\n */\r\n public setActionOnTouch(action: () => any) {\r\n this._action = action;\r\n }\r\n\r\n /**\r\n * Defines which axis you'd like to control for left & right\r\n * @param axis defines the axis to use\r\n */\r\n public setAxisForLeftRight(axis: JoystickAxis) {\r\n switch (axis) {\r\n case JoystickAxis.X:\r\n case JoystickAxis.Y:\r\n case JoystickAxis.Z:\r\n this._axisTargetedByLeftAndRight = axis;\r\n break;\r\n default:\r\n this._axisTargetedByLeftAndRight = JoystickAxis.X;\r\n break;\r\n }\r\n }\r\n\r\n /**\r\n * Defines which axis you'd like to control for up & down\r\n * @param axis defines the axis to use\r\n */\r\n public setAxisForUpDown(axis: JoystickAxis) {\r\n switch (axis) {\r\n case JoystickAxis.X:\r\n case JoystickAxis.Y:\r\n case JoystickAxis.Z:\r\n this._axisTargetedByUpAndDown = axis;\r\n break;\r\n default:\r\n this._axisTargetedByUpAndDown = JoystickAxis.Y;\r\n break;\r\n }\r\n }\r\n\r\n /**\r\n * Clears the canvas from the previous puck / container draw\r\n */\r\n private _clearPreviousDraw() {\r\n const jp = this._joystickPosition || this._joystickPointerStartPos;\r\n\r\n // clear container pixels\r\n VirtualJoystick._VJCanvasContext.clearRect(\r\n jp.x - this._clearContainerSizeOffset,\r\n jp.y - this._clearContainerSizeOffset,\r\n this._clearContainerSize,\r\n this._clearContainerSize\r\n );\r\n\r\n // clear puck pixels\r\n VirtualJoystick._VJCanvasContext.clearRect(\r\n this._joystickPreviousPointerPos.x - this._clearPuckSizeOffset,\r\n this._joystickPreviousPointerPos.y - this._clearPuckSizeOffset,\r\n this._clearPuckSize,\r\n this._clearPuckSize\r\n );\r\n }\r\n\r\n /**\r\n * Loads `urlPath` to be used for the container's image\r\n * @param urlPath defines the urlPath of an image to use\r\n */\r\n public setContainerImage(urlPath: string) {\r\n const image = new Image();\r\n image.src = urlPath;\r\n\r\n image.onload = () => (this._containerImage = image);\r\n }\r\n\r\n /**\r\n * Loads `urlPath` to be used for the puck's image\r\n * @param urlPath defines the urlPath of an image to use\r\n */\r\n public setPuckImage(urlPath: string) {\r\n const image = new Image();\r\n image.src = urlPath;\r\n\r\n image.onload = () => (this._puckImage = image);\r\n }\r\n\r\n /**\r\n * Draws the Virtual Joystick's container\r\n */\r\n private _drawContainer() {\r\n const jp = this._joystickPosition || this._joystickPointerStartPos;\r\n\r\n this._clearPreviousDraw();\r\n\r\n if (this._containerImage) {\r\n VirtualJoystick._VJCanvasContext.drawImage(this._containerImage, jp.x - this.containerSize, jp.y - this.containerSize, this.containerSize * 2, this.containerSize * 2);\r\n } else {\r\n // outer container\r\n VirtualJoystick._VJCanvasContext.beginPath();\r\n VirtualJoystick._VJCanvasContext.strokeStyle = this._joystickColor;\r\n VirtualJoystick._VJCanvasContext.lineWidth = 2;\r\n VirtualJoystick._VJCanvasContext.arc(jp.x, jp.y, this.containerSize, 0, Math.PI * 2, true);\r\n VirtualJoystick._VJCanvasContext.stroke();\r\n VirtualJoystick._VJCanvasContext.closePath();\r\n\r\n // inner container\r\n VirtualJoystick._VJCanvasContext.beginPath();\r\n VirtualJoystick._VJCanvasContext.lineWidth = 6;\r\n VirtualJoystick._VJCanvasContext.strokeStyle = this._joystickColor;\r\n VirtualJoystick._VJCanvasContext.arc(jp.x, jp.y, this.puckSize, 0, Math.PI * 2, true);\r\n VirtualJoystick._VJCanvasContext.stroke();\r\n VirtualJoystick._VJCanvasContext.closePath();\r\n }\r\n }\r\n\r\n /**\r\n * Draws the Virtual Joystick's puck\r\n */\r\n private _drawPuck() {\r\n if (this._puckImage) {\r\n VirtualJoystick._VJCanvasContext.drawImage(\r\n this._puckImage,\r\n this._joystickPointerPos.x - this.puckSize,\r\n this._joystickPointerPos.y - this.puckSize,\r\n this.puckSize * 2,\r\n this.puckSize * 2\r\n );\r\n } else {\r\n VirtualJoystick._VJCanvasContext.beginPath();\r\n VirtualJoystick._VJCanvasContext.strokeStyle = this._joystickColor;\r\n VirtualJoystick._VJCanvasContext.lineWidth = 2;\r\n VirtualJoystick._VJCanvasContext.arc(this._joystickPointerPos.x, this._joystickPointerPos.y, this.puckSize, 0, Math.PI * 2, true);\r\n VirtualJoystick._VJCanvasContext.stroke();\r\n VirtualJoystick._VJCanvasContext.closePath();\r\n }\r\n }\r\n\r\n private _drawVirtualJoystick() {\r\n // canvas released? don't continue iterating\r\n if (this._released) {\r\n return;\r\n }\r\n if (this.alwaysVisible) {\r\n this._drawContainer();\r\n }\r\n\r\n if (this.pressed) {\r\n this._touches.forEach((key, touch) => {\r\n if ((<PointerEvent>touch).pointerId === this._joystickPointerId) {\r\n if (!this.alwaysVisible) {\r\n this._drawContainer();\r\n }\r\n\r\n this._drawPuck();\r\n\r\n // store current pointer for next clear\r\n this._joystickPreviousPointerPos = this._joystickPointerPos.clone();\r\n } else {\r\n VirtualJoystick._VJCanvasContext.clearRect((<any>touch).prevX - 44, (<any>touch).prevY - 44, 88, 88);\r\n VirtualJoystick._VJCanvasContext.beginPath();\r\n VirtualJoystick._VJCanvasContext.fillStyle = \"white\";\r\n VirtualJoystick._VJCanvasContext.beginPath();\r\n VirtualJoystick._VJCanvasContext.strokeStyle = \"red\";\r\n VirtualJoystick._VJCanvasContext.lineWidth = 6;\r\n VirtualJoystick._VJCanvasContext.arc(touch.x, touch.y, 40, 0, Math.PI * 2, true);\r\n VirtualJoystick._VJCanvasContext.stroke();\r\n VirtualJoystick._VJCanvasContext.closePath();\r\n (<any>touch).prevX = touch.x;\r\n (<any>touch).prevY = touch.y;\r\n }\r\n });\r\n }\r\n requestAnimationFrame(() => {\r\n this._drawVirtualJoystick();\r\n });\r\n }\r\n\r\n /**\r\n * Release internal HTML canvas\r\n */\r\n public releaseCanvas() {\r\n if (VirtualJoystick.Canvas) {\r\n VirtualJoystick.Canvas.removeEventListener(\"pointerdown\", this._onPointerDownHandlerRef);\r\n VirtualJoystick.Canvas.removeEventListener(\"pointermove\", this._onPointerMoveHandlerRef);\r\n VirtualJoystick.Canvas.removeEventListener(\"pointerup\", this._onPointerUpHandlerRef);\r\n VirtualJoystick.Canvas.removeEventListener(\"pointerout\", this._onPointerUpHandlerRef);\r\n window.removeEventListener(\"resize\", this._onResize);\r\n document.body.removeChild(VirtualJoystick.Canvas);\r\n VirtualJoystick.Canvas = null;\r\n }\r\n this._released = true;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"virtualJoystick.js","sourceRoot":"","sources":["../../../../lts/core/generated/Misc/virtualJoystick.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"../types\";\r\nimport { Vector3, Vector2 } from \"../Maths/math.vector\";\r\nimport { StringDictionary } from \"./stringDictionary\";\r\n\r\n// Mainly based on these 2 articles :\r\n// Creating an universal virtual touch joystick working for all Touch models thanks to Hand.JS : http://blogs.msdn.com/b/davrous/archive/2013/02/22/creating-an-universal-virtual-touch-joystick-working-for-all-touch-models-thanks-to-hand-js.aspx\r\n// & on Seb Lee-Delisle original work: http://seb.ly/2011/04/multi-touch-game-controller-in-javascripthtml5-for-ipad/\r\n\r\n/**\r\n * Defines the potential axis of a Joystick\r\n */\r\nexport enum JoystickAxis {\r\n /** X axis */\r\n X,\r\n /** Y axis */\r\n Y,\r\n /** Z axis */\r\n Z,\r\n}\r\n\r\n/**\r\n * Represents the different customization options available\r\n * for VirtualJoystick\r\n */\r\ninterface VirtualJoystickCustomizations {\r\n /**\r\n * Size of the joystick's puck\r\n */\r\n puckSize: number;\r\n /**\r\n * Size of the joystick's container\r\n */\r\n containerSize: number;\r\n /**\r\n * Color of the joystick && puck\r\n */\r\n color: string;\r\n /**\r\n * Image URL for the joystick's puck\r\n */\r\n puckImage?: string;\r\n /**\r\n * Image URL for the joystick's container\r\n */\r\n containerImage?: string;\r\n /**\r\n * Defines the unmoving position of the joystick container\r\n */\r\n position?: { x: number; y: number };\r\n /**\r\n * Defines whether or not the joystick container is always visible\r\n */\r\n alwaysVisible: boolean;\r\n /**\r\n * Defines whether or not to limit the movement of the puck to the joystick's container\r\n */\r\n limitToContainer: boolean;\r\n}\r\n\r\n/**\r\n * Class used to define virtual joystick (used in touch mode)\r\n */\r\nexport class VirtualJoystick {\r\n /**\r\n * Gets or sets a boolean indicating that left and right values must be inverted\r\n */\r\n public reverseLeftRight: boolean;\r\n /**\r\n * Gets or sets a boolean indicating that up and down values must be inverted\r\n */\r\n public reverseUpDown: boolean;\r\n /**\r\n * Gets the offset value for the position (ie. the change of the position value)\r\n */\r\n public deltaPosition: Vector3;\r\n /**\r\n * Gets a boolean indicating if the virtual joystick was pressed\r\n */\r\n public pressed: boolean;\r\n /**\r\n * Canvas the virtual joystick will render onto, default z-index of this is 5\r\n */\r\n public static Canvas: Nullable<HTMLCanvasElement>;\r\n\r\n /**\r\n * boolean indicating whether or not the joystick's puck's movement should be limited to the joystick's container area\r\n */\r\n public limitToContainer: boolean;\r\n\r\n // Used to draw the virtual joystick inside a 2D canvas on top of the WebGL rendering canvas\r\n private static _GlobalJoystickIndex: number = 0;\r\n private static _AlwaysVisibleSticks: number = 0;\r\n private static _VJCanvasContext: CanvasRenderingContext2D;\r\n private static _VJCanvasWidth: number;\r\n private static _VJCanvasHeight: number;\r\n private static _HalfWidth: number;\r\n private static _GetDefaultOptions(): VirtualJoystickCustomizations {\r\n return {\r\n puckSize: 40,\r\n containerSize: 60,\r\n color: \"cyan\",\r\n puckImage: undefined,\r\n containerImage: undefined,\r\n position: undefined,\r\n alwaysVisible: false,\r\n limitToContainer: false,\r\n };\r\n }\r\n\r\n private _action: () => any;\r\n private _axisTargetedByLeftAndRight: JoystickAxis;\r\n private _axisTargetedByUpAndDown: JoystickAxis;\r\n private _joystickSensibility: number;\r\n private _inversedSensibility: number;\r\n private _joystickPointerId: number;\r\n private _joystickColor: string;\r\n private _joystickPointerPos: Vector2;\r\n private _joystickPreviousPointerPos: Vector2;\r\n private _joystickPointerStartPos: Vector2;\r\n private _deltaJoystickVector: Vector2;\r\n private _leftJoystick: boolean;\r\n private _touches: StringDictionary<{ x: number; y: number; prevX: number; prevY: number } | PointerEvent>;\r\n private _joystickPosition: Nullable<Vector2>;\r\n private _alwaysVisible: boolean;\r\n private _puckImage: HTMLImageElement;\r\n private _containerImage: HTMLImageElement;\r\n private _released = false;\r\n\r\n // size properties\r\n private _joystickPuckSize: number;\r\n private _joystickContainerSize: number;\r\n private _clearPuckSize: number;\r\n private _clearContainerSize: number;\r\n private _clearPuckSizeOffset: number;\r\n private _clearContainerSizeOffset: number;\r\n\r\n private _onPointerDownHandlerRef: (e: PointerEvent) => any;\r\n private _onPointerMoveHandlerRef: (e: PointerEvent) => any;\r\n private _onPointerUpHandlerRef: (e: PointerEvent) => any;\r\n private _onResize: (e: any) => any;\r\n\r\n /**\r\n * Creates a new virtual joystick\r\n * @param leftJoystick defines that the joystick is for left hand (false by default)\r\n * @param customizations Defines the options we want to customize the VirtualJoystick\r\n */\r\n constructor(leftJoystick?: boolean, customizations?: Partial<VirtualJoystickCustomizations>) {\r\n const options = {\r\n ...VirtualJoystick._GetDefaultOptions(),\r\n ...customizations,\r\n };\r\n\r\n if (leftJoystick) {\r\n this._leftJoystick = true;\r\n } else {\r\n this._leftJoystick = false;\r\n }\r\n\r\n VirtualJoystick._GlobalJoystickIndex++;\r\n\r\n // By default left & right arrow keys are moving the X\r\n // and up & down keys are moving the Y\r\n this._axisTargetedByLeftAndRight = JoystickAxis.X;\r\n this._axisTargetedByUpAndDown = JoystickAxis.Y;\r\n\r\n this.reverseLeftRight = false;\r\n this.reverseUpDown = false;\r\n\r\n // collections of pointers\r\n this._touches = new StringDictionary<{ x: number; y: number; prevX: number; prevY: number } | PointerEvent>();\r\n this.deltaPosition = Vector3.Zero();\r\n\r\n this._joystickSensibility = 25;\r\n this._inversedSensibility = 1 / (this._joystickSensibility / 1000);\r\n\r\n this._onResize = () => {\r\n VirtualJoystick._VJCanvasWidth = window.innerWidth;\r\n VirtualJoystick._VJCanvasHeight = window.innerHeight;\r\n if (VirtualJoystick.Canvas) {\r\n VirtualJoystick.Canvas.width = VirtualJoystick._VJCanvasWidth;\r\n VirtualJoystick.Canvas.height = VirtualJoystick._VJCanvasHeight;\r\n }\r\n VirtualJoystick._HalfWidth = VirtualJoystick._VJCanvasWidth / 2;\r\n };\r\n\r\n // injecting a canvas element on top of the canvas 3D game\r\n if (!VirtualJoystick.Canvas) {\r\n window.addEventListener(\"resize\", this._onResize, false);\r\n VirtualJoystick.Canvas = document.createElement(\"canvas\");\r\n VirtualJoystick._VJCanvasWidth = window.innerWidth;\r\n VirtualJoystick._VJCanvasHeight = window.innerHeight;\r\n VirtualJoystick.Canvas.width = window.innerWidth;\r\n VirtualJoystick.Canvas.height = window.innerHeight;\r\n VirtualJoystick.Canvas.style.width = \"100%\";\r\n VirtualJoystick.Canvas.style.height = \"100%\";\r\n VirtualJoystick.Canvas.style.position = \"absolute\";\r\n VirtualJoystick.Canvas.style.backgroundColor = \"transparent\";\r\n VirtualJoystick.Canvas.style.top = \"0px\";\r\n VirtualJoystick.Canvas.style.left = \"0px\";\r\n VirtualJoystick.Canvas.style.zIndex = \"5\";\r\n VirtualJoystick.Canvas.style.touchAction = \"none\"; // fix https://forum.babylonjs.com/t/virtualjoystick-needs-to-set-style-touch-action-none-explicitly/9562\r\n // Support for jQuery PEP polyfill\r\n VirtualJoystick.Canvas.setAttribute(\"touch-action\", \"none\");\r\n const context = VirtualJoystick.Canvas.getContext(\"2d\");\r\n\r\n if (!context) {\r\n throw new Error(\"Unable to create canvas for virtual joystick\");\r\n }\r\n\r\n VirtualJoystick._VJCanvasContext = context;\r\n VirtualJoystick._VJCanvasContext.strokeStyle = \"#ffffff\";\r\n VirtualJoystick._VJCanvasContext.lineWidth = 2;\r\n document.body.appendChild(VirtualJoystick.Canvas);\r\n }\r\n VirtualJoystick._HalfWidth = VirtualJoystick.Canvas.width / 2;\r\n this.pressed = false;\r\n this.limitToContainer = options.limitToContainer;\r\n\r\n // default joystick color\r\n this._joystickColor = options.color;\r\n\r\n // default joystick size\r\n this.containerSize = options.containerSize;\r\n this.puckSize = options.puckSize;\r\n\r\n if (options.position) {\r\n this.setPosition(options.position.x, options.position.y);\r\n }\r\n if (options.puckImage) {\r\n this.setPuckImage(options.puckImage);\r\n }\r\n if (options.containerImage) {\r\n this.setContainerImage(options.containerImage);\r\n }\r\n if (options.alwaysVisible) {\r\n VirtualJoystick._AlwaysVisibleSticks++;\r\n }\r\n\r\n // must come after position potentially set\r\n this.alwaysVisible = options.alwaysVisible;\r\n\r\n this._joystickPointerId = -1;\r\n // current joystick position\r\n this._joystickPointerPos = new Vector2(0, 0);\r\n this._joystickPreviousPointerPos = new Vector2(0, 0);\r\n // origin joystick position\r\n this._joystickPointerStartPos = new Vector2(0, 0);\r\n this._deltaJoystickVector = new Vector2(0, 0);\r\n\r\n this._onPointerDownHandlerRef = (evt) => {\r\n this._onPointerDown(evt);\r\n };\r\n this._onPointerMoveHandlerRef = (evt) => {\r\n this._onPointerMove(evt);\r\n };\r\n this._onPointerUpHandlerRef = (evt) => {\r\n this._onPointerUp(evt);\r\n };\r\n\r\n VirtualJoystick.Canvas.addEventListener(\"pointerdown\", this._onPointerDownHandlerRef, false);\r\n VirtualJoystick.Canvas.addEventListener(\"pointermove\", this._onPointerMoveHandlerRef, false);\r\n VirtualJoystick.Canvas.addEventListener(\"pointerup\", this._onPointerUpHandlerRef, false);\r\n VirtualJoystick.Canvas.addEventListener(\"pointerout\", this._onPointerUpHandlerRef, false);\r\n VirtualJoystick.Canvas.addEventListener(\r\n \"contextmenu\",\r\n (evt) => {\r\n evt.preventDefault(); // Disables system menu\r\n },\r\n false\r\n );\r\n requestAnimationFrame(() => {\r\n this._drawVirtualJoystick();\r\n });\r\n }\r\n\r\n /**\r\n * Defines joystick sensibility (ie. the ratio between a physical move and virtual joystick position change)\r\n * @param newJoystickSensibility defines the new sensibility\r\n */\r\n public setJoystickSensibility(newJoystickSensibility: number) {\r\n this._joystickSensibility = newJoystickSensibility;\r\n this._inversedSensibility = 1 / (this._joystickSensibility / 1000);\r\n }\r\n\r\n private _onPointerDown(e: PointerEvent) {\r\n let positionOnScreenCondition: boolean;\r\n\r\n e.preventDefault();\r\n\r\n if (this._leftJoystick === true) {\r\n positionOnScreenCondition = e.clientX < VirtualJoystick._HalfWidth;\r\n } else {\r\n positionOnScreenCondition = e.clientX > VirtualJoystick._HalfWidth;\r\n }\r\n\r\n if (positionOnScreenCondition && this._joystickPointerId < 0) {\r\n // First contact will be dedicated to the virtual joystick\r\n this._joystickPointerId = e.pointerId;\r\n\r\n if (this._joystickPosition) {\r\n this._joystickPointerStartPos = this._joystickPosition.clone();\r\n this._joystickPointerPos = this._joystickPosition.clone();\r\n this._joystickPreviousPointerPos = this._joystickPosition.clone();\r\n\r\n // in case the user only clicks down && doesn't move:\r\n // this ensures the delta is properly set\r\n this._onPointerMove(e);\r\n } else {\r\n this._joystickPointerStartPos.x = e.clientX;\r\n this._joystickPointerStartPos.y = e.clientY;\r\n this._joystickPointerPos = this._joystickPointerStartPos.clone();\r\n this._joystickPreviousPointerPos = this._joystickPointerStartPos.clone();\r\n }\r\n\r\n this._deltaJoystickVector.x = 0;\r\n this._deltaJoystickVector.y = 0;\r\n this.pressed = true;\r\n this._touches.add(e.pointerId.toString(), e);\r\n } else {\r\n // You can only trigger the action buttons with a joystick declared\r\n if (VirtualJoystick._GlobalJoystickIndex < 2 && this._action) {\r\n this._action();\r\n this._touches.add(e.pointerId.toString(), { x: e.clientX, y: e.clientY, prevX: e.clientX, prevY: e.clientY });\r\n }\r\n }\r\n }\r\n\r\n private _onPointerMove(e: PointerEvent) {\r\n // If the current pointer is the one associated to the joystick (first touch contact)\r\n if (this._joystickPointerId == e.pointerId) {\r\n // limit to container if need be\r\n if (this.limitToContainer) {\r\n const vector = new Vector2(e.clientX - this._joystickPointerStartPos.x, e.clientY - this._joystickPointerStartPos.y);\r\n const distance = vector.length();\r\n\r\n if (distance > this.containerSize) {\r\n vector.scaleInPlace(this.containerSize / distance);\r\n }\r\n\r\n this._joystickPointerPos.x = this._joystickPointerStartPos.x + vector.x;\r\n this._joystickPointerPos.y = this._joystickPointerStartPos.y + vector.y;\r\n } else {\r\n this._joystickPointerPos.x = e.clientX;\r\n this._joystickPointerPos.y = e.clientY;\r\n }\r\n\r\n // create delta vector\r\n this._deltaJoystickVector = this._joystickPointerPos.clone();\r\n this._deltaJoystickVector = this._deltaJoystickVector.subtract(this._joystickPointerStartPos);\r\n\r\n // if a joystick is always visible, there will be clipping issues if\r\n // you drag the puck from one over the container of the other\r\n if (0 < VirtualJoystick._AlwaysVisibleSticks) {\r\n if (this._leftJoystick) {\r\n this._joystickPointerPos.x = Math.min(VirtualJoystick._HalfWidth, this._joystickPointerPos.x);\r\n } else {\r\n this._joystickPointerPos.x = Math.max(VirtualJoystick._HalfWidth, this._joystickPointerPos.x);\r\n }\r\n }\r\n\r\n const directionLeftRight = this.reverseLeftRight ? -1 : 1;\r\n const deltaJoystickX = (directionLeftRight * this._deltaJoystickVector.x) / this._inversedSensibility;\r\n switch (this._axisTargetedByLeftAndRight) {\r\n case JoystickAxis.X:\r\n this.deltaPosition.x = Math.min(1, Math.max(-1, deltaJoystickX));\r\n break;\r\n case JoystickAxis.Y:\r\n this.deltaPosition.y = Math.min(1, Math.max(-1, deltaJoystickX));\r\n break;\r\n case JoystickAxis.Z:\r\n this.deltaPosition.z = Math.min(1, Math.max(-1, deltaJoystickX));\r\n break;\r\n }\r\n const directionUpDown = this.reverseUpDown ? 1 : -1;\r\n const deltaJoystickY = (directionUpDown * this._deltaJoystickVector.y) / this._inversedSensibility;\r\n switch (this._axisTargetedByUpAndDown) {\r\n case JoystickAxis.X:\r\n this.deltaPosition.x = Math.min(1, Math.max(-1, deltaJoystickY));\r\n break;\r\n case JoystickAxis.Y:\r\n this.deltaPosition.y = Math.min(1, Math.max(-1, deltaJoystickY));\r\n break;\r\n case JoystickAxis.Z:\r\n this.deltaPosition.z = Math.min(1, Math.max(-1, deltaJoystickY));\r\n break;\r\n }\r\n } else {\r\n const data = this._touches.get(e.pointerId.toString());\r\n if (data) {\r\n (data as any).x = e.clientX;\r\n (data as any).y = e.clientY;\r\n }\r\n }\r\n }\r\n\r\n private _onPointerUp(e: PointerEvent) {\r\n if (this._joystickPointerId == e.pointerId) {\r\n this._clearPreviousDraw();\r\n\r\n this._joystickPointerId = -1;\r\n this.pressed = false;\r\n } else {\r\n const touch = <{ x: number; y: number; prevX: number; prevY: number }>this._touches.get(e.pointerId.toString());\r\n if (touch) {\r\n VirtualJoystick._VJCanvasContext.clearRect(touch.prevX - 44, touch.prevY - 44, 88, 88);\r\n }\r\n }\r\n this._deltaJoystickVector.x = 0;\r\n this._deltaJoystickVector.y = 0;\r\n\r\n this._touches.remove(e.pointerId.toString());\r\n }\r\n\r\n /**\r\n * Change the color of the virtual joystick\r\n * @param newColor a string that must be a CSS color value (like \"red\") or the hexa value (like \"#FF0000\")\r\n */\r\n public setJoystickColor(newColor: string) {\r\n this._joystickColor = newColor;\r\n }\r\n\r\n /**\r\n * Size of the joystick's container\r\n */\r\n public set containerSize(newSize: number) {\r\n this._joystickContainerSize = newSize;\r\n this._clearContainerSize = ~~(this._joystickContainerSize * 2.1);\r\n this._clearContainerSizeOffset = ~~(this._clearContainerSize / 2);\r\n }\r\n public get containerSize() {\r\n return this._joystickContainerSize;\r\n }\r\n\r\n /**\r\n * Size of the joystick's puck\r\n */\r\n public set puckSize(newSize: number) {\r\n this._joystickPuckSize = newSize;\r\n this._clearPuckSize = ~~(this._joystickPuckSize * 2.1);\r\n this._clearPuckSizeOffset = ~~(this._clearPuckSize / 2);\r\n }\r\n public get puckSize() {\r\n return this._joystickPuckSize;\r\n }\r\n\r\n /**\r\n * Clears the set position of the joystick\r\n */\r\n public clearPosition() {\r\n this.alwaysVisible = false;\r\n\r\n this._joystickPosition = null;\r\n }\r\n\r\n /**\r\n * Defines whether or not the joystick container is always visible\r\n */\r\n public set alwaysVisible(value: boolean) {\r\n if (this._alwaysVisible === value) {\r\n return;\r\n }\r\n\r\n if (value && this._joystickPosition) {\r\n VirtualJoystick._AlwaysVisibleSticks++;\r\n\r\n this._alwaysVisible = true;\r\n } else {\r\n VirtualJoystick._AlwaysVisibleSticks--;\r\n\r\n this._alwaysVisible = false;\r\n }\r\n }\r\n public get alwaysVisible() {\r\n return this._alwaysVisible;\r\n }\r\n\r\n /**\r\n * Sets the constant position of the Joystick container\r\n * @param x X axis coordinate\r\n * @param y Y axis coordinate\r\n */\r\n public setPosition(x: number, y: number) {\r\n // just in case position is moved while the container is visible\r\n if (this._joystickPointerStartPos) {\r\n this._clearPreviousDraw();\r\n }\r\n\r\n this._joystickPosition = new Vector2(x, y);\r\n }\r\n\r\n /**\r\n * Defines a callback to call when the joystick is touched\r\n * @param action defines the callback\r\n */\r\n public setActionOnTouch(action: () => any) {\r\n this._action = action;\r\n }\r\n\r\n /**\r\n * Defines which axis you'd like to control for left & right\r\n * @param axis defines the axis to use\r\n */\r\n public setAxisForLeftRight(axis: JoystickAxis) {\r\n switch (axis) {\r\n case JoystickAxis.X:\r\n case JoystickAxis.Y:\r\n case JoystickAxis.Z:\r\n this._axisTargetedByLeftAndRight = axis;\r\n break;\r\n default:\r\n this._axisTargetedByLeftAndRight = JoystickAxis.X;\r\n break;\r\n }\r\n }\r\n\r\n /**\r\n * Defines which axis you'd like to control for up & down\r\n * @param axis defines the axis to use\r\n */\r\n public setAxisForUpDown(axis: JoystickAxis) {\r\n switch (axis) {\r\n case JoystickAxis.X:\r\n case JoystickAxis.Y:\r\n case JoystickAxis.Z:\r\n this._axisTargetedByUpAndDown = axis;\r\n break;\r\n default:\r\n this._axisTargetedByUpAndDown = JoystickAxis.Y;\r\n break;\r\n }\r\n }\r\n\r\n /**\r\n * Clears the canvas from the previous puck / container draw\r\n */\r\n private _clearPreviousDraw() {\r\n const jp = this._joystickPosition || this._joystickPointerStartPos;\r\n\r\n // clear container pixels\r\n VirtualJoystick._VJCanvasContext.clearRect(\r\n jp.x - this._clearContainerSizeOffset,\r\n jp.y - this._clearContainerSizeOffset,\r\n this._clearContainerSize,\r\n this._clearContainerSize\r\n );\r\n\r\n // clear puck pixels + 1 pixel for the change made before it moved\r\n VirtualJoystick._VJCanvasContext.clearRect(\r\n this._joystickPreviousPointerPos.x - this._clearPuckSizeOffset - 1,\r\n this._joystickPreviousPointerPos.y - this._clearPuckSizeOffset - 1,\r\n this._clearPuckSize + 2,\r\n this._clearPuckSize + 2\r\n );\r\n }\r\n\r\n /**\r\n * Loads `urlPath` to be used for the container's image\r\n * @param urlPath defines the urlPath of an image to use\r\n */\r\n public setContainerImage(urlPath: string) {\r\n const image = new Image();\r\n image.src = urlPath;\r\n\r\n image.onload = () => (this._containerImage = image);\r\n }\r\n\r\n /**\r\n * Loads `urlPath` to be used for the puck's image\r\n * @param urlPath defines the urlPath of an image to use\r\n */\r\n public setPuckImage(urlPath: string) {\r\n const image = new Image();\r\n image.src = urlPath;\r\n\r\n image.onload = () => (this._puckImage = image);\r\n }\r\n\r\n /**\r\n * Draws the Virtual Joystick's container\r\n */\r\n private _drawContainer() {\r\n const jp = this._joystickPosition || this._joystickPointerStartPos;\r\n\r\n this._clearPreviousDraw();\r\n\r\n if (this._containerImage) {\r\n VirtualJoystick._VJCanvasContext.drawImage(this._containerImage, jp.x - this.containerSize, jp.y - this.containerSize, this.containerSize * 2, this.containerSize * 2);\r\n } else {\r\n // outer container\r\n VirtualJoystick._VJCanvasContext.beginPath();\r\n VirtualJoystick._VJCanvasContext.strokeStyle = this._joystickColor;\r\n VirtualJoystick._VJCanvasContext.lineWidth = 2;\r\n VirtualJoystick._VJCanvasContext.arc(jp.x, jp.y, this.containerSize, 0, Math.PI * 2, true);\r\n VirtualJoystick._VJCanvasContext.stroke();\r\n VirtualJoystick._VJCanvasContext.closePath();\r\n\r\n // inner container\r\n VirtualJoystick._VJCanvasContext.beginPath();\r\n VirtualJoystick._VJCanvasContext.lineWidth = 6;\r\n VirtualJoystick._VJCanvasContext.strokeStyle = this._joystickColor;\r\n VirtualJoystick._VJCanvasContext.arc(jp.x, jp.y, this.puckSize, 0, Math.PI * 2, true);\r\n VirtualJoystick._VJCanvasContext.stroke();\r\n VirtualJoystick._VJCanvasContext.closePath();\r\n }\r\n }\r\n\r\n /**\r\n * Draws the Virtual Joystick's puck\r\n */\r\n private _drawPuck() {\r\n if (this._puckImage) {\r\n VirtualJoystick._VJCanvasContext.drawImage(\r\n this._puckImage,\r\n this._joystickPointerPos.x - this.puckSize,\r\n this._joystickPointerPos.y - this.puckSize,\r\n this.puckSize * 2,\r\n this.puckSize * 2\r\n );\r\n } else {\r\n VirtualJoystick._VJCanvasContext.beginPath();\r\n VirtualJoystick._VJCanvasContext.strokeStyle = this._joystickColor;\r\n VirtualJoystick._VJCanvasContext.lineWidth = 2;\r\n VirtualJoystick._VJCanvasContext.arc(this._joystickPointerPos.x, this._joystickPointerPos.y, this.puckSize, 0, Math.PI * 2, true);\r\n VirtualJoystick._VJCanvasContext.stroke();\r\n VirtualJoystick._VJCanvasContext.closePath();\r\n }\r\n }\r\n\r\n private _drawVirtualJoystick() {\r\n // canvas released? don't continue iterating\r\n if (this._released) {\r\n return;\r\n }\r\n if (this.alwaysVisible) {\r\n this._drawContainer();\r\n }\r\n\r\n if (this.pressed) {\r\n this._touches.forEach((key, touch) => {\r\n if ((<PointerEvent>touch).pointerId === this._joystickPointerId) {\r\n if (!this.alwaysVisible) {\r\n this._drawContainer();\r\n }\r\n\r\n this._drawPuck();\r\n\r\n // store current pointer for next clear\r\n this._joystickPreviousPointerPos = this._joystickPointerPos.clone();\r\n } else {\r\n VirtualJoystick._VJCanvasContext.clearRect((<any>touch).prevX - 44, (<any>touch).prevY - 44, 88, 88);\r\n VirtualJoystick._VJCanvasContext.beginPath();\r\n VirtualJoystick._VJCanvasContext.fillStyle = \"white\";\r\n VirtualJoystick._VJCanvasContext.beginPath();\r\n VirtualJoystick._VJCanvasContext.strokeStyle = \"red\";\r\n VirtualJoystick._VJCanvasContext.lineWidth = 6;\r\n VirtualJoystick._VJCanvasContext.arc(touch.x, touch.y, 40, 0, Math.PI * 2, true);\r\n VirtualJoystick._VJCanvasContext.stroke();\r\n VirtualJoystick._VJCanvasContext.closePath();\r\n (<any>touch).prevX = touch.x;\r\n (<any>touch).prevY = touch.y;\r\n }\r\n });\r\n }\r\n requestAnimationFrame(() => {\r\n this._drawVirtualJoystick();\r\n });\r\n }\r\n\r\n /**\r\n * Release internal HTML canvas\r\n */\r\n public releaseCanvas() {\r\n if (VirtualJoystick.Canvas) {\r\n VirtualJoystick.Canvas.removeEventListener(\"pointerdown\", this._onPointerDownHandlerRef);\r\n VirtualJoystick.Canvas.removeEventListener(\"pointermove\", this._onPointerMoveHandlerRef);\r\n VirtualJoystick.Canvas.removeEventListener(\"pointerup\", this._onPointerUpHandlerRef);\r\n VirtualJoystick.Canvas.removeEventListener(\"pointerout\", this._onPointerUpHandlerRef);\r\n window.removeEventListener(\"resize\", this._onResize);\r\n document.body.removeChild(VirtualJoystick.Canvas);\r\n VirtualJoystick.Canvas = null;\r\n }\r\n this._released = true;\r\n }\r\n}\r\n"]}
@@ -71,7 +71,7 @@ export class MorphTargetManager {
71
71
  }
72
72
  this._scene = scene;
73
73
  if (this._scene) {
74
- this._scene.morphTargetManagers.push(this);
74
+ this._scene.addMorphTargetManager(this);
75
75
  this._uniqueId = this._scene.getUniqueId();
76
76
  const engineCaps = this._scene.getEngine().getCaps();
77
77
  this._canUseTextureForTargets =
@@ -184,6 +184,9 @@ export class MorphTargetManager {
184
184
  target._onDataLayoutChanged.remove(this._targetDataLayoutChangedObservers.splice(index, 1)[0]);
185
185
  this._syncActiveTargets(true);
186
186
  }
187
+ if (this._scene) {
188
+ this._scene.stopAnimation(target);
189
+ }
187
190
  }
188
191
  /**
189
192
  * @internal
@@ -377,6 +380,9 @@ export class MorphTargetManager {
377
380
  }
378
381
  this._parentContainer = null;
379
382
  }
383
+ for (const morph of this._targets) {
384
+ this._scene.stopAnimation(morph);
385
+ }
380
386
  }
381
387
  }
382
388
  // Statics