Skip to content
This repository was archived by the owner on Mar 1, 2024. It is now read-only.

Commit c3f0b83

Browse files
authored
Added XR events: xrSessionStarted, xrSessionEnded, xrFrame (#125)
1 parent d232421 commit c3f0b83

File tree

3 files changed

+73
-19
lines changed

3 files changed

+73
-19
lines changed

Frontend/library/src/PixelStreaming/PixelStreaming.ts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,7 @@ import { AggregatedStats } from '../PeerConnectionController/AggregatedStats';
66
import { WebRtcPlayerController } from '../WebRtcPlayer/WebRtcPlayerController';
77
import { Flags, NumericParameters } from '../Config/Config';
88
import { Logger } from '../Logger/Logger';
9-
import {
10-
InitialSettings,
11-
EncoderSettings,
12-
WebRTCSettings
13-
} from '../DataChannel/InitialSettings';
9+
import { InitialSettings } from '../DataChannel/InitialSettings';
1410
import { OnScreenKeyboard } from '../UI/OnScreenKeyboard';
1511
import {
1612
EventEmitter,

Frontend/library/src/Util/EventEmitter.ts

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -401,6 +401,45 @@ export class SettingsChangedEvent extends Event {
401401
}
402402
}
403403

404+
/**
405+
* Event emitted when an XR Session starts
406+
*/
407+
export class XrSessionStartedEvent extends Event {
408+
readonly type: 'xrSessionStarted';
409+
constructor() {
410+
super('xrSessionStarted');
411+
}
412+
}
413+
414+
/**
415+
* Event emitted when an XR Session ends
416+
*/
417+
export class XrSessionEndedEvent extends Event {
418+
readonly type: 'xrSessionEnded';
419+
constructor() {
420+
super('xrSessionEnded');
421+
}
422+
}
423+
424+
export type XrFrameData = {
425+
/** The frame timestamp */
426+
time: DOMHighResTimeStamp;
427+
/** The XRFrame */
428+
frame: XRFrame;
429+
};
430+
431+
/**
432+
* Event emitted when an XR Frame is complete
433+
*/
434+
export class XrFrameEvent extends Event {
435+
readonly type: 'xrFrame';
436+
readonly data: XrFrameData
437+
constructor(data: XrFrameEvent['data']) {
438+
super('xrFrame');
439+
this.data = data;
440+
}
441+
}
442+
404443
export type PixelStreamingEvent =
405444
| AfkWarningActivateEvent
406445
| AfkWarningUpdateEvent
@@ -427,7 +466,10 @@ export type PixelStreamingEvent =
427466
| StreamerListMessageEvent
428467
| LatencyTestResultEvent
429468
| InitialSettingsEvent
430-
| SettingsChangedEvent;
469+
| SettingsChangedEvent
470+
| XrSessionStartedEvent
471+
| XrSessionEndedEvent
472+
| XrFrameEvent;
431473

432474
export class EventEmitter extends EventTarget {
433475
/**

Frontend/library/src/WebXR/WebXRController.ts

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,32 @@
11
// Copyright Epic Games, Inc. All Rights Reserved.
22

33
import { Logger } from '../Logger/Logger';
4-
import { WebRtcPlayerController } from '../pixelstreamingfrontend';
4+
import { WebRtcPlayerController } from '../WebRtcPlayer/WebRtcPlayerController';
55
import { WebGLUtils } from '../Util/WebGLUtils';
66
import { Controller } from '../Inputs/GamepadTypes';
77
import { XRGamepadController } from '../Inputs/XRGamepadController';
8+
import { XrFrameEvent } from '../Util/EventEmitter'
89

910
export class WebXRController {
10-
xrSession: XRSession;
11-
xrRefSpace: XRReferenceSpace;
12-
gl: WebGL2RenderingContext;
11+
private xrSession: XRSession;
12+
private xrRefSpace: XRReferenceSpace;
13+
private gl: WebGL2RenderingContext;
1314

14-
positionLocation: number;
15-
texcoordLocation: number;
16-
resolutionLocation: WebGLUniformLocation;
17-
offsetLocation: WebGLUniformLocation;
15+
private positionLocation: number;
16+
private texcoordLocation: number;
17+
private resolutionLocation: WebGLUniformLocation;
18+
private offsetLocation: WebGLUniformLocation;
1819

19-
positionBuffer: WebGLBuffer;
20-
texcoordBuffer: WebGLBuffer;
20+
private positionBuffer: WebGLBuffer;
21+
private texcoordBuffer: WebGLBuffer;
2122

22-
webRtcController: WebRtcPlayerController;
23-
xrGamepadController: XRGamepadController;
24-
xrControllers: Array<Controller>;
23+
private webRtcController: WebRtcPlayerController;
24+
private xrGamepadController: XRGamepadController;
25+
private xrControllers: Array<Controller>;
26+
27+
onSessionStarted: EventTarget;
28+
onSessionEnded: EventTarget;
29+
onFrame: EventTarget;
2530

2631
constructor(webRtcPlayerController: WebRtcPlayerController) {
2732
this.xrSession = null;
@@ -30,6 +35,9 @@ export class WebXRController {
3035
this.xrGamepadController = new XRGamepadController(
3136
this.webRtcController.streamMessageController
3237
);
38+
this.onSessionEnded = new EventTarget();
39+
this.onSessionStarted = new EventTarget();
40+
this.onFrame = new EventTarget();
3341
}
3442

3543
public xrClicked() {
@@ -47,6 +55,7 @@ export class WebXRController {
4755
onXrSessionEnded() {
4856
Logger.Log(Logger.GetStackTrace(), 'XR Session ended');
4957
this.xrSession = null;
58+
this.onSessionEnded.dispatchEvent(new Event('xrSessionEnded'));
5059
}
5160

5261
onXrSessionStarted(session: XRSession) {
@@ -142,6 +151,8 @@ export class WebXRController {
142151
this.onXrFrame(time, frame)
143152
);
144153
});
154+
155+
this.onSessionStarted.dispatchEvent(new Event('xrSessionStarted'));
145156
}
146157

147158
onXrFrame(time: DOMHighResTimeStamp, frame: XRFrame) {
@@ -194,6 +205,11 @@ export class WebXRController {
194205
(time: DOMHighResTimeStamp, frame: XRFrame) =>
195206
this.onXrFrame(time, frame)
196207
);
208+
209+
this.onFrame.dispatchEvent(new XrFrameEvent({
210+
time,
211+
frame
212+
}));
197213
}
198214

199215
private render(videoElement: HTMLVideoElement) {

0 commit comments

Comments
 (0)