@yang__yj/pixelstreaming-core 1.0.0 → 1.0.1
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/jest.config.js +18 -0
- package/package.json +46 -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 +2144 -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/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/{library/dist → dist}/lib-pixelstreamingfrontend.esm.js +0 -0
- /package/{library/dist → dist}/lib-pixelstreamingfrontend.js +0 -0
- /package/{library/types → types}/AFK/AFKController.d.ts +0 -0
- /package/{library/types → types}/Config/Config.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/HoveringMouseEvents.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/PeerConnectionController.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}/PixelStreaming/PixelStreaming.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/SendMessageController.d.ts +0 -0
- /package/{library/types → types}/UeInstanceMessage/StreamMessageController.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/EventEmitter.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}/VideoPlayer/StreamController.d.ts +0 -0
- /package/{library/types → types}/VideoPlayer/VideoPlayer.d.ts +0 -0
- /package/{library/types → types}/WebRtcPlayer/WebRtcPlayerController.d.ts +0 -0
- /package/{library/types → types}/WebSockets/MessageReceive.d.ts +0 -0
- /package/{library/types → types}/WebSockets/MessageSend.d.ts +0 -0
- /package/{library/types → types}/WebSockets/SignallingProtocol.d.ts +0 -0
- /package/{library/types → types}/WebSockets/WebSocketController.d.ts +0 -0
- /package/{library/types → types}/WebXR/WebXRController.d.ts +0 -0
- /package/{library/types → types}/pixelstreamingfrontend.d.ts +0 -0
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
2
|
+
|
|
3
|
+
import { Logger } from '../Logger/Logger';
|
|
4
|
+
import { CoordinateConverter } from '../Util/CoordinateConverter';
|
|
5
|
+
import { StreamMessageController } from '../UeInstanceMessage/StreamMessageController';
|
|
6
|
+
import { VideoPlayer } from '../VideoPlayer/VideoPlayer';
|
|
7
|
+
import { ITouchController } from './ITouchController';
|
|
8
|
+
import { EventListenerTracker } from '../Util/EventListenerTracker';
|
|
9
|
+
/**
|
|
10
|
+
* Handles the Touch input Events
|
|
11
|
+
*/
|
|
12
|
+
export class TouchController implements ITouchController {
|
|
13
|
+
toStreamerMessagesProvider: StreamMessageController;
|
|
14
|
+
videoElementProvider: VideoPlayer;
|
|
15
|
+
coordinateConverter: CoordinateConverter;
|
|
16
|
+
videoElementParent: HTMLVideoElement;
|
|
17
|
+
fingers = [9, 8, 7, 6, 5, 4, 3, 2, 1, 0];
|
|
18
|
+
fingerIds = new Map();
|
|
19
|
+
maxByteValue = 255;
|
|
20
|
+
|
|
21
|
+
// Utility for keeping track of event handlers and unregistering them
|
|
22
|
+
private touchEventListenerTracker = new EventListenerTracker();
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* @param toStreamerMessagesProvider - Stream message instance
|
|
26
|
+
* @param videoElementProvider - Video Player instance
|
|
27
|
+
* @param coordinateConverter - A coordinate converter instance
|
|
28
|
+
*/
|
|
29
|
+
constructor(
|
|
30
|
+
toStreamerMessagesProvider: StreamMessageController,
|
|
31
|
+
videoElementProvider: VideoPlayer,
|
|
32
|
+
coordinateConverter: CoordinateConverter
|
|
33
|
+
) {
|
|
34
|
+
this.toStreamerMessagesProvider = toStreamerMessagesProvider;
|
|
35
|
+
this.videoElementProvider = videoElementProvider;
|
|
36
|
+
this.coordinateConverter = coordinateConverter;
|
|
37
|
+
this.videoElementParent = videoElementProvider.getVideoElement();
|
|
38
|
+
const ontouchstart = (ev: TouchEvent) =>
|
|
39
|
+
this.onTouchStart(ev);
|
|
40
|
+
const ontouchend = (ev: TouchEvent) =>
|
|
41
|
+
this.onTouchEnd(ev);
|
|
42
|
+
const ontouchmove = (ev: TouchEvent) =>
|
|
43
|
+
this.onTouchMove(ev);
|
|
44
|
+
this.videoElementParent.addEventListener('touchstart', ontouchstart);
|
|
45
|
+
this.videoElementParent.addEventListener('touchend', ontouchend);
|
|
46
|
+
this.videoElementParent.addEventListener('touchmove', ontouchmove);
|
|
47
|
+
this.touchEventListenerTracker.addUnregisterCallback(
|
|
48
|
+
() => this.videoElementParent.removeEventListener('touchstart', ontouchstart)
|
|
49
|
+
);
|
|
50
|
+
this.touchEventListenerTracker.addUnregisterCallback(
|
|
51
|
+
() => this.videoElementParent.removeEventListener('touchend', ontouchend)
|
|
52
|
+
);
|
|
53
|
+
this.touchEventListenerTracker.addUnregisterCallback(
|
|
54
|
+
() => this.videoElementParent.removeEventListener('touchmove', ontouchmove)
|
|
55
|
+
);
|
|
56
|
+
Logger.Log(Logger.GetStackTrace(), 'Touch Events Registered', 6);
|
|
57
|
+
|
|
58
|
+
// is this strictly necessary?
|
|
59
|
+
const preventOnTouchMove = (event: TouchEvent) => {
|
|
60
|
+
event.preventDefault();
|
|
61
|
+
};
|
|
62
|
+
document.addEventListener('touchmove', preventOnTouchMove);
|
|
63
|
+
this.touchEventListenerTracker.addUnregisterCallback(
|
|
64
|
+
() => document.removeEventListener('touchmove', preventOnTouchMove)
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Unregister all touch events
|
|
70
|
+
*/
|
|
71
|
+
unregisterTouchEvents() {
|
|
72
|
+
this.touchEventListenerTracker.unregisterAll();
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Remember a touch command
|
|
77
|
+
* @param touch - the touch command
|
|
78
|
+
*/
|
|
79
|
+
rememberTouch(touch: Touch) {
|
|
80
|
+
const finger = this.fingers.pop();
|
|
81
|
+
if (finger === undefined) {
|
|
82
|
+
Logger.Log(
|
|
83
|
+
Logger.GetStackTrace(),
|
|
84
|
+
'exhausted touch identifiers',
|
|
85
|
+
6
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
this.fingerIds.set(touch.identifier, finger);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Forgets a touch command
|
|
93
|
+
* @param touch - the touch command
|
|
94
|
+
*/
|
|
95
|
+
forgetTouch(touch: Touch) {
|
|
96
|
+
this.fingers.push(this.fingerIds.get(touch.identifier));
|
|
97
|
+
// Sort array back into descending order. This means if finger '1' were to lift after finger '0', we would ensure that 0 will be the first index to pop
|
|
98
|
+
this.fingers.sort(function (a, b) {
|
|
99
|
+
return b - a;
|
|
100
|
+
});
|
|
101
|
+
this.fingerIds.delete(touch.identifier);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* When a touch event starts
|
|
106
|
+
* @param touchEvent - the touch event being intercepted
|
|
107
|
+
*/
|
|
108
|
+
onTouchStart(touchEvent: TouchEvent) {
|
|
109
|
+
if (!this.videoElementProvider.isVideoReady()) {
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
for (let t = 0; t < touchEvent.changedTouches.length; t++) {
|
|
113
|
+
this.rememberTouch(touchEvent.changedTouches[t]);
|
|
114
|
+
}
|
|
115
|
+
Logger.Log(Logger.GetStackTrace(), 'touch start', 6);
|
|
116
|
+
|
|
117
|
+
this.emitTouchData('TouchStart', touchEvent.changedTouches);
|
|
118
|
+
touchEvent.preventDefault();
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* When a touch event ends
|
|
123
|
+
* @param touchEvent - the touch event being intercepted
|
|
124
|
+
*/
|
|
125
|
+
onTouchEnd(touchEvent: TouchEvent) {
|
|
126
|
+
if (!this.videoElementProvider.isVideoReady()) {
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
Logger.Log(Logger.GetStackTrace(), 'touch end', 6);
|
|
130
|
+
this.emitTouchData('TouchEnd', touchEvent.changedTouches);
|
|
131
|
+
// Re-cycle unique identifiers previously assigned to each touch.
|
|
132
|
+
for (let t = 0; t < touchEvent.changedTouches.length; t++) {
|
|
133
|
+
this.forgetTouch(touchEvent.changedTouches[t]);
|
|
134
|
+
}
|
|
135
|
+
touchEvent.preventDefault();
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* when a moving touch event occurs
|
|
140
|
+
* @param touchEvent - the touch event being intercepted
|
|
141
|
+
*/
|
|
142
|
+
onTouchMove(touchEvent: TouchEvent) {
|
|
143
|
+
if (!this.videoElementProvider.isVideoReady()) {
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
Logger.Log(Logger.GetStackTrace(), 'touch move', 6);
|
|
147
|
+
this.emitTouchData('TouchMove', touchEvent.touches);
|
|
148
|
+
touchEvent.preventDefault();
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
emitTouchData(type: string, touches: TouchList) {
|
|
152
|
+
|
|
153
|
+
// 计算手机触屏ue
|
|
154
|
+
// 问题来源:最开始触屏传参是为手机当前可视化内容区域内的px 因为手机的1px并不是一个像素,
|
|
155
|
+
// 如(600*300) 导致跟ue触屏位置不准确
|
|
156
|
+
// 解决:将手机px转换为物理分辨率,根据分辨率来计算位置
|
|
157
|
+
|
|
158
|
+
// 目前是页面强制横屏 所以触屏的x,y轴都不变,需要转换才能
|
|
159
|
+
let screen = document.querySelector(".screen");
|
|
160
|
+
// ue 宽分辨率
|
|
161
|
+
let ueWidth = parseInt(
|
|
162
|
+
screen.getBoundingClientRect().width * window.devicePixelRatio
|
|
163
|
+
);
|
|
164
|
+
// ue 高分辨率
|
|
165
|
+
let ueHeight = parseInt(
|
|
166
|
+
screen.getBoundingClientRect().height * window.devicePixelRatio
|
|
167
|
+
);
|
|
168
|
+
// 总宽分辨率
|
|
169
|
+
let ratioWidth = parseInt(window.screen.width * window.devicePixelRatio);
|
|
170
|
+
// 总高分辨率
|
|
171
|
+
let ratioHeight = parseInt(window.screen.height * window.devicePixelRatio);
|
|
172
|
+
// 计算导航栏的分辨率
|
|
173
|
+
let headWidth =
|
|
174
|
+
ratioWidth -
|
|
175
|
+
parseInt(document.documentElement.clientWidth * window.devicePixelRatio);
|
|
176
|
+
// 计算导航栏的分辨率
|
|
177
|
+
let headHeight =
|
|
178
|
+
ratioHeight -
|
|
179
|
+
parseInt(document.documentElement.clientHeight * window.devicePixelRatio);
|
|
180
|
+
// 固定宽
|
|
181
|
+
let clientWidth = document.querySelector(".screen").clientWidth / ueHeight;
|
|
182
|
+
// 固定高
|
|
183
|
+
let clientHeight = document.querySelector(".screen").clientHeight / ueWidth;
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
if (!this.videoElementProvider.isVideoReady()) {
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
const offset = this.videoElementProvider.getVideoParentElement().getBoundingClientRect();
|
|
190
|
+
const toStreamerHandlers =
|
|
191
|
+
this.toStreamerMessagesProvider.toStreamerHandlers;
|
|
192
|
+
|
|
193
|
+
for (let t = 0; t < touches.length; t++) {
|
|
194
|
+
const numTouches = 1; // the number of touches to be sent this message
|
|
195
|
+
const touch = touches[t];
|
|
196
|
+
let x, y;
|
|
197
|
+
// const x = touch.clientX - offset.left;
|
|
198
|
+
// const y = touch.clientY - offset.top;
|
|
199
|
+
|
|
200
|
+
x =
|
|
201
|
+
clientHeight *
|
|
202
|
+
(parseInt(touch.clientY * window.devicePixelRatio) -
|
|
203
|
+
parseInt((ratioHeight - headHeight - ueHeight) / 2));
|
|
204
|
+
y =
|
|
205
|
+
clientWidth *
|
|
206
|
+
(ueWidth -
|
|
207
|
+
(parseInt(touch.clientX * window.devicePixelRatio) -
|
|
208
|
+
parseInt((ratioWidth - ueWidth) / 2)));
|
|
209
|
+
Logger.Log(
|
|
210
|
+
Logger.GetStackTrace(),
|
|
211
|
+
`F${this.fingerIds.get(touch.identifier)}=(${x}, ${y})`,
|
|
212
|
+
6
|
|
213
|
+
);
|
|
214
|
+
|
|
215
|
+
const coord = this.coordinateConverter.normalizeAndQuantizeUnsigned(
|
|
216
|
+
x,
|
|
217
|
+
y
|
|
218
|
+
);
|
|
219
|
+
switch (type) {
|
|
220
|
+
case 'TouchStart':
|
|
221
|
+
toStreamerHandlers.get('TouchStart')([
|
|
222
|
+
numTouches,
|
|
223
|
+
coord.x,
|
|
224
|
+
coord.y,
|
|
225
|
+
this.fingerIds.get(touch.identifier),
|
|
226
|
+
this.maxByteValue * touch.force,
|
|
227
|
+
coord.inRange ? 1 : 0
|
|
228
|
+
]);
|
|
229
|
+
break;
|
|
230
|
+
case 'TouchEnd':
|
|
231
|
+
toStreamerHandlers.get('TouchEnd')([
|
|
232
|
+
numTouches,
|
|
233
|
+
coord.x,
|
|
234
|
+
coord.y,
|
|
235
|
+
this.fingerIds.get(touch.identifier),
|
|
236
|
+
this.maxByteValue * touch.force,
|
|
237
|
+
coord.inRange ? 1 : 0
|
|
238
|
+
]);
|
|
239
|
+
break;
|
|
240
|
+
case 'TouchMove':
|
|
241
|
+
toStreamerHandlers.get('TouchMove')([
|
|
242
|
+
numTouches,
|
|
243
|
+
coord.x,
|
|
244
|
+
coord.y,
|
|
245
|
+
this.fingerIds.get(touch.identifier),
|
|
246
|
+
this.maxByteValue * touch.force,
|
|
247
|
+
coord.inRange ? 1 : 0
|
|
248
|
+
]);
|
|
249
|
+
break;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
2
|
+
|
|
3
|
+
import { StreamMessageController } from '../UeInstanceMessage/StreamMessageController';
|
|
4
|
+
import { Controller } from './GamepadTypes';
|
|
5
|
+
import { WebXRUtils } from '../Util/WebXRUtils';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* The class that handles the functionality of xrgamepads and controllers
|
|
9
|
+
*/
|
|
10
|
+
export class XRGamepadController {
|
|
11
|
+
controllers: Array<Controller>;
|
|
12
|
+
toStreamerMessagesProvider: StreamMessageController;
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* @param toStreamerMessagesProvider - Stream message instance
|
|
16
|
+
*/
|
|
17
|
+
constructor(toStreamerMessagesProvider: StreamMessageController) {
|
|
18
|
+
this.toStreamerMessagesProvider = toStreamerMessagesProvider;
|
|
19
|
+
this.controllers = [];
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
updateStatus(
|
|
23
|
+
source: XRInputSource,
|
|
24
|
+
frame: XRFrame,
|
|
25
|
+
refSpace: XRReferenceSpace
|
|
26
|
+
) {
|
|
27
|
+
if (source.gamepad) {
|
|
28
|
+
const gamepadPose = frame.getPose(source.gripSpace, refSpace);
|
|
29
|
+
if (!gamepadPose) {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
let system = 0;
|
|
34
|
+
if (source.profiles.includes('htc-vive')) {
|
|
35
|
+
system = 1;
|
|
36
|
+
} else if (source.profiles.includes('oculus-touch')) {
|
|
37
|
+
system = 2;
|
|
38
|
+
}
|
|
39
|
+
// TODO (william.belcher): Add other profiles (Quest, Microsoft Mixed Reality, etc)
|
|
40
|
+
this.toStreamerMessagesProvider.toStreamerHandlers.get('XRSystem')([
|
|
41
|
+
system
|
|
42
|
+
]);
|
|
43
|
+
|
|
44
|
+
// Default: AnyHand (2)
|
|
45
|
+
let handedness = 2;
|
|
46
|
+
switch (source.handedness) {
|
|
47
|
+
case 'left':
|
|
48
|
+
handedness = 0;
|
|
49
|
+
break;
|
|
50
|
+
case 'right':
|
|
51
|
+
handedness = 1;
|
|
52
|
+
break;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Send controller transform
|
|
56
|
+
const matrix = gamepadPose.transform.matrix;
|
|
57
|
+
const mat = [];
|
|
58
|
+
for (let i = 0; i < 16; i++) {
|
|
59
|
+
mat[i] = new Float32Array([matrix[i]])[0];
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// prettier-ignore
|
|
63
|
+
this.toStreamerMessagesProvider.toStreamerHandlers.get('XRControllerTransform')([
|
|
64
|
+
mat[0], mat[4], mat[8], mat[12],
|
|
65
|
+
mat[1], mat[5], mat[9], mat[13],
|
|
66
|
+
mat[2], mat[6], mat[10], mat[14],
|
|
67
|
+
mat[3], mat[7], mat[11], mat[15],
|
|
68
|
+
handedness
|
|
69
|
+
]);
|
|
70
|
+
|
|
71
|
+
// Handle controller buttons and axes
|
|
72
|
+
if (this.controllers[handedness] === undefined) {
|
|
73
|
+
this.controllers[handedness] = {
|
|
74
|
+
prevState: undefined,
|
|
75
|
+
currentState: undefined,
|
|
76
|
+
id: undefined
|
|
77
|
+
};
|
|
78
|
+
this.controllers[handedness].prevState =
|
|
79
|
+
WebXRUtils.deepCopyGamepad(source.gamepad);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
this.controllers[handedness].currentState =
|
|
83
|
+
WebXRUtils.deepCopyGamepad(source.gamepad);
|
|
84
|
+
|
|
85
|
+
const controller = this.controllers[handedness];
|
|
86
|
+
const currState = controller.currentState;
|
|
87
|
+
const prevState = controller.prevState;
|
|
88
|
+
// Iterate over buttons
|
|
89
|
+
for (let i = 0; i < currState.buttons.length; i++) {
|
|
90
|
+
const currButton = currState.buttons[i];
|
|
91
|
+
const prevButton = prevState.buttons[i];
|
|
92
|
+
|
|
93
|
+
if (currButton.pressed) {
|
|
94
|
+
// press
|
|
95
|
+
this.toStreamerMessagesProvider.toStreamerHandlers.get(
|
|
96
|
+
'XRButtonPressed'
|
|
97
|
+
)([handedness, i, prevButton.pressed ? 1 : 0]);
|
|
98
|
+
} else if (!currButton.pressed && prevButton.pressed) {
|
|
99
|
+
this.toStreamerMessagesProvider.toStreamerHandlers.get(
|
|
100
|
+
'XRButtonReleased'
|
|
101
|
+
)([handedness, i, 0]);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
if (currButton.touched && !currButton.pressed) {
|
|
105
|
+
// press
|
|
106
|
+
this.toStreamerMessagesProvider.toStreamerHandlers.get(
|
|
107
|
+
'XRButtonPressed'
|
|
108
|
+
)([handedness, 3, prevButton.touched ? 1 : 0]);
|
|
109
|
+
} else if (!currButton.touched && prevButton.touched) {
|
|
110
|
+
this.toStreamerMessagesProvider.toStreamerHandlers.get(
|
|
111
|
+
'XRButtonReleased'
|
|
112
|
+
)([handedness, 3, 0]);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// Iterate over gamepad axes
|
|
117
|
+
for (let i = 0; i < currState.axes.length; i++) {
|
|
118
|
+
this.toStreamerMessagesProvider.toStreamerHandlers.get(
|
|
119
|
+
'XRAnalog'
|
|
120
|
+
)([handedness, i, currState.axes[i]]);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
this.controllers[handedness].prevState = currState;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
2
|
+
|
|
3
|
+
export class Logger {
|
|
4
|
+
static verboseLogLevel = 5;
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Captures the stack and returns it
|
|
8
|
+
* @returns the current stack
|
|
9
|
+
*/
|
|
10
|
+
static GetStackTrace() {
|
|
11
|
+
const error = new Error();
|
|
12
|
+
let formattedStack = 'No Stack Available for this browser';
|
|
13
|
+
|
|
14
|
+
// format the error
|
|
15
|
+
if (error.stack) {
|
|
16
|
+
formattedStack = error.stack.toString().replace(/Error/g, '');
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
return formattedStack;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Set the log verbosity level
|
|
24
|
+
*/
|
|
25
|
+
static SetLoggerVerbosity(verboseLogLevel: number) {
|
|
26
|
+
if (this.verboseLogLevel != null) {
|
|
27
|
+
this.verboseLogLevel = verboseLogLevel;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* The standard logging output
|
|
33
|
+
* @param stack - the stack trace
|
|
34
|
+
* @param message - the message to be logged
|
|
35
|
+
* @param verbosity - the verbosity level
|
|
36
|
+
*/
|
|
37
|
+
static Log(stack: string, message: string, verbosity?: number) {
|
|
38
|
+
if (verbosity > this.verboseLogLevel) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const returnString = `Level: Log\nMsg: ${message}\nCaller: ${stack}`;
|
|
43
|
+
console.log(returnString);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* The standard logging output
|
|
48
|
+
* @param stack - the stack trace
|
|
49
|
+
* @param message - the message to be logged
|
|
50
|
+
* @param verbosity - the verbosity level
|
|
51
|
+
*/
|
|
52
|
+
static Info(stack: string, message: string, verbosity?: number) {
|
|
53
|
+
if (verbosity > this.verboseLogLevel) {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const returnString = `Level: Info\nMsg: ${message}`;
|
|
58
|
+
console.info(returnString);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* The standard logging output
|
|
63
|
+
* @param stack - the stack trace
|
|
64
|
+
* @param message - the message to be logged
|
|
65
|
+
*/
|
|
66
|
+
static Error(stack: string, message: string) {
|
|
67
|
+
const returnString = `Level: Error\nMsg: ${message}\nCaller: ${stack}`;
|
|
68
|
+
console.error(returnString);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* The standard logging output
|
|
73
|
+
* @param stack - the stack trace
|
|
74
|
+
* @param message - the message to be logged
|
|
75
|
+
*/
|
|
76
|
+
static Warning(stack: string, message: string) {
|
|
77
|
+
const returnString = `Level: Warning\nCaller: ${stack}\nMsg: ${message}`;
|
|
78
|
+
console.warn(returnString);
|
|
79
|
+
}
|
|
80
|
+
}
|