@yang__yj/pixelstreaming-core 1.0.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.cspell.json +48 -0
- package/.eslintignore +8 -0
- package/.eslintrc.js +8 -0
- package/.prettierignore +0 -0
- package/.prettierrc.json +6 -0
- package/coverage/clover.xml +3480 -0
- package/coverage/coverage-final.json +62 -0
- package/coverage/lcov-report/base.css +224 -0
- package/coverage/lcov-report/block-navigation.js +87 -0
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/index.html +356 -0
- package/coverage/lcov-report/prettify.css +1 -0
- package/coverage/lcov-report/prettify.js +2 -0
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +196 -0
- package/coverage/lcov-report/src/AFK/AFKController.ts.html +559 -0
- package/coverage/lcov-report/src/AFK/index.html +116 -0
- package/coverage/lcov-report/src/Config/Config.ts.html +2764 -0
- package/coverage/lcov-report/src/Config/SettingBase.ts.html +280 -0
- package/coverage/lcov-report/src/Config/SettingFlag.ts.html +382 -0
- package/coverage/lcov-report/src/Config/SettingNumber.ts.html +418 -0
- package/coverage/lcov-report/src/Config/SettingOption.ts.html +424 -0
- package/coverage/lcov-report/src/Config/SettingText.ts.html +331 -0
- package/coverage/lcov-report/src/Config/index.html +191 -0
- package/coverage/lcov-report/src/DataChannel/DataChannelController.ts.html +499 -0
- package/coverage/lcov-report/src/DataChannel/DataChannelSender.ts.html +262 -0
- package/coverage/lcov-report/src/DataChannel/InitialSettings.ts.html +268 -0
- package/coverage/lcov-report/src/DataChannel/LatencyTestResults.ts.html +313 -0
- package/coverage/lcov-report/src/DataChannel/index.html +161 -0
- package/coverage/lcov-report/src/FreezeFrame/FreezeFrame.ts.html +427 -0
- package/coverage/lcov-report/src/FreezeFrame/FreezeFrameController.ts.html +427 -0
- package/coverage/lcov-report/src/FreezeFrame/index.html +131 -0
- package/coverage/lcov-report/src/Inputs/FakeTouchController.ts.html +682 -0
- package/coverage/lcov-report/src/Inputs/GamepadController.ts.html +985 -0
- package/coverage/lcov-report/src/Inputs/HoveringMouseEvents.ts.html +688 -0
- package/coverage/lcov-report/src/Inputs/InputClassesFactory.ts.html +505 -0
- package/coverage/lcov-report/src/Inputs/KeyboardController.ts.html +1048 -0
- package/coverage/lcov-report/src/Inputs/LockedMouseEvents.ts.html +946 -0
- package/coverage/lcov-report/src/Inputs/MouseButtons.ts.html +160 -0
- package/coverage/lcov-report/src/Inputs/MouseController.ts.html +1171 -0
- package/coverage/lcov-report/src/Inputs/SpecialKeyCodes.ts.html +133 -0
- package/coverage/lcov-report/src/Inputs/TouchController.ts.html +712 -0
- package/coverage/lcov-report/src/Inputs/XRGamepadController.ts.html +463 -0
- package/coverage/lcov-report/src/Inputs/index.html +266 -0
- package/coverage/lcov-report/src/Logger/Logger.ts.html +325 -0
- package/coverage/lcov-report/src/Logger/index.html +116 -0
- package/coverage/lcov-report/src/PeerConnectionController/AggregatedStats.ts.html +1018 -0
- package/coverage/lcov-report/src/PeerConnectionController/CandidatePairStats.ts.html +136 -0
- package/coverage/lcov-report/src/PeerConnectionController/CandidateStat.ts.html +124 -0
- package/coverage/lcov-report/src/PeerConnectionController/DataChannelStats.ts.html +136 -0
- package/coverage/lcov-report/src/PeerConnectionController/InboundRTPStats.ts.html +547 -0
- package/coverage/lcov-report/src/PeerConnectionController/OutBoundRTPStats.ts.html +163 -0
- package/coverage/lcov-report/src/PeerConnectionController/PeerConnectionController.ts.html +1795 -0
- package/coverage/lcov-report/src/PeerConnectionController/SessionStats.ts.html +115 -0
- package/coverage/lcov-report/src/PeerConnectionController/StreamStats.ts.html +118 -0
- package/coverage/lcov-report/src/PeerConnectionController/index.html +236 -0
- package/coverage/lcov-report/src/PixelStreaming/PixelStreaming.ts.html +2269 -0
- package/coverage/lcov-report/src/PixelStreaming/index.html +116 -0
- package/coverage/lcov-report/src/UI/OnScreenKeyboard.ts.html +376 -0
- package/coverage/lcov-report/src/UI/index.html +116 -0
- package/coverage/lcov-report/src/UeInstanceMessage/ResponseController.ts.html +226 -0
- package/coverage/lcov-report/src/UeInstanceMessage/SendDescriptorController.ts.html +346 -0
- package/coverage/lcov-report/src/UeInstanceMessage/SendMessageController.ts.html +364 -0
- package/coverage/lcov-report/src/UeInstanceMessage/StreamMessageController.ts.html +862 -0
- package/coverage/lcov-report/src/UeInstanceMessage/ToStreamerMessagesController.ts.html +271 -0
- package/coverage/lcov-report/src/UeInstanceMessage/TwoWayMap.ts.html +241 -0
- package/coverage/lcov-report/src/UeInstanceMessage/index.html +191 -0
- package/coverage/lcov-report/src/Util/CoordinateConverter.ts.html +952 -0
- package/coverage/lcov-report/src/Util/EventEmitter.ts.html +1705 -0
- package/coverage/lcov-report/src/Util/EventListenerTracker.ts.html +172 -0
- package/coverage/lcov-report/src/Util/FileUtil.ts.html +505 -0
- package/coverage/lcov-report/src/Util/WebGLUtils.ts.html +232 -0
- package/coverage/lcov-report/src/Util/WebXRUtils.ts.html +160 -0
- package/coverage/lcov-report/src/Util/index.html +191 -0
- package/coverage/lcov-report/src/VideoPlayer/StreamController.ts.html +349 -0
- package/coverage/lcov-report/src/VideoPlayer/VideoPlayer.ts.html +799 -0
- package/coverage/lcov-report/src/VideoPlayer/index.html +131 -0
- package/coverage/lcov-report/src/WebRtcPlayer/WebRtcPlayerController.ts.html +6199 -0
- package/coverage/lcov-report/src/WebRtcPlayer/index.html +116 -0
- package/coverage/lcov-report/src/WebSockets/MessageReceive.ts.html +352 -0
- package/coverage/lcov-report/src/WebSockets/MessageSend.ts.html +604 -0
- package/coverage/lcov-report/src/WebSockets/SignallingProtocol.ts.html +622 -0
- package/coverage/lcov-report/src/WebSockets/WebSocketController.ts.html +844 -0
- package/coverage/lcov-report/src/WebSockets/index.html +161 -0
- package/coverage/lcov-report/src/WebXR/WebXRController.ts.html +1042 -0
- package/coverage/lcov-report/src/WebXR/index.html +116 -0
- package/coverage/lcov-report/src/__test__/index.html +161 -0
- package/coverage/lcov-report/src/__test__/mockMediaStream.ts.html +457 -0
- package/coverage/lcov-report/src/__test__/mockRTCPeerConnection.ts.html +1126 -0
- package/coverage/lcov-report/src/__test__/mockRTCRtpReceiver.ts.html +151 -0
- package/coverage/lcov-report/src/__test__/mockWebSocket.ts.html +475 -0
- package/coverage/lcov-report/src/index.html +116 -0
- package/coverage/lcov-report/src/pixelstreamingfrontend.ts.html +232 -0
- package/coverage/lcov.info +6458 -0
- package/dist/lib-pixelstreamingfrontend.esm.js +1 -0
- package/dist/lib-pixelstreamingfrontend.js +1 -0
- package/jest.config.js +18 -0
- package/package.json +47 -18
- package/readme.md +15 -0
- package/src/AFK/AFKController.test.ts +162 -0
- package/src/AFK/AFKController.ts +158 -0
- package/src/Config/Config.test.ts +222 -0
- package/src/Config/Config.ts +909 -0
- package/src/Config/SettingBase.ts +65 -0
- package/src/Config/SettingFlag.ts +99 -0
- package/src/Config/SettingNumber.ts +111 -0
- package/src/Config/SettingOption.ts +124 -0
- package/src/Config/SettingText.ts +82 -0
- package/src/DataChannel/DataChannelController.ts +138 -0
- package/src/DataChannel/DataChannelLatencyTestController.ts +129 -0
- package/src/DataChannel/DataChannelLatencyTestResults.ts +67 -0
- package/src/DataChannel/DataChannelSender.ts +59 -0
- package/src/DataChannel/InitialSettings.ts +61 -0
- package/src/DataChannel/LatencyTestResults.ts +76 -0
- package/src/FreezeFrame/FreezeFrame.ts +114 -0
- package/src/FreezeFrame/FreezeFrameController.ts +114 -0
- package/src/Inputs/FakeTouchController.ts +199 -0
- package/src/Inputs/GamepadController.ts +300 -0
- package/src/Inputs/GamepadTypes.ts +10 -0
- package/src/Inputs/HoveringMouseEvents.ts +192 -0
- package/src/Inputs/IMouseEvents.ts +64 -0
- package/src/Inputs/ITouchController.ts +29 -0
- package/src/Inputs/InputClassesFactory.ts +140 -0
- package/src/Inputs/KeyboardController.ts +318 -0
- package/src/Inputs/LockedMouseEvents.ts +287 -0
- package/src/Inputs/MouseButtons.ts +25 -0
- package/src/Inputs/MouseController.ts +362 -0
- package/src/Inputs/SpecialKeyCodes.ts +16 -0
- package/src/Inputs/TouchController.ts +253 -0
- package/src/Inputs/XRGamepadController.ts +126 -0
- package/src/Logger/Logger.ts +80 -0
- package/src/PeerConnectionController/AggregatedStats.ts +311 -0
- package/src/PeerConnectionController/CandidatePairStats.ts +17 -0
- package/src/PeerConnectionController/CandidateStat.ts +13 -0
- package/src/PeerConnectionController/CodecStats.ts +19 -0
- package/src/PeerConnectionController/DataChannelStats.ts +17 -0
- package/src/PeerConnectionController/InboundRTPStats.ts +154 -0
- package/src/PeerConnectionController/InboundTrackStats.ts +34 -0
- package/src/PeerConnectionController/OutBoundRTPStats.ts +26 -0
- package/src/PeerConnectionController/PeerConnectionController.ts +563 -0
- package/src/PeerConnectionController/SessionStats.ts +10 -0
- package/src/PeerConnectionController/StreamStats.ts +11 -0
- package/src/PixelStreaming/PixelStreaming.test.ts +624 -0
- package/src/PixelStreaming/PixelStreaming.ts +847 -0
- package/src/UI/OnScreenKeyboard.ts +97 -0
- package/src/UeInstanceMessage/ResponseController.ts +47 -0
- package/src/UeInstanceMessage/SendMessageController.ts +154 -0
- package/src/UeInstanceMessage/StreamMessageController.ts +233 -0
- package/src/UeInstanceMessage/ToStreamerMessagesController.ts +62 -0
- package/src/Util/CoordinateConverter.ts +289 -0
- package/src/Util/EventEmitter.ts +595 -0
- package/src/Util/EventListenerTracker.ts +29 -0
- package/src/Util/FileUtil.ts +140 -0
- package/src/Util/RTCUtils.ts +41 -0
- package/src/Util/WebGLUtils.ts +49 -0
- package/src/Util/WebXRUtils.ts +25 -0
- package/src/VideoPlayer/StreamController.ts +89 -0
- package/src/VideoPlayer/VideoPlayer.ts +246 -0
- package/src/WebRtcPlayer/WebRtcPlayerController.ts +2221 -0
- package/src/WebSockets/MessageReceive.ts +89 -0
- package/src/WebSockets/MessageSend.ts +185 -0
- package/src/WebSockets/SignallingProtocol.ts +180 -0
- package/src/WebSockets/WebSocketController.ts +267 -0
- package/src/WebXR/WebXRController.ts +319 -0
- package/src/__test__/mockMediaStream.ts +124 -0
- package/src/__test__/mockRTCPeerConnection.ts +347 -0
- package/src/__test__/mockRTCRtpReceiver.ts +22 -0
- package/src/__test__/mockWebSocket.ts +130 -0
- package/src/pixelstreamingfrontend.ts +50 -0
- package/tsconfig.jest.json +8 -0
- package/tsconfig.json +24 -0
- package/{library/types → types}/Config/Config.d.ts +5 -4
- package/types/DataChannel/DataChannelLatencyTestController.d.ts +26 -0
- package/types/DataChannel/DataChannelLatencyTestResults.d.ts +46 -0
- package/{library/types → types}/Inputs/HoveringMouseEvents.d.ts +1 -1
- package/{library/types → types}/PeerConnectionController/PeerConnectionController.d.ts +1 -1
- package/{library/types → types}/PixelStreaming/PixelStreaming.d.ts +31 -6
- package/{library/types → types}/UeInstanceMessage/SendMessageController.d.ts +1 -1
- package/{library/types → types}/UeInstanceMessage/StreamMessageController.d.ts +3 -5
- package/{library/types → types}/Util/EventEmitter.d.ts +40 -3
- package/types/Util/RTCUtils.d.ts +8 -0
- package/{library/types → types}/VideoPlayer/StreamController.d.ts +3 -3
- package/{library/types → types}/VideoPlayer/VideoPlayer.d.ts +2 -0
- package/{library/types → types}/WebRtcPlayer/WebRtcPlayerController.d.ts +30 -27
- package/{library/types → types}/WebSockets/MessageReceive.d.ts +9 -9
- package/{library/types → types}/WebSockets/MessageSend.d.ts +13 -9
- package/{library/types → types}/WebSockets/SignallingProtocol.d.ts +3 -3
- package/{library/types → types}/WebSockets/WebSocketController.d.ts +16 -12
- package/{library/types → types}/pixelstreamingfrontend.d.ts +2 -1
- package/webpack.common.js +35 -0
- package/webpack.dev.js +35 -0
- package/webpack.prod.js +36 -0
- package/yang__yj-pixelstreaming-core-1.0.1.tgz +0 -0
- package/yang__yj-pixelstreaming-core-1.0.2.tgz +0 -0
- package/library/dist/lib-pixelstreamingfrontend.esm.js +0 -1
- package/library/dist/lib-pixelstreamingfrontend.js +0 -1
- /package/{library/types → types}/AFK/AFKController.d.ts +0 -0
- /package/{library/types → types}/Config/SettingBase.d.ts +0 -0
- /package/{library/types → types}/Config/SettingFlag.d.ts +0 -0
- /package/{library/types → types}/Config/SettingNumber.d.ts +0 -0
- /package/{library/types → types}/Config/SettingOption.d.ts +0 -0
- /package/{library/types → types}/Config/SettingText.d.ts +0 -0
- /package/{library/types → types}/DataChannel/DataChannelController.d.ts +0 -0
- /package/{library/types → types}/DataChannel/DataChannelSender.d.ts +0 -0
- /package/{library/types → types}/DataChannel/InitialSettings.d.ts +0 -0
- /package/{library/types → types}/DataChannel/LatencyTestResults.d.ts +0 -0
- /package/{library/types → types}/FreezeFrame/FreezeFrame.d.ts +0 -0
- /package/{library/types → types}/FreezeFrame/FreezeFrameController.d.ts +0 -0
- /package/{library/types → types}/Inputs/FakeTouchController.d.ts +0 -0
- /package/{library/types → types}/Inputs/GamepadController.d.ts +0 -0
- /package/{library/types → types}/Inputs/GamepadTypes.d.ts +0 -0
- /package/{library/types → types}/Inputs/IMouseEvents.d.ts +0 -0
- /package/{library/types → types}/Inputs/ITouchController.d.ts +0 -0
- /package/{library/types → types}/Inputs/InputClassesFactory.d.ts +0 -0
- /package/{library/types → types}/Inputs/KeyboardController.d.ts +0 -0
- /package/{library/types → types}/Inputs/LockedMouseEvents.d.ts +0 -0
- /package/{library/types → types}/Inputs/MouseButtons.d.ts +0 -0
- /package/{library/types → types}/Inputs/MouseController.d.ts +0 -0
- /package/{library/types → types}/Inputs/SpecialKeyCodes.d.ts +0 -0
- /package/{library/types → types}/Inputs/TouchController.d.ts +0 -0
- /package/{library/types → types}/Inputs/XRGamepadController.d.ts +0 -0
- /package/{library/types → types}/Logger/Logger.d.ts +0 -0
- /package/{library/types → types}/PeerConnectionController/AggregatedStats.d.ts +0 -0
- /package/{library/types → types}/PeerConnectionController/CandidatePairStats.d.ts +0 -0
- /package/{library/types → types}/PeerConnectionController/CandidateStat.d.ts +0 -0
- /package/{library/types → types}/PeerConnectionController/CodecStats.d.ts +0 -0
- /package/{library/types → types}/PeerConnectionController/DataChannelStats.d.ts +0 -0
- /package/{library/types → types}/PeerConnectionController/InboundRTPStats.d.ts +0 -0
- /package/{library/types → types}/PeerConnectionController/InboundTrackStats.d.ts +0 -0
- /package/{library/types → types}/PeerConnectionController/OutBoundRTPStats.d.ts +0 -0
- /package/{library/types → types}/PeerConnectionController/SessionStats.d.ts +0 -0
- /package/{library/types → types}/PeerConnectionController/StreamStats.d.ts +0 -0
- /package/{library/types → types}/UI/OnScreenKeyboard.d.ts +0 -0
- /package/{library/types → types}/UeInstanceMessage/ResponseController.d.ts +0 -0
- /package/{library/types → types}/UeInstanceMessage/SendDescriptorController.d.ts +0 -0
- /package/{library/types → types}/UeInstanceMessage/ToStreamerMessagesController.d.ts +0 -0
- /package/{library/types → types}/UeInstanceMessage/TwoWayMap.d.ts +0 -0
- /package/{library/types → types}/Util/CoordinateConverter.d.ts +0 -0
- /package/{library/types → types}/Util/EventListenerTracker.d.ts +0 -0
- /package/{library/types → types}/Util/FileUtil.d.ts +0 -0
- /package/{library/types → types}/Util/WebGLUtils.d.ts +0 -0
- /package/{library/types → types}/Util/WebXRUtils.d.ts +0 -0
- /package/{library/types → types}/WebXR/WebXRController.d.ts +0 -0
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
2
|
+
|
|
3
|
+
import { MouseController } from './MouseController';
|
|
4
|
+
import { Logger } from '../Logger/Logger';
|
|
5
|
+
import { IMouseEvents } from './IMouseEvents';
|
|
6
|
+
import { NormalizedQuantizedUnsignedCoord } from '../Util/CoordinateConverter';
|
|
7
|
+
import { ActiveKeys } from './InputClassesFactory';
|
|
8
|
+
import { VideoPlayer } from '../VideoPlayer/VideoPlayer';
|
|
9
|
+
import { EventListenerTracker } from '../Util/EventListenerTracker';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Handle the mouse locked events
|
|
13
|
+
*/
|
|
14
|
+
export class LockedMouseEvents implements IMouseEvents {
|
|
15
|
+
x = 0;
|
|
16
|
+
y = 0;
|
|
17
|
+
coord: NormalizedQuantizedUnsignedCoord;
|
|
18
|
+
videoElementProvider: VideoPlayer;
|
|
19
|
+
mouseController: MouseController;
|
|
20
|
+
activeKeysProvider: ActiveKeys;
|
|
21
|
+
updateMouseMovePositionEvent = (mouseEvent: MouseEvent) => {
|
|
22
|
+
this.updateMouseMovePosition(mouseEvent);
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
// Utility for keeping track of event handlers and unregistering them
|
|
26
|
+
private mouseEventListenerTracker = new EventListenerTracker();
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* @param videoElementProvider - Video Player instance
|
|
30
|
+
* @param mouseController - Mouse controller instance
|
|
31
|
+
* @param activeKeysProvider - Active keys provider instance
|
|
32
|
+
* @param playerStyleAttributesProvider - Player style attributes instance
|
|
33
|
+
*/
|
|
34
|
+
constructor(
|
|
35
|
+
videoElementProvider: VideoPlayer,
|
|
36
|
+
mouseController: MouseController,
|
|
37
|
+
activeKeysProvider: ActiveKeys
|
|
38
|
+
) {
|
|
39
|
+
this.videoElementProvider = videoElementProvider;
|
|
40
|
+
this.mouseController = mouseController;
|
|
41
|
+
this.activeKeysProvider = activeKeysProvider;
|
|
42
|
+
const videoElementParent =
|
|
43
|
+
this.videoElementProvider.getVideoParentElement();
|
|
44
|
+
this.x = videoElementParent.getBoundingClientRect().width / 2;
|
|
45
|
+
this.y = videoElementParent.getBoundingClientRect().height / 2;
|
|
46
|
+
this.coord =
|
|
47
|
+
this.mouseController.coordinateConverter.normalizeAndQuantizeUnsigned(
|
|
48
|
+
this.x,
|
|
49
|
+
this.y
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Unregisters all event handlers
|
|
55
|
+
*/
|
|
56
|
+
unregisterMouseEvents() {
|
|
57
|
+
this.mouseEventListenerTracker.unregisterAll();
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Handle when the locked state Changed
|
|
62
|
+
*/
|
|
63
|
+
lockStateChange() {
|
|
64
|
+
const videoElementParent =
|
|
65
|
+
this.videoElementProvider.getVideoParentElement();
|
|
66
|
+
const toStreamerHandlers =
|
|
67
|
+
this.mouseController.toStreamerMessagesProvider.toStreamerHandlers;
|
|
68
|
+
|
|
69
|
+
if (
|
|
70
|
+
document.pointerLockElement === videoElementParent ||
|
|
71
|
+
document.mozPointerLockElement === videoElementParent
|
|
72
|
+
) {
|
|
73
|
+
Logger.Log(Logger.GetStackTrace(), 'Pointer locked', 6);
|
|
74
|
+
document.addEventListener(
|
|
75
|
+
'mousemove',
|
|
76
|
+
this.updateMouseMovePositionEvent,
|
|
77
|
+
false
|
|
78
|
+
);
|
|
79
|
+
this.mouseEventListenerTracker.addUnregisterCallback(
|
|
80
|
+
() => document.removeEventListener(
|
|
81
|
+
'mousemove',
|
|
82
|
+
this.updateMouseMovePositionEvent,
|
|
83
|
+
false
|
|
84
|
+
)
|
|
85
|
+
);
|
|
86
|
+
} else {
|
|
87
|
+
Logger.Log(
|
|
88
|
+
Logger.GetStackTrace(),
|
|
89
|
+
'The pointer lock status is now unlocked',
|
|
90
|
+
6
|
|
91
|
+
);
|
|
92
|
+
// !a new arrow function must not be used here as it will be counted as a new function that cannot be removed
|
|
93
|
+
document.removeEventListener(
|
|
94
|
+
'mousemove',
|
|
95
|
+
this.updateMouseMovePositionEvent,
|
|
96
|
+
false
|
|
97
|
+
);
|
|
98
|
+
|
|
99
|
+
// If mouse loses focus, send a key up for all of the currently held-down keys
|
|
100
|
+
// This is necessary as when the mouse loses focus, the windows stops listening for events and as such
|
|
101
|
+
// the keyup listener won't get fired
|
|
102
|
+
let activeKeys = this.activeKeysProvider.getActiveKeys();
|
|
103
|
+
const setKeys = new Set(activeKeys);
|
|
104
|
+
const newKeysIterable: Array<number> = [];
|
|
105
|
+
|
|
106
|
+
setKeys.forEach((setKey: number) => {
|
|
107
|
+
newKeysIterable[setKey];
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
newKeysIterable.forEach((uniqueKeycode) => {
|
|
111
|
+
toStreamerHandlers.get('KeyUp')([uniqueKeycode]);
|
|
112
|
+
});
|
|
113
|
+
// Reset the active keys back to nothing
|
|
114
|
+
activeKeys = [];
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Handle the mouse move event, sends the mouse data to the UE Instance
|
|
120
|
+
* @param mouseEvent - Mouse Event
|
|
121
|
+
*/
|
|
122
|
+
updateMouseMovePosition(mouseEvent: MouseEvent) {
|
|
123
|
+
if (!this.videoElementProvider.isVideoReady()) {
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
const toStreamerHandlers =
|
|
127
|
+
this.mouseController.toStreamerMessagesProvider.toStreamerHandlers;
|
|
128
|
+
const styleWidth =
|
|
129
|
+
this.videoElementProvider.getVideoParentElement().clientWidth;
|
|
130
|
+
const styleHeight =
|
|
131
|
+
this.videoElementProvider.getVideoParentElement().clientHeight;
|
|
132
|
+
|
|
133
|
+
this.x += mouseEvent.movementX;
|
|
134
|
+
this.y += mouseEvent.movementY;
|
|
135
|
+
|
|
136
|
+
if (this.x > styleWidth) {
|
|
137
|
+
this.x -= styleWidth;
|
|
138
|
+
}
|
|
139
|
+
if (this.y > styleHeight) {
|
|
140
|
+
this.y -= styleHeight;
|
|
141
|
+
}
|
|
142
|
+
if (this.x < 0) {
|
|
143
|
+
this.x = styleWidth + this.x;
|
|
144
|
+
}
|
|
145
|
+
if (this.y < 0) {
|
|
146
|
+
this.y = styleHeight - this.y;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
this.coord =
|
|
150
|
+
this.mouseController.coordinateConverter.normalizeAndQuantizeUnsigned(
|
|
151
|
+
this.x,
|
|
152
|
+
this.y
|
|
153
|
+
);
|
|
154
|
+
const delta =
|
|
155
|
+
this.mouseController.coordinateConverter.normalizeAndQuantizeSigned(
|
|
156
|
+
mouseEvent.movementX,
|
|
157
|
+
mouseEvent.movementY
|
|
158
|
+
);
|
|
159
|
+
toStreamerHandlers.get('MouseMove')([
|
|
160
|
+
this.coord.x,
|
|
161
|
+
this.coord.y,
|
|
162
|
+
delta.x,
|
|
163
|
+
delta.y
|
|
164
|
+
]);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Handle the mouse Down event, sends the mouse data to the UE Instance
|
|
169
|
+
* @param mouseEvent - Mouse Event
|
|
170
|
+
*/
|
|
171
|
+
handleMouseDown(mouseEvent: MouseEvent) {
|
|
172
|
+
if (!this.videoElementProvider.isVideoReady()) {
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
const toStreamerHandlers =
|
|
177
|
+
this.mouseController.toStreamerMessagesProvider.toStreamerHandlers;
|
|
178
|
+
toStreamerHandlers.get('MouseDown')([
|
|
179
|
+
mouseEvent.button,
|
|
180
|
+
// We use the store value of this.coord as opposed to the mouseEvent.x/y as the mouseEvent location
|
|
181
|
+
// uses the system cursor location which hasn't moved
|
|
182
|
+
this.coord.x,
|
|
183
|
+
this.coord.y
|
|
184
|
+
]);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Handle the mouse Up event, sends the mouse data to the UE Instance
|
|
189
|
+
* @param mouseEvent - Mouse Event
|
|
190
|
+
*/
|
|
191
|
+
handleMouseUp(mouseEvent: MouseEvent) {
|
|
192
|
+
if (!this.videoElementProvider.isVideoReady()) {
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
const toStreamerHandlers =
|
|
196
|
+
this.mouseController.toStreamerMessagesProvider.toStreamerHandlers;
|
|
197
|
+
toStreamerHandlers.get('MouseUp')([
|
|
198
|
+
mouseEvent.button,
|
|
199
|
+
// We use the store value of this.coord as opposed to the mouseEvent.x/y as the mouseEvent location
|
|
200
|
+
// uses the system cursor location which hasn't moved
|
|
201
|
+
this.coord.x,
|
|
202
|
+
this.coord.y
|
|
203
|
+
]);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* Handle the mouse wheel event, sends the mouse wheel data to the UE Instance
|
|
208
|
+
* @param wheelEvent - Mouse Event
|
|
209
|
+
*/
|
|
210
|
+
handleMouseWheel(wheelEvent: WheelEvent) {
|
|
211
|
+
if (!this.videoElementProvider.isVideoReady()) {
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
const toStreamerHandlers =
|
|
215
|
+
this.mouseController.toStreamerMessagesProvider.toStreamerHandlers;
|
|
216
|
+
toStreamerHandlers.get('MouseWheel')([
|
|
217
|
+
wheelEvent.wheelDelta,
|
|
218
|
+
// We use the store value of this.coord as opposed to the mouseEvent.x/y as the mouseEvent location
|
|
219
|
+
// uses the system cursor location which hasn't moved
|
|
220
|
+
this.coord.x,
|
|
221
|
+
this.coord.y
|
|
222
|
+
]);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* Handle the mouse double click event, sends the mouse data to the UE Instance
|
|
227
|
+
* @param mouseEvent - Mouse Event
|
|
228
|
+
*/
|
|
229
|
+
handleMouseDouble(mouseEvent: MouseEvent) {
|
|
230
|
+
if (!this.videoElementProvider.isVideoReady()) {
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
const toStreamerHandlers =
|
|
234
|
+
this.mouseController.toStreamerMessagesProvider.toStreamerHandlers;
|
|
235
|
+
toStreamerHandlers.get('MouseDouble')([
|
|
236
|
+
mouseEvent.button,
|
|
237
|
+
// We use the store value of this.coord as opposed to the mouseEvent.x/y as the mouseEvent location
|
|
238
|
+
// uses the system cursor location which hasn't moved
|
|
239
|
+
this.coord.x,
|
|
240
|
+
this.coord.y
|
|
241
|
+
]);
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* Handle the press mouse buttons event, sends the mouse data to the UE Instance
|
|
246
|
+
* @param mouseEvent - Mouse Event
|
|
247
|
+
*/
|
|
248
|
+
handlePressMouseButtons(mouseEvent: MouseEvent) {
|
|
249
|
+
if (!this.videoElementProvider.isVideoReady()) {
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
this.mouseController.pressMouseButtons(
|
|
253
|
+
mouseEvent.buttons,
|
|
254
|
+
this.x,
|
|
255
|
+
this.y
|
|
256
|
+
);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* Handle the release mouse buttons event, sends the mouse data to the UE Instance
|
|
261
|
+
* @param mouseEvent - Mouse Event
|
|
262
|
+
*/
|
|
263
|
+
handleReleaseMouseButtons(mouseEvent: MouseEvent) {
|
|
264
|
+
if (!this.videoElementProvider.isVideoReady()) {
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
this.mouseController.releaseMouseButtons(
|
|
268
|
+
mouseEvent.buttons,
|
|
269
|
+
this.x,
|
|
270
|
+
this.y
|
|
271
|
+
);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
/**
|
|
276
|
+
* Extra types for Document and WheelEvent
|
|
277
|
+
*/
|
|
278
|
+
declare global {
|
|
279
|
+
interface Document {
|
|
280
|
+
mozPointerLockElement: unknown;
|
|
281
|
+
mozExitPointerLock?(): void;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
interface WheelEvent {
|
|
285
|
+
wheelDelta: number;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Mouse Button Data
|
|
5
|
+
* {@link https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/button}
|
|
6
|
+
*/
|
|
7
|
+
export class MouseButton {
|
|
8
|
+
static mainButton = 0; // Left button.
|
|
9
|
+
static auxiliaryButton = 1; // Wheel button.
|
|
10
|
+
static secondaryButton = 2; // Right button.
|
|
11
|
+
static fourthButton = 3; // Browser Back button.
|
|
12
|
+
static fifthButton = 4; // Browser Forward button.
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Mouse Button Mask Data
|
|
17
|
+
* {@link https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons}
|
|
18
|
+
*/
|
|
19
|
+
export class MouseButtonsMask {
|
|
20
|
+
static primaryButton = 1; // Left button.
|
|
21
|
+
static secondaryButton = 2; // Right button.
|
|
22
|
+
static auxiliaryButton = 4; // Wheel button.
|
|
23
|
+
static fourthButton = 8; // Browser Back button.
|
|
24
|
+
static fifthButton = 16; // Browser Forward button.
|
|
25
|
+
}
|
|
@@ -0,0 +1,362 @@
|
|
|
1
|
+
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
2
|
+
|
|
3
|
+
import { MouseButtonsMask, MouseButton } from './MouseButtons';
|
|
4
|
+
import { Logger } from '../Logger/Logger';
|
|
5
|
+
import { StreamMessageController } from '../UeInstanceMessage/StreamMessageController';
|
|
6
|
+
import { CoordinateConverter } from '../Util/CoordinateConverter';
|
|
7
|
+
import { VideoPlayer } from '../VideoPlayer/VideoPlayer';
|
|
8
|
+
import { IMouseEvents } from './IMouseEvents';
|
|
9
|
+
import { LockedMouseEvents } from './LockedMouseEvents';
|
|
10
|
+
import { HoveringMouseEvents } from './HoveringMouseEvents';
|
|
11
|
+
import type { ActiveKeys } from './InputClassesFactory';
|
|
12
|
+
import { EventListenerTracker } from '../Util/EventListenerTracker';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Handles the Mouse Inputs for the document
|
|
16
|
+
*/
|
|
17
|
+
export class MouseController {
|
|
18
|
+
videoElementProvider: VideoPlayer;
|
|
19
|
+
toStreamerMessagesProvider: StreamMessageController;
|
|
20
|
+
coordinateConverter: CoordinateConverter;
|
|
21
|
+
activeKeysProvider: ActiveKeys;
|
|
22
|
+
|
|
23
|
+
// Utility for keeping track of event handlers and unregistering them
|
|
24
|
+
private mouseEventListenerTracker = new EventListenerTracker();
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* @param toStreamerMessagesProvider - Stream message instance
|
|
28
|
+
* @param videoElementProvider - Video Player instance
|
|
29
|
+
* @param normalizeAndQuantize - A normalize and quantize instance
|
|
30
|
+
*/
|
|
31
|
+
constructor(
|
|
32
|
+
toStreamerMessagesProvider: StreamMessageController,
|
|
33
|
+
videoElementProvider: VideoPlayer,
|
|
34
|
+
coordinateConverter: CoordinateConverter,
|
|
35
|
+
activeKeysProvider: ActiveKeys
|
|
36
|
+
) {
|
|
37
|
+
this.toStreamerMessagesProvider = toStreamerMessagesProvider;
|
|
38
|
+
this.coordinateConverter = coordinateConverter;
|
|
39
|
+
this.videoElementProvider = videoElementProvider;
|
|
40
|
+
this.activeKeysProvider = activeKeysProvider;
|
|
41
|
+
this.registerMouseEnterAndLeaveEvents();
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Clears all the click events on the current video element parent div
|
|
46
|
+
*/
|
|
47
|
+
unregisterMouseEvents() {
|
|
48
|
+
this.mouseEventListenerTracker.unregisterAll();
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Register a locked mouse class
|
|
53
|
+
* @param mouseController - a mouse controller instance
|
|
54
|
+
* @param playerStyleAttributesProvider - a player style attributes instance
|
|
55
|
+
*/
|
|
56
|
+
registerLockedMouseEvents(mouseController: MouseController) {
|
|
57
|
+
const videoElementParent =
|
|
58
|
+
this.videoElementProvider.getVideoParentElement() as HTMLDivElement;
|
|
59
|
+
const lockedMouseEvents: IMouseEvents = new LockedMouseEvents(
|
|
60
|
+
this.videoElementProvider,
|
|
61
|
+
mouseController,
|
|
62
|
+
this.activeKeysProvider
|
|
63
|
+
);
|
|
64
|
+
|
|
65
|
+
videoElementParent.requestPointerLock =
|
|
66
|
+
videoElementParent.requestPointerLock ||
|
|
67
|
+
videoElementParent.mozRequestPointerLock;
|
|
68
|
+
document.exitPointerLock =
|
|
69
|
+
document.exitPointerLock || document.mozExitPointerLock;
|
|
70
|
+
|
|
71
|
+
// minor hack to alleviate ios not supporting pointerlock
|
|
72
|
+
if (videoElementParent.requestPointerLock) {
|
|
73
|
+
const onclick = () => {
|
|
74
|
+
videoElementParent.requestPointerLock();
|
|
75
|
+
};
|
|
76
|
+
videoElementParent.addEventListener('click', onclick);
|
|
77
|
+
this.mouseEventListenerTracker.addUnregisterCallback(
|
|
78
|
+
() => videoElementParent.removeEventListener('click', onclick)
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const lockStateChangeListener = () =>
|
|
83
|
+
lockedMouseEvents.lockStateChange();
|
|
84
|
+
document.addEventListener(
|
|
85
|
+
'pointerlockchange',
|
|
86
|
+
lockStateChangeListener,
|
|
87
|
+
false
|
|
88
|
+
);
|
|
89
|
+
document.addEventListener(
|
|
90
|
+
'mozpointerlockchange',
|
|
91
|
+
lockStateChangeListener,
|
|
92
|
+
false
|
|
93
|
+
);
|
|
94
|
+
this.mouseEventListenerTracker.addUnregisterCallback(
|
|
95
|
+
() => document.removeEventListener(
|
|
96
|
+
'pointerlockchange',
|
|
97
|
+
lockStateChangeListener,
|
|
98
|
+
false
|
|
99
|
+
)
|
|
100
|
+
);
|
|
101
|
+
this.mouseEventListenerTracker.addUnregisterCallback(
|
|
102
|
+
() => document.removeEventListener(
|
|
103
|
+
'mozpointerlockchange',
|
|
104
|
+
lockStateChangeListener,
|
|
105
|
+
false
|
|
106
|
+
)
|
|
107
|
+
);
|
|
108
|
+
|
|
109
|
+
const onmousedown = (mouseEvent: MouseEvent) =>
|
|
110
|
+
lockedMouseEvents.handleMouseDown(mouseEvent);
|
|
111
|
+
const onmouseup = (mouseEvent: MouseEvent) =>
|
|
112
|
+
lockedMouseEvents.handleMouseUp(mouseEvent);
|
|
113
|
+
const onwheel = (wheelEvent: WheelEvent) =>
|
|
114
|
+
lockedMouseEvents.handleMouseWheel(wheelEvent);
|
|
115
|
+
const ondblclick = (mouseEvent: MouseEvent) =>
|
|
116
|
+
lockedMouseEvents.handleMouseDouble(mouseEvent);
|
|
117
|
+
videoElementParent.addEventListener('mousedown', onmousedown);
|
|
118
|
+
videoElementParent.addEventListener('mouseup', onmouseup);
|
|
119
|
+
videoElementParent.addEventListener('wheel', onwheel);
|
|
120
|
+
videoElementParent.addEventListener('dblclick', ondblclick);
|
|
121
|
+
|
|
122
|
+
this.mouseEventListenerTracker.addUnregisterCallback(
|
|
123
|
+
() => videoElementParent.removeEventListener('mousedown', onmousedown)
|
|
124
|
+
);
|
|
125
|
+
this.mouseEventListenerTracker.addUnregisterCallback(
|
|
126
|
+
() => videoElementParent.removeEventListener('mouseup', onmouseup)
|
|
127
|
+
);
|
|
128
|
+
this.mouseEventListenerTracker.addUnregisterCallback(
|
|
129
|
+
() => videoElementParent.removeEventListener('wheel', onwheel)
|
|
130
|
+
);
|
|
131
|
+
this.mouseEventListenerTracker.addUnregisterCallback(
|
|
132
|
+
() => videoElementParent.removeEventListener('dblclick', ondblclick)
|
|
133
|
+
);
|
|
134
|
+
this.mouseEventListenerTracker.addUnregisterCallback(
|
|
135
|
+
() => lockedMouseEvents.unregisterMouseEvents()
|
|
136
|
+
);
|
|
137
|
+
this.mouseEventListenerTracker.addUnregisterCallback(() => {
|
|
138
|
+
if (
|
|
139
|
+
document.exitPointerLock &&
|
|
140
|
+
(document.pointerLockElement === videoElementParent ||
|
|
141
|
+
document.mozPointerLockElement === videoElementParent)
|
|
142
|
+
) {
|
|
143
|
+
document.exitPointerLock();
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Register a hovering mouse class
|
|
150
|
+
* @param mouseController - A mouse controller object
|
|
151
|
+
*/
|
|
152
|
+
registerHoveringMouseEvents(mouseController: MouseController) {
|
|
153
|
+
const videoElementParent =
|
|
154
|
+
this.videoElementProvider.getVideoParentElement() as HTMLDivElement;
|
|
155
|
+
const hoveringMouseEvents = new HoveringMouseEvents(mouseController);
|
|
156
|
+
|
|
157
|
+
const onmousemove = (mouseEvent: MouseEvent) =>
|
|
158
|
+
hoveringMouseEvents.updateMouseMovePosition(mouseEvent);
|
|
159
|
+
const onmousedown = (mouseEvent: MouseEvent) =>
|
|
160
|
+
hoveringMouseEvents.handleMouseDown(mouseEvent);
|
|
161
|
+
const onmouseup = (mouseEvent: MouseEvent) =>
|
|
162
|
+
hoveringMouseEvents.handleMouseUp(mouseEvent);
|
|
163
|
+
const oncontextmenu = (mouseEvent: MouseEvent) =>
|
|
164
|
+
hoveringMouseEvents.handleContextMenu(mouseEvent);
|
|
165
|
+
const onwheel = (wheelEvent: WheelEvent) =>
|
|
166
|
+
hoveringMouseEvents.handleMouseWheel(wheelEvent);
|
|
167
|
+
const ondblclick = (mouseEvent: MouseEvent) =>
|
|
168
|
+
hoveringMouseEvents.handleMouseDouble(mouseEvent);
|
|
169
|
+
videoElementParent.addEventListener('mousemove', onmousemove);
|
|
170
|
+
videoElementParent.addEventListener('mousedown', onmousedown);
|
|
171
|
+
videoElementParent.addEventListener('mouseup', onmouseup);
|
|
172
|
+
videoElementParent.addEventListener('contextmenu', oncontextmenu);
|
|
173
|
+
videoElementParent.addEventListener('wheel', onwheel);
|
|
174
|
+
videoElementParent.addEventListener('dblclick', ondblclick);
|
|
175
|
+
|
|
176
|
+
this.mouseEventListenerTracker.addUnregisterCallback(
|
|
177
|
+
() => videoElementParent.removeEventListener('mousemove', onmousemove)
|
|
178
|
+
);
|
|
179
|
+
this.mouseEventListenerTracker.addUnregisterCallback(
|
|
180
|
+
() => videoElementParent.removeEventListener('mousedown', onmousedown)
|
|
181
|
+
);
|
|
182
|
+
this.mouseEventListenerTracker.addUnregisterCallback(
|
|
183
|
+
() => videoElementParent.removeEventListener('mouseup', onmouseup)
|
|
184
|
+
);
|
|
185
|
+
this.mouseEventListenerTracker.addUnregisterCallback(
|
|
186
|
+
() => videoElementParent.removeEventListener('contextmenu', oncontextmenu)
|
|
187
|
+
);
|
|
188
|
+
this.mouseEventListenerTracker.addUnregisterCallback(
|
|
189
|
+
() => videoElementParent.removeEventListener('wheel', onwheel)
|
|
190
|
+
);
|
|
191
|
+
this.mouseEventListenerTracker.addUnregisterCallback(
|
|
192
|
+
() => videoElementParent.removeEventListener('dblclick', ondblclick)
|
|
193
|
+
);
|
|
194
|
+
this.mouseEventListenerTracker.addUnregisterCallback(
|
|
195
|
+
() => hoveringMouseEvents.unregisterMouseEvents()
|
|
196
|
+
);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* Set the mouse enter and mouse leave events
|
|
201
|
+
*/
|
|
202
|
+
registerMouseEnterAndLeaveEvents() {
|
|
203
|
+
const videoElementParent =
|
|
204
|
+
this.videoElementProvider.getVideoParentElement() as HTMLDivElement;
|
|
205
|
+
|
|
206
|
+
// Handle when the Mouse has entered the element
|
|
207
|
+
const onmouseenter = (event: MouseEvent) => {
|
|
208
|
+
if (!this.videoElementProvider.isVideoReady()) {
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
Logger.Log(Logger.GetStackTrace(), 'Mouse Entered', 6);
|
|
212
|
+
this.sendMouseEnter();
|
|
213
|
+
this.pressMouseButtons(event.buttons, event.x, event.y);
|
|
214
|
+
};
|
|
215
|
+
|
|
216
|
+
// Handles when the mouse has left the element
|
|
217
|
+
const onmouseleave = (event: MouseEvent) => {
|
|
218
|
+
if (!this.videoElementProvider.isVideoReady()) {
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
Logger.Log(Logger.GetStackTrace(), 'Mouse Left', 6);
|
|
222
|
+
this.sendMouseLeave();
|
|
223
|
+
this.releaseMouseButtons(event.buttons, event.x, event.y);
|
|
224
|
+
};
|
|
225
|
+
videoElementParent.addEventListener('mouseenter', onmouseenter);
|
|
226
|
+
videoElementParent.addEventListener('mouseleave', onmouseleave);
|
|
227
|
+
|
|
228
|
+
this.mouseEventListenerTracker.addUnregisterCallback(
|
|
229
|
+
() => videoElementParent.removeEventListener('mouseenter', onmouseenter)
|
|
230
|
+
);
|
|
231
|
+
this.mouseEventListenerTracker.addUnregisterCallback(
|
|
232
|
+
() => videoElementParent.removeEventListener('mouseleave', onmouseleave)
|
|
233
|
+
);
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* Handle when a mouse button is released
|
|
238
|
+
* @param buttons - Mouse Button
|
|
239
|
+
* @param X - Mouse pointer X coordinate
|
|
240
|
+
* @param Y - Mouse pointer Y coordinate
|
|
241
|
+
*/
|
|
242
|
+
releaseMouseButtons(buttons: number, X: number, Y: number) {
|
|
243
|
+
const coord = this.coordinateConverter.normalizeAndQuantizeUnsigned(
|
|
244
|
+
X,
|
|
245
|
+
Y
|
|
246
|
+
);
|
|
247
|
+
if (buttons & MouseButtonsMask.primaryButton) {
|
|
248
|
+
this.sendMouseUp(MouseButton.mainButton, coord.x, coord.y);
|
|
249
|
+
}
|
|
250
|
+
if (buttons & MouseButtonsMask.secondaryButton) {
|
|
251
|
+
this.sendMouseUp(MouseButton.secondaryButton, coord.x, coord.y);
|
|
252
|
+
}
|
|
253
|
+
if (buttons & MouseButtonsMask.auxiliaryButton) {
|
|
254
|
+
this.sendMouseUp(MouseButton.auxiliaryButton, coord.x, coord.y);
|
|
255
|
+
}
|
|
256
|
+
if (buttons & MouseButtonsMask.fourthButton) {
|
|
257
|
+
this.sendMouseUp(MouseButton.fourthButton, coord.x, coord.y);
|
|
258
|
+
}
|
|
259
|
+
if (buttons & MouseButtonsMask.fifthButton) {
|
|
260
|
+
this.sendMouseUp(MouseButton.fifthButton, coord.x, coord.y);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* Handle when a mouse button is pressed
|
|
266
|
+
* @param buttons - Mouse Button
|
|
267
|
+
* @param X - Mouse pointer X coordinate
|
|
268
|
+
* @param Y - Mouse pointer Y coordinate
|
|
269
|
+
*/
|
|
270
|
+
pressMouseButtons(buttons: number, X: number, Y: number) {
|
|
271
|
+
if (!this.videoElementProvider.isVideoReady()) {
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
const coord = this.coordinateConverter.normalizeAndQuantizeUnsigned(
|
|
275
|
+
X,
|
|
276
|
+
Y
|
|
277
|
+
);
|
|
278
|
+
if (buttons & MouseButtonsMask.primaryButton) {
|
|
279
|
+
this.sendMouseDown(MouseButton.mainButton, coord.x, coord.y);
|
|
280
|
+
}
|
|
281
|
+
if (buttons & MouseButtonsMask.secondaryButton) {
|
|
282
|
+
this.sendMouseDown(MouseButton.secondaryButton, coord.x, coord.y);
|
|
283
|
+
}
|
|
284
|
+
if (buttons & MouseButtonsMask.auxiliaryButton) {
|
|
285
|
+
this.sendMouseDown(MouseButton.auxiliaryButton, coord.x, coord.y);
|
|
286
|
+
}
|
|
287
|
+
if (buttons & MouseButtonsMask.fourthButton) {
|
|
288
|
+
this.sendMouseDown(MouseButton.fourthButton, coord.x, coord.y);
|
|
289
|
+
}
|
|
290
|
+
if (buttons & MouseButtonsMask.fifthButton) {
|
|
291
|
+
this.sendMouseDown(MouseButton.fifthButton, coord.x, coord.y);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
/**
|
|
296
|
+
* Handles mouse enter
|
|
297
|
+
*/
|
|
298
|
+
sendMouseEnter() {
|
|
299
|
+
if (!this.videoElementProvider.isVideoReady()) {
|
|
300
|
+
return;
|
|
301
|
+
}
|
|
302
|
+
const toStreamerHandlers =
|
|
303
|
+
this.toStreamerMessagesProvider.toStreamerHandlers;
|
|
304
|
+
toStreamerHandlers.get('MouseEnter')();
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
/**
|
|
308
|
+
* Handles mouse Leave
|
|
309
|
+
*/
|
|
310
|
+
sendMouseLeave() {
|
|
311
|
+
if (!this.videoElementProvider.isVideoReady()) {
|
|
312
|
+
return;
|
|
313
|
+
}
|
|
314
|
+
const toStreamerHandlers =
|
|
315
|
+
this.toStreamerMessagesProvider.toStreamerHandlers;
|
|
316
|
+
toStreamerHandlers.get('MouseLeave')();
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
/**
|
|
320
|
+
* Handles when a mouse button is pressed down
|
|
321
|
+
* @param button - Mouse Button Pressed
|
|
322
|
+
* @param X - Mouse X Coordinate
|
|
323
|
+
* @param Y - Mouse Y Coordinate
|
|
324
|
+
*/
|
|
325
|
+
sendMouseDown(button: number, X: number, Y: number) {
|
|
326
|
+
if (!this.videoElementProvider.isVideoReady()) {
|
|
327
|
+
return;
|
|
328
|
+
}
|
|
329
|
+
Logger.Log(
|
|
330
|
+
Logger.GetStackTrace(),
|
|
331
|
+
`mouse button ${button} down at (${X}, ${Y})`,
|
|
332
|
+
6
|
|
333
|
+
);
|
|
334
|
+
const toStreamerHandlers =
|
|
335
|
+
this.toStreamerMessagesProvider.toStreamerHandlers;
|
|
336
|
+
toStreamerHandlers.get('MouseDown')([button, X, Y]);
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
/**
|
|
340
|
+
* Handles when a mouse button is pressed up
|
|
341
|
+
* @param button - Mouse Button Pressed
|
|
342
|
+
* @param X - Mouse X Coordinate
|
|
343
|
+
* @param Y - Mouse Y Coordinate
|
|
344
|
+
*/
|
|
345
|
+
sendMouseUp(button: number, X: number, Y: number) {
|
|
346
|
+
if (!this.videoElementProvider.isVideoReady()) {
|
|
347
|
+
return;
|
|
348
|
+
}
|
|
349
|
+
Logger.Log(
|
|
350
|
+
Logger.GetStackTrace(),
|
|
351
|
+
`mouse button ${button} up at (${X}, ${Y})`,
|
|
352
|
+
6
|
|
353
|
+
);
|
|
354
|
+
const coord = this.coordinateConverter.normalizeAndQuantizeUnsigned(
|
|
355
|
+
X,
|
|
356
|
+
Y
|
|
357
|
+
);
|
|
358
|
+
const toStreamerHandlers =
|
|
359
|
+
this.toStreamerMessagesProvider.toStreamerHandlers;
|
|
360
|
+
toStreamerHandlers.get('MouseUp')([button, coord.x, coord.y]);
|
|
361
|
+
}
|
|
362
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Registers the Special Key codes
|
|
5
|
+
* Must be kept in sync with JavaScriptKeyCodeToFKey C++ array.
|
|
6
|
+
* The index of the entry in the array is the special key code given below.
|
|
7
|
+
*/
|
|
8
|
+
export class SpecialKeyCodes {
|
|
9
|
+
static backSpace = 8;
|
|
10
|
+
static shift = 16;
|
|
11
|
+
static control = 17;
|
|
12
|
+
static alt = 18;
|
|
13
|
+
static rightShift = 253;
|
|
14
|
+
static rightControl = 254;
|
|
15
|
+
static rightAlt = 255;
|
|
16
|
+
}
|