@visutry/tryon-core 0.2.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 (86) hide show
  1. package/README.md +58 -0
  2. package/dist/__fixtures__/faceFixtures.d.ts +13 -0
  3. package/dist/__fixtures__/faceFixtures.d.ts.map +1 -0
  4. package/dist/__fixtures__/faceFixtures.js +206 -0
  5. package/dist/__fixtures__/faceFixtures.js.map +1 -0
  6. package/dist/adapter/visutry-site.d.ts +76 -0
  7. package/dist/adapter/visutry-site.d.ts.map +1 -0
  8. package/dist/adapter/visutry-site.js +172 -0
  9. package/dist/adapter/visutry-site.js.map +1 -0
  10. package/dist/analytics.d.ts +89 -0
  11. package/dist/analytics.d.ts.map +1 -0
  12. package/dist/analytics.js +49 -0
  13. package/dist/analytics.js.map +1 -0
  14. package/dist/coordinate/CoordinateSystem.d.ts +46 -0
  15. package/dist/coordinate/CoordinateSystem.d.ts.map +1 -0
  16. package/dist/coordinate/CoordinateSystem.js +88 -0
  17. package/dist/coordinate/CoordinateSystem.js.map +1 -0
  18. package/dist/face/FaceMetricsCalculator.d.ts +52 -0
  19. package/dist/face/FaceMetricsCalculator.d.ts.map +1 -0
  20. package/dist/face/FaceMetricsCalculator.js +375 -0
  21. package/dist/face/FaceMetricsCalculator.js.map +1 -0
  22. package/dist/face/FaceSemanticMapper.d.ts +54 -0
  23. package/dist/face/FaceSemanticMapper.d.ts.map +1 -0
  24. package/dist/face/FaceSemanticMapper.js +129 -0
  25. package/dist/face/FaceSemanticMapper.js.map +1 -0
  26. package/dist/face/FaceShapeScorer.d.ts +35 -0
  27. package/dist/face/FaceShapeScorer.d.ts.map +1 -0
  28. package/dist/face/FaceShapeScorer.js +265 -0
  29. package/dist/face/FaceShapeScorer.js.map +1 -0
  30. package/dist/face/feature-extractor.d.ts +46 -0
  31. package/dist/face/feature-extractor.d.ts.map +1 -0
  32. package/dist/face/feature-extractor.js +106 -0
  33. package/dist/face/feature-extractor.js.map +1 -0
  34. package/dist/face/logreg-classifier.d.ts +117 -0
  35. package/dist/face/logreg-classifier.d.ts.map +1 -0
  36. package/dist/face/logreg-classifier.js +304 -0
  37. package/dist/face/logreg-classifier.js.map +1 -0
  38. package/dist/feature-flag.d.ts +43 -0
  39. package/dist/feature-flag.d.ts.map +1 -0
  40. package/dist/feature-flag.js +58 -0
  41. package/dist/feature-flag.js.map +1 -0
  42. package/dist/i18n/index.d.ts +15 -0
  43. package/dist/i18n/index.d.ts.map +1 -0
  44. package/dist/i18n/index.js +91 -0
  45. package/dist/i18n/index.js.map +1 -0
  46. package/dist/index.d.ts +24 -0
  47. package/dist/index.d.ts.map +1 -0
  48. package/dist/index.js +33 -0
  49. package/dist/index.js.map +1 -0
  50. package/dist/manifest/ManifestValidator.d.ts +23 -0
  51. package/dist/manifest/ManifestValidator.d.ts.map +1 -0
  52. package/dist/manifest/ManifestValidator.js +129 -0
  53. package/dist/manifest/ManifestValidator.js.map +1 -0
  54. package/dist/pose/GlassesPoseSolver.d.ts +64 -0
  55. package/dist/pose/GlassesPoseSolver.d.ts.map +1 -0
  56. package/dist/pose/GlassesPoseSolver.js +299 -0
  57. package/dist/pose/GlassesPoseSolver.js.map +1 -0
  58. package/dist/privacy/PrivacyGuard.d.ts +44 -0
  59. package/dist/privacy/PrivacyGuard.d.ts.map +1 -0
  60. package/dist/privacy/PrivacyGuard.js +105 -0
  61. package/dist/privacy/PrivacyGuard.js.map +1 -0
  62. package/dist/quality/QualityGate.d.ts +22 -0
  63. package/dist/quality/QualityGate.d.ts.map +1 -0
  64. package/dist/quality/QualityGate.js +161 -0
  65. package/dist/quality/QualityGate.js.map +1 -0
  66. package/dist/smoothing/PoseSmoothing.d.ts +37 -0
  67. package/dist/smoothing/PoseSmoothing.d.ts.map +1 -0
  68. package/dist/smoothing/PoseSmoothing.js +146 -0
  69. package/dist/smoothing/PoseSmoothing.js.map +1 -0
  70. package/dist/types/index.d.ts +444 -0
  71. package/dist/types/index.d.ts.map +1 -0
  72. package/dist/types/index.js +8 -0
  73. package/dist/types/index.js.map +1 -0
  74. package/dist/utils/errors.d.ts +7 -0
  75. package/dist/utils/errors.d.ts.map +1 -0
  76. package/dist/utils/errors.js +20 -0
  77. package/dist/utils/errors.js.map +1 -0
  78. package/dist/utils/index.d.ts +2 -0
  79. package/dist/utils/index.d.ts.map +1 -0
  80. package/dist/utils/index.js +2 -0
  81. package/dist/utils/index.js.map +1 -0
  82. package/dist/utils/math.d.ts +40 -0
  83. package/dist/utils/math.d.ts.map +1 -0
  84. package/dist/utils/math.js +149 -0
  85. package/dist/utils/math.js.map +1 -0
  86. package/package.json +31 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QualityGate.js","sourceRoot":"","sources":["../../src/quality/QualityGate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import type { GlassesPose, PoseSmoothingConfig } from "../types/index.js";
2
+ /** Default smoothing configuration (spec §15.6). */
3
+ export declare const DEFAULT_POSE_SMOOTHING_CONFIG: PoseSmoothingConfig;
4
+ /**
5
+ * Smooths a stream of `GlassesPose` values to suppress tracker jitter and
6
+ * gracefully handle brief tracking loss.
7
+ *
8
+ * Behaviour (spec §15.6 / §15.7):
9
+ * - When tracking is active, position / rotation / scale are lerped toward the
10
+ * new target. Sub-threshold deltas are ignored to kill micro-jitter.
11
+ * - On brief loss (< `lostTrackingDelayMs`) the last pose is held so the
12
+ * glasses do not flicker.
13
+ * - After the delay, the glasses fade out (visible=false) smoothly.
14
+ * - On recovery the lerp resumes, preventing an instantaneous jump.
15
+ */
16
+ export declare class PoseSmoother {
17
+ private config;
18
+ private lastPose;
19
+ private lastSeenMs;
20
+ private lost;
21
+ constructor(config?: Partial<PoseSmoothingConfig>);
22
+ configure(config: Partial<PoseSmoothingConfig>): void;
23
+ reset(): void;
24
+ /**
25
+ * Produce a smoothed pose for the given raw pose and timestamp.
26
+ *
27
+ * @param raw The freshly solved pose (may have `visible=false`).
28
+ * @param nowMs Current timestamp in milliseconds.
29
+ */
30
+ smooth(raw: GlassesPose, nowMs: number): GlassesPose;
31
+ private smoothActive;
32
+ private lerpIfSignificant;
33
+ private lerpScale;
34
+ private lerpRotation;
35
+ get isLost(): boolean;
36
+ }
37
+ //# sourceMappingURL=PoseSmoothing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PoseSmoothing.d.ts","sourceRoot":"","sources":["../../src/smoothing/PoseSmoothing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAG1E,oDAAoD;AACpD,eAAO,MAAM,6BAA6B,EAAE,mBAO3C,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,QAAQ,CAA4B;IAC5C,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,IAAI,CAAS;gBAET,MAAM,GAAE,OAAO,CAAC,mBAAmB,CAAM;IAIrD,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,mBAAmB,CAAC,GAAG,IAAI;IAIrD,KAAK,IAAI,IAAI;IAMb;;;;;OAKG;IACH,MAAM,CAAC,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,WAAW;IAoCpD,OAAO,CAAC,YAAY;IAqBpB,OAAO,CAAC,iBAAiB;IAUzB,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,YAAY;IAepB,IAAI,MAAM,IAAI,OAAO,CAEpB;CACF"}
@@ -0,0 +1,146 @@
1
+ import { clamp01, lerp, lerpVec3, clampAngle } from "../utils/math.js";
2
+ /** Default smoothing configuration (spec §15.6). */
3
+ export const DEFAULT_POSE_SMOOTHING_CONFIG = {
4
+ enabled: true,
5
+ positionLerp: 0.35,
6
+ rotationLerp: 0.3,
7
+ scaleLerp: 0.25,
8
+ jitterThreshold: 0.003,
9
+ lostTrackingDelayMs: 250,
10
+ };
11
+ /**
12
+ * Smooths a stream of `GlassesPose` values to suppress tracker jitter and
13
+ * gracefully handle brief tracking loss.
14
+ *
15
+ * Behaviour (spec §15.6 / §15.7):
16
+ * - When tracking is active, position / rotation / scale are lerped toward the
17
+ * new target. Sub-threshold deltas are ignored to kill micro-jitter.
18
+ * - On brief loss (< `lostTrackingDelayMs`) the last pose is held so the
19
+ * glasses do not flicker.
20
+ * - After the delay, the glasses fade out (visible=false) smoothly.
21
+ * - On recovery the lerp resumes, preventing an instantaneous jump.
22
+ */
23
+ export class PoseSmoother {
24
+ constructor(config = {}) {
25
+ Object.defineProperty(this, "config", {
26
+ enumerable: true,
27
+ configurable: true,
28
+ writable: true,
29
+ value: void 0
30
+ });
31
+ Object.defineProperty(this, "lastPose", {
32
+ enumerable: true,
33
+ configurable: true,
34
+ writable: true,
35
+ value: null
36
+ });
37
+ Object.defineProperty(this, "lastSeenMs", {
38
+ enumerable: true,
39
+ configurable: true,
40
+ writable: true,
41
+ value: 0
42
+ });
43
+ Object.defineProperty(this, "lost", {
44
+ enumerable: true,
45
+ configurable: true,
46
+ writable: true,
47
+ value: false
48
+ });
49
+ this.config = { ...DEFAULT_POSE_SMOOTHING_CONFIG, ...config };
50
+ }
51
+ configure(config) {
52
+ this.config = { ...this.config, ...config };
53
+ }
54
+ reset() {
55
+ this.lastPose = null;
56
+ this.lost = false;
57
+ this.lastSeenMs = 0;
58
+ }
59
+ /**
60
+ * Produce a smoothed pose for the given raw pose and timestamp.
61
+ *
62
+ * @param raw The freshly solved pose (may have `visible=false`).
63
+ * @param nowMs Current timestamp in milliseconds.
64
+ */
65
+ smooth(raw, nowMs) {
66
+ if (!this.config.enabled) {
67
+ return raw;
68
+ }
69
+ // First observation ever: adopt directly.
70
+ if (!this.lastPose) {
71
+ this.lastPose = { ...raw };
72
+ this.lastSeenMs = raw.visible ? nowMs : this.lastSeenMs;
73
+ this.lost = !raw.visible;
74
+ return { ...raw };
75
+ }
76
+ if (raw.visible) {
77
+ this.lastSeenMs = nowMs;
78
+ this.lost = false;
79
+ return this.smoothActive(raw);
80
+ }
81
+ // Raw says not visible — decide based on time since last sighting.
82
+ const elapsed = nowMs - this.lastSeenMs;
83
+ if (elapsed < this.config.lostTrackingDelayMs) {
84
+ // Hold the last pose, keep it visible (no flicker).
85
+ this.lost = false;
86
+ return { ...this.lastPose, visible: true };
87
+ }
88
+ // Grace period over: fade out.
89
+ this.lost = true;
90
+ const fade = clamp01(1 - (elapsed - this.config.lostTrackingDelayMs) / 200);
91
+ if (fade <= 0) {
92
+ return { ...this.lastPose, visible: false };
93
+ }
94
+ return { ...this.lastPose, visible: true, confidence: this.lastPose.confidence * fade };
95
+ }
96
+ smoothActive(raw) {
97
+ const last = this.lastPose;
98
+ const t = this.config;
99
+ const position = this.lerpIfSignificant(last.position, raw.position, t.positionLerp, t.jitterThreshold);
100
+ const scale = this.lerpScale(last.scale, raw.scale, t.scaleLerp, t.jitterThreshold);
101
+ const rotation = this.lerpRotation(last.rotation, raw.rotation, t.rotationLerp, t.jitterThreshold);
102
+ const smoothed = {
103
+ position,
104
+ rotation,
105
+ scale,
106
+ visible: true,
107
+ confidence: lerp(last.confidence, raw.confidence, t.rotationLerp),
108
+ reason: raw.reason,
109
+ };
110
+ this.lastPose = { ...smoothed };
111
+ return smoothed;
112
+ }
113
+ lerpIfSignificant(a, b, t, threshold) {
114
+ const dx = Math.abs(b.x - a.x);
115
+ const dy = Math.abs(b.y - a.y);
116
+ const dz = Math.abs(b.z - a.z);
117
+ if (dx < threshold && dy < threshold && dz < threshold) {
118
+ return { ...a };
119
+ }
120
+ return lerpVec3(a, b, t);
121
+ }
122
+ lerpScale(a, b, t, threshold) {
123
+ const dx = Math.abs(b.x - a.x);
124
+ if (dx < threshold)
125
+ return { ...a };
126
+ return { x: lerp(a.x, b.x, t), y: lerp(a.y, b.y, t), z: lerp(a.z, b.z, t) };
127
+ }
128
+ lerpRotation(a, b, t, threshold) {
129
+ // Use shortest-angle lerp for each Euler component.
130
+ const dl = Math.abs(clampAngle(b.x - a.x));
131
+ const dr = Math.abs(clampAngle(b.y - a.y));
132
+ const dp = Math.abs(clampAngle(b.z - a.z));
133
+ if (dl < threshold && dr < threshold && dp < threshold) {
134
+ return { ...a };
135
+ }
136
+ return {
137
+ x: a.x + clampAngle(b.x - a.x) * t,
138
+ y: a.y + clampAngle(b.y - a.y) * t,
139
+ z: a.z + clampAngle(b.z - a.z) * t,
140
+ };
141
+ }
142
+ get isLost() {
143
+ return this.lost;
144
+ }
145
+ }
146
+ //# sourceMappingURL=PoseSmoothing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PoseSmoothing.js","sourceRoot":"","sources":["../../src/smoothing/PoseSmoothing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,444 @@
1
+ /**
2
+ * VisuTry SDK — Core Type Definitions
3
+ *
4
+ * Platform-agnostic type contracts shared by core, web, wechat and recommender
5
+ * packages. Nothing here depends on the DOM, MediaPipe, Three.js or WeChat APIs.
6
+ */
7
+ export interface Point2D {
8
+ x: number;
9
+ y: number;
10
+ }
11
+ export interface Point3D {
12
+ x: number;
13
+ y: number;
14
+ z: number;
15
+ }
16
+ export interface Vector3 {
17
+ x: number;
18
+ y: number;
19
+ z: number;
20
+ }
21
+ /** A rectangle in normalized image coordinates (0..1). */
22
+ export interface NormalizedRect {
23
+ x: number;
24
+ y: number;
25
+ width: number;
26
+ height: number;
27
+ }
28
+ /**
29
+ * Stable semantic landmarks derived from raw tracker output. Every adapter is
30
+ * responsible for mapping its native landmark indices onto this contract so that
31
+ * the core algorithms remain tracker-agnostic.
32
+ */
33
+ export interface FaceSemanticPoints {
34
+ leftEyeOuter?: Point3D;
35
+ leftEyeInner?: Point3D;
36
+ rightEyeInner?: Point3D;
37
+ rightEyeOuter?: Point3D;
38
+ leftEyeCenter?: Point3D;
39
+ rightEyeCenter?: Point3D;
40
+ eyesCenter?: Point3D;
41
+ noseBridge?: Point3D;
42
+ noseTip?: Point3D;
43
+ leftBrowCenter?: Point3D;
44
+ rightBrowCenter?: Point3D;
45
+ foreheadCenter?: Point3D;
46
+ chin?: Point3D;
47
+ leftCheek?: Point3D;
48
+ rightCheek?: Point3D;
49
+ leftJaw?: Point3D;
50
+ rightJaw?: Point3D;
51
+ /** Face outline widest points (visutry addition). */
52
+ leftFace?: Point3D;
53
+ rightFace?: Point3D;
54
+ /** Forehead width points (visutry addition). */
55
+ leftForehead?: Point3D;
56
+ rightForehead?: Point3D;
57
+ /** Nose wing points for nose bridge width (visutry addition). */
58
+ noseLeft?: Point3D;
59
+ noseRight?: Point3D;
60
+ }
61
+ export interface FacePose {
62
+ /** Radians. */
63
+ yaw: number;
64
+ /** Radians. */
65
+ pitch: number;
66
+ /** Radians. */
67
+ roll: number;
68
+ /** Optional 4x4 column-major transformation matrix when the tracker provides one. */
69
+ matrix?: number[];
70
+ confidence: number;
71
+ }
72
+ export type FaceQualityWarning = "LOW_CONFIDENCE" | "NOT_FRONTAL" | "FACE_TOO_SMALL" | "FACE_TOO_CLOSE" | "LOW_LIGHT" | "OCCLUDED" | "UNSTABLE" | "MISSING_KEY_POINTS" | "EXCESSIVE_TILT" | "ASYMMETRIC_FACE" | "MULTIPLE_FACES";
73
+ export interface FaceQuality {
74
+ confidence: number;
75
+ faceVisible: boolean;
76
+ frontalScore: number;
77
+ stabilityScore: number;
78
+ lightingScore?: number;
79
+ occlusionScore?: number;
80
+ warnings: FaceQualityWarning[];
81
+ }
82
+ export type FaceResultSource = "mediapipe" | "wechat-vk" | "custom";
83
+ /** A pair of landmark indices representing a connection/edge. */
84
+ export interface LandmarkConnection {
85
+ start: number;
86
+ end: number;
87
+ }
88
+ /** Connection groups for landmark mesh rendering (MediaPipe convention). */
89
+ export interface LandmarkConnections {
90
+ tesselation: LandmarkConnection[];
91
+ contours: LandmarkConnection[];
92
+ irises: LandmarkConnection[];
93
+ }
94
+ export interface NormalizedFaceResult {
95
+ source: FaceResultSource;
96
+ timestamp: number;
97
+ landmarks: {
98
+ raw: Point3D[];
99
+ normalized: Point3D[];
100
+ semantic: FaceSemanticPoints;
101
+ /** Connection data for mesh rendering (available when source="mediapipe"). */
102
+ connections?: LandmarkConnections;
103
+ };
104
+ pose: FacePose;
105
+ bbox: NormalizedRect;
106
+ quality: FaceQuality;
107
+ }
108
+ export interface CameraConfig {
109
+ facingMode?: "user" | "environment";
110
+ width?: number;
111
+ height?: number;
112
+ frameRate?: number;
113
+ mirror?: boolean;
114
+ }
115
+ /** Adapter-defined WeChat frame payload — left opaque to the core. */
116
+ export interface WechatFrameInput {
117
+ [key: string]: unknown;
118
+ }
119
+ export type FrameInput = {
120
+ readonly __brand: "HTMLVideoElement";
121
+ el: unknown;
122
+ } | {
123
+ readonly __brand: "HTMLCanvasElement";
124
+ el: unknown;
125
+ } | {
126
+ readonly __brand: "ImageData";
127
+ el: unknown;
128
+ } | Uint8Array | WechatFrameInput;
129
+ export interface ICameraProvider {
130
+ initialize(config?: CameraConfig): Promise<void>;
131
+ start(): Promise<void>;
132
+ stop(): void;
133
+ getCurrentFrame(): FrameInput | null;
134
+ switchCamera?(): Promise<void>;
135
+ destroy(): void;
136
+ }
137
+ export type TrackingMode = "realtime" | "balanced" | "batterySaver";
138
+ export interface TrackerConfig {
139
+ mode: TrackingMode;
140
+ maxFaces?: number;
141
+ minFaceDetectionConfidence?: number;
142
+ minFacePresenceConfidence?: number;
143
+ minTrackingConfidence?: number;
144
+ enableTransformationMatrix?: boolean;
145
+ worker?: boolean;
146
+ }
147
+ export interface IFaceTracker {
148
+ initialize(config?: TrackerConfig): Promise<void>;
149
+ detect(frame: FrameInput): Promise<NormalizedFaceResult | null>;
150
+ detectImage?(input: unknown): Promise<NormalizedFaceResult | null>;
151
+ destroy(): void;
152
+ }
153
+ export interface WechatCanvasTarget {
154
+ [key: string]: unknown;
155
+ }
156
+ export type RenderTarget = HTMLCanvasElement | {
157
+ readonly __brand: "HTMLCanvasElement";
158
+ el: unknown;
159
+ } | string | WechatCanvasTarget;
160
+ export interface RenderOptions {
161
+ width: number;
162
+ height: number;
163
+ mirror?: boolean;
164
+ background?: "transparent" | "camera" | string;
165
+ pixelRatio?: number;
166
+ antialias?: boolean;
167
+ maxTextureSize?: number;
168
+ }
169
+ export interface IRenderer {
170
+ initialize(target: RenderTarget, options?: RenderOptions): Promise<void>;
171
+ loadGlasses(asset: GlassesAssetManifest): Promise<void>;
172
+ applyPose(pose: GlassesPose): void;
173
+ setVisible(visible: boolean): void;
174
+ snapshot(options?: SnapshotOptions): Promise<SnapshotResult>;
175
+ resize(width: number, height: number): void;
176
+ dispose(): void;
177
+ }
178
+ export type GlassesShape = "round" | "oval" | "rectangle" | "square" | "cat-eye" | "aviator" | "browline" | "rimless";
179
+ export interface GlassesAssetManifest {
180
+ id: string;
181
+ name: string;
182
+ modelUrl: string;
183
+ thumbnailUrl?: string;
184
+ format: "glb" | "gltf";
185
+ coordinateSystem: {
186
+ unit: "millimeter" | "centimeter" | "meter";
187
+ forwardAxis: "+z" | "-z";
188
+ upAxis: "+y" | "+z";
189
+ };
190
+ dimensions: {
191
+ frameWidthMm: number;
192
+ lensWidthMm?: number;
193
+ lensHeightMm?: number;
194
+ bridgeWidthMm?: number;
195
+ templeLengthMm?: number;
196
+ };
197
+ anchors: {
198
+ origin: Vector3;
199
+ noseBridge: Vector3;
200
+ leftHinge?: Vector3;
201
+ rightHinge?: Vector3;
202
+ leftLensCenter?: Vector3;
203
+ rightLensCenter?: Vector3;
204
+ };
205
+ fitting: {
206
+ defaultScale: number;
207
+ defaultOffset: Vector3;
208
+ defaultRotation: Vector3;
209
+ minScale?: number;
210
+ maxScale?: number;
211
+ /** Default fitting strategy hints mirrored from GlassesFittingConfig. */
212
+ fitBy?: "eyeOuterDistance" | "eyeCenterDistance" | "faceWidth";
213
+ verticalAnchor?: "noseBridge" | "eyeLine" | "browLine";
214
+ };
215
+ material: {
216
+ lensOpacity?: number;
217
+ lensColor?: string;
218
+ frameColor?: string;
219
+ frameMaterial?: string;
220
+ frameRoughness?: number;
221
+ frameMetalness?: number;
222
+ supportsTransparency?: boolean;
223
+ };
224
+ metadata?: {
225
+ brand?: string;
226
+ shapeCategory?: GlassesShape;
227
+ colors?: string[];
228
+ tags?: string[];
229
+ price?: number;
230
+ currency?: string;
231
+ };
232
+ }
233
+ export interface GlassesPose {
234
+ position: Vector3;
235
+ rotation: Vector3;
236
+ scale: Vector3;
237
+ visible: boolean;
238
+ confidence: number;
239
+ reason?: string;
240
+ }
241
+ export interface GlassesFittingConfig {
242
+ scaleMultiplier?: number;
243
+ positionOffset?: Vector3;
244
+ rotationOffset?: Vector3;
245
+ useTransformationMatrix?: boolean;
246
+ fitBy?: "eyeOuterDistance" | "eyeCenterDistance" | "faceWidth";
247
+ verticalAnchor?: "noseBridge" | "eyeLine" | "browLine";
248
+ depthStrategy?: "noseTip" | "matrix" | "fixed";
249
+ }
250
+ export interface GlassesPoseSolverInput {
251
+ face: NormalizedFaceResult;
252
+ asset: GlassesAssetManifest;
253
+ config?: GlassesFittingConfig;
254
+ }
255
+ export interface PoseSmoothingConfig {
256
+ enabled: boolean;
257
+ positionLerp: number;
258
+ rotationLerp: number;
259
+ scaleLerp: number;
260
+ jitterThreshold: number;
261
+ lostTrackingDelayMs: number;
262
+ }
263
+ export type QualityGateMode = "analysis" | "tryon" | "snapshot";
264
+ export interface QualityGateInput {
265
+ face: NormalizedFaceResult;
266
+ mode: QualityGateMode;
267
+ }
268
+ export interface QualityGateResult {
269
+ passed: boolean;
270
+ score: number;
271
+ warnings: FaceQualityWarning[];
272
+ }
273
+ export interface FaceMetrics {
274
+ faceWidth: number;
275
+ faceHeight: number;
276
+ cheekboneWidth: number;
277
+ jawWidth: number;
278
+ foreheadWidth?: number;
279
+ faceOutlineWidth?: number;
280
+ eyeOuterDistance: number;
281
+ eyeInnerDistance: number;
282
+ eyeCenterDistance: number;
283
+ noseBridgeToEyeLine: number;
284
+ noseBridgeWidth?: number;
285
+ widthHeightRatio: number;
286
+ jawCheekRatio: number;
287
+ foreheadCheekRatio?: number;
288
+ /** Eye line tilt in degrees (0 = level). Positive = right higher. */
289
+ eyeLineTiltDeg?: number;
290
+ /** Symmetry offset: nose bridge deviation from face center (0..1, 0 = perfect). */
291
+ symmetryOffset?: number;
292
+ /** Face span: max(width, height) of bounding box in normalized coords. */
293
+ faceSpan?: number;
294
+ chinType: "pointed" | "rounded" | "square" | "unknown";
295
+ measurementQuality: number;
296
+ /**
297
+ * visutry-compatible ratios (2D distances, no z-component).
298
+ * These match the exact computation from visutry's analyzeFaceLandmarks().
299
+ */
300
+ visutry?: {
301
+ faceAspectRatio: number;
302
+ cheekToFaceWidth: number;
303
+ jawToCheekWidth: number;
304
+ foreheadToCheekWidth: number;
305
+ eyeLineTiltDeg: number;
306
+ symmetryOffset: number;
307
+ noseBridgeToFaceWidth: number;
308
+ };
309
+ }
310
+ export interface FaceAnalysisConfig {
311
+ sampleFrames?: number;
312
+ sampleIntervalMs?: number;
313
+ requireFrontal?: boolean;
314
+ }
315
+ export interface FaceAnalysisInput {
316
+ source?: FaceResultSource;
317
+ frames?: NormalizedFaceResult[];
318
+ config?: FaceAnalysisConfig;
319
+ }
320
+ export type FaceShape = "oval" | "round" | "square" | "heart" | "diamond" | "oblong" | "triangle" | "unknown";
321
+ export interface FaceShapeCandidate {
322
+ shape: FaceShape;
323
+ score: number;
324
+ reasons: string[];
325
+ }
326
+ export interface FaceShapeResult {
327
+ primary: FaceShape;
328
+ candidates: FaceShapeCandidate[];
329
+ confidence: number;
330
+ metrics: FaceMetrics;
331
+ warnings: FaceQualityWarning[];
332
+ version: string;
333
+ }
334
+ export interface UserPreferences {
335
+ brands?: string[];
336
+ maxPrice?: number;
337
+ preferredShapes?: GlassesShape[];
338
+ preferredMaterials?: string[];
339
+ preferredColors?: string[];
340
+ style?: "business" | "casual" | "fashion" | "sport";
341
+ }
342
+ export interface GlassesItem {
343
+ id: string;
344
+ name: string;
345
+ brand?: string;
346
+ thumbnailUrl: string;
347
+ modelUrl?: string;
348
+ manifest?: GlassesAssetManifest;
349
+ shapeCategory: GlassesShape;
350
+ dimensions?: {
351
+ frameWidthMm?: number;
352
+ lensWidthMm?: number;
353
+ lensHeightMm?: number;
354
+ bridgeWidthMm?: number;
355
+ };
356
+ material?: string;
357
+ colors?: string[];
358
+ price?: number;
359
+ }
360
+ export interface RecommendationInput {
361
+ faceShape: FaceShapeResult;
362
+ faceMetrics?: FaceMetrics;
363
+ preferences?: UserPreferences;
364
+ inventory: GlassesItem[];
365
+ }
366
+ export interface RecommendedGlasses {
367
+ item: GlassesItem;
368
+ score: number;
369
+ reasons: string[];
370
+ cautions?: string[];
371
+ }
372
+ export interface SnapshotOptions {
373
+ format?: "image/png" | "image/jpeg" | "image/webp";
374
+ quality?: number;
375
+ mirror?: boolean;
376
+ width?: number;
377
+ height?: number;
378
+ }
379
+ export interface SnapshotResult {
380
+ dataUrl: string;
381
+ blob?: Blob;
382
+ width: number;
383
+ height: number;
384
+ timestamp: number;
385
+ }
386
+ export interface PerformanceStats {
387
+ fps: number;
388
+ detectLatencyMs: number;
389
+ renderLatencyMs: number;
390
+ trackingLostCount: number;
391
+ mode: TrackingMode;
392
+ memoryMB?: number;
393
+ }
394
+ export type SDKErrorCode = "CAMERA_PERMISSION_DENIED" | "CAMERA_NOT_AVAILABLE" | "TRACKER_INIT_FAILED" | "TRACKER_DETECT_FAILED" | "RENDERER_INIT_FAILED" | "GLASSES_LOAD_FAILED" | "UNSUPPORTED_PLATFORM" | "LOW_PERFORMANCE" | "SNAPSHOT_FAILED" | "UNKNOWN";
395
+ export interface SDKError {
396
+ code: SDKErrorCode;
397
+ message: string;
398
+ cause?: unknown;
399
+ recoverable: boolean;
400
+ }
401
+ export interface PrivacyConfig {
402
+ processOnDeviceOnly: true;
403
+ allowSnapshotExport?: boolean;
404
+ allowAnalytics?: boolean;
405
+ analyticsLevel?: "none" | "performance" | "diagnostic";
406
+ }
407
+ export interface VisuTrySDKEvents {
408
+ ready: () => void;
409
+ faceDetected: (face: NormalizedFaceResult) => void;
410
+ faceLost: () => void;
411
+ poseUpdated: (pose: GlassesPose) => void;
412
+ glassesLoaded: (asset: GlassesAssetManifest) => void;
413
+ glassesLoadFailed: (error: SDKError) => void;
414
+ faceShapeAnalyzed: (result: FaceShapeResult) => void;
415
+ performanceUpdated: (stats: PerformanceStats) => void;
416
+ error: (error: SDKError) => void;
417
+ }
418
+ export interface VisuTrySDK {
419
+ initialize(): Promise<void>;
420
+ startCamera(): Promise<void>;
421
+ stopCamera(): void;
422
+ startTryOn(): Promise<void>;
423
+ stopTryOn(): void;
424
+ loadGlasses(asset: GlassesAssetManifest): Promise<void>;
425
+ switchGlasses(asset: GlassesAssetManifest): Promise<void>;
426
+ analyzeFaceShape(input?: FaceAnalysisInput): Promise<FaceShapeResult>;
427
+ analyzeFaceShapeFromImage(image: unknown): Promise<FaceShapeResult>;
428
+ snapshot(options?: SnapshotOptions): Promise<SnapshotResult>;
429
+ on<EventName extends keyof VisuTrySDKEvents>(eventName: EventName, handler: VisuTrySDKEvents[EventName]): void;
430
+ off<EventName extends keyof VisuTrySDKEvents>(eventName: EventName, handler: VisuTrySDKEvents[EventName]): void;
431
+ getPerformanceStats(): PerformanceStats;
432
+ destroy(): void;
433
+ }
434
+ /** Configuration passed to the platform SDK factory (web / wechat). */
435
+ export interface VisuTrySDKConfig {
436
+ camera?: CameraConfig;
437
+ tracker?: TrackerConfig;
438
+ renderer?: RenderOptions;
439
+ privacy?: PrivacyConfig;
440
+ smoothing?: Partial<PoseSmoothingConfig>;
441
+ fitting?: GlassesFittingConfig;
442
+ }
443
+ export type CoordinateSystemType = "pixel-image" | "normalized-image" | "render-world" | "glasses-local";
444
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}