@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.
Files changed (243) hide show
  1. package/.cspell.json +48 -0
  2. package/.eslintignore +8 -0
  3. package/.eslintrc.js +8 -0
  4. package/.prettierignore +0 -0
  5. package/.prettierrc.json +6 -0
  6. package/coverage/clover.xml +3480 -0
  7. package/coverage/coverage-final.json +62 -0
  8. package/coverage/lcov-report/base.css +224 -0
  9. package/coverage/lcov-report/block-navigation.js +87 -0
  10. package/coverage/lcov-report/favicon.png +0 -0
  11. package/coverage/lcov-report/index.html +356 -0
  12. package/coverage/lcov-report/prettify.css +1 -0
  13. package/coverage/lcov-report/prettify.js +2 -0
  14. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  15. package/coverage/lcov-report/sorter.js +196 -0
  16. package/coverage/lcov-report/src/AFK/AFKController.ts.html +559 -0
  17. package/coverage/lcov-report/src/AFK/index.html +116 -0
  18. package/coverage/lcov-report/src/Config/Config.ts.html +2764 -0
  19. package/coverage/lcov-report/src/Config/SettingBase.ts.html +280 -0
  20. package/coverage/lcov-report/src/Config/SettingFlag.ts.html +382 -0
  21. package/coverage/lcov-report/src/Config/SettingNumber.ts.html +418 -0
  22. package/coverage/lcov-report/src/Config/SettingOption.ts.html +424 -0
  23. package/coverage/lcov-report/src/Config/SettingText.ts.html +331 -0
  24. package/coverage/lcov-report/src/Config/index.html +191 -0
  25. package/coverage/lcov-report/src/DataChannel/DataChannelController.ts.html +499 -0
  26. package/coverage/lcov-report/src/DataChannel/DataChannelSender.ts.html +262 -0
  27. package/coverage/lcov-report/src/DataChannel/InitialSettings.ts.html +268 -0
  28. package/coverage/lcov-report/src/DataChannel/LatencyTestResults.ts.html +313 -0
  29. package/coverage/lcov-report/src/DataChannel/index.html +161 -0
  30. package/coverage/lcov-report/src/FreezeFrame/FreezeFrame.ts.html +427 -0
  31. package/coverage/lcov-report/src/FreezeFrame/FreezeFrameController.ts.html +427 -0
  32. package/coverage/lcov-report/src/FreezeFrame/index.html +131 -0
  33. package/coverage/lcov-report/src/Inputs/FakeTouchController.ts.html +682 -0
  34. package/coverage/lcov-report/src/Inputs/GamepadController.ts.html +985 -0
  35. package/coverage/lcov-report/src/Inputs/HoveringMouseEvents.ts.html +688 -0
  36. package/coverage/lcov-report/src/Inputs/InputClassesFactory.ts.html +505 -0
  37. package/coverage/lcov-report/src/Inputs/KeyboardController.ts.html +1048 -0
  38. package/coverage/lcov-report/src/Inputs/LockedMouseEvents.ts.html +946 -0
  39. package/coverage/lcov-report/src/Inputs/MouseButtons.ts.html +160 -0
  40. package/coverage/lcov-report/src/Inputs/MouseController.ts.html +1171 -0
  41. package/coverage/lcov-report/src/Inputs/SpecialKeyCodes.ts.html +133 -0
  42. package/coverage/lcov-report/src/Inputs/TouchController.ts.html +712 -0
  43. package/coverage/lcov-report/src/Inputs/XRGamepadController.ts.html +463 -0
  44. package/coverage/lcov-report/src/Inputs/index.html +266 -0
  45. package/coverage/lcov-report/src/Logger/Logger.ts.html +325 -0
  46. package/coverage/lcov-report/src/Logger/index.html +116 -0
  47. package/coverage/lcov-report/src/PeerConnectionController/AggregatedStats.ts.html +1018 -0
  48. package/coverage/lcov-report/src/PeerConnectionController/CandidatePairStats.ts.html +136 -0
  49. package/coverage/lcov-report/src/PeerConnectionController/CandidateStat.ts.html +124 -0
  50. package/coverage/lcov-report/src/PeerConnectionController/DataChannelStats.ts.html +136 -0
  51. package/coverage/lcov-report/src/PeerConnectionController/InboundRTPStats.ts.html +547 -0
  52. package/coverage/lcov-report/src/PeerConnectionController/OutBoundRTPStats.ts.html +163 -0
  53. package/coverage/lcov-report/src/PeerConnectionController/PeerConnectionController.ts.html +1795 -0
  54. package/coverage/lcov-report/src/PeerConnectionController/SessionStats.ts.html +115 -0
  55. package/coverage/lcov-report/src/PeerConnectionController/StreamStats.ts.html +118 -0
  56. package/coverage/lcov-report/src/PeerConnectionController/index.html +236 -0
  57. package/coverage/lcov-report/src/PixelStreaming/PixelStreaming.ts.html +2269 -0
  58. package/coverage/lcov-report/src/PixelStreaming/index.html +116 -0
  59. package/coverage/lcov-report/src/UI/OnScreenKeyboard.ts.html +376 -0
  60. package/coverage/lcov-report/src/UI/index.html +116 -0
  61. package/coverage/lcov-report/src/UeInstanceMessage/ResponseController.ts.html +226 -0
  62. package/coverage/lcov-report/src/UeInstanceMessage/SendDescriptorController.ts.html +346 -0
  63. package/coverage/lcov-report/src/UeInstanceMessage/SendMessageController.ts.html +364 -0
  64. package/coverage/lcov-report/src/UeInstanceMessage/StreamMessageController.ts.html +862 -0
  65. package/coverage/lcov-report/src/UeInstanceMessage/ToStreamerMessagesController.ts.html +271 -0
  66. package/coverage/lcov-report/src/UeInstanceMessage/TwoWayMap.ts.html +241 -0
  67. package/coverage/lcov-report/src/UeInstanceMessage/index.html +191 -0
  68. package/coverage/lcov-report/src/Util/CoordinateConverter.ts.html +952 -0
  69. package/coverage/lcov-report/src/Util/EventEmitter.ts.html +1705 -0
  70. package/coverage/lcov-report/src/Util/EventListenerTracker.ts.html +172 -0
  71. package/coverage/lcov-report/src/Util/FileUtil.ts.html +505 -0
  72. package/coverage/lcov-report/src/Util/WebGLUtils.ts.html +232 -0
  73. package/coverage/lcov-report/src/Util/WebXRUtils.ts.html +160 -0
  74. package/coverage/lcov-report/src/Util/index.html +191 -0
  75. package/coverage/lcov-report/src/VideoPlayer/StreamController.ts.html +349 -0
  76. package/coverage/lcov-report/src/VideoPlayer/VideoPlayer.ts.html +799 -0
  77. package/coverage/lcov-report/src/VideoPlayer/index.html +131 -0
  78. package/coverage/lcov-report/src/WebRtcPlayer/WebRtcPlayerController.ts.html +6199 -0
  79. package/coverage/lcov-report/src/WebRtcPlayer/index.html +116 -0
  80. package/coverage/lcov-report/src/WebSockets/MessageReceive.ts.html +352 -0
  81. package/coverage/lcov-report/src/WebSockets/MessageSend.ts.html +604 -0
  82. package/coverage/lcov-report/src/WebSockets/SignallingProtocol.ts.html +622 -0
  83. package/coverage/lcov-report/src/WebSockets/WebSocketController.ts.html +844 -0
  84. package/coverage/lcov-report/src/WebSockets/index.html +161 -0
  85. package/coverage/lcov-report/src/WebXR/WebXRController.ts.html +1042 -0
  86. package/coverage/lcov-report/src/WebXR/index.html +116 -0
  87. package/coverage/lcov-report/src/__test__/index.html +161 -0
  88. package/coverage/lcov-report/src/__test__/mockMediaStream.ts.html +457 -0
  89. package/coverage/lcov-report/src/__test__/mockRTCPeerConnection.ts.html +1126 -0
  90. package/coverage/lcov-report/src/__test__/mockRTCRtpReceiver.ts.html +151 -0
  91. package/coverage/lcov-report/src/__test__/mockWebSocket.ts.html +475 -0
  92. package/coverage/lcov-report/src/index.html +116 -0
  93. package/coverage/lcov-report/src/pixelstreamingfrontend.ts.html +232 -0
  94. package/coverage/lcov.info +6458 -0
  95. package/dist/lib-pixelstreamingfrontend.esm.js +1 -0
  96. package/dist/lib-pixelstreamingfrontend.js +1 -0
  97. package/jest.config.js +18 -0
  98. package/package.json +47 -18
  99. package/readme.md +15 -0
  100. package/src/AFK/AFKController.test.ts +162 -0
  101. package/src/AFK/AFKController.ts +158 -0
  102. package/src/Config/Config.test.ts +222 -0
  103. package/src/Config/Config.ts +909 -0
  104. package/src/Config/SettingBase.ts +65 -0
  105. package/src/Config/SettingFlag.ts +99 -0
  106. package/src/Config/SettingNumber.ts +111 -0
  107. package/src/Config/SettingOption.ts +124 -0
  108. package/src/Config/SettingText.ts +82 -0
  109. package/src/DataChannel/DataChannelController.ts +138 -0
  110. package/src/DataChannel/DataChannelLatencyTestController.ts +129 -0
  111. package/src/DataChannel/DataChannelLatencyTestResults.ts +67 -0
  112. package/src/DataChannel/DataChannelSender.ts +59 -0
  113. package/src/DataChannel/InitialSettings.ts +61 -0
  114. package/src/DataChannel/LatencyTestResults.ts +76 -0
  115. package/src/FreezeFrame/FreezeFrame.ts +114 -0
  116. package/src/FreezeFrame/FreezeFrameController.ts +114 -0
  117. package/src/Inputs/FakeTouchController.ts +199 -0
  118. package/src/Inputs/GamepadController.ts +300 -0
  119. package/src/Inputs/GamepadTypes.ts +10 -0
  120. package/src/Inputs/HoveringMouseEvents.ts +192 -0
  121. package/src/Inputs/IMouseEvents.ts +64 -0
  122. package/src/Inputs/ITouchController.ts +29 -0
  123. package/src/Inputs/InputClassesFactory.ts +140 -0
  124. package/src/Inputs/KeyboardController.ts +318 -0
  125. package/src/Inputs/LockedMouseEvents.ts +287 -0
  126. package/src/Inputs/MouseButtons.ts +25 -0
  127. package/src/Inputs/MouseController.ts +362 -0
  128. package/src/Inputs/SpecialKeyCodes.ts +16 -0
  129. package/src/Inputs/TouchController.ts +253 -0
  130. package/src/Inputs/XRGamepadController.ts +126 -0
  131. package/src/Logger/Logger.ts +80 -0
  132. package/src/PeerConnectionController/AggregatedStats.ts +311 -0
  133. package/src/PeerConnectionController/CandidatePairStats.ts +17 -0
  134. package/src/PeerConnectionController/CandidateStat.ts +13 -0
  135. package/src/PeerConnectionController/CodecStats.ts +19 -0
  136. package/src/PeerConnectionController/DataChannelStats.ts +17 -0
  137. package/src/PeerConnectionController/InboundRTPStats.ts +154 -0
  138. package/src/PeerConnectionController/InboundTrackStats.ts +34 -0
  139. package/src/PeerConnectionController/OutBoundRTPStats.ts +26 -0
  140. package/src/PeerConnectionController/PeerConnectionController.ts +563 -0
  141. package/src/PeerConnectionController/SessionStats.ts +10 -0
  142. package/src/PeerConnectionController/StreamStats.ts +11 -0
  143. package/src/PixelStreaming/PixelStreaming.test.ts +624 -0
  144. package/src/PixelStreaming/PixelStreaming.ts +847 -0
  145. package/src/UI/OnScreenKeyboard.ts +97 -0
  146. package/src/UeInstanceMessage/ResponseController.ts +47 -0
  147. package/src/UeInstanceMessage/SendMessageController.ts +154 -0
  148. package/src/UeInstanceMessage/StreamMessageController.ts +233 -0
  149. package/src/UeInstanceMessage/ToStreamerMessagesController.ts +62 -0
  150. package/src/Util/CoordinateConverter.ts +289 -0
  151. package/src/Util/EventEmitter.ts +595 -0
  152. package/src/Util/EventListenerTracker.ts +29 -0
  153. package/src/Util/FileUtil.ts +140 -0
  154. package/src/Util/RTCUtils.ts +41 -0
  155. package/src/Util/WebGLUtils.ts +49 -0
  156. package/src/Util/WebXRUtils.ts +25 -0
  157. package/src/VideoPlayer/StreamController.ts +89 -0
  158. package/src/VideoPlayer/VideoPlayer.ts +246 -0
  159. package/src/WebRtcPlayer/WebRtcPlayerController.ts +2221 -0
  160. package/src/WebSockets/MessageReceive.ts +89 -0
  161. package/src/WebSockets/MessageSend.ts +185 -0
  162. package/src/WebSockets/SignallingProtocol.ts +180 -0
  163. package/src/WebSockets/WebSocketController.ts +267 -0
  164. package/src/WebXR/WebXRController.ts +319 -0
  165. package/src/__test__/mockMediaStream.ts +124 -0
  166. package/src/__test__/mockRTCPeerConnection.ts +347 -0
  167. package/src/__test__/mockRTCRtpReceiver.ts +22 -0
  168. package/src/__test__/mockWebSocket.ts +130 -0
  169. package/src/pixelstreamingfrontend.ts +50 -0
  170. package/tsconfig.jest.json +8 -0
  171. package/tsconfig.json +24 -0
  172. package/{library/types → types}/Config/Config.d.ts +5 -4
  173. package/types/DataChannel/DataChannelLatencyTestController.d.ts +26 -0
  174. package/types/DataChannel/DataChannelLatencyTestResults.d.ts +46 -0
  175. package/{library/types → types}/Inputs/HoveringMouseEvents.d.ts +1 -1
  176. package/{library/types → types}/PeerConnectionController/PeerConnectionController.d.ts +1 -1
  177. package/{library/types → types}/PixelStreaming/PixelStreaming.d.ts +31 -6
  178. package/{library/types → types}/UeInstanceMessage/SendMessageController.d.ts +1 -1
  179. package/{library/types → types}/UeInstanceMessage/StreamMessageController.d.ts +3 -5
  180. package/{library/types → types}/Util/EventEmitter.d.ts +40 -3
  181. package/types/Util/RTCUtils.d.ts +8 -0
  182. package/{library/types → types}/VideoPlayer/StreamController.d.ts +3 -3
  183. package/{library/types → types}/VideoPlayer/VideoPlayer.d.ts +2 -0
  184. package/{library/types → types}/WebRtcPlayer/WebRtcPlayerController.d.ts +30 -27
  185. package/{library/types → types}/WebSockets/MessageReceive.d.ts +9 -9
  186. package/{library/types → types}/WebSockets/MessageSend.d.ts +13 -9
  187. package/{library/types → types}/WebSockets/SignallingProtocol.d.ts +3 -3
  188. package/{library/types → types}/WebSockets/WebSocketController.d.ts +16 -12
  189. package/{library/types → types}/pixelstreamingfrontend.d.ts +2 -1
  190. package/webpack.common.js +35 -0
  191. package/webpack.dev.js +35 -0
  192. package/webpack.prod.js +36 -0
  193. package/yang__yj-pixelstreaming-core-1.0.1.tgz +0 -0
  194. package/yang__yj-pixelstreaming-core-1.0.2.tgz +0 -0
  195. package/library/dist/lib-pixelstreamingfrontend.esm.js +0 -1
  196. package/library/dist/lib-pixelstreamingfrontend.js +0 -1
  197. /package/{library/types → types}/AFK/AFKController.d.ts +0 -0
  198. /package/{library/types → types}/Config/SettingBase.d.ts +0 -0
  199. /package/{library/types → types}/Config/SettingFlag.d.ts +0 -0
  200. /package/{library/types → types}/Config/SettingNumber.d.ts +0 -0
  201. /package/{library/types → types}/Config/SettingOption.d.ts +0 -0
  202. /package/{library/types → types}/Config/SettingText.d.ts +0 -0
  203. /package/{library/types → types}/DataChannel/DataChannelController.d.ts +0 -0
  204. /package/{library/types → types}/DataChannel/DataChannelSender.d.ts +0 -0
  205. /package/{library/types → types}/DataChannel/InitialSettings.d.ts +0 -0
  206. /package/{library/types → types}/DataChannel/LatencyTestResults.d.ts +0 -0
  207. /package/{library/types → types}/FreezeFrame/FreezeFrame.d.ts +0 -0
  208. /package/{library/types → types}/FreezeFrame/FreezeFrameController.d.ts +0 -0
  209. /package/{library/types → types}/Inputs/FakeTouchController.d.ts +0 -0
  210. /package/{library/types → types}/Inputs/GamepadController.d.ts +0 -0
  211. /package/{library/types → types}/Inputs/GamepadTypes.d.ts +0 -0
  212. /package/{library/types → types}/Inputs/IMouseEvents.d.ts +0 -0
  213. /package/{library/types → types}/Inputs/ITouchController.d.ts +0 -0
  214. /package/{library/types → types}/Inputs/InputClassesFactory.d.ts +0 -0
  215. /package/{library/types → types}/Inputs/KeyboardController.d.ts +0 -0
  216. /package/{library/types → types}/Inputs/LockedMouseEvents.d.ts +0 -0
  217. /package/{library/types → types}/Inputs/MouseButtons.d.ts +0 -0
  218. /package/{library/types → types}/Inputs/MouseController.d.ts +0 -0
  219. /package/{library/types → types}/Inputs/SpecialKeyCodes.d.ts +0 -0
  220. /package/{library/types → types}/Inputs/TouchController.d.ts +0 -0
  221. /package/{library/types → types}/Inputs/XRGamepadController.d.ts +0 -0
  222. /package/{library/types → types}/Logger/Logger.d.ts +0 -0
  223. /package/{library/types → types}/PeerConnectionController/AggregatedStats.d.ts +0 -0
  224. /package/{library/types → types}/PeerConnectionController/CandidatePairStats.d.ts +0 -0
  225. /package/{library/types → types}/PeerConnectionController/CandidateStat.d.ts +0 -0
  226. /package/{library/types → types}/PeerConnectionController/CodecStats.d.ts +0 -0
  227. /package/{library/types → types}/PeerConnectionController/DataChannelStats.d.ts +0 -0
  228. /package/{library/types → types}/PeerConnectionController/InboundRTPStats.d.ts +0 -0
  229. /package/{library/types → types}/PeerConnectionController/InboundTrackStats.d.ts +0 -0
  230. /package/{library/types → types}/PeerConnectionController/OutBoundRTPStats.d.ts +0 -0
  231. /package/{library/types → types}/PeerConnectionController/SessionStats.d.ts +0 -0
  232. /package/{library/types → types}/PeerConnectionController/StreamStats.d.ts +0 -0
  233. /package/{library/types → types}/UI/OnScreenKeyboard.d.ts +0 -0
  234. /package/{library/types → types}/UeInstanceMessage/ResponseController.d.ts +0 -0
  235. /package/{library/types → types}/UeInstanceMessage/SendDescriptorController.d.ts +0 -0
  236. /package/{library/types → types}/UeInstanceMessage/ToStreamerMessagesController.d.ts +0 -0
  237. /package/{library/types → types}/UeInstanceMessage/TwoWayMap.d.ts +0 -0
  238. /package/{library/types → types}/Util/CoordinateConverter.d.ts +0 -0
  239. /package/{library/types → types}/Util/EventListenerTracker.d.ts +0 -0
  240. /package/{library/types → types}/Util/FileUtil.d.ts +0 -0
  241. /package/{library/types → types}/Util/WebGLUtils.d.ts +0 -0
  242. /package/{library/types → types}/Util/WebXRUtils.d.ts +0 -0
  243. /package/{library/types → types}/WebXR/WebXRController.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 = Math.floor(
162
+ screen.getBoundingClientRect().width * window.devicePixelRatio
163
+ );
164
+ // ue 高分辨率
165
+ let ueHeight = Math.floor(
166
+ screen.getBoundingClientRect().height * window.devicePixelRatio
167
+ );
168
+ // 总宽分辨率
169
+ let ratioWidth = Math.floor(window.screen.width * window.devicePixelRatio);
170
+ // 总高分辨率
171
+ let ratioHeight = Math.floor(window.screen.height * window.devicePixelRatio);
172
+ // 计算导航栏的分辨率
173
+ let headWidth =
174
+ ratioWidth -
175
+ Math.floor(document.documentElement.clientWidth * window.devicePixelRatio);
176
+ // 计算导航栏的分辨率
177
+ let headHeight =
178
+ ratioHeight -
179
+ Math.floor(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
+ (Math.floor(touch.clientY * window.devicePixelRatio) -
203
+ Math.floor((ratioHeight - headHeight - ueHeight) / 2));
204
+ y =
205
+ clientWidth *
206
+ (ueWidth -
207
+ (Math.floor(touch.clientX * window.devicePixelRatio) -
208
+ Math.floor((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
+ }