@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.
- package/CHANGELOG.md +91 -34
- package/README.md +2 -2
- package/lib/additional.d.ts +2 -1
- package/lib/additional.js +1 -2
- package/lib/camera-source-map.d.ts +10 -0
- package/lib/camera-source-map.js +32 -0
- package/lib/camera-source.d.ts +2 -5
- package/lib/camera-source.js +18 -32
- package/lib/cameramodel.js +18 -23
- package/lib/compatibility.js +2 -4
- package/lib/deserializer.js +1 -5
- package/lib/direct.js +12 -16
- package/lib/drawcamera.js +27 -31
- package/lib/drawface.js +5 -9
- package/lib/drawfaceproject.js +5 -9
- package/lib/drawplane.js +6 -11
- package/lib/event.js +5 -13
- package/lib/facelandmark.d.ts +1 -2
- package/lib/facelandmark.js +11 -18
- package/lib/facelandmarkdata.js +1 -4
- package/lib/facelandmarkinterface.js +1 -2
- package/lib/facemesh.js +10 -17
- package/lib/gen/zappar-client.js +11 -25
- package/lib/gen/zappar-cwrap.js +38 -33
- package/lib/gen/zappar-native.d.ts +11 -1
- package/lib/gen/zappar-native.js +20 -11
- package/lib/gen/zappar-server.js +6 -14
- package/lib/gen/zappar.d.ts +12 -0
- package/lib/gen/zappar.js +5 -11
- package/lib/gfx.d.ts +1 -0
- package/lib/gfx.js +1 -0
- package/lib/gl-state-manager.d.ts +9 -0
- package/lib/gl-state-manager.js +31 -0
- package/lib/html-element-source.d.ts +3 -20
- package/lib/html-element-source.js +39 -287
- package/lib/image-process-gl.d.ts +37 -0
- package/lib/image-process-gl.js +306 -0
- package/lib/imagebitmap-camera-source.d.ts +36 -0
- package/lib/imagebitmap-camera-source.js +273 -0
- package/lib/imagetracker.d.ts +28 -0
- package/lib/imagetracker.js +115 -0
- package/lib/index-standalone.d.ts +3 -0
- package/lib/index-standalone.js +5 -0
- package/lib/index.d.ts +2 -1
- package/lib/index.js +6 -27
- package/lib/landmarkdatagenerate.js +25 -30
- package/lib/loglevel.js +9 -16
- package/lib/messages.js +4 -8
- package/lib/mstp-camera-source.d.ts +29 -0
- package/lib/mstp-camera-source.js +226 -0
- package/lib/native.d.ts +2 -1
- package/lib/native.js +229 -130
- package/lib/options.d.ts +3 -0
- package/lib/options.js +1 -0
- package/lib/permission.js +13 -27
- package/lib/pipeline.d.ts +14 -5
- package/lib/pipeline.js +125 -61
- package/lib/profile.d.ts +2 -0
- package/lib/profile.js +59 -53
- package/lib/riff-reader.d.ts +18 -0
- package/lib/riff-reader.js +52 -0
- package/lib/sequencerecorder.d.ts +1 -0
- package/lib/sequencerecorder.js +17 -11
- package/lib/sequencesource.d.ts +7 -1
- package/lib/sequencesource.js +102 -64
- package/lib/serializer.js +1 -5
- package/lib/shader.js +2 -7
- package/lib/source.d.ts +6 -4
- package/lib/source.js +1 -5
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -4
- package/lib/worker-client.d.ts +1 -1
- package/lib/worker-client.js +9 -26
- package/lib/worker-imagebitmap.d.ts +5 -0
- package/lib/worker-imagebitmap.js +59 -0
- package/lib/worker-server.d.ts +0 -5
- package/lib/worker-server.js +133 -41
- package/lib/worker.js +6 -10
- package/lib/workerinterface.d.ts +47 -1
- package/lib/workerinterface.js +1 -2
- package/lib/zcv.js +117 -135
- package/lib/zcv.wasm +0 -0
- package/package.json +33 -32
- package/umd/169.zappar-cv.js +1 -0
- package/umd/{482727c0e7dd40d73f5aae47f238ad61.zbin → 482727c0e7dd40d73f5a.zbin} +0 -0
- package/umd/6a8309f88f836a752c68.wasm +0 -0
- package/umd/752.zappar-cv.js +1 -0
- package/umd/{b4f46e148a3b3b5aef90717d8d60e3fc.zbin → b4f46e148a3b3b5aef90.zbin} +0 -0
- package/umd/{f7b62a3a53b5c9b3222ba8dc53cb8b11.zbin → f7b62a3a53b5c9b3222b.zbin} +0 -0
- package/umd/zappar-cv.js +1 -9
- package/umd/zappar-cv.worker.js +1 -1
- package/lib/bundleworker-mainthread.d.ts +0 -2
- package/lib/bundleworker-mainthread.js +0 -36
- package/lib/bundleworker-worker.d.ts +0 -6
- package/lib/bundleworker-worker.js +0 -34
- package/lib/zcv-slam.js +0 -16
- package/lib/zcv-slam.wasm +0 -0
- package/umd/1ec038c18c27f4adf35917a8175401f0.wasm +0 -0
- package/umd/9c0b0dcf514b48c05541.bundleworker.js +0 -1
- package/umd/d115e485cffe500afc4f7c1272ea8f62.wasm +0 -0
package/lib/sequencerecorder.js
CHANGED
|
@@ -1,20 +1,18 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
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
|
|
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
|
-
|
|
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;
|
package/lib/sequencesource.d.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
}
|
package/lib/sequencesource.js
CHANGED
|
@@ -1,24 +1,25 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
30
|
+
this._decoder = new SequenceDecoder(data);
|
|
30
31
|
this._packetNumber = 0;
|
|
32
|
+
this._lastUpdateTime = 0;
|
|
31
33
|
}
|
|
32
34
|
catch (err) {
|
|
33
|
-
|
|
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 =
|
|
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
|
-
|
|
56
|
+
let curTime = performance.now();
|
|
57
|
+
if (curTime < this._lastUpdateTime + this._minFrameGapMs)
|
|
43
58
|
return;
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
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
|
-
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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):
|
|
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
package/lib/version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const VERSION = "0.
|
|
1
|
+
export declare const VERSION = "2.0.0-beta.0";
|
package/lib/version.js
CHANGED
package/lib/worker-client.d.ts
CHANGED
package/lib/worker-client.js
CHANGED
|
@@ -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
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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
|
-
|
|
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:
|
|
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 =
|
|
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
|
-
|
|
27
|
+
messageManager.onOutgoingMessage.bind(sendOutgoing);
|
|
44
28
|
sendOutgoing();
|
|
45
29
|
worker.addEventListener("message", evt => {
|
|
46
|
-
|
|
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
|
+
}
|
package/lib/worker-server.d.ts
CHANGED