@babylonjs/core 6.31.0 → 6.32.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Actions/action.js.map +1 -1
- package/Animations/animation.d.ts +8 -2
- package/Animations/animation.js +21 -13
- package/Animations/animation.js.map +1 -1
- package/Animations/runtimeAnimation.js +6 -15
- package/Animations/runtimeAnimation.js.map +1 -1
- package/Cameras/Inputs/freeCameraDeviceOrientationInput.js.map +1 -1
- package/Debug/skeletonViewer.d.ts +2 -2
- package/Debug/skeletonViewer.js +38 -12
- package/Debug/skeletonViewer.js.map +1 -1
- package/DeviceInput/InputDevices/deviceSource.js.map +1 -1
- package/DeviceInput/InputDevices/deviceTypes.js.map +1 -1
- package/DeviceInput/webDeviceInputSystem.js.map +1 -1
- package/Engines/Processors/shaderCodeNode.js.map +1 -1
- package/Engines/WebGPU/webgpuShaderProcessorsGLSL.js.map +1 -1
- package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js.map +1 -1
- package/Engines/WebGPU/webgpuTextureHelper.js.map +1 -1
- package/Engines/thinEngine.js +2 -2
- package/Engines/thinEngine.js.map +1 -1
- package/Engines/webgpuEngine.js.map +1 -1
- package/FlowGraph/Blocks/Data/Math/flowGraphMatrixBlocks.js +12 -12
- package/FlowGraph/Blocks/Data/Math/flowGraphMatrixBlocks.js.map +1 -1
- package/FlowGraph/Blocks/Data/Math/flowGraphNumberMathBlocks.js +4 -4
- package/FlowGraph/Blocks/Data/Math/flowGraphNumberMathBlocks.js.map +1 -1
- package/FlowGraph/Blocks/Data/Math/flowGraphVector2MathBlocks.js +9 -9
- package/FlowGraph/Blocks/Data/Math/flowGraphVector2MathBlocks.js.map +1 -1
- package/FlowGraph/Blocks/Data/Math/flowGraphVector3MathBlocks.js +11 -11
- package/FlowGraph/Blocks/Data/Math/flowGraphVector3MathBlocks.js.map +1 -1
- package/FlowGraph/Blocks/Data/Math/flowGraphVector4MathBlocks.js +10 -10
- package/FlowGraph/Blocks/Data/Math/flowGraphVector4MathBlocks.js.map +1 -1
- package/FlowGraph/Blocks/Data/flowGraphBinaryOperationBlock.js +2 -2
- package/FlowGraph/Blocks/Data/flowGraphBinaryOperationBlock.js.map +1 -1
- package/FlowGraph/Blocks/Data/flowGraphCachedOperationBlock.js +1 -1
- package/FlowGraph/Blocks/Data/flowGraphCachedOperationBlock.js.map +1 -1
- package/FlowGraph/Blocks/Data/flowGraphConditionalDataBlock.js +4 -4
- package/FlowGraph/Blocks/Data/flowGraphConditionalDataBlock.js.map +1 -1
- package/FlowGraph/Blocks/Data/flowGraphConstantBlock.js +1 -1
- package/FlowGraph/Blocks/Data/flowGraphConstantBlock.js.map +1 -1
- package/FlowGraph/Blocks/Data/flowGraphCoordinateTransformBlock.js +4 -4
- package/FlowGraph/Blocks/Data/flowGraphCoordinateTransformBlock.js.map +1 -1
- package/FlowGraph/Blocks/Data/flowGraphGetVariableBlock.js +2 -2
- package/FlowGraph/Blocks/Data/flowGraphGetVariableBlock.js.map +1 -1
- package/FlowGraph/Blocks/Data/flowGraphUnaryOperationBlock.js +1 -1
- package/FlowGraph/Blocks/Data/flowGraphUnaryOperationBlock.js.map +1 -1
- package/FlowGraph/Blocks/Event/flowGraphMeshPickEventBlock.d.ts +4 -4
- package/FlowGraph/Blocks/Event/flowGraphMeshPickEventBlock.js +16 -6
- package/FlowGraph/Blocks/Event/flowGraphMeshPickEventBlock.js.map +1 -1
- package/FlowGraph/Blocks/Event/flowGraphReceiveCustomEventBlock.d.ts +1 -0
- package/FlowGraph/Blocks/Event/flowGraphReceiveCustomEventBlock.js +5 -1
- package/FlowGraph/Blocks/Event/flowGraphReceiveCustomEventBlock.js.map +1 -1
- package/FlowGraph/Blocks/Execution/Animation/flowGraphPauseAnimationBlock.js +1 -1
- package/FlowGraph/Blocks/Execution/Animation/flowGraphPauseAnimationBlock.js.map +1 -1
- package/FlowGraph/Blocks/Execution/Animation/flowGraphPlayAnimationBlock.d.ts +17 -6
- package/FlowGraph/Blocks/Execution/Animation/flowGraphPlayAnimationBlock.js +16 -9
- package/FlowGraph/Blocks/Execution/Animation/flowGraphPlayAnimationBlock.js.map +1 -1
- package/FlowGraph/Blocks/Execution/Animation/flowGraphStopAnimationBlock.js +1 -1
- package/FlowGraph/Blocks/Execution/Animation/flowGraphStopAnimationBlock.js.map +1 -1
- package/FlowGraph/Blocks/Execution/Audio/flowGraphPlayAudioBlock.js +1 -1
- package/FlowGraph/Blocks/Execution/Audio/flowGraphPlayAudioBlock.js.map +1 -1
- package/FlowGraph/Blocks/Execution/Audio/flowGraphStopAudioBlock.js +1 -1
- package/FlowGraph/Blocks/Execution/Audio/flowGraphStopAudioBlock.js.map +1 -1
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphBranchBlock.js +1 -1
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphBranchBlock.js.map +1 -1
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphCounterBlock.js +1 -1
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphCounterBlock.js.map +1 -1
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphDebounceBlock.js +2 -2
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphDebounceBlock.js.map +1 -1
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphDoNBlock.js +2 -2
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphDoNBlock.js.map +1 -1
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphFlipFlopBlock.js +1 -1
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphFlipFlopBlock.js.map +1 -1
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphForLoopBlock.js +4 -4
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphForLoopBlock.js.map +1 -1
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphMultiGateBlock.d.ts +1 -0
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphMultiGateBlock.js +8 -1
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphMultiGateBlock.js.map +1 -1
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphSwitchBlock.d.ts +1 -0
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphSwitchBlock.js +5 -1
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphSwitchBlock.js.map +1 -1
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphThrottleBlock.js +2 -2
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphThrottleBlock.js.map +1 -1
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphTimerBlock.js +1 -1
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphTimerBlock.js.map +1 -1
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphWaitAllBlock.d.ts +1 -0
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphWaitAllBlock.js +4 -0
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphWaitAllBlock.js.map +1 -1
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphWhileLoopBlock.d.ts +1 -0
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphWhileLoopBlock.js +6 -1
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphWhileLoopBlock.js.map +1 -1
- package/FlowGraph/Blocks/Execution/flowGraphLogBlock.js +1 -1
- package/FlowGraph/Blocks/Execution/flowGraphLogBlock.js.map +1 -1
- package/FlowGraph/Blocks/Execution/flowGraphSendCustomEventBlock.js +2 -2
- package/FlowGraph/Blocks/Execution/flowGraphSendCustomEventBlock.js.map +1 -1
- package/FlowGraph/Blocks/Execution/flowGraphSetPropertyBlock.d.ts +8 -12
- package/FlowGraph/Blocks/Execution/flowGraphSetPropertyBlock.js +9 -19
- package/FlowGraph/Blocks/Execution/flowGraphSetPropertyBlock.js.map +1 -1
- package/FlowGraph/Blocks/Execution/flowGraphSetVariableBlock.js +2 -2
- package/FlowGraph/Blocks/Execution/flowGraphSetVariableBlock.js.map +1 -1
- package/FlowGraph/flowGraphBlock.d.ts +2 -2
- package/FlowGraph/flowGraphBlock.js +20 -4
- package/FlowGraph/flowGraphBlock.js.map +1 -1
- package/FlowGraph/flowGraphContext.d.ts +4 -4
- package/FlowGraph/flowGraphContext.js +22 -40
- package/FlowGraph/flowGraphContext.js.map +1 -1
- package/FlowGraph/flowGraphPath.d.ts +27 -0
- package/FlowGraph/flowGraphPath.js +136 -0
- package/FlowGraph/flowGraphPath.js.map +1 -0
- package/FlowGraph/flowGraphPathComponent.d.ts +42 -0
- package/FlowGraph/flowGraphPathComponent.js +51 -0
- package/FlowGraph/flowGraphPathComponent.js.map +1 -0
- package/FlowGraph/index.d.ts +1 -0
- package/FlowGraph/index.js +1 -0
- package/FlowGraph/index.js.map +1 -1
- package/Lights/Shadows/shadowGenerator.d.ts +8 -0
- package/Lights/Shadows/shadowGenerator.js +12 -0
- package/Lights/Shadows/shadowGenerator.js.map +1 -1
- package/Loading/sceneLoader.js.map +1 -1
- package/Materials/GreasedLine/greasedLineSimpleMaterial.js.map +1 -1
- package/Materials/Node/Blocks/Fragment/perturbNormalBlock.js.map +1 -1
- package/Materials/Node/Blocks/modBlock.js +1 -0
- package/Materials/Node/Blocks/modBlock.js.map +1 -1
- package/Maths/math.size.d.ts +6 -0
- package/Maths/math.size.js +8 -0
- package/Maths/math.size.js.map +1 -1
- package/Maths/math.vector.js +1 -1
- package/Maths/math.vector.js.map +1 -1
- package/Meshes/geometry.d.ts +8 -0
- package/Meshes/geometry.js +20 -1
- package/Meshes/geometry.js.map +1 -1
- package/Meshes/mesh.d.ts +8 -0
- package/Meshes/mesh.js +14 -2
- package/Meshes/mesh.js.map +1 -1
- package/Meshes/mesh.vertexData.js.map +1 -1
- package/Misc/dds.js.map +1 -1
- package/Misc/greasedLineTools.js.map +1 -1
- package/Misc/tools.js.map +1 -1
- package/PostProcesses/postProcess.d.ts +9 -1
- package/PostProcesses/postProcess.js +16 -6
- package/PostProcesses/postProcess.js.map +1 -1
- package/Rendering/geometryBufferRenderer.d.ts +6 -3
- package/Rendering/geometryBufferRenderer.js +28 -10
- package/Rendering/geometryBufferRenderer.js.map +1 -1
- package/Rendering/geometryBufferRendererSceneComponent.d.ts +5 -2
- package/Rendering/geometryBufferRendererSceneComponent.js.map +1 -1
- package/Shaders/ShadersInclude/bonesDeclaration.js +1 -1
- package/Shaders/ShadersInclude/bonesDeclaration.js.map +1 -1
- package/XR/features/WebXRRawCameraAccess.js.map +1 -1
- package/package.json +1 -1
- package/types.js.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webDeviceInputSystem.js","sourceRoot":"","sources":["../../../../dev/core/src/DeviceInput/webDeviceInputSystem.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Engine } from \"../Engines/engine\";\r\nimport type { IPointerEvent, IUIEvent } from \"../Events/deviceInputEvents\";\r\nimport { IsNavigatorAvailable } from \"../Misc/domManagement\";\r\nimport type { Observer } from \"../Misc/observable\";\r\nimport { Tools } from \"../Misc/tools\";\r\nimport type { Nullable } from \"../types\";\r\nimport { DeviceEventFactory } from \"./eventFactory\";\r\nimport { DeviceType, PointerInput } from \"./InputDevices/deviceEnums\";\r\nimport type { IDeviceInputSystem } from \"./inputInterfaces\";\r\n\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nconst MAX_KEYCODES = 255;\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nconst MAX_POINTER_INPUTS = Object.keys(PointerInput).length / 2;\r\n\r\n/** @internal */\r\nexport class WebDeviceInputSystem implements IDeviceInputSystem {\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 _metaKeys: Array<number>;\r\n private readonly _engine: Engine;\r\n private readonly _usingSafari: boolean = Tools.IsSafari();\r\n // Found solution for determining if MacOS is being used here:\r\n // https://stackoverflow.com/questions/10527983/best-way-to-detect-mac-os-x-or-windows-computers-with-javascript-or-jquery\r\n private readonly _usingMacOS: boolean = IsNavigatorAvailable() && /(Mac|iPhone|iPod|iPad)/i.test(navigator.platform);\r\n\r\n private _onDeviceConnected: (deviceType: DeviceType, deviceSlot: number) => void;\r\n private _onDeviceDisconnected: (deviceType: DeviceType, deviceSlot: number) => void;\r\n private _onInputChanged: (deviceType: DeviceType, deviceSlot: number, eventData: IUIEvent) => void;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n private _keyboardDownEvent = (evt: any) => {};\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n private _keyboardUpEvent = (evt: any) => {};\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n private _keyboardBlurEvent = (evt: any) => {};\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n private _pointerMoveEvent = (evt: any) => {};\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n private _pointerDownEvent = (evt: any) => {};\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n private _pointerUpEvent = (evt: any) => {};\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n private _pointerCancelEvent = (evt: any) => {};\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n private _pointerWheelEvent = (evt: any) => {};\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n private _pointerBlurEvent = (evt: any) => {};\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n private _pointerMacOSChromeOutEvent = (evt: any) => {};\r\n private _wheelEventName: string;\r\n private _eventsAttached: boolean = false;\r\n\r\n private _mouseId = -1;\r\n private readonly _isUsingFirefox = IsNavigatorAvailable() && navigator.userAgent && navigator.userAgent.indexOf(\"Firefox\") !== -1;\r\n private readonly _isUsingChromium = IsNavigatorAvailable() && navigator.userAgent && navigator.userAgent.indexOf(\"Chrome\") !== -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 _maxTouchPoints: number = 0;\r\n\r\n private _pointerInputClearObserver: Nullable<Observer<Engine>> = null;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n private _gamepadConnectedEvent = (evt: any) => {};\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n private _gamepadDisconnectedEvent = (evt: any) => {};\r\n\r\n private _eventPrefix: string;\r\n\r\n /**\r\n * Constructor for the WebDeviceInputSystem\r\n * @param engine Engine to reference\r\n * @param onDeviceConnected Callback to execute when device is connected\r\n * @param onDeviceDisconnected Callback to execute when device is disconnected\r\n * @param onInputChanged Callback to execute when input changes on device\r\n */\r\n constructor(\r\n engine: Engine,\r\n onDeviceConnected: (deviceType: DeviceType, deviceSlot: number) => void,\r\n onDeviceDisconnected: (deviceType: DeviceType, deviceSlot: number) => void,\r\n onInputChanged: (deviceType: DeviceType, deviceSlot: number, eventData: IUIEvent) => void\r\n ) {\r\n this._eventPrefix = Tools.GetPointerPrefix(engine);\r\n this._engine = engine;\r\n\r\n this._onDeviceConnected = onDeviceConnected;\r\n this._onDeviceDisconnected = onDeviceDisconnected;\r\n this._onInputChanged = onInputChanged;\r\n\r\n // If we need a pointerId, set one for future use\r\n this._mouseId = this._isUsingFirefox ? 0 : 1;\r\n\r\n this._enableEvents();\r\n\r\n if (this._usingMacOS) {\r\n this._metaKeys = [];\r\n }\r\n\r\n // Set callback to enable event handler switching when inputElement changes\r\n if (!this._engine._onEngineViewChanged) {\r\n this._engine._onEngineViewChanged = () => {\r\n this._enableEvents();\r\n };\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 specifying 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.DualShock && deviceType <= DeviceType.DualSense) {\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 if (inputIndex === PointerInput.Move) {\r\n Tools.Warn(`Unable to provide information for PointerInput.Move. Try using PointerInput.Horizontal or PointerInput.Vertical for move data.`);\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): boolean {\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 // Callbacks\r\n this._onDeviceConnected = () => {};\r\n this._onDeviceDisconnected = () => {};\r\n this._onInputChanged = () => {};\r\n delete this._engine._onEngineViewChanged;\r\n\r\n if (this._elementToAttachTo) {\r\n this._disableEvents();\r\n }\r\n }\r\n\r\n /**\r\n * Enable listening for user input events\r\n */\r\n private _enableEvents(): void {\r\n const inputElement = this?._engine.getInputElement();\r\n if (inputElement && (!this._eventsAttached || this._elementToAttachTo !== inputElement)) {\r\n // Remove events before adding to avoid double events or simultaneous events on multiple canvases\r\n this._disableEvents();\r\n\r\n // If the inputs array has already been created, zero it out to before setting up events\r\n if (this._inputs) {\r\n for (const inputs of this._inputs) {\r\n if (inputs) {\r\n for (const deviceSlotKey in inputs) {\r\n const deviceSlot = +deviceSlotKey;\r\n const device = inputs[deviceSlot];\r\n if (device) {\r\n for (let inputIndex = 0; inputIndex < device.length; inputIndex++) {\r\n device[inputIndex] = 0;\r\n }\r\n }\r\n }\r\n }\r\n }\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 this._eventsAttached = true;\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 /**\r\n * Disable listening for user input events\r\n */\r\n private _disableEvents(): void {\r\n if (this._elementToAttachTo) {\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 this._elementToAttachTo.removeEventListener(\"keydown\", this._keyboardDownEvent);\r\n this._elementToAttachTo.removeEventListener(\"keyup\", this._keyboardUpEvent);\r\n\r\n // Pointer Events\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._eventPrefix + \"cancel\", this._pointerCancelEvent);\r\n this._elementToAttachTo.removeEventListener(this._wheelEventName, this._pointerWheelEvent);\r\n if (this._usingMacOS && this._isUsingChromium) {\r\n this._elementToAttachTo.removeEventListener(\"lostpointercapture\", this._pointerMacOSChromeOutEvent);\r\n }\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 if (this._pointerInputClearObserver) {\r\n this._engine.onEndFrameObservable.remove(this._pointerInputClearObserver);\r\n }\r\n\r\n this._eventsAttached = false;\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(): void {\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 (typeof matchMedia === \"function\" && matchMedia(\"(pointer:fine)\").matches) {\r\n // This will provide a dummy value for the cursor position and is expected to be overridden 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): void {\r\n const deviceType = this._getGamepadDeviceType(gamepad.id);\r\n const deviceSlot = gamepad.index;\r\n\r\n this._gamepads = this._gamepads || new Array<DeviceType>(gamepad.index + 1);\r\n this._registerDevice(deviceType, deviceSlot, gamepad.buttons.length + gamepad.axes.length);\r\n\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): void {\r\n if (!this._pointerActive) {\r\n this._pointerActive = true;\r\n }\r\n this._registerDevice(deviceType, deviceSlot, 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 specifying 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): void {\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 device.fill(0);\r\n\r\n this._inputs[deviceType][deviceSlot] = device;\r\n this._onDeviceConnected(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 specifying device type\r\n * @param deviceSlot \"Slot\" or index that device is referenced in\r\n */\r\n private _unregisterDevice(deviceType: DeviceType, deviceSlot: number): void {\r\n if (this._inputs[deviceType][deviceSlot]) {\r\n delete this._inputs[deviceType][deviceSlot];\r\n this._onDeviceDisconnected(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(): void {\r\n this._keyboardDownEvent = (evt) => {\r\n if (!this._keyboardActive) {\r\n this._keyboardActive = true;\r\n this._registerDevice(DeviceType.Keyboard, 0, 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 const deviceEvent = evt as IUIEvent;\r\n deviceEvent.inputIndex = evt.keyCode;\r\n\r\n if (this._usingMacOS && evt.metaKey && evt.key !== \"Meta\") {\r\n if (!this._metaKeys.includes(evt.keyCode)) {\r\n this._metaKeys.push(evt.keyCode);\r\n }\r\n }\r\n\r\n this._onInputChanged(DeviceType.Keyboard, 0, 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, 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 const deviceEvent = evt as IUIEvent;\r\n deviceEvent.inputIndex = evt.keyCode;\r\n\r\n if (this._usingMacOS && evt.key === \"Meta\" && this._metaKeys.length > 0) {\r\n for (const keyCode of this._metaKeys) {\r\n const deviceEvent: IUIEvent = DeviceEventFactory.CreateDeviceEvent(DeviceType.Keyboard, 0, keyCode, 0, this, this._elementToAttachTo);\r\n kbKey[keyCode] = 0;\r\n this._onInputChanged(DeviceType.Keyboard, 0, deviceEvent);\r\n }\r\n this._metaKeys.splice(0, this._metaKeys.length);\r\n }\r\n\r\n this._onInputChanged(DeviceType.Keyboard, 0, deviceEvent);\r\n }\r\n };\r\n\r\n this._keyboardBlurEvent = () => {\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 deviceEvent: IUIEvent = DeviceEventFactory.CreateDeviceEvent(DeviceType.Keyboard, 0, i, 0, this, this._elementToAttachTo);\r\n\r\n this._onInputChanged(DeviceType.Keyboard, 0, deviceEvent);\r\n }\r\n }\r\n if (this._usingMacOS) {\r\n this._metaKeys.splice(0, this._metaKeys.length);\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(): void {\r\n // If maxTouchPoints is defined, use that value. Otherwise, allow for a minimum for supported gestures like pinch\r\n this._maxTouchPoints = (IsNavigatorAvailable() && navigator.maxTouchPoints) || 2;\r\n if (!this._activeTouchIds) {\r\n this._activeTouchIds = new Array<number>(this._maxTouchPoints);\r\n }\r\n\r\n for (let i = 0; i < this._maxTouchPoints; i++) {\r\n this._activeTouchIds[i] = -1;\r\n }\r\n\r\n this._pointerMoveEvent = (evt) => {\r\n const deviceType = this._getPointerType(evt);\r\n let deviceSlot = deviceType === DeviceType.Mouse ? 0 : this._activeTouchIds.indexOf(evt.pointerId);\r\n\r\n // In the event that we're gettting pointermove events from touch inputs that we aren't tracking,\r\n // look for an available slot and retroactively connect it.\r\n if (deviceType === DeviceType.Touch && deviceSlot === -1) {\r\n const idx = this._activeTouchIds.indexOf(-1);\r\n\r\n if (idx >= 0) {\r\n deviceSlot = idx;\r\n this._activeTouchIds[idx] = evt.pointerId;\r\n // Because this is a \"new\" input, inform the connected callback\r\n this._onDeviceConnected(deviceType, deviceSlot);\r\n } else {\r\n // We can't find an open slot to store new pointer so just return (can only support max number of touches)\r\n Tools.Warn(`Max number of touches exceeded. Ignoring touches in excess of ${this._maxTouchPoints}`);\r\n return;\r\n }\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 deviceEvent = evt as IPointerEvent;\r\n deviceEvent.inputIndex = PointerInput.Move;\r\n\r\n pointer[PointerInput.Horizontal] = evt.clientX;\r\n pointer[PointerInput.Vertical] = evt.clientY;\r\n\r\n // For touches that aren't started with a down, we need to set the button state to 1\r\n if (deviceType === DeviceType.Touch && pointer[PointerInput.LeftClick] === 0) {\r\n pointer[PointerInput.LeftClick] = 1;\r\n }\r\n\r\n if (evt.pointerId === undefined) {\r\n evt.pointerId = this._mouseId;\r\n }\r\n\r\n this._onInputChanged(deviceType, deviceSlot, 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 pointer[evt.button + 2] = pointer[evt.button + 2] ? 0 : 1; // Reverse state of button if evt.button has value\r\n this._onInputChanged(deviceType, deviceSlot, 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 const idx = this._activeTouchIds.indexOf(-1);\r\n\r\n if (idx >= 0) {\r\n deviceSlot = idx;\r\n this._activeTouchIds[idx] = evt.pointerId;\r\n } else {\r\n // We can't find an open slot to store new pointer so just return (can only support max number of touches)\r\n Tools.Warn(`Max number of touches exceeded. Ignoring touches in excess of ${this._maxTouchPoints}`);\r\n return;\r\n }\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 } else if (deviceType === DeviceType.Touch) {\r\n this._onDeviceConnected(deviceType, deviceSlot);\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\r\n if (deviceType === DeviceType.Mouse) {\r\n // Mouse; Set pointerId if undefined\r\n if (evt.pointerId === undefined) {\r\n evt.pointerId = this._mouseId;\r\n }\r\n\r\n if (!document.pointerLockElement) {\r\n try {\r\n this._elementToAttachTo.setPointerCapture(this._mouseId);\r\n } catch (e) {\r\n // DO NOTHING\r\n }\r\n }\r\n } else {\r\n // 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 } 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 const deviceEvent = evt as IUIEvent;\r\n\r\n // NOTE: The +2 used here to is because PointerInput has the same value progression for its mouse buttons as PointerEvent.button\r\n // However, we have our X and Y values front-loaded to group together the touch inputs but not break this progression\r\n // EG. ([X, Y, Left-click], Middle-click, etc...)\r\n deviceEvent.inputIndex = evt.button + 2;\r\n\r\n this._onInputChanged(deviceType, deviceSlot, deviceEvent);\r\n\r\n if (previousHorizontal !== evt.clientX || previousVertical !== evt.clientY) {\r\n deviceEvent.inputIndex = PointerInput.Move;\r\n this._onInputChanged(deviceType, deviceSlot, deviceEvent);\r\n }\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 if (deviceType === DeviceType.Touch) {\r\n // If we're getting a pointerup event for a touch that isn't active, just return.\r\n if (deviceSlot === -1) {\r\n return;\r\n } else {\r\n this._activeTouchIds[deviceSlot] = -1;\r\n }\r\n }\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\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 const deviceEvent = evt as IUIEvent;\r\n\r\n if (evt.pointerId === undefined) {\r\n evt.pointerId = this._mouseId;\r\n }\r\n\r\n if (previousHorizontal !== evt.clientX || previousVertical !== evt.clientY) {\r\n deviceEvent.inputIndex = PointerInput.Move;\r\n this._onInputChanged(deviceType, deviceSlot, deviceEvent);\r\n }\r\n\r\n // NOTE: The +2 used here to is because PointerInput has the same value progression for its mouse buttons as PointerEvent.button\r\n // However, we have our X and Y values front-loaded to group together the touch inputs but not break this progression\r\n // EG. ([X, Y, Left-click], Middle-click, etc...)\r\n deviceEvent.inputIndex = 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 } else if (evt.pointerId && this._elementToAttachTo.hasPointerCapture?.(evt.pointerId)) {\r\n this._elementToAttachTo.releasePointerCapture(evt.pointerId);\r\n }\r\n\r\n this._onInputChanged(deviceType, deviceSlot, deviceEvent);\r\n\r\n if (deviceType === DeviceType.Touch) {\r\n this._onDeviceDisconnected(deviceType, deviceSlot);\r\n }\r\n }\r\n };\r\n\r\n this._pointerCancelEvent = (evt) => {\r\n if (evt.pointerType === \"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 inputIndex = PointerInput.LeftClick; inputIndex <= PointerInput.BrowserForward; inputIndex++) {\r\n if (pointer[inputIndex] === 1) {\r\n pointer[inputIndex] = 0;\r\n\r\n const deviceEvent: IUIEvent = DeviceEventFactory.CreateDeviceEvent(DeviceType.Mouse, 0, inputIndex, 0, this, this._elementToAttachTo);\r\n\r\n this._onInputChanged(DeviceType.Mouse, 0, deviceEvent);\r\n }\r\n }\r\n } else {\r\n const deviceSlot = this._activeTouchIds.indexOf(evt.pointerId);\r\n\r\n // If we're getting a pointercancel event for a touch that isn't active, just return\r\n if (deviceSlot === -1) {\r\n return;\r\n }\r\n\r\n if (this._elementToAttachTo.hasPointerCapture?.(evt.pointerId)) {\r\n this._elementToAttachTo.releasePointerCapture(evt.pointerId);\r\n }\r\n\r\n this._inputs[DeviceType.Touch][deviceSlot][PointerInput.LeftClick] = 0;\r\n\r\n const deviceEvent: IUIEvent = DeviceEventFactory.CreateDeviceEvent(\r\n DeviceType.Touch,\r\n deviceSlot,\r\n PointerInput.LeftClick,\r\n 0,\r\n this,\r\n this._elementToAttachTo,\r\n evt.pointerId\r\n );\r\n\r\n this._onInputChanged(DeviceType.Touch, deviceSlot, deviceEvent);\r\n\r\n this._activeTouchIds[deviceSlot] = -1;\r\n this._onDeviceDisconnected(DeviceType.Touch, deviceSlot);\r\n }\r\n };\r\n\r\n // Set Wheel Event Name, code originally from scene.inputManager\r\n this._wheelEventName =\r\n \"onwheel\" in document.createElement(\"div\")\r\n ? \"wheel\" // Modern browsers support \"wheel\"\r\n : (<any>document).onmousewheel !== undefined\r\n ? \"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.defineProperty({}, \"passive\", {\r\n get: function () {\r\n passiveSupported = true;\r\n },\r\n });\r\n\r\n this._elementToAttachTo.addEventListener(\"test\", noop, options);\r\n this._elementToAttachTo.removeEventListener(\"test\", noop, options);\r\n } catch (e) {\r\n /* */\r\n }\r\n\r\n this._pointerBlurEvent = () => {\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 inputIndex = PointerInput.LeftClick; inputIndex <= PointerInput.BrowserForward; inputIndex++) {\r\n if (pointer[inputIndex] === 1) {\r\n pointer[inputIndex] = 0;\r\n\r\n const deviceEvent: IUIEvent = DeviceEventFactory.CreateDeviceEvent(DeviceType.Mouse, 0, inputIndex, 0, this, this._elementToAttachTo);\r\n\r\n this._onInputChanged(DeviceType.Mouse, 0, 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 for (let deviceSlot = 0; deviceSlot < this._activeTouchIds.length; deviceSlot++) {\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 (pointerId !== -1 && pointer[deviceSlot]?.[PointerInput.LeftClick] === 1) {\r\n pointer[deviceSlot][PointerInput.LeftClick] = 0;\r\n\r\n const deviceEvent: IUIEvent = DeviceEventFactory.CreateDeviceEvent(\r\n DeviceType.Touch,\r\n deviceSlot,\r\n PointerInput.LeftClick,\r\n 0,\r\n this,\r\n this._elementToAttachTo,\r\n pointerId\r\n );\r\n\r\n this._onInputChanged(DeviceType.Touch, deviceSlot, deviceEvent);\r\n\r\n this._activeTouchIds[deviceSlot] = -1;\r\n this._onDeviceDisconnected(DeviceType.Touch, deviceSlot);\r\n }\r\n }\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, MAX_POINTER_INPUTS);\r\n }\r\n\r\n const pointer = this._inputs[deviceType][deviceSlot];\r\n if (pointer) {\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 const deviceEvent = evt as IUIEvent;\r\n // By default, there is no pointerId for mouse wheel events so we'll add one here\r\n // This logic was originally in the InputManager but was added here to make the\r\n // InputManager more platform-agnostic\r\n if (evt.pointerId === undefined) {\r\n evt.pointerId = this._mouseId;\r\n }\r\n\r\n if (pointer[PointerInput.MouseWheelX] !== 0) {\r\n deviceEvent.inputIndex = PointerInput.MouseWheelX;\r\n this._onInputChanged(deviceType, deviceSlot, deviceEvent);\r\n }\r\n if (pointer[PointerInput.MouseWheelY] !== 0) {\r\n deviceEvent.inputIndex = PointerInput.MouseWheelY;\r\n this._onInputChanged(deviceType, deviceSlot, deviceEvent);\r\n }\r\n if (pointer[PointerInput.MouseWheelZ] !== 0) {\r\n deviceEvent.inputIndex = PointerInput.MouseWheelZ;\r\n this._onInputChanged(deviceType, deviceSlot, deviceEvent);\r\n }\r\n }\r\n };\r\n\r\n // Workaround for MacOS Chromium Browsers for lost pointer capture bug\r\n if (this._usingMacOS && this._isUsingChromium) {\r\n this._pointerMacOSChromeOutEvent = (evt) => {\r\n if (evt.buttons > 1) {\r\n this._pointerCancelEvent(evt);\r\n }\r\n };\r\n this._elementToAttachTo.addEventListener(\"lostpointercapture\", this._pointerMacOSChromeOutEvent);\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(this._eventPrefix + \"cancel\", this._pointerCancelEvent);\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 }\r\n });\r\n }\r\n\r\n /**\r\n * Handle all actions that come from gamepad interaction\r\n */\r\n private _handleGamepadActions(): void {\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 specifying 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): void {\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 } 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) {\r\n // DualShock 4 Gamepad\r\n return deviceName.indexOf(\"0ce6\") !== -1 ? DeviceType.DualSense : DeviceType.DualShock;\r\n } else if (deviceName.indexOf(\"Xbox One\") !== -1 || deviceName.search(\"Xbox 360\") !== -1 || deviceName.search(\"xinput\") !== -1) {\r\n // Xbox Gamepad\r\n return DeviceType.Xbox;\r\n } else if (deviceName.indexOf(\"057e\") !== -1) {\r\n // 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"]}
|
|
1
|
+
{"version":3,"file":"webDeviceInputSystem.js","sourceRoot":"","sources":["../../../../dev/core/src/DeviceInput/webDeviceInputSystem.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Engine } from \"../Engines/engine\";\r\nimport type { IPointerEvent, IUIEvent } from \"../Events/deviceInputEvents\";\r\nimport { IsNavigatorAvailable } from \"../Misc/domManagement\";\r\nimport type { Observer } from \"../Misc/observable\";\r\nimport { Tools } from \"../Misc/tools\";\r\nimport type { Nullable } from \"../types\";\r\nimport { DeviceEventFactory } from \"./eventFactory\";\r\nimport { DeviceType, PointerInput } from \"./InputDevices/deviceEnums\";\r\nimport type { IDeviceInputSystem } from \"./inputInterfaces\";\r\n\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nconst MAX_KEYCODES = 255;\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nconst MAX_POINTER_INPUTS = Object.keys(PointerInput).length / 2;\r\n\r\n/** @internal */\r\nexport class WebDeviceInputSystem implements IDeviceInputSystem {\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 _metaKeys: Array<number>;\r\n private readonly _engine: Engine;\r\n private readonly _usingSafari: boolean = Tools.IsSafari();\r\n // Found solution for determining if MacOS is being used here:\r\n // https://stackoverflow.com/questions/10527983/best-way-to-detect-mac-os-x-or-windows-computers-with-javascript-or-jquery\r\n private readonly _usingMacOS: boolean = IsNavigatorAvailable() && /(Mac|iPhone|iPod|iPad)/i.test(navigator.platform);\r\n\r\n private _onDeviceConnected: (deviceType: DeviceType, deviceSlot: number) => void;\r\n private _onDeviceDisconnected: (deviceType: DeviceType, deviceSlot: number) => void;\r\n private _onInputChanged: (deviceType: DeviceType, deviceSlot: number, eventData: IUIEvent) => void;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n private _keyboardDownEvent = (evt: any) => {};\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n private _keyboardUpEvent = (evt: any) => {};\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n private _keyboardBlurEvent = (evt: any) => {};\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n private _pointerMoveEvent = (evt: any) => {};\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n private _pointerDownEvent = (evt: any) => {};\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n private _pointerUpEvent = (evt: any) => {};\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n private _pointerCancelEvent = (evt: any) => {};\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n private _pointerWheelEvent = (evt: any) => {};\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n private _pointerBlurEvent = (evt: any) => {};\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n private _pointerMacOSChromeOutEvent = (evt: any) => {};\r\n private _wheelEventName: string;\r\n private _eventsAttached: boolean = false;\r\n\r\n private _mouseId = -1;\r\n private readonly _isUsingFirefox = IsNavigatorAvailable() && navigator.userAgent && navigator.userAgent.indexOf(\"Firefox\") !== -1;\r\n private readonly _isUsingChromium = IsNavigatorAvailable() && navigator.userAgent && navigator.userAgent.indexOf(\"Chrome\") !== -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 _maxTouchPoints: number = 0;\r\n\r\n private _pointerInputClearObserver: Nullable<Observer<Engine>> = null;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n private _gamepadConnectedEvent = (evt: any) => {};\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n private _gamepadDisconnectedEvent = (evt: any) => {};\r\n\r\n private _eventPrefix: string;\r\n\r\n /**\r\n * Constructor for the WebDeviceInputSystem\r\n * @param engine Engine to reference\r\n * @param onDeviceConnected Callback to execute when device is connected\r\n * @param onDeviceDisconnected Callback to execute when device is disconnected\r\n * @param onInputChanged Callback to execute when input changes on device\r\n */\r\n constructor(\r\n engine: Engine,\r\n onDeviceConnected: (deviceType: DeviceType, deviceSlot: number) => void,\r\n onDeviceDisconnected: (deviceType: DeviceType, deviceSlot: number) => void,\r\n onInputChanged: (deviceType: DeviceType, deviceSlot: number, eventData: IUIEvent) => void\r\n ) {\r\n this._eventPrefix = Tools.GetPointerPrefix(engine);\r\n this._engine = engine;\r\n\r\n this._onDeviceConnected = onDeviceConnected;\r\n this._onDeviceDisconnected = onDeviceDisconnected;\r\n this._onInputChanged = onInputChanged;\r\n\r\n // If we need a pointerId, set one for future use\r\n this._mouseId = this._isUsingFirefox ? 0 : 1;\r\n\r\n this._enableEvents();\r\n\r\n if (this._usingMacOS) {\r\n this._metaKeys = [];\r\n }\r\n\r\n // Set callback to enable event handler switching when inputElement changes\r\n if (!this._engine._onEngineViewChanged) {\r\n this._engine._onEngineViewChanged = () => {\r\n this._enableEvents();\r\n };\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 specifying 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.DualShock && deviceType <= DeviceType.DualSense) {\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 if (inputIndex === PointerInput.Move) {\r\n Tools.Warn(`Unable to provide information for PointerInput.Move. Try using PointerInput.Horizontal or PointerInput.Vertical for move data.`);\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): boolean {\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 // Callbacks\r\n this._onDeviceConnected = () => {};\r\n this._onDeviceDisconnected = () => {};\r\n this._onInputChanged = () => {};\r\n delete this._engine._onEngineViewChanged;\r\n\r\n if (this._elementToAttachTo) {\r\n this._disableEvents();\r\n }\r\n }\r\n\r\n /**\r\n * Enable listening for user input events\r\n */\r\n private _enableEvents(): void {\r\n const inputElement = this?._engine.getInputElement();\r\n if (inputElement && (!this._eventsAttached || this._elementToAttachTo !== inputElement)) {\r\n // Remove events before adding to avoid double events or simultaneous events on multiple canvases\r\n this._disableEvents();\r\n\r\n // If the inputs array has already been created, zero it out to before setting up events\r\n if (this._inputs) {\r\n for (const inputs of this._inputs) {\r\n if (inputs) {\r\n for (const deviceSlotKey in inputs) {\r\n const deviceSlot = +deviceSlotKey;\r\n const device = inputs[deviceSlot];\r\n if (device) {\r\n for (let inputIndex = 0; inputIndex < device.length; inputIndex++) {\r\n device[inputIndex] = 0;\r\n }\r\n }\r\n }\r\n }\r\n }\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 this._eventsAttached = true;\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 /**\r\n * Disable listening for user input events\r\n */\r\n private _disableEvents(): void {\r\n if (this._elementToAttachTo) {\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 this._elementToAttachTo.removeEventListener(\"keydown\", this._keyboardDownEvent);\r\n this._elementToAttachTo.removeEventListener(\"keyup\", this._keyboardUpEvent);\r\n\r\n // Pointer Events\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._eventPrefix + \"cancel\", this._pointerCancelEvent);\r\n this._elementToAttachTo.removeEventListener(this._wheelEventName, this._pointerWheelEvent);\r\n if (this._usingMacOS && this._isUsingChromium) {\r\n this._elementToAttachTo.removeEventListener(\"lostpointercapture\", this._pointerMacOSChromeOutEvent);\r\n }\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 if (this._pointerInputClearObserver) {\r\n this._engine.onEndFrameObservable.remove(this._pointerInputClearObserver);\r\n }\r\n\r\n this._eventsAttached = false;\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(): void {\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 (typeof matchMedia === \"function\" && matchMedia(\"(pointer:fine)\").matches) {\r\n // This will provide a dummy value for the cursor position and is expected to be overridden 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): void {\r\n const deviceType = this._getGamepadDeviceType(gamepad.id);\r\n const deviceSlot = gamepad.index;\r\n\r\n this._gamepads = this._gamepads || new Array<DeviceType>(gamepad.index + 1);\r\n this._registerDevice(deviceType, deviceSlot, gamepad.buttons.length + gamepad.axes.length);\r\n\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): void {\r\n if (!this._pointerActive) {\r\n this._pointerActive = true;\r\n }\r\n this._registerDevice(deviceType, deviceSlot, 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 specifying 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): void {\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 device.fill(0);\r\n\r\n this._inputs[deviceType][deviceSlot] = device;\r\n this._onDeviceConnected(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 specifying device type\r\n * @param deviceSlot \"Slot\" or index that device is referenced in\r\n */\r\n private _unregisterDevice(deviceType: DeviceType, deviceSlot: number): void {\r\n if (this._inputs[deviceType][deviceSlot]) {\r\n delete this._inputs[deviceType][deviceSlot];\r\n this._onDeviceDisconnected(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(): void {\r\n this._keyboardDownEvent = (evt) => {\r\n if (!this._keyboardActive) {\r\n this._keyboardActive = true;\r\n this._registerDevice(DeviceType.Keyboard, 0, 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 const deviceEvent = evt as IUIEvent;\r\n deviceEvent.inputIndex = evt.keyCode;\r\n\r\n if (this._usingMacOS && evt.metaKey && evt.key !== \"Meta\") {\r\n if (!this._metaKeys.includes(evt.keyCode)) {\r\n this._metaKeys.push(evt.keyCode);\r\n }\r\n }\r\n\r\n this._onInputChanged(DeviceType.Keyboard, 0, 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, 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 const deviceEvent = evt as IUIEvent;\r\n deviceEvent.inputIndex = evt.keyCode;\r\n\r\n if (this._usingMacOS && evt.key === \"Meta\" && this._metaKeys.length > 0) {\r\n for (const keyCode of this._metaKeys) {\r\n const deviceEvent: IUIEvent = DeviceEventFactory.CreateDeviceEvent(DeviceType.Keyboard, 0, keyCode, 0, this, this._elementToAttachTo);\r\n kbKey[keyCode] = 0;\r\n this._onInputChanged(DeviceType.Keyboard, 0, deviceEvent);\r\n }\r\n this._metaKeys.splice(0, this._metaKeys.length);\r\n }\r\n\r\n this._onInputChanged(DeviceType.Keyboard, 0, deviceEvent);\r\n }\r\n };\r\n\r\n this._keyboardBlurEvent = () => {\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 deviceEvent: IUIEvent = DeviceEventFactory.CreateDeviceEvent(DeviceType.Keyboard, 0, i, 0, this, this._elementToAttachTo);\r\n\r\n this._onInputChanged(DeviceType.Keyboard, 0, deviceEvent);\r\n }\r\n }\r\n if (this._usingMacOS) {\r\n this._metaKeys.splice(0, this._metaKeys.length);\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(): void {\r\n // If maxTouchPoints is defined, use that value. Otherwise, allow for a minimum for supported gestures like pinch\r\n this._maxTouchPoints = (IsNavigatorAvailable() && navigator.maxTouchPoints) || 2;\r\n if (!this._activeTouchIds) {\r\n this._activeTouchIds = new Array<number>(this._maxTouchPoints);\r\n }\r\n\r\n for (let i = 0; i < this._maxTouchPoints; i++) {\r\n this._activeTouchIds[i] = -1;\r\n }\r\n\r\n this._pointerMoveEvent = (evt) => {\r\n const deviceType = this._getPointerType(evt);\r\n let deviceSlot = deviceType === DeviceType.Mouse ? 0 : this._activeTouchIds.indexOf(evt.pointerId);\r\n\r\n // In the event that we're gettting pointermove events from touch inputs that we aren't tracking,\r\n // look for an available slot and retroactively connect it.\r\n if (deviceType === DeviceType.Touch && deviceSlot === -1) {\r\n const idx = this._activeTouchIds.indexOf(-1);\r\n\r\n if (idx >= 0) {\r\n deviceSlot = idx;\r\n this._activeTouchIds[idx] = evt.pointerId;\r\n // Because this is a \"new\" input, inform the connected callback\r\n this._onDeviceConnected(deviceType, deviceSlot);\r\n } else {\r\n // We can't find an open slot to store new pointer so just return (can only support max number of touches)\r\n Tools.Warn(`Max number of touches exceeded. Ignoring touches in excess of ${this._maxTouchPoints}`);\r\n return;\r\n }\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 deviceEvent = evt as IPointerEvent;\r\n deviceEvent.inputIndex = PointerInput.Move;\r\n\r\n pointer[PointerInput.Horizontal] = evt.clientX;\r\n pointer[PointerInput.Vertical] = evt.clientY;\r\n\r\n // For touches that aren't started with a down, we need to set the button state to 1\r\n if (deviceType === DeviceType.Touch && pointer[PointerInput.LeftClick] === 0) {\r\n pointer[PointerInput.LeftClick] = 1;\r\n }\r\n\r\n if (evt.pointerId === undefined) {\r\n evt.pointerId = this._mouseId;\r\n }\r\n\r\n this._onInputChanged(deviceType, deviceSlot, 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 pointer[evt.button + 2] = pointer[evt.button + 2] ? 0 : 1; // Reverse state of button if evt.button has value\r\n this._onInputChanged(deviceType, deviceSlot, 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 const idx = this._activeTouchIds.indexOf(-1);\r\n\r\n if (idx >= 0) {\r\n deviceSlot = idx;\r\n this._activeTouchIds[idx] = evt.pointerId;\r\n } else {\r\n // We can't find an open slot to store new pointer so just return (can only support max number of touches)\r\n Tools.Warn(`Max number of touches exceeded. Ignoring touches in excess of ${this._maxTouchPoints}`);\r\n return;\r\n }\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 } else if (deviceType === DeviceType.Touch) {\r\n this._onDeviceConnected(deviceType, deviceSlot);\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\r\n if (deviceType === DeviceType.Mouse) {\r\n // Mouse; Set pointerId if undefined\r\n if (evt.pointerId === undefined) {\r\n evt.pointerId = this._mouseId;\r\n }\r\n\r\n if (!document.pointerLockElement) {\r\n try {\r\n this._elementToAttachTo.setPointerCapture(this._mouseId);\r\n } catch (e) {\r\n // DO NOTHING\r\n }\r\n }\r\n } else {\r\n // 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 } 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 const deviceEvent = evt as IUIEvent;\r\n\r\n // NOTE: The +2 used here to is because PointerInput has the same value progression for its mouse buttons as PointerEvent.button\r\n // However, we have our X and Y values front-loaded to group together the touch inputs but not break this progression\r\n // EG. ([X, Y, Left-click], Middle-click, etc...)\r\n deviceEvent.inputIndex = evt.button + 2;\r\n\r\n this._onInputChanged(deviceType, deviceSlot, deviceEvent);\r\n\r\n if (previousHorizontal !== evt.clientX || previousVertical !== evt.clientY) {\r\n deviceEvent.inputIndex = PointerInput.Move;\r\n this._onInputChanged(deviceType, deviceSlot, deviceEvent);\r\n }\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 if (deviceType === DeviceType.Touch) {\r\n // If we're getting a pointerup event for a touch that isn't active, just return.\r\n if (deviceSlot === -1) {\r\n return;\r\n } else {\r\n this._activeTouchIds[deviceSlot] = -1;\r\n }\r\n }\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\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 const deviceEvent = evt as IUIEvent;\r\n\r\n if (evt.pointerId === undefined) {\r\n evt.pointerId = this._mouseId;\r\n }\r\n\r\n if (previousHorizontal !== evt.clientX || previousVertical !== evt.clientY) {\r\n deviceEvent.inputIndex = PointerInput.Move;\r\n this._onInputChanged(deviceType, deviceSlot, deviceEvent);\r\n }\r\n\r\n // NOTE: The +2 used here to is because PointerInput has the same value progression for its mouse buttons as PointerEvent.button\r\n // However, we have our X and Y values front-loaded to group together the touch inputs but not break this progression\r\n // EG. ([X, Y, Left-click], Middle-click, etc...)\r\n deviceEvent.inputIndex = 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 } else if (evt.pointerId && this._elementToAttachTo.hasPointerCapture?.(evt.pointerId)) {\r\n this._elementToAttachTo.releasePointerCapture(evt.pointerId);\r\n }\r\n\r\n this._onInputChanged(deviceType, deviceSlot, deviceEvent);\r\n\r\n if (deviceType === DeviceType.Touch) {\r\n this._onDeviceDisconnected(deviceType, deviceSlot);\r\n }\r\n }\r\n };\r\n\r\n this._pointerCancelEvent = (evt) => {\r\n if (evt.pointerType === \"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 inputIndex = PointerInput.LeftClick; inputIndex <= PointerInput.BrowserForward; inputIndex++) {\r\n if (pointer[inputIndex] === 1) {\r\n pointer[inputIndex] = 0;\r\n\r\n const deviceEvent: IUIEvent = DeviceEventFactory.CreateDeviceEvent(DeviceType.Mouse, 0, inputIndex, 0, this, this._elementToAttachTo);\r\n\r\n this._onInputChanged(DeviceType.Mouse, 0, deviceEvent);\r\n }\r\n }\r\n } else {\r\n const deviceSlot = this._activeTouchIds.indexOf(evt.pointerId);\r\n\r\n // If we're getting a pointercancel event for a touch that isn't active, just return\r\n if (deviceSlot === -1) {\r\n return;\r\n }\r\n\r\n if (this._elementToAttachTo.hasPointerCapture?.(evt.pointerId)) {\r\n this._elementToAttachTo.releasePointerCapture(evt.pointerId);\r\n }\r\n\r\n this._inputs[DeviceType.Touch][deviceSlot][PointerInput.LeftClick] = 0;\r\n\r\n const deviceEvent: IUIEvent = DeviceEventFactory.CreateDeviceEvent(\r\n DeviceType.Touch,\r\n deviceSlot,\r\n PointerInput.LeftClick,\r\n 0,\r\n this,\r\n this._elementToAttachTo,\r\n evt.pointerId\r\n );\r\n\r\n this._onInputChanged(DeviceType.Touch, deviceSlot, deviceEvent);\r\n\r\n this._activeTouchIds[deviceSlot] = -1;\r\n this._onDeviceDisconnected(DeviceType.Touch, deviceSlot);\r\n }\r\n };\r\n\r\n // Set Wheel Event Name, code originally from scene.inputManager\r\n this._wheelEventName =\r\n \"onwheel\" in document.createElement(\"div\")\r\n ? \"wheel\" // Modern browsers support \"wheel\"\r\n : (<any>document).onmousewheel !== undefined\r\n ? \"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.defineProperty({}, \"passive\", {\r\n get: function () {\r\n passiveSupported = true;\r\n },\r\n });\r\n\r\n this._elementToAttachTo.addEventListener(\"test\", noop, options);\r\n this._elementToAttachTo.removeEventListener(\"test\", noop, options);\r\n } catch (e) {\r\n /* */\r\n }\r\n\r\n this._pointerBlurEvent = () => {\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 inputIndex = PointerInput.LeftClick; inputIndex <= PointerInput.BrowserForward; inputIndex++) {\r\n if (pointer[inputIndex] === 1) {\r\n pointer[inputIndex] = 0;\r\n\r\n const deviceEvent: IUIEvent = DeviceEventFactory.CreateDeviceEvent(DeviceType.Mouse, 0, inputIndex, 0, this, this._elementToAttachTo);\r\n\r\n this._onInputChanged(DeviceType.Mouse, 0, 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 for (let deviceSlot = 0; deviceSlot < this._activeTouchIds.length; deviceSlot++) {\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 (pointerId !== -1 && pointer[deviceSlot]?.[PointerInput.LeftClick] === 1) {\r\n pointer[deviceSlot][PointerInput.LeftClick] = 0;\r\n\r\n const deviceEvent: IUIEvent = DeviceEventFactory.CreateDeviceEvent(\r\n DeviceType.Touch,\r\n deviceSlot,\r\n PointerInput.LeftClick,\r\n 0,\r\n this,\r\n this._elementToAttachTo,\r\n pointerId\r\n );\r\n\r\n this._onInputChanged(DeviceType.Touch, deviceSlot, deviceEvent);\r\n\r\n this._activeTouchIds[deviceSlot] = -1;\r\n this._onDeviceDisconnected(DeviceType.Touch, deviceSlot);\r\n }\r\n }\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, MAX_POINTER_INPUTS);\r\n }\r\n\r\n const pointer = this._inputs[deviceType][deviceSlot];\r\n if (pointer) {\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 const deviceEvent = evt as IUIEvent;\r\n // By default, there is no pointerId for mouse wheel events so we'll add one here\r\n // This logic was originally in the InputManager but was added here to make the\r\n // InputManager more platform-agnostic\r\n if (evt.pointerId === undefined) {\r\n evt.pointerId = this._mouseId;\r\n }\r\n\r\n if (pointer[PointerInput.MouseWheelX] !== 0) {\r\n deviceEvent.inputIndex = PointerInput.MouseWheelX;\r\n this._onInputChanged(deviceType, deviceSlot, deviceEvent);\r\n }\r\n if (pointer[PointerInput.MouseWheelY] !== 0) {\r\n deviceEvent.inputIndex = PointerInput.MouseWheelY;\r\n this._onInputChanged(deviceType, deviceSlot, deviceEvent);\r\n }\r\n if (pointer[PointerInput.MouseWheelZ] !== 0) {\r\n deviceEvent.inputIndex = PointerInput.MouseWheelZ;\r\n this._onInputChanged(deviceType, deviceSlot, deviceEvent);\r\n }\r\n }\r\n };\r\n\r\n // Workaround for MacOS Chromium Browsers for lost pointer capture bug\r\n if (this._usingMacOS && this._isUsingChromium) {\r\n this._pointerMacOSChromeOutEvent = (evt) => {\r\n if (evt.buttons > 1) {\r\n this._pointerCancelEvent(evt);\r\n }\r\n };\r\n this._elementToAttachTo.addEventListener(\"lostpointercapture\", this._pointerMacOSChromeOutEvent);\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(this._eventPrefix + \"cancel\", this._pointerCancelEvent);\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 }\r\n });\r\n }\r\n\r\n /**\r\n * Handle all actions that come from gamepad interaction\r\n */\r\n private _handleGamepadActions(): void {\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 specifying 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): void {\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 } 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) {\r\n // DualShock 4 Gamepad\r\n return deviceName.indexOf(\"0ce6\") !== -1 ? DeviceType.DualSense : DeviceType.DualShock;\r\n } else if (deviceName.indexOf(\"Xbox One\") !== -1 || deviceName.search(\"Xbox 360\") !== -1 || deviceName.search(\"xinput\") !== -1) {\r\n // Xbox Gamepad\r\n return DeviceType.Xbox;\r\n } else if (deviceName.indexOf(\"057e\") !== -1) {\r\n // 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"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shaderCodeNode.js","sourceRoot":"","sources":["../../../../../dev/core/src/Engines/Processors/shaderCodeNode.ts"],"names":[],"mappings":"AAEA,MAAM,2BAA2B,GAAG,WAAW,CAAC;AAChD,MAAM,yBAAyB,GAAG,SAAS,CAAC;AAE5C,gBAAgB;AAChB,MAAM,OAAO,cAAc;IAA3B;QAEI,aAAQ,GAAqB,EAAE,CAAC;IAoFpC,CAAC;IAhFG,6DAA6D;IAC7D,OAAO,CAAC,aAAwC;QAC5C,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,OAAO,CAAC,aAAwC,EAAE,OAA0B;;QACxE,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,IAAI,CAAC,IAAI,EAAE;YACX,IAAI,KAAK,GAAW,IAAI,CAAC,IAAI,CAAC;YAC9B,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;YACpC,IAAI,SAAS,EAAE;gBACX,+GAA+G;gBAC/G,IAAI,SAAS,CAAC,aAAa,EAAE;oBACzB,KAAK,GAAG,SAAS,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;iBACzF;gBAED,MAAM,gBAAgB,GAAG,MAAA,MAAA,OAAO,CAAC,SAAS,0CAAE,oBAAoB,mCAAI,2BAA2B,CAAC;gBAChG,MAAM,cAAc,GAChB,OAAO,CAAC,UAAU,KAAI,MAAA,OAAO,CAAC,SAAS,0CAAE,0BAA0B,CAAA;oBAC/D,CAAC,CAAC,MAAA,OAAO,CAAC,SAAS,0CAAE,0BAA0B;oBAC/C,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,KAAI,MAAA,OAAO,CAAC,SAAS,0CAAE,wBAAwB,CAAA;
|
|
1
|
+
{"version":3,"file":"shaderCodeNode.js","sourceRoot":"","sources":["../../../../../dev/core/src/Engines/Processors/shaderCodeNode.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ProcessingOptions } from \"./shaderProcessingOptions\";\r\n\r\nconst defaultAttributeKeywordName = \"attribute\";\r\nconst defaultVaryingKeywordName = \"varying\";\r\n\r\n/** @internal */\r\nexport class ShaderCodeNode {\r\n line: string;\r\n children: ShaderCodeNode[] = [];\r\n additionalDefineKey?: string;\r\n additionalDefineValue?: string;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n isValid(preprocessors: { [key: string]: string }): boolean {\r\n return true;\r\n }\r\n\r\n process(preprocessors: { [key: string]: string }, options: ProcessingOptions): string {\r\n let result = \"\";\r\n if (this.line) {\r\n let value: string = this.line;\r\n const processor = options.processor;\r\n if (processor) {\r\n // This must be done before other replacements to avoid mistakenly changing something that was already changed.\r\n if (processor.lineProcessor) {\r\n value = processor.lineProcessor(value, options.isFragment, options.processingContext);\r\n }\r\n\r\n const attributeKeyword = options.processor?.attributeKeywordName ?? defaultAttributeKeywordName;\r\n const varyingKeyword =\r\n options.isFragment && options.processor?.varyingFragmentKeywordName\r\n ? options.processor?.varyingFragmentKeywordName\r\n : !options.isFragment && options.processor?.varyingVertexKeywordName\r\n ? options.processor?.varyingVertexKeywordName\r\n : defaultVaryingKeywordName;\r\n\r\n if (!options.isFragment && processor.attributeProcessor && this.line.startsWith(attributeKeyword)) {\r\n value = processor.attributeProcessor(this.line, preprocessors, options.processingContext);\r\n } else if (\r\n processor.varyingProcessor &&\r\n (processor.varyingCheck?.(this.line, options.isFragment) || (!processor.varyingCheck && this.line.startsWith(varyingKeyword)))\r\n ) {\r\n value = processor.varyingProcessor(this.line, options.isFragment, preprocessors, options.processingContext);\r\n } else if (processor.uniformProcessor && processor.uniformRegexp && processor.uniformRegexp.test(this.line)) {\r\n if (!options.lookForClosingBracketForUniformBuffer) {\r\n value = processor.uniformProcessor(this.line, options.isFragment, preprocessors, options.processingContext);\r\n }\r\n } else if (processor.uniformBufferProcessor && processor.uniformBufferRegexp && processor.uniformBufferRegexp.test(this.line)) {\r\n if (!options.lookForClosingBracketForUniformBuffer) {\r\n value = processor.uniformBufferProcessor(this.line, options.isFragment, options.processingContext);\r\n options.lookForClosingBracketForUniformBuffer = true;\r\n }\r\n } else if (processor.textureProcessor && processor.textureRegexp && processor.textureRegexp.test(this.line)) {\r\n value = processor.textureProcessor(this.line, options.isFragment, preprocessors, options.processingContext);\r\n } else if ((processor.uniformProcessor || processor.uniformBufferProcessor) && this.line.startsWith(\"uniform\") && !options.lookForClosingBracketForUniformBuffer) {\r\n const regex = /uniform\\s+(?:(?:highp)?|(?:lowp)?)\\s*(\\S+)\\s+(\\S+)\\s*;/;\r\n\r\n if (regex.test(this.line)) {\r\n // uniform\r\n if (processor.uniformProcessor) {\r\n value = processor.uniformProcessor(this.line, options.isFragment, preprocessors, options.processingContext);\r\n }\r\n } else {\r\n // Uniform buffer\r\n if (processor.uniformBufferProcessor) {\r\n value = processor.uniformBufferProcessor(this.line, options.isFragment, options.processingContext);\r\n options.lookForClosingBracketForUniformBuffer = true;\r\n }\r\n }\r\n }\r\n\r\n if (options.lookForClosingBracketForUniformBuffer && this.line.indexOf(\"}\") !== -1) {\r\n options.lookForClosingBracketForUniformBuffer = false;\r\n if (processor.endOfUniformBufferProcessor) {\r\n value = processor.endOfUniformBufferProcessor(this.line, options.isFragment, options.processingContext);\r\n }\r\n }\r\n }\r\n\r\n result += value + \"\\n\";\r\n }\r\n\r\n this.children.forEach((child) => {\r\n result += child.process(preprocessors, options);\r\n });\r\n\r\n if (this.additionalDefineKey) {\r\n preprocessors[this.additionalDefineKey] = this.additionalDefineValue || \"true\";\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webgpuShaderProcessorsGLSL.js","sourceRoot":"","sources":["../../../../../dev/core/src/Engines/WebGPU/webgpuShaderProcessorsGLSL.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable babylonjs/available */\r\n/* eslint-disable jsdoc/require-jsdoc */\r\nimport type { Nullable } from \"../../types\";\r\nimport type { ShaderProcessingContext } from \"../Processors/shaderProcessingOptions\";\r\nimport type { WebGPUBufferDescription } from \"./webgpuShaderProcessingContext\";\r\nimport { WebGPUShaderProcessingContext } from \"./webgpuShaderProcessingContext\";\r\nimport * as WebGPUConstants from \"./webgpuConstants\";\r\nimport { Logger } from \"../../Misc/logger\";\r\nimport type { ThinEngine } from \"../thinEngine\";\r\nimport { WebGPUShaderProcessor } from \"./webgpuShaderProcessor\";\r\nimport { ShaderLanguage } from \"../../Materials/shaderLanguage\";\r\n\r\n/** @internal */\r\nexport class WebGPUShaderProcessorGLSL extends WebGPUShaderProcessor {\r\n protected _missingVaryings: Array<string> = [];\r\n protected _textureArrayProcessing: Array<string> = [];\r\n protected _preProcessors: { [key: string]: string };\r\n protected _vertexIsGLES3: boolean = false;\r\n protected _fragmentIsGLES3: boolean = false;\r\n\r\n public shaderLanguage = ShaderLanguage.GLSL;\r\n public parseGLES3 = true;\r\n public attributeKeywordName: string | undefined;\r\n public varyingVertexKeywordName: string | undefined;\r\n public varyingFragmentKeywordName: string | undefined;\r\n\r\n protected _getArraySize(name: string, type: string, preProcessors: { [key: string]: string }): [string, string, number] {\r\n let length = 0;\r\n const startArray = name.indexOf(\"[\");\r\n const endArray = name.indexOf(\"]\");\r\n if (startArray > 0 && endArray > 0) {\r\n const lengthInString = name.substring(startArray + 1, endArray);\r\n length = +lengthInString;\r\n if (isNaN(length)) {\r\n length = +preProcessors[lengthInString.trim()];\r\n }\r\n name = name.substr(0, startArray);\r\n }\r\n return [name, type, length];\r\n }\r\n\r\n public initializeShaders(processingContext: Nullable<ShaderProcessingContext>): void {\r\n this._webgpuProcessingContext = processingContext as WebGPUShaderProcessingContext;\r\n\r\n this._missingVaryings.length = 0;\r\n this._textureArrayProcessing.length = 0;\r\n this.attributeKeywordName = undefined;\r\n this.varyingVertexKeywordName = undefined;\r\n this.varyingFragmentKeywordName = undefined;\r\n }\r\n\r\n public preProcessShaderCode(code: string, isFragment: boolean): string {\r\n const ubDeclaration = `// Internals UBO\\nuniform ${WebGPUShaderProcessor.InternalsUBOName} {\\nfloat yFactor_;\\nfloat textureOutputHeight_;\\n};\\n`;\r\n const alreadyInjected = code.indexOf(\"// Internals UBO\") !== -1;\r\n\r\n if (isFragment) {\r\n this._fragmentIsGLES3 = code.indexOf(\"#version 3\") !== -1;\r\n if (this._fragmentIsGLES3) {\r\n this.varyingFragmentKeywordName = \"in\";\r\n }\r\n return alreadyInjected ? code : ubDeclaration + \"##INJECTCODE##\\n\" + code;\r\n }\r\n\r\n this._vertexIsGLES3 = code.indexOf(\"#version 3\") !== -1;\r\n if (this._vertexIsGLES3) {\r\n this.attributeKeywordName = \"in\";\r\n this.varyingVertexKeywordName = \"out\";\r\n }\r\n return alreadyInjected ? code : ubDeclaration + code;\r\n }\r\n\r\n public varyingCheck(varying: string, isFragment: boolean) {\r\n const outRegex = /(flat\\s)?\\s*\\bout\\b/;\r\n const inRegex = /(flat\\s)?\\s*\\bin\\b/;\r\n const varyingRegex = /(flat\\s)?\\s*\\bvarying\\b/;\r\n\r\n const regex = isFragment && this._fragmentIsGLES3 ? inRegex : !isFragment && this._vertexIsGLES3 ? outRegex : varyingRegex;\r\n\r\n return regex.test(varying);\r\n }\r\n\r\n public varyingProcessor(varying: string, isFragment: boolean, preProcessors: { [key: string]: string }) {\r\n this._preProcessors = preProcessors;\r\n\r\n const outRegex = /\\s*(flat)?\\s*out\\s+(?:(?:highp)?|(?:lowp)?)\\s*(\\S+)\\s+(\\S+)\\s*;/gm;\r\n const inRegex = /\\s*(flat)?\\s*in\\s+(?:(?:highp)?|(?:lowp)?)\\s*(\\S+)\\s+(\\S+)\\s*;/gm;\r\n const varyingRegex = /\\s*(flat)?\\s*varying\\s+(?:(?:highp)?|(?:lowp)?)\\s*(\\S+)\\s+(\\S+)\\s*;/gm;\r\n\r\n const regex = isFragment && this._fragmentIsGLES3 ? inRegex : !isFragment && this._vertexIsGLES3 ? outRegex : varyingRegex;\r\n const match = regex.exec(varying);\r\n if (match !== null) {\r\n const interpolationQualifier = match[1] ?? \"\";\r\n const varyingType = match[2];\r\n const name = match[3];\r\n let location: number;\r\n if (isFragment) {\r\n location = this._webgpuProcessingContext.availableVaryings[name];\r\n this._missingVaryings[location] = \"\";\r\n if (location === undefined) {\r\n Logger.Warn(`Invalid fragment shader: The varying named \"${name}\" is not declared in the vertex shader! This declaration will be ignored.`);\r\n }\r\n } else {\r\n location = this._webgpuProcessingContext.getVaryingNextLocation(varyingType, this._getArraySize(name, varyingType, preProcessors)[2]);\r\n this._webgpuProcessingContext.availableVaryings[name] = location;\r\n this._missingVaryings[location] = `layout(location = ${location}) ${interpolationQualifier} in ${varyingType} ${name};`;\r\n }\r\n\r\n varying = varying.replace(\r\n match[0],\r\n location === undefined ? \"\" : `layout(location = ${location}) ${interpolationQualifier} ${isFragment ? \"in\" : \"out\"} ${varyingType} ${name};`\r\n );\r\n }\r\n return varying;\r\n }\r\n\r\n public attributeProcessor(attribute: string, preProcessors: { [key: string]: string }) {\r\n this._preProcessors = preProcessors;\r\n\r\n const inRegex = /\\s*in\\s+(\\S+)\\s+(\\S+)\\s*;/gm;\r\n const attribRegex = /\\s*attribute\\s+(\\S+)\\s+(\\S+)\\s*;/gm;\r\n\r\n const regex = this._vertexIsGLES3 ? inRegex : attribRegex;\r\n const match = regex.exec(attribute);\r\n if (match !== null) {\r\n const attributeType = match[1];\r\n const name = match[2];\r\n const location = this._webgpuProcessingContext.getAttributeNextLocation(attributeType, this._getArraySize(name, attributeType, preProcessors)[2]);\r\n\r\n this._webgpuProcessingContext.availableAttributes[name] = location;\r\n this._webgpuProcessingContext.orderedAttributes[location] = name;\r\n\r\n const numComponents = this.vertexBufferKindToNumberOfComponents[name];\r\n if (numComponents !== undefined) {\r\n // Special case for an int/ivecX vertex buffer that is used as a float/vecX attribute in the shader.\r\n const newType = numComponents < 0 ? (numComponents === -1 ? \"int\" : \"ivec\" + -numComponents) : numComponents === 1 ? \"uint\" : \"uvec\" + numComponents;\r\n const newName = `_int_${name}_`;\r\n\r\n attribute = attribute.replace(match[0], `layout(location = ${location}) in ${newType} ${newName}; ${attributeType} ${name} = ${attributeType}(${newName});`);\r\n } else {\r\n attribute = attribute.replace(match[0], `layout(location = ${location}) in ${attributeType} ${name};`);\r\n }\r\n }\r\n return attribute;\r\n }\r\n\r\n public uniformProcessor(uniform: string, isFragment: boolean, preProcessors: { [key: string]: string }): string {\r\n this._preProcessors = preProcessors;\r\n\r\n const uniformRegex = /\\s*uniform\\s+(?:(?:highp)?|(?:lowp)?)\\s*(\\S+)\\s+(\\S+)\\s*;/gm;\r\n\r\n const match = uniformRegex.exec(uniform);\r\n if (match !== null) {\r\n let uniformType = match[1];\r\n let name = match[2];\r\n\r\n if (uniformType.indexOf(\"sampler\") === 0 || uniformType.indexOf(\"sampler\") === 1) {\r\n let arraySize = 0; // 0 means the texture is not declared as an array\r\n\r\n [name, uniformType, arraySize] = this._getArraySize(name, uniformType, preProcessors);\r\n\r\n let textureInfo = this._webgpuProcessingContext.availableTextures[name];\r\n if (!textureInfo) {\r\n textureInfo = {\r\n autoBindSampler: true,\r\n isTextureArray: arraySize > 0,\r\n isStorageTexture: false,\r\n textures: [],\r\n sampleType: WebGPUConstants.TextureSampleType.Float,\r\n };\r\n for (let i = 0; i < (arraySize || 1); ++i) {\r\n textureInfo.textures.push(this._webgpuProcessingContext.getNextFreeUBOBinding());\r\n }\r\n }\r\n\r\n const samplerType = WebGPUShaderProcessor._SamplerTypeByWebGLSamplerType[uniformType] ?? \"sampler\";\r\n const isComparisonSampler = !!WebGPUShaderProcessor._IsComparisonSamplerByWebGPUSamplerType[samplerType];\r\n const samplerBindingType = isComparisonSampler ? WebGPUConstants.SamplerBindingType.Comparison : WebGPUConstants.SamplerBindingType.Filtering;\r\n const samplerName = name + WebGPUShaderProcessor.AutoSamplerSuffix;\r\n\r\n let samplerInfo = this._webgpuProcessingContext.availableSamplers[samplerName];\r\n if (!samplerInfo) {\r\n samplerInfo = {\r\n binding: this._webgpuProcessingContext.getNextFreeUBOBinding(),\r\n type: samplerBindingType,\r\n };\r\n }\r\n\r\n const componentType = uniformType.charAt(0) === \"u\" ? \"u\" : uniformType.charAt(0) === \"i\" ? \"i\" : \"\";\r\n\r\n if (componentType) {\r\n uniformType = uniformType.substr(1);\r\n }\r\n\r\n const sampleType = isComparisonSampler\r\n ? WebGPUConstants.TextureSampleType.Depth\r\n : componentType === \"u\"\r\n ? WebGPUConstants.TextureSampleType.Uint\r\n : componentType === \"i\"\r\n ? WebGPUConstants.TextureSampleType.Sint\r\n : WebGPUConstants.TextureSampleType.Float;\r\n\r\n textureInfo.sampleType = sampleType;\r\n\r\n const isTextureArray = arraySize > 0;\r\n const samplerGroupIndex = samplerInfo.binding.groupIndex;\r\n const samplerBindingIndex = samplerInfo.binding.bindingIndex;\r\n const samplerFunction = WebGPUShaderProcessor._SamplerFunctionByWebGLSamplerType[uniformType];\r\n const textureType = WebGPUShaderProcessor._TextureTypeByWebGLSamplerType[uniformType];\r\n const textureDimension = WebGPUShaderProcessor._GpuTextureViewDimensionByWebGPUTextureType[textureType];\r\n\r\n // Manage textures and samplers.\r\n if (!isTextureArray) {\r\n arraySize = 1;\r\n uniform = `layout(set = ${samplerGroupIndex}, binding = ${samplerBindingIndex}) uniform ${samplerType} ${samplerName};\r\n layout(set = ${textureInfo.textures[0].groupIndex}, binding = ${textureInfo.textures[0].bindingIndex}) uniform ${componentType}${textureType} ${name}Texture;\r\n #define ${name} ${componentType}${samplerFunction}(${name}Texture, ${samplerName})`;\r\n } else {\r\n const layouts = [];\r\n layouts.push(`layout(set = ${samplerGroupIndex}, binding = ${samplerBindingIndex}) uniform ${componentType}${samplerType} ${samplerName};`);\r\n uniform = `\\n`;\r\n for (let i = 0; i < arraySize; ++i) {\r\n const textureSetIndex = textureInfo.textures[i].groupIndex;\r\n const textureBindingIndex = textureInfo.textures[i].bindingIndex;\r\n\r\n layouts.push(`layout(set = ${textureSetIndex}, binding = ${textureBindingIndex}) uniform ${textureType} ${name}Texture${i};`);\r\n\r\n uniform += `${i > 0 ? \"\\n\" : \"\"}#define ${name}${i} ${componentType}${samplerFunction}(${name}Texture${i}, ${samplerName})`;\r\n }\r\n uniform = layouts.join(\"\\n\") + uniform;\r\n this._textureArrayProcessing.push(name);\r\n }\r\n\r\n this._webgpuProcessingContext.availableTextures[name] = textureInfo;\r\n this._webgpuProcessingContext.availableSamplers[samplerName] = samplerInfo;\r\n\r\n this._addSamplerBindingDescription(samplerName, samplerInfo, !isFragment);\r\n\r\n for (let i = 0; i < arraySize; ++i) {\r\n this._addTextureBindingDescription(name, textureInfo, i, textureDimension, null, !isFragment);\r\n }\r\n } else {\r\n this._addUniformToLeftOverUBO(name, uniformType, preProcessors);\r\n uniform = \"\";\r\n }\r\n }\r\n return uniform;\r\n }\r\n\r\n public uniformBufferProcessor(uniformBuffer: string, isFragment: boolean): string {\r\n const uboRegex = /uniform\\s+(\\w+)/gm;\r\n\r\n const match = uboRegex.exec(uniformBuffer);\r\n if (match !== null) {\r\n const name = match[1];\r\n\r\n let uniformBufferInfo = this._webgpuProcessingContext.availableBuffers[name];\r\n if (!uniformBufferInfo) {\r\n const knownUBO = WebGPUShaderProcessingContext.KnownUBOs[name];\r\n\r\n let binding;\r\n if (knownUBO && knownUBO.binding.groupIndex !== -1) {\r\n binding = knownUBO.binding;\r\n } else {\r\n binding = this._webgpuProcessingContext.getNextFreeUBOBinding();\r\n }\r\n\r\n uniformBufferInfo = { binding };\r\n this._webgpuProcessingContext.availableBuffers[name] = uniformBufferInfo;\r\n }\r\n\r\n this._addBufferBindingDescription(name, uniformBufferInfo, WebGPUConstants.BufferBindingType.Uniform, !isFragment);\r\n\r\n uniformBuffer = uniformBuffer.replace(\"uniform\", `layout(set = ${uniformBufferInfo.binding.groupIndex}, binding = ${uniformBufferInfo.binding.bindingIndex}) uniform`);\r\n }\r\n return uniformBuffer;\r\n }\r\n\r\n public postProcessor(code: string, defines: string[], isFragment: boolean, processingContext: Nullable<ShaderProcessingContext>, engine: ThinEngine) {\r\n const hasDrawBuffersExtension = code.search(/#extension.+GL_EXT_draw_buffers.+require/) !== -1;\r\n\r\n // Remove extensions\r\n const regex = /#extension.+(GL_OVR_multiview2|GL_OES_standard_derivatives|GL_EXT_shader_texture_lod|GL_EXT_frag_depth|GL_EXT_draw_buffers).+(enable|require)/g;\r\n code = code.replace(regex, \"\");\r\n\r\n // Replace instructions\r\n code = code.replace(/texture2D\\s*\\(/g, \"texture(\");\r\n if (isFragment) {\r\n const hasFragCoord = code.indexOf(\"gl_FragCoord\") >= 0;\r\n const fragCoordCode = `\r\n glFragCoord_ = gl_FragCoord;\r\n if (yFactor_ == 1.) {\r\n glFragCoord_.y = textureOutputHeight_ - glFragCoord_.y;\r\n }\r\n `;\r\n\r\n const injectCode = hasFragCoord ? \"vec4 glFragCoord_;\\n\" : \"\";\r\n const hasOutput = code.search(/layout *\\(location *= *0\\) *out/g) !== -1;\r\n\r\n code = code.replace(/texture2DLodEXT\\s*\\(/g, \"textureLod(\");\r\n code = code.replace(/textureCubeLodEXT\\s*\\(/g, \"textureLod(\");\r\n code = code.replace(/textureCube\\s*\\(/g, \"texture(\");\r\n code = code.replace(/gl_FragDepthEXT/g, \"gl_FragDepth\");\r\n code = code.replace(/gl_FragColor/g, \"glFragColor\");\r\n code = code.replace(/gl_FragData/g, \"glFragData\");\r\n code = code.replace(/gl_FragCoord/g, \"glFragCoord_\");\r\n if (!this._fragmentIsGLES3) {\r\n code = code.replace(/void\\s+?main\\s*\\(/g, (hasDrawBuffersExtension || hasOutput ? \"\" : \"layout(location = 0) out vec4 glFragColor;\\n\") + \"void main(\");\r\n } else {\r\n const match = /^\\s*out\\s+\\S+\\s+\\S+\\s*;/gm.exec(code);\r\n if (match !== null) {\r\n code = code.substring(0, match.index) + \"layout(location = 0) \" + code.substring(match.index);\r\n }\r\n }\r\n code = code.replace(/dFdy/g, \"(-yFactor_)*dFdy\"); // will also handle dFdyCoarse and dFdyFine\r\n code = code.replace(\"##INJECTCODE##\", injectCode);\r\n\r\n if (hasFragCoord) {\r\n code = this._injectStartingAndEndingCode(code, \"void main\", fragCoordCode);\r\n }\r\n } else {\r\n code = code.replace(/gl_InstanceID/g, \"gl_InstanceIndex\");\r\n code = code.replace(/gl_VertexID/g, \"gl_VertexIndex\");\r\n const hasMultiviewExtension = defines.indexOf(\"#define MULTIVIEW\") !== -1;\r\n if (hasMultiviewExtension) {\r\n return \"#extension GL_OVR_multiview2 : require\\nlayout (num_views = 2) in;\\n\" + code;\r\n }\r\n }\r\n\r\n // Flip Y + convert z range from [-1,1] to [0,1]\r\n if (!isFragment) {\r\n const lastClosingCurly = code.lastIndexOf(\"}\");\r\n code = code.substring(0, lastClosingCurly);\r\n code += \"gl_Position.y *= yFactor_;\\n\";\r\n if (!engine.isNDCHalfZRange) {\r\n code += \"gl_Position.z = (gl_Position.z + gl_Position.w) / 2.0;\\n\";\r\n }\r\n code += \"}\";\r\n }\r\n\r\n return code;\r\n }\r\n\r\n private _applyTextureArrayProcessing(code: string, name: string): string {\r\n // Replaces the occurrences of name[XX] by nameXX\r\n const regex = new RegExp(name + \"\\\\s*\\\\[(.+)?\\\\]\", \"gm\");\r\n let match = regex.exec(code);\r\n\r\n while (match !== null) {\r\n const index = match[1];\r\n let iindex = +index;\r\n if (this._preProcessors && isNaN(iindex)) {\r\n iindex = +this._preProcessors[index.trim()];\r\n }\r\n code = code.replace(match[0], name + iindex);\r\n match = regex.exec(code);\r\n }\r\n\r\n return code;\r\n }\r\n\r\n protected _generateLeftOverUBOCode(name: string, uniformBufferDescription: WebGPUBufferDescription): string {\r\n let ubo = `layout(set = ${uniformBufferDescription.binding.groupIndex}, binding = ${uniformBufferDescription.binding.bindingIndex}) uniform ${name} {\\n `;\r\n for (const leftOverUniform of this._webgpuProcessingContext.leftOverUniforms) {\r\n if (leftOverUniform.length > 0) {\r\n ubo += ` ${leftOverUniform.type} ${leftOverUniform.name}[${leftOverUniform.length}];\\n`;\r\n } else {\r\n ubo += ` ${leftOverUniform.type} ${leftOverUniform.name};\\n`;\r\n }\r\n }\r\n ubo += \"};\\n\\n\";\r\n\r\n return ubo;\r\n }\r\n\r\n public finalizeShaders(vertexCode: string, fragmentCode: string): { vertexCode: string; fragmentCode: string } {\r\n // make replacements for texture names in the texture array case\r\n for (let i = 0; i < this._textureArrayProcessing.length; ++i) {\r\n const name = this._textureArrayProcessing[i];\r\n vertexCode = this._applyTextureArrayProcessing(vertexCode, name);\r\n fragmentCode = this._applyTextureArrayProcessing(fragmentCode, name);\r\n }\r\n\r\n // inject the missing varying in the fragment shader\r\n for (let i = 0; i < this._missingVaryings.length; ++i) {\r\n const decl = this._missingVaryings[i];\r\n if (decl && decl.length > 0) {\r\n fragmentCode = decl + \"\\n\" + fragmentCode;\r\n }\r\n }\r\n\r\n // Builds the leftover UBOs.\r\n const leftOverUBO = this._buildLeftOverUBO();\r\n\r\n vertexCode = leftOverUBO + vertexCode;\r\n fragmentCode = leftOverUBO + fragmentCode;\r\n\r\n this._collectBindingNames();\r\n this._preCreateBindGroupEntries();\r\n\r\n this._preProcessors = null as any;\r\n this.vertexBufferKindToNumberOfComponents = {};\r\n\r\n return { vertexCode, fragmentCode };\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"webgpuShaderProcessorsGLSL.js","sourceRoot":"","sources":["../../../../../dev/core/src/Engines/WebGPU/webgpuShaderProcessorsGLSL.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable babylonjs/available */\r\n/* eslint-disable jsdoc/require-jsdoc */\r\nimport type { Nullable } from \"../../types\";\r\nimport type { ShaderProcessingContext } from \"../Processors/shaderProcessingOptions\";\r\nimport type { WebGPUBufferDescription } from \"./webgpuShaderProcessingContext\";\r\nimport { WebGPUShaderProcessingContext } from \"./webgpuShaderProcessingContext\";\r\nimport * as WebGPUConstants from \"./webgpuConstants\";\r\nimport { Logger } from \"../../Misc/logger\";\r\nimport type { ThinEngine } from \"../thinEngine\";\r\nimport { WebGPUShaderProcessor } from \"./webgpuShaderProcessor\";\r\nimport { ShaderLanguage } from \"../../Materials/shaderLanguage\";\r\n\r\n/** @internal */\r\nexport class WebGPUShaderProcessorGLSL extends WebGPUShaderProcessor {\r\n protected _missingVaryings: Array<string> = [];\r\n protected _textureArrayProcessing: Array<string> = [];\r\n protected _preProcessors: { [key: string]: string };\r\n protected _vertexIsGLES3: boolean = false;\r\n protected _fragmentIsGLES3: boolean = false;\r\n\r\n public shaderLanguage = ShaderLanguage.GLSL;\r\n public parseGLES3 = true;\r\n public attributeKeywordName: string | undefined;\r\n public varyingVertexKeywordName: string | undefined;\r\n public varyingFragmentKeywordName: string | undefined;\r\n\r\n protected _getArraySize(name: string, type: string, preProcessors: { [key: string]: string }): [string, string, number] {\r\n let length = 0;\r\n const startArray = name.indexOf(\"[\");\r\n const endArray = name.indexOf(\"]\");\r\n if (startArray > 0 && endArray > 0) {\r\n const lengthInString = name.substring(startArray + 1, endArray);\r\n length = +lengthInString;\r\n if (isNaN(length)) {\r\n length = +preProcessors[lengthInString.trim()];\r\n }\r\n name = name.substr(0, startArray);\r\n }\r\n return [name, type, length];\r\n }\r\n\r\n public initializeShaders(processingContext: Nullable<ShaderProcessingContext>): void {\r\n this._webgpuProcessingContext = processingContext as WebGPUShaderProcessingContext;\r\n\r\n this._missingVaryings.length = 0;\r\n this._textureArrayProcessing.length = 0;\r\n this.attributeKeywordName = undefined;\r\n this.varyingVertexKeywordName = undefined;\r\n this.varyingFragmentKeywordName = undefined;\r\n }\r\n\r\n public preProcessShaderCode(code: string, isFragment: boolean): string {\r\n const ubDeclaration = `// Internals UBO\\nuniform ${WebGPUShaderProcessor.InternalsUBOName} {\\nfloat yFactor_;\\nfloat textureOutputHeight_;\\n};\\n`;\r\n const alreadyInjected = code.indexOf(\"// Internals UBO\") !== -1;\r\n\r\n if (isFragment) {\r\n this._fragmentIsGLES3 = code.indexOf(\"#version 3\") !== -1;\r\n if (this._fragmentIsGLES3) {\r\n this.varyingFragmentKeywordName = \"in\";\r\n }\r\n return alreadyInjected ? code : ubDeclaration + \"##INJECTCODE##\\n\" + code;\r\n }\r\n\r\n this._vertexIsGLES3 = code.indexOf(\"#version 3\") !== -1;\r\n if (this._vertexIsGLES3) {\r\n this.attributeKeywordName = \"in\";\r\n this.varyingVertexKeywordName = \"out\";\r\n }\r\n return alreadyInjected ? code : ubDeclaration + code;\r\n }\r\n\r\n public varyingCheck(varying: string, isFragment: boolean) {\r\n const outRegex = /(flat\\s)?\\s*\\bout\\b/;\r\n const inRegex = /(flat\\s)?\\s*\\bin\\b/;\r\n const varyingRegex = /(flat\\s)?\\s*\\bvarying\\b/;\r\n\r\n const regex = isFragment && this._fragmentIsGLES3 ? inRegex : !isFragment && this._vertexIsGLES3 ? outRegex : varyingRegex;\r\n\r\n return regex.test(varying);\r\n }\r\n\r\n public varyingProcessor(varying: string, isFragment: boolean, preProcessors: { [key: string]: string }) {\r\n this._preProcessors = preProcessors;\r\n\r\n const outRegex = /\\s*(flat)?\\s*out\\s+(?:(?:highp)?|(?:lowp)?)\\s*(\\S+)\\s+(\\S+)\\s*;/gm;\r\n const inRegex = /\\s*(flat)?\\s*in\\s+(?:(?:highp)?|(?:lowp)?)\\s*(\\S+)\\s+(\\S+)\\s*;/gm;\r\n const varyingRegex = /\\s*(flat)?\\s*varying\\s+(?:(?:highp)?|(?:lowp)?)\\s*(\\S+)\\s+(\\S+)\\s*;/gm;\r\n\r\n const regex = isFragment && this._fragmentIsGLES3 ? inRegex : !isFragment && this._vertexIsGLES3 ? outRegex : varyingRegex;\r\n const match = regex.exec(varying);\r\n if (match !== null) {\r\n const interpolationQualifier = match[1] ?? \"\";\r\n const varyingType = match[2];\r\n const name = match[3];\r\n let location: number;\r\n if (isFragment) {\r\n location = this._webgpuProcessingContext.availableVaryings[name];\r\n this._missingVaryings[location] = \"\";\r\n if (location === undefined) {\r\n Logger.Warn(`Invalid fragment shader: The varying named \"${name}\" is not declared in the vertex shader! This declaration will be ignored.`);\r\n }\r\n } else {\r\n location = this._webgpuProcessingContext.getVaryingNextLocation(varyingType, this._getArraySize(name, varyingType, preProcessors)[2]);\r\n this._webgpuProcessingContext.availableVaryings[name] = location;\r\n this._missingVaryings[location] = `layout(location = ${location}) ${interpolationQualifier} in ${varyingType} ${name};`;\r\n }\r\n\r\n varying = varying.replace(\r\n match[0],\r\n location === undefined ? \"\" : `layout(location = ${location}) ${interpolationQualifier} ${isFragment ? \"in\" : \"out\"} ${varyingType} ${name};`\r\n );\r\n }\r\n return varying;\r\n }\r\n\r\n public attributeProcessor(attribute: string, preProcessors: { [key: string]: string }) {\r\n this._preProcessors = preProcessors;\r\n\r\n const inRegex = /\\s*in\\s+(\\S+)\\s+(\\S+)\\s*;/gm;\r\n const attribRegex = /\\s*attribute\\s+(\\S+)\\s+(\\S+)\\s*;/gm;\r\n\r\n const regex = this._vertexIsGLES3 ? inRegex : attribRegex;\r\n const match = regex.exec(attribute);\r\n if (match !== null) {\r\n const attributeType = match[1];\r\n const name = match[2];\r\n const location = this._webgpuProcessingContext.getAttributeNextLocation(attributeType, this._getArraySize(name, attributeType, preProcessors)[2]);\r\n\r\n this._webgpuProcessingContext.availableAttributes[name] = location;\r\n this._webgpuProcessingContext.orderedAttributes[location] = name;\r\n\r\n const numComponents = this.vertexBufferKindToNumberOfComponents[name];\r\n if (numComponents !== undefined) {\r\n // Special case for an int/ivecX vertex buffer that is used as a float/vecX attribute in the shader.\r\n const newType = numComponents < 0 ? (numComponents === -1 ? \"int\" : \"ivec\" + -numComponents) : numComponents === 1 ? \"uint\" : \"uvec\" + numComponents;\r\n const newName = `_int_${name}_`;\r\n\r\n attribute = attribute.replace(match[0], `layout(location = ${location}) in ${newType} ${newName}; ${attributeType} ${name} = ${attributeType}(${newName});`);\r\n } else {\r\n attribute = attribute.replace(match[0], `layout(location = ${location}) in ${attributeType} ${name};`);\r\n }\r\n }\r\n return attribute;\r\n }\r\n\r\n public uniformProcessor(uniform: string, isFragment: boolean, preProcessors: { [key: string]: string }): string {\r\n this._preProcessors = preProcessors;\r\n\r\n const uniformRegex = /\\s*uniform\\s+(?:(?:highp)?|(?:lowp)?)\\s*(\\S+)\\s+(\\S+)\\s*;/gm;\r\n\r\n const match = uniformRegex.exec(uniform);\r\n if (match !== null) {\r\n let uniformType = match[1];\r\n let name = match[2];\r\n\r\n if (uniformType.indexOf(\"sampler\") === 0 || uniformType.indexOf(\"sampler\") === 1) {\r\n let arraySize = 0; // 0 means the texture is not declared as an array\r\n\r\n [name, uniformType, arraySize] = this._getArraySize(name, uniformType, preProcessors);\r\n\r\n let textureInfo = this._webgpuProcessingContext.availableTextures[name];\r\n if (!textureInfo) {\r\n textureInfo = {\r\n autoBindSampler: true,\r\n isTextureArray: arraySize > 0,\r\n isStorageTexture: false,\r\n textures: [],\r\n sampleType: WebGPUConstants.TextureSampleType.Float,\r\n };\r\n for (let i = 0; i < (arraySize || 1); ++i) {\r\n textureInfo.textures.push(this._webgpuProcessingContext.getNextFreeUBOBinding());\r\n }\r\n }\r\n\r\n const samplerType = WebGPUShaderProcessor._SamplerTypeByWebGLSamplerType[uniformType] ?? \"sampler\";\r\n const isComparisonSampler = !!WebGPUShaderProcessor._IsComparisonSamplerByWebGPUSamplerType[samplerType];\r\n const samplerBindingType = isComparisonSampler ? WebGPUConstants.SamplerBindingType.Comparison : WebGPUConstants.SamplerBindingType.Filtering;\r\n const samplerName = name + WebGPUShaderProcessor.AutoSamplerSuffix;\r\n\r\n let samplerInfo = this._webgpuProcessingContext.availableSamplers[samplerName];\r\n if (!samplerInfo) {\r\n samplerInfo = {\r\n binding: this._webgpuProcessingContext.getNextFreeUBOBinding(),\r\n type: samplerBindingType,\r\n };\r\n }\r\n\r\n const componentType = uniformType.charAt(0) === \"u\" ? \"u\" : uniformType.charAt(0) === \"i\" ? \"i\" : \"\";\r\n\r\n if (componentType) {\r\n uniformType = uniformType.substr(1);\r\n }\r\n\r\n const sampleType = isComparisonSampler\r\n ? WebGPUConstants.TextureSampleType.Depth\r\n : componentType === \"u\"\r\n ? WebGPUConstants.TextureSampleType.Uint\r\n : componentType === \"i\"\r\n ? WebGPUConstants.TextureSampleType.Sint\r\n : WebGPUConstants.TextureSampleType.Float;\r\n\r\n textureInfo.sampleType = sampleType;\r\n\r\n const isTextureArray = arraySize > 0;\r\n const samplerGroupIndex = samplerInfo.binding.groupIndex;\r\n const samplerBindingIndex = samplerInfo.binding.bindingIndex;\r\n const samplerFunction = WebGPUShaderProcessor._SamplerFunctionByWebGLSamplerType[uniformType];\r\n const textureType = WebGPUShaderProcessor._TextureTypeByWebGLSamplerType[uniformType];\r\n const textureDimension = WebGPUShaderProcessor._GpuTextureViewDimensionByWebGPUTextureType[textureType];\r\n\r\n // Manage textures and samplers.\r\n if (!isTextureArray) {\r\n arraySize = 1;\r\n uniform = `layout(set = ${samplerGroupIndex}, binding = ${samplerBindingIndex}) uniform ${samplerType} ${samplerName};\r\n layout(set = ${textureInfo.textures[0].groupIndex}, binding = ${textureInfo.textures[0].bindingIndex}) uniform ${componentType}${textureType} ${name}Texture;\r\n #define ${name} ${componentType}${samplerFunction}(${name}Texture, ${samplerName})`;\r\n } else {\r\n const layouts = [];\r\n layouts.push(`layout(set = ${samplerGroupIndex}, binding = ${samplerBindingIndex}) uniform ${componentType}${samplerType} ${samplerName};`);\r\n uniform = `\\n`;\r\n for (let i = 0; i < arraySize; ++i) {\r\n const textureSetIndex = textureInfo.textures[i].groupIndex;\r\n const textureBindingIndex = textureInfo.textures[i].bindingIndex;\r\n\r\n layouts.push(`layout(set = ${textureSetIndex}, binding = ${textureBindingIndex}) uniform ${textureType} ${name}Texture${i};`);\r\n\r\n uniform += `${i > 0 ? \"\\n\" : \"\"}#define ${name}${i} ${componentType}${samplerFunction}(${name}Texture${i}, ${samplerName})`;\r\n }\r\n uniform = layouts.join(\"\\n\") + uniform;\r\n this._textureArrayProcessing.push(name);\r\n }\r\n\r\n this._webgpuProcessingContext.availableTextures[name] = textureInfo;\r\n this._webgpuProcessingContext.availableSamplers[samplerName] = samplerInfo;\r\n\r\n this._addSamplerBindingDescription(samplerName, samplerInfo, !isFragment);\r\n\r\n for (let i = 0; i < arraySize; ++i) {\r\n this._addTextureBindingDescription(name, textureInfo, i, textureDimension, null, !isFragment);\r\n }\r\n } else {\r\n this._addUniformToLeftOverUBO(name, uniformType, preProcessors);\r\n uniform = \"\";\r\n }\r\n }\r\n return uniform;\r\n }\r\n\r\n public uniformBufferProcessor(uniformBuffer: string, isFragment: boolean): string {\r\n const uboRegex = /uniform\\s+(\\w+)/gm;\r\n\r\n const match = uboRegex.exec(uniformBuffer);\r\n if (match !== null) {\r\n const name = match[1];\r\n\r\n let uniformBufferInfo = this._webgpuProcessingContext.availableBuffers[name];\r\n if (!uniformBufferInfo) {\r\n const knownUBO = WebGPUShaderProcessingContext.KnownUBOs[name];\r\n\r\n let binding;\r\n if (knownUBO && knownUBO.binding.groupIndex !== -1) {\r\n binding = knownUBO.binding;\r\n } else {\r\n binding = this._webgpuProcessingContext.getNextFreeUBOBinding();\r\n }\r\n\r\n uniformBufferInfo = { binding };\r\n this._webgpuProcessingContext.availableBuffers[name] = uniformBufferInfo;\r\n }\r\n\r\n this._addBufferBindingDescription(name, uniformBufferInfo, WebGPUConstants.BufferBindingType.Uniform, !isFragment);\r\n\r\n uniformBuffer = uniformBuffer.replace(\"uniform\", `layout(set = ${uniformBufferInfo.binding.groupIndex}, binding = ${uniformBufferInfo.binding.bindingIndex}) uniform`);\r\n }\r\n return uniformBuffer;\r\n }\r\n\r\n public postProcessor(code: string, defines: string[], isFragment: boolean, processingContext: Nullable<ShaderProcessingContext>, engine: ThinEngine) {\r\n const hasDrawBuffersExtension = code.search(/#extension.+GL_EXT_draw_buffers.+require/) !== -1;\r\n\r\n // Remove extensions\r\n const regex = /#extension.+(GL_OVR_multiview2|GL_OES_standard_derivatives|GL_EXT_shader_texture_lod|GL_EXT_frag_depth|GL_EXT_draw_buffers).+(enable|require)/g;\r\n code = code.replace(regex, \"\");\r\n\r\n // Replace instructions\r\n code = code.replace(/texture2D\\s*\\(/g, \"texture(\");\r\n if (isFragment) {\r\n const hasFragCoord = code.indexOf(\"gl_FragCoord\") >= 0;\r\n const fragCoordCode = `\r\n glFragCoord_ = gl_FragCoord;\r\n if (yFactor_ == 1.) {\r\n glFragCoord_.y = textureOutputHeight_ - glFragCoord_.y;\r\n }\r\n `;\r\n\r\n const injectCode = hasFragCoord ? \"vec4 glFragCoord_;\\n\" : \"\";\r\n const hasOutput = code.search(/layout *\\(location *= *0\\) *out/g) !== -1;\r\n\r\n code = code.replace(/texture2DLodEXT\\s*\\(/g, \"textureLod(\");\r\n code = code.replace(/textureCubeLodEXT\\s*\\(/g, \"textureLod(\");\r\n code = code.replace(/textureCube\\s*\\(/g, \"texture(\");\r\n code = code.replace(/gl_FragDepthEXT/g, \"gl_FragDepth\");\r\n code = code.replace(/gl_FragColor/g, \"glFragColor\");\r\n code = code.replace(/gl_FragData/g, \"glFragData\");\r\n code = code.replace(/gl_FragCoord/g, \"glFragCoord_\");\r\n if (!this._fragmentIsGLES3) {\r\n code = code.replace(/void\\s+?main\\s*\\(/g, (hasDrawBuffersExtension || hasOutput ? \"\" : \"layout(location = 0) out vec4 glFragColor;\\n\") + \"void main(\");\r\n } else {\r\n const match = /^\\s*out\\s+\\S+\\s+\\S+\\s*;/gm.exec(code);\r\n if (match !== null) {\r\n code = code.substring(0, match.index) + \"layout(location = 0) \" + code.substring(match.index);\r\n }\r\n }\r\n code = code.replace(/dFdy/g, \"(-yFactor_)*dFdy\"); // will also handle dFdyCoarse and dFdyFine\r\n code = code.replace(\"##INJECTCODE##\", injectCode);\r\n\r\n if (hasFragCoord) {\r\n code = this._injectStartingAndEndingCode(code, \"void main\", fragCoordCode);\r\n }\r\n } else {\r\n code = code.replace(/gl_InstanceID/g, \"gl_InstanceIndex\");\r\n code = code.replace(/gl_VertexID/g, \"gl_VertexIndex\");\r\n const hasMultiviewExtension = defines.indexOf(\"#define MULTIVIEW\") !== -1;\r\n if (hasMultiviewExtension) {\r\n return \"#extension GL_OVR_multiview2 : require\\nlayout (num_views = 2) in;\\n\" + code;\r\n }\r\n }\r\n\r\n // Flip Y + convert z range from [-1,1] to [0,1]\r\n if (!isFragment) {\r\n const lastClosingCurly = code.lastIndexOf(\"}\");\r\n code = code.substring(0, lastClosingCurly);\r\n code += \"gl_Position.y *= yFactor_;\\n\";\r\n if (!engine.isNDCHalfZRange) {\r\n code += \"gl_Position.z = (gl_Position.z + gl_Position.w) / 2.0;\\n\";\r\n }\r\n code += \"}\";\r\n }\r\n\r\n return code;\r\n }\r\n\r\n private _applyTextureArrayProcessing(code: string, name: string): string {\r\n // Replaces the occurrences of name[XX] by nameXX\r\n const regex = new RegExp(name + \"\\\\s*\\\\[(.+)?\\\\]\", \"gm\");\r\n let match = regex.exec(code);\r\n\r\n while (match !== null) {\r\n const index = match[1];\r\n let iindex = +index;\r\n if (this._preProcessors && isNaN(iindex)) {\r\n iindex = +this._preProcessors[index.trim()];\r\n }\r\n code = code.replace(match[0], name + iindex);\r\n match = regex.exec(code);\r\n }\r\n\r\n return code;\r\n }\r\n\r\n protected _generateLeftOverUBOCode(name: string, uniformBufferDescription: WebGPUBufferDescription): string {\r\n let ubo = `layout(set = ${uniformBufferDescription.binding.groupIndex}, binding = ${uniformBufferDescription.binding.bindingIndex}) uniform ${name} {\\n `;\r\n for (const leftOverUniform of this._webgpuProcessingContext.leftOverUniforms) {\r\n if (leftOverUniform.length > 0) {\r\n ubo += ` ${leftOverUniform.type} ${leftOverUniform.name}[${leftOverUniform.length}];\\n`;\r\n } else {\r\n ubo += ` ${leftOverUniform.type} ${leftOverUniform.name};\\n`;\r\n }\r\n }\r\n ubo += \"};\\n\\n\";\r\n\r\n return ubo;\r\n }\r\n\r\n public finalizeShaders(vertexCode: string, fragmentCode: string): { vertexCode: string; fragmentCode: string } {\r\n // make replacements for texture names in the texture array case\r\n for (let i = 0; i < this._textureArrayProcessing.length; ++i) {\r\n const name = this._textureArrayProcessing[i];\r\n vertexCode = this._applyTextureArrayProcessing(vertexCode, name);\r\n fragmentCode = this._applyTextureArrayProcessing(fragmentCode, name);\r\n }\r\n\r\n // inject the missing varying in the fragment shader\r\n for (let i = 0; i < this._missingVaryings.length; ++i) {\r\n const decl = this._missingVaryings[i];\r\n if (decl && decl.length > 0) {\r\n fragmentCode = decl + \"\\n\" + fragmentCode;\r\n }\r\n }\r\n\r\n // Builds the leftover UBOs.\r\n const leftOverUBO = this._buildLeftOverUBO();\r\n\r\n vertexCode = leftOverUBO + vertexCode;\r\n fragmentCode = leftOverUBO + fragmentCode;\r\n\r\n this._collectBindingNames();\r\n this._preCreateBindGroupEntries();\r\n\r\n this._preProcessors = null as any;\r\n this.vertexBufferKindToNumberOfComponents = {};\r\n\r\n return { vertexCode, fragmentCode };\r\n }\r\n}\r\n"]}
|