@babylonjs/core 5.0.0-alpha.61 → 5.0.0-alpha.62

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 (103) hide show
  1. package/Audio/sound.js +1 -1
  2. package/Audio/sound.js.map +1 -1
  3. package/Behaviors/Cameras/autoRotationBehavior.d.ts +5 -0
  4. package/Behaviors/Cameras/autoRotationBehavior.js +7 -0
  5. package/Behaviors/Cameras/autoRotationBehavior.js.map +1 -1
  6. package/Cameras/camera.js +1 -1
  7. package/Cameras/camera.js.map +1 -1
  8. package/DeviceInput/Implementations/webDeviceInputSystem.js +9 -9
  9. package/DeviceInput/Implementations/webDeviceInputSystem.js.map +1 -1
  10. package/Engines/Extensions/engine.dynamicTexture.d.ts +2 -1
  11. package/Engines/Extensions/engine.dynamicTexture.js +2 -1
  12. package/Engines/Extensions/engine.dynamicTexture.js.map +1 -1
  13. package/Engines/WebGPU/Extensions/engine.dynamicTexture.js +3 -11
  14. package/Engines/WebGPU/Extensions/engine.dynamicTexture.js.map +1 -1
  15. package/Engines/WebGPU/Extensions/engine.multiRender.js +0 -4
  16. package/Engines/WebGPU/Extensions/engine.multiRender.js.map +1 -1
  17. package/Engines/WebGPU/Extensions/engine.renderTarget.js +0 -4
  18. package/Engines/WebGPU/Extensions/engine.renderTarget.js.map +1 -1
  19. package/Engines/WebGPU/webgpuCacheRenderPipeline.js +42 -61
  20. package/Engines/WebGPU/webgpuCacheRenderPipeline.js.map +1 -1
  21. package/Engines/WebGPU/webgpuCacheSampler.js +6 -4
  22. package/Engines/WebGPU/webgpuCacheSampler.js.map +1 -1
  23. package/Engines/WebGPU/webgpuConstants.d.ts +57 -13
  24. package/Engines/WebGPU/webgpuConstants.js +62 -13
  25. package/Engines/WebGPU/webgpuConstants.js.map +1 -1
  26. package/Engines/WebGPU/webgpuHardwareTexture.d.ts +22 -3
  27. package/Engines/WebGPU/webgpuHardwareTexture.js +2 -1
  28. package/Engines/WebGPU/webgpuHardwareTexture.js.map +1 -1
  29. package/Engines/WebGPU/webgpuTextureHelper.d.ts +2 -2
  30. package/Engines/WebGPU/webgpuTextureHelper.js +233 -63
  31. package/Engines/WebGPU/webgpuTextureHelper.js.map +1 -1
  32. package/Engines/engine.d.ts +82 -39
  33. package/Engines/engine.js +10 -1
  34. package/Engines/engine.js.map +1 -1
  35. package/Engines/nativeEngine.js +30 -10
  36. package/Engines/nativeEngine.js.map +1 -1
  37. package/Engines/thinEngine.js +2 -2
  38. package/Engines/thinEngine.js.map +1 -1
  39. package/Engines/webgpuEngine.js +2 -4
  40. package/Engines/webgpuEngine.js.map +1 -1
  41. package/Lights/pointLight.js +1 -1
  42. package/Lights/pointLight.js.map +1 -1
  43. package/Lights/spotLight.js +1 -1
  44. package/Lights/spotLight.js.map +1 -1
  45. package/Materials/Node/Blocks/Fragment/index.d.ts +1 -0
  46. package/Materials/Node/Blocks/Fragment/index.js +1 -0
  47. package/Materials/Node/Blocks/Fragment/index.js.map +1 -1
  48. package/Materials/Node/Blocks/Fragment/screenSpaceBlock.js +1 -3
  49. package/Materials/Node/Blocks/Fragment/screenSpaceBlock.js.map +1 -1
  50. package/Materials/Node/Blocks/Fragment/twirlBlock.d.ts +49 -0
  51. package/Materials/Node/Blocks/Fragment/twirlBlock.js +145 -0
  52. package/Materials/Node/Blocks/Fragment/twirlBlock.js.map +1 -0
  53. package/Materials/Node/Blocks/customBlock.d.ts +31 -0
  54. package/Materials/Node/Blocks/customBlock.js +144 -0
  55. package/Materials/Node/Blocks/customBlock.js.map +1 -0
  56. package/Materials/Node/Blocks/index.d.ts +1 -0
  57. package/Materials/Node/Blocks/index.js +1 -0
  58. package/Materials/Node/Blocks/index.js.map +1 -1
  59. package/Materials/PBR/pbrBaseMaterial.js +1 -1
  60. package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
  61. package/Materials/Textures/dynamicTexture.d.ts +2 -1
  62. package/Materials/Textures/dynamicTexture.js +4 -2
  63. package/Materials/Textures/dynamicTexture.js.map +1 -1
  64. package/Materials/Textures/thinRenderTargetTexture.js +1 -1
  65. package/Materials/Textures/thinRenderTargetTexture.js.map +1 -1
  66. package/Materials/Textures/thinTexture.d.ts +1 -2
  67. package/Materials/Textures/thinTexture.js +2 -4
  68. package/Materials/Textures/thinTexture.js.map +1 -1
  69. package/Materials/shaderMaterial.js +12 -0
  70. package/Materials/shaderMaterial.js.map +1 -1
  71. package/Maths/math.vector.d.ts +12 -8
  72. package/Maths/math.vector.js +22 -14
  73. package/Maths/math.vector.js.map +1 -1
  74. package/Meshes/abstractMesh.js +23 -22
  75. package/Meshes/abstractMesh.js.map +1 -1
  76. package/Meshes/geometry.js +2 -2
  77. package/Meshes/geometry.js.map +1 -1
  78. package/Meshes/mesh.d.ts +12 -0
  79. package/Meshes/mesh.js +182 -113
  80. package/Meshes/mesh.js.map +1 -1
  81. package/Meshes/mesh.vertexData.d.ts +6 -1
  82. package/Meshes/mesh.vertexData.js +295 -114
  83. package/Meshes/mesh.vertexData.js.map +1 -1
  84. package/Misc/PerformanceViewer/performanceViewerCollectionStrategies.d.ts +1 -0
  85. package/Misc/PerformanceViewer/performanceViewerCollectionStrategies.js +13 -8
  86. package/Misc/PerformanceViewer/performanceViewerCollectionStrategies.js.map +1 -1
  87. package/Misc/PerformanceViewer/performanceViewerCollector.js +1 -1
  88. package/Misc/PerformanceViewer/performanceViewerCollector.js.map +1 -1
  89. package/Misc/coroutine.d.ts +45 -0
  90. package/Misc/coroutine.js +123 -0
  91. package/Misc/coroutine.js.map +1 -0
  92. package/Misc/index.d.ts +1 -0
  93. package/Misc/index.js +1 -0
  94. package/Misc/index.js.map +1 -1
  95. package/Misc/observableCoroutine.d.ts +9 -10
  96. package/Misc/observableCoroutine.js +31 -39
  97. package/Misc/observableCoroutine.js.map +1 -1
  98. package/Particles/subEmitter.js +1 -0
  99. package/Particles/subEmitter.js.map +1 -1
  100. package/XR/features/WebXRControllerPointerSelection.d.ts +14 -0
  101. package/XR/features/WebXRControllerPointerSelection.js +38 -10
  102. package/XR/features/WebXRControllerPointerSelection.js.map +1 -1
  103. package/package.json +10 -1
@@ -1 +1 @@
1
- {"version":3,"file":"webDeviceInputSystem.js","sourceRoot":"","sources":["../../../../sourceES6/core/DeviceInput/Implementations/webDeviceInputSystem.ts"],"names":[],"mappings":"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","sourcesContent":["import { Engine } from \"../../Engines/engine\";\r\nimport { IEvent } from \"../../Events/deviceInputEvents\";\r\nimport { Observable, Observer } from \"../../Misc/observable\";\r\nimport { Tools } from \"../../Misc/tools\";\r\nimport { Nullable } from \"../../types\";\r\nimport { DeviceEventFactory } from \"../Helpers/eventFactory\";\r\nimport { DeviceType, PointerInput } from \"../InputDevices/deviceEnums\";\r\nimport { IDeviceEvent, IDeviceInputSystem } from \"../Interfaces/inputInterfaces\";\r\n\r\n/** @hidden */\r\nexport class WebDeviceInputSystem implements IDeviceInputSystem {\r\n /**\r\n * Observable for devices being connected\r\n */\r\n public readonly onDeviceConnectedObservable: Observable<{ deviceType: DeviceType; deviceSlot: number; }>;\r\n /**\r\n * Observable for devices being disconnected\r\n */\r\n public readonly onDeviceDisconnectedObservable: Observable<{ deviceType: DeviceType; deviceSlot: number; }>;\r\n /**\r\n * Observable for changes to device input\r\n */\r\n public readonly onInputChangedObservable: Observable<IDeviceEvent>;\r\n\r\n // Private Members\r\n private _inputs: Array<{ [deviceSlot: number]: Array<number> }> = [];\r\n private _gamepads: Array<DeviceType>;\r\n private _keyboardActive: boolean = false;\r\n private _pointerActive: boolean = false;\r\n private _elementToAttachTo: HTMLElement;\r\n private _engine: Engine;\r\n private _usingSafari: boolean = Tools.IsSafari();\r\n\r\n private _keyboardDownEvent = (evt: any) => { };\r\n private _keyboardUpEvent = (evt: any) => { };\r\n private _keyboardBlurEvent = (evt: any) => { };\r\n\r\n private _pointerMoveEvent = (evt: any) => { };\r\n private _pointerDownEvent = (evt: any) => { };\r\n private _pointerUpEvent = (evt: any) => { };\r\n private _pointerWheelEvent = (evt: any) => { };\r\n private _pointerBlurEvent = (evt: any) => { };\r\n private _wheelEventName: string;\r\n\r\n private _mouseId = -1;\r\n private _isUsingFirefox = navigator && navigator.userAgent && navigator.userAgent.indexOf(\"Firefox\") !== -1;\r\n\r\n // Array to store active Pointer ID values; prevents issues with negative pointerIds\r\n private _activeTouchIds: Array<number> = [];\r\n private _rollingTouchId: number = 0; // Rolling ID number to assign; emulates Chrome assignment\r\n\r\n private _pointerInputClearObserver: Nullable<Observer<Engine>> = null;\r\n\r\n private _gamepadConnectedEvent = (evt: any) => { };\r\n private _gamepadDisconnectedEvent = (evt: any) => { };\r\n\r\n /** Max number of keycodes */\r\n public static MAX_KEYCODES: number = 255;\r\n /** Max number of pointer inputs */\r\n public static MAX_POINTER_INPUTS: number = Object.keys(PointerInput).length / 2;\r\n\r\n private _eventPrefix: string;\r\n\r\n constructor(engine: Engine) {\r\n this._eventPrefix = Tools.GetPointerPrefix(engine);\r\n this._engine = engine;\r\n\r\n this.onDeviceConnectedObservable = new Observable((observer) => {\r\n // Iterate through each active device and rerun new callback\r\n for (let deviceType = 0; deviceType < this._inputs.length; deviceType++) {\r\n const inputs = this._inputs[deviceType];\r\n if (inputs) {\r\n for (const deviceSlotKey in inputs) {\r\n const deviceSlot = +deviceSlotKey;\r\n if (this._inputs[deviceType][deviceSlot]) {\r\n this.onDeviceConnectedObservable.notifyObserver(observer, { deviceType, deviceSlot });\r\n }\r\n }\r\n }\r\n }\r\n });\r\n\r\n this.onDeviceDisconnectedObservable = new Observable();\r\n this.onInputChangedObservable = new Observable();\r\n\r\n this.configureEvents();\r\n }\r\n\r\n /**\r\n * Configures events to work with an engine's active element\r\n */\r\n public configureEvents() {\r\n const inputElement = this._engine.getInputElement();\r\n if (inputElement && this._elementToAttachTo !== inputElement) {\r\n // If the engine's input element has changed, unregister events from previous element\r\n if (this._elementToAttachTo) {\r\n this._removeEvents();\r\n }\r\n\r\n this._elementToAttachTo = inputElement;\r\n // Set tab index for the inputElement to the engine's canvasTabIndex, if and only if the element's tab index is -1\r\n this._elementToAttachTo.tabIndex = (this._elementToAttachTo.tabIndex !== -1) ? this._elementToAttachTo.tabIndex : this._engine.canvasTabIndex;\r\n this._handleKeyActions();\r\n this._handlePointerActions();\r\n this._handleGamepadActions();\r\n\r\n // Check for devices that are already connected but aren't registered. Currently, only checks for gamepads and mouse\r\n this._checkForConnectedDevices();\r\n }\r\n }\r\n\r\n // Public functions\r\n /**\r\n * Checks for current device input value, given an id and input index. Throws exception if requested device not initialized.\r\n * @param deviceType Enum specifiying device type\r\n * @param deviceSlot \"Slot\" or index that device is referenced in\r\n * @param inputIndex Id of input to be checked\r\n * @returns Current value of input\r\n */\r\n public pollInput(deviceType: DeviceType, deviceSlot: number, inputIndex: number): number {\r\n const device = this._inputs[deviceType][deviceSlot];\r\n\r\n if (!device) {\r\n throw `Unable to find device ${DeviceType[deviceType]}`;\r\n }\r\n\r\n if (deviceType >= DeviceType.Xbox && deviceType <= DeviceType.Switch && navigator.getGamepads) {\r\n this._updateDevice(deviceType, deviceSlot, inputIndex);\r\n }\r\n\r\n const currentValue = device[inputIndex];\r\n if (currentValue === undefined) {\r\n throw `Unable to find input ${inputIndex} for device ${DeviceType[deviceType]} in slot ${deviceSlot}`;\r\n }\r\n\r\n return currentValue;\r\n }\r\n\r\n /**\r\n * Check for a specific device in the DeviceInputSystem\r\n * @param deviceType Type of device to check for\r\n * @returns bool with status of device's existence\r\n */\r\n public isDeviceAvailable(deviceType: DeviceType) {\r\n return (this._inputs[deviceType] !== undefined);\r\n }\r\n\r\n /**\r\n * Dispose of all the eventlisteners\r\n */\r\n public dispose(): void {\r\n // Observables\r\n this.onDeviceConnectedObservable.clear();\r\n this.onDeviceDisconnectedObservable.clear();\r\n this.onInputChangedObservable.clear();\r\n\r\n if (this._elementToAttachTo) {\r\n this._removeEvents();\r\n\r\n // Gamepad Events\r\n window.removeEventListener(\"gamepadconnected\", this._gamepadConnectedEvent);\r\n window.removeEventListener(\"gamepaddisconnected\", this._gamepadDisconnectedEvent);\r\n }\r\n }\r\n\r\n /**\r\n * Checks for existing connections to devices and register them, if necessary\r\n * Currently handles gamepads and mouse\r\n */\r\n private _checkForConnectedDevices() {\r\n if (navigator.getGamepads) {\r\n const gamepads = navigator.getGamepads();\r\n\r\n for (const gamepad of gamepads) {\r\n if (gamepad) {\r\n this._addGamePad(gamepad);\r\n }\r\n }\r\n }\r\n\r\n // If the device in use has mouse capabilities, pre-register mouse\r\n if (matchMedia('(pointer:fine)').matches) {\r\n // This will provide a dummy value for the cursor position and is expected to be overriden when the first mouse event happens.\r\n // There isn't any good way to get the current position outside of a pointer event so that's why this was done.\r\n this._addPointerDevice(DeviceType.Mouse, 0, 0, 0);\r\n }\r\n }\r\n\r\n // Private functions\r\n /**\r\n * Add a gamepad to the DeviceInputSystem\r\n * @param gamepad A single DOM Gamepad object\r\n */\r\n private _addGamePad(gamepad: any) {\r\n const deviceType = this._getGamepadDeviceType(gamepad.id);\r\n const deviceSlot = gamepad.index;\r\n\r\n this._registerDevice(deviceType, deviceSlot, gamepad.buttons.length + gamepad.axes.length);\r\n this._gamepads = this._gamepads || new Array<DeviceType>(gamepad.index + 1);\r\n this._gamepads[deviceSlot] = deviceType;\r\n }\r\n\r\n /**\r\n * Add pointer device to DeviceInputSystem\r\n * @param deviceType Type of Pointer to add\r\n * @param deviceSlot Pointer ID (0 for mouse, pointerId for Touch)\r\n * @param currentX Current X at point of adding\r\n * @param currentY Current Y at point of adding\r\n */\r\n private _addPointerDevice(deviceType: DeviceType, deviceSlot: number, currentX: number, currentY: number) {\r\n this._pointerActive = true;\r\n this._registerDevice(deviceType, deviceSlot, WebDeviceInputSystem.MAX_POINTER_INPUTS);\r\n const pointer = this._inputs[deviceType][deviceSlot]; /* initialize our pointer position immediately after registration */\r\n pointer[0] = currentX;\r\n pointer[1] = currentY;\r\n }\r\n\r\n /**\r\n * Add device and inputs to device array\r\n * @param deviceType Enum specifiying device type\r\n * @param deviceSlot \"Slot\" or index that device is referenced in\r\n * @param numberOfInputs Number of input entries to create for given device\r\n */\r\n private _registerDevice(deviceType: DeviceType, deviceSlot: number, numberOfInputs: number) {\r\n if (deviceSlot === undefined) {\r\n throw `Unable to register device ${DeviceType[deviceType]} to undefined slot.`;\r\n }\r\n\r\n if (!this._inputs[deviceType]) {\r\n this._inputs[deviceType] = {};\r\n }\r\n\r\n if (!this._inputs[deviceType][deviceSlot]) {\r\n const device = new Array<number>(numberOfInputs);\r\n\r\n for (let i = 0; i < numberOfInputs; i++) {\r\n device[i] = 0; /* set device input as unpressed */\r\n }\r\n\r\n this._inputs[deviceType][deviceSlot] = device;\r\n this.onDeviceConnectedObservable.notifyObservers({ deviceType, deviceSlot });\r\n }\r\n }\r\n\r\n /**\r\n * Given a specific device name, remove that device from the device map\r\n * @param deviceType Enum specifiying device type\r\n * @param deviceSlot \"Slot\" or index that device is referenced in\r\n */\r\n private _unregisterDevice(deviceType: DeviceType, deviceSlot: number) {\r\n if (this._inputs[deviceType][deviceSlot]) {\r\n delete this._inputs[deviceType][deviceSlot];\r\n this.onDeviceDisconnectedObservable.notifyObservers({ deviceType, deviceSlot });\r\n }\r\n }\r\n\r\n /**\r\n * Handle all actions that come from keyboard interaction\r\n */\r\n private _handleKeyActions() {\r\n this._keyboardDownEvent = ((evt) => {\r\n if (!this._keyboardActive) {\r\n this._keyboardActive = true;\r\n this._registerDevice(DeviceType.Keyboard, 0, WebDeviceInputSystem.MAX_KEYCODES);\r\n }\r\n\r\n const kbKey = this._inputs[DeviceType.Keyboard][0];\r\n if (kbKey) {\r\n kbKey[evt.keyCode] = 1;\r\n\r\n let deviceEvent = evt as IDeviceEvent;\r\n deviceEvent.deviceType = DeviceType.Keyboard;\r\n deviceEvent.deviceSlot = 0;\r\n deviceEvent.inputIndex = evt.keyCode;\r\n deviceEvent.previousState = 0;\r\n deviceEvent.currentState = kbKey[evt.keyCode];\r\n\r\n this.onInputChangedObservable.notifyObservers(deviceEvent);\r\n }\r\n });\r\n\r\n this._keyboardUpEvent = ((evt) => {\r\n if (!this._keyboardActive) {\r\n this._keyboardActive = true;\r\n this._registerDevice(DeviceType.Keyboard, 0, WebDeviceInputSystem.MAX_KEYCODES);\r\n }\r\n\r\n const kbKey = this._inputs[DeviceType.Keyboard][0];\r\n if (kbKey) {\r\n kbKey[evt.keyCode] = 0;\r\n\r\n let deviceEvent = evt as IDeviceEvent;\r\n deviceEvent.deviceType = DeviceType.Keyboard;\r\n deviceEvent.deviceSlot = 0;\r\n deviceEvent.inputIndex = evt.keyCode;\r\n deviceEvent.previousState = 1;\r\n deviceEvent.currentState = kbKey[evt.keyCode];\r\n\r\n this.onInputChangedObservable.notifyObservers(deviceEvent);\r\n }\r\n });\r\n\r\n this._keyboardBlurEvent = ((evt) => {\r\n if (this._keyboardActive) {\r\n const kbKey = this._inputs[DeviceType.Keyboard][0];\r\n\r\n for (let i = 0; i < kbKey.length; i++) {\r\n if (kbKey[i] !== 0) {\r\n kbKey[i] = 0;\r\n\r\n const evt: IEvent = DeviceEventFactory.CreateDeviceEvent(DeviceType.Keyboard, 0, i, 1, this, this._elementToAttachTo);\r\n const deviceEvent = evt as IDeviceEvent;\r\n deviceEvent.deviceType = DeviceType.Keyboard;\r\n deviceEvent.deviceSlot = 0;\r\n deviceEvent.inputIndex = i;\r\n deviceEvent.currentState = 0;\r\n deviceEvent.previousState = 1;\r\n this.onInputChangedObservable.notifyObservers(deviceEvent);\r\n }\r\n }\r\n }\r\n });\r\n\r\n this._elementToAttachTo.addEventListener(\"keydown\", this._keyboardDownEvent);\r\n this._elementToAttachTo.addEventListener(\"keyup\", this._keyboardUpEvent);\r\n this._elementToAttachTo.addEventListener(\"blur\", this._keyboardBlurEvent);\r\n }\r\n\r\n /**\r\n * Handle all actions that come from pointer interaction\r\n */\r\n private _handlePointerActions() {\r\n this._pointerMoveEvent = ((evt) => {\r\n const deviceType = this._getPointerType(evt);\r\n const deviceSlot = (deviceType === DeviceType.Mouse) ? 0 : this._activeTouchIds.indexOf(evt.pointerId);\r\n\r\n if (!this._inputs[deviceType]) {\r\n this._inputs[deviceType] = {};\r\n }\r\n\r\n if (!this._inputs[deviceType][deviceSlot]) {\r\n this._addPointerDevice(deviceType, deviceSlot, evt.clientX, evt.clientY);\r\n }\r\n\r\n const pointer = this._inputs[deviceType][deviceSlot];\r\n if (pointer) {\r\n // Store previous values for event\r\n const previousHorizontal = pointer[PointerInput.Horizontal];\r\n const previousVertical = pointer[PointerInput.Vertical];\r\n const previousDeltaHorizontal = pointer[PointerInput.DeltaHorizontal];\r\n const previousDeltaVertical = pointer[PointerInput.DeltaVertical];\r\n\r\n pointer[PointerInput.Horizontal] = evt.clientX;\r\n pointer[PointerInput.Vertical] = evt.clientY;\r\n pointer[PointerInput.DeltaHorizontal] = evt.movementX;\r\n pointer[PointerInput.DeltaVertical] = evt.movementY;\r\n\r\n let deviceEvent = evt as IDeviceEvent;\r\n deviceEvent.deviceType = deviceType;\r\n deviceEvent.deviceSlot = deviceSlot;\r\n\r\n // The browser might use a move event in case\r\n // of simultaneous mouse buttons click for instance. So\r\n // in this case we stil need to propagate it.\r\n if (previousHorizontal !== evt.clientX) {\r\n deviceEvent.inputIndex = PointerInput.Horizontal;\r\n deviceEvent.previousState = previousHorizontal;\r\n deviceEvent.currentState = pointer[PointerInput.Horizontal];\r\n\r\n this.onInputChangedObservable.notifyObservers(deviceEvent);\r\n }\r\n if (previousVertical !== evt.clientY) {\r\n deviceEvent.inputIndex = PointerInput.Vertical;\r\n deviceEvent.previousState = previousVertical;\r\n deviceEvent.currentState = pointer[PointerInput.Vertical];\r\n\r\n this.onInputChangedObservable.notifyObservers(deviceEvent);\r\n }\r\n if (pointer[PointerInput.DeltaHorizontal] !== 0) {\r\n deviceEvent.inputIndex = PointerInput.DeltaHorizontal;\r\n deviceEvent.previousState = previousDeltaHorizontal;\r\n deviceEvent.currentState = pointer[PointerInput.DeltaHorizontal];\r\n\r\n this.onInputChangedObservable.notifyObservers(deviceEvent);\r\n }\r\n if (pointer[PointerInput.DeltaVertical] !== 0) {\r\n deviceEvent.inputIndex = PointerInput.DeltaVertical;\r\n deviceEvent.previousState = previousDeltaVertical;\r\n deviceEvent.currentState = pointer[PointerInput.DeltaVertical];\r\n\r\n this.onInputChangedObservable.notifyObservers(deviceEvent);\r\n }\r\n // Lets Propagate the event for move with same position.\r\n if (!this._usingSafari && evt.button !== -1) {\r\n deviceEvent.inputIndex = evt.button + 2;\r\n deviceEvent.previousState = pointer[evt.button + 2];\r\n pointer[evt.button + 2] = (pointer[evt.button + 2] ? 0 : 1); // Reverse state of button if evt.button has value\r\n deviceEvent.currentState = pointer[evt.button + 2];\r\n this.onInputChangedObservable.notifyObservers(deviceEvent);\r\n }\r\n }\r\n });\r\n\r\n this._pointerDownEvent = ((evt) => {\r\n const deviceType = this._getPointerType(evt);\r\n let deviceSlot = (deviceType === DeviceType.Mouse) ? 0 : evt.pointerId;\r\n\r\n if (deviceType === DeviceType.Touch) {\r\n deviceSlot = this._rollingTouchId++;\r\n this._activeTouchIds[deviceSlot] = evt.pointerId;\r\n }\r\n\r\n if (!this._inputs[deviceType]) {\r\n this._inputs[deviceType] = {};\r\n }\r\n\r\n if (!this._inputs[deviceType][deviceSlot]) {\r\n this._addPointerDevice(deviceType, deviceSlot, evt.clientX, evt.clientY);\r\n }\r\n\r\n const pointer = this._inputs[deviceType][deviceSlot];\r\n if (pointer) {\r\n const previousHorizontal = pointer[PointerInput.Horizontal];\r\n const previousVertical = pointer[PointerInput.Vertical];\r\n const previousButton = pointer[evt.button + 2];\r\n\r\n if (deviceType === DeviceType.Mouse) { // Mouse; Among supported browsers, value is either 1 or 0 for mouse\r\n if (this._mouseId === -1) {\r\n if (evt.pointerId === undefined) { // If there is no pointerId (eg. manually dispatched MouseEvent)\r\n this._mouseId = this._isUsingFirefox ? 0 : 1;\r\n }\r\n else {\r\n this._mouseId = evt.pointerId;\r\n }\r\n }\r\n\r\n if (!document.pointerLockElement) {\r\n try {\r\n this._elementToAttachTo.setPointerCapture(this._mouseId);\r\n }\r\n catch (e) {\r\n // DO NOTHING\r\n }\r\n }\r\n }\r\n else { // Touch; Since touches are dynamically assigned, only set capture if we have an id\r\n if (evt.pointerId && !document.pointerLockElement) {\r\n try {\r\n this._elementToAttachTo.setPointerCapture(evt.pointerId);\r\n }\r\n catch (e) {\r\n // DO NOTHING\r\n }\r\n }\r\n }\r\n\r\n pointer[PointerInput.Horizontal] = evt.clientX;\r\n pointer[PointerInput.Vertical] = evt.clientY;\r\n pointer[evt.button + 2] = 1;\r\n\r\n let deviceEvent = evt as IDeviceEvent;\r\n deviceEvent.deviceType = deviceType;\r\n deviceEvent.deviceSlot = deviceSlot;\r\n\r\n if (previousHorizontal !== evt.clientX) {\r\n deviceEvent.inputIndex = PointerInput.Horizontal;\r\n deviceEvent.previousState = previousHorizontal;\r\n deviceEvent.currentState = pointer[PointerInput.Horizontal];\r\n\r\n this.onInputChangedObservable.notifyObservers(deviceEvent);\r\n }\r\n if (previousVertical !== evt.clientY) {\r\n deviceEvent.inputIndex = PointerInput.Vertical;\r\n deviceEvent.previousState = previousVertical;\r\n deviceEvent.currentState = pointer[PointerInput.Vertical];\r\n\r\n this.onInputChangedObservable.notifyObservers(deviceEvent);\r\n }\r\n\r\n deviceEvent.inputIndex = evt.button + 2;\r\n deviceEvent.previousState = previousButton;\r\n deviceEvent.currentState = pointer[evt.button + 2];\r\n this.onInputChangedObservable.notifyObservers(deviceEvent);\r\n }\r\n });\r\n\r\n this._pointerUpEvent = ((evt) => {\r\n const deviceType = this._getPointerType(evt);\r\n const deviceSlot = (deviceType === DeviceType.Mouse) ? 0 : this._activeTouchIds.indexOf(evt.pointerId);\r\n\r\n const pointer = this._inputs[deviceType]?.[deviceSlot];\r\n if (pointer && pointer[evt.button + 2] !== 0) {\r\n const previousHorizontal = pointer[PointerInput.Horizontal];\r\n const previousVertical = pointer[PointerInput.Vertical];\r\n const previousButton = pointer[evt.button + 2];\r\n\r\n pointer[PointerInput.Horizontal] = evt.clientX;\r\n pointer[PointerInput.Vertical] = evt.clientY;\r\n pointer[evt.button + 2] = 0;\r\n\r\n let deviceEvent = evt as IDeviceEvent;\r\n deviceEvent.deviceType = deviceType;\r\n deviceEvent.deviceSlot = deviceSlot;\r\n\r\n if (previousHorizontal !== evt.clientX) {\r\n deviceEvent.inputIndex = PointerInput.Horizontal;\r\n deviceEvent.previousState = previousHorizontal;\r\n deviceEvent.currentState = pointer[PointerInput.Horizontal];\r\n\r\n this.onInputChangedObservable.notifyObservers(deviceEvent);\r\n }\r\n if (previousVertical !== evt.clientY) {\r\n deviceEvent.inputIndex = PointerInput.Vertical;\r\n deviceEvent.previousState = previousVertical;\r\n deviceEvent.currentState = pointer[PointerInput.Vertical];\r\n\r\n this.onInputChangedObservable.notifyObservers(deviceEvent);\r\n }\r\n\r\n deviceEvent.inputIndex = evt.button + 2;\r\n deviceEvent.previousState = previousButton;\r\n deviceEvent.currentState = pointer[evt.button + 2];\r\n\r\n if (deviceType === DeviceType.Mouse && this._mouseId >= 0 && this._elementToAttachTo.hasPointerCapture(this._mouseId)) {\r\n this._elementToAttachTo.releasePointerCapture(this._mouseId);\r\n }\r\n else if (evt.pointerId && this._elementToAttachTo.hasPointerCapture(evt.pointerId)) {\r\n this._elementToAttachTo.releasePointerCapture(evt.pointerId);\r\n }\r\n\r\n this.onInputChangedObservable.notifyObservers(deviceEvent);\r\n\r\n // We don't want to unregister the mouse because we may miss input data when a mouse is moving after a click\r\n if (deviceType !== DeviceType.Mouse) {\r\n let idToRemove = this._activeTouchIds.indexOf(evt.pointerId);\r\n delete this._activeTouchIds[idToRemove];\r\n this._unregisterDevice(deviceType, deviceSlot);\r\n }\r\n }\r\n });\r\n\r\n // Set Wheel Event Name, code originally from scene.inputManager\r\n this._wheelEventName = \"onwheel\" in document.createElement(\"div\") ? \"wheel\" : // Modern browsers support \"wheel\"\r\n (<any>document).onmousewheel !== undefined ? \"mousewheel\" : // Webkit and IE support at least \"mousewheel\"\r\n \"DOMMouseScroll\"; // let's assume that remaining browsers are older Firefox\r\n\r\n // Code originally in scene.inputManager.ts\r\n // Chrome reports warning in console if wheel listener doesn't set an explicit passive option.\r\n // IE11 only supports captureEvent:boolean, not options:object, and it defaults to false.\r\n // Feature detection technique copied from: https://github.com/github/eventlistener-polyfill (MIT license)\r\n let passiveSupported = false;\r\n const noop = function () { };\r\n\r\n try {\r\n const options: object = {\r\n passive: {\r\n get: function () {\r\n passiveSupported = true;\r\n }\r\n }\r\n };\r\n\r\n this._elementToAttachTo.addEventListener(\"test\", noop, options);\r\n this._elementToAttachTo.removeEventListener(\"test\", noop, options);\r\n }\r\n catch (e) {\r\n /* */\r\n }\r\n\r\n this._pointerBlurEvent = ((evt) => {\r\n // Handle mouse buttons\r\n if (this.isDeviceAvailable(DeviceType.Mouse)) {\r\n const pointer = this._inputs[DeviceType.Mouse][0];\r\n\r\n if (this._mouseId >= 0 && this._elementToAttachTo.hasPointerCapture(this._mouseId)) {\r\n this._elementToAttachTo.releasePointerCapture(this._mouseId);\r\n }\r\n\r\n for (let i = 0; i <= PointerInput.BrowserForward; i++) {\r\n if (pointer[i + 2] === 1) {\r\n pointer[i + 2] = 0;\r\n\r\n const evt: IEvent = DeviceEventFactory.CreateDeviceEvent(DeviceType.Mouse, 0, i + 2, 1, this, this._elementToAttachTo);\r\n const deviceEvent = evt as IDeviceEvent;\r\n deviceEvent.deviceType = DeviceType.Mouse;\r\n deviceEvent.deviceSlot = 0;\r\n deviceEvent.inputIndex = i + 2;\r\n deviceEvent.currentState = pointer[i + 2];\r\n deviceEvent.previousState = 1;\r\n this.onInputChangedObservable.notifyObservers(deviceEvent);\r\n }\r\n }\r\n }\r\n\r\n // Handle Active Touches\r\n if (this.isDeviceAvailable(DeviceType.Touch)) {\r\n const pointer = this._inputs[DeviceType.Touch];\r\n\r\n // Get list of active touch ids and clear each one in the inputs array\r\n for (const deviceSlotKey in Object.keys(this._activeTouchIds)) {\r\n const deviceSlot = +deviceSlotKey;\r\n const pointerId = this._activeTouchIds[deviceSlot];\r\n\r\n if (this._elementToAttachTo.hasPointerCapture(pointerId)) {\r\n this._elementToAttachTo.releasePointerCapture(pointerId);\r\n }\r\n\r\n if (pointer[deviceSlot]?.[PointerInput.LeftClick] === 1) {\r\n pointer[deviceSlot][PointerInput.LeftClick] = 0;\r\n\r\n const evt: IEvent = DeviceEventFactory.CreateDeviceEvent(DeviceType.Touch, pointerId, PointerInput.LeftClick, 1, this, this._elementToAttachTo);\r\n const deviceEvent = evt as IDeviceEvent;\r\n deviceEvent.deviceType = DeviceType.Mouse;\r\n deviceEvent.deviceSlot = deviceSlot;\r\n deviceEvent.inputIndex = PointerInput.LeftClick;\r\n deviceEvent.currentState = pointer[deviceSlot][PointerInput.LeftClick];\r\n deviceEvent.previousState = 1;\r\n this.onInputChangedObservable.notifyObservers(deviceEvent);\r\n\r\n this._unregisterDevice(DeviceType.Touch, deviceSlot);\r\n }\r\n }\r\n // Clear all active touches\r\n while (this._activeTouchIds.pop() !== undefined) { }\r\n }\r\n });\r\n\r\n this._pointerWheelEvent = ((evt) => {\r\n const deviceType = DeviceType.Mouse;\r\n const deviceSlot = 0;\r\n\r\n if (!this._inputs[deviceType]) {\r\n this._inputs[deviceType] = [];\r\n }\r\n\r\n if (!this._inputs[deviceType][deviceSlot]) {\r\n this._pointerActive = true;\r\n this._registerDevice(deviceType, deviceSlot, WebDeviceInputSystem.MAX_POINTER_INPUTS);\r\n }\r\n\r\n const pointer = this._inputs[deviceType][deviceSlot];\r\n if (pointer) {\r\n // Store previous values for event\r\n let previousWheelScrollX = pointer[PointerInput.MouseWheelX];\r\n let previousWheelScrollY = pointer[PointerInput.MouseWheelY];\r\n let previousWheelScrollZ = pointer[PointerInput.MouseWheelZ];\r\n\r\n pointer[PointerInput.MouseWheelX] = evt.deltaX || 0;\r\n pointer[PointerInput.MouseWheelY] = evt.deltaY || evt.wheelDelta || 0;\r\n pointer[PointerInput.MouseWheelZ] = evt.deltaZ || 0;\r\n\r\n let deviceEvent = evt as IDeviceEvent;\r\n deviceEvent.deviceType = deviceType;\r\n deviceEvent.deviceSlot = deviceSlot;\r\n\r\n if (pointer[PointerInput.MouseWheelX] !== 0) {\r\n deviceEvent.inputIndex = PointerInput.MouseWheelX;\r\n deviceEvent.previousState = previousWheelScrollX;\r\n deviceEvent.currentState = pointer[PointerInput.MouseWheelX];\r\n this.onInputChangedObservable.notifyObservers(deviceEvent);\r\n }\r\n if (pointer[PointerInput.MouseWheelY] !== 0) {\r\n deviceEvent.inputIndex = PointerInput.MouseWheelY;\r\n deviceEvent.previousState = previousWheelScrollY;\r\n deviceEvent.currentState = pointer[PointerInput.MouseWheelY];\r\n this.onInputChangedObservable.notifyObservers(deviceEvent);\r\n }\r\n if (pointer[PointerInput.MouseWheelZ] !== 0) {\r\n deviceEvent.inputIndex = PointerInput.MouseWheelZ;\r\n deviceEvent.previousState = previousWheelScrollZ;\r\n deviceEvent.currentState = pointer[PointerInput.MouseWheelZ];\r\n this.onInputChangedObservable.notifyObservers(deviceEvent);\r\n }\r\n }\r\n });\r\n\r\n this._elementToAttachTo.addEventListener(this._eventPrefix + \"move\", this._pointerMoveEvent);\r\n this._elementToAttachTo.addEventListener(this._eventPrefix + \"down\", this._pointerDownEvent);\r\n this._elementToAttachTo.addEventListener(this._eventPrefix + \"up\", this._pointerUpEvent);\r\n this._elementToAttachTo.addEventListener(\"blur\", this._pointerBlurEvent);\r\n this._elementToAttachTo.addEventListener(this._wheelEventName, this._pointerWheelEvent, passiveSupported ? { passive: false } : false);\r\n\r\n // Since there's no up or down event for mouse wheel or delta x/y, clear mouse values at end of frame\r\n this._pointerInputClearObserver = this._engine.onEndFrameObservable.add(() => {\r\n if (this.isDeviceAvailable(DeviceType.Mouse)) {\r\n const pointer = this._inputs[DeviceType.Mouse][0];\r\n pointer[PointerInput.MouseWheelX] = 0;\r\n pointer[PointerInput.MouseWheelY] = 0;\r\n pointer[PointerInput.MouseWheelZ] = 0;\r\n pointer[PointerInput.DeltaHorizontal] = 0;\r\n pointer[PointerInput.DeltaVertical] = 0;\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Handle all actions that come from gamepad interaction\r\n */\r\n private _handleGamepadActions() {\r\n this._gamepadConnectedEvent = ((evt: any) => {\r\n this._addGamePad(evt.gamepad);\r\n });\r\n\r\n this._gamepadDisconnectedEvent = ((evt: any) => {\r\n if (this._gamepads) {\r\n const deviceType = this._getGamepadDeviceType(evt.gamepad.id);\r\n const deviceSlot = evt.gamepad.index;\r\n\r\n this._unregisterDevice(deviceType, deviceSlot);\r\n delete this._gamepads[deviceSlot];\r\n }\r\n });\r\n\r\n window.addEventListener(\"gamepadconnected\", this._gamepadConnectedEvent);\r\n window.addEventListener(\"gamepaddisconnected\", this._gamepadDisconnectedEvent);\r\n }\r\n\r\n /**\r\n * Update all non-event based devices with each frame\r\n * @param deviceType Enum specifiying device type\r\n * @param deviceSlot \"Slot\" or index that device is referenced in\r\n * @param inputIndex Id of input to be checked\r\n */\r\n private _updateDevice(deviceType: DeviceType, deviceSlot: number, inputIndex: number) {\r\n // Gamepads\r\n const gp = navigator.getGamepads()[deviceSlot];\r\n\r\n if (gp && deviceType === this._gamepads[deviceSlot]) {\r\n const device = this._inputs[deviceType][deviceSlot];\r\n\r\n if (inputIndex >= gp.buttons.length) {\r\n device[inputIndex] = gp.axes[inputIndex - gp.buttons.length].valueOf();\r\n }\r\n else {\r\n device[inputIndex] = gp.buttons[inputIndex].value;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Gets DeviceType from the device name\r\n * @param deviceName Name of Device from DeviceInputSystem\r\n * @returns DeviceType enum value\r\n */\r\n private _getGamepadDeviceType(deviceName: string): DeviceType {\r\n if (deviceName.indexOf(\"054c\") !== -1 && deviceName.indexOf(\"0ce6\") === -1) { // DualShock 4 Gamepad\r\n return DeviceType.DualShock;\r\n }\r\n else if (deviceName.indexOf(\"Xbox One\") !== -1 || deviceName.search(\"Xbox 360\") !== -1 || deviceName.search(\"xinput\") !== -1) { // Xbox Gamepad\r\n return DeviceType.Xbox;\r\n }\r\n else if (deviceName.indexOf(\"057e\") !== -1) { // Switch Gamepad\r\n return DeviceType.Switch;\r\n }\r\n\r\n return DeviceType.Generic;\r\n }\r\n\r\n /**\r\n * Get DeviceType from a given pointer/mouse/touch event.\r\n * @param evt PointerEvent to evaluate\r\n * @returns DeviceType interpreted from event\r\n */\r\n private _getPointerType(evt: any): DeviceType {\r\n let deviceType = DeviceType.Mouse;\r\n\r\n if (evt.pointerType === \"touch\" || evt.pointerType === \"pen\" || evt.touches) {\r\n deviceType = DeviceType.Touch;\r\n }\r\n\r\n return deviceType;\r\n }\r\n\r\n /**\r\n * Remove events from active input element\r\n */\r\n private _removeEvents() {\r\n // Blur Events\r\n this._elementToAttachTo.removeEventListener(\"blur\", this._keyboardBlurEvent);\r\n this._elementToAttachTo.removeEventListener(\"blur\", this._pointerBlurEvent);\r\n\r\n // Keyboard Events\r\n if (this._keyboardActive) {\r\n this._elementToAttachTo.removeEventListener(\"keydown\", this._keyboardDownEvent);\r\n this._elementToAttachTo.removeEventListener(\"keyup\", this._keyboardUpEvent);\r\n }\r\n\r\n // Pointer Events\r\n if (this._pointerActive) {\r\n this._elementToAttachTo.removeEventListener(this._eventPrefix + \"move\", this._pointerMoveEvent);\r\n this._elementToAttachTo.removeEventListener(this._eventPrefix + \"down\", this._pointerDownEvent);\r\n this._elementToAttachTo.removeEventListener(this._eventPrefix + \"up\", this._pointerUpEvent);\r\n this._elementToAttachTo.removeEventListener(this._wheelEventName, this._pointerWheelEvent);\r\n\r\n if (this._pointerInputClearObserver) {\r\n this._engine.onEndFrameObservable.remove(this._pointerInputClearObserver);\r\n }\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"webDeviceInputSystem.js","sourceRoot":"","sources":["../../../../sourceES6/core/DeviceInput/Implementations/webDeviceInputSystem.ts"],"names":[],"mappings":"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","sourcesContent":["import { Engine } from \"../../Engines/engine\";\r\nimport { IEvent } from \"../../Events/deviceInputEvents\";\r\nimport { Observable, Observer } from \"../../Misc/observable\";\r\nimport { Tools } from \"../../Misc/tools\";\r\nimport { Nullable } from \"../../types\";\r\nimport { DeviceEventFactory } from \"../Helpers/eventFactory\";\r\nimport { DeviceType, PointerInput } from \"../InputDevices/deviceEnums\";\r\nimport { IDeviceEvent, IDeviceInputSystem } from \"../Interfaces/inputInterfaces\";\r\n\r\n/** @hidden */\r\nexport class WebDeviceInputSystem implements IDeviceInputSystem {\r\n /**\r\n * Observable for devices being connected\r\n */\r\n public readonly onDeviceConnectedObservable: Observable<{ deviceType: DeviceType; deviceSlot: number; }>;\r\n /**\r\n * Observable for devices being disconnected\r\n */\r\n public readonly onDeviceDisconnectedObservable: Observable<{ deviceType: DeviceType; deviceSlot: number; }>;\r\n /**\r\n * Observable for changes to device input\r\n */\r\n public readonly onInputChangedObservable: Observable<IDeviceEvent>;\r\n\r\n // Private Members\r\n private _inputs: Array<{ [deviceSlot: number]: Array<number> }> = [];\r\n private _gamepads: Array<DeviceType>;\r\n private _keyboardActive: boolean = false;\r\n private _pointerActive: boolean = false;\r\n private _elementToAttachTo: HTMLElement;\r\n private _engine: Engine;\r\n private _usingSafari: boolean = Tools.IsSafari();\r\n\r\n private _keyboardDownEvent = (evt: any) => { };\r\n private _keyboardUpEvent = (evt: any) => { };\r\n private _keyboardBlurEvent = (evt: any) => { };\r\n\r\n private _pointerMoveEvent = (evt: any) => { };\r\n private _pointerDownEvent = (evt: any) => { };\r\n private _pointerUpEvent = (evt: any) => { };\r\n private _pointerWheelEvent = (evt: any) => { };\r\n private _pointerBlurEvent = (evt: any) => { };\r\n private _wheelEventName: string;\r\n\r\n private _mouseId = -1;\r\n private _isUsingFirefox = navigator && navigator.userAgent && navigator.userAgent.indexOf(\"Firefox\") !== -1;\r\n\r\n // Array to store active Pointer ID values; prevents issues with negative pointerIds\r\n private _activeTouchIds: Array<number> = [];\r\n private _rollingTouchId: number = 0; // Rolling ID number to assign; emulates Chrome assignment\r\n\r\n private _pointerInputClearObserver: Nullable<Observer<Engine>> = null;\r\n\r\n private _gamepadConnectedEvent = (evt: any) => { };\r\n private _gamepadDisconnectedEvent = (evt: any) => { };\r\n\r\n /** Max number of keycodes */\r\n public static MAX_KEYCODES: number = 255;\r\n /** Max number of pointer inputs */\r\n public static MAX_POINTER_INPUTS: number = Object.keys(PointerInput).length / 2;\r\n\r\n private _eventPrefix: string;\r\n\r\n constructor(engine: Engine) {\r\n this._eventPrefix = Tools.GetPointerPrefix(engine);\r\n this._engine = engine;\r\n\r\n this.onDeviceConnectedObservable = new Observable((observer) => {\r\n // Iterate through each active device and rerun new callback\r\n for (let deviceType = 0; deviceType < this._inputs.length; deviceType++) {\r\n const inputs = this._inputs[deviceType];\r\n if (inputs) {\r\n for (const deviceSlotKey in inputs) {\r\n const deviceSlot = +deviceSlotKey;\r\n if (this._inputs[deviceType][deviceSlot]) {\r\n this.onDeviceConnectedObservable.notifyObserver(observer, { deviceType, deviceSlot });\r\n }\r\n }\r\n }\r\n }\r\n });\r\n\r\n this.onDeviceDisconnectedObservable = new Observable();\r\n this.onInputChangedObservable = new Observable();\r\n\r\n this.configureEvents();\r\n }\r\n\r\n /**\r\n * Configures events to work with an engine's active element\r\n */\r\n public configureEvents() {\r\n const inputElement = this._engine.getInputElement();\r\n if (inputElement && this._elementToAttachTo !== inputElement) {\r\n // If the engine's input element has changed, unregister events from previous element\r\n if (this._elementToAttachTo) {\r\n this._removeEvents();\r\n }\r\n\r\n this._elementToAttachTo = inputElement;\r\n // Set tab index for the inputElement to the engine's canvasTabIndex, if and only if the element's tab index is -1\r\n this._elementToAttachTo.tabIndex = (this._elementToAttachTo.tabIndex !== -1) ? this._elementToAttachTo.tabIndex : this._engine.canvasTabIndex;\r\n this._handleKeyActions();\r\n this._handlePointerActions();\r\n this._handleGamepadActions();\r\n\r\n // Check for devices that are already connected but aren't registered. Currently, only checks for gamepads and mouse\r\n this._checkForConnectedDevices();\r\n }\r\n }\r\n\r\n // Public functions\r\n /**\r\n * Checks for current device input value, given an id and input index. Throws exception if requested device not initialized.\r\n * @param deviceType Enum specifiying device type\r\n * @param deviceSlot \"Slot\" or index that device is referenced in\r\n * @param inputIndex Id of input to be checked\r\n * @returns Current value of input\r\n */\r\n public pollInput(deviceType: DeviceType, deviceSlot: number, inputIndex: number): number {\r\n const device = this._inputs[deviceType][deviceSlot];\r\n\r\n if (!device) {\r\n throw `Unable to find device ${DeviceType[deviceType]}`;\r\n }\r\n\r\n if (deviceType >= DeviceType.Xbox && deviceType <= DeviceType.Switch && navigator.getGamepads) {\r\n this._updateDevice(deviceType, deviceSlot, inputIndex);\r\n }\r\n\r\n const currentValue = device[inputIndex];\r\n if (currentValue === undefined) {\r\n throw `Unable to find input ${inputIndex} for device ${DeviceType[deviceType]} in slot ${deviceSlot}`;\r\n }\r\n\r\n return currentValue;\r\n }\r\n\r\n /**\r\n * Check for a specific device in the DeviceInputSystem\r\n * @param deviceType Type of device to check for\r\n * @returns bool with status of device's existence\r\n */\r\n public isDeviceAvailable(deviceType: DeviceType) {\r\n return (this._inputs[deviceType] !== undefined);\r\n }\r\n\r\n /**\r\n * Dispose of all the eventlisteners\r\n */\r\n public dispose(): void {\r\n // Observables\r\n this.onDeviceConnectedObservable.clear();\r\n this.onDeviceDisconnectedObservable.clear();\r\n this.onInputChangedObservable.clear();\r\n\r\n if (this._elementToAttachTo) {\r\n this._removeEvents();\r\n\r\n // Gamepad Events\r\n window.removeEventListener(\"gamepadconnected\", this._gamepadConnectedEvent);\r\n window.removeEventListener(\"gamepaddisconnected\", this._gamepadDisconnectedEvent);\r\n }\r\n }\r\n\r\n /**\r\n * Checks for existing connections to devices and register them, if necessary\r\n * Currently handles gamepads and mouse\r\n */\r\n private _checkForConnectedDevices() {\r\n if (navigator.getGamepads) {\r\n const gamepads = navigator.getGamepads();\r\n\r\n for (const gamepad of gamepads) {\r\n if (gamepad) {\r\n this._addGamePad(gamepad);\r\n }\r\n }\r\n }\r\n\r\n // If the device in use has mouse capabilities, pre-register mouse\r\n if (matchMedia('(pointer:fine)').matches) {\r\n // This will provide a dummy value for the cursor position and is expected to be overriden when the first mouse event happens.\r\n // There isn't any good way to get the current position outside of a pointer event so that's why this was done.\r\n this._addPointerDevice(DeviceType.Mouse, 0, 0, 0);\r\n }\r\n }\r\n\r\n // Private functions\r\n /**\r\n * Add a gamepad to the DeviceInputSystem\r\n * @param gamepad A single DOM Gamepad object\r\n */\r\n private _addGamePad(gamepad: any) {\r\n const deviceType = this._getGamepadDeviceType(gamepad.id);\r\n const deviceSlot = gamepad.index;\r\n\r\n this._registerDevice(deviceType, deviceSlot, gamepad.buttons.length + gamepad.axes.length);\r\n this._gamepads = this._gamepads || new Array<DeviceType>(gamepad.index + 1);\r\n this._gamepads[deviceSlot] = deviceType;\r\n }\r\n\r\n /**\r\n * Add pointer device to DeviceInputSystem\r\n * @param deviceType Type of Pointer to add\r\n * @param deviceSlot Pointer ID (0 for mouse, pointerId for Touch)\r\n * @param currentX Current X at point of adding\r\n * @param currentY Current Y at point of adding\r\n */\r\n private _addPointerDevice(deviceType: DeviceType, deviceSlot: number, currentX: number, currentY: number) {\r\n this._pointerActive = true;\r\n this._registerDevice(deviceType, deviceSlot, WebDeviceInputSystem.MAX_POINTER_INPUTS);\r\n const pointer = this._inputs[deviceType][deviceSlot]; /* initialize our pointer position immediately after registration */\r\n pointer[0] = currentX;\r\n pointer[1] = currentY;\r\n }\r\n\r\n /**\r\n * Add device and inputs to device array\r\n * @param deviceType Enum specifiying device type\r\n * @param deviceSlot \"Slot\" or index that device is referenced in\r\n * @param numberOfInputs Number of input entries to create for given device\r\n */\r\n private _registerDevice(deviceType: DeviceType, deviceSlot: number, numberOfInputs: number) {\r\n if (deviceSlot === undefined) {\r\n throw `Unable to register device ${DeviceType[deviceType]} to undefined slot.`;\r\n }\r\n\r\n if (!this._inputs[deviceType]) {\r\n this._inputs[deviceType] = {};\r\n }\r\n\r\n if (!this._inputs[deviceType][deviceSlot]) {\r\n const device = new Array<number>(numberOfInputs);\r\n\r\n for (let i = 0; i < numberOfInputs; i++) {\r\n device[i] = 0; /* set device input as unpressed */\r\n }\r\n\r\n this._inputs[deviceType][deviceSlot] = device;\r\n this.onDeviceConnectedObservable.notifyObservers({ deviceType, deviceSlot });\r\n }\r\n }\r\n\r\n /**\r\n * Given a specific device name, remove that device from the device map\r\n * @param deviceType Enum specifiying device type\r\n * @param deviceSlot \"Slot\" or index that device is referenced in\r\n */\r\n private _unregisterDevice(deviceType: DeviceType, deviceSlot: number) {\r\n if (this._inputs[deviceType][deviceSlot]) {\r\n delete this._inputs[deviceType][deviceSlot];\r\n this.onDeviceDisconnectedObservable.notifyObservers({ deviceType, deviceSlot });\r\n }\r\n }\r\n\r\n /**\r\n * Handle all actions that come from keyboard interaction\r\n */\r\n private _handleKeyActions() {\r\n this._keyboardDownEvent = ((evt) => {\r\n if (!this._keyboardActive) {\r\n this._keyboardActive = true;\r\n this._registerDevice(DeviceType.Keyboard, 0, WebDeviceInputSystem.MAX_KEYCODES);\r\n }\r\n\r\n const kbKey = this._inputs[DeviceType.Keyboard][0];\r\n if (kbKey) {\r\n kbKey[evt.keyCode] = 1;\r\n\r\n let deviceEvent = evt as IDeviceEvent;\r\n deviceEvent.deviceType = DeviceType.Keyboard;\r\n deviceEvent.deviceSlot = 0;\r\n deviceEvent.inputIndex = evt.keyCode;\r\n deviceEvent.previousState = 0;\r\n deviceEvent.currentState = kbKey[evt.keyCode];\r\n\r\n this.onInputChangedObservable.notifyObservers(deviceEvent);\r\n }\r\n });\r\n\r\n this._keyboardUpEvent = ((evt) => {\r\n if (!this._keyboardActive) {\r\n this._keyboardActive = true;\r\n this._registerDevice(DeviceType.Keyboard, 0, WebDeviceInputSystem.MAX_KEYCODES);\r\n }\r\n\r\n const kbKey = this._inputs[DeviceType.Keyboard][0];\r\n if (kbKey) {\r\n kbKey[evt.keyCode] = 0;\r\n\r\n let deviceEvent = evt as IDeviceEvent;\r\n deviceEvent.deviceType = DeviceType.Keyboard;\r\n deviceEvent.deviceSlot = 0;\r\n deviceEvent.inputIndex = evt.keyCode;\r\n deviceEvent.previousState = 1;\r\n deviceEvent.currentState = kbKey[evt.keyCode];\r\n\r\n this.onInputChangedObservable.notifyObservers(deviceEvent);\r\n }\r\n });\r\n\r\n this._keyboardBlurEvent = ((evt) => {\r\n if (this._keyboardActive) {\r\n const kbKey = this._inputs[DeviceType.Keyboard][0];\r\n\r\n for (let i = 0; i < kbKey.length; i++) {\r\n if (kbKey[i] !== 0) {\r\n kbKey[i] = 0;\r\n\r\n const evt: IEvent = DeviceEventFactory.CreateDeviceEvent(DeviceType.Keyboard, 0, i, 1, this, this._elementToAttachTo);\r\n const deviceEvent = evt as IDeviceEvent;\r\n deviceEvent.deviceType = DeviceType.Keyboard;\r\n deviceEvent.deviceSlot = 0;\r\n deviceEvent.inputIndex = i;\r\n deviceEvent.currentState = 0;\r\n deviceEvent.previousState = 1;\r\n this.onInputChangedObservable.notifyObservers(deviceEvent);\r\n }\r\n }\r\n }\r\n });\r\n\r\n this._elementToAttachTo.addEventListener(\"keydown\", this._keyboardDownEvent);\r\n this._elementToAttachTo.addEventListener(\"keyup\", this._keyboardUpEvent);\r\n this._elementToAttachTo.addEventListener(\"blur\", this._keyboardBlurEvent);\r\n }\r\n\r\n /**\r\n * Handle all actions that come from pointer interaction\r\n */\r\n private _handlePointerActions() {\r\n this._pointerMoveEvent = ((evt) => {\r\n const deviceType = this._getPointerType(evt);\r\n const deviceSlot = (deviceType === DeviceType.Mouse) ? 0 : this._activeTouchIds.indexOf(evt.pointerId);\r\n\r\n if (!this._inputs[deviceType]) {\r\n this._inputs[deviceType] = {};\r\n }\r\n\r\n if (!this._inputs[deviceType][deviceSlot]) {\r\n this._addPointerDevice(deviceType, deviceSlot, evt.clientX, evt.clientY);\r\n }\r\n\r\n const pointer = this._inputs[deviceType][deviceSlot];\r\n if (pointer) {\r\n // Store previous values for event\r\n const previousHorizontal = pointer[PointerInput.Horizontal];\r\n const previousVertical = pointer[PointerInput.Vertical];\r\n const previousDeltaHorizontal = pointer[PointerInput.DeltaHorizontal];\r\n const previousDeltaVertical = pointer[PointerInput.DeltaVertical];\r\n\r\n pointer[PointerInput.Horizontal] = evt.clientX;\r\n pointer[PointerInput.Vertical] = evt.clientY;\r\n pointer[PointerInput.DeltaHorizontal] = evt.movementX;\r\n pointer[PointerInput.DeltaVertical] = evt.movementY;\r\n\r\n let deviceEvent = evt as IDeviceEvent;\r\n deviceEvent.deviceType = deviceType;\r\n deviceEvent.deviceSlot = deviceSlot;\r\n\r\n // The browser might use a move event in case\r\n // of simultaneous mouse buttons click for instance. So\r\n // in this case we stil need to propagate it.\r\n if (previousHorizontal !== evt.clientX) {\r\n deviceEvent.inputIndex = PointerInput.Horizontal;\r\n deviceEvent.previousState = previousHorizontal;\r\n deviceEvent.currentState = pointer[PointerInput.Horizontal];\r\n\r\n this.onInputChangedObservable.notifyObservers(deviceEvent);\r\n }\r\n if (previousVertical !== evt.clientY) {\r\n deviceEvent.inputIndex = PointerInput.Vertical;\r\n deviceEvent.previousState = previousVertical;\r\n deviceEvent.currentState = pointer[PointerInput.Vertical];\r\n\r\n this.onInputChangedObservable.notifyObservers(deviceEvent);\r\n }\r\n if (pointer[PointerInput.DeltaHorizontal] !== 0) {\r\n deviceEvent.inputIndex = PointerInput.DeltaHorizontal;\r\n deviceEvent.previousState = previousDeltaHorizontal;\r\n deviceEvent.currentState = pointer[PointerInput.DeltaHorizontal];\r\n\r\n this.onInputChangedObservable.notifyObservers(deviceEvent);\r\n }\r\n if (pointer[PointerInput.DeltaVertical] !== 0) {\r\n deviceEvent.inputIndex = PointerInput.DeltaVertical;\r\n deviceEvent.previousState = previousDeltaVertical;\r\n deviceEvent.currentState = pointer[PointerInput.DeltaVertical];\r\n\r\n this.onInputChangedObservable.notifyObservers(deviceEvent);\r\n }\r\n // Lets Propagate the event for move with same position.\r\n if (!this._usingSafari && evt.button !== -1) {\r\n deviceEvent.inputIndex = evt.button + 2;\r\n deviceEvent.previousState = pointer[evt.button + 2];\r\n pointer[evt.button + 2] = (pointer[evt.button + 2] ? 0 : 1); // Reverse state of button if evt.button has value\r\n deviceEvent.currentState = pointer[evt.button + 2];\r\n this.onInputChangedObservable.notifyObservers(deviceEvent);\r\n }\r\n }\r\n });\r\n\r\n this._pointerDownEvent = ((evt) => {\r\n const deviceType = this._getPointerType(evt);\r\n let deviceSlot = (deviceType === DeviceType.Mouse) ? 0 : evt.pointerId;\r\n\r\n if (deviceType === DeviceType.Touch) {\r\n deviceSlot = this._rollingTouchId++;\r\n this._activeTouchIds[deviceSlot] = evt.pointerId;\r\n }\r\n\r\n if (!this._inputs[deviceType]) {\r\n this._inputs[deviceType] = {};\r\n }\r\n\r\n if (!this._inputs[deviceType][deviceSlot]) {\r\n this._addPointerDevice(deviceType, deviceSlot, evt.clientX, evt.clientY);\r\n }\r\n\r\n const pointer = this._inputs[deviceType][deviceSlot];\r\n if (pointer) {\r\n const previousHorizontal = pointer[PointerInput.Horizontal];\r\n const previousVertical = pointer[PointerInput.Vertical];\r\n const previousButton = pointer[evt.button + 2];\r\n\r\n if (deviceType === DeviceType.Mouse) { // Mouse; Among supported browsers, value is either 1 or 0 for mouse\r\n if (this._mouseId === -1) {\r\n if (evt.pointerId === undefined) { // If there is no pointerId (eg. manually dispatched MouseEvent)\r\n this._mouseId = this._isUsingFirefox ? 0 : 1;\r\n }\r\n else {\r\n this._mouseId = evt.pointerId;\r\n }\r\n }\r\n\r\n if (!document.pointerLockElement && this._elementToAttachTo.hasPointerCapture) {\r\n try {\r\n this._elementToAttachTo.setPointerCapture(this._mouseId);\r\n }\r\n catch (e) {\r\n // DO NOTHING\r\n }\r\n }\r\n }\r\n else { // Touch; Since touches are dynamically assigned, only set capture if we have an id\r\n if (evt.pointerId && !document.pointerLockElement && this._elementToAttachTo.hasPointerCapture) {\r\n try {\r\n this._elementToAttachTo.setPointerCapture(evt.pointerId);\r\n }\r\n catch (e) {\r\n // DO NOTHING\r\n }\r\n }\r\n }\r\n\r\n pointer[PointerInput.Horizontal] = evt.clientX;\r\n pointer[PointerInput.Vertical] = evt.clientY;\r\n pointer[evt.button + 2] = 1;\r\n\r\n let deviceEvent = evt as IDeviceEvent;\r\n deviceEvent.deviceType = deviceType;\r\n deviceEvent.deviceSlot = deviceSlot;\r\n\r\n if (previousHorizontal !== evt.clientX) {\r\n deviceEvent.inputIndex = PointerInput.Horizontal;\r\n deviceEvent.previousState = previousHorizontal;\r\n deviceEvent.currentState = pointer[PointerInput.Horizontal];\r\n\r\n this.onInputChangedObservable.notifyObservers(deviceEvent);\r\n }\r\n if (previousVertical !== evt.clientY) {\r\n deviceEvent.inputIndex = PointerInput.Vertical;\r\n deviceEvent.previousState = previousVertical;\r\n deviceEvent.currentState = pointer[PointerInput.Vertical];\r\n\r\n this.onInputChangedObservable.notifyObservers(deviceEvent);\r\n }\r\n\r\n deviceEvent.inputIndex = evt.button + 2;\r\n deviceEvent.previousState = previousButton;\r\n deviceEvent.currentState = pointer[evt.button + 2];\r\n this.onInputChangedObservable.notifyObservers(deviceEvent);\r\n }\r\n });\r\n\r\n this._pointerUpEvent = ((evt) => {\r\n const deviceType = this._getPointerType(evt);\r\n const deviceSlot = (deviceType === DeviceType.Mouse) ? 0 : this._activeTouchIds.indexOf(evt.pointerId);\r\n\r\n const pointer = this._inputs[deviceType]?.[deviceSlot];\r\n if (pointer && pointer[evt.button + 2] !== 0) {\r\n const previousHorizontal = pointer[PointerInput.Horizontal];\r\n const previousVertical = pointer[PointerInput.Vertical];\r\n const previousButton = pointer[evt.button + 2];\r\n\r\n pointer[PointerInput.Horizontal] = evt.clientX;\r\n pointer[PointerInput.Vertical] = evt.clientY;\r\n pointer[evt.button + 2] = 0;\r\n\r\n let deviceEvent = evt as IDeviceEvent;\r\n deviceEvent.deviceType = deviceType;\r\n deviceEvent.deviceSlot = deviceSlot;\r\n\r\n if (previousHorizontal !== evt.clientX) {\r\n deviceEvent.inputIndex = PointerInput.Horizontal;\r\n deviceEvent.previousState = previousHorizontal;\r\n deviceEvent.currentState = pointer[PointerInput.Horizontal];\r\n\r\n this.onInputChangedObservable.notifyObservers(deviceEvent);\r\n }\r\n if (previousVertical !== evt.clientY) {\r\n deviceEvent.inputIndex = PointerInput.Vertical;\r\n deviceEvent.previousState = previousVertical;\r\n deviceEvent.currentState = pointer[PointerInput.Vertical];\r\n\r\n this.onInputChangedObservable.notifyObservers(deviceEvent);\r\n }\r\n\r\n deviceEvent.inputIndex = evt.button + 2;\r\n deviceEvent.previousState = previousButton;\r\n deviceEvent.currentState = pointer[evt.button + 2];\r\n\r\n if (deviceType === DeviceType.Mouse && this._mouseId >= 0 && this._elementToAttachTo.hasPointerCapture?.(this._mouseId)) {\r\n this._elementToAttachTo.releasePointerCapture(this._mouseId);\r\n }\r\n else if (evt.pointerId && this._elementToAttachTo.hasPointerCapture?.(evt.pointerId)) {\r\n this._elementToAttachTo.releasePointerCapture(evt.pointerId);\r\n }\r\n\r\n this.onInputChangedObservable.notifyObservers(deviceEvent);\r\n\r\n // We don't want to unregister the mouse because we may miss input data when a mouse is moving after a click\r\n if (deviceType !== DeviceType.Mouse) {\r\n let idToRemove = this._activeTouchIds.indexOf(evt.pointerId);\r\n delete this._activeTouchIds[idToRemove];\r\n this._unregisterDevice(deviceType, deviceSlot);\r\n }\r\n }\r\n });\r\n\r\n // Set Wheel Event Name, code originally from scene.inputManager\r\n this._wheelEventName = \"onwheel\" in document.createElement(\"div\") ? \"wheel\" : // Modern browsers support \"wheel\"\r\n (<any>document).onmousewheel !== undefined ? \"mousewheel\" : // Webkit and IE support at least \"mousewheel\"\r\n \"DOMMouseScroll\"; // let's assume that remaining browsers are older Firefox\r\n\r\n // Code originally in scene.inputManager.ts\r\n // Chrome reports warning in console if wheel listener doesn't set an explicit passive option.\r\n // IE11 only supports captureEvent:boolean, not options:object, and it defaults to false.\r\n // Feature detection technique copied from: https://github.com/github/eventlistener-polyfill (MIT license)\r\n let passiveSupported = false;\r\n const noop = function () { };\r\n\r\n try {\r\n const options: object = {\r\n passive: {\r\n get: function () {\r\n passiveSupported = true;\r\n }\r\n }\r\n };\r\n\r\n this._elementToAttachTo.addEventListener(\"test\", noop, options);\r\n this._elementToAttachTo.removeEventListener(\"test\", noop, options);\r\n }\r\n catch (e) {\r\n /* */\r\n }\r\n\r\n this._pointerBlurEvent = ((evt) => {\r\n // Handle mouse buttons\r\n if (this.isDeviceAvailable(DeviceType.Mouse)) {\r\n const pointer = this._inputs[DeviceType.Mouse][0];\r\n\r\n if (this._mouseId >= 0 && this._elementToAttachTo.hasPointerCapture?.(this._mouseId)) {\r\n this._elementToAttachTo.releasePointerCapture(this._mouseId);\r\n }\r\n\r\n for (let i = 0; i <= PointerInput.BrowserForward; i++) {\r\n if (pointer[i + 2] === 1) {\r\n pointer[i + 2] = 0;\r\n\r\n const evt: IEvent = DeviceEventFactory.CreateDeviceEvent(DeviceType.Mouse, 0, i + 2, 1, this, this._elementToAttachTo);\r\n const deviceEvent = evt as IDeviceEvent;\r\n deviceEvent.deviceType = DeviceType.Mouse;\r\n deviceEvent.deviceSlot = 0;\r\n deviceEvent.inputIndex = i + 2;\r\n deviceEvent.currentState = pointer[i + 2];\r\n deviceEvent.previousState = 1;\r\n this.onInputChangedObservable.notifyObservers(deviceEvent);\r\n }\r\n }\r\n }\r\n\r\n // Handle Active Touches\r\n if (this.isDeviceAvailable(DeviceType.Touch)) {\r\n const pointer = this._inputs[DeviceType.Touch];\r\n\r\n // Get list of active touch ids and clear each one in the inputs array\r\n for (const deviceSlotKey in Object.keys(this._activeTouchIds)) {\r\n const deviceSlot = +deviceSlotKey;\r\n const pointerId = this._activeTouchIds[deviceSlot];\r\n\r\n if (this._elementToAttachTo.hasPointerCapture?.(pointerId)) {\r\n this._elementToAttachTo.releasePointerCapture(pointerId);\r\n }\r\n\r\n if (pointer[deviceSlot]?.[PointerInput.LeftClick] === 1) {\r\n pointer[deviceSlot][PointerInput.LeftClick] = 0;\r\n\r\n const evt: IEvent = DeviceEventFactory.CreateDeviceEvent(DeviceType.Touch, pointerId, PointerInput.LeftClick, 1, this, this._elementToAttachTo);\r\n const deviceEvent = evt as IDeviceEvent;\r\n deviceEvent.deviceType = DeviceType.Mouse;\r\n deviceEvent.deviceSlot = deviceSlot;\r\n deviceEvent.inputIndex = PointerInput.LeftClick;\r\n deviceEvent.currentState = pointer[deviceSlot][PointerInput.LeftClick];\r\n deviceEvent.previousState = 1;\r\n this.onInputChangedObservable.notifyObservers(deviceEvent);\r\n\r\n this._unregisterDevice(DeviceType.Touch, deviceSlot);\r\n }\r\n }\r\n // Clear all active touches\r\n while (this._activeTouchIds.pop() !== undefined) { }\r\n }\r\n });\r\n\r\n this._pointerWheelEvent = ((evt) => {\r\n const deviceType = DeviceType.Mouse;\r\n const deviceSlot = 0;\r\n\r\n if (!this._inputs[deviceType]) {\r\n this._inputs[deviceType] = [];\r\n }\r\n\r\n if (!this._inputs[deviceType][deviceSlot]) {\r\n this._pointerActive = true;\r\n this._registerDevice(deviceType, deviceSlot, WebDeviceInputSystem.MAX_POINTER_INPUTS);\r\n }\r\n\r\n const pointer = this._inputs[deviceType][deviceSlot];\r\n if (pointer) {\r\n // Store previous values for event\r\n let previousWheelScrollX = pointer[PointerInput.MouseWheelX];\r\n let previousWheelScrollY = pointer[PointerInput.MouseWheelY];\r\n let previousWheelScrollZ = pointer[PointerInput.MouseWheelZ];\r\n\r\n pointer[PointerInput.MouseWheelX] = evt.deltaX || 0;\r\n pointer[PointerInput.MouseWheelY] = evt.deltaY || evt.wheelDelta || 0;\r\n pointer[PointerInput.MouseWheelZ] = evt.deltaZ || 0;\r\n\r\n let deviceEvent = evt as IDeviceEvent;\r\n deviceEvent.deviceType = deviceType;\r\n deviceEvent.deviceSlot = deviceSlot;\r\n\r\n if (pointer[PointerInput.MouseWheelX] !== 0) {\r\n deviceEvent.inputIndex = PointerInput.MouseWheelX;\r\n deviceEvent.previousState = previousWheelScrollX;\r\n deviceEvent.currentState = pointer[PointerInput.MouseWheelX];\r\n this.onInputChangedObservable.notifyObservers(deviceEvent);\r\n }\r\n if (pointer[PointerInput.MouseWheelY] !== 0) {\r\n deviceEvent.inputIndex = PointerInput.MouseWheelY;\r\n deviceEvent.previousState = previousWheelScrollY;\r\n deviceEvent.currentState = pointer[PointerInput.MouseWheelY];\r\n this.onInputChangedObservable.notifyObservers(deviceEvent);\r\n }\r\n if (pointer[PointerInput.MouseWheelZ] !== 0) {\r\n deviceEvent.inputIndex = PointerInput.MouseWheelZ;\r\n deviceEvent.previousState = previousWheelScrollZ;\r\n deviceEvent.currentState = pointer[PointerInput.MouseWheelZ];\r\n this.onInputChangedObservable.notifyObservers(deviceEvent);\r\n }\r\n }\r\n });\r\n\r\n this._elementToAttachTo.addEventListener(this._eventPrefix + \"move\", this._pointerMoveEvent);\r\n this._elementToAttachTo.addEventListener(this._eventPrefix + \"down\", this._pointerDownEvent);\r\n this._elementToAttachTo.addEventListener(this._eventPrefix + \"up\", this._pointerUpEvent);\r\n this._elementToAttachTo.addEventListener(\"blur\", this._pointerBlurEvent);\r\n this._elementToAttachTo.addEventListener(this._wheelEventName, this._pointerWheelEvent, passiveSupported ? { passive: false } : false);\r\n\r\n // Since there's no up or down event for mouse wheel or delta x/y, clear mouse values at end of frame\r\n this._pointerInputClearObserver = this._engine.onEndFrameObservable.add(() => {\r\n if (this.isDeviceAvailable(DeviceType.Mouse)) {\r\n const pointer = this._inputs[DeviceType.Mouse][0];\r\n pointer[PointerInput.MouseWheelX] = 0;\r\n pointer[PointerInput.MouseWheelY] = 0;\r\n pointer[PointerInput.MouseWheelZ] = 0;\r\n pointer[PointerInput.DeltaHorizontal] = 0;\r\n pointer[PointerInput.DeltaVertical] = 0;\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Handle all actions that come from gamepad interaction\r\n */\r\n private _handleGamepadActions() {\r\n this._gamepadConnectedEvent = ((evt: any) => {\r\n this._addGamePad(evt.gamepad);\r\n });\r\n\r\n this._gamepadDisconnectedEvent = ((evt: any) => {\r\n if (this._gamepads) {\r\n const deviceType = this._getGamepadDeviceType(evt.gamepad.id);\r\n const deviceSlot = evt.gamepad.index;\r\n\r\n this._unregisterDevice(deviceType, deviceSlot);\r\n delete this._gamepads[deviceSlot];\r\n }\r\n });\r\n\r\n window.addEventListener(\"gamepadconnected\", this._gamepadConnectedEvent);\r\n window.addEventListener(\"gamepaddisconnected\", this._gamepadDisconnectedEvent);\r\n }\r\n\r\n /**\r\n * Update all non-event based devices with each frame\r\n * @param deviceType Enum specifiying device type\r\n * @param deviceSlot \"Slot\" or index that device is referenced in\r\n * @param inputIndex Id of input to be checked\r\n */\r\n private _updateDevice(deviceType: DeviceType, deviceSlot: number, inputIndex: number) {\r\n // Gamepads\r\n const gp = navigator.getGamepads()[deviceSlot];\r\n\r\n if (gp && deviceType === this._gamepads[deviceSlot]) {\r\n const device = this._inputs[deviceType][deviceSlot];\r\n\r\n if (inputIndex >= gp.buttons.length) {\r\n device[inputIndex] = gp.axes[inputIndex - gp.buttons.length].valueOf();\r\n }\r\n else {\r\n device[inputIndex] = gp.buttons[inputIndex].value;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Gets DeviceType from the device name\r\n * @param deviceName Name of Device from DeviceInputSystem\r\n * @returns DeviceType enum value\r\n */\r\n private _getGamepadDeviceType(deviceName: string): DeviceType {\r\n if (deviceName.indexOf(\"054c\") !== -1 && deviceName.indexOf(\"0ce6\") === -1) { // DualShock 4 Gamepad\r\n return DeviceType.DualShock;\r\n }\r\n else if (deviceName.indexOf(\"Xbox One\") !== -1 || deviceName.search(\"Xbox 360\") !== -1 || deviceName.search(\"xinput\") !== -1) { // Xbox Gamepad\r\n return DeviceType.Xbox;\r\n }\r\n else if (deviceName.indexOf(\"057e\") !== -1) { // Switch Gamepad\r\n return DeviceType.Switch;\r\n }\r\n\r\n return DeviceType.Generic;\r\n }\r\n\r\n /**\r\n * Get DeviceType from a given pointer/mouse/touch event.\r\n * @param evt PointerEvent to evaluate\r\n * @returns DeviceType interpreted from event\r\n */\r\n private _getPointerType(evt: any): DeviceType {\r\n let deviceType = DeviceType.Mouse;\r\n\r\n if (evt.pointerType === \"touch\" || evt.pointerType === \"pen\" || evt.touches) {\r\n deviceType = DeviceType.Touch;\r\n }\r\n\r\n return deviceType;\r\n }\r\n\r\n /**\r\n * Remove events from active input element\r\n */\r\n private _removeEvents() {\r\n // Blur Events\r\n this._elementToAttachTo.removeEventListener(\"blur\", this._keyboardBlurEvent);\r\n this._elementToAttachTo.removeEventListener(\"blur\", this._pointerBlurEvent);\r\n\r\n // Keyboard Events\r\n if (this._keyboardActive) {\r\n this._elementToAttachTo.removeEventListener(\"keydown\", this._keyboardDownEvent);\r\n this._elementToAttachTo.removeEventListener(\"keyup\", this._keyboardUpEvent);\r\n }\r\n\r\n // Pointer Events\r\n if (this._pointerActive) {\r\n this._elementToAttachTo.removeEventListener(this._eventPrefix + \"move\", this._pointerMoveEvent);\r\n this._elementToAttachTo.removeEventListener(this._eventPrefix + \"down\", this._pointerDownEvent);\r\n this._elementToAttachTo.removeEventListener(this._eventPrefix + \"up\", this._pointerUpEvent);\r\n this._elementToAttachTo.removeEventListener(this._wheelEventName, this._pointerWheelEvent);\r\n\r\n if (this._pointerInputClearObserver) {\r\n this._engine.onEndFrameObservable.remove(this._pointerInputClearObserver);\r\n }\r\n }\r\n }\r\n}\r\n"]}
@@ -20,7 +20,8 @@ declare module "../../Engines/thinEngine" {
20
20
  * @param premulAlpha defines if alpha is stored as premultiplied
21
21
  * @param format defines the format of the data
22
22
  * @param forceBindTexture if the texture should be forced to be bound eg. after a graphics context loss (Default: false)
23
+ * @param allowGPUOptimization true to allow some specific GPU optimizations (subject to engine feature "allowGPUOptimizationsForGUI" being true)
23
24
  */
24
- updateDynamicTexture(texture: Nullable<InternalTexture>, source: ImageBitmap | ImageData | HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | OffscreenCanvas | ICanvas, invertY?: boolean, premulAlpha?: boolean, format?: number, forceBindTexture?: boolean): void;
25
+ updateDynamicTexture(texture: Nullable<InternalTexture>, source: ImageBitmap | ImageData | HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | OffscreenCanvas | ICanvas, invertY?: boolean, premulAlpha?: boolean, format?: number, forceBindTexture?: boolean, allowGPUOptimization?: boolean): void;
25
26
  }
26
27
  }
@@ -18,9 +18,10 @@ ThinEngine.prototype.createDynamicTexture = function (width, height, generateMip
18
18
  this._internalTexturesCache.push(texture);
19
19
  return texture;
20
20
  };
21
- ThinEngine.prototype.updateDynamicTexture = function (texture, source, invertY, premulAlpha, format, forceBindTexture) {
21
+ ThinEngine.prototype.updateDynamicTexture = function (texture, source, invertY, premulAlpha, format, forceBindTexture, allowGPUOptimization) {
22
22
  if (premulAlpha === void 0) { premulAlpha = false; }
23
23
  if (forceBindTexture === void 0) { forceBindTexture = false; }
24
+ if (allowGPUOptimization === void 0) { allowGPUOptimization = false; }
24
25
  if (!texture) {
25
26
  return;
26
27
  }
@@ -1 +1 @@
1
- {"version":3,"file":"engine.dynamicTexture.js","sourceRoot":"","sources":["../../../../sourceES6/core/Engines/Extensions/engine.dynamicTexture.ts"],"names":[],"mappings":"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","sourcesContent":["import { ThinEngine } from \"../../Engines/thinEngine\";\r\nimport { InternalTexture, InternalTextureSource } from '../../Materials/Textures/internalTexture';\r\nimport { Nullable } from '../../types';\r\nimport { ICanvas } from \"../ICanvas\";\r\n\r\ndeclare module \"../../Engines/thinEngine\" {\r\n export interface ThinEngine {\r\n /**\r\n * Creates a dynamic texture\r\n * @param width defines the width of the texture\r\n * @param height defines the height of the texture\r\n * @param generateMipMaps defines if the engine should generate the mip levels\r\n * @param samplingMode defines the required sampling mode (Texture.NEAREST_SAMPLINGMODE by default)\r\n * @returns the dynamic texture inside an InternalTexture\r\n */\r\n createDynamicTexture(width: number, height: number, generateMipMaps: boolean, samplingMode: number): InternalTexture;\r\n\r\n /**\r\n * Update the content of a dynamic texture\r\n * @param texture defines the texture to update\r\n * @param source defines the source containing the data\r\n * @param invertY defines if data must be stored with Y axis inverted\r\n * @param premulAlpha defines if alpha is stored as premultiplied\r\n * @param format defines the format of the data\r\n * @param forceBindTexture if the texture should be forced to be bound eg. after a graphics context loss (Default: false)\r\n */\r\n updateDynamicTexture(texture: Nullable<InternalTexture>,\r\n source: ImageBitmap | ImageData | HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | OffscreenCanvas | ICanvas,\r\n invertY?: boolean, premulAlpha?: boolean, format?: number, forceBindTexture?: boolean): void;\r\n }\r\n}\r\n\r\nThinEngine.prototype.createDynamicTexture = function (width: number, height: number, generateMipMaps: boolean, samplingMode: number): InternalTexture {\r\n var texture = new InternalTexture(this, InternalTextureSource.Dynamic);\r\n texture.baseWidth = width;\r\n texture.baseHeight = height;\r\n\r\n if (generateMipMaps) {\r\n width = this.needPOTTextures ? ThinEngine.GetExponentOfTwo(width, this._caps.maxTextureSize) : width;\r\n height = this.needPOTTextures ? ThinEngine.GetExponentOfTwo(height, this._caps.maxTextureSize) : height;\r\n }\r\n\r\n // this.resetTextureCache();\r\n texture.width = width;\r\n texture.height = height;\r\n texture.isReady = false;\r\n texture.generateMipMaps = generateMipMaps;\r\n texture.samplingMode = samplingMode;\r\n\r\n this.updateTextureSamplingMode(samplingMode, texture);\r\n\r\n this._internalTexturesCache.push(texture);\r\n\r\n return texture;\r\n};\r\n\r\nThinEngine.prototype.updateDynamicTexture = function (texture: Nullable<InternalTexture>,\r\n source: ImageBitmap | ImageData | HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | OffscreenCanvas,\r\n invertY?: boolean,\r\n premulAlpha: boolean = false,\r\n format?: number,\r\n forceBindTexture: boolean = false): void {\r\n if (!texture) {\r\n return;\r\n }\r\n\r\n const gl = this._gl;\r\n const target = gl.TEXTURE_2D;\r\n\r\n const wasPreviouslyBound = this._bindTextureDirectly(target, texture, true, forceBindTexture);\r\n\r\n this._unpackFlipY(invertY === undefined ? texture.invertY : invertY);\r\n\r\n if (premulAlpha) {\r\n gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, 1);\r\n }\r\n\r\n const textureType = this._getWebGLTextureType(texture.type);\r\n const glformat = this._getInternalFormat(format ? format : texture.format);\r\n const internalFormat = this._getRGBABufferInternalSizedFormat(texture.type, glformat);\r\n\r\n gl.texImage2D(target, 0, internalFormat, glformat, textureType, source as TexImageSource);\r\n\r\n if (texture.generateMipMaps) {\r\n gl.generateMipmap(target);\r\n }\r\n\r\n if (!wasPreviouslyBound) {\r\n this._bindTextureDirectly(target, null);\r\n }\r\n\r\n if (premulAlpha) {\r\n gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, 0);\r\n }\r\n\r\n texture.isReady = true;\r\n};"]}
1
+ {"version":3,"file":"engine.dynamicTexture.js","sourceRoot":"","sources":["../../../../sourceES6/core/Engines/Extensions/engine.dynamicTexture.ts"],"names":[],"mappings":"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","sourcesContent":["import { ThinEngine } from \"../../Engines/thinEngine\";\r\nimport { InternalTexture, InternalTextureSource } from '../../Materials/Textures/internalTexture';\r\nimport { Nullable } from '../../types';\r\nimport { ICanvas } from \"../ICanvas\";\r\n\r\ndeclare module \"../../Engines/thinEngine\" {\r\n export interface ThinEngine {\r\n /**\r\n * Creates a dynamic texture\r\n * @param width defines the width of the texture\r\n * @param height defines the height of the texture\r\n * @param generateMipMaps defines if the engine should generate the mip levels\r\n * @param samplingMode defines the required sampling mode (Texture.NEAREST_SAMPLINGMODE by default)\r\n * @returns the dynamic texture inside an InternalTexture\r\n */\r\n createDynamicTexture(width: number, height: number, generateMipMaps: boolean, samplingMode: number): InternalTexture;\r\n\r\n /**\r\n * Update the content of a dynamic texture\r\n * @param texture defines the texture to update\r\n * @param source defines the source containing the data\r\n * @param invertY defines if data must be stored with Y axis inverted\r\n * @param premulAlpha defines if alpha is stored as premultiplied\r\n * @param format defines the format of the data\r\n * @param forceBindTexture if the texture should be forced to be bound eg. after a graphics context loss (Default: false)\r\n * @param allowGPUOptimization true to allow some specific GPU optimizations (subject to engine feature \"allowGPUOptimizationsForGUI\" being true)\r\n */\r\n updateDynamicTexture(texture: Nullable<InternalTexture>,\r\n source: ImageBitmap | ImageData | HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | OffscreenCanvas | ICanvas,\r\n invertY?: boolean, premulAlpha?: boolean, format?: number, forceBindTexture?: boolean, allowGPUOptimization?: boolean): void;\r\n }\r\n}\r\n\r\nThinEngine.prototype.createDynamicTexture = function (width: number, height: number, generateMipMaps: boolean, samplingMode: number): InternalTexture {\r\n var texture = new InternalTexture(this, InternalTextureSource.Dynamic);\r\n texture.baseWidth = width;\r\n texture.baseHeight = height;\r\n\r\n if (generateMipMaps) {\r\n width = this.needPOTTextures ? ThinEngine.GetExponentOfTwo(width, this._caps.maxTextureSize) : width;\r\n height = this.needPOTTextures ? ThinEngine.GetExponentOfTwo(height, this._caps.maxTextureSize) : height;\r\n }\r\n\r\n // this.resetTextureCache();\r\n texture.width = width;\r\n texture.height = height;\r\n texture.isReady = false;\r\n texture.generateMipMaps = generateMipMaps;\r\n texture.samplingMode = samplingMode;\r\n\r\n this.updateTextureSamplingMode(samplingMode, texture);\r\n\r\n this._internalTexturesCache.push(texture);\r\n\r\n return texture;\r\n};\r\n\r\nThinEngine.prototype.updateDynamicTexture = function (texture: Nullable<InternalTexture>,\r\n source: ImageBitmap | ImageData | HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | OffscreenCanvas,\r\n invertY?: boolean,\r\n premulAlpha: boolean = false,\r\n format?: number,\r\n forceBindTexture: boolean = false,\r\n allowGPUOptimization: boolean = false,\r\n ): void {\r\n if (!texture) {\r\n return;\r\n }\r\n\r\n const gl = this._gl;\r\n const target = gl.TEXTURE_2D;\r\n\r\n const wasPreviouslyBound = this._bindTextureDirectly(target, texture, true, forceBindTexture);\r\n\r\n this._unpackFlipY(invertY === undefined ? texture.invertY : invertY);\r\n\r\n if (premulAlpha) {\r\n gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, 1);\r\n }\r\n\r\n const textureType = this._getWebGLTextureType(texture.type);\r\n const glformat = this._getInternalFormat(format ? format : texture.format);\r\n const internalFormat = this._getRGBABufferInternalSizedFormat(texture.type, glformat);\r\n\r\n gl.texImage2D(target, 0, internalFormat, glformat, textureType, source as TexImageSource);\r\n\r\n if (texture.generateMipMaps) {\r\n gl.generateMipmap(target);\r\n }\r\n\r\n if (!wasPreviouslyBound) {\r\n this._bindTextureDirectly(target, null);\r\n }\r\n\r\n if (premulAlpha) {\r\n gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, 0);\r\n }\r\n\r\n texture.isReady = true;\r\n};"]}
@@ -1,6 +1,5 @@
1
1
  import { WebGPUEngine } from "../../webgpuEngine.js";
2
- WebGPUEngine.prototype.updateDynamicTexture = function (texture, canvas, invertY, premulAlpha, format, forceBindTexture) {
3
- var _this = this;
2
+ WebGPUEngine.prototype.updateDynamicTexture = function (texture, canvas, invertY, premulAlpha, format, forceBindTexture, allowGPUOptimization) {
4
3
  var _a;
5
4
  if (premulAlpha === void 0) { premulAlpha = false; }
6
5
  if (!texture) {
@@ -11,17 +10,10 @@ WebGPUEngine.prototype.updateDynamicTexture = function (texture, canvas, invertY
11
10
  if (!((_a = texture._hardwareTexture) === null || _a === void 0 ? void 0 : _a.underlyingResource)) {
12
11
  gpuTextureWrapper = this._textureHelper.createGPUTextureForInternalTexture(texture, width, height);
13
12
  }
14
- this.createImageBitmap(canvas).then(function (bitmap) {
15
- _this._textureHelper.updateTexture(bitmap, gpuTextureWrapper.underlyingResource, width, height, texture.depth, gpuTextureWrapper.format, 0, 0, invertY, premulAlpha, 0, 0, _this._uploadEncoder);
16
- if (texture.generateMipMaps) {
17
- _this._generateMipmaps(texture, _this._uploadEncoder);
18
- }
19
- texture.isReady = true;
20
- });
21
- /*this._textureHelper.updateTexture(canvas, texture, width, height, texture.depth, gpuTextureWrapper.format, 0, 0, invertY, premulAlpha, 0, 0, this._uploadEncoder);
13
+ this._textureHelper.updateTexture(canvas, texture, width, height, texture.depth, gpuTextureWrapper.format, 0, 0, invertY, premulAlpha, 0, 0, this._uploadEncoder, allowGPUOptimization);
22
14
  if (texture.generateMipMaps) {
23
15
  this._generateMipmaps(texture, this._uploadEncoder);
24
- }*/
16
+ }
25
17
  texture.isReady = true;
26
18
  };
27
19
  //# sourceMappingURL=engine.dynamicTexture.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"engine.dynamicTexture.js","sourceRoot":"","sources":["../../../../../sourceES6/core/Engines/WebGPU/Extensions/engine.dynamicTexture.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD,YAAY,CAAC,SAAS,CAAC,oBAAoB,GAAG,UAAU,OAAkC,EAAE,MAA2C,EAAE,OAAgB,EAAE,WAA4B,EAAE,MAAe,EAAE,gBAA0B;IAAtL,iBA4B7C;;IA5B0J,4BAAA,EAAA,mBAA4B;IACnL,IAAI,CAAC,OAAO,EAAE;QACV,OAAO;KACV;IAED,IAAM,KAAK,GAAG,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAEnD,IAAI,iBAAiB,GAAG,OAAO,CAAC,gBAAyC,CAAC;IAE1E,IAAI,CAAC,CAAA,MAAA,OAAO,CAAC,gBAAgB,0CAAE,kBAAkB,CAAA,EAAE;QAC/C,iBAAiB,GAAG,IAAI,CAAC,cAAc,CAAC,kCAAkC,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;KACtG;IAED,IAAI,CAAC,iBAAiB,CAAC,MAA2B,CAAC,CAAC,IAAI,CAAC,UAAC,MAAM;QAC5D,KAAI,CAAC,cAAc,CAAC,aAAa,CAAC,MAAM,EAAE,iBAAiB,CAAC,kBAAmB,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,KAAK,EAAE,iBAAiB,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,EAAE,KAAI,CAAC,cAAc,CAAC,CAAC;QAChM,IAAI,OAAO,CAAC,eAAe,EAAE;YACzB,KAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAI,CAAC,cAAc,CAAC,CAAC;SACvD;QAED,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH;;;OAGG;IAEH,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;AAC3B,CAAC,CAAC","sourcesContent":["import { InternalTexture } from \"../../../Materials/Textures/internalTexture\";\r\nimport { Nullable } from \"../../../types\";\r\nimport { WebGPUEngine } from \"../../webgpuEngine\";\r\nimport { WebGPUHardwareTexture } from \"../webgpuHardwareTexture\";\r\n\r\nWebGPUEngine.prototype.updateDynamicTexture = function (texture: Nullable<InternalTexture>, canvas: HTMLCanvasElement | OffscreenCanvas, invertY: boolean, premulAlpha: boolean = false, format?: number, forceBindTexture?: boolean): void {\r\n if (!texture) {\r\n return;\r\n }\r\n\r\n const width = canvas.width, height = canvas.height;\r\n\r\n let gpuTextureWrapper = texture._hardwareTexture as WebGPUHardwareTexture;\r\n\r\n if (!texture._hardwareTexture?.underlyingResource) {\r\n gpuTextureWrapper = this._textureHelper.createGPUTextureForInternalTexture(texture, width, height);\r\n }\r\n\r\n this.createImageBitmap(canvas as ImageBitmapSource).then((bitmap) => {\r\n this._textureHelper.updateTexture(bitmap, gpuTextureWrapper.underlyingResource!, width, height, texture.depth, gpuTextureWrapper.format, 0, 0, invertY, premulAlpha, 0, 0, this._uploadEncoder);\r\n if (texture.generateMipMaps) {\r\n this._generateMipmaps(texture, this._uploadEncoder);\r\n }\r\n\r\n texture.isReady = true;\r\n });\r\n\r\n /*this._textureHelper.updateTexture(canvas, texture, width, height, texture.depth, gpuTextureWrapper.format, 0, 0, invertY, premulAlpha, 0, 0, this._uploadEncoder);\r\n if (texture.generateMipMaps) {\r\n this._generateMipmaps(texture, this._uploadEncoder);\r\n }*/\r\n\r\n texture.isReady = true;\r\n};\r\n"]}
1
+ {"version":3,"file":"engine.dynamicTexture.js","sourceRoot":"","sources":["../../../../../sourceES6/core/Engines/WebGPU/Extensions/engine.dynamicTexture.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD,YAAY,CAAC,SAAS,CAAC,oBAAoB,GAAG,UAAU,OAAkC,EAAE,MAA2C,EAAE,OAAgB,EAAE,WAA4B,EAAE,MAAe,EAAE,gBAA0B,EAAE,oBAA8B;;IAAzG,4BAAA,EAAA,mBAA4B;IACnL,IAAI,CAAC,OAAO,EAAE;QACV,OAAO;KACV;IAED,IAAM,KAAK,GAAG,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAEnD,IAAI,iBAAiB,GAAG,OAAO,CAAC,gBAAyC,CAAC;IAE1E,IAAI,CAAC,CAAA,MAAA,OAAO,CAAC,gBAAgB,0CAAE,kBAAkB,CAAA,EAAE;QAC/C,iBAAiB,GAAG,IAAI,CAAC,cAAc,CAAC,kCAAkC,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;KACtG;IAED,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,KAAK,EAAE,iBAAiB,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,cAAc,EAAE,oBAAoB,CAAC,CAAC;IACxL,IAAI,OAAO,CAAC,eAAe,EAAE;QACzB,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;KACvD;IAED,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;AAC3B,CAAC,CAAC","sourcesContent":["import { InternalTexture } from \"../../../Materials/Textures/internalTexture\";\r\nimport { Nullable } from \"../../../types\";\r\nimport { WebGPUEngine } from \"../../webgpuEngine\";\r\nimport { WebGPUHardwareTexture } from \"../webgpuHardwareTexture\";\r\n\r\nWebGPUEngine.prototype.updateDynamicTexture = function (texture: Nullable<InternalTexture>, canvas: HTMLCanvasElement | OffscreenCanvas, invertY: boolean, premulAlpha: boolean = false, format?: number, forceBindTexture?: boolean, allowGPUOptimization?: boolean): void {\r\n if (!texture) {\r\n return;\r\n }\r\n\r\n const width = canvas.width, height = canvas.height;\r\n\r\n let gpuTextureWrapper = texture._hardwareTexture as WebGPUHardwareTexture;\r\n\r\n if (!texture._hardwareTexture?.underlyingResource) {\r\n gpuTextureWrapper = this._textureHelper.createGPUTextureForInternalTexture(texture, width, height);\r\n }\r\n\r\n this._textureHelper.updateTexture(canvas, texture, width, height, texture.depth, gpuTextureWrapper.format, 0, 0, invertY, premulAlpha, 0, 0, this._uploadEncoder, allowGPUOptimization);\r\n if (texture.generateMipMaps) {\r\n this._generateMipmaps(texture, this._uploadEncoder);\r\n }\r\n\r\n texture.isReady = true;\r\n};\r\n"]}
@@ -111,10 +111,6 @@ WebGPUEngine.prototype.updateMultipleRenderTargetTextureSampleCount = function (
111
111
  return 1;
112
112
  }
113
113
  samples = Math.min(samples, this.getCaps().maxMSAASamples);
114
- if (samples > 1) {
115
- // TODO WEBGPU for the time being, Chrome only accepts values of 1 or 4
116
- samples = 4;
117
- }
118
114
  for (var i = 0; i < count; ++i) {
119
115
  var texture = rtWrapper.textures[i];
120
116
  this._textureHelper.createMSAATexture(texture, samples);
@@ -1 +1 @@
1
- {"version":3,"file":"engine.multiRender.js","sourceRoot":"","sources":["../../../../../sourceES6/core/Engines/WebGPU/Extensions/engine.multiRender.ts"],"names":[],"mappings":"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","sourcesContent":["import { InternalTexture, InternalTextureSource } from \"../../../Materials/Textures/internalTexture\";\r\nimport { IMultiRenderTargetOptions } from \"../../../Materials/Textures/multiRenderTarget\";\r\nimport { Logger } from \"../../../Misc/logger\";\r\nimport { Nullable } from \"../../../types\";\r\n\r\nimport { TextureSize } from \"../../../Materials/Textures/textureCreationOptions\";\r\nimport { RenderTargetWrapper } from \"../../renderTargetWrapper\";\r\nimport { WebGPUEngine } from \"../../webgpuEngine\";\r\n\r\nWebGPUEngine.prototype.unBindMultiColorAttachmentFramebuffer = function (rtWrapper: RenderTargetWrapper, disableGenerateMipMaps: boolean = false, onBeforeUnbind?: () => void): void {\r\n if (onBeforeUnbind) {\r\n onBeforeUnbind();\r\n }\r\n\r\n const attachments = rtWrapper._attachments!;\r\n const count = attachments.length;\r\n\r\n if (this._currentRenderPass && this._currentRenderPass !== this._mainRenderPassWrapper.renderPass) {\r\n this._endRenderTargetRenderPass();\r\n }\r\n\r\n for (let i = 0; i < count; i++) {\r\n const texture = rtWrapper.textures![i];\r\n if (texture.generateMipMaps && !disableGenerateMipMaps && !texture.isCube) {\r\n this._generateMipmaps(texture);\r\n }\r\n }\r\n\r\n this._currentRenderTarget = null;\r\n\r\n this._mrtAttachments = [];\r\n this._cacheRenderPipeline.setMRTAttachments(this._mrtAttachments, []);\r\n this._currentRenderPass = this._mainRenderPassWrapper.renderPass;\r\n this._setDepthTextureFormat(this._mainRenderPassWrapper);\r\n this._setColorFormat(this._mainRenderPassWrapper);\r\n};\r\n\r\nWebGPUEngine.prototype.createMultipleRenderTarget = function (size: TextureSize, options: IMultiRenderTargetOptions, initializeBuffers?: boolean): RenderTargetWrapper {\r\n let generateMipMaps = false;\r\n let generateDepthBuffer = true;\r\n let generateStencilBuffer = false;\r\n let generateDepthTexture = false;\r\n let depthTextureFormat = 15;\r\n let textureCount = 1;\r\n\r\n let defaultType = 0;\r\n let defaultSamplingMode = 3;\r\n\r\n let types = new Array<number>();\r\n let samplingModes = new Array<number>();\r\n\r\n const rtWrapper = this._createHardwareRenderTargetWrapper(true, false, size);\r\n\r\n if (options !== undefined) {\r\n generateMipMaps = options.generateMipMaps === undefined ? false : options.generateMipMaps;\r\n generateDepthBuffer = options.generateDepthBuffer === undefined ? true : options.generateDepthBuffer;\r\n generateStencilBuffer = options.generateStencilBuffer === undefined ? false : options.generateStencilBuffer;\r\n generateDepthTexture = options.generateDepthTexture === undefined ? false : options.generateDepthTexture;\r\n textureCount = options.textureCount || 1;\r\n depthTextureFormat = options.depthTextureFormat ?? 15;\r\n\r\n if (options.types) {\r\n types = options.types;\r\n }\r\n if (options.samplingModes) {\r\n samplingModes = options.samplingModes;\r\n }\r\n\r\n }\r\n\r\n const width = (<{ width: number, height: number }>size).width || <number>size;\r\n const height = (<{ width: number, height: number }>size).height || <number>size;\r\n\r\n let depthStencilTexture = null;\r\n if (generateDepthBuffer || generateStencilBuffer || generateDepthTexture) {\r\n depthStencilTexture = rtWrapper.createDepthStencilTexture(0, false, generateStencilBuffer, 1, depthTextureFormat);\r\n }\r\n\r\n const textures: InternalTexture[] = [];\r\n const attachments: number[] = [];\r\n\r\n rtWrapper._generateDepthBuffer = generateDepthBuffer;\r\n rtWrapper._generateStencilBuffer = generateStencilBuffer;\r\n rtWrapper._attachments = attachments;\r\n\r\n for (let i = 0; i < textureCount; i++) {\r\n let samplingMode = samplingModes[i] || defaultSamplingMode;\r\n let type = types[i] || defaultType;\r\n\r\n if (type === 1 && !this._caps.textureFloatLinearFiltering) {\r\n // if floating point linear (gl.FLOAT) then force to NEAREST_SAMPLINGMODE\r\n samplingMode = 1;\r\n }\r\n else if (type === 2 && !this._caps.textureHalfFloatLinearFiltering) {\r\n // if floating point linear (HALF_FLOAT) then force to NEAREST_SAMPLINGMODE\r\n samplingMode = 1;\r\n }\r\n\r\n if (type === 1 && !this._caps.textureFloat) {\r\n type = 0;\r\n Logger.Warn(\"Float textures are not supported. Render target forced to TEXTURETYPE_UNSIGNED_BYTE type\");\r\n }\r\n\r\n const texture = new InternalTexture(this, InternalTextureSource.MultiRenderTarget);\r\n\r\n textures.push(texture);\r\n attachments.push(i + 1);\r\n\r\n texture.baseWidth = width;\r\n texture.baseHeight = height;\r\n texture.width = width;\r\n texture.height = height;\r\n texture.isReady = true;\r\n texture.samples = 1;\r\n texture.generateMipMaps = generateMipMaps;\r\n texture.samplingMode = samplingMode;\r\n texture.type = type;\r\n texture._cachedWrapU = 0;\r\n texture._cachedWrapV = 0;\r\n\r\n this._internalTexturesCache.push(texture);\r\n\r\n this._textureHelper.createGPUTextureForInternalTexture(texture);\r\n }\r\n\r\n if (depthStencilTexture) {\r\n depthStencilTexture.incrementReferences();\r\n textures.push(depthStencilTexture);\r\n this._internalTexturesCache.push(depthStencilTexture);\r\n }\r\n\r\n rtWrapper.setTextures(textures);\r\n\r\n return rtWrapper;\r\n};\r\n\r\nWebGPUEngine.prototype.updateMultipleRenderTargetTextureSampleCount = function (rtWrapper: Nullable<RenderTargetWrapper>, samples: number): number {\r\n if (!rtWrapper || !rtWrapper.textures || rtWrapper.textures[0].samples === samples) {\r\n return samples;\r\n }\r\n\r\n const count = rtWrapper._attachments!.length;\r\n\r\n if (count === 0) {\r\n return 1;\r\n }\r\n\r\n samples = Math.min(samples, this.getCaps().maxMSAASamples);\r\n\r\n if (samples > 1) {\r\n // TODO WEBGPU for the time being, Chrome only accepts values of 1 or 4\r\n samples = 4;\r\n }\r\n\r\n for (let i = 0; i < count; ++i) {\r\n const texture = rtWrapper.textures[i];\r\n this._textureHelper.createMSAATexture(texture, samples);\r\n texture.samples = samples;\r\n }\r\n\r\n // Note that the last texture of textures is the depth texture if the depth texture has been generated by the MRT class and so the MSAA texture\r\n // will be recreated for this texture by the loop above: in that case, there's no need to create the MSAA texture for framebuffer._depthStencilTexture\r\n // because framebuffer._depthStencilTexture is the same texture than the depth texture\r\n if (rtWrapper._depthStencilTexture && rtWrapper._depthStencilTexture !== rtWrapper.textures[rtWrapper.textures.length - 1]) {\r\n this._textureHelper.createMSAATexture(rtWrapper._depthStencilTexture, samples);\r\n rtWrapper._depthStencilTexture.samples = samples;\r\n }\r\n\r\n return samples;\r\n};\r\n\r\nWebGPUEngine.prototype.bindAttachments = function (attachments: number[]): void {\r\n if (attachments.length === 0 || !this._currentRenderTarget) {\r\n return;\r\n }\r\n\r\n this._mrtAttachments = attachments;\r\n};\r\n\r\nWebGPUEngine.prototype.buildTextureLayout = function (textureStatus: boolean[]): number[] {\r\n const result = [];\r\n\r\n for (let i = 0; i < textureStatus.length; i++) {\r\n if (textureStatus[i]) {\r\n result.push(i + 1);\r\n } else {\r\n result.push(0);\r\n }\r\n }\r\n\r\n return result;\r\n};\r\n\r\nWebGPUEngine.prototype.restoreSingleAttachment = function (): void {\r\n // nothing to do, this is done automatically in the unBindFramebuffer function\r\n};\r\n"]}
1
+ {"version":3,"file":"engine.multiRender.js","sourceRoot":"","sources":["../../../../../sourceES6/core/Engines/WebGPU/Extensions/engine.multiRender.ts"],"names":[],"mappings":"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","sourcesContent":["import { InternalTexture, InternalTextureSource } from \"../../../Materials/Textures/internalTexture\";\r\nimport { IMultiRenderTargetOptions } from \"../../../Materials/Textures/multiRenderTarget\";\r\nimport { Logger } from \"../../../Misc/logger\";\r\nimport { Nullable } from \"../../../types\";\r\n\r\nimport { TextureSize } from \"../../../Materials/Textures/textureCreationOptions\";\r\nimport { RenderTargetWrapper } from \"../../renderTargetWrapper\";\r\nimport { WebGPUEngine } from \"../../webgpuEngine\";\r\n\r\nWebGPUEngine.prototype.unBindMultiColorAttachmentFramebuffer = function (rtWrapper: RenderTargetWrapper, disableGenerateMipMaps: boolean = false, onBeforeUnbind?: () => void): void {\r\n if (onBeforeUnbind) {\r\n onBeforeUnbind();\r\n }\r\n\r\n const attachments = rtWrapper._attachments!;\r\n const count = attachments.length;\r\n\r\n if (this._currentRenderPass && this._currentRenderPass !== this._mainRenderPassWrapper.renderPass) {\r\n this._endRenderTargetRenderPass();\r\n }\r\n\r\n for (let i = 0; i < count; i++) {\r\n const texture = rtWrapper.textures![i];\r\n if (texture.generateMipMaps && !disableGenerateMipMaps && !texture.isCube) {\r\n this._generateMipmaps(texture);\r\n }\r\n }\r\n\r\n this._currentRenderTarget = null;\r\n\r\n this._mrtAttachments = [];\r\n this._cacheRenderPipeline.setMRTAttachments(this._mrtAttachments, []);\r\n this._currentRenderPass = this._mainRenderPassWrapper.renderPass;\r\n this._setDepthTextureFormat(this._mainRenderPassWrapper);\r\n this._setColorFormat(this._mainRenderPassWrapper);\r\n};\r\n\r\nWebGPUEngine.prototype.createMultipleRenderTarget = function (size: TextureSize, options: IMultiRenderTargetOptions, initializeBuffers?: boolean): RenderTargetWrapper {\r\n let generateMipMaps = false;\r\n let generateDepthBuffer = true;\r\n let generateStencilBuffer = false;\r\n let generateDepthTexture = false;\r\n let depthTextureFormat = 15;\r\n let textureCount = 1;\r\n\r\n let defaultType = 0;\r\n let defaultSamplingMode = 3;\r\n\r\n let types = new Array<number>();\r\n let samplingModes = new Array<number>();\r\n\r\n const rtWrapper = this._createHardwareRenderTargetWrapper(true, false, size);\r\n\r\n if (options !== undefined) {\r\n generateMipMaps = options.generateMipMaps === undefined ? false : options.generateMipMaps;\r\n generateDepthBuffer = options.generateDepthBuffer === undefined ? true : options.generateDepthBuffer;\r\n generateStencilBuffer = options.generateStencilBuffer === undefined ? false : options.generateStencilBuffer;\r\n generateDepthTexture = options.generateDepthTexture === undefined ? false : options.generateDepthTexture;\r\n textureCount = options.textureCount || 1;\r\n depthTextureFormat = options.depthTextureFormat ?? 15;\r\n\r\n if (options.types) {\r\n types = options.types;\r\n }\r\n if (options.samplingModes) {\r\n samplingModes = options.samplingModes;\r\n }\r\n\r\n }\r\n\r\n const width = (<{ width: number, height: number }>size).width || <number>size;\r\n const height = (<{ width: number, height: number }>size).height || <number>size;\r\n\r\n let depthStencilTexture = null;\r\n if (generateDepthBuffer || generateStencilBuffer || generateDepthTexture) {\r\n depthStencilTexture = rtWrapper.createDepthStencilTexture(0, false, generateStencilBuffer, 1, depthTextureFormat);\r\n }\r\n\r\n const textures: InternalTexture[] = [];\r\n const attachments: number[] = [];\r\n\r\n rtWrapper._generateDepthBuffer = generateDepthBuffer;\r\n rtWrapper._generateStencilBuffer = generateStencilBuffer;\r\n rtWrapper._attachments = attachments;\r\n\r\n for (let i = 0; i < textureCount; i++) {\r\n let samplingMode = samplingModes[i] || defaultSamplingMode;\r\n let type = types[i] || defaultType;\r\n\r\n if (type === 1 && !this._caps.textureFloatLinearFiltering) {\r\n // if floating point linear (gl.FLOAT) then force to NEAREST_SAMPLINGMODE\r\n samplingMode = 1;\r\n }\r\n else if (type === 2 && !this._caps.textureHalfFloatLinearFiltering) {\r\n // if floating point linear (HALF_FLOAT) then force to NEAREST_SAMPLINGMODE\r\n samplingMode = 1;\r\n }\r\n\r\n if (type === 1 && !this._caps.textureFloat) {\r\n type = 0;\r\n Logger.Warn(\"Float textures are not supported. Render target forced to TEXTURETYPE_UNSIGNED_BYTE type\");\r\n }\r\n\r\n const texture = new InternalTexture(this, InternalTextureSource.MultiRenderTarget);\r\n\r\n textures.push(texture);\r\n attachments.push(i + 1);\r\n\r\n texture.baseWidth = width;\r\n texture.baseHeight = height;\r\n texture.width = width;\r\n texture.height = height;\r\n texture.isReady = true;\r\n texture.samples = 1;\r\n texture.generateMipMaps = generateMipMaps;\r\n texture.samplingMode = samplingMode;\r\n texture.type = type;\r\n texture._cachedWrapU = 0;\r\n texture._cachedWrapV = 0;\r\n\r\n this._internalTexturesCache.push(texture);\r\n\r\n this._textureHelper.createGPUTextureForInternalTexture(texture);\r\n }\r\n\r\n if (depthStencilTexture) {\r\n depthStencilTexture.incrementReferences();\r\n textures.push(depthStencilTexture);\r\n this._internalTexturesCache.push(depthStencilTexture);\r\n }\r\n\r\n rtWrapper.setTextures(textures);\r\n\r\n return rtWrapper;\r\n};\r\n\r\nWebGPUEngine.prototype.updateMultipleRenderTargetTextureSampleCount = function (rtWrapper: Nullable<RenderTargetWrapper>, samples: number): number {\r\n if (!rtWrapper || !rtWrapper.textures || rtWrapper.textures[0].samples === samples) {\r\n return samples;\r\n }\r\n\r\n const count = rtWrapper._attachments!.length;\r\n\r\n if (count === 0) {\r\n return 1;\r\n }\r\n\r\n samples = Math.min(samples, this.getCaps().maxMSAASamples);\r\n\r\n for (let i = 0; i < count; ++i) {\r\n const texture = rtWrapper.textures[i];\r\n this._textureHelper.createMSAATexture(texture, samples);\r\n texture.samples = samples;\r\n }\r\n\r\n // Note that the last texture of textures is the depth texture if the depth texture has been generated by the MRT class and so the MSAA texture\r\n // will be recreated for this texture by the loop above: in that case, there's no need to create the MSAA texture for framebuffer._depthStencilTexture\r\n // because framebuffer._depthStencilTexture is the same texture than the depth texture\r\n if (rtWrapper._depthStencilTexture && rtWrapper._depthStencilTexture !== rtWrapper.textures[rtWrapper.textures.length - 1]) {\r\n this._textureHelper.createMSAATexture(rtWrapper._depthStencilTexture, samples);\r\n rtWrapper._depthStencilTexture.samples = samples;\r\n }\r\n\r\n return samples;\r\n};\r\n\r\nWebGPUEngine.prototype.bindAttachments = function (attachments: number[]): void {\r\n if (attachments.length === 0 || !this._currentRenderTarget) {\r\n return;\r\n }\r\n\r\n this._mrtAttachments = attachments;\r\n};\r\n\r\nWebGPUEngine.prototype.buildTextureLayout = function (textureStatus: boolean[]): number[] {\r\n const result = [];\r\n\r\n for (let i = 0; i < textureStatus.length; i++) {\r\n if (textureStatus[i]) {\r\n result.push(i + 1);\r\n } else {\r\n result.push(0);\r\n }\r\n }\r\n\r\n return result;\r\n};\r\n\r\nWebGPUEngine.prototype.restoreSingleAttachment = function (): void {\r\n // nothing to do, this is done automatically in the unBindFramebuffer function\r\n};\r\n"]}
@@ -75,10 +75,6 @@ WebGPUEngine.prototype.updateRenderTargetTextureSampleCount = function (rtWrappe
75
75
  return samples;
76
76
  }
77
77
  samples = Math.min(samples, this.getCaps().maxMSAASamples);
78
- if (samples > 1) {
79
- // TODO WEBGPU for the time being, Chrome only accepts values of 1 or 4
80
- samples = 4;
81
- }
82
78
  this._textureHelper.createMSAATexture(rtWrapper.texture, samples);
83
79
  if (rtWrapper._depthStencilTexture) {
84
80
  this._textureHelper.createMSAATexture(rtWrapper._depthStencilTexture, samples);
@@ -1 +1 @@
1
- {"version":3,"file":"engine.renderTarget.js","sourceRoot":"","sources":["../../../../../sourceES6/core/Engines/WebGPU/Extensions/engine.renderTarget.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,6CAA6C,CAAC;AAIrG,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,YAAY,CAAC,SAAS,CAAC,kCAAkC,GAAG,UAAS,OAAgB,EAAE,MAAe,EAAE,IAAiB;IACrH,IAAM,SAAS,GAAG,IAAI,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACvE,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC/C,OAAO,SAAS,CAAC;AACrB,CAAC,CAAC;AAEF,YAAY,CAAC,SAAS,CAAC,yBAAyB,GAAG,UAAU,IAAiB,EAAE,OAA8C;IAC1H,IAAM,SAAS,GAAG,IAAI,CAAC,kCAAkC,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAwB,CAAC;IAErG,IAAM,WAAW,GAAgC,EAAE,CAAC;IAEpD,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;QACtD,WAAW,CAAC,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC;QACjH,WAAW,CAAC,qBAAqB,GAAG,WAAW,CAAC,mBAAmB,IAAI,OAAO,CAAC,qBAAqB,CAAC;KACxG;SAAM;QACH,WAAW,CAAC,mBAAmB,GAAG,IAAI,CAAC;QACvC,WAAW,CAAC,qBAAqB,GAAG,KAAK,CAAC;KAC7C;IAED,IAAM,OAAO,GAAG,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,qBAAqB,CAAC,YAAY,CAAC,CAAC;IAErG,SAAS,CAAC,oBAAoB,GAAG,WAAW,CAAC,mBAAmB,CAAC;IACjE,SAAS,CAAC,sBAAsB,GAAG,WAAW,CAAC,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;IAEpF,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAE/B,IAAI,SAAS,CAAC,oBAAoB,IAAI,SAAS,CAAC,sBAAsB,EAAE;QACpE,SAAS,CAAC,yBAAyB,CAAC,CAAC,EAC7B,WAAW,CAAC,YAAY,KAAK,SAAS;YACtC,WAAW,CAAC,YAAY,KAAK,CAAC,IAAI,WAAW,CAAC,YAAY,KAAK,CAAC;YAChE,WAAW,CAAC,YAAY,KAAK,CAAC,IAAI,WAAW,CAAC,YAAY,KAAK,CAAC;YAChE,WAAW,CAAC,YAAY,KAAK,CAAC,IAAI,WAAW,CAAC,YAAY,KAAK,CAAC;YAChE,WAAW,CAAC,YAAY,KAAK,CAAC,IAAI,WAAW,CAAC,YAAY,KAAK,EAAE,EACjE,SAAS,CAAC,sBAAsB,EAChC,SAAS,CAAC,OAAO,CACxB,CAAC;KACL;IAED,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,aAAa,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE;QAC/G,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;KAClC;IAED,IAAI,CAAC,cAAc,CAAC,kCAAkC,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,CAAC,aAAa,CAAC,CAAC;IAE5H,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,aAAa,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE;QAC/G,OAAO,CAAC,eAAe,GAAG,KAAK,CAAC;KACnC;IAED,OAAO,SAAS,CAAC;AACrB,CAAC,CAAC;AAEF,YAAY,CAAC,SAAS,CAAC,0BAA0B,GAAG,UAAU,IAAiB,EAAE,OAAoC,EAAE,SAA8B;IACjJ,IAAM,eAAe,GAAG,IAAI,eAAe,CAAC,IAAI,EAAE,qBAAqB,CAAC,YAAY,CAAC,CAAC;IAEtF,IAAM,eAAe,cACjB,iBAAiB,EAAE,KAAK,EACxB,kBAAkB,EAAE,CAAC,EACrB,eAAe,EAAE,KAAK,EACtB,OAAO,EAAE,CAAC,EACV,kBAAkB,EAAE,EAAE,IACnB,OAAO,CACb,CAAC;IAEF,qHAAqH;IACrH,eAAe,CAAC,MAAM;QAClB,eAAe,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACtC,eAAe,CAAC,kBAAkB,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,kBAAkB,CAAC;IAExF,IAAI,CAAC,yBAAyB,CAAC,eAAe,EAAE,IAAI,EAAE,eAAe,CAAC,eAAe,EAAE,eAAe,CAAC,iBAAiB,EAAE,eAAe,CAAC,kBAAkB,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC;IAEvL,IAAI,CAAC,cAAc,CAAC,kCAAkC,CAAC,eAAe,CAAC,CAAC;IAExE,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAElD,OAAO,eAAe,CAAC;AAC3B,CAAC,CAAC;AAEF,YAAY,CAAC,SAAS,CAAC,yBAAyB,GAAG,UAAU,eAAgC,EAAE,IAAiB,EAAE,eAAwB,EAAE,iBAA0B,EAAE,kBAA0B,EAAE,OAAW;IAAX,wBAAA,EAAA,WAAW;IAC3M,IAAM,KAAK,GAAwD,IAAK,CAAC,KAAK,IAAY,IAAI,CAAC;IAC/F,IAAM,MAAM,GAAwD,IAAK,CAAC,MAAM,IAAY,IAAI,CAAC;IACjG,IAAM,MAAM,GAAwD,IAAK,CAAC,MAAM,IAAI,CAAC,CAAC;IAEtF,eAAe,CAAC,SAAS,GAAG,KAAK,CAAC;IAClC,eAAe,CAAC,UAAU,GAAG,MAAM,CAAC;IACpC,eAAe,CAAC,KAAK,GAAG,KAAK,CAAC;IAC9B,eAAe,CAAC,MAAM,GAAG,MAAM,CAAC;IAChC,eAAe,CAAC,SAAS,GAAG,MAAM,GAAG,CAAC,CAAC;IACvC,eAAe,CAAC,KAAK,GAAG,MAAM,CAAC;IAC/B,eAAe,CAAC,OAAO,GAAG,IAAI,CAAC;IAC/B,eAAe,CAAC,OAAO,GAAG,OAAO,CAAC;IAClC,eAAe,CAAC,eAAe,GAAG,KAAK,CAAC;IACxC,eAAe,CAAC,YAAY,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACzD,eAAe,CAAC,IAAI,GAAG,CAAC,CAAC;IACzB,eAAe,CAAC,mBAAmB,GAAG,kBAAkB,CAAC;IACzD,eAAe,CAAC,YAAY,GAAG,CAAC,CAAC;IACjC,eAAe,CAAC,YAAY,GAAG,CAAC,CAAC;AACrC,CAAC,CAAC;AAEF,YAAY,CAAC,SAAS,CAAC,oCAAoC,GAAG,UAAU,SAAwC,EAAE,OAAe;IAC7H,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,OAAO,IAAI,SAAS,CAAC,OAAO,KAAK,OAAO,EAAE;QACnE,OAAO,OAAO,CAAC;KAClB;IAED,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,cAAc,CAAC,CAAC;IAE3D,IAAI,OAAO,GAAG,CAAC,EAAE;QACb,uEAAuE;QACvE,OAAO,GAAG,CAAC,CAAC;KACf;IAED,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAElE,IAAI,SAAS,CAAC,oBAAoB,EAAE;QAChC,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,SAAS,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC;QAC/E,SAAS,CAAC,oBAAoB,CAAC,OAAO,GAAG,OAAO,CAAC;KACpD;IAED,SAAS,CAAC,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC;IAEpC,OAAO,OAAO,CAAC;AACnB,CAAC,CAAC","sourcesContent":["import { InternalTexture, InternalTextureSource } from \"../../../Materials/Textures/internalTexture\";\r\nimport { RenderTargetCreationOptions, DepthTextureCreationOptions, TextureSize } from \"../../../Materials/Textures/textureCreationOptions\";\r\nimport { Nullable } from \"../../../types\";\r\n\r\nimport { RenderTargetWrapper } from \"../../renderTargetWrapper\";\r\nimport { WebGPUEngine } from \"../../webgpuEngine\";\r\n\r\nWebGPUEngine.prototype._createHardwareRenderTargetWrapper = function(isMulti: boolean, isCube: boolean, size: TextureSize): RenderTargetWrapper {\r\n const rtWrapper = new RenderTargetWrapper(isMulti, isCube, size, this);\r\n this._renderTargetWrapperCache.push(rtWrapper);\r\n return rtWrapper;\r\n};\r\n\r\nWebGPUEngine.prototype.createRenderTargetTexture = function (size: TextureSize, options: boolean | RenderTargetCreationOptions): RenderTargetWrapper {\r\n const rtWrapper = this._createHardwareRenderTargetWrapper(false, false, size) as RenderTargetWrapper;\r\n\r\n const fullOptions: RenderTargetCreationOptions = {};\r\n\r\n if (options !== undefined && typeof options === \"object\") {\r\n fullOptions.generateDepthBuffer = options.generateDepthBuffer === undefined ? true : options.generateDepthBuffer;\r\n fullOptions.generateStencilBuffer = fullOptions.generateDepthBuffer && options.generateStencilBuffer;\r\n } else {\r\n fullOptions.generateDepthBuffer = true;\r\n fullOptions.generateStencilBuffer = false;\r\n }\r\n\r\n const texture = this._createInternalTexture(size, options, true, InternalTextureSource.RenderTarget);\r\n\r\n rtWrapper._generateDepthBuffer = fullOptions.generateDepthBuffer;\r\n rtWrapper._generateStencilBuffer = fullOptions.generateStencilBuffer ? true : false;\r\n\r\n rtWrapper.setTextures(texture);\r\n\r\n if (rtWrapper._generateDepthBuffer || rtWrapper._generateStencilBuffer) {\r\n rtWrapper.createDepthStencilTexture(0,\r\n fullOptions.samplingMode === undefined ||\r\n fullOptions.samplingMode === 2 || fullOptions.samplingMode === 2 ||\r\n fullOptions.samplingMode === 3 || fullOptions.samplingMode === 3 ||\r\n fullOptions.samplingMode === 5 || fullOptions.samplingMode === 6 ||\r\n fullOptions.samplingMode === 7 || fullOptions.samplingMode === 11,\r\n rtWrapper._generateStencilBuffer,\r\n rtWrapper.samples\r\n );\r\n }\r\n\r\n if (options !== undefined && typeof options === \"object\" && options.createMipMaps && !fullOptions.generateMipMaps) {\r\n texture.generateMipMaps = true;\r\n }\r\n\r\n this._textureHelper.createGPUTextureForInternalTexture(texture, undefined, undefined, undefined, fullOptions.creationFlags);\r\n\r\n if (options !== undefined && typeof options === \"object\" && options.createMipMaps && !fullOptions.generateMipMaps) {\r\n texture.generateMipMaps = false;\r\n }\r\n\r\n return rtWrapper;\r\n};\r\n\r\nWebGPUEngine.prototype._createDepthStencilTexture = function (size: TextureSize, options: DepthTextureCreationOptions, rtWrapper: RenderTargetWrapper): InternalTexture {\r\n const internalTexture = new InternalTexture(this, InternalTextureSource.DepthStencil);\r\n\r\n const internalOptions = {\r\n bilinearFiltering: false,\r\n comparisonFunction: 0,\r\n generateStencil: false,\r\n samples: 1,\r\n depthTextureFormat: 15,\r\n ...options\r\n };\r\n\r\n // TODO WebGPU We set the format to Depth32 if depthTextureFormat=Depth16 because Chrome does not support Depth16 yet\r\n internalTexture.format =\r\n internalOptions.generateStencil ? 13 :\r\n internalOptions.depthTextureFormat === 15 ? 14 : internalOptions.depthTextureFormat;\r\n\r\n this._setupDepthStencilTexture(internalTexture, size, internalOptions.generateStencil, internalOptions.bilinearFiltering, internalOptions.comparisonFunction, internalOptions.samples);\r\n\r\n this._textureHelper.createGPUTextureForInternalTexture(internalTexture);\r\n\r\n this._internalTexturesCache.push(internalTexture);\r\n\r\n return internalTexture;\r\n};\r\n\r\nWebGPUEngine.prototype._setupDepthStencilTexture = function (internalTexture: InternalTexture, size: TextureSize, generateStencil: boolean, bilinearFiltering: boolean, comparisonFunction: number, samples = 1): void {\r\n const width = (<{ width: number, height: number, layers?: number }>size).width || <number>size;\r\n const height = (<{ width: number, height: number, layers?: number }>size).height || <number>size;\r\n const layers = (<{ width: number, height: number, layers?: number }>size).layers || 0;\r\n\r\n internalTexture.baseWidth = width;\r\n internalTexture.baseHeight = height;\r\n internalTexture.width = width;\r\n internalTexture.height = height;\r\n internalTexture.is2DArray = layers > 0;\r\n internalTexture.depth = layers;\r\n internalTexture.isReady = true;\r\n internalTexture.samples = samples;\r\n internalTexture.generateMipMaps = false;\r\n internalTexture.samplingMode = bilinearFiltering ? 2 : 1;\r\n internalTexture.type = 1;\r\n internalTexture._comparisonFunction = comparisonFunction;\r\n internalTexture._cachedWrapU = 0;\r\n internalTexture._cachedWrapV = 0;\r\n};\r\n\r\nWebGPUEngine.prototype.updateRenderTargetTextureSampleCount = function (rtWrapper: Nullable<RenderTargetWrapper>, samples: number): number {\r\n if (!rtWrapper || !rtWrapper.texture || rtWrapper.samples === samples) {\r\n return samples;\r\n }\r\n\r\n samples = Math.min(samples, this.getCaps().maxMSAASamples);\r\n\r\n if (samples > 1) {\r\n // TODO WEBGPU for the time being, Chrome only accepts values of 1 or 4\r\n samples = 4;\r\n }\r\n\r\n this._textureHelper.createMSAATexture(rtWrapper.texture, samples);\r\n\r\n if (rtWrapper._depthStencilTexture) {\r\n this._textureHelper.createMSAATexture(rtWrapper._depthStencilTexture, samples);\r\n rtWrapper._depthStencilTexture.samples = samples;\r\n }\r\n\r\n rtWrapper.texture.samples = samples;\r\n\r\n return samples;\r\n};\r\n"]}
1
+ {"version":3,"file":"engine.renderTarget.js","sourceRoot":"","sources":["../../../../../sourceES6/core/Engines/WebGPU/Extensions/engine.renderTarget.ts"],"names":[],"mappings":"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","sourcesContent":["import { InternalTexture, InternalTextureSource } from \"../../../Materials/Textures/internalTexture\";\r\nimport { RenderTargetCreationOptions, DepthTextureCreationOptions, TextureSize } from \"../../../Materials/Textures/textureCreationOptions\";\r\nimport { Nullable } from \"../../../types\";\r\n\r\nimport { RenderTargetWrapper } from \"../../renderTargetWrapper\";\r\nimport { WebGPUEngine } from \"../../webgpuEngine\";\r\n\r\nWebGPUEngine.prototype._createHardwareRenderTargetWrapper = function(isMulti: boolean, isCube: boolean, size: TextureSize): RenderTargetWrapper {\r\n const rtWrapper = new RenderTargetWrapper(isMulti, isCube, size, this);\r\n this._renderTargetWrapperCache.push(rtWrapper);\r\n return rtWrapper;\r\n};\r\n\r\nWebGPUEngine.prototype.createRenderTargetTexture = function (size: TextureSize, options: boolean | RenderTargetCreationOptions): RenderTargetWrapper {\r\n const rtWrapper = this._createHardwareRenderTargetWrapper(false, false, size) as RenderTargetWrapper;\r\n\r\n const fullOptions: RenderTargetCreationOptions = {};\r\n\r\n if (options !== undefined && typeof options === \"object\") {\r\n fullOptions.generateDepthBuffer = options.generateDepthBuffer === undefined ? true : options.generateDepthBuffer;\r\n fullOptions.generateStencilBuffer = fullOptions.generateDepthBuffer && options.generateStencilBuffer;\r\n } else {\r\n fullOptions.generateDepthBuffer = true;\r\n fullOptions.generateStencilBuffer = false;\r\n }\r\n\r\n const texture = this._createInternalTexture(size, options, true, InternalTextureSource.RenderTarget);\r\n\r\n rtWrapper._generateDepthBuffer = fullOptions.generateDepthBuffer;\r\n rtWrapper._generateStencilBuffer = fullOptions.generateStencilBuffer ? true : false;\r\n\r\n rtWrapper.setTextures(texture);\r\n\r\n if (rtWrapper._generateDepthBuffer || rtWrapper._generateStencilBuffer) {\r\n rtWrapper.createDepthStencilTexture(0,\r\n fullOptions.samplingMode === undefined ||\r\n fullOptions.samplingMode === 2 || fullOptions.samplingMode === 2 ||\r\n fullOptions.samplingMode === 3 || fullOptions.samplingMode === 3 ||\r\n fullOptions.samplingMode === 5 || fullOptions.samplingMode === 6 ||\r\n fullOptions.samplingMode === 7 || fullOptions.samplingMode === 11,\r\n rtWrapper._generateStencilBuffer,\r\n rtWrapper.samples\r\n );\r\n }\r\n\r\n if (options !== undefined && typeof options === \"object\" && options.createMipMaps && !fullOptions.generateMipMaps) {\r\n texture.generateMipMaps = true;\r\n }\r\n\r\n this._textureHelper.createGPUTextureForInternalTexture(texture, undefined, undefined, undefined, fullOptions.creationFlags);\r\n\r\n if (options !== undefined && typeof options === \"object\" && options.createMipMaps && !fullOptions.generateMipMaps) {\r\n texture.generateMipMaps = false;\r\n }\r\n\r\n return rtWrapper;\r\n};\r\n\r\nWebGPUEngine.prototype._createDepthStencilTexture = function (size: TextureSize, options: DepthTextureCreationOptions, rtWrapper: RenderTargetWrapper): InternalTexture {\r\n const internalTexture = new InternalTexture(this, InternalTextureSource.DepthStencil);\r\n\r\n const internalOptions = {\r\n bilinearFiltering: false,\r\n comparisonFunction: 0,\r\n generateStencil: false,\r\n samples: 1,\r\n depthTextureFormat: 15,\r\n ...options\r\n };\r\n\r\n // TODO WebGPU We set the format to Depth32 if depthTextureFormat=Depth16 because Chrome does not support Depth16 yet\r\n internalTexture.format =\r\n internalOptions.generateStencil ? 13 :\r\n internalOptions.depthTextureFormat === 15 ? 14 : internalOptions.depthTextureFormat;\r\n\r\n this._setupDepthStencilTexture(internalTexture, size, internalOptions.generateStencil, internalOptions.bilinearFiltering, internalOptions.comparisonFunction, internalOptions.samples);\r\n\r\n this._textureHelper.createGPUTextureForInternalTexture(internalTexture);\r\n\r\n this._internalTexturesCache.push(internalTexture);\r\n\r\n return internalTexture;\r\n};\r\n\r\nWebGPUEngine.prototype._setupDepthStencilTexture = function (internalTexture: InternalTexture, size: TextureSize, generateStencil: boolean, bilinearFiltering: boolean, comparisonFunction: number, samples = 1): void {\r\n const width = (<{ width: number, height: number, layers?: number }>size).width || <number>size;\r\n const height = (<{ width: number, height: number, layers?: number }>size).height || <number>size;\r\n const layers = (<{ width: number, height: number, layers?: number }>size).layers || 0;\r\n\r\n internalTexture.baseWidth = width;\r\n internalTexture.baseHeight = height;\r\n internalTexture.width = width;\r\n internalTexture.height = height;\r\n internalTexture.is2DArray = layers > 0;\r\n internalTexture.depth = layers;\r\n internalTexture.isReady = true;\r\n internalTexture.samples = samples;\r\n internalTexture.generateMipMaps = false;\r\n internalTexture.samplingMode = bilinearFiltering ? 2 : 1;\r\n internalTexture.type = 1;\r\n internalTexture._comparisonFunction = comparisonFunction;\r\n internalTexture._cachedWrapU = 0;\r\n internalTexture._cachedWrapV = 0;\r\n};\r\n\r\nWebGPUEngine.prototype.updateRenderTargetTextureSampleCount = function (rtWrapper: Nullable<RenderTargetWrapper>, samples: number): number {\r\n if (!rtWrapper || !rtWrapper.texture || rtWrapper.samples === samples) {\r\n return samples;\r\n }\r\n\r\n samples = Math.min(samples, this.getCaps().maxMSAASamples);\r\n\r\n this._textureHelper.createMSAATexture(rtWrapper.texture, samples);\r\n\r\n if (rtWrapper._depthStencilTexture) {\r\n this._textureHelper.createMSAATexture(rtWrapper._depthStencilTexture, samples);\r\n rtWrapper._depthStencilTexture.samples = samples;\r\n }\r\n\r\n rtWrapper.texture.samples = samples;\r\n\r\n return samples;\r\n};\r\n"]}