From b840e19685dfc3077d906308d17e8d44753de5f8 Mon Sep 17 00:00:00 2001 From: Martin Buessemeyer Date: Mon, 23 Dec 2019 13:42:15 +0100 Subject: [PATCH 01/13] impelement basic demo --- demos/demos.json | 10 + .../blue_painted_planks_diff_1k_modified.webp | Bin 0 -> 283404 bytes demos/eye-tracking/eyetracking.ts | 195 ++++++++++++++++++ demos/eye-tracking/mesh.frag | 24 +++ demos/eye-tracking/mesh.vert | 30 +++ source/eyetrackerdatastream.ts | 71 +++++++ source/webgl-operate.slim.ts | 2 + webpack.config.demos.js | 3 +- website/demos/eye-tracking.pug | 9 + 9 files changed, 343 insertions(+), 1 deletion(-) create mode 100644 demos/eye-tracking/blue_painted_planks_diff_1k_modified.webp create mode 100644 demos/eye-tracking/eyetracking.ts create mode 100644 demos/eye-tracking/mesh.frag create mode 100644 demos/eye-tracking/mesh.vert create mode 100644 source/eyetrackerdatastream.ts create mode 100644 website/demos/eye-tracking.pug diff --git a/demos/demos.json b/demos/demos.json index c9b8ebb5..2082a212 100644 --- a/demos/demos.json +++ b/demos/demos.json @@ -77,5 +77,15 @@ ], "caption": "Simple demo showcasing how WebXR can be utilized with webgl-operate.", "disabled": true + }, + { + "target": "eye-tracking", + "title": "Eye Tracker Demo", + "authors": [ + "MartinBuessemeyer", + "cgcostume" + ], + "caption": "Simple demo showing eye tracking.", + "disabled": false } ] diff --git a/demos/eye-tracking/blue_painted_planks_diff_1k_modified.webp b/demos/eye-tracking/blue_painted_planks_diff_1k_modified.webp new file mode 100644 index 0000000000000000000000000000000000000000..0787092a8a9ffe7632c660f3393932df211efdeb GIT binary patch literal 283404 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 literal 0 HcmV?d00001 diff --git a/demos/eye-tracking/eyetracking.ts b/demos/eye-tracking/eyetracking.ts new file mode 100644 index 00000000..1e6fef7f --- /dev/null +++ b/demos/eye-tracking/eyetracking.ts @@ -0,0 +1,195 @@ + +/* spellchecker: disable */ + +import { mat4, vec3 } from 'webgl-operate'; + +import { + Camera, + Canvas, + Context, + CuboidGeometry, + DefaultFramebuffer, + EyeTrackerDataStream, + Invalidate, + MouseEventProvider, + Navigation, + Program, + Renderer, + Shader, + Wizard, +} from 'webgl-operate'; + +import { Demo } from '../demo'; + +/* spellchecker: enable */ + +// tslint:disable:max-classes-per-file + + +export class EyeTrackingRenderer extends Renderer { + + protected _camera: Camera; + protected _navigation: Navigation; + + protected _cuboid: CuboidGeometry; + + protected _program: Program; + protected _uViewProjection: WebGLUniformLocation; + + protected _defaultFBO: DefaultFramebuffer; + + protected _eyeTrackerDataStream: EyeTrackerDataStream; + + protected onUpdate(): boolean { + + // Update camera navigation (process events) + this._navigation.update(); + return this._altered.any || this._camera.altered; + } + + protected onPrepare(): void { + if (this._altered.canvasSize) { + this._camera.aspect = this._canvasSize[0] / this._canvasSize[1]; + this._camera.viewport = this._canvasSize; + } + + if (this._altered.clearColor) { + this._defaultFBO.clearColor(this._clearColor); + } + + this._altered.reset(); + this._camera.altered = false; + } + + protected onFrame(): void { + const gl = this._context.gl; + + this._defaultFBO.bind(); + this._defaultFBO.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT, true, false); + + gl.viewport(0, 0, this._frameSize[0], this._frameSize[1]); + + gl.enable(gl.CULL_FACE); + gl.cullFace(gl.BACK); + gl.enable(gl.DEPTH_TEST); + + this._program.bind(); + gl.uniformMatrix4fv(this._uViewProjection, gl.GL_FALSE, this._camera.viewProjection); + + this._cuboid.bind(); + this._cuboid.draw(); + this._cuboid.unbind(); + + this._program.unbind(); + + gl.cullFace(gl.BACK); + gl.disable(gl.CULL_FACE); + } + + protected onSwap(): void { } + + protected onInitialize(context: Context, callback: Invalidate, + mouseEventProvider: MouseEventProvider, + /* keyEventProvider: KeyEventProvider, */ + /* touchEventProvider: TouchEventProvider */): boolean { + + + this._eyeTrackerDataStream = new EyeTrackerDataStream(); + + this._eyeTrackerDataStream.onUpdate(() => { + console.log(this._eyeTrackerDataStream.message); + }); + + this._eyeTrackerDataStream.connect(); + + this._defaultFBO = new DefaultFramebuffer(context, 'DefaultFBO'); + this._defaultFBO.initialize(); + this._defaultFBO.bind(); + + const gl = context.gl; + + + this._cuboid = new CuboidGeometry(context, 'Cuboid', true, [2.0, 2.0, 2.0]); + this._cuboid.initialize(); + + + const vert = new Shader(context, gl.VERTEX_SHADER, 'mesh.vert'); + vert.initialize(require('./mesh.vert')); + const frag = new Shader(context, gl.FRAGMENT_SHADER, 'mesh.frag'); + frag.initialize(require('./mesh.frag')); + + + this._program = new Program(context, 'CubeProgram'); + this._program.initialize([vert, frag], false); + + this._program.attribute('a_vertex', this._cuboid.vertexLocation); + this._program.attribute('a_texCoord', this._cuboid.uvCoordLocation); + this._program.link(); + this._program.bind(); + + + this._uViewProjection = this._program.uniform('u_viewProjection'); + const identity = mat4.identity(mat4.create()); + gl.uniformMatrix4fv(this._program.uniform('u_model'), gl.FALSE, identity); + gl.uniform1i(this._program.uniform('u_texture'), 0); + gl.uniform1i(this._program.uniform('u_textured'), false); + + this._camera = new Camera(); + this._camera.center = vec3.fromValues(0.0, 0.0, 0.0); + this._camera.up = vec3.fromValues(0.0, 1.0, 0.0); + this._camera.eye = vec3.fromValues(0.0, 0.0, 5.0); + this._camera.near = 1.0; + this._camera.far = 8.0; + + + this._navigation = new Navigation(callback, mouseEventProvider); + this._navigation.camera = this._camera; + + return true; + } + + protected onUninitialize(): void { + super.uninitialize(); + + this._cuboid.uninitialize(); + this._program.uninitialize(); + + this._defaultFBO.uninitialize(); + } +} + + +export class EyeTrackingDemo extends Demo { + + private _canvas: Canvas; + private _renderer: EyeTrackingRenderer; + + initialize(element: HTMLCanvasElement | string): boolean { + + this._canvas = new Canvas(element); + this._canvas.controller.multiFrameNumber = 1; + this._canvas.framePrecision = Wizard.Precision.float; + this._canvas.clearColor.fromHex('d6d8db'); + this._canvas.frameScale = [1.0, 1.0]; + + this._canvas.element.addEventListener('click', () => { this._canvas.controller.update(); }); + + this._renderer = new EyeTrackingRenderer(); + this._canvas.renderer = this._renderer; + + return true; + } + + uninitialize(): void { + this._canvas.dispose(); + (this._renderer as Renderer).uninitialize(); + } + + get canvas(): Canvas { + return this._canvas; + } + + get renderer(): EyeTrackingRenderer { + return this._renderer; + } +} diff --git a/demos/eye-tracking/mesh.frag b/demos/eye-tracking/mesh.frag new file mode 100644 index 00000000..882d472a --- /dev/null +++ b/demos/eye-tracking/mesh.frag @@ -0,0 +1,24 @@ + +precision lowp float; + +@import ../../source/shaders/facade.frag; + + +uniform bool u_textured; + + +#if __VERSION__ == 100 + #define fragColor gl_FragColor +#else + layout(location = 0) out vec4 fragColor; +#endif + + +varying vec4 v_vertex; +varying vec2 v_uv; + + +void main(void) +{ + fragColor = vec4(v_vertex.xyz * 0.5 + 0.5, 1.0); +} diff --git a/demos/eye-tracking/mesh.vert b/demos/eye-tracking/mesh.vert new file mode 100644 index 00000000..26f46e5f --- /dev/null +++ b/demos/eye-tracking/mesh.vert @@ -0,0 +1,30 @@ + +precision lowp float; + +@import ../../source/shaders/facade.vert; + + +#if __VERSION__ == 100 + attribute vec3 a_vertex; + attribute vec2 a_texCoord; +#else + layout(location = 0) in vec3 a_vertex; + layout(location = 1) in vec2 a_texCoord; +#endif + + +uniform mat4 u_viewProjection; +uniform mat4 u_model; + + +varying vec4 v_vertex; +varying vec2 v_uv; + + +void main() +{ + v_vertex = u_model * vec4(a_vertex, 1.0); + v_uv = a_texCoord; + + gl_Position = u_viewProjection * v_vertex; +} diff --git a/source/eyetrackerdatastream.ts b/source/eyetrackerdatastream.ts new file mode 100644 index 00000000..5814a413 --- /dev/null +++ b/source/eyetrackerdatastream.ts @@ -0,0 +1,71 @@ + +import { logIf, LogLevel } from './auxiliaries'; + +export class EyeTrackerDataStream { + + protected readonly websocketAddress = 'ws://localhost:1234'; + + protected _message: string; + protected _webSocket: WebSocket; + protected _onUpdateLambda: () => void; + + public logStatus: boolean; + + constructor() { + this._message = ''; + this._onUpdateLambda = () => { }; + } + + + protected onOpen(event: Event): void { + // perform handshake + console.log('connected'); + logIf(this.logStatus, LogLevel.Info, 'Connected to eye tracking server.'); + this._webSocket.send('test'); + } + + protected onClose(event: Event): void { + logIf(this.logStatus, LogLevel.Info, 'Connection to eye tracking server has been closed.'); + } + + protected onError(event: Event): void { + logIf(this.logStatus, LogLevel.Info, 'Connection returned an error: '); + logIf(this.logStatus, LogLevel.Info, event.toString()); + } + + protected onMessage(event: MessageEvent): void { + this._message = event.data.toString(); + this._onUpdateLambda(); + } + + public connect(): void { + console.log('Trying to connect to server'); + this._webSocket = new WebSocket(this.websocketAddress); + + // Arrow functions needed in order to not loose this-context. + this._webSocket.onopen = (event: Event) => { + this.onOpen(event); + }; + this._webSocket.onclose = (event: Event) => { + this.onClose(event); + }; + this._webSocket.onerror = (event: Event) => { + this.onError(event); + }; + this._webSocket.onmessage = (event: MessageEvent) => { + this.onMessage(event); + }; + } + + public onUpdate(lambda: () => void): void { + this._onUpdateLambda = lambda; + } + + get message(): string { + return this._message; + } + + get connectionState(): number { + return this._webSocket.readyState; + } +} diff --git a/source/webgl-operate.slim.ts b/source/webgl-operate.slim.ts index 0d9dea20..3e3b6763 100644 --- a/source/webgl-operate.slim.ts +++ b/source/webgl-operate.slim.ts @@ -59,6 +59,8 @@ export { GaussFilter } from './gaussfilter'; export { ShadowPass } from './shadowpass'; +export { EyeTrackerDataStream } from './eyetrackerdatastream'; + export * from './core/index'; export * from './scene/index'; export * from './text/index'; diff --git a/webpack.config.demos.js b/webpack.config.demos.js index 11ce5eb4..a6e6df9e 100644 --- a/webpack.config.demos.js +++ b/webpack.config.demos.js @@ -8,7 +8,8 @@ module.exports = { entry: { 'cornell-box': ['cornell-box/cornellbox.ts'], 'cubescape': ['cubescape/cubescape.ts'], - 'gltf-renderer': ['gltf-renderer/gltfrenderer.ts'] + 'gltf-renderer': ['gltf-renderer/gltfrenderer.ts'], + 'eye-tracking': ['eye-tracking/eyetracking.ts'] }, devtool: 'source-map', output: { diff --git a/website/demos/eye-tracking.pug b/website/demos/eye-tracking.pug new file mode 100644 index 00000000..354e4e6a --- /dev/null +++ b/website/demos/eye-tracking.pug @@ -0,0 +1,9 @@ +extends demo.pug + + +block canvas + + canvas(id = 'demo-canvas', data-backend = 'auto').img-fluid.w-100 + +block onload + script window.onload = function () { clipboard(); demo(new EyeTrackingDemo(), 'demo-canvas'); } From 1a681e33c2a93c7b983ccdd2823c907137e5e449 Mon Sep 17 00:00:00 2001 From: Martin Buessemeyer Date: Sat, 18 Jan 2020 21:42:55 +0100 Subject: [PATCH 02/13] implement data binding --- demos/eye-tracking/eyetracking.ts | 13 ++- source/eyetrackerdatastream.ts | 174 ++++++++++++++++++++++++++++-- 2 files changed, 178 insertions(+), 9 deletions(-) diff --git a/demos/eye-tracking/eyetracking.ts b/demos/eye-tracking/eyetracking.ts index 1e6fef7f..d35efef2 100644 --- a/demos/eye-tracking/eyetracking.ts +++ b/demos/eye-tracking/eyetracking.ts @@ -96,10 +96,19 @@ export class EyeTrackingRenderer extends Renderer { this._eyeTrackerDataStream = new EyeTrackerDataStream(); - this._eyeTrackerDataStream.onUpdate(() => { - console.log(this._eyeTrackerDataStream.message); + this._eyeTrackerDataStream.onDataUpdate(() => { + console.log(this._eyeTrackerDataStream.eyeTrackingData.toString()); }); + this._eyeTrackerDataStream.onStatusUpdate(() => { + console.log(this._eyeTrackerDataStream.statusMessage.toString()); + }); + + this._eyeTrackerDataStream.dataStreams.gazePosition = true; + this._eyeTrackerDataStream.dataStreams.gazeOrigin = true; + this._eyeTrackerDataStream.dataStreams.eyePositionNormalized = true; + this._eyeTrackerDataStream.dataStreams.headPositionAndRotation = true; + this._eyeTrackerDataStream.dataStreams.userPresence = true; this._eyeTrackerDataStream.connect(); this._defaultFBO = new DefaultFramebuffer(context, 'DefaultFBO'); diff --git a/source/eyetrackerdatastream.ts b/source/eyetrackerdatastream.ts index 5814a413..ea09bb99 100644 --- a/source/eyetrackerdatastream.ts +++ b/source/eyetrackerdatastream.ts @@ -1,27 +1,100 @@ import { logIf, LogLevel } from './auxiliaries'; +// tslint:disable:max-classes-per-file + export class EyeTrackerDataStream { protected readonly websocketAddress = 'ws://localhost:1234'; protected _message: string; protected _webSocket: WebSocket; - protected _onUpdateLambda: () => void; + protected _onDataUpdateLambda: () => void; + protected _onStatusUpdateLambda: () => void; + + public dataStreams: EyeTrackingDataStreams; + public eyeTrackingData: EyeTrackingData; + public statusMessage: EyeTrackingStatusMessage; public logStatus: boolean; constructor() { this._message = ''; - this._onUpdateLambda = () => { }; + this._onDataUpdateLambda = () => { }; + this._onStatusUpdateLambda = () => { }; + this.dataStreams = new EyeTrackingDataStreams(); + this.eyeTrackingData = new EyeTrackingData(); + } + + private generateStreamConfigByte(): Uint8Array { + const configByte = new Uint8Array(0); + if (this.dataStreams.gazePosition) { + configByte[0] = configByte[0] | 0b00000001; + } + if (this.dataStreams.gazeOrigin) { + configByte[0] = configByte[0] | 0b00000010; + } + if (this.dataStreams.eyePositionNormalized) { + configByte[0] = configByte[0] | 0b00000100; + } + if (this.dataStreams.headPositionAndRotation) { + configByte[0] = configByte[0] | 0b00001000; + } + if (this.dataStreams.userPresence) { + configByte[0] = configByte[0] | 0b00010000; + } + return configByte; + } + + private performHandshake(): void { + this.dataStreams.recalculateNumberOfFloats(); + const configByte = this.generateStreamConfigByte(); + this._webSocket.send(configByte); } + private parseEyeTrackingData(data: Float32Array): void { + let currentIndexPosition = 0; + if (this.dataStreams.gazePosition) { + this.eyeTrackingData.gazePositionXY[0] = data[currentIndexPosition++]; + this.eyeTrackingData.gazePositionXY[1] = data[currentIndexPosition++]; + } + if (this.dataStreams.gazeOrigin) { + this.eyeTrackingData.gazeOriginRightXYZ[0] = data[currentIndexPosition++]; + this.eyeTrackingData.gazeOriginRightXYZ[1] = data[currentIndexPosition++]; + this.eyeTrackingData.gazeOriginRightXYZ[2] = data[currentIndexPosition++]; + + this.eyeTrackingData.gazeOriginLeftXYZ[0] = data[currentIndexPosition++]; + this.eyeTrackingData.gazeOriginLeftXYZ[1] = data[currentIndexPosition++]; + this.eyeTrackingData.gazeOriginLeftXYZ[2] = data[currentIndexPosition++]; + } + if (this.dataStreams.eyePositionNormalized) { + this.eyeTrackingData.eyePositionRightNormalizedXYZ[0] = data[currentIndexPosition++]; + this.eyeTrackingData.eyePositionRightNormalizedXYZ[1] = data[currentIndexPosition++]; + this.eyeTrackingData.eyePositionRightNormalizedXYZ[2] = data[currentIndexPosition++]; + + this.eyeTrackingData.eyePositionLeftNormalizedXYZ[0] = data[currentIndexPosition++]; + this.eyeTrackingData.eyePositionLeftNormalizedXYZ[1] = data[currentIndexPosition++]; + this.eyeTrackingData.eyePositionLeftNormalizedXYZ[2] = data[currentIndexPosition++]; + } + if (this.dataStreams.headPositionAndRotation) { + this.eyeTrackingData.headPositionXYZ[0] = data[currentIndexPosition++]; + this.eyeTrackingData.headPositionXYZ[1] = data[currentIndexPosition++]; + this.eyeTrackingData.headPositionXYZ[2] = data[currentIndexPosition++]; + + this.eyeTrackingData.headRotationXYZ[0] = data[currentIndexPosition++]; + this.eyeTrackingData.headRotationXYZ[1] = data[currentIndexPosition++]; + this.eyeTrackingData.headRotationXYZ[2] = data[currentIndexPosition++]; + } + if (this.dataStreams.userPresence) { + this.eyeTrackingData.userPresence = data[currentIndexPosition] === 0.0 ? false : true; + } + } protected onOpen(event: Event): void { // perform handshake console.log('connected'); logIf(this.logStatus, LogLevel.Info, 'Connected to eye tracking server.'); - this._webSocket.send('test'); + this.performHandshake(); } protected onClose(event: Event): void { @@ -34,8 +107,19 @@ export class EyeTrackerDataStream { } protected onMessage(event: MessageEvent): void { - this._message = event.data.toString(); - this._onUpdateLambda(); + if (typeof event.type !== 'string') { + const floatData = new Float32Array(event.data); + if (floatData.length < this.dataStreams.expectedNumberOfFloats) { + this.statusMessage = EyeTrackingStatusMessage.BinaryMessageTooSmall; + this._onStatusUpdateLambda(); + } else { + this.parseEyeTrackingData(floatData); + this._onDataUpdateLambda(); + } + } else { + this.statusMessage = event.data; + this._onStatusUpdateLambda(); + } } public connect(): void { @@ -57,8 +141,12 @@ export class EyeTrackerDataStream { }; } - public onUpdate(lambda: () => void): void { - this._onUpdateLambda = lambda; + public onDataUpdate(lambda: () => void): void { + this._onDataUpdateLambda = lambda; + } + + public onStatusUpdate(lambda: () => void): void { + this._onStatusUpdateLambda = lambda; } get message(): string { @@ -69,3 +157,75 @@ export class EyeTrackerDataStream { return this._webSocket.readyState; } } + +export class EyeTrackingDataStreams { + public gazePosition = false; + public gazeOrigin = false; + public eyePositionNormalized = false; + public headPositionAndRotation = false; + public userPresence = false; + + + // The sum of floats from all activated data streams + public expectedNumberOfFloats = 0; + + // Is automatically recalculated if the handshake is invoked + public recalculateNumberOfFloats(): void { + let newNumberOfFloats = 0; + if (this.gazePosition) { + newNumberOfFloats += 2; + } + if (this.gazeOrigin) { + newNumberOfFloats += 6; + } + if (this.eyePositionNormalized) { + newNumberOfFloats += 6; + } + if (this.headPositionAndRotation) { + newNumberOfFloats += 6; + } + if (this.userPresence) { + newNumberOfFloats += 1; + } + this.expectedNumberOfFloats = newNumberOfFloats; + + } +} + +export enum EyeTrackingStatusMessage { + + BinaryMessageTooSmall = 'The last received binary message was smaller than expected', +} + +export class EyeTrackingData { + // gaze position x and y + public gazePositionXY: [number, number] = [0, 0]; + + // gaze origin + public gazeOriginRightXYZ: [number, number, number] = [0, 0, 0]; + public gazeOriginLeftXYZ: [number, number, number] = [0, 0, 0]; + + // eye position normalized + public eyePositionRightNormalizedXYZ: [number, number, number] = [0, 0, 0]; + public eyePositionLeftNormalizedXYZ: [number, number, number] = [0, 0, 0]; + + // head position and rotation + public headPositionXYZ: [number, number, number] = [0, 0, 0]; + public headRotationXYZ: [number, number, number] = [0, 0, 0]; + + // user presence, a bool represented as a public number so that everything fits in a char array + public userPresence = false; + + public toString(): string { + let message = ''; + message += `Gaze Position: ${this.gazePositionXY}\n`; + message += `Gaze Origin Right: ${this.gazeOriginRightXYZ}\n`; + message += `Gaze Origin Left: ${this.gazeOriginLeftXYZ}\n`; + message += `Eye Position Normalized Right: ${this.eyePositionRightNormalizedXYZ}\n`; + message += `Eye Position Normalized Left: ${this.eyePositionLeftNormalizedXYZ}\n`; + message += `Head Position: ${this.headPositionXYZ}\n`; + message += `Head Rotation: ${this.headRotationXYZ}\n`; + message += `User Presence: ${this.userPresence}\n`; + return message; + } +} From cde39603849096dd665dbab312bf2c56b4a5f961 Mon Sep 17 00:00:00 2001 From: Martin Buessemeyer Date: Sun, 19 Jan 2020 23:54:47 +0100 Subject: [PATCH 03/13] Add decision between string and blob message, blob message and therefore stream not working --- demos/eye-tracking/eyetracking.ts | 2 +- source/eyetrackerdatastream.ts | 16 +++++++++++++--- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/demos/eye-tracking/eyetracking.ts b/demos/eye-tracking/eyetracking.ts index d35efef2..4ed069d8 100644 --- a/demos/eye-tracking/eyetracking.ts +++ b/demos/eye-tracking/eyetracking.ts @@ -101,7 +101,7 @@ export class EyeTrackingRenderer extends Renderer { }); this._eyeTrackerDataStream.onStatusUpdate(() => { - console.log(this._eyeTrackerDataStream.statusMessage.toString()); + console.log(this._eyeTrackerDataStream.statusMessage); }); this._eyeTrackerDataStream.dataStreams.gazePosition = true; diff --git a/source/eyetrackerdatastream.ts b/source/eyetrackerdatastream.ts index ea09bb99..0c39b716 100644 --- a/source/eyetrackerdatastream.ts +++ b/source/eyetrackerdatastream.ts @@ -27,7 +27,7 @@ export class EyeTrackerDataStream { } private generateStreamConfigByte(): Uint8Array { - const configByte = new Uint8Array(0); + const configByte = Uint8Array.from([0]); if (this.dataStreams.gazePosition) { configByte[0] = configByte[0] | 0b00000001; } @@ -107,7 +107,16 @@ export class EyeTrackerDataStream { } protected onMessage(event: MessageEvent): void { - if (typeof event.type !== 'string') { + // tslint:disable:strict-type-predicates + if (typeof event.data !== 'string') { + + const reader = new FileReader(); + reader.addEventListener('loadend', () => { + // reader.result contains the contents of blob as a typed array + if(typeof reader.result === ArrayBuffer) + const floatData = new Float32Array(reader.result); + }); + reader.readAsArrayBuffer(blob); const floatData = new Float32Array(event.data); if (floatData.length < this.dataStreams.expectedNumberOfFloats) { this.statusMessage = EyeTrackingStatusMessage.BinaryMessageTooSmall; @@ -117,7 +126,8 @@ export class EyeTrackerDataStream { this._onDataUpdateLambda(); } } else { - this.statusMessage = event.data; + this._message = event.data; + console.log(this._message); this._onStatusUpdateLambda(); } } From d80ec538424485cfad79eb4017b74002b32d86bd Mon Sep 17 00:00:00 2001 From: Martin Buessemeyer Date: Mon, 20 Jan 2020 17:07:00 +0100 Subject: [PATCH 04/13] Try: Implement Blob parsing --- source/eyetrackerdatastream.ts | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/source/eyetrackerdatastream.ts b/source/eyetrackerdatastream.ts index 0c39b716..f6758e1a 100644 --- a/source/eyetrackerdatastream.ts +++ b/source/eyetrackerdatastream.ts @@ -106,18 +106,11 @@ export class EyeTrackerDataStream { logIf(this.logStatus, LogLevel.Info, event.toString()); } - protected onMessage(event: MessageEvent): void { + protected async onMessage(event: MessageEvent): Promise { // tslint:disable:strict-type-predicates if (typeof event.data !== 'string') { - - const reader = new FileReader(); - reader.addEventListener('loadend', () => { - // reader.result contains the contents of blob as a typed array - if(typeof reader.result === ArrayBuffer) - const floatData = new Float32Array(reader.result); - }); - reader.readAsArrayBuffer(blob); - const floatData = new Float32Array(event.data); + const arrayBuffer = await event.data.arrayBuffer(); + const floatData = new Float32Array(arrayBuffer); if (floatData.length < this.dataStreams.expectedNumberOfFloats) { this.statusMessage = EyeTrackingStatusMessage.BinaryMessageTooSmall; this._onStatusUpdateLambda(); From c04d2ba62565a8cf043a476a1e126e5022f14af8 Mon Sep 17 00:00:00 2001 From: Martin Buessemeyer Date: Mon, 20 Jan 2020 17:57:56 +0100 Subject: [PATCH 05/13] Stream works, Export missing classes, Adjust status message workflow --- demos/eye-tracking/eyetracking.ts | 13 ++++++++++++- source/eyetrackerdatastream.ts | 19 ++++++++++++------- source/webgl-operate.slim.ts | 3 +++ 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/demos/eye-tracking/eyetracking.ts b/demos/eye-tracking/eyetracking.ts index 4ed069d8..f8add1a9 100644 --- a/demos/eye-tracking/eyetracking.ts +++ b/demos/eye-tracking/eyetracking.ts @@ -10,6 +10,7 @@ import { CuboidGeometry, DefaultFramebuffer, EyeTrackerDataStream, + EyeTrackingStatusMessage, Invalidate, MouseEventProvider, Navigation, @@ -101,7 +102,17 @@ export class EyeTrackingRenderer extends Renderer { }); this._eyeTrackerDataStream.onStatusUpdate(() => { - console.log(this._eyeTrackerDataStream.statusMessage); + switch (this._eyeTrackerDataStream.statusMessage) { + case EyeTrackingStatusMessage.NewServerMessage: + console.log(this._eyeTrackerDataStream.serverMessage); + break; + case EyeTrackingStatusMessage.BinaryMessageTooSmall: + console.log('Received stream from server with not enough bytes.'); + break; + default: + console.log('Eye-Tracking data stream in invalid state.'); + break; + } }); this._eyeTrackerDataStream.dataStreams.gazePosition = true; diff --git a/source/eyetrackerdatastream.ts b/source/eyetrackerdatastream.ts index f6758e1a..38237446 100644 --- a/source/eyetrackerdatastream.ts +++ b/source/eyetrackerdatastream.ts @@ -7,7 +7,6 @@ export class EyeTrackerDataStream { protected readonly websocketAddress = 'ws://localhost:1234'; - protected _message: string; protected _webSocket: WebSocket; protected _onDataUpdateLambda: () => void; protected _onStatusUpdateLambda: () => void; @@ -15,11 +14,12 @@ export class EyeTrackerDataStream { public dataStreams: EyeTrackingDataStreams; public eyeTrackingData: EyeTrackingData; public statusMessage: EyeTrackingStatusMessage; + public _serverMessage: string; public logStatus: boolean; constructor() { - this._message = ''; + this._serverMessage = ''; this._onDataUpdateLambda = () => { }; this._onStatusUpdateLambda = () => { }; this.dataStreams = new EyeTrackingDataStreams(); @@ -88,6 +88,7 @@ export class EyeTrackerDataStream { if (this.dataStreams.userPresence) { this.eyeTrackingData.userPresence = data[currentIndexPosition] === 0.0 ? false : true; } + this.eyeTrackingData.dataChanged = true; } protected onOpen(event: Event): void { @@ -107,7 +108,6 @@ export class EyeTrackerDataStream { } protected async onMessage(event: MessageEvent): Promise { - // tslint:disable:strict-type-predicates if (typeof event.data !== 'string') { const arrayBuffer = await event.data.arrayBuffer(); const floatData = new Float32Array(arrayBuffer); @@ -119,8 +119,8 @@ export class EyeTrackerDataStream { this._onDataUpdateLambda(); } } else { - this._message = event.data; - console.log(this._message); + this._serverMessage = event.data; + this.statusMessage = EyeTrackingStatusMessage.NewServerMessage; this._onStatusUpdateLambda(); } } @@ -152,8 +152,8 @@ export class EyeTrackerDataStream { this._onStatusUpdateLambda = lambda; } - get message(): string { - return this._message; + get serverMessage(): string { + return this._serverMessage; } get connectionState(): number { @@ -198,6 +198,7 @@ export class EyeTrackingDataStreams { export enum EyeTrackingStatusMessage { BinaryMessageTooSmall = 'The last received binary message was smaller than expected', + NewServerMessage = 'Server sent new message.', } export class EyeTrackingData { @@ -219,6 +220,10 @@ export class EyeTrackingData { // user presence, a bool represented as a public number so that everything fits in a char array public userPresence = false; + // Is set to true if new data have been written to the attributes. + // Always set it to false after you processed the data in order to be able to determine when new data arrived. + public dataChanged = false; + public toString(): string { let message = ''; message += `Gaze Position: ${this.gazePositionXY}\n`; diff --git a/source/webgl-operate.slim.ts b/source/webgl-operate.slim.ts index 3e3b6763..5396ab20 100644 --- a/source/webgl-operate.slim.ts +++ b/source/webgl-operate.slim.ts @@ -60,6 +60,9 @@ export { ShadowPass } from './shadowpass'; export { EyeTrackerDataStream } from './eyetrackerdatastream'; +export { EyeTrackingStatusMessage } from './eyetrackerdatastream'; +export { EyeTrackingDataStreams } from './eyetrackerdatastream'; + export * from './core/index'; export * from './scene/index'; From 9d5ee32f073060c95956165f2e0ab6f64c160382 Mon Sep 17 00:00:00 2001 From: Martin Buessemeyer Date: Sat, 25 Jan 2020 17:20:40 +0100 Subject: [PATCH 06/13] Adapt event handling interface to eye gaze data stream, untested --- source/eventhandler.ts | 114 +++++++++++++++- source/eyegazedatastream.ts | 173 ++++++++++++++++++++++++ source/eyegazeevent.ts | 53 ++++++++ source/eyegazeeventprovider.ts | 158 ++++++++++++++++++++++ source/eyetrackerdatastream.ts | 239 --------------------------------- source/mouseeventprovider.ts | 1 - source/webgl-operate.slim.ts | 7 +- 7 files changed, 500 insertions(+), 245 deletions(-) create mode 100644 source/eyegazedatastream.ts create mode 100644 source/eyegazeevent.ts create mode 100644 source/eyegazeeventprovider.ts delete mode 100644 source/eyetrackerdatastream.ts diff --git a/source/eventhandler.ts b/source/eventhandler.ts index 28c134fd..74284bdc 100644 --- a/source/eventhandler.ts +++ b/source/eventhandler.ts @@ -8,6 +8,8 @@ import { Observable, Subscription } from 'rxjs'; import { assert } from './auxiliaries'; +import { EyeGazeEvent } from './eyegazeevent'; +import { EyeGazeEventProvider } from './eyegazeeventprovider'; import { MouseEventProvider } from './mouseeventprovider'; import { Invalidate } from './renderer'; import { TouchEventProvider } from './toucheventprovider'; @@ -25,6 +27,11 @@ export interface MouseEventHandler { (latests: Array, previous: Arra */ export interface TouchEventHandler { (latests: Array, previous: Array): void; } +/** + * Callback for handling eye gaze events, given the latest eye gaze events (since last update) as well as the previous. + */ +export interface EyeGazeEventHandler { (latests: Array, previous: Array): void; } + /** * ... Provider and event handler are explicitly separated in order to reduce the number of observables (reuse of event @@ -57,6 +64,12 @@ export class EventHandler { */ protected _touchEventProvider: TouchEventProvider | undefined; + /** + * Assigned eye gaze event provider. This is usually created and owned by the eye gaze data stream. + */ + protected _eyeGazeEventProvider: EyeGazeEventProvider | undefined; + + protected _latestMouseEventsByType = new Map>(); protected _previousMouseEventsByType = @@ -72,11 +85,21 @@ export class EventHandler { new Map>(); + protected _latestEyeGazeEventsByType = + new Map>(); + protected _previousEyeGazeEventsByType = + new Map>(); + protected _eyeGazeEventHandlerByType = + new Map>(); + + constructor(invalidate: Invalidate | undefined, mouseEventProvider: MouseEventProvider | undefined, - /* keyEventProvider: KeyEventProvider | undefined,*/ touchEventProvider: TouchEventProvider | undefined) { + /* keyEventProvider: KeyEventProvider | undefined,*/ touchEventProvider: TouchEventProvider | undefined, + eyeGazeEventProvider: EyeGazeEventProvider | undefined) { this._invalidate = invalidate; this._mouseEventProvider = mouseEventProvider; this._touchEventProvider = touchEventProvider; + this._eyeGazeEventProvider = eyeGazeEventProvider; } @@ -93,7 +116,7 @@ export class EventHandler { /** * Utility for registering an additional mouse event handler for updates on mouse events of the given type. The - * handler is to be called on update iff at least a single mouse event of the given type has occurred since last + * handler is to be called on update if at least a single mouse event of the given type has occurred since last * update. * @param type - Mouse event type the handler is to be associated with. * @param handler - Handler to be called on update. @@ -186,6 +209,50 @@ export class EventHandler { latest.length = 0; } + /** + * Utility for registering an additional touch event handler for updates on touch events of the given type. The + * handler is to be called on update iff at least a single touch event of the given type has occurred since last + * update. + * @param type - Touch event type the handler is to be associated with. + * @param handler - Handler to be called on update. + */ + protected pushEyeGazeEventHandler(type: EyeGazeEventProvider.Type, handler: EyeGazeEventHandler): void { + if (this._eyeGazeEventHandlerByType.has(type)) { + (this._eyeGazeEventHandlerByType.get(type) as Array).push(handler); + return; + } + + this._eyeGazeEventHandlerByType.set(type, new Array()); + + this._previousEyeGazeEventsByType.set(type, new Array()); + const latest = new Array(); + this._latestEyeGazeEventsByType.set(type, latest); + + assert(this._eyeGazeEventProvider !== undefined, `expected valid eye gaze event provider`); + const observable = (this._eyeGazeEventProvider as EyeGazeEventProvider).observable(type); + + this._subscriptions.push((observable as Observable).subscribe( + (event) => { latest.push(event); this.invalidate(); })); + + (this._eyeGazeEventHandlerByType.get(type) as Array).push(handler); + } + + protected invokeEyeGazeEventHandler(type: EyeGazeEventProvider.Type): void { + const handlers = this._eyeGazeEventHandlerByType.get(type); + if (handlers === undefined || handlers.length === 0) { + return; + } + const latest = this._latestEyeGazeEventsByType.get(type) as Array; + if (latest.length === 0) { + return; + } + const previous = this._previousEyeGazeEventsByType.get(type) as Array; + handlers.forEach((handler) => handler(latest, previous)); + + Object.assign(previous, latest); + latest.length = 0; + } + /** * Disposes all registered handlers of all event types. */ @@ -194,6 +261,8 @@ export class EventHandler { this._previousMouseEventsByType.forEach((value) => value.length = 0); this._latestTouchEventsByType.forEach((value) => value.length = 0); this._previousTouchEventsByType.forEach((value) => value.length = 0); + this._previousEyeGazeEventsByType.forEach((value) => value.length = 0); + this._latestEyeGazeEventsByType.forEach((value) => value.length = 0); for (const subscription of this._subscriptions) { subscription.unsubscribe(); @@ -216,6 +285,11 @@ export class EventHandler { this.invokeTouchEventHandler(TouchEventProvider.Type.End); this.invokeTouchEventHandler(TouchEventProvider.Type.Move); this.invokeTouchEventHandler(TouchEventProvider.Type.Cancel); + + this.invokeEyeGazeEventHandler(EyeGazeEventProvider.Type.EyeGazeData); + this.invokeEyeGazeEventHandler(EyeGazeEventProvider.Type.NewServerMessage); + this.invokeEyeGazeEventHandler(EyeGazeEventProvider.Type.ConnectionStatus); + this.invokeEyeGazeEventHandler(EyeGazeEventProvider.Type.BinaryMessageParsingError); } @@ -382,6 +456,42 @@ export class EventHandler { this.pushTouchEventHandler(TouchEventProvider.Type.Cancel, handler); } + /** + * Register a eye gaze data event handler that is to be called on update if at least + * a single eye gaze data event has occurred since last update. + * @param handler - Handler to be called on update. + */ + pushEyeGazeDataHandler(handler: EyeGazeEventHandler): void { + this.pushEyeGazeEventHandler(EyeGazeEventProvider.Type.EyeGazeData, handler); + } + + /** + * Register a eye gaze server message event handler that is to be called on update if at least + * a single eye gaze server message event has occurred since last update. + * @param handler - Handler to be called on update. + */ + pushEyeGazeServerMessageHandler(handler: EyeGazeEventHandler): void { + this.pushEyeGazeEventHandler(EyeGazeEventProvider.Type.EyeGazeData, handler); + } + + /** + * Register a eye gaze connection status event handler that is to be called on update if at least + * a single eye gaze connection status event has occurred since last update. + * @param handler - Handler to be called on update. + */ + pushEyeGazeConnectionStatusHandler(handler: EyeGazeEventHandler): void { + this.pushEyeGazeEventHandler(EyeGazeEventProvider.Type.EyeGazeData, handler); + } + + /** + * Register a eye gaze binary message parsing error event handler that is to be called on update if at least + * a single eye gaze binary message parsing error event has occurred since last update. + * @param handler - Handler to be called on update. + */ + pushEyeGazeBinaryMessageParsingErrorHandler(handler: EyeGazeEventHandler): void { + this.pushEyeGazeEventHandler(EyeGazeEventProvider.Type.EyeGazeData, handler); + } + /** * Forward pointer lock request to the mouse event provider (if one exists). diff --git a/source/eyegazedatastream.ts b/source/eyegazedatastream.ts new file mode 100644 index 00000000..6f1870e6 --- /dev/null +++ b/source/eyegazedatastream.ts @@ -0,0 +1,173 @@ +import { assert } from './auxiliaries'; +import { EyeGazeData, EyeGazeEvent } from './eyegazeevent'; + +// tslint:disable:max-classes-per-file + +export class EyeGazeDataStream extends EventTarget { + + public static readonly EYE_GAZE_DATA = 'eyegazedata'; + public static readonly NEW_SERVER_MESSAGE = 'newservermessage'; + public static readonly CONNECTION_STATUS = 'connectionstatus'; + public static readonly BINARY_MESSAGE_PARSING_ERROR = 'binarymessageparsingerror'; + + protected _webSocket: WebSocket; + protected readonly websocketAddress = 'ws://localhost:1234'; + + protected _eyeGazeDataStreams: EyeGazeDataStreams; + + constructor(eyeGazeDataStreams: EyeGazeDataStreams) { + super(); + assert(eyeGazeDataStreams !== undefined, `expected a valid eye gaze data streams object on initialization, given ${eyeGazeDataStreams}.`); + this._eyeGazeDataStreams = eyeGazeDataStreams; + this.connect(); + } + + private generateStreamConfigByte(): Uint8Array { + const configByte = Uint8Array.from([0]); + if (this._eyeGazeDataStreams.gazePosition) { + configByte[0] = configByte[0] | 0b00000001; + } + if (this._eyeGazeDataStreams.gazeOrigin) { + configByte[0] = configByte[0] | 0b00000010; + } + if (this._eyeGazeDataStreams.eyePositionNormalized) { + configByte[0] = configByte[0] | 0b00000100; + } + if (this._eyeGazeDataStreams.headPositionAndRotation) { + configByte[0] = configByte[0] | 0b00001000; + } + if (this._eyeGazeDataStreams.userPresence) { + configByte[0] = configByte[0] | 0b00010000; + } + return configByte; + } + + private performHandshake(): void { + this._eyeGazeDataStreams.recalculateNumberOfFloats(); + const configByte = this.generateStreamConfigByte(); + this._webSocket.send(configByte); + } + + private parseEyeTrackingData(data: Float32Array): EyeGazeEvent { + if (data.length === this._eyeGazeDataStreams.expectedNumberOfFloats) { + return new EyeGazeEvent(EyeGazeDataStream.BINARY_MESSAGE_PARSING_ERROR); + } + let currentIndexPosition = 0; + const eyeGazeData = new EyeGazeData(); + if (this._eyeGazeDataStreams.gazePosition) { + eyeGazeData.gazePositionXY[0] = data[currentIndexPosition++]; + eyeGazeData.gazePositionXY[1] = data[currentIndexPosition++]; + } + if (this._eyeGazeDataStreams.gazeOrigin) { + eyeGazeData.gazeOriginRightXYZ[0] = data[currentIndexPosition++]; + eyeGazeData.gazeOriginRightXYZ[1] = data[currentIndexPosition++]; + eyeGazeData.gazeOriginRightXYZ[2] = data[currentIndexPosition++]; + + eyeGazeData.gazeOriginLeftXYZ[0] = data[currentIndexPosition++]; + eyeGazeData.gazeOriginLeftXYZ[1] = data[currentIndexPosition++]; + eyeGazeData.gazeOriginLeftXYZ[2] = data[currentIndexPosition++]; + } + if (this._eyeGazeDataStreams.eyePositionNormalized) { + eyeGazeData.eyePositionRightNormalizedXYZ[0] = data[currentIndexPosition++]; + eyeGazeData.eyePositionRightNormalizedXYZ[1] = data[currentIndexPosition++]; + eyeGazeData.eyePositionRightNormalizedXYZ[2] = data[currentIndexPosition++]; + + eyeGazeData.eyePositionLeftNormalizedXYZ[0] = data[currentIndexPosition++]; + eyeGazeData.eyePositionLeftNormalizedXYZ[1] = data[currentIndexPosition++]; + eyeGazeData.eyePositionLeftNormalizedXYZ[2] = data[currentIndexPosition++]; + } + if (this._eyeGazeDataStreams.headPositionAndRotation) { + eyeGazeData.headPositionXYZ[0] = data[currentIndexPosition++]; + eyeGazeData.headPositionXYZ[1] = data[currentIndexPosition++]; + eyeGazeData.headPositionXYZ[2] = data[currentIndexPosition++]; + + eyeGazeData.headRotationXYZ[0] = data[currentIndexPosition++]; + eyeGazeData.headRotationXYZ[1] = data[currentIndexPosition++]; + eyeGazeData.headRotationXYZ[2] = data[currentIndexPosition++]; + } + if (this._eyeGazeDataStreams.userPresence) { + eyeGazeData.userPresence = data[currentIndexPosition] === 0.0 ? false : true; + } + return new EyeGazeEvent(EyeGazeDataStream.EYE_GAZE_DATA, eyeGazeData); + } + + private connect(): void { + this._webSocket = new WebSocket(this.websocketAddress); + + // Arrow functions needed in order to not loose this-context. + this._webSocket.onopen = (event: Event) => { + this.onOpen(event); + }; + this._webSocket.onclose = (event: Event) => { + this.onClose(event); + }; + this._webSocket.onerror = (event: Event) => { + this.onError(event); + }; + this._webSocket.onmessage = (event: MessageEvent) => { + this.onMessage(event); + }; + } + + // TODO add proper sub event types + protected onOpen(event: Event): void { + this.dispatchEvent(new EyeGazeEvent(EyeGazeDataStream.CONNECTION_STATUS, undefined, 'connected to server')); + this.performHandshake(); + } + + protected onClose(event: Event): void { + this.dispatchEvent(new EyeGazeEvent(EyeGazeDataStream.CONNECTION_STATUS, undefined, 'disconnected to server')); + } + + protected onError(event: Event): void { + } + + protected async onMessage(event: MessageEvent): Promise { + // handle stream data + if (typeof event.data !== 'string') { + const arrayBuffer = await event.data.arrayBuffer(); + const floatData = new Float32Array(arrayBuffer); + this.dispatchEvent(this.parseEyeTrackingData(floatData)); + // handle status message data + } else { + this.dispatchEvent(new EyeGazeEvent(EyeGazeDataStream.NEW_SERVER_MESSAGE, undefined, event.data)); + } + } + + get connectionState(): number { + return this._webSocket.readyState; + } +} + +export class EyeGazeDataStreams { + public gazePosition = false; + public gazeOrigin = false; + public eyePositionNormalized = false; + public headPositionAndRotation = false; + public userPresence = false; + + + // The sum of floats from all activated data streams + public expectedNumberOfFloats = 0; + + // Is automatically recalculated if the handshake is invoked + public recalculateNumberOfFloats(): void { + let newNumberOfFloats = 0; + if (this.gazePosition) { + newNumberOfFloats += 2; + } + if (this.gazeOrigin) { + newNumberOfFloats += 6; + } + if (this.eyePositionNormalized) { + newNumberOfFloats += 6; + } + if (this.headPositionAndRotation) { + newNumberOfFloats += 6; + } + if (this.userPresence) { + newNumberOfFloats += 1; + } + this.expectedNumberOfFloats = newNumberOfFloats; + } +} diff --git a/source/eyegazeevent.ts b/source/eyegazeevent.ts new file mode 100644 index 00000000..9af67a4d --- /dev/null +++ b/source/eyegazeevent.ts @@ -0,0 +1,53 @@ + + +// tslint:disable:max-classes-per-file + +export class EyeGazeEvent extends Event { + eyeGazeData: EyeGazeData; + type: string; + message: string; + + constructor(type: string, eyeGazeData?: EyeGazeData, message?: string) { + super(type); + if (eyeGazeData) { + this.eyeGazeData = eyeGazeData; + } + if (message) { + this.message = message; + } + } +} + +export class EyeGazeData { + // gaze position x and y + public gazePositionXY: [number, number] = [0, 0]; + + // gaze origin + public gazeOriginRightXYZ: [number, number, number] = [0, 0, 0]; + public gazeOriginLeftXYZ: [number, number, number] = [0, 0, 0]; + + // eye position normalized + public eyePositionRightNormalizedXYZ: [number, number, number] = [0, 0, 0]; + public eyePositionLeftNormalizedXYZ: [number, number, number] = [0, 0, 0]; + + // head position and rotation + public headPositionXYZ: [number, number, number] = [0, 0, 0]; + public headRotationXYZ: [number, number, number] = [0, 0, 0]; + + // user presence, a bool represented as a public number so that everything fits in a char array + public userPresence = false; + + public toString(): string { + let message = ''; + message += `Gaze Position: ${this.gazePositionXY}\n`; + message += `Gaze Origin Right: ${this.gazeOriginRightXYZ}\n`; + message += `Gaze Origin Left: ${this.gazeOriginLeftXYZ}\n`; + message += `Eye Position Normalized Right: ${this.eyePositionRightNormalizedXYZ}\n`; + message += `Eye Position Normalized Left: ${this.eyePositionLeftNormalizedXYZ}\n`; + message += `Head Position: ${this.headPositionXYZ}\n`; + message += `Head Rotation: ${this.headRotationXYZ}\n`; + message += `User Presence: ${this.userPresence}\n`; + return message; + } +} + diff --git a/source/eyegazeeventprovider.ts b/source/eyegazeeventprovider.ts new file mode 100644 index 00000000..2c323191 --- /dev/null +++ b/source/eyegazeeventprovider.ts @@ -0,0 +1,158 @@ + +import { Observable, ReplaySubject } from 'rxjs'; +import { assert, bitInBitfield } from './auxiliaries'; +import { EyeGazeDataStream, EyeGazeDataStreams } from './eyegazedatastream'; +import { EyeGazeEvent } from './eyegazeevent'; + + +// tslint:disable:max-classes-per-file + +// mache zu: Gaze event provider, siehe: mouseenevtprovider, eventhandler, rxjs +// semantic: Look up what the data mean and document it +export class EyeGazeEventProvider { + + /** + * Time frame for events to be buffered (windowTime in rxjs per ReplaySubject). + */ + protected _timeframe: number | undefined; + + /** + * This mask saves for which types of events, event.preventDefault should be called. This is useful to disallow + * some kinds of standard events like successful connected and handshake success. + */ + protected _preventDefaultMask: EyeGazeEventProvider.Type; + + protected _eyeGazeDataListener: { (event: EyeGazeEvent): void }; + protected _eyeGazeDataSubject: ReplaySubject; + + protected _newServerMessageListener: { (event: EyeGazeEvent): void }; + protected _newServerMessageSubject: ReplaySubject; + + protected _connectionStatusListener: { (event: EyeGazeEvent): void }; + protected _connectionStatusSubject: ReplaySubject; + + protected _binaryMessageParsingErrorListener: { (event: EyeGazeEvent): void }; + protected _binaryMessageParsingErrorSubject: ReplaySubject; + + protected _eyeGazeDataStream: EyeGazeDataStream; + + constructor(eyeGazeDataStreams: EyeGazeDataStreams, timeframe?: number) { + assert(eyeGazeDataStreams !== undefined, `expected a valid eye gaze data streams object on initialization, given ${eyeGazeDataStreams}.`); + this._eyeGazeDataStream = new EyeGazeDataStream(eyeGazeDataStreams); + } + + /** + * Checks whether or not to prevent the default handling of the given event. This depends on the internal + * `preventDefaultMask` which can be modified using `preventDefault` function @see{@link preventDefault}. + * @param type - Internal event type of the incoming event. + * @param event - Actual event to prevent default handling on (if masked). + */ + protected preventDefaultOnEvent(type: EyeGazeEventProvider.Type, event: EyeGazeEvent): void { + if (bitInBitfield(this._preventDefaultMask, type)) { + event.preventDefault(); + } + } + + /** + * Allow default event handling on specific event types (not calling preventDefault on the event). + * @param types - Event types to allow default handling on. + */ + allowDefault(...types: EyeGazeEventProvider.Type[]): void { + for (const type of types) { + if (bitInBitfield(this._preventDefaultMask, type)) { + this._preventDefaultMask &= ~type; + } + } + } + + /** + * Prevent default event handling on specific event types (using preventDefault on the event). + * @param types - Event types to prevent default handling on. + */ + preventDefault(...types: EyeGazeEventProvider.Type[]): void { + for (const type of types) { + if (!bitInBitfield(this._preventDefaultMask, type)) { + this._preventDefaultMask |= type; + } + } + } + + observable(type: EyeGazeEventProvider.Type): Observable + | Observable | Observable | undefined { + switch (type) { + case EyeGazeEventProvider.Type.EyeGazeData: + return this.EyeGazeData$; + case EyeGazeEventProvider.Type.NewServerMessage: + return this.NewServerMessage$; + case EyeGazeEventProvider.Type.ConnectionStatus: + return this.ConnectionStatus$; + case EyeGazeEventProvider.Type.BinaryMessageParsingError: + return this.BinaryMessageParsingError$; + default: + return undefined; + } + } + + get EyeGazeData$(): Observable { + if (this._eyeGazeDataSubject === undefined) { + this._eyeGazeDataSubject = new ReplaySubject(undefined, this._timeframe); + this._eyeGazeDataListener = (event: EyeGazeEvent) => { + this.preventDefaultOnEvent(EyeGazeEventProvider.Type.EyeGazeData, event); + this._eyeGazeDataSubject.next(event); + }; + this._eyeGazeDataStream.addEventListener(EyeGazeDataStream.EYE_GAZE_DATA, this._eyeGazeDataListener); + } + return this._eyeGazeDataSubject.asObservable(); + } + + get NewServerMessage$(): Observable { + if (this._newServerMessageSubject === undefined) { + this._newServerMessageSubject = new ReplaySubject(undefined, this._timeframe); + this._newServerMessageListener = (event: EyeGazeEvent) => { + this.preventDefaultOnEvent(EyeGazeEventProvider.Type.NewServerMessage, event); + this._newServerMessageSubject.next(event); + }; + this._eyeGazeDataStream.addEventListener(EyeGazeDataStream.NEW_SERVER_MESSAGE, + this._newServerMessageListener); + } + return this._newServerMessageSubject.asObservable(); + } + + get ConnectionStatus$(): Observable { + if (this._connectionStatusSubject === undefined) { + this._connectionStatusSubject = new ReplaySubject(undefined, this._timeframe); + this._connectionStatusListener = (event: EyeGazeEvent) => { + this.preventDefaultOnEvent(EyeGazeEventProvider.Type.ConnectionStatus, event); + this._connectionStatusSubject.next(event); + }; + this._eyeGazeDataStream.addEventListener(EyeGazeDataStream.CONNECTION_STATUS, + this._connectionStatusListener); + } + return this._connectionStatusSubject.asObservable(); + } + + get BinaryMessageParsingError$(): Observable { + if (this._binaryMessageParsingErrorSubject === undefined) { + this._binaryMessageParsingErrorSubject = new ReplaySubject(undefined, this._timeframe); + this._binaryMessageParsingErrorListener = (event: EyeGazeEvent) => { + this.preventDefaultOnEvent(EyeGazeEventProvider.Type.BinaryMessageParsingError, event); + this._binaryMessageParsingErrorSubject.next(event); + }; + this._eyeGazeDataStream.addEventListener(EyeGazeDataStream.BINARY_MESSAGE_PARSING_ERROR, + this._binaryMessageParsingErrorListener); + } + return this._eyeGazeDataSubject.asObservable(); + } +} + +export namespace EyeGazeEventProvider { + + export enum Type { + EyeGazeData = 1 << 0, + NewServerMessage = 1 << 1, + ConnectionStatus = 1 << 2, + BinaryMessageParsingError = 1 << 3, + } + +} + diff --git a/source/eyetrackerdatastream.ts b/source/eyetrackerdatastream.ts deleted file mode 100644 index 38237446..00000000 --- a/source/eyetrackerdatastream.ts +++ /dev/null @@ -1,239 +0,0 @@ - -import { logIf, LogLevel } from './auxiliaries'; - -// tslint:disable:max-classes-per-file - -export class EyeTrackerDataStream { - - protected readonly websocketAddress = 'ws://localhost:1234'; - - protected _webSocket: WebSocket; - protected _onDataUpdateLambda: () => void; - protected _onStatusUpdateLambda: () => void; - - public dataStreams: EyeTrackingDataStreams; - public eyeTrackingData: EyeTrackingData; - public statusMessage: EyeTrackingStatusMessage; - public _serverMessage: string; - - public logStatus: boolean; - - constructor() { - this._serverMessage = ''; - this._onDataUpdateLambda = () => { }; - this._onStatusUpdateLambda = () => { }; - this.dataStreams = new EyeTrackingDataStreams(); - this.eyeTrackingData = new EyeTrackingData(); - } - - private generateStreamConfigByte(): Uint8Array { - const configByte = Uint8Array.from([0]); - if (this.dataStreams.gazePosition) { - configByte[0] = configByte[0] | 0b00000001; - } - if (this.dataStreams.gazeOrigin) { - configByte[0] = configByte[0] | 0b00000010; - } - if (this.dataStreams.eyePositionNormalized) { - configByte[0] = configByte[0] | 0b00000100; - } - if (this.dataStreams.headPositionAndRotation) { - configByte[0] = configByte[0] | 0b00001000; - } - if (this.dataStreams.userPresence) { - configByte[0] = configByte[0] | 0b00010000; - } - return configByte; - } - - private performHandshake(): void { - this.dataStreams.recalculateNumberOfFloats(); - const configByte = this.generateStreamConfigByte(); - this._webSocket.send(configByte); - } - - private parseEyeTrackingData(data: Float32Array): void { - let currentIndexPosition = 0; - if (this.dataStreams.gazePosition) { - this.eyeTrackingData.gazePositionXY[0] = data[currentIndexPosition++]; - this.eyeTrackingData.gazePositionXY[1] = data[currentIndexPosition++]; - } - if (this.dataStreams.gazeOrigin) { - this.eyeTrackingData.gazeOriginRightXYZ[0] = data[currentIndexPosition++]; - this.eyeTrackingData.gazeOriginRightXYZ[1] = data[currentIndexPosition++]; - this.eyeTrackingData.gazeOriginRightXYZ[2] = data[currentIndexPosition++]; - - this.eyeTrackingData.gazeOriginLeftXYZ[0] = data[currentIndexPosition++]; - this.eyeTrackingData.gazeOriginLeftXYZ[1] = data[currentIndexPosition++]; - this.eyeTrackingData.gazeOriginLeftXYZ[2] = data[currentIndexPosition++]; - } - if (this.dataStreams.eyePositionNormalized) { - this.eyeTrackingData.eyePositionRightNormalizedXYZ[0] = data[currentIndexPosition++]; - this.eyeTrackingData.eyePositionRightNormalizedXYZ[1] = data[currentIndexPosition++]; - this.eyeTrackingData.eyePositionRightNormalizedXYZ[2] = data[currentIndexPosition++]; - - this.eyeTrackingData.eyePositionLeftNormalizedXYZ[0] = data[currentIndexPosition++]; - this.eyeTrackingData.eyePositionLeftNormalizedXYZ[1] = data[currentIndexPosition++]; - this.eyeTrackingData.eyePositionLeftNormalizedXYZ[2] = data[currentIndexPosition++]; - } - if (this.dataStreams.headPositionAndRotation) { - this.eyeTrackingData.headPositionXYZ[0] = data[currentIndexPosition++]; - this.eyeTrackingData.headPositionXYZ[1] = data[currentIndexPosition++]; - this.eyeTrackingData.headPositionXYZ[2] = data[currentIndexPosition++]; - - this.eyeTrackingData.headRotationXYZ[0] = data[currentIndexPosition++]; - this.eyeTrackingData.headRotationXYZ[1] = data[currentIndexPosition++]; - this.eyeTrackingData.headRotationXYZ[2] = data[currentIndexPosition++]; - } - if (this.dataStreams.userPresence) { - this.eyeTrackingData.userPresence = data[currentIndexPosition] === 0.0 ? false : true; - } - this.eyeTrackingData.dataChanged = true; - } - - protected onOpen(event: Event): void { - // perform handshake - console.log('connected'); - logIf(this.logStatus, LogLevel.Info, 'Connected to eye tracking server.'); - this.performHandshake(); - } - - protected onClose(event: Event): void { - logIf(this.logStatus, LogLevel.Info, 'Connection to eye tracking server has been closed.'); - } - - protected onError(event: Event): void { - logIf(this.logStatus, LogLevel.Info, 'Connection returned an error: '); - logIf(this.logStatus, LogLevel.Info, event.toString()); - } - - protected async onMessage(event: MessageEvent): Promise { - if (typeof event.data !== 'string') { - const arrayBuffer = await event.data.arrayBuffer(); - const floatData = new Float32Array(arrayBuffer); - if (floatData.length < this.dataStreams.expectedNumberOfFloats) { - this.statusMessage = EyeTrackingStatusMessage.BinaryMessageTooSmall; - this._onStatusUpdateLambda(); - } else { - this.parseEyeTrackingData(floatData); - this._onDataUpdateLambda(); - } - } else { - this._serverMessage = event.data; - this.statusMessage = EyeTrackingStatusMessage.NewServerMessage; - this._onStatusUpdateLambda(); - } - } - - public connect(): void { - console.log('Trying to connect to server'); - this._webSocket = new WebSocket(this.websocketAddress); - - // Arrow functions needed in order to not loose this-context. - this._webSocket.onopen = (event: Event) => { - this.onOpen(event); - }; - this._webSocket.onclose = (event: Event) => { - this.onClose(event); - }; - this._webSocket.onerror = (event: Event) => { - this.onError(event); - }; - this._webSocket.onmessage = (event: MessageEvent) => { - this.onMessage(event); - }; - } - - public onDataUpdate(lambda: () => void): void { - this._onDataUpdateLambda = lambda; - } - - public onStatusUpdate(lambda: () => void): void { - this._onStatusUpdateLambda = lambda; - } - - get serverMessage(): string { - return this._serverMessage; - } - - get connectionState(): number { - return this._webSocket.readyState; - } -} - -export class EyeTrackingDataStreams { - public gazePosition = false; - public gazeOrigin = false; - public eyePositionNormalized = false; - public headPositionAndRotation = false; - public userPresence = false; - - - // The sum of floats from all activated data streams - public expectedNumberOfFloats = 0; - - // Is automatically recalculated if the handshake is invoked - public recalculateNumberOfFloats(): void { - let newNumberOfFloats = 0; - if (this.gazePosition) { - newNumberOfFloats += 2; - } - if (this.gazeOrigin) { - newNumberOfFloats += 6; - } - if (this.eyePositionNormalized) { - newNumberOfFloats += 6; - } - if (this.headPositionAndRotation) { - newNumberOfFloats += 6; - } - if (this.userPresence) { - newNumberOfFloats += 1; - } - this.expectedNumberOfFloats = newNumberOfFloats; - - } -} - -export enum EyeTrackingStatusMessage { - - BinaryMessageTooSmall = 'The last received binary message was smaller than expected', - NewServerMessage = 'Server sent new message.', -} - -export class EyeTrackingData { - // gaze position x and y - public gazePositionXY: [number, number] = [0, 0]; - - // gaze origin - public gazeOriginRightXYZ: [number, number, number] = [0, 0, 0]; - public gazeOriginLeftXYZ: [number, number, number] = [0, 0, 0]; - - // eye position normalized - public eyePositionRightNormalizedXYZ: [number, number, number] = [0, 0, 0]; - public eyePositionLeftNormalizedXYZ: [number, number, number] = [0, 0, 0]; - - // head position and rotation - public headPositionXYZ: [number, number, number] = [0, 0, 0]; - public headRotationXYZ: [number, number, number] = [0, 0, 0]; - - // user presence, a bool represented as a public number so that everything fits in a char array - public userPresence = false; - - // Is set to true if new data have been written to the attributes. - // Always set it to false after you processed the data in order to be able to determine when new data arrived. - public dataChanged = false; - - public toString(): string { - let message = ''; - message += `Gaze Position: ${this.gazePositionXY}\n`; - message += `Gaze Origin Right: ${this.gazeOriginRightXYZ}\n`; - message += `Gaze Origin Left: ${this.gazeOriginLeftXYZ}\n`; - message += `Eye Position Normalized Right: ${this.eyePositionRightNormalizedXYZ}\n`; - message += `Eye Position Normalized Left: ${this.eyePositionLeftNormalizedXYZ}\n`; - message += `Head Position: ${this.headPositionXYZ}\n`; - message += `Head Rotation: ${this.headRotationXYZ}\n`; - message += `User Presence: ${this.userPresence}\n`; - return message; - } -} diff --git a/source/mouseeventprovider.ts b/source/mouseeventprovider.ts index fc1e9420..0988a7e7 100644 --- a/source/mouseeventprovider.ts +++ b/source/mouseeventprovider.ts @@ -253,7 +253,6 @@ export class MouseEventProvider { } return this._dragSubject.asObservable(); } - } diff --git a/source/webgl-operate.slim.ts b/source/webgl-operate.slim.ts index 5396ab20..4e064c98 100644 --- a/source/webgl-operate.slim.ts +++ b/source/webgl-operate.slim.ts @@ -59,9 +59,9 @@ export { GaussFilter } from './gaussfilter'; export { ShadowPass } from './shadowpass'; -export { EyeTrackerDataStream } from './eyetrackerdatastream'; -export { EyeTrackingStatusMessage } from './eyetrackerdatastream'; -export { EyeTrackingDataStreams } from './eyetrackerdatastream'; +export { EyeGazeDataStream, EyeGazeDataStreams } from './eyegazedatastream'; +export { EyeGazeEventProvider } from './eyegazeeventprovider'; +export { EyeGazeEvent, EyeGazeData } from './eyegazeevent'; export * from './core/index'; @@ -83,5 +83,6 @@ export import gl_matrix_extensions = root_gl_matrix_extensions; import * as root_tuples from './tuples'; export import tuples = root_tuples; +import { EyeGazeEvent } from './eyegazeevent'; /* spellchecker: enable */ From 7a7caad5f9a87fd828fa23563c0907e87d29c8e7 Mon Sep 17 00:00:00 2001 From: Martin Buessemeyer Date: Sun, 9 Feb 2020 15:14:06 +0100 Subject: [PATCH 07/13] Integrate eye gaze into existing event handling, refactore method signature --- demos/cornell-box/cornellbox.ts | 6 +- demos/cubescape/cubescape.ts | 6 +- demos/eye-tracking/eyetracking.ts | 77 ++++++++-------- demos/gltf-renderer/gltfrenderer.ts | 8 +- examples/canvassize-example.ts | 4 +- examples/cube-example.ts | 8 +- examples/envprojections-example.ts | 8 +- examples/imagebasedlighting-example.ts | 8 +- examples/labelanchor-example.ts | 4 +- examples/labelelide-example.ts | 4 +- examples/scene-example.ts | 8 +- examples/shadowmap-example.ts | 8 +- examples/shadowmap-multiframe-example.ts | 8 +- examples/tiled-rendering-example.ts | 8 +- examples/triangle-example.ts | 8 +- source/canvas.ts | 24 ++++- source/debug/testnavigation.ts | 4 +- source/debug/testrenderer.ts | 8 +- source/eventhandler.ts | 16 ++-- source/eyegazedatastream.ts | 110 +++++++++++++++-------- source/eyegazeevent.ts | 38 ++++---- source/eyegazeeventprovider.ts | 11 +-- source/navigation.ts | 4 +- source/renderer.ts | 15 ++-- source/webgl-operate.slim.ts | 3 +- 25 files changed, 225 insertions(+), 181 deletions(-) diff --git a/demos/cornell-box/cornellbox.ts b/demos/cornell-box/cornellbox.ts index f320c592..85beebec 100644 --- a/demos/cornell-box/cornellbox.ts +++ b/demos/cornell-box/cornellbox.ts @@ -11,9 +11,9 @@ import { Canvas, Context, DefaultFramebuffer, + EventProvider, Framebuffer, Invalidate, - MouseEventProvider, Navigation, NdcFillingTriangle, Program, @@ -187,7 +187,7 @@ export class CornellBoxRenderer extends Renderer { this._blit.frame(); } - protected onInitialize(context: Context, callback: Invalidate, mouseEventProvider: MouseEventProvider): boolean { + protected onInitialize(context: Context, callback: Invalidate, eventProvider: EventProvider): boolean { const gl = this._context.gl; const gl2facade = this._context.gl2facade; @@ -209,7 +209,7 @@ export class CornellBoxRenderer extends Renderer { this._camera.far = 4.0; // Initialize navigation - this._navigation = new Navigation(callback, mouseEventProvider); + this._navigation = new Navigation(callback, eventProvider.mouseEventProvider); this._navigation.camera = this._camera; diff --git a/demos/cubescape/cubescape.ts b/demos/cubescape/cubescape.ts index 151d63a2..785fce71 100644 --- a/demos/cubescape/cubescape.ts +++ b/demos/cubescape/cubescape.ts @@ -8,8 +8,8 @@ import { Canvas, Context, DefaultFramebuffer, + EventProvider, Invalidate, - MouseEventProvider, Navigation, Program, Renderer, @@ -108,7 +108,7 @@ class CubescapeRenderer extends Renderer { } protected onInitialize(context: Context, callback: Invalidate, - mouseEventProvider: MouseEventProvider): boolean { + eventProvider: EventProvider): boolean { const gl = this._context.gl; context.enable(['ANGLE_instanced_arrays']); @@ -152,7 +152,7 @@ class CubescapeRenderer extends Renderer { this._camera.near = 0.1; this._camera.far = 4.0; - this._navigation = new Navigation(callback, mouseEventProvider); + this._navigation = new Navigation(callback, eventProvider.mouseEventProvider); this._navigation.camera = this._camera; this._defaultFBO = new DefaultFramebuffer(this._context, 'DefaultFBO'); diff --git a/demos/eye-tracking/eyetracking.ts b/demos/eye-tracking/eyetracking.ts index f8add1a9..d3f9ed3a 100644 --- a/demos/eye-tracking/eyetracking.ts +++ b/demos/eye-tracking/eyetracking.ts @@ -9,10 +9,11 @@ import { Context, CuboidGeometry, DefaultFramebuffer, - EyeTrackerDataStream, - EyeTrackingStatusMessage, + EventHandler, + EventProvider, + EyeGazeDataStreams, + EyeGazeEvent, Invalidate, - MouseEventProvider, Navigation, Program, Renderer, @@ -39,12 +40,19 @@ export class EyeTrackingRenderer extends Renderer { protected _defaultFBO: DefaultFramebuffer; - protected _eyeTrackerDataStream: EyeTrackerDataStream; + protected _eyeGazeDataStreams: EyeGazeDataStreams; + protected _eventHandler: EventHandler; + + constructor(eyeGazeDataStreams: EyeGazeDataStreams) { + super(); + this._eyeGazeDataStreams = eyeGazeDataStreams; + } protected onUpdate(): boolean { // Update camera navigation (process events) this._navigation.update(); + this._eventHandler.update(); return this._altered.any || this._camera.altered; } @@ -90,37 +98,23 @@ export class EyeTrackingRenderer extends Renderer { protected onSwap(): void { } protected onInitialize(context: Context, callback: Invalidate, - mouseEventProvider: MouseEventProvider, - /* keyEventProvider: KeyEventProvider, */ - /* touchEventProvider: TouchEventProvider */): boolean { - - - this._eyeTrackerDataStream = new EyeTrackerDataStream(); - - this._eyeTrackerDataStream.onDataUpdate(() => { - console.log(this._eyeTrackerDataStream.eyeTrackingData.toString()); - }); - - this._eyeTrackerDataStream.onStatusUpdate(() => { - switch (this._eyeTrackerDataStream.statusMessage) { - case EyeTrackingStatusMessage.NewServerMessage: - console.log(this._eyeTrackerDataStream.serverMessage); - break; - case EyeTrackingStatusMessage.BinaryMessageTooSmall: - console.log('Received stream from server with not enough bytes.'); - break; - default: - console.log('Eye-Tracking data stream in invalid state.'); - break; - } - }); - - this._eyeTrackerDataStream.dataStreams.gazePosition = true; - this._eyeTrackerDataStream.dataStreams.gazeOrigin = true; - this._eyeTrackerDataStream.dataStreams.eyePositionNormalized = true; - this._eyeTrackerDataStream.dataStreams.headPositionAndRotation = true; - this._eyeTrackerDataStream.dataStreams.userPresence = true; - this._eyeTrackerDataStream.connect(); + eventProvider: EventProvider): boolean { + + /* Create event handler that listens to eye gaze events. */ + this._eventHandler = new EventHandler(callback, {mouseEventProvider: eventProvider.mouseEventProvider, + touchEventProvider: undefined, + eyeGazeEventProvider: + eventProvider.eyeGazeEventProvider}); + + /* Listen to eye gaze events. */ + this._eventHandler.pushEyeGazeDataHandler((latests: Array, previous: Array) => + console.log(latests, previous)); + this._eventHandler.pushEyeGazeServerMessageHandler((latests: Array, + previous: Array) => console.log(latests, previous)); + this._eventHandler.pushEyeGazeConnectionStatusHandler((latests: Array, + previous: Array) => console.log(latests, previous)); + this._eventHandler.pushEyeGazeBinaryMessageParsingErrorHandler((latests: Array, + previous: Array) => console.log(latests, previous)); this._defaultFBO = new DefaultFramebuffer(context, 'DefaultFBO'); this._defaultFBO.initialize(); @@ -162,7 +156,7 @@ export class EyeTrackingRenderer extends Renderer { this._camera.far = 8.0; - this._navigation = new Navigation(callback, mouseEventProvider); + this._navigation = new Navigation(callback, eventProvider.mouseEventProvider); this._navigation.camera = this._camera; return true; @@ -194,7 +188,16 @@ export class EyeTrackingDemo extends Demo { this._canvas.element.addEventListener('click', () => { this._canvas.controller.update(); }); - this._renderer = new EyeTrackingRenderer(); + const eyeGazeDataStreams = new EyeGazeDataStreams(); + + eyeGazeDataStreams.gazePosition = true; + eyeGazeDataStreams.gazeOrigin = true; + eyeGazeDataStreams.eyePositionNormalized = true; + eyeGazeDataStreams.headPositionAndRotation = true; + eyeGazeDataStreams.userPresence = true; + + this._canvas.activateEyeGazeEventProvider(eyeGazeDataStreams); + this._renderer = new EyeTrackingRenderer(eyeGazeDataStreams); this._canvas.renderer = this._renderer; return true; diff --git a/demos/gltf-renderer/gltfrenderer.ts b/demos/gltf-renderer/gltfrenderer.ts index a4b2dcaa..a9c3d3ac 100644 --- a/demos/gltf-renderer/gltfrenderer.ts +++ b/demos/gltf-renderer/gltfrenderer.ts @@ -9,6 +9,7 @@ import { Canvas, Context, DefaultFramebuffer, + EventProvider, ForwardSceneRenderPass, Framebuffer, Geometry, @@ -17,7 +18,6 @@ import { GLTFPrimitive, Invalidate, Material, - MouseEventProvider, Navigation, Program, Renderer, @@ -86,9 +86,7 @@ export class GltfRenderer extends Renderer { * @returns - whether initialization was successful */ protected onInitialize(context: Context, callback: Invalidate, - mouseEventProvider: MouseEventProvider, - /* keyEventProvider: KeyEventProvider, */ - /* touchEventProvider: TouchEventProvider */): boolean { + eventProvider: EventProvider): boolean { const gl = this._context.gl; @@ -144,7 +142,7 @@ export class GltfRenderer extends Renderer { /* Create and configure navigation */ - this._navigation = new Navigation(callback, mouseEventProvider); + this._navigation = new Navigation(callback, eventProvider.mouseEventProvider); this._navigation.camera = this._camera; /* Create and configure forward pass. */ diff --git a/examples/canvassize-example.ts b/examples/canvassize-example.ts index 9ca055f4..9147534f 100644 --- a/examples/canvassize-example.ts +++ b/examples/canvassize-example.ts @@ -86,9 +86,7 @@ void main(void) * @returns - whether initialization was successful */ protected onInitialize(context: Context, callback: Invalidate, - /* mouseEventProvider: MouseEventProvider, */ - /* keyEventProvider: KeyEventProvider, */ - /* touchEventProvider: TouchEventProvider */): boolean { + /* eventProvider: EventProvider */): boolean { /* Create framebuffers, textures, and render buffers. */ diff --git a/examples/cube-example.ts b/examples/cube-example.ts index a6c1ee89..00fc7c77 100644 --- a/examples/cube-example.ts +++ b/examples/cube-example.ts @@ -9,8 +9,8 @@ import { Context, CuboidGeometry, DefaultFramebuffer, + EventProvider, Invalidate, - MouseEventProvider, Navigation, Program, Renderer, @@ -48,9 +48,7 @@ export class CubeRenderer extends Renderer { * @returns - whether initialization was successful */ protected onInitialize(context: Context, callback: Invalidate, - mouseEventProvider: MouseEventProvider, - /* keyEventProvider: KeyEventProvider, */ - /* touchEventProvider: TouchEventProvider */): boolean { + eventProvider: EventProvider ): boolean { this._defaultFBO = new DefaultFramebuffer(context, 'DefaultFBO'); this._defaultFBO.initialize(); @@ -109,7 +107,7 @@ export class CubeRenderer extends Renderer { this._camera.far = 8.0; - this._navigation = new Navigation(callback, mouseEventProvider); + this._navigation = new Navigation(callback, eventProvider.mouseEventProvider); this._navigation.camera = this._camera; return true; diff --git a/examples/envprojections-example.ts b/examples/envprojections-example.ts index 6108b2f0..5216f1ab 100644 --- a/examples/envprojections-example.ts +++ b/examples/envprojections-example.ts @@ -8,9 +8,9 @@ import { Canvas, Context, DefaultFramebuffer, + EventProvider, Framebuffer, Invalidate, - MouseEventProvider, Navigation, NdcFillingTriangle, Program, @@ -49,9 +49,9 @@ class EnvironmentProjectionRenderer extends Renderer { protected onInitialize(context: Context, callback: Invalidate, - mouseEventProvider: MouseEventProvider | undefined): boolean { + eventProvider: EventProvider): boolean { - if (mouseEventProvider === undefined) { + if (eventProvider.mouseEventProvider === undefined) { auxiliaries.log(auxiliaries.LogLevel.Error, 'MouseEventProvider was not supplied.'); return false; } @@ -100,7 +100,7 @@ class EnvironmentProjectionRenderer extends Renderer { this._camera.near = 0.1; this._camera.far = 4.0; - this._navigation = new Navigation(callback, mouseEventProvider!); + this._navigation = new Navigation(callback, eventProvider.mouseEventProvider!); this._navigation.camera = this._camera; gl.uniform2iv(this._uViewport, this._canvasSize); diff --git a/examples/imagebasedlighting-example.ts b/examples/imagebasedlighting-example.ts index 22abd538..704659ed 100644 --- a/examples/imagebasedlighting-example.ts +++ b/examples/imagebasedlighting-example.ts @@ -8,9 +8,9 @@ import { Canvas, Context, DefaultFramebuffer, + EventProvider, GeosphereGeometry, Invalidate, - MouseEventProvider, Navigation, Program, Renderer, @@ -57,9 +57,7 @@ export class ImageBasedLightingRenderer extends Renderer { * @returns - whether initialization was successful */ protected onInitialize(context: Context, callback: Invalidate, - mouseEventProvider: MouseEventProvider, - /* keyEventProvider: KeyEventProvider, */ - /* touchEventProvider: TouchEventProvider */): boolean { + eventProvider: EventProvider): boolean { this._promises = new Array(); @@ -180,7 +178,7 @@ export class ImageBasedLightingRenderer extends Renderer { this._camera.near = 1.0; this._camera.far = 8.0; - this._navigation = new Navigation(callback, mouseEventProvider); + this._navigation = new Navigation(callback, eventProvider.mouseEventProvider); this._navigation.camera = this._camera; return true; diff --git a/examples/labelanchor-example.ts b/examples/labelanchor-example.ts index 27c1b31f..1ed6fd7b 100644 --- a/examples/labelanchor-example.ts +++ b/examples/labelanchor-example.ts @@ -54,9 +54,7 @@ class LabelAnchorRenderer extends Renderer { * @returns - whether initialization was successful */ protected onInitialize(context: Context, callback: Invalidate, - /* mouseEventProvider: MouseEventProvider, */ - /* keyEventProvider: KeyEventProvider, */ - /* touchEventProvider: TouchEventProvider */): boolean { + /* eventProvider: EventProvider */): boolean { /* Create framebuffers, textures, and render buffers. */ diff --git a/examples/labelelide-example.ts b/examples/labelelide-example.ts index 43adc7d4..cf6ce525 100644 --- a/examples/labelelide-example.ts +++ b/examples/labelelide-example.ts @@ -53,9 +53,7 @@ class LabelElideRenderer extends Renderer { * @returns - whether initialization was successful */ protected onInitialize(context: Context, callback: Invalidate, - /* mouseEventProvider: MouseEventProvider, */ - /* keyEventProvider: KeyEventProvider, */ - /* touchEventProvider: TouchEventProvider */): boolean { + /* eventProvider: EventProvider */): boolean { /* Create framebuffers, textures, and render buffers. */ diff --git a/examples/scene-example.ts b/examples/scene-example.ts index 7e8566e8..10510800 100644 --- a/examples/scene-example.ts +++ b/examples/scene-example.ts @@ -9,13 +9,13 @@ import { Context, CuboidGeometry, DefaultFramebuffer, + EventProvider, ForwardSceneRenderPass, Framebuffer, GeometryComponent, GeosphereGeometry, Invalidate, Material, - MouseEventProvider, Navigation, Program, Renderer, @@ -67,9 +67,7 @@ export class SceneRenderer extends Renderer { * @returns - whether initialization was successful */ protected onInitialize(context: Context, callback: Invalidate, - mouseEventProvider: MouseEventProvider, - /* keyEventProvider: KeyEventProvider, */ - /* touchEventProvider: TouchEventProvider */): boolean { + eventProvider: EventProvider): boolean { const gl = this._context.gl; @@ -109,7 +107,7 @@ export class SceneRenderer extends Renderer { /* Create and configure navigation */ - this._navigation = new Navigation(callback, mouseEventProvider); + this._navigation = new Navigation(callback, eventProvider.mouseEventProvider); this._navigation.camera = this._camera; /* Create and configure forward pass. */ diff --git a/examples/shadowmap-example.ts b/examples/shadowmap-example.ts index 2744c99e..71e9b045 100644 --- a/examples/shadowmap-example.ts +++ b/examples/shadowmap-example.ts @@ -7,8 +7,8 @@ import { Context, CuboidGeometry, DefaultFramebuffer, + EventProvider, Invalidate, - MouseEventProvider, Navigation, PlaneGeometry, Program, @@ -45,9 +45,7 @@ class ShadowMapRenderer extends Renderer { protected _shadowPass: ShadowPass; protected onInitialize(context: Context, callback: Invalidate, - mouseEventProvider: MouseEventProvider, - /* keyEventProvider: KeyEventProvider, */ - /* touchEventProvider: TouchEventProvider */): boolean { + eventProvider: EventProvider): boolean { context.enable(['ANGLE_instanced_arrays', 'OES_standard_derivatives', 'WEBGL_color_buffer_float', 'OES_texture_float', 'OES_texture_float_linear']); @@ -127,7 +125,7 @@ class ShadowMapRenderer extends Renderer { this._uModelS = this._shadowProgram.uniform('u_model'); - this._navigation = new Navigation(callback, mouseEventProvider); + this._navigation = new Navigation(callback, eventProvider.mouseEventProvider); this._navigation.camera = this._camera; diff --git a/examples/shadowmap-multiframe-example.ts b/examples/shadowmap-multiframe-example.ts index 9f59b60f..56b8ef51 100644 --- a/examples/shadowmap-multiframe-example.ts +++ b/examples/shadowmap-multiframe-example.ts @@ -12,9 +12,9 @@ import { Context, CuboidGeometry, DefaultFramebuffer, + EventProvider, Framebuffer, Invalidate, - MouseEventProvider, Navigation, NdcFillingTriangle, PlaneGeometry, @@ -72,9 +72,7 @@ class ShadowMapMultiframeRenderer extends Renderer { protected onInitialize(context: Context, callback: Invalidate, - mouseEventProvider: MouseEventProvider, - /* keyEventProvider: KeyEventProvider, */ - /* touchEventProvider: TouchEventProvider */): boolean { + eventProvider: EventProvider): boolean { context.enable(['ANGLE_instanced_arrays', 'OES_standard_derivatives', 'WEBGL_color_buffer_float', 'OES_texture_float', 'OES_texture_float_linear']); @@ -162,7 +160,7 @@ class ShadowMapMultiframeRenderer extends Renderer { this._uLightPositionS = this._shadowProgram.uniform('u_lightPosition'); - this._navigation = new Navigation(callback, mouseEventProvider); + this._navigation = new Navigation(callback, eventProvider.mouseEventProvider); this._navigation.camera = this._camera; diff --git a/examples/tiled-rendering-example.ts b/examples/tiled-rendering-example.ts index 950bfbd1..6dab24eb 100644 --- a/examples/tiled-rendering-example.ts +++ b/examples/tiled-rendering-example.ts @@ -10,9 +10,9 @@ import { Context, CuboidGeometry, DefaultFramebuffer, + EventProvider, Framebuffer, Invalidate, - MouseEventProvider, Navigation, Program, Renderbuffer, @@ -65,9 +65,7 @@ export class TiledCubeRenderer extends Renderer { * @returns - whether initialization was successful */ protected onInitialize(context: Context, callback: Invalidate, - mouseEventProvider: MouseEventProvider, - /* keyEventProvider: KeyEventProvider, */ - /* touchEventProvider: TouchEventProvider */): boolean { + eventProvider: EventProvider): boolean { this._defaultFBO = new DefaultFramebuffer(context, 'DefaultFBO'); this._defaultFBO.initialize(); @@ -147,7 +145,7 @@ export class TiledCubeRenderer extends Renderer { this._intermediateFBO.clearColor(this._clearColor); - this._navigation = new Navigation(callback, mouseEventProvider); + this._navigation = new Navigation(callback, eventProvider.mouseEventProvider); this._navigation.camera = this._camera; this.createTiledCameraUtils(); diff --git a/examples/triangle-example.ts b/examples/triangle-example.ts index 0ee87d91..6b6b1e50 100644 --- a/examples/triangle-example.ts +++ b/examples/triangle-example.ts @@ -9,8 +9,8 @@ import { Canvas, Context, DefaultFramebuffer, + EventProvider, Invalidate, - MouseEventProvider, Navigation, Program, Renderer, @@ -57,9 +57,7 @@ export class TriangleRenderer extends Renderer { * @returns - whether initialization was successful */ protected onInitialize(context: Context, callback: Invalidate, - mouseEventProvider: MouseEventProvider, - /* keyEventProvider: KeyEventProvider, */ - /* touchEventProvider: TouchEventProvider */): boolean { + eventProvider: EventProvider): boolean { this._defaultFBO = new DefaultFramebuffer(context, 'DefaultFBO'); this._defaultFBO.initialize(); @@ -140,7 +138,7 @@ export class TriangleRenderer extends Renderer { this._camera.far = 4.0; - this._navigation = new Navigation(callback, mouseEventProvider); + this._navigation = new Navigation(callback, eventProvider.mouseEventProvider); this._navigation.camera = this._camera; return true; diff --git a/source/canvas.ts b/source/canvas.ts index 1fefbbdf..862df756 100644 --- a/source/canvas.ts +++ b/source/canvas.ts @@ -13,6 +13,8 @@ import { GLclampf2, GLsizei2, tuple2, tuple4 } from './tuples'; import { Color } from './color'; import { Context } from './context'; import { Controller } from './controller'; +import { EyeGazeDataStreams } from './eyegazedatastream'; +import { EyeGazeEventProvider } from './eyegazeeventprovider'; import { MouseEventProvider } from './mouseeventprovider'; import { Renderer } from './renderer'; import { Resizable } from './resizable'; @@ -114,6 +116,9 @@ export class Canvas extends Resizable { /** @see {@link touchEventProvider} */ protected _touchEventProvider: TouchEventProvider; + /** @see {@link eyeGazeEventProvider} */ + protected _eyeGazeEventProvider: EyeGazeEventProvider; + /** * Create and initialize a multi-frame controller, setup a default multi-frame number and get the canvas's webgl @@ -353,7 +358,10 @@ export class Canvas extends Resizable { * method is assigned to the pipelines invalidation event. */ this._renderer.initialize(this.context, (force) => this._controller.update(force), - this._mouseEventProvider /*, this._keyEventProvider */, this._touchEventProvider); + { + mouseEventProvider: this._mouseEventProvider, touchEventProvider: this._touchEventProvider, + eyeGazeEventProvider: this._eyeGazeEventProvider, + }); this._renderer.frameSize = this._frameSize; this._renderer.clearColor = this._clearColor.rgba; @@ -683,4 +691,18 @@ export class Canvas extends Resizable { get touchEventProvider(): TouchEventProvider { return this._touchEventProvider; } + + /** + * Eye gaze event provider referring to the canvas element. + */ + get eyeGazeEventProvider(): EyeGazeEventProvider { + return this._eyeGazeEventProvider; + } + + /** + * Activates the eye gaze event provider referring to the canvas element. + */ + public activateEyeGazeEventProvider(eyeGazeDataStreams: EyeGazeDataStreams): void { + this._eyeGazeEventProvider = new EyeGazeEventProvider(eyeGazeDataStreams, 200); + } } diff --git a/source/debug/testnavigation.ts b/source/debug/testnavigation.ts index 7faa1db3..fe959ab8 100644 --- a/source/debug/testnavigation.ts +++ b/source/debug/testnavigation.ts @@ -16,7 +16,9 @@ export class TestNavigation { constructor(invalidate: Invalidate, mouseEventProvider: MouseEventProvider) { - this._eventHandler = new EventHandler(invalidate, mouseEventProvider, undefined); + this._eventHandler = new EventHandler(invalidate, {mouseEventProvider, + touchEventProvider: undefined, + eyeGazeEventProvider: undefined}); this._eventHandler.pushMouseEnterHandler((latests: Array, previous: Array) => this.onMouseEnter(latests, previous)); this._eventHandler.pushMouseLeaveHandler((latests: Array, previous: Array) => diff --git a/source/debug/testrenderer.ts b/source/debug/testrenderer.ts index b95392b5..92e986b6 100644 --- a/source/debug/testrenderer.ts +++ b/source/debug/testrenderer.ts @@ -8,8 +8,8 @@ import { AntiAliasingKernel } from '../antialiasingkernel'; import { BlitPass } from '../blitpass'; import { Context } from '../context'; import { DefaultFramebuffer } from '../defaultframebuffer'; +import { EventProvider } from '../eventhandler'; import { Framebuffer } from '../framebuffer'; -import { MouseEventProvider } from '../mouseeventprovider'; import { NdcFillingTriangle } from '../ndcfillingtriangle'; import { Program } from '../program'; import { Renderbuffer } from '../renderbuffer'; @@ -45,9 +45,7 @@ namespace debug { protected onInitialize(context: Context, callback: Invalidate, - mouseEventProvider: MouseEventProvider, - /* keyEventProvider: KeyEventProvider, */ - /* touchEventProvider: TouchEventProvider */): boolean { + eventProvider: EventProvider): boolean { const gl = this._context.gl; const gl2facade = this._context.gl2facade; @@ -108,7 +106,7 @@ namespace debug { /* Create and configure test navigation. */ - this._testNavigation = new TestNavigation(() => this.invalidate(), mouseEventProvider); + this._testNavigation = new TestNavigation(() => this.invalidate(), eventProvider.mouseEventProvider); return true; } diff --git a/source/eventhandler.ts b/source/eventhandler.ts index 74284bdc..3cb69502 100644 --- a/source/eventhandler.ts +++ b/source/eventhandler.ts @@ -15,7 +15,11 @@ import { Invalidate } from './renderer'; import { TouchEventProvider } from './toucheventprovider'; /* spellchecker: enable */ - +export interface EventProvider { + mouseEventProvider: MouseEventProvider; + touchEventProvider?: TouchEventProvider; + eyeGazeEventProvider?: EyeGazeEventProvider; +} /** * Callback for handling mouse events, given the latest mouse events (since last update) as well as the previous. @@ -93,13 +97,11 @@ export class EventHandler { new Map>(); - constructor(invalidate: Invalidate | undefined, mouseEventProvider: MouseEventProvider | undefined, - /* keyEventProvider: KeyEventProvider | undefined,*/ touchEventProvider: TouchEventProvider | undefined, - eyeGazeEventProvider: EyeGazeEventProvider | undefined) { + constructor(invalidate: Invalidate | undefined, eventProvider: EventProvider) { this._invalidate = invalidate; - this._mouseEventProvider = mouseEventProvider; - this._touchEventProvider = touchEventProvider; - this._eyeGazeEventProvider = eyeGazeEventProvider; + this._mouseEventProvider = eventProvider.mouseEventProvider; + this._touchEventProvider = eventProvider.touchEventProvider; + this._eyeGazeEventProvider = eventProvider.eyeGazeEventProvider; } diff --git a/source/eyegazedatastream.ts b/source/eyegazedatastream.ts index 6f1870e6..83db71cd 100644 --- a/source/eyegazedatastream.ts +++ b/source/eyegazedatastream.ts @@ -1,28 +1,27 @@ -import { assert } from './auxiliaries'; import { EyeGazeData, EyeGazeEvent } from './eyegazeevent'; // tslint:disable:max-classes-per-file -export class EyeGazeDataStream extends EventTarget { +export class EyeGazeEventTarget extends EventTarget { } + +export class EyeGazeDataStream { public static readonly EYE_GAZE_DATA = 'eyegazedata'; public static readonly NEW_SERVER_MESSAGE = 'newservermessage'; public static readonly CONNECTION_STATUS = 'connectionstatus'; public static readonly BINARY_MESSAGE_PARSING_ERROR = 'binarymessageparsingerror'; + public static readonly SUCCESSFULLY_CONNECTED_TO_SERVER = 'successfully connected to server'; + public static readonly DISCONNECTED_TO_SERVER = 'disconnected to server'; + public static readonly CONNECTION_ERROR = 'connection error with server'; + protected _webSocket: WebSocket; protected readonly websocketAddress = 'ws://localhost:1234'; - protected _eyeGazeDataStreams: EyeGazeDataStreams; - - constructor(eyeGazeDataStreams: EyeGazeDataStreams) { - super(); - assert(eyeGazeDataStreams !== undefined, `expected a valid eye gaze data streams object on initialization, given ${eyeGazeDataStreams}.`); - this._eyeGazeDataStreams = eyeGazeDataStreams; - this.connect(); - } + protected _eyeGazeDataStreams: EyeGazeDataStreams = new EyeGazeDataStreams(); + protected _eyeGazeEventTarget = new EventTarget(); - private generateStreamConfigByte(): Uint8Array { + protected generateStreamConfigByte(): Uint8Array { const configByte = Uint8Array.from([0]); if (this._eyeGazeDataStreams.gazePosition) { configByte[0] = configByte[0] | 0b00000001; @@ -42,15 +41,16 @@ export class EyeGazeDataStream extends EventTarget { return configByte; } - private performHandshake(): void { + protected performHandshake(): void { this._eyeGazeDataStreams.recalculateNumberOfFloats(); const configByte = this.generateStreamConfigByte(); + console.log('sending config bytes'); this._webSocket.send(configByte); } - private parseEyeTrackingData(data: Float32Array): EyeGazeEvent { - if (data.length === this._eyeGazeDataStreams.expectedNumberOfFloats) { - return new EyeGazeEvent(EyeGazeDataStream.BINARY_MESSAGE_PARSING_ERROR); + protected parseEyeTrackingData(data: Float32Array): EyeGazeEvent { + if (data.length < this._eyeGazeDataStreams.expectedNumberOfFloats) { + return new CustomEvent(EyeGazeDataStream.BINARY_MESSAGE_PARSING_ERROR); } let currentIndexPosition = 0; const eyeGazeData = new EyeGazeData(); @@ -88,10 +88,48 @@ export class EyeGazeDataStream extends EventTarget { if (this._eyeGazeDataStreams.userPresence) { eyeGazeData.userPresence = data[currentIndexPosition] === 0.0 ? false : true; } - return new EyeGazeEvent(EyeGazeDataStream.EYE_GAZE_DATA, eyeGazeData); + return new CustomEvent(EyeGazeDataStream.EYE_GAZE_DATA, { detail: { eyeGazeData } }); + } + + protected onOpen(event: Event): void { + this.dispatchEvent(new CustomEvent(EyeGazeDataStream.CONNECTION_STATUS, { + detail: + { message: EyeGazeDataStream.SUCCESSFULLY_CONNECTED_TO_SERVER, event }, + })); + console.log('Connected to server. Performing handshake now.'); + this.performHandshake(); + } + + protected onClose(event: Event): void { + this.dispatchEvent(new CustomEvent(EyeGazeDataStream.CONNECTION_STATUS, { + detail: + { message: EyeGazeDataStream.DISCONNECTED_TO_SERVER, event }, + })); } - private connect(): void { + protected onError(event: Event): void { + this.dispatchEvent(new CustomEvent(EyeGazeDataStream.CONNECTION_STATUS, { + detail: + { message: EyeGazeDataStream.CONNECTION_ERROR, event }, + })); + } + + protected async onMessage(event: MessageEvent): Promise { + // handle stream data + if (typeof event.data !== 'string') { + const arrayBuffer = await event.data.arrayBuffer(); + const floatData = new Float32Array(arrayBuffer); + this.dispatchEvent(this.parseEyeTrackingData(floatData)); + // handle status message data + } else { + this.dispatchEvent(new CustomEvent(EyeGazeDataStream.NEW_SERVER_MESSAGE, { + detail: + { message: event.data }, + })); + } + } + + public connect(): void { this._webSocket = new WebSocket(this.websocketAddress); // Arrow functions needed in order to not loose this-context. @@ -109,34 +147,35 @@ export class EyeGazeDataStream extends EventTarget { }; } - // TODO add proper sub event types - protected onOpen(event: Event): void { - this.dispatchEvent(new EyeGazeEvent(EyeGazeDataStream.CONNECTION_STATUS, undefined, 'connected to server')); - this.performHandshake(); - } + // Mediation + addEventListener(type: string, listener: EventListenerOrEventListenerObject | null, + options?: boolean | AddEventListenerOptions): void { + this._eyeGazeEventTarget.addEventListener(type, listener, options); - protected onClose(event: Event): void { - this.dispatchEvent(new EyeGazeEvent(EyeGazeDataStream.CONNECTION_STATUS, undefined, 'disconnected to server')); } - protected onError(event: Event): void { + dispatchEvent(event: Event): boolean { + return this._eyeGazeEventTarget.dispatchEvent(event); } - protected async onMessage(event: MessageEvent): Promise { - // handle stream data - if (typeof event.data !== 'string') { - const arrayBuffer = await event.data.arrayBuffer(); - const floatData = new Float32Array(arrayBuffer); - this.dispatchEvent(this.parseEyeTrackingData(floatData)); - // handle status message data - } else { - this.dispatchEvent(new EyeGazeEvent(EyeGazeDataStream.NEW_SERVER_MESSAGE, undefined, event.data)); - } + removeEventListener(type: string, callback: EventListenerOrEventListenerObject | null, + options?: EventListenerOptions | boolean): void { + this._eyeGazeEventTarget.removeEventListener(type, callback, options); } get connectionState(): number { return this._webSocket.readyState; } + + get eyeGazeDataStreams(): EyeGazeDataStreams { + return this._eyeGazeDataStreams; + } + + set eyeGazeDataStreams(eyeGazeDataStreams: EyeGazeDataStreams) { + if (this._eyeGazeDataStreams !== eyeGazeDataStreams) { + this._eyeGazeDataStreams = eyeGazeDataStreams; + } + } } export class EyeGazeDataStreams { @@ -146,7 +185,6 @@ export class EyeGazeDataStreams { public headPositionAndRotation = false; public userPresence = false; - // The sum of floats from all activated data streams public expectedNumberOfFloats = 0; diff --git a/source/eyegazeevent.ts b/source/eyegazeevent.ts index 9af67a4d..c2d8ee56 100644 --- a/source/eyegazeevent.ts +++ b/source/eyegazeevent.ts @@ -2,41 +2,49 @@ // tslint:disable:max-classes-per-file -export class EyeGazeEvent extends Event { - eyeGazeData: EyeGazeData; - type: string; - message: string; - - constructor(type: string, eyeGazeData?: EyeGazeData, message?: string) { - super(type); - if (eyeGazeData) { - this.eyeGazeData = eyeGazeData; - } - if (message) { - this.message = message; - } - } -} +// FORMAT: +// eyeGazeEvent.detail.message? = type string +// eyeGazeEvent.detail.eyeGazeData? = type EyeGazeData +// eyeGazeEvent.detail.event? = type Event +export type EyeGazeEvent = CustomEvent; export class EyeGazeData { + // TRACK BOX: + // TODO: tobii_get_track_box Retrieves 3d coordinates of the track box frustum, + // given in millimeters from the device center. + // gaze position x and y + // the gaze position on the screen. The value is between 0 and 1. The Top Left edge is the origin. public gazePositionXY: [number, number] = [0, 0]; // gaze origin + // x, y and z coordinates as floats of the gaze origin point on the left and right + // eye of the user, as measured in millimeters from the center of the display. public gazeOriginRightXYZ: [number, number, number] = [0, 0, 0]; public gazeOriginLeftXYZ: [number, number, number] = [0, 0, 0]; // eye position normalized + // An array of three floats, for the x, y and z coordinate of the eye position on the left eye of the user, + // as a normalized value within the track box. + // right analogue. public eyePositionRightNormalizedXYZ: [number, number, number] = [0, 0, 0]; public eyePositionLeftNormalizedXYZ: [number, number, number] = [0, 0, 0]; // head position and rotation + // An array of three floats, for the x, y and z coordinate of the head of the user, as measured in + // millimeters from the center of the display. public headPositionXYZ: [number, number, number] = [0, 0, 0]; + // An array of three floats, for the x, y and z rotation of the head of the user. The rotation is + // expressed in Euler angles using right-handed rotations around each axis. The z rotation describes + // the rotation around the vector pointing towards the user. public headRotationXYZ: [number, number, number] = [0, 0, 0]; // user presence, a bool represented as a public number so that everything fits in a char array public userPresence = false; + // TODO: forgot tobii_notifications_subscribe, this is not so useful I guess(tobii_user_position_guide_subscribe) + + public toString(): string { let message = ''; message += `Gaze Position: ${this.gazePositionXY}\n`; diff --git a/source/eyegazeeventprovider.ts b/source/eyegazeeventprovider.ts index 2c323191..24f64732 100644 --- a/source/eyegazeeventprovider.ts +++ b/source/eyegazeeventprovider.ts @@ -1,4 +1,3 @@ - import { Observable, ReplaySubject } from 'rxjs'; import { assert, bitInBitfield } from './auxiliaries'; import { EyeGazeDataStream, EyeGazeDataStreams } from './eyegazedatastream'; @@ -7,8 +6,6 @@ import { EyeGazeEvent } from './eyegazeevent'; // tslint:disable:max-classes-per-file -// mache zu: Gaze event provider, siehe: mouseenevtprovider, eventhandler, rxjs -// semantic: Look up what the data mean and document it export class EyeGazeEventProvider { /** @@ -38,7 +35,9 @@ export class EyeGazeEventProvider { constructor(eyeGazeDataStreams: EyeGazeDataStreams, timeframe?: number) { assert(eyeGazeDataStreams !== undefined, `expected a valid eye gaze data streams object on initialization, given ${eyeGazeDataStreams}.`); - this._eyeGazeDataStream = new EyeGazeDataStream(eyeGazeDataStreams); + this._eyeGazeDataStream = new EyeGazeDataStream(); + this._eyeGazeDataStream.eyeGazeDataStreams = eyeGazeDataStreams; + this._eyeGazeDataStream.connect(); } /** @@ -77,8 +76,7 @@ export class EyeGazeEventProvider { } } - observable(type: EyeGazeEventProvider.Type): Observable - | Observable | Observable | undefined { + observable(type: EyeGazeEventProvider.Type): Observable | undefined { switch (type) { case EyeGazeEventProvider.Type.EyeGazeData: return this.EyeGazeData$; @@ -153,6 +151,5 @@ export namespace EyeGazeEventProvider { ConnectionStatus = 1 << 2, BinaryMessageParsingError = 1 << 3, } - } diff --git a/source/navigation.ts b/source/navigation.ts index 982fb357..04be569a 100644 --- a/source/navigation.ts +++ b/source/navigation.ts @@ -74,7 +74,9 @@ export class Navigation { this._invalidate = invalidate; /* Create event handler that listens to mouse events. */ - this._eventHandler = new EventHandler(invalidate, mouseEventProvider, undefined); + this._eventHandler = new EventHandler(invalidate, {mouseEventProvider, + touchEventProvider: undefined, + eyeGazeEventProvider: undefined}); /* Listen to mouse events. */ this._eventHandler.pushMouseDownHandler((latests: Array, previous: Array) => diff --git a/source/renderer.ts b/source/renderer.ts index 4d0fbab7..d01b3ebc 100644 --- a/source/renderer.ts +++ b/source/renderer.ts @@ -11,9 +11,8 @@ import { clamp, v2 } from './gl-matrix-extensions'; import { ChangeLookup } from './changelookup'; import { Context } from './context'; import { Controllable } from './controller'; +import { EventProvider } from './eventhandler' import { Initializable } from './initializable'; -import { MouseEventProvider } from './mouseeventprovider'; -import { TouchEventProvider } from './toucheventprovider'; import { GLclampf4, GLfloat2, GLsizei2, tuple2 } from './tuples'; import { Wizard } from './wizard'; @@ -155,9 +154,7 @@ export abstract class Renderer extends Initializable implements Controllable { * @returns - whether initialization was successful */ protected abstract onInitialize(context: Context, callback: Invalidate, - mouseEventProvider: MouseEventProvider | undefined, - /* keyEventProvider: KeyEventProvider | undefined, */ - touchEventProvider: TouchEventProvider | undefined): boolean; + eventProvider: EventProvider): boolean; /** * Actual uninitialize call specified by inheritor. @@ -208,20 +205,18 @@ export abstract class Renderer extends Initializable implements Controllable { * * @param context - Wrapped gl context for function resolution (passed to all stages). * @param callback - Functions that is invoked when the renderer (or any stage) is invalidated. - * @param mouseEventProvider - Provider for mouse events referring to the canvas element. + * @param eventProvider - Provider for mouse events referring to the canvas element. */ @Initializable.initialize() initialize(context: Context, callback: Invalidate, - mouseEventProvider: MouseEventProvider | undefined, - /* keyEventProvider: KeyEventProvider | undefined, */ - touchEventProvider: TouchEventProvider | undefined): boolean { + eventProvider: EventProvider): boolean { assert(context !== undefined, `valid webgl context required`); this._context = context; assert(callback !== undefined, `valid multi-frame update callback required`); this._invalidate = callback; - return this.onInitialize(context, callback, mouseEventProvider, touchEventProvider); + return this.onInitialize(context, callback, eventProvider); } /** diff --git a/source/webgl-operate.slim.ts b/source/webgl-operate.slim.ts index 4e064c98..56162bdd 100644 --- a/source/webgl-operate.slim.ts +++ b/source/webgl-operate.slim.ts @@ -14,7 +14,7 @@ export { ExtensionsHash } from './extensionshash'; export { ChangeLookup } from './changelookup'; export { MouseEventProvider } from './mouseeventprovider'; export { TouchEventProvider } from './toucheventprovider'; -export { EventHandler } from './eventhandler'; +export { EventHandler, EventProvider } from './eventhandler'; export { Buffer } from './buffer'; export { Color } from './color'; @@ -83,6 +83,5 @@ export import gl_matrix_extensions = root_gl_matrix_extensions; import * as root_tuples from './tuples'; export import tuples = root_tuples; -import { EyeGazeEvent } from './eyegazeevent'; /* spellchecker: enable */ From ba22827d77999f48d5ff04342af61d8913ae1348 Mon Sep 17 00:00:00 2001 From: Martin Buessemeyer Date: Sat, 29 Feb 2020 15:33:27 +0100 Subject: [PATCH 08/13] Fix type errors and test if examples / demos are still working --- demos/eye-tracking/eyetracking.ts | 4 ++-- demos/point-cloud/point-cloud.ts | 8 +++----- examples/colorscale-example.ts | 4 +--- examples/cube-progressive-example.ts | 8 +++----- examples/gouraudphong-example.ts | 8 +++----- examples/tilecamera-example.ts | 9 +++------ examples/xtoon-example.ts | 8 +++----- source/blitpass.ts | 5 +++-- source/color.ts | 2 +- source/raymath.ts | 2 +- source/tuples.ts | 6 +++--- 11 files changed, 26 insertions(+), 38 deletions(-) diff --git a/demos/eye-tracking/eyetracking.ts b/demos/eye-tracking/eyetracking.ts index d3f9ed3a..6cf9b6c4 100644 --- a/demos/eye-tracking/eyetracking.ts +++ b/demos/eye-tracking/eyetracking.ts @@ -178,7 +178,7 @@ export class EyeTrackingDemo extends Demo { private _canvas: Canvas; private _renderer: EyeTrackingRenderer; - initialize(element: HTMLCanvasElement | string): boolean { + onInitialize(element: HTMLCanvasElement | string): boolean { this._canvas = new Canvas(element); this._canvas.controller.multiFrameNumber = 1; @@ -203,7 +203,7 @@ export class EyeTrackingDemo extends Demo { return true; } - uninitialize(): void { + onUninitialize(): void { this._canvas.dispose(); (this._renderer as Renderer).uninitialize(); } diff --git a/demos/point-cloud/point-cloud.ts b/demos/point-cloud/point-cloud.ts index 2a7a9ca6..1a5cace4 100644 --- a/demos/point-cloud/point-cloud.ts +++ b/demos/point-cloud/point-cloud.ts @@ -13,8 +13,8 @@ import { Canvas, Context, DefaultFramebuffer, + EventProvider, Invalidate, - MouseEventProvider, Navigation, Program, Renderer, @@ -83,9 +83,7 @@ export class PointCloudRenderer extends Renderer { * @returns - whether initialization was successful */ protected onInitialize(context: Context, callback: Invalidate, - mouseEventProvider: MouseEventProvider, - /* keyEventProvider: KeyEventProvider, */ - /* touchEventProvider: TouchEventProvider */): boolean { + eventProvider: EventProvider): boolean { const gl = context.gl; const gl2facade = context.gl2facade; @@ -161,7 +159,7 @@ export class PointCloudRenderer extends Renderer { gl.uniform2f(this._program.uniform('u_nearFar'), this._camera.near, this._camera.far); - this._navigation = new Navigation(callback, mouseEventProvider); + this._navigation = new Navigation(callback, eventProvider.mouseEventProvider); this._navigation.camera = this._camera; this._model = mat4.fromRotationTranslationScale(mat4.create(), quat.create() diff --git a/examples/colorscale-example.ts b/examples/colorscale-example.ts index cbbecb94..01dffdc0 100644 --- a/examples/colorscale-example.ts +++ b/examples/colorscale-example.ts @@ -99,9 +99,7 @@ class ColorScaleRenderer extends Renderer { * @returns - whether initialization was successful */ protected onInitialize(context: Context, callback: Invalidate, - /* mouseEventProvider: MouseEventProvider, */ - /* keyEventProvider: KeyEventProvider, */ - /* touchEventProvider: TouchEventProvider */): boolean { + /* eventProvider: eventProvider */): boolean { const gl = context.gl; diff --git a/examples/cube-progressive-example.ts b/examples/cube-progressive-example.ts index 529fc48f..b26416fb 100644 --- a/examples/cube-progressive-example.ts +++ b/examples/cube-progressive-example.ts @@ -12,9 +12,9 @@ import { Context, CuboidGeometry, DefaultFramebuffer, + EventProvider, Framebuffer, Invalidate, - MouseEventProvider, Navigation, Program, Renderbuffer, @@ -66,9 +66,7 @@ export class ProgressiveCubeRenderer extends Renderer { * @returns - whether initialization was successful */ protected onInitialize(context: Context, callback: Invalidate, - mouseEventProvider: MouseEventProvider, - /* keyEventProvider: KeyEventProvider, */ - /* touchEventProvider: TouchEventProvider */): boolean { + eventProvider: EventProvider): boolean { const gl = context.gl; const gl2facade = this._context.gl2facade; @@ -144,7 +142,7 @@ export class ProgressiveCubeRenderer extends Renderer { this._camera.far = 8.0; - this._navigation = new Navigation(callback, mouseEventProvider); + this._navigation = new Navigation(callback, eventProvider.mouseEventProvider); this._navigation.camera = this._camera; diff --git a/examples/gouraudphong-example.ts b/examples/gouraudphong-example.ts index 65e0101e..e5e5ba17 100644 --- a/examples/gouraudphong-example.ts +++ b/examples/gouraudphong-example.ts @@ -10,6 +10,7 @@ import { Canvas, Context, DefaultFramebuffer, + EventProvider, ForwardSceneRenderPass, Framebuffer, Geometry, @@ -17,7 +18,6 @@ import { GLTFPbrMaterial, Invalidate, Material, - MouseEventProvider, Navigation, Program, Renderer, @@ -60,9 +60,7 @@ export class GouraudPhongRenderer extends Renderer { * @returns - whether initialization was successful */ protected onInitialize(context: Context, callback: Invalidate, - mouseEventProvider: MouseEventProvider, - /* keyEventProvider: KeyEventProvider, */ - /* touchEventProvider: TouchEventProvider */): boolean { + eventProvider: EventProvider): boolean { const gl = this._context.gl; @@ -98,7 +96,7 @@ export class GouraudPhongRenderer extends Renderer { /* Create and configure navigation */ - this._navigation = new Navigation(callback, mouseEventProvider); + this._navigation = new Navigation(callback, eventProvider.mouseEventProvider); this._navigation.camera = this._camera; /* Create and configure forward pass. */ diff --git a/examples/tilecamera-example.ts b/examples/tilecamera-example.ts index c9bac819..3e578209 100644 --- a/examples/tilecamera-example.ts +++ b/examples/tilecamera-example.ts @@ -13,9 +13,9 @@ import { Context, CuboidGeometry, DefaultFramebuffer, + EventProvider, Framebuffer, Invalidate, - MouseEventProvider, Navigation, Program, Renderbuffer, @@ -70,9 +70,7 @@ export class TileCameraRenderer extends Renderer { * @returns - whether initialization was successful */ protected onInitialize(context: Context, callback: Invalidate, - mouseEventProvider: MouseEventProvider, - /* keyEventProvider: KeyEventProvider, */ - /* touchEventProvider: TouchEventProvider */): boolean { + eventProvider: EventProvider): boolean { this.showSpinner(); @@ -161,8 +159,7 @@ export class TileCameraRenderer extends Renderer { this._camera.viewport = this._targetSize; - - this._navigation = new Navigation(callback, mouseEventProvider); + this._navigation = new Navigation(callback, eventProvider.mouseEventProvider); this._navigation.camera = this._camera; diff --git a/examples/xtoon-example.ts b/examples/xtoon-example.ts index 096fe61c..76ffa39f 100644 --- a/examples/xtoon-example.ts +++ b/examples/xtoon-example.ts @@ -9,6 +9,7 @@ import { Canvas, Context, DefaultFramebuffer, + EventProvider, ForwardSceneRenderPass, Framebuffer, Geometry, @@ -16,7 +17,6 @@ import { GLTFPbrMaterial, Invalidate, Material, - MouseEventProvider, Navigation, Program, Renderer, @@ -59,9 +59,7 @@ export class XToonRenderer extends Renderer { * @returns - whether initialization was successful */ protected onInitialize(context: Context, callback: Invalidate, - mouseEventProvider: MouseEventProvider, - /* keyEventProvider: KeyEventProvider, */ - /* touchEventProvider: TouchEventProvider */): boolean { + eventProvider: EventProvider): boolean { const gl = this._context.gl; @@ -112,7 +110,7 @@ export class XToonRenderer extends Renderer { /* Create and configure navigation */ - this._navigation = new Navigation(callback, mouseEventProvider); + this._navigation = new Navigation(callback, eventProvider.mouseEventProvider); this._navigation.camera = this._camera; /* Create and configure forward pass. */ diff --git a/source/blitpass.ts b/source/blitpass.ts index 63a280cd..55b7e411 100644 --- a/source/blitpass.ts +++ b/source/blitpass.ts @@ -149,8 +149,9 @@ export class BlitPass extends Initializable { assert(this._ndcTriangle && this._ndcTriangle.initialized, `expected an initialized ndc triangle`); const gl = this._context.gl; - const srcBounds = this._srcBounds ? this._srcBounds : [0, 0, this._framebuffer.width, this._framebuffer.height]; - const dstBounds = this._dstBounds ? this._dstBounds : [0, 0, this._target.width, this._target.height]; + const srcBounds: vec4 = this._srcBounds ? this._srcBounds : + [0, 0, this._framebuffer.width, this._framebuffer.height]; + const dstBounds: vec4 = this._dstBounds ? this._dstBounds : [0, 0, this._target.width, this._target.height]; const srcBoundsNormalized: vec4 = vec4.div(v4(), srcBounds, [this._framebuffer.width, this._framebuffer.height, this._framebuffer.width, this._framebuffer.height]); diff --git a/source/color.ts b/source/color.ts index 5db76d02..720ca566 100644 --- a/source/color.ts +++ b/source/color.ts @@ -337,7 +337,7 @@ export class Color { /* tslint:disable-next-line:switch-default */ switch (space) { case Color.Space.CMYK: - vec4.lerp(result, x.cmyk, y.cmyka, a); + vec4.lerp(result, x.cmyk, y.cmyk, a); const alpha = mix(x.a, y.a, a); return new Color().fromCMYK(result[0], result[1], result[2], result[3], alpha); diff --git a/source/raymath.ts b/source/raymath.ts index ed329d39..db359104 100644 --- a/source/raymath.ts +++ b/source/raymath.ts @@ -128,7 +128,7 @@ namespace ray_math { * @returns - If ray intersects, the intersection point on the plane if the plane was hit. */ export function rayPlaneIntersection(ray0: vec3, ray1: vec3 - , origin: vec3 | number[] = [0.0, 0.0, 0.0], normal: vec3 | number[] = [0.0, 1.0, 0.0]): vec3 | undefined { + , origin: vec3 = [0.0, 0.0, 0.0], normal: vec3 = [0.0, 1.0, 0.0]): vec3 | undefined { const ray_direction = vec3.normalize(v3(), vec3.subtract(v3(), ray1, ray0)); diff --git a/source/tuples.ts b/source/tuples.ts index ef82612c..56d54279 100644 --- a/source/tuples.ts +++ b/source/tuples.ts @@ -68,7 +68,7 @@ namespace tuples { * @param buffer - Array of two float32 values. * @returns - 2-tuple of specified type (GLsizei, GLfloat, or GLclampf). */ - export function tuple2(buffer: Float32Array): [T, T] { + export function tuple2(buffer: vec2): [T, T] { assert(buffer.length === 2, `expected length of buffer to be 2, given ${buffer.length}`); return [buffer[0] as T, buffer[1] as T]; } @@ -78,7 +78,7 @@ namespace tuples { * @param buffer - Array of three float32 values. * @returns - 3-tuple of specified type (GLsizei, GLfloat, or GLclampf). */ - export function tuple3(buffer: Float32Array): [T, T, T] { + export function tuple3(buffer: vec3): [T, T, T] { assert(buffer.length === 3, `expected length of buffer to be 3, given ${buffer.length}`); return [buffer[0] as T, buffer[1] as T, buffer[2] as T]; } @@ -88,7 +88,7 @@ namespace tuples { * @param buffer - Array of four float32 values. * @returns - 4-tuple of specified type (GLsizei, GLfloat, or GLclampf). */ - export function tuple4(buffer: Float32Array): [T, T, T, T] { + export function tuple4(buffer: vec4): [T, T, T, T] { assert(buffer.length === 4, `expected length of buffer to be 4, given ${buffer.length}`); return [buffer[0] as T, buffer[1] as T, buffer[2] as T, buffer[3] as T]; } From c806e82a3c9bab506179f0d1d46935cd8b82ebbf Mon Sep 17 00:00:00 2001 From: Philipp Otto Date: Mon, 2 Mar 2020 10:21:48 +0100 Subject: [PATCH 09/13] Fix type errors for vec3/vec4 --- source/blitpass.ts | 5 +++-- source/raymath.ts | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/source/blitpass.ts b/source/blitpass.ts index 55b7e411..51d90750 100644 --- a/source/blitpass.ts +++ b/source/blitpass.ts @@ -150,8 +150,9 @@ export class BlitPass extends Initializable { const gl = this._context.gl; const srcBounds: vec4 = this._srcBounds ? this._srcBounds : - [0, 0, this._framebuffer.width, this._framebuffer.height]; - const dstBounds: vec4 = this._dstBounds ? this._dstBounds : [0, 0, this._target.width, this._target.height]; + vec4.fromValues(0, 0, this._framebuffer.width, this._framebuffer.height); + const dstBounds: vec4 = this._dstBounds ? this._dstBounds : + vec4.fromValues(0, 0, this._target.width, this._target.height); const srcBoundsNormalized: vec4 = vec4.div(v4(), srcBounds, [this._framebuffer.width, this._framebuffer.height, this._framebuffer.width, this._framebuffer.height]); diff --git a/source/raymath.ts b/source/raymath.ts index db359104..5b1cfc5a 100644 --- a/source/raymath.ts +++ b/source/raymath.ts @@ -127,8 +127,9 @@ namespace ray_math { * @param normal - Normal of the plane with origin [ 0, 0, 0 ]. * @returns - If ray intersects, the intersection point on the plane if the plane was hit. */ - export function rayPlaneIntersection(ray0: vec3, ray1: vec3 - , origin: vec3 = [0.0, 0.0, 0.0], normal: vec3 = [0.0, 1.0, 0.0]): vec3 | undefined { + export function rayPlaneIntersection(ray0: vec3, ray1: vec3, + origin: vec3 = vec3.fromValues(0.0, 0.0, 0.0), + normal: vec3 = vec3.fromValues(0.0, 1.0, 0.0)): vec3 | undefined { const ray_direction = vec3.normalize(v3(), vec3.subtract(v3(), ray1, ray0)); From 363cce78e13fe924d2b8360c790a1363183d68ca Mon Sep 17 00:00:00 2001 From: Philipp Otto Date: Mon, 2 Mar 2020 10:36:49 +0100 Subject: [PATCH 10/13] Fix copy paste error in EventHandler --- demos/eye-tracking/eyetracking.ts | 10 ++++++---- source/eventhandler.ts | 6 +++--- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/demos/eye-tracking/eyetracking.ts b/demos/eye-tracking/eyetracking.ts index 6cf9b6c4..8904f2e3 100644 --- a/demos/eye-tracking/eyetracking.ts +++ b/demos/eye-tracking/eyetracking.ts @@ -101,10 +101,12 @@ export class EyeTrackingRenderer extends Renderer { eventProvider: EventProvider): boolean { /* Create event handler that listens to eye gaze events. */ - this._eventHandler = new EventHandler(callback, {mouseEventProvider: eventProvider.mouseEventProvider, - touchEventProvider: undefined, - eyeGazeEventProvider: - eventProvider.eyeGazeEventProvider}); + this._eventHandler = new EventHandler(callback, { + mouseEventProvider: eventProvider.mouseEventProvider, + touchEventProvider: undefined, + eyeGazeEventProvider: + eventProvider.eyeGazeEventProvider + }); /* Listen to eye gaze events. */ this._eventHandler.pushEyeGazeDataHandler((latests: Array, previous: Array) => diff --git a/source/eventhandler.ts b/source/eventhandler.ts index 3cb69502..0460529b 100644 --- a/source/eventhandler.ts +++ b/source/eventhandler.ts @@ -473,7 +473,7 @@ export class EventHandler { * @param handler - Handler to be called on update. */ pushEyeGazeServerMessageHandler(handler: EyeGazeEventHandler): void { - this.pushEyeGazeEventHandler(EyeGazeEventProvider.Type.EyeGazeData, handler); + this.pushEyeGazeEventHandler(EyeGazeEventProvider.Type.NewServerMessage, handler); } /** @@ -482,7 +482,7 @@ export class EventHandler { * @param handler - Handler to be called on update. */ pushEyeGazeConnectionStatusHandler(handler: EyeGazeEventHandler): void { - this.pushEyeGazeEventHandler(EyeGazeEventProvider.Type.EyeGazeData, handler); + this.pushEyeGazeEventHandler(EyeGazeEventProvider.Type.ConnectionStatus, handler); } /** @@ -491,7 +491,7 @@ export class EventHandler { * @param handler - Handler to be called on update. */ pushEyeGazeBinaryMessageParsingErrorHandler(handler: EyeGazeEventHandler): void { - this.pushEyeGazeEventHandler(EyeGazeEventProvider.Type.EyeGazeData, handler); + this.pushEyeGazeEventHandler(EyeGazeEventProvider.Type.BinaryMessageParsingError, handler); } From 18737a260f935764e4a0cff78db79fd76358d458 Mon Sep 17 00:00:00 2001 From: Martin Buessemeyer Date: Mon, 2 Mar 2020 22:09:34 +0100 Subject: [PATCH 11/13] Implement feedback --- demos/demos.json | 2 +- source/canvas.ts | 4 ++-- source/eyegazedatastream.ts | 7 +++---- source/eyegazeevent.ts | 7 +------ source/eyegazeeventprovider.ts | 4 ++-- 5 files changed, 9 insertions(+), 15 deletions(-) diff --git a/demos/demos.json b/demos/demos.json index 07d64b8b..48a8a935 100644 --- a/demos/demos.json +++ b/demos/demos.json @@ -105,6 +105,6 @@ "cgcostume" ], "caption": "Simple demo showing eye tracking.", - "disabled": false + "disabled": true } ] diff --git a/source/canvas.ts b/source/canvas.ts index 862df756..f32cec12 100644 --- a/source/canvas.ts +++ b/source/canvas.ts @@ -702,7 +702,7 @@ export class Canvas extends Resizable { /** * Activates the eye gaze event provider referring to the canvas element. */ - public activateEyeGazeEventProvider(eyeGazeDataStreams: EyeGazeDataStreams): void { - this._eyeGazeEventProvider = new EyeGazeEventProvider(eyeGazeDataStreams, 200); + public activateEyeGazeEventProvider(eyeGazeDataStreams: EyeGazeDataStreams, serverAddress?: string): void { + this._eyeGazeEventProvider = new EyeGazeEventProvider(eyeGazeDataStreams, 200, serverAddress); } } diff --git a/source/eyegazedatastream.ts b/source/eyegazedatastream.ts index 83db71cd..225f9617 100644 --- a/source/eyegazedatastream.ts +++ b/source/eyegazedatastream.ts @@ -44,7 +44,6 @@ export class EyeGazeDataStream { protected performHandshake(): void { this._eyeGazeDataStreams.recalculateNumberOfFloats(); const configByte = this.generateStreamConfigByte(); - console.log('sending config bytes'); this._webSocket.send(configByte); } @@ -96,7 +95,6 @@ export class EyeGazeDataStream { detail: { message: EyeGazeDataStream.SUCCESSFULLY_CONNECTED_TO_SERVER, event }, })); - console.log('Connected to server. Performing handshake now.'); this.performHandshake(); } @@ -129,8 +127,9 @@ export class EyeGazeDataStream { } } - public connect(): void { - this._webSocket = new WebSocket(this.websocketAddress); + public connect(serverAddress?: string): void { + serverAddress = serverAddress ? serverAddress : this.websocketAddress; + this._webSocket = new WebSocket(serverAddress); // Arrow functions needed in order to not loose this-context. this._webSocket.onopen = (event: Event) => { diff --git a/source/eyegazeevent.ts b/source/eyegazeevent.ts index c2d8ee56..cac01316 100644 --- a/source/eyegazeevent.ts +++ b/source/eyegazeevent.ts @@ -1,5 +1,3 @@ - - // tslint:disable:max-classes-per-file // FORMAT: @@ -10,7 +8,7 @@ export type EyeGazeEvent = CustomEvent; export class EyeGazeData { // TRACK BOX: - // TODO: tobii_get_track_box Retrieves 3d coordinates of the track box frustum, + // 3d coordinates of the track box frustum, // given in millimeters from the device center. // gaze position x and y @@ -42,9 +40,6 @@ export class EyeGazeData { // user presence, a bool represented as a public number so that everything fits in a char array public userPresence = false; - // TODO: forgot tobii_notifications_subscribe, this is not so useful I guess(tobii_user_position_guide_subscribe) - - public toString(): string { let message = ''; message += `Gaze Position: ${this.gazePositionXY}\n`; diff --git a/source/eyegazeeventprovider.ts b/source/eyegazeeventprovider.ts index 24f64732..602dc25b 100644 --- a/source/eyegazeeventprovider.ts +++ b/source/eyegazeeventprovider.ts @@ -33,11 +33,11 @@ export class EyeGazeEventProvider { protected _eyeGazeDataStream: EyeGazeDataStream; - constructor(eyeGazeDataStreams: EyeGazeDataStreams, timeframe?: number) { + constructor(eyeGazeDataStreams: EyeGazeDataStreams, timeframe?: number, serverAddress?: string) { assert(eyeGazeDataStreams !== undefined, `expected a valid eye gaze data streams object on initialization, given ${eyeGazeDataStreams}.`); this._eyeGazeDataStream = new EyeGazeDataStream(); this._eyeGazeDataStream.eyeGazeDataStreams = eyeGazeDataStreams; - this._eyeGazeDataStream.connect(); + this._eyeGazeDataStream.connect(serverAddress); } /** From b1792d518b42f4f944b5d8d47ece752254cd0898 Mon Sep 17 00:00:00 2001 From: Philipp Otto Date: Wed, 4 Mar 2020 13:10:34 +0100 Subject: [PATCH 12/13] Undo changes to tuple interface --- source/tuples.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/tuples.ts b/source/tuples.ts index 56d54279..1021bda4 100644 --- a/source/tuples.ts +++ b/source/tuples.ts @@ -68,7 +68,7 @@ namespace tuples { * @param buffer - Array of two float32 values. * @returns - 2-tuple of specified type (GLsizei, GLfloat, or GLclampf). */ - export function tuple2(buffer: vec2): [T, T] { + export function tuple2(buffer: Float32Array | vec2): [T, T] { assert(buffer.length === 2, `expected length of buffer to be 2, given ${buffer.length}`); return [buffer[0] as T, buffer[1] as T]; } @@ -78,7 +78,7 @@ namespace tuples { * @param buffer - Array of three float32 values. * @returns - 3-tuple of specified type (GLsizei, GLfloat, or GLclampf). */ - export function tuple3(buffer: vec3): [T, T, T] { + export function tuple3(buffer: Float32Array | vec3): [T, T, T] { assert(buffer.length === 3, `expected length of buffer to be 3, given ${buffer.length}`); return [buffer[0] as T, buffer[1] as T, buffer[2] as T]; } @@ -88,7 +88,7 @@ namespace tuples { * @param buffer - Array of four float32 values. * @returns - 4-tuple of specified type (GLsizei, GLfloat, or GLclampf). */ - export function tuple4(buffer: vec4): [T, T, T, T] { + export function tuple4(buffer: Float32Array | vec4): [T, T, T, T] { assert(buffer.length === 4, `expected length of buffer to be 4, given ${buffer.length}`); return [buffer[0] as T, buffer[1] as T, buffer[2] as T, buffer[3] as T]; } From 7dc508319f3bb360133a5b673f77720b6b79332d Mon Sep 17 00:00:00 2001 From: Philipp Otto Date: Wed, 4 Mar 2020 13:29:19 +0100 Subject: [PATCH 13/13] Make serverAddress non-optional parameter, remove unused timeframe variable --- demos/eye-tracking/eyetracking.ts | 4 +++- source/canvas.ts | 4 ++-- source/eyegazedatastream.ts | 4 +--- source/eyegazeeventprovider.ts | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/demos/eye-tracking/eyetracking.ts b/demos/eye-tracking/eyetracking.ts index 8904f2e3..3f62d9d1 100644 --- a/demos/eye-tracking/eyetracking.ts +++ b/demos/eye-tracking/eyetracking.ts @@ -177,6 +177,8 @@ export class EyeTrackingRenderer extends Renderer { export class EyeTrackingDemo extends Demo { + static readonly serverAddress = 'ws://localhost:1234'; + private _canvas: Canvas; private _renderer: EyeTrackingRenderer; @@ -198,7 +200,7 @@ export class EyeTrackingDemo extends Demo { eyeGazeDataStreams.headPositionAndRotation = true; eyeGazeDataStreams.userPresence = true; - this._canvas.activateEyeGazeEventProvider(eyeGazeDataStreams); + this._canvas.activateEyeGazeEventProvider(eyeGazeDataStreams, EyeTrackingDemo.serverAddress); this._renderer = new EyeTrackingRenderer(eyeGazeDataStreams); this._canvas.renderer = this._renderer; diff --git a/source/canvas.ts b/source/canvas.ts index 51ddc227..178ad1c8 100644 --- a/source/canvas.ts +++ b/source/canvas.ts @@ -703,7 +703,7 @@ export class Canvas extends Resizable { /** * Activates the eye gaze event provider referring to the canvas element. */ - public activateEyeGazeEventProvider(eyeGazeDataStreams: EyeGazeDataStreams, serverAddress?: string): void { - this._eyeGazeEventProvider = new EyeGazeEventProvider(eyeGazeDataStreams, 200, serverAddress); + public activateEyeGazeEventProvider(eyeGazeDataStreams: EyeGazeDataStreams, serverAddress: string): void { + this._eyeGazeEventProvider = new EyeGazeEventProvider(eyeGazeDataStreams, serverAddress); } } diff --git a/source/eyegazedatastream.ts b/source/eyegazedatastream.ts index 225f9617..b30fdbf4 100644 --- a/source/eyegazedatastream.ts +++ b/source/eyegazedatastream.ts @@ -16,7 +16,6 @@ export class EyeGazeDataStream { public static readonly CONNECTION_ERROR = 'connection error with server'; protected _webSocket: WebSocket; - protected readonly websocketAddress = 'ws://localhost:1234'; protected _eyeGazeDataStreams: EyeGazeDataStreams = new EyeGazeDataStreams(); protected _eyeGazeEventTarget = new EventTarget(); @@ -127,8 +126,7 @@ export class EyeGazeDataStream { } } - public connect(serverAddress?: string): void { - serverAddress = serverAddress ? serverAddress : this.websocketAddress; + public connect(serverAddress: string): void { this._webSocket = new WebSocket(serverAddress); // Arrow functions needed in order to not loose this-context. diff --git a/source/eyegazeeventprovider.ts b/source/eyegazeeventprovider.ts index 602dc25b..5441aced 100644 --- a/source/eyegazeeventprovider.ts +++ b/source/eyegazeeventprovider.ts @@ -33,7 +33,7 @@ export class EyeGazeEventProvider { protected _eyeGazeDataStream: EyeGazeDataStream; - constructor(eyeGazeDataStreams: EyeGazeDataStreams, timeframe?: number, serverAddress?: string) { + constructor(eyeGazeDataStreams: EyeGazeDataStreams, serverAddress: string) { assert(eyeGazeDataStreams !== undefined, `expected a valid eye gaze data streams object on initialization, given ${eyeGazeDataStreams}.`); this._eyeGazeDataStream = new EyeGazeDataStream(); this._eyeGazeDataStream.eyeGazeDataStreams = eyeGazeDataStreams;