@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,85 @@
1
+ import { test, expect } from "bun:test";
2
+ import { parseFaceResult, parseHandResult, parsePoseResult, GOSS_FACE_LANDMARK_COUNT, GOSS_FACE_BLENDSHAPE_COUNT, GOSS_POSE_LANDMARK_COUNT, GOSS_HAND_LANDMARK_COUNT, } from "../src/tracking";
3
+ // These pin the parsers to the frozen C result layouts (goss_face_result,
4
+ // goss_hand_result, goss_pose_result). A drift in an offset here would be a
5
+ // silent cross-language bug; the buffers are hand-laid to match the header.
6
+ test("parseFaceResult reads the frozen goss_face_result layout", () => {
7
+ const size = 24 + (GOSS_FACE_LANDMARK_COUNT * 3 + GOSS_FACE_BLENDSHAPE_COUNT) * 4;
8
+ const buffer = new ArrayBuffer(size);
9
+ const view = new DataView(buffer);
10
+ view.setBigUint64(0, 7n, true);
11
+ view.setBigInt64(8, 123456n, true);
12
+ view.setFloat32(16, 0.9, true);
13
+ view.setUint32(20, GOSS_FACE_LANDMARK_COUNT, true);
14
+ view.setFloat32(24, 1.5, true); // first landmark x
15
+ view.setFloat32(24 + GOSS_FACE_LANDMARK_COUNT * 3 * 4, 0.25, true); // first blendshape
16
+ const r = parseFaceResult(buffer, 0);
17
+ expect(r.frameSerial).toBe(7n);
18
+ expect(r.timestampUs).toBe(123456n);
19
+ expect(r.presence).toBeCloseTo(0.9, 5);
20
+ expect(r.landmarkCount).toBe(GOSS_FACE_LANDMARK_COUNT);
21
+ expect(r.landmarks.length).toBe(GOSS_FACE_LANDMARK_COUNT * 3);
22
+ expect(r.landmarks[0]).toBeCloseTo(1.5, 5);
23
+ expect(r.blendshapes.length).toBe(GOSS_FACE_BLENDSHAPE_COUNT);
24
+ expect(r.blendshapes[0]).toBeCloseTo(0.25, 5);
25
+ });
26
+ test("parseFaceResult honors a non-zero result pointer", () => {
27
+ const offset = 64;
28
+ const size = offset + 24 + (GOSS_FACE_LANDMARK_COUNT * 3 + GOSS_FACE_BLENDSHAPE_COUNT) * 4;
29
+ const buffer = new ArrayBuffer(size);
30
+ const view = new DataView(buffer, offset);
31
+ view.setUint32(20, GOSS_FACE_LANDMARK_COUNT, true);
32
+ view.setFloat32(24, 2.0, true);
33
+ const r = parseFaceResult(buffer, offset);
34
+ expect(r.landmarkCount).toBe(GOSS_FACE_LANDMARK_COUNT);
35
+ expect(r.landmarks[0]).toBeCloseTo(2.0, 5);
36
+ });
37
+ test("parseHandResult reads a hand out of the frozen layout", () => {
38
+ const stride = 16 + GOSS_HAND_LANDMARK_COUNT * 3 * 4;
39
+ const buffer = new ArrayBuffer(24 + 2 * stride);
40
+ const view = new DataView(buffer);
41
+ view.setBigUint64(0, 3n, true);
42
+ view.setUint32(16, 1, true); // one hand
43
+ const base = 24;
44
+ view.setFloat32(base, 0.8, true); // presence
45
+ view.setFloat32(base + 4, 0.95, true); // handedness
46
+ view.setUint32(base + 8, 2, true); // gesture
47
+ view.setFloat32(base + 12, 0.7, true); // gesture score
48
+ view.setFloat32(base + 16, 4.5, true); // first landmark x
49
+ const r = parseHandResult(buffer, 0);
50
+ expect(r.frameSerial).toBe(3n);
51
+ expect(r.handCount).toBe(1);
52
+ expect(r.hands.length).toBe(1);
53
+ expect(r.hands[0].presence).toBeCloseTo(0.8, 5);
54
+ expect(r.hands[0].handedness).toBeCloseTo(0.95, 5);
55
+ expect(r.hands[0].gesture).toBe(2);
56
+ expect(r.hands[0].gestureScore).toBeCloseTo(0.7, 5);
57
+ expect(r.hands[0].landmarks.length).toBe(GOSS_HAND_LANDMARK_COUNT * 3);
58
+ expect(r.hands[0].landmarks[0]).toBeCloseTo(4.5, 5);
59
+ });
60
+ test("parseHandResult returns no hands for a zero count", () => {
61
+ const stride = 16 + GOSS_HAND_LANDMARK_COUNT * 3 * 4;
62
+ const buffer = new ArrayBuffer(24 + 2 * stride);
63
+ const r = parseHandResult(buffer, 0);
64
+ expect(r.handCount).toBe(0);
65
+ expect(r.hands.length).toBe(0);
66
+ });
67
+ test("parsePoseResult reads the frozen goss_pose_result layout", () => {
68
+ const buffer = new ArrayBuffer(688);
69
+ const view = new DataView(buffer);
70
+ view.setFloat32(16, 0.99, true); // presence
71
+ view.setUint32(20, GOSS_POSE_LANDMARK_COUNT, true);
72
+ view.setFloat32(24, 3.0, true); // first landmark x
73
+ view.setFloat32(24 + GOSS_POSE_LANDMARK_COUNT * 3 * 4, 0.5, true); // first visibility
74
+ view.setFloat32(24 + GOSS_POSE_LANDMARK_COUNT * 4 * 4, 0.6, true); // first presence
75
+ const r = parsePoseResult(buffer, 0);
76
+ expect(r.presence).toBeCloseTo(0.99, 5);
77
+ expect(r.landmarkCount).toBe(GOSS_POSE_LANDMARK_COUNT);
78
+ expect(r.landmarks.length).toBe(GOSS_POSE_LANDMARK_COUNT * 3);
79
+ expect(r.landmarks[0]).toBeCloseTo(3.0, 5);
80
+ expect(r.visibilities.length).toBe(GOSS_POSE_LANDMARK_COUNT);
81
+ expect(r.visibilities[0]).toBeCloseTo(0.5, 5);
82
+ expect(r.presences.length).toBe(GOSS_POSE_LANDMARK_COUNT);
83
+ expect(r.presences[0]).toBeCloseTo(0.6, 5);
84
+ });
85
+ //# sourceMappingURL=tracking.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracking.test.js","sourceRoot":"","sources":["../../test/tracking.test.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "@myzonerocks/gosslens",
3
+ "version": "0.9.0",
4
+ "description": "Web SDK for the gosslens camera and AR engine, over the wasm core.",
5
+ "license": "Apache-2.0",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/myzonerocks/gosslens.git",
9
+ "directory": "sdk/ts"
10
+ },
11
+ "type": "module",
12
+ "main": "./dist/src/index.js",
13
+ "types": "./dist/src/index.d.ts",
14
+ "exports": {
15
+ ".": {
16
+ "types": "./dist/src/index.d.ts",
17
+ "import": "./dist/src/index.js"
18
+ }
19
+ },
20
+ "files": [
21
+ "dist",
22
+ "src",
23
+ "README.md"
24
+ ],
25
+ "sideEffects": false,
26
+ "scripts": {
27
+ "build": "tsc -p tsconfig.json",
28
+ "test": "bun test ./test",
29
+ "typecheck": "tsc -p tsconfig.json --noEmit",
30
+ "prepublishOnly": "bun run build"
31
+ },
32
+ "publishConfig": {
33
+ "access": "public"
34
+ },
35
+ "keywords": [
36
+ "camera",
37
+ "ar",
38
+ "webassembly",
39
+ "lens",
40
+ "effects"
41
+ ],
42
+ "engines": {
43
+ "node": ">=18"
44
+ },
45
+ "devDependencies": {
46
+ "@types/bun": "^1.4.0",
47
+ "typescript": "^7.0.0"
48
+ }
49
+ }