@zappar/zappar-cv 0.4.0-beta.4 → 2.0.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. package/CHANGELOG.md +91 -34
  2. package/README.md +2 -2
  3. package/lib/additional.d.ts +2 -1
  4. package/lib/additional.js +1 -2
  5. package/lib/camera-source-map.d.ts +10 -0
  6. package/lib/camera-source-map.js +32 -0
  7. package/lib/camera-source.d.ts +2 -5
  8. package/lib/camera-source.js +18 -32
  9. package/lib/cameramodel.js +18 -23
  10. package/lib/compatibility.js +2 -4
  11. package/lib/deserializer.js +1 -5
  12. package/lib/direct.js +12 -16
  13. package/lib/drawcamera.js +27 -31
  14. package/lib/drawface.js +5 -9
  15. package/lib/drawfaceproject.js +5 -9
  16. package/lib/drawplane.js +6 -11
  17. package/lib/event.js +5 -13
  18. package/lib/facelandmark.d.ts +1 -2
  19. package/lib/facelandmark.js +11 -18
  20. package/lib/facelandmarkdata.js +1 -4
  21. package/lib/facelandmarkinterface.js +1 -2
  22. package/lib/facemesh.js +10 -17
  23. package/lib/gen/zappar-client.js +11 -25
  24. package/lib/gen/zappar-cwrap.js +38 -33
  25. package/lib/gen/zappar-native.d.ts +11 -1
  26. package/lib/gen/zappar-native.js +20 -11
  27. package/lib/gen/zappar-server.js +6 -14
  28. package/lib/gen/zappar.d.ts +12 -0
  29. package/lib/gen/zappar.js +5 -11
  30. package/lib/gfx.d.ts +1 -0
  31. package/lib/gfx.js +1 -0
  32. package/lib/gl-state-manager.d.ts +9 -0
  33. package/lib/gl-state-manager.js +31 -0
  34. package/lib/html-element-source.d.ts +3 -20
  35. package/lib/html-element-source.js +39 -287
  36. package/lib/image-process-gl.d.ts +37 -0
  37. package/lib/image-process-gl.js +306 -0
  38. package/lib/imagebitmap-camera-source.d.ts +36 -0
  39. package/lib/imagebitmap-camera-source.js +273 -0
  40. package/lib/imagetracker.d.ts +28 -0
  41. package/lib/imagetracker.js +115 -0
  42. package/lib/index-standalone.d.ts +3 -0
  43. package/lib/index-standalone.js +5 -0
  44. package/lib/index.d.ts +2 -1
  45. package/lib/index.js +6 -27
  46. package/lib/landmarkdatagenerate.js +25 -30
  47. package/lib/loglevel.js +9 -16
  48. package/lib/messages.js +4 -8
  49. package/lib/mstp-camera-source.d.ts +29 -0
  50. package/lib/mstp-camera-source.js +226 -0
  51. package/lib/native.d.ts +2 -1
  52. package/lib/native.js +229 -130
  53. package/lib/options.d.ts +3 -0
  54. package/lib/options.js +1 -0
  55. package/lib/permission.js +13 -27
  56. package/lib/pipeline.d.ts +14 -5
  57. package/lib/pipeline.js +125 -61
  58. package/lib/profile.d.ts +2 -0
  59. package/lib/profile.js +59 -53
  60. package/lib/riff-reader.d.ts +18 -0
  61. package/lib/riff-reader.js +52 -0
  62. package/lib/sequencerecorder.d.ts +1 -0
  63. package/lib/sequencerecorder.js +17 -11
  64. package/lib/sequencesource.d.ts +7 -1
  65. package/lib/sequencesource.js +102 -64
  66. package/lib/serializer.js +1 -5
  67. package/lib/shader.js +2 -7
  68. package/lib/source.d.ts +6 -4
  69. package/lib/source.js +1 -5
  70. package/lib/version.d.ts +1 -1
  71. package/lib/version.js +1 -4
  72. package/lib/worker-client.d.ts +1 -1
  73. package/lib/worker-client.js +9 -26
  74. package/lib/worker-imagebitmap.d.ts +5 -0
  75. package/lib/worker-imagebitmap.js +59 -0
  76. package/lib/worker-server.d.ts +0 -5
  77. package/lib/worker-server.js +133 -41
  78. package/lib/worker.js +6 -10
  79. package/lib/workerinterface.d.ts +47 -1
  80. package/lib/workerinterface.js +1 -2
  81. package/lib/zcv.js +117 -135
  82. package/lib/zcv.wasm +0 -0
  83. package/package.json +33 -32
  84. package/umd/169.zappar-cv.js +1 -0
  85. package/umd/{482727c0e7dd40d73f5aae47f238ad61.zbin → 482727c0e7dd40d73f5a.zbin} +0 -0
  86. package/umd/6a8309f88f836a752c68.wasm +0 -0
  87. package/umd/752.zappar-cv.js +1 -0
  88. package/umd/{b4f46e148a3b3b5aef90717d8d60e3fc.zbin → b4f46e148a3b3b5aef90.zbin} +0 -0
  89. package/umd/{f7b62a3a53b5c9b3222ba8dc53cb8b11.zbin → f7b62a3a53b5c9b3222b.zbin} +0 -0
  90. package/umd/zappar-cv.js +1 -9
  91. package/umd/zappar-cv.worker.js +1 -1
  92. package/lib/bundleworker-mainthread.d.ts +0 -2
  93. package/lib/bundleworker-mainthread.js +0 -36
  94. package/lib/bundleworker-worker.d.ts +0 -6
  95. package/lib/bundleworker-worker.js +0 -34
  96. package/lib/zcv-slam.js +0 -16
  97. package/lib/zcv-slam.wasm +0 -0
  98. package/umd/1ec038c18c27f4adf35917a8175401f0.wasm +0 -0
  99. package/umd/9c0b0dcf514b48c05541.bundleworker.js +0 -1
  100. package/umd/d115e485cffe500afc4f7c1272ea8f62.wasm +0 -0
@@ -1,20 +1,18 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SequenceDecoder = exports.SequenceRecorder = exports.SequenceRecorderPacketType = void 0;
4
- const loglevel_1 = require("./loglevel");
5
- var SequenceRecorderPacketType;
1
+ import { zcerr } from "./loglevel";
2
+ export var SequenceRecorderPacketType;
6
3
  (function (SequenceRecorderPacketType) {
7
4
  SequenceRecorderPacketType[SequenceRecorderPacketType["CAMERA_FRAME"] = 0] = "CAMERA_FRAME";
8
5
  SequenceRecorderPacketType[SequenceRecorderPacketType["ACCELEROMETER"] = 1] = "ACCELEROMETER";
9
6
  SequenceRecorderPacketType[SequenceRecorderPacketType["ROTATION_RATE"] = 2] = "ROTATION_RATE";
10
7
  SequenceRecorderPacketType[SequenceRecorderPacketType["ATTITUDE"] = 3] = "ATTITUDE";
11
8
  SequenceRecorderPacketType[SequenceRecorderPacketType["ATTITUDE_MATRIX"] = 4] = "ATTITUDE_MATRIX";
12
- })(SequenceRecorderPacketType = exports.SequenceRecorderPacketType || (exports.SequenceRecorderPacketType = {}));
13
- class SequenceRecorder {
9
+ })(SequenceRecorderPacketType || (SequenceRecorderPacketType = {}));
10
+ export class SequenceRecorder {
14
11
  constructor(estimatedFrames) {
15
12
  this._insertionByte = 0;
16
13
  this._numberPackets = 0;
17
14
  this._started = false;
15
+ this._hasLoggedUnsuppored = false;
18
16
  this._data = new ArrayBuffer(this._estimatedSize(estimatedFrames, 320, 240));
19
17
  this._dataView = new DataView(this._data);
20
18
  this._dataUint8 = new Uint8Array(this._data);
@@ -38,6 +36,9 @@ class SequenceRecorder {
38
36
  this._started = false;
39
37
  let trimmed = this._data.slice(0, this._insertionByte);
40
38
  this._data = trimmed;
39
+ this._dataUint8 = new Uint8Array(this._data);
40
+ this._dataFloat32 = new Float32Array(this._data);
41
+ this._dataView = new DataView(this._data);
41
42
  }
42
43
  data() {
43
44
  return this._dataUint8;
@@ -45,8 +46,15 @@ class SequenceRecorder {
45
46
  appendCameraFrame(c) {
46
47
  if (!this._started)
47
48
  return;
49
+ if (!c.data) {
50
+ if (this._hasLoggedUnsuppored)
51
+ return;
52
+ this._hasLoggedUnsuppored = true;
53
+ zcerr("Unable to record frames from this camera source");
54
+ return;
55
+ }
48
56
  if (c.data.byteLength !== (c.dataWidth * c.dataHeight)) {
49
- loglevel_1.zcerr("Unable to record frame to sequence: greyscale array doesn't match dimensions");
57
+ zcerr("Unable to record frame to sequence: greyscale array doesn't match dimensions");
50
58
  return;
51
59
  }
52
60
  let increment = SequenceRecorder.psbPacketType + SequenceRecorder.cameraPacketSizeBytes + (c.dataWidth * c.dataHeight);
@@ -120,7 +128,6 @@ class SequenceRecorder {
120
128
  }
121
129
  }
122
130
  }
123
- exports.SequenceRecorder = SequenceRecorder;
124
131
  // Header (8 bytes): "UAR1" + number of frames (uint32)
125
132
  SequenceRecorder.headerSizeBytes = 8;
126
133
  // Per-frame packet byte sizes
@@ -144,7 +151,7 @@ SequenceRecorder.rotationRatePacketSizeBytes = 4 * 4; // t, x, y, z
144
151
  SequenceRecorder.attitudePacketSizeBytes = 4 * 4; // t, x, y, z
145
152
  // Attitude matrix
146
153
  SequenceRecorder.attitudeMatrixPacketSizeBytes = 4 * 16;
147
- class SequenceDecoder {
154
+ export class SequenceDecoder {
148
155
  constructor(_data) {
149
156
  this._data = _data;
150
157
  this.dataByPacket = new Map();
@@ -269,4 +276,3 @@ class SequenceDecoder {
269
276
  }
270
277
  }
271
278
  }
272
- exports.SequenceDecoder = SequenceDecoder;
@@ -4,14 +4,20 @@ export declare class SequenceSource extends Source {
4
4
  private _impl;
5
5
  private _pipeline;
6
6
  private _packetNumber;
7
+ private _motionUpdatesQueued;
8
+ private _motionUpdatesSent;
7
9
  private _decoder;
10
+ private _minFrameGapMs;
11
+ private _lastUpdateTime;
8
12
  static create(p: zappar_pipeline_t): zappar_sequence_source_t;
9
13
  static get(m: zappar_sequence_source_t): SequenceSource | undefined;
10
14
  constructor(_impl: zappar_sequence_source_t, _pipeline: zappar_pipeline_t);
11
15
  loadFromMemory(data: ArrayBuffer): void;
12
- getFrame(currentlyProcessing: boolean): CameraFrameInfo | undefined;
16
+ maxPlaybackFpsSet(fps: number): void;
17
+ getFrame(currentlyProcessing: boolean): void;
13
18
  destroy(): void;
14
19
  start(): void;
15
20
  pause(): void;
16
21
  uploadGL(info: CameraFrameInfo): void;
22
+ private _submitMotionUpdates;
17
23
  }
@@ -1,24 +1,25 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SequenceSource = void 0;
4
- const loglevel_1 = require("./loglevel");
5
- const sequencerecorder_1 = require("./sequencerecorder");
6
- const source_1 = require("./source");
7
- const pipeline_1 = require("./pipeline");
8
- const gl_matrix_1 = require("gl-matrix");
1
+ import { zcerr, zcout } from "./loglevel";
2
+ import { SequenceDecoder, SequenceRecorderPacketType } from "./sequencerecorder";
3
+ import { Source } from "./source";
4
+ import { Pipeline } from "./pipeline";
5
+ import { mat4 } from "gl-matrix";
9
6
  let latest = 1;
10
7
  let byId = new Map();
11
- class SequenceSource extends source_1.Source {
8
+ export class SequenceSource extends Source {
12
9
  constructor(_impl, _pipeline) {
13
10
  super();
14
11
  this._impl = _impl;
15
12
  this._pipeline = _pipeline;
16
13
  this._packetNumber = 0;
14
+ this._motionUpdatesQueued = 0;
15
+ this._motionUpdatesSent = 0;
16
+ this._minFrameGapMs = 0;
17
+ this._lastUpdateTime = 0;
17
18
  }
18
19
  static create(p) {
19
20
  let ret = (latest++);
20
21
  byId.set(ret, new SequenceSource(ret, p));
21
- loglevel_1.zcout("sequence_source_source_t initialized");
22
+ zcout("sequence_source_source_t initialized");
22
23
  return ret;
23
24
  }
24
25
  static get(m) {
@@ -26,68 +27,70 @@ class SequenceSource extends source_1.Source {
26
27
  }
27
28
  loadFromMemory(data) {
28
29
  try {
29
- this._decoder = new sequencerecorder_1.SequenceDecoder(data);
30
+ this._decoder = new SequenceDecoder(data);
30
31
  this._packetNumber = 0;
32
+ this._lastUpdateTime = 0;
31
33
  }
32
34
  catch (err) {
33
- loglevel_1.zcerr("Unable to decode sequence:", err);
35
+ zcerr("Unable to decode sequence:", err);
34
36
  }
35
37
  }
38
+ maxPlaybackFpsSet(fps) {
39
+ if (fps <= 0) {
40
+ this._minFrameGapMs = 0;
41
+ return;
42
+ }
43
+ this._minFrameGapMs = 1000.0 / fps;
44
+ }
36
45
  getFrame(currentlyProcessing) {
37
- let pipeline = pipeline_1.Pipeline.get(this._pipeline);
46
+ let pipeline = Pipeline.get(this._pipeline);
38
47
  if (!pipeline)
39
48
  return;
49
+ if (!this._decoder)
50
+ return;
51
+ this._submitMotionUpdates(pipeline);
52
+ if (this._motionUpdatesQueued > this._motionUpdatesSent)
53
+ return;
40
54
  if (currentlyProcessing)
41
55
  return;
42
- if (!this._decoder)
56
+ let curTime = performance.now();
57
+ if (curTime < this._lastUpdateTime + this._minFrameGapMs)
43
58
  return;
44
- while (this._packetNumber < this._decoder.numberPackets) {
45
- let packet = this._decoder.dataByPacket.get(this._packetNumber);
46
- this._packetNumber++;
47
- if (!packet)
48
- return;
49
- switch (packet.type) {
50
- case sequencerecorder_1.SequenceRecorderPacketType.ACCELEROMETER:
51
- pipeline.motionAccelerometerSubmit(packet.t, packet.x, packet.y, packet.z);
52
- break;
53
- case sequencerecorder_1.SequenceRecorderPacketType.ROTATION_RATE:
54
- pipeline.motionRotationRateSubmit(packet.t, packet.x, packet.y, packet.z);
55
- break;
56
- case sequencerecorder_1.SequenceRecorderPacketType.ATTITUDE:
57
- pipeline.motionAttitudeSubmit(packet.t, packet.x, packet.y, packet.z);
58
- break;
59
- case sequencerecorder_1.SequenceRecorderPacketType.ATTITUDE_MATRIX:
60
- pipeline.motionAttitudeMatrix(packet.attitude);
61
- break;
62
- case sequencerecorder_1.SequenceRecorderPacketType.CAMERA_FRAME:
63
- {
64
- let pixels = pipeline.cameraPixelArrays.pop();
65
- while (pixels) {
66
- if (pixels.byteLength === packet.greyscale.byteLength)
67
- break;
68
- pixels = pipeline.cameraPixelArrays.pop();
69
- }
70
- if (!pixels) {
71
- pixels = new ArrayBuffer(packet.greyscale.byteLength);
72
- }
73
- (new Uint8Array(pixels)).set(packet.greyscale);
74
- return {
75
- data: pixels,
76
- cameraSourceData: packet.greyscale,
77
- cameraModel: packet.cameraModel,
78
- cameraToDevice: packet.cameraToDevice,
79
- dataWidth: packet.width,
80
- dataHeight: packet.height,
81
- texture: undefined,
82
- userFacing: packet.userFacing,
83
- uvTransform: gl_matrix_1.mat4.create(),
84
- cameraSource: this
85
- };
86
- break;
87
- }
88
- }
59
+ if (this._packetNumber >= this._decoder.numberPackets)
60
+ return;
61
+ let packet = this._decoder.dataByPacket.get(this._packetNumber);
62
+ if (packet.type != SequenceRecorderPacketType.CAMERA_FRAME)
63
+ return;
64
+ this._packetNumber++;
65
+ let pixels = pipeline.cameraPixelArrays.pop();
66
+ while (pixels) {
67
+ if (pixels.byteLength === packet.greyscale.byteLength)
68
+ break;
69
+ pixels = pipeline.cameraPixelArrays.pop();
70
+ }
71
+ if (!pixels) {
72
+ pixels = new ArrayBuffer(packet.greyscale.byteLength);
89
73
  }
90
- return undefined;
74
+ (new Uint8Array(pixels)).set(packet.greyscale);
75
+ this._lastUpdateTime = curTime;
76
+ let info = {
77
+ data: pixels,
78
+ cameraSourceData: packet.greyscale,
79
+ cameraModel: packet.cameraModel,
80
+ cameraToDevice: packet.cameraToDevice,
81
+ dataWidth: packet.width,
82
+ dataHeight: packet.height,
83
+ texture: undefined,
84
+ userFacing: packet.userFacing,
85
+ uvTransform: mat4.create(),
86
+ cameraSource: this
87
+ };
88
+ // We can queue the motion updates for the follwing frame immediately
89
+ // as this camera frame will be sent immediately, but the next motion
90
+ // updates will be one frame later
91
+ this._submitMotionUpdates(pipeline);
92
+ const token = pipeline.registerToken(info);
93
+ pipeline.sendDataToWorker(info.data || new ArrayBuffer(0), token, info.dataWidth, info.dataHeight, info.userFacing, info.cameraToDevice, info.cameraModel);
91
94
  }
92
95
  destroy() {
93
96
  byId.delete(this._impl);
@@ -95,19 +98,19 @@ class SequenceSource extends source_1.Source {
95
98
  }
96
99
  start() {
97
100
  var _a;
98
- let p = pipeline_1.Pipeline.get(this._pipeline);
101
+ let p = Pipeline.get(this._pipeline);
99
102
  if (p && p.currentCameraSource !== this) {
100
103
  (_a = p.currentCameraSource) === null || _a === void 0 ? void 0 : _a.pause();
101
104
  p.currentCameraSource = this;
102
105
  }
103
106
  }
104
107
  pause() {
105
- let p = pipeline_1.Pipeline.get(this._pipeline);
108
+ let p = Pipeline.get(this._pipeline);
106
109
  if (p && p.currentCameraSource === this)
107
110
  p.currentCameraSource = undefined;
108
111
  }
109
112
  uploadGL(info) {
110
- let pipeline = pipeline_1.Pipeline.get(this._pipeline);
113
+ let pipeline = Pipeline.get(this._pipeline);
111
114
  if (!pipeline)
112
115
  return;
113
116
  let gl = pipeline === null || pipeline === void 0 ? void 0 : pipeline.glContext;
@@ -124,5 +127,40 @@ class SequenceSource extends source_1.Source {
124
127
  gl.texImage2D(gl.TEXTURE_2D, 0, gl.LUMINANCE, info.dataWidth, info.dataHeight, 0, gl.LUMINANCE, gl.UNSIGNED_BYTE, new Uint8Array(info.cameraSourceData));
125
128
  gl.bindTexture(gl.TEXTURE_2D, null);
126
129
  }
130
+ _submitMotionUpdates(pipeline) {
131
+ let pendingMotionUpdate = false;
132
+ while (this._packetNumber < this._decoder.numberPackets) {
133
+ let packet = this._decoder.dataByPacket.get(this._packetNumber);
134
+ if (packet.type == SequenceRecorderPacketType.CAMERA_FRAME)
135
+ break;
136
+ switch (packet.type) {
137
+ case SequenceRecorderPacketType.ACCELEROMETER:
138
+ pipeline.motionAccelerometerSubmit(packet.t, packet.x, packet.y, packet.z);
139
+ pendingMotionUpdate = true;
140
+ break;
141
+ case SequenceRecorderPacketType.ROTATION_RATE:
142
+ pipeline.motionRotationRateSubmit(packet.t, packet.x, packet.y, packet.z);
143
+ pendingMotionUpdate = true;
144
+ break;
145
+ case SequenceRecorderPacketType.ATTITUDE:
146
+ pipeline.motionAttitudeSubmit(packet.t, packet.x, packet.y, packet.z);
147
+ pendingMotionUpdate = true;
148
+ break;
149
+ case SequenceRecorderPacketType.ATTITUDE_MATRIX:
150
+ pipeline.motionAttitudeMatrix(packet.attitude);
151
+ pendingMotionUpdate = true;
152
+ break;
153
+ }
154
+ this._packetNumber++;
155
+ }
156
+ // If we've submitted motion updates, add a setTimeout to reflect when
157
+ // the message serializer will actually have sent them over to the worker
158
+ if (pendingMotionUpdate) {
159
+ this._motionUpdatesQueued++;
160
+ setTimeout(() => {
161
+ this._motionUpdatesSent++;
162
+ }, 0);
163
+ }
164
+ return;
165
+ }
127
166
  }
128
- exports.SequenceSource = SequenceSource;
package/lib/serializer.js CHANGED
@@ -1,7 +1,4 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.MessageSerializer = void 0;
4
- class MessageSerializer {
1
+ export class MessageSerializer {
5
2
  constructor(_messageSender) {
6
3
  this._messageSender = _messageSender;
7
4
  this._freeBufferPool = [];
@@ -229,4 +226,3 @@ class MessageSerializer {
229
226
  this._offset++;
230
227
  }
231
228
  }
232
- exports.MessageSerializer = MessageSerializer;
package/lib/shader.js CHANGED
@@ -1,7 +1,4 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.linkProgram = exports.compileShader = void 0;
4
- function compileShader(gl, type, src) {
1
+ export function compileShader(gl, type, src) {
5
2
  let ret = gl.createShader(type);
6
3
  if (!ret)
7
4
  throw new Error("Unable to create shader");
@@ -12,11 +9,9 @@ function compileShader(gl, type, src) {
12
9
  throw new Error("Shader compile error: " + msg);
13
10
  return ret;
14
11
  }
15
- exports.compileShader = compileShader;
16
- function linkProgram(gl, prog) {
12
+ export function linkProgram(gl, prog) {
17
13
  gl.linkProgram(prog);
18
14
  let msg = gl.getProgramInfoLog(prog);
19
15
  if (msg && msg.trim().length > 0)
20
16
  throw new Error("Unable to link: " + msg);
21
17
  }
22
- exports.linkProgram = linkProgram;
package/lib/source.d.ts CHANGED
@@ -1,17 +1,19 @@
1
+ /// <reference types="dom-webcodecs" />
1
2
  export interface CameraFrameInfo {
2
- data: ArrayBuffer;
3
+ data?: ArrayBuffer;
3
4
  texture: WebGLTexture | undefined;
4
5
  dataWidth: number;
5
6
  dataHeight: number;
6
7
  cameraModel: Float32Array;
7
8
  cameraToDevice: Float32Array;
8
- uvTransform: Float32Array;
9
- userFacing: boolean;
10
9
  cameraSource: Source;
11
10
  cameraSourceData?: any;
11
+ uvTransform?: Float32Array;
12
+ userFacing: boolean;
13
+ frame?: VideoFrame | ImageBitmap;
12
14
  }
13
15
  export declare abstract class Source {
14
- abstract getFrame(currentlyProcessing: boolean): CameraFrameInfo | undefined;
16
+ abstract getFrame(currentlyProcessing: boolean): void;
15
17
  abstract pause(): void;
16
18
  abstract uploadGL(info: CameraFrameInfo): void;
17
19
  }
package/lib/source.js CHANGED
@@ -1,6 +1,2 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Source = void 0;
4
- class Source {
1
+ export class Source {
5
2
  }
6
- exports.Source = Source;
package/lib/version.d.ts CHANGED
@@ -1 +1 @@
1
- export declare const VERSION = "0.4.0-beta.4";
1
+ export declare const VERSION = "2.0.0-beta.0";
package/lib/version.js CHANGED
@@ -1,4 +1 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.VERSION = void 0;
4
- exports.VERSION = "0.4.0-beta.4";
1
+ export const VERSION = "2.0.0-beta.0";
@@ -1,3 +1,3 @@
1
1
  import { MsgManager } from "./messages";
2
2
  export declare let messageManager: MsgManager;
3
- export declare function launchWorker(): Promise<void>;
3
+ export declare function launchWorker(worker?: Worker): Promise<void>;
@@ -1,4 +1,3 @@
1
- "use strict";
2
1
  var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
2
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
3
  return new (P || (P = Promise))(function (resolve, reject) {
@@ -8,46 +7,30 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
8
7
  step((generator = generator.apply(thisArg, _arguments || [])).next());
9
8
  });
10
9
  };
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.launchWorker = exports.messageManager = void 0;
13
- const bundleworker_mainthread_1 = require("./bundleworker-mainthread");
14
- const messages_1 = require("./messages");
15
- exports.messageManager = new messages_1.MsgManager();
16
- let Worker;
17
- if (typeof Z_STANDALONE !== 'undefined' && Z_STANDALONE) {
18
- Worker = require('worker-loader?inline=fallback!./worker');
19
- }
20
- else {
21
- Worker = require('worker-loader!./worker');
22
- }
23
- if (Worker.default)
24
- Worker = Worker.default;
25
- function launchWorker() {
10
+ import { MsgManager } from "./messages";
11
+ export let messageManager = new MsgManager();
12
+ export function launchWorker(worker) {
26
13
  return __awaiter(this, void 0, void 0, function* () {
27
- let worker = new Worker();
14
+ if (!worker)
15
+ worker = new Worker(new URL("./worker", import.meta.url), { type: 'module' });
28
16
  worker.postMessage({
29
17
  t: "wasm",
30
- url: require("./zcv.wasm").default
18
+ url: new URL("./zcv.wasm", import.meta.url).toString()
31
19
  });
32
- worker.postMessage({
33
- t: "port",
34
- port: bundleworker_mainthread_1.bundleWorkerMessageChannel.port1
35
- }, [bundleworker_mainthread_1.bundleWorkerMessageChannel.port1]);
36
20
  yield waitForLoad(worker);
37
21
  function sendOutgoing() {
38
- let msgs = exports.messageManager.getOutgoingMessages();
22
+ let msgs = messageManager.getOutgoingMessages();
39
23
  for (let msg of msgs) {
40
24
  worker.postMessage(msg.msg, msg.transferables);
41
25
  }
42
26
  }
43
- exports.messageManager.onOutgoingMessage.bind(sendOutgoing);
27
+ messageManager.onOutgoingMessage.bind(sendOutgoing);
44
28
  sendOutgoing();
45
29
  worker.addEventListener("message", evt => {
46
- exports.messageManager.postIncomingMessage(evt.data);
30
+ messageManager.postIncomingMessage(evt.data);
47
31
  });
48
32
  });
49
33
  }
50
- exports.launchWorker = launchWorker;
51
34
  function waitForLoad(w) {
52
35
  return new Promise(resolve => {
53
36
  let listener = (msg) => {
@@ -0,0 +1,5 @@
1
+ import { zappar_cwrap } from "./gen/zappar-native";
2
+ import { zappar_server } from "./gen/zappar-server";
3
+ import { MsgManager } from "./messages";
4
+ import { ImageBitmapC2S } from "./workerinterface";
5
+ export declare function handleImageBitmap(m: ImageBitmapC2S, r: zappar_cwrap, server: zappar_server, mgr: MsgManager): void;
@@ -0,0 +1,59 @@
1
+ import { ImageProcessGL } from "./image-process-gl";
2
+ import { profile } from "./profile";
3
+ import { mat4 } from "gl-matrix";
4
+ let pixels;
5
+ let texture;
6
+ let _imageProcessor;
7
+ let _gl;
8
+ function getImageProcessor() {
9
+ if (!_imageProcessor || !_gl) {
10
+ const canvas = new OffscreenCanvas(1, 1);
11
+ _gl = canvas.getContext("webgl");
12
+ if (!_gl)
13
+ throw new Error("Unable to get offscreen GL context");
14
+ _imageProcessor = new ImageProcessGL(_gl);
15
+ }
16
+ return [_imageProcessor, _gl];
17
+ }
18
+ export function handleImageBitmap(m, r, server, mgr) {
19
+ // img: ImageBitmap,
20
+ // rot: number,
21
+ // tokenId: number,
22
+ // r: zappar_cwrap,
23
+ // p: zappar_pipeline_t,
24
+ // userFacing: boolean,
25
+ // server: zappar_server,
26
+ // mgr: MsgManager) {
27
+ const [imageProcessor, gl] = getImageProcessor();
28
+ if (!texture) {
29
+ texture = gl.createTexture();
30
+ gl.bindTexture(gl.TEXTURE_2D, texture);
31
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
32
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
33
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
34
+ }
35
+ if (!texture)
36
+ return;
37
+ if (!pixels || pixels.byteLength < profile.dataWidth * profile.dataHeight) {
38
+ console.log("Generating pixel buffer", profile.dataWidth * profile.dataHeight);
39
+ pixels = new ArrayBuffer(profile.dataWidth * profile.dataHeight);
40
+ }
41
+ imageProcessor.uploadFrame(texture, m.i, m.r, m.userFacing);
42
+ let info = imageProcessor.readFrame(texture, pixels);
43
+ let msg = {
44
+ t: "imageBitmapS2C",
45
+ dataWidth: info.dataWidth,
46
+ dataHeight: info.dataHeight,
47
+ frame: m.i,
48
+ userFacing: info.userFacing,
49
+ uvTransform: info.uvTransform || mat4.create(),
50
+ tokenId: m.tokenId, p: m.p
51
+ };
52
+ mgr.postOutgoingMessage(msg, [m.i]);
53
+ let pipeline = server._pipeline_by_instance.get(m.p);
54
+ if (pipeline) {
55
+ r.pipeline_camera_frame_submit(pipeline, pixels, info.dataWidth, info.dataHeight, m.tokenId, m.cameraToDevice, m.cameraModel, info.userFacing);
56
+ r.pipeline_frame_update(pipeline);
57
+ server.exploreState();
58
+ }
59
+ }
@@ -1,8 +1,3 @@
1
1
  import { MsgManager } from "./messages";
2
2
  export declare let messageManager: MsgManager;
3
- declare global {
4
- interface Window {
5
- bundle_adjust_message: any;
6
- }
7
- }
8
3
  export declare function launchWorkerServer(wasmUrl: string): Promise<void>;