@myzonerocks/gosslens 0.9.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.
@@ -0,0 +1,426 @@
1
+ // The web face tracker: the tracking module compiled to wasm, run inside a
2
+ // Worker so inference never touches the main thread. The module speaks
3
+ // wasi for its clock and random imports; the tiny shim below covers
4
+ // exactly what it reaches for, no filesystem, no sockets. Frames go in as
5
+ // RGBA pixels, the frozen result struct comes back parsed.
6
+ export const GOSS_FACE_LANDMARK_COUNT = 478;
7
+ export const GOSS_FACE_BLENDSHAPE_COUNT = 52;
8
+ /** The wasi surface the module actually imports: a monotonic clock for
9
+ * profiling counters, randomness for hashing seeds, and exit/write stubs
10
+ * the standard library references but this module never drives. */
11
+ function wasiImports(getMemory) {
12
+ return {
13
+ clock_time_get: (_clock, _precision, outPtr) => {
14
+ const now = BigInt(Math.round(performance.now() * 1e6));
15
+ new DataView(getMemory().buffer).setBigUint64(outPtr, now, true);
16
+ return 0;
17
+ },
18
+ random_get: (ptr, len) => {
19
+ const bytes = new Uint8Array(getMemory().buffer, ptr, len);
20
+ crypto.getRandomValues(bytes);
21
+ return 0;
22
+ },
23
+ fd_write: (fd, iovs, iovsLen, writtenPtr) => {
24
+ // Consume every byte or the writer retries forever; log lines
25
+ // surface on the console where they help.
26
+ const view = new DataView(getMemory().buffer);
27
+ let total = 0;
28
+ let text = "";
29
+ for (let at = 0; at < iovsLen; at += 1) {
30
+ const ptr = view.getUint32(iovs + at * 8, true);
31
+ const len = view.getUint32(iovs + at * 8 + 4, true);
32
+ total += len;
33
+ if (len > 0 && fd <= 2) {
34
+ text += new TextDecoder().decode(new Uint8Array(getMemory().buffer, ptr, Math.min(len, 4096)));
35
+ }
36
+ }
37
+ if (text.trim().length > 0)
38
+ console.log(`tracking module: ${text.trim()}`);
39
+ view.setUint32(writtenPtr, total, true);
40
+ return 0;
41
+ },
42
+ fd_close: () => 0,
43
+ fd_seek: () => 0,
44
+ fd_fdstat_get: () => 8,
45
+ proc_exit: (code) => {
46
+ throw new Error(`tracking module exited ${code}`);
47
+ },
48
+ environ_sizes_get: (countPtr, sizePtr) => {
49
+ const view = new DataView(getMemory().buffer);
50
+ view.setUint32(countPtr, 0, true);
51
+ view.setUint32(sizePtr, 0, true);
52
+ return 0;
53
+ },
54
+ environ_get: () => 0,
55
+ args_sizes_get: (countPtr, sizePtr) => {
56
+ const view = new DataView(getMemory().buffer);
57
+ view.setUint32(countPtr, 0, true);
58
+ view.setUint32(sizePtr, 0, true);
59
+ return 0;
60
+ },
61
+ args_get: () => 0,
62
+ };
63
+ }
64
+ /// Anything else the module's startup declares but never drives answers
65
+ /// with the not-supported code, so instantiation is total without hiding
66
+ /// a call that matters.
67
+ function totalWasi(getMemory) {
68
+ const implemented = wasiImports(getMemory);
69
+ return new Proxy(implemented, {
70
+ get(target, property) {
71
+ return target[property] ?? (() => 52);
72
+ },
73
+ });
74
+ }
75
+ /// Parses the frozen goss_face_result layout out of module memory at ptr:
76
+ /// frameSerial u64, timestampUs i64, presence f32, landmarkCount u32, then
77
+ /// the landmark and blendshape floats. Pure over the buffer so it is testable
78
+ /// without the wasm module.
79
+ export function parseFaceResult(buffer, ptr) {
80
+ const view = new DataView(buffer, ptr);
81
+ const floats = new Float32Array(buffer, ptr + 24, GOSS_FACE_LANDMARK_COUNT * 3 + GOSS_FACE_BLENDSHAPE_COUNT);
82
+ return {
83
+ frameSerial: view.getBigUint64(0, true),
84
+ timestampUs: view.getBigInt64(8, true),
85
+ presence: view.getFloat32(16, true),
86
+ landmarkCount: view.getUint32(20, true),
87
+ landmarks: floats.slice(0, GOSS_FACE_LANDMARK_COUNT * 3),
88
+ blendshapes: floats.slice(GOSS_FACE_LANDMARK_COUNT * 3),
89
+ };
90
+ }
91
+ export class GossFaceTracker {
92
+ exports;
93
+ instance;
94
+ resultPtr;
95
+ framePtr;
96
+ frameCapacity;
97
+ constructor(exports, instance, resultPtr, framePtr, frameCapacity) {
98
+ this.exports = exports;
99
+ this.instance = instance;
100
+ this.resultPtr = resultPtr;
101
+ this.framePtr = framePtr;
102
+ this.frameCapacity = frameCapacity;
103
+ }
104
+ /** Instantiates the module and stands the engines up from the task
105
+ * bundle bytes. Call inside a Worker: creation parses three models and
106
+ * takes real time, and process runs inference synchronously. */
107
+ /** Optional stage reporting for hosts that want startup visibility. */
108
+ static onStage = null;
109
+ static async create(moduleBytes, taskBundle) {
110
+ let memory;
111
+ GossFaceTracker.onStage?.("instantiating");
112
+ const { instance } = await WebAssembly.instantiate(moduleBytes, {
113
+ wasi_snapshot_preview1: totalWasi(() => memory),
114
+ });
115
+ GossFaceTracker.onStage?.("instantiated");
116
+ const exports = instance.exports;
117
+ memory = exports.memory;
118
+ GossFaceTracker.onStage?.("engines starting");
119
+ const taskPtr = exports.goss_tracking_alloc(taskBundle.length);
120
+ if (taskPtr === 0)
121
+ throw new Error("tracking module allocation failed");
122
+ new Uint8Array(exports.memory.buffer, taskPtr, taskBundle.length).set(taskBundle);
123
+ GossFaceTracker.onStage?.("bundle staged");
124
+ const handle = exports.goss_tracking_create(taskPtr, taskBundle.length);
125
+ GossFaceTracker.onStage?.("engines returned");
126
+ exports.goss_tracking_free(taskPtr, taskBundle.length);
127
+ if (handle === 0)
128
+ throw new Error("tracking bundle rejected");
129
+ const resultPtr = exports.goss_tracking_alloc(exports.goss_tracking_result_size());
130
+ if (resultPtr === 0)
131
+ throw new Error("tracking module allocation failed");
132
+ return new GossFaceTracker(exports, handle, resultPtr, 0, 0);
133
+ }
134
+ /** Runs the pipeline over one RGBA frame; returns the parsed result, or
135
+ * null while nothing has been published yet. */
136
+ process(rgba, width, height, timestampUs) {
137
+ const needed = width * height * 4;
138
+ if (rgba.length < needed)
139
+ throw new Error("frame shorter than its dimensions");
140
+ if (this.frameCapacity < needed) {
141
+ if (this.framePtr !== 0)
142
+ this.exports.goss_tracking_free(this.framePtr, this.frameCapacity);
143
+ this.framePtr = this.exports.goss_tracking_alloc(needed);
144
+ if (this.framePtr === 0)
145
+ throw new Error("tracking module allocation failed");
146
+ this.frameCapacity = needed;
147
+ }
148
+ new Uint8Array(this.exports.memory.buffer, this.framePtr, needed).set(rgba.subarray(0, needed));
149
+ if (this.exports.goss_tracking_process(this.instance, this.framePtr, width, height, timestampUs) !== 0) {
150
+ throw new Error("tracking process refused the frame");
151
+ }
152
+ return this.latest();
153
+ }
154
+ /** The newest published result, parsed out of the frozen layout. */
155
+ latest() {
156
+ if (this.exports.goss_tracking_result(this.instance, this.resultPtr) !== 0)
157
+ return null;
158
+ return parseFaceResult(this.exports.memory.buffer, this.resultPtr);
159
+ }
160
+ destroy() {
161
+ this.exports.goss_tracking_destroy(this.instance);
162
+ if (this.framePtr !== 0)
163
+ this.exports.goss_tracking_free(this.framePtr, this.frameCapacity);
164
+ this.exports.goss_tracking_free(this.resultPtr, this.exports.goss_tracking_result_size());
165
+ }
166
+ }
167
+ export const GOSS_SEGMENTATION_MASK_SIDE = 256;
168
+ /// The web segmenter: the same wasm module's segmentation core, run in a
169
+ /// Worker. A single .tflite model in, a mask_side x mask_side subject mask
170
+ /// out. Feed the mask to a session with setSegmentationMask.
171
+ export class GossSegmenter {
172
+ exports;
173
+ core;
174
+ maskPtr;
175
+ maskSide;
176
+ framePtr;
177
+ frameCapacity;
178
+ constructor(exports, core, maskPtr, maskSide, framePtr, frameCapacity) {
179
+ this.exports = exports;
180
+ this.core = core;
181
+ this.maskPtr = maskPtr;
182
+ this.maskSide = maskSide;
183
+ this.framePtr = framePtr;
184
+ this.frameCapacity = frameCapacity;
185
+ }
186
+ static async create(moduleBytes, modelBytes) {
187
+ let memory;
188
+ const { instance } = await WebAssembly.instantiate(moduleBytes, {
189
+ wasi_snapshot_preview1: totalWasi(() => memory),
190
+ });
191
+ const exports = instance.exports;
192
+ memory = exports.memory;
193
+ const modelPtr = exports.goss_tracking_alloc(modelBytes.length);
194
+ if (modelPtr === 0)
195
+ throw new Error("segmentation module allocation failed");
196
+ new Uint8Array(exports.memory.buffer, modelPtr, modelBytes.length).set(modelBytes);
197
+ const core = exports.goss_segmentation_create(modelPtr, modelBytes.length, 1);
198
+ exports.goss_tracking_free(modelPtr, modelBytes.length);
199
+ if (core === 0)
200
+ throw new Error("segmentation model rejected");
201
+ const side = exports.goss_segmentation_mask_side();
202
+ const maskPtr = exports.goss_tracking_alloc(side * side * 4);
203
+ if (maskPtr === 0)
204
+ throw new Error("segmentation module allocation failed");
205
+ return new GossSegmenter(exports, core, maskPtr, side, 0, 0);
206
+ }
207
+ /** Runs the segmenter over one RGBA frame; returns the subject mask
208
+ * (mask_side x mask_side floats), or null before the first result. */
209
+ process(rgba, width, height) {
210
+ const needed = width * height * 4;
211
+ if (rgba.length < needed)
212
+ throw new Error("frame shorter than its dimensions");
213
+ if (this.frameCapacity < needed) {
214
+ if (this.framePtr !== 0)
215
+ this.exports.goss_tracking_free(this.framePtr, this.frameCapacity);
216
+ this.framePtr = this.exports.goss_tracking_alloc(needed);
217
+ if (this.framePtr === 0)
218
+ throw new Error("segmentation module allocation failed");
219
+ this.frameCapacity = needed;
220
+ }
221
+ new Uint8Array(this.exports.memory.buffer, this.framePtr, needed).set(rgba.subarray(0, needed));
222
+ if (this.exports.goss_segmentation_process(this.core, this.framePtr, width, height) !== 0) {
223
+ throw new Error("segmentation process refused the frame");
224
+ }
225
+ if (this.exports.goss_segmentation_read_mask(this.core, this.maskPtr) !== 0)
226
+ return null;
227
+ const count = this.maskSide * this.maskSide;
228
+ return new Float32Array(this.exports.memory.buffer, this.maskPtr, count).slice(0, count);
229
+ }
230
+ /** How many classes the model publishes: one for the selfie/hair
231
+ * segmenters, more for the multiclass model behind per-class channels. */
232
+ get classCount() {
233
+ return this.exports.goss_segmentation_class_count(this.core);
234
+ }
235
+ /** One class channel (mask_side x mask_side floats) from the last
236
+ * processed frame, or null before the first result. classIndex runs the
237
+ * model's own label order; channel N of the mask channels reads N - 1. */
238
+ classMask(classIndex) {
239
+ if (this.exports.goss_segmentation_read_class_mask(this.core, classIndex, this.maskPtr) !== 0)
240
+ return null;
241
+ const count = this.maskSide * this.maskSide;
242
+ return new Float32Array(this.exports.memory.buffer, this.maskPtr, count).slice(0, count);
243
+ }
244
+ destroy() {
245
+ this.exports.goss_segmentation_destroy(this.core);
246
+ if (this.framePtr !== 0)
247
+ this.exports.goss_tracking_free(this.framePtr, this.frameCapacity);
248
+ this.exports.goss_tracking_free(this.maskPtr, this.maskSide * this.maskSide * 4);
249
+ }
250
+ }
251
+ export const GOSS_POSE_LANDMARK_COUNT = 33;
252
+ /// The web pose tracker: the wasm module's pose pipeline, run in a Worker.
253
+ /// A pose task bundle in, the 33-landmark pose result out per frame.
254
+ /// Parses the frozen goss_pose_result layout: the header, then the 33-point
255
+ /// landmark floats, the visibility scores, and the presence scores. Pure over
256
+ /// the buffer so it is testable without the wasm module.
257
+ export function parsePoseResult(buffer, ptr) {
258
+ const view = new DataView(buffer, ptr);
259
+ return {
260
+ frameSerial: view.getBigUint64(0, true),
261
+ timestampUs: view.getBigInt64(8, true),
262
+ presence: view.getFloat32(16, true),
263
+ landmarkCount: view.getUint32(20, true),
264
+ landmarks: new Float32Array(buffer, ptr + 24, GOSS_POSE_LANDMARK_COUNT * 3).slice(),
265
+ visibilities: new Float32Array(buffer, ptr + 24 + GOSS_POSE_LANDMARK_COUNT * 3 * 4, GOSS_POSE_LANDMARK_COUNT).slice(),
266
+ presences: new Float32Array(buffer, ptr + 24 + GOSS_POSE_LANDMARK_COUNT * 4 * 4, GOSS_POSE_LANDMARK_COUNT).slice(),
267
+ };
268
+ }
269
+ export class GossPoseTracker {
270
+ exports;
271
+ instance;
272
+ resultPtr;
273
+ framePtr;
274
+ frameCapacity;
275
+ constructor(exports, instance, resultPtr, framePtr, frameCapacity) {
276
+ this.exports = exports;
277
+ this.instance = instance;
278
+ this.resultPtr = resultPtr;
279
+ this.framePtr = framePtr;
280
+ this.frameCapacity = frameCapacity;
281
+ }
282
+ static async create(moduleBytes, taskBundle) {
283
+ let memory;
284
+ const { instance } = await WebAssembly.instantiate(moduleBytes, {
285
+ wasi_snapshot_preview1: totalWasi(() => memory),
286
+ });
287
+ const exports = instance.exports;
288
+ memory = exports.memory;
289
+ const taskPtr = exports.goss_tracking_alloc(taskBundle.length);
290
+ if (taskPtr === 0)
291
+ throw new Error("pose module allocation failed");
292
+ new Uint8Array(exports.memory.buffer, taskPtr, taskBundle.length).set(taskBundle);
293
+ const handle = exports.goss_pose_create(taskPtr, taskBundle.length);
294
+ exports.goss_tracking_free(taskPtr, taskBundle.length);
295
+ if (handle === 0)
296
+ throw new Error("pose bundle rejected");
297
+ const resultPtr = exports.goss_tracking_alloc(exports.goss_pose_result_size());
298
+ if (resultPtr === 0)
299
+ throw new Error("pose module allocation failed");
300
+ return new GossPoseTracker(exports, handle, resultPtr, 0, 0);
301
+ }
302
+ process(rgba, width, height, timestampUs) {
303
+ const needed = width * height * 4;
304
+ if (rgba.length < needed)
305
+ throw new Error("frame shorter than its dimensions");
306
+ if (this.frameCapacity < needed) {
307
+ if (this.framePtr !== 0)
308
+ this.exports.goss_tracking_free(this.framePtr, this.frameCapacity);
309
+ this.framePtr = this.exports.goss_tracking_alloc(needed);
310
+ if (this.framePtr === 0)
311
+ throw new Error("pose module allocation failed");
312
+ this.frameCapacity = needed;
313
+ }
314
+ new Uint8Array(this.exports.memory.buffer, this.framePtr, needed).set(rgba.subarray(0, needed));
315
+ if (this.exports.goss_pose_process(this.instance, this.framePtr, width, height, timestampUs) !== 0) {
316
+ throw new Error("pose process refused the frame");
317
+ }
318
+ return this.latest();
319
+ }
320
+ latest() {
321
+ if (this.exports.goss_pose_result(this.instance, this.resultPtr) !== 0)
322
+ return null;
323
+ return parsePoseResult(this.exports.memory.buffer, this.resultPtr);
324
+ }
325
+ destroy() {
326
+ this.exports.goss_pose_destroy(this.instance);
327
+ if (this.framePtr !== 0)
328
+ this.exports.goss_tracking_free(this.framePtr, this.frameCapacity);
329
+ this.exports.goss_tracking_free(this.resultPtr, this.exports.goss_pose_result_size());
330
+ }
331
+ }
332
+ export const GOSS_HAND_LANDMARK_COUNT = 21;
333
+ export const GOSS_MAX_HANDS = 2;
334
+ const HAND_STRIDE = 16 + GOSS_HAND_LANDMARK_COUNT * 3 * 4; // one GossHand, bytes
335
+ /// The web hand tracker: the wasm module's hand pipeline, run in a Worker.
336
+ /// A hand landmarker or gesture-recognizer bundle in, up to two tracked
337
+ /// hands out - landmarks, handedness, and a canned gesture when present.
338
+ /// Parses the frozen goss_hand_result layout: the header with hand_count at
339
+ /// offset 16, then up to GOSS_MAX_HANDS records at offset 24, each a
340
+ /// HAND_STRIDE-byte GossHand. Pure over the buffer so it is testable without
341
+ /// the wasm module.
342
+ export function parseHandResult(buffer, ptr) {
343
+ const view = new DataView(buffer, ptr);
344
+ const handCount = view.getUint32(16, true);
345
+ const hands = [];
346
+ for (let h = 0; h < handCount && h < GOSS_MAX_HANDS; h += 1) {
347
+ const base = 24 + h * HAND_STRIDE;
348
+ hands.push({
349
+ presence: view.getFloat32(base, true),
350
+ handedness: view.getFloat32(base + 4, true),
351
+ gesture: view.getUint32(base + 8, true),
352
+ gestureScore: view.getFloat32(base + 12, true),
353
+ landmarks: new Float32Array(buffer, ptr + base + 16, GOSS_HAND_LANDMARK_COUNT * 3).slice(),
354
+ });
355
+ }
356
+ return {
357
+ frameSerial: view.getBigUint64(0, true),
358
+ timestampUs: view.getBigInt64(8, true),
359
+ handCount,
360
+ hands,
361
+ };
362
+ }
363
+ export class GossHandTracker {
364
+ exports;
365
+ instance;
366
+ resultPtr;
367
+ framePtr;
368
+ frameCapacity;
369
+ constructor(exports, instance, resultPtr, framePtr, frameCapacity) {
370
+ this.exports = exports;
371
+ this.instance = instance;
372
+ this.resultPtr = resultPtr;
373
+ this.framePtr = framePtr;
374
+ this.frameCapacity = frameCapacity;
375
+ }
376
+ static async create(moduleBytes, taskBundle) {
377
+ let memory;
378
+ const { instance } = await WebAssembly.instantiate(moduleBytes, {
379
+ wasi_snapshot_preview1: totalWasi(() => memory),
380
+ });
381
+ const exports = instance.exports;
382
+ memory = exports.memory;
383
+ const taskPtr = exports.goss_tracking_alloc(taskBundle.length);
384
+ if (taskPtr === 0)
385
+ throw new Error("hand module allocation failed");
386
+ new Uint8Array(exports.memory.buffer, taskPtr, taskBundle.length).set(taskBundle);
387
+ const handle = exports.goss_hand_create(taskPtr, taskBundle.length);
388
+ exports.goss_tracking_free(taskPtr, taskBundle.length);
389
+ if (handle === 0)
390
+ throw new Error("hand bundle rejected");
391
+ const resultPtr = exports.goss_tracking_alloc(exports.goss_hand_result_size());
392
+ if (resultPtr === 0)
393
+ throw new Error("hand module allocation failed");
394
+ return new GossHandTracker(exports, handle, resultPtr, 0, 0);
395
+ }
396
+ process(rgba, width, height, timestampUs) {
397
+ const needed = width * height * 4;
398
+ if (rgba.length < needed)
399
+ throw new Error("frame shorter than its dimensions");
400
+ if (this.frameCapacity < needed) {
401
+ if (this.framePtr !== 0)
402
+ this.exports.goss_tracking_free(this.framePtr, this.frameCapacity);
403
+ this.framePtr = this.exports.goss_tracking_alloc(needed);
404
+ if (this.framePtr === 0)
405
+ throw new Error("hand module allocation failed");
406
+ this.frameCapacity = needed;
407
+ }
408
+ new Uint8Array(this.exports.memory.buffer, this.framePtr, needed).set(rgba.subarray(0, needed));
409
+ if (this.exports.goss_hand_process(this.instance, this.framePtr, width, height, timestampUs) !== 0) {
410
+ throw new Error("hand process refused the frame");
411
+ }
412
+ return this.latest();
413
+ }
414
+ latest() {
415
+ if (this.exports.goss_hand_result(this.instance, this.resultPtr) !== 0)
416
+ return null;
417
+ return parseHandResult(this.exports.memory.buffer, this.resultPtr);
418
+ }
419
+ destroy() {
420
+ this.exports.goss_hand_destroy(this.instance);
421
+ if (this.framePtr !== 0)
422
+ this.exports.goss_tracking_free(this.framePtr, this.frameCapacity);
423
+ this.exports.goss_tracking_free(this.resultPtr, this.exports.goss_hand_result_size());
424
+ }
425
+ }
426
+ //# sourceMappingURL=tracking.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracking.js","sourceRoot":"","sources":["../../src/tracking.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import type { GossSession } from "./index";
2
+ interface XRRigidTransformLike {
3
+ matrix: Float32Array;
4
+ }
5
+ interface XRViewLike {
6
+ projectionMatrix: Float32Array;
7
+ }
8
+ interface XRViewerPoseLike {
9
+ transform: XRRigidTransformLike;
10
+ views: XRViewLike[];
11
+ emulatedPosition?: boolean;
12
+ }
13
+ interface XRPlaneLike {
14
+ planeSpace: unknown;
15
+ }
16
+ interface XRAnchorLike {
17
+ anchorSpace: unknown;
18
+ }
19
+ interface XRPoseLike {
20
+ transform: XRRigidTransformLike;
21
+ }
22
+ export interface GossXRFrameLike {
23
+ getViewerPose(referenceSpace: unknown): XRViewerPoseLike | null;
24
+ getPose(space: unknown, referenceSpace: unknown): XRPoseLike | null;
25
+ detectedPlanes?: Set<XRPlaneLike>;
26
+ trackedAnchors?: Set<XRAnchorLike>;
27
+ }
28
+ export declare class GossWebXRWorldSource {
29
+ private readonly session;
30
+ private planeIds;
31
+ private anchorIds;
32
+ private nextId;
33
+ constructor(session: GossSession);
34
+ onFrame(frame: GossXRFrameLike, referenceSpace: unknown, timestampUs: number): void;
35
+ private idFor;
36
+ }
37
+ export {};
38
+ //# sourceMappingURL=world.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"world.d.ts","sourceRoot":"","sources":["../../src/world.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAwC,MAAM,SAAS,CAAC;AAIjF,UAAU,oBAAoB;IAC5B,MAAM,EAAE,YAAY,CAAC;CACtB;AAED,UAAU,UAAU;IAClB,gBAAgB,EAAE,YAAY,CAAC;CAChC;AAED,UAAU,gBAAgB;IACxB,SAAS,EAAE,oBAAoB,CAAC;IAChC,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,UAAU,WAAW;IACnB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,UAAU,YAAY;IACpB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,UAAU,UAAU;IAClB,SAAS,EAAE,oBAAoB,CAAC;CACjC;AAED,MAAM,WAAW,eAAe;IAC9B,aAAa,CAAC,cAAc,EAAE,OAAO,GAAG,gBAAgB,GAAG,IAAI,CAAC;IAChE,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO,GAAG,UAAU,GAAG,IAAI,CAAC;IACpE,cAAc,CAAC,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;IAClC,cAAc,CAAC,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC;CACpC;AAED,qBAAa,oBAAoB;IAKnB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAJpC,OAAO,CAAC,QAAQ,CAAkC;IAClD,OAAO,CAAC,SAAS,CAAmC;IACpD,OAAO,CAAC,MAAM,CAAK;IAEnB,YAA6B,OAAO,EAAE,WAAW,EAAI;IAIrD,OAAO,CAAC,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CA6ClF;IAED,OAAO,CAAC,KAAK;CAQd"}
@@ -0,0 +1,67 @@
1
+ /// The WebXR world backend: reads the viewer pose, projection, detected
2
+ /// planes, and tracked anchors off each XR frame and feeds them into
3
+ /// the session. The page owns the XR session; this source only reads.
4
+ export class GossWebXRWorldSource {
5
+ session;
6
+ planeIds = new Map();
7
+ anchorIds = new Map();
8
+ nextId = 1;
9
+ constructor(session) {
10
+ this.session = session;
11
+ }
12
+ /// Call once per XR animation frame with the frame and the reference
13
+ /// space the page renders against.
14
+ onFrame(frame, referenceSpace, timestampUs) {
15
+ const viewer = frame.getViewerPose(referenceSpace);
16
+ if (!viewer || viewer.views.length === 0) {
17
+ this.session.submitWorld({
18
+ trackingState: 1,
19
+ worldFromCamera: identity16,
20
+ projection: identity16,
21
+ timestampUs,
22
+ });
23
+ return;
24
+ }
25
+ const planes = [];
26
+ if (frame.detectedPlanes) {
27
+ for (const plane of frame.detectedPlanes) {
28
+ const pose = frame.getPose(plane.planeSpace, referenceSpace);
29
+ if (!pose)
30
+ continue;
31
+ planes.push({
32
+ id: this.idFor(this.planeIds, plane),
33
+ pose: pose.transform.matrix,
34
+ extentX: 0,
35
+ extentZ: 0,
36
+ classification: 0,
37
+ });
38
+ }
39
+ }
40
+ const anchors = [];
41
+ if (frame.trackedAnchors) {
42
+ for (const anchor of frame.trackedAnchors) {
43
+ const pose = frame.getPose(anchor.anchorSpace, referenceSpace);
44
+ if (!pose)
45
+ continue;
46
+ anchors.push({ id: this.idFor(this.anchorIds, anchor), pose: pose.transform.matrix });
47
+ }
48
+ }
49
+ this.session.submitWorld({
50
+ trackingState: viewer.emulatedPosition ? 3 : 2,
51
+ worldFromCamera: viewer.transform.matrix,
52
+ projection: viewer.views[0].projectionMatrix,
53
+ timestampUs,
54
+ }, planes, anchors);
55
+ }
56
+ idFor(map, key) {
57
+ const existing = map.get(key);
58
+ if (existing !== undefined)
59
+ return existing;
60
+ const id = this.nextId;
61
+ this.nextId += 1;
62
+ map.set(key, id);
63
+ return id;
64
+ }
65
+ }
66
+ const identity16 = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];
67
+ //# sourceMappingURL=world.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"world.js","sourceRoot":"","sources":["../../src/world.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../../test/index.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,42 @@
1
+ import { test, expect } from "bun:test";
2
+ import { pickEngineUrl, GOSS_SEGMENTATION_CHANNELS, GOSS_FACE_LANDMARK_COUNT } from "../src/index";
3
+ test("GOSS_SEGMENTATION_CHANNELS is the engine's frozen channel order", () => {
4
+ expect([...GOSS_SEGMENTATION_CHANNELS]).toEqual([
5
+ "person",
6
+ "background",
7
+ "hair",
8
+ "body_skin",
9
+ "face_skin",
10
+ "clothes",
11
+ "others",
12
+ ]);
13
+ });
14
+ test("landmark count matches the frozen ABI", () => {
15
+ expect(GOSS_FACE_LANDMARK_COUNT).toBe(478);
16
+ });
17
+ test("pickEngineUrl only chooses WebGPU with a real adapter", async () => {
18
+ const nav = globalThis.navigator;
19
+ const had = "gpu" in nav;
20
+ const original = nav.gpu;
21
+ try {
22
+ nav.gpu = undefined; // no WebGPU at all
23
+ expect(await pickEngineUrl("gpu.js", "gl.js")).toBe("gl.js");
24
+ nav.gpu = { requestAdapter: async () => ({}) }; // a real adapter
25
+ expect(await pickEngineUrl("gpu.js", "gl.js")).toBe("gpu.js");
26
+ nav.gpu = { requestAdapter: async () => null }; // gpu present, no adapter
27
+ expect(await pickEngineUrl("gpu.js", "gl.js")).toBe("gl.js");
28
+ nav.gpu = {
29
+ requestAdapter: async () => {
30
+ throw new Error("adapter blew up");
31
+ },
32
+ };
33
+ expect(await pickEngineUrl("gpu.js", "gl.js")).toBe("gl.js");
34
+ }
35
+ finally {
36
+ if (had)
37
+ nav.gpu = original;
38
+ else
39
+ delete nav.gpu;
40
+ }
41
+ });
42
+ //# sourceMappingURL=index.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../test/index.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,0BAA0B,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AAEnG,IAAI,CAAC,iEAAiE,EAAE,GAAG,EAAE;IAC3E,MAAM,CAAC,CAAC,GAAG,0BAA0B,CAAC,CAAC,CAAC,OAAO,CAAC;QAC9C,QAAQ;QACR,YAAY;QACZ,MAAM;QACN,WAAW;QACX,WAAW;QACX,SAAS;QACT,QAAQ;KACT,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,uCAAuC,EAAE,GAAG,EAAE;IACjD,MAAM,CAAC,wBAAwB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC7C,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;IACvE,MAAM,GAAG,GAAG,UAAU,CAAC,SAAyC,CAAC;IACjE,MAAM,GAAG,GAAG,KAAK,IAAI,GAAG,CAAC;IACzB,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC;IACzB,IAAI,CAAC;QACH,GAAG,CAAC,GAAG,GAAG,SAAS,CAAC,CAAC,mBAAmB;QACxC,MAAM,CAAC,MAAM,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAE7D,GAAG,CAAC,GAAG,GAAG,EAAE,cAAc,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,iBAAiB;QACjE,MAAM,CAAC,MAAM,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAE9D,GAAG,CAAC,GAAG,GAAG,EAAE,cAAc,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,0BAA0B;QAC1E,MAAM,CAAC,MAAM,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAE7D,GAAG,CAAC,GAAG,GAAG;YACR,cAAc,EAAE,KAAK,IAAI,EAAE;gBACzB,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;YACrC,CAAC;SACF,CAAC;QACF,MAAM,CAAC,MAAM,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/D,CAAC;YAAS,CAAC;QACT,IAAI,GAAG;YAAE,GAAG,CAAC,GAAG,GAAG,QAAQ,CAAC;;YACvB,OAAO,GAAG,CAAC,GAAG,CAAC;IACtB,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tracking.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracking.test.d.ts","sourceRoot":"","sources":["../../test/tracking.test.ts"],"names":[],"mappings":""}