@pose-tracker/pose-estimation-web-react 0.1.0 → 0.3.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/README.md +2 -0
- package/dist/index.cjs +54 -2
- package/dist/index.d.cts +21 -4
- package/dist/index.d.ts +21 -4
- package/dist/index.js +39 -3
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -17,6 +17,8 @@ import {
|
|
|
17
17
|
function Screen() {
|
|
18
18
|
usePoseTracker({ onKeypoints: (e) => console.log(e.keypoints.length) });
|
|
19
19
|
return <PoseCamera style={{ height: 480 }} />;
|
|
20
|
+
// Video / image: <PoseCamera source="image" sourceFile={file} />
|
|
21
|
+
// or sourceUrl — see docs/MEDIA_SOURCES.md · https://docs.posetracker.com/media-sources
|
|
20
22
|
}
|
|
21
23
|
|
|
22
24
|
export function App() {
|
package/dist/index.cjs
CHANGED
|
@@ -8,16 +8,23 @@ var jsxRuntime = require('react/jsx-runtime');
|
|
|
8
8
|
var PoseTrackerContext = react.createContext(null);
|
|
9
9
|
function PoseTrackerProvider({
|
|
10
10
|
apiToken,
|
|
11
|
+
engine,
|
|
11
12
|
options,
|
|
12
13
|
autoStart = true,
|
|
13
14
|
autoPreload = false,
|
|
14
15
|
children
|
|
15
16
|
}) {
|
|
16
17
|
const merged = react.useMemo(
|
|
17
|
-
() => ({
|
|
18
|
+
() => ({
|
|
19
|
+
...options,
|
|
20
|
+
apiToken: apiToken ?? options?.apiToken,
|
|
21
|
+
engine: engine ?? options?.engine
|
|
22
|
+
}),
|
|
18
23
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
19
24
|
[
|
|
20
25
|
apiToken,
|
|
26
|
+
engine,
|
|
27
|
+
options?.engine,
|
|
21
28
|
options?.model,
|
|
22
29
|
options?.modelUrl,
|
|
23
30
|
options?.facingMode,
|
|
@@ -76,6 +83,12 @@ function PoseTrackerProvider({
|
|
|
76
83
|
(model, modelUrl) => client.setModel(model, modelUrl),
|
|
77
84
|
[client]
|
|
78
85
|
);
|
|
86
|
+
const setSource = react.useCallback(
|
|
87
|
+
(...args) => client.setSource(...args),
|
|
88
|
+
[client]
|
|
89
|
+
);
|
|
90
|
+
const analyze = react.useCallback(() => client.analyze(), [client]);
|
|
91
|
+
const getSource = react.useCallback(() => client.getSource(), [client]);
|
|
79
92
|
const getAvailableExercises = react.useCallback(() => client.getAvailableExercises(), [client]);
|
|
80
93
|
const getAvailableCustomExercises = react.useCallback(
|
|
81
94
|
() => client.getAvailableCustomExercises(),
|
|
@@ -106,6 +119,9 @@ function PoseTrackerProvider({
|
|
|
106
119
|
startExercise,
|
|
107
120
|
stopExercise,
|
|
108
121
|
setModel,
|
|
122
|
+
setSource,
|
|
123
|
+
analyze,
|
|
124
|
+
getSource,
|
|
109
125
|
getAvailableExercises,
|
|
110
126
|
getAvailableCustomExercises,
|
|
111
127
|
addEventListener,
|
|
@@ -127,6 +143,9 @@ function PoseTrackerProvider({
|
|
|
127
143
|
startExercise,
|
|
128
144
|
stopExercise,
|
|
129
145
|
setModel,
|
|
146
|
+
setSource,
|
|
147
|
+
analyze,
|
|
148
|
+
getSource,
|
|
130
149
|
getAvailableExercises,
|
|
131
150
|
getAvailableCustomExercises,
|
|
132
151
|
addEventListener,
|
|
@@ -150,6 +169,9 @@ function PoseCamera({
|
|
|
150
169
|
style,
|
|
151
170
|
className,
|
|
152
171
|
position,
|
|
172
|
+
source,
|
|
173
|
+
sourceUrl,
|
|
174
|
+
sourceFile,
|
|
153
175
|
drawSkeleton,
|
|
154
176
|
drawPlacementBox,
|
|
155
177
|
placementPaddingPercent,
|
|
@@ -170,6 +192,9 @@ function PoseCamera({
|
|
|
170
192
|
if (!el) return;
|
|
171
193
|
client.updateOptions({
|
|
172
194
|
...position ? { position } : {},
|
|
195
|
+
...source !== void 0 ? { source } : {},
|
|
196
|
+
...sourceUrl !== void 0 ? { sourceUrl } : {},
|
|
197
|
+
...sourceFile !== void 0 ? { sourceFile } : {},
|
|
173
198
|
...typeof drawSkeleton === "boolean" ? { drawSkeleton } : {},
|
|
174
199
|
...typeof drawPlacementBox === "boolean" ? { drawPlacementBox } : {},
|
|
175
200
|
...typeof placementPaddingPercent === "number" ? { placementPaddingPercent } : {},
|
|
@@ -184,7 +209,13 @@ function PoseCamera({
|
|
|
184
209
|
const shouldStart = autoStartProp ?? providerAutoStart;
|
|
185
210
|
if (shouldStart && !startedRef.current) {
|
|
186
211
|
startedRef.current = true;
|
|
187
|
-
|
|
212
|
+
const boot = async () => {
|
|
213
|
+
if (source !== void 0) {
|
|
214
|
+
await client.setSource(source, { sourceUrl, sourceFile });
|
|
215
|
+
}
|
|
216
|
+
await client.start();
|
|
217
|
+
};
|
|
218
|
+
boot().catch(() => {
|
|
188
219
|
});
|
|
189
220
|
}
|
|
190
221
|
return () => {
|
|
@@ -193,6 +224,11 @@ function PoseCamera({
|
|
|
193
224
|
_registerMountHost(null);
|
|
194
225
|
};
|
|
195
226
|
}, [client]);
|
|
227
|
+
react.useEffect(() => {
|
|
228
|
+
if (!startedRef.current || source === void 0) return;
|
|
229
|
+
void client.setSource(source, { sourceUrl, sourceFile }).catch(() => {
|
|
230
|
+
});
|
|
231
|
+
}, [client, source, sourceUrl, sourceFile]);
|
|
196
232
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
197
233
|
"div",
|
|
198
234
|
{
|
|
@@ -316,10 +352,26 @@ Object.defineProperty(exports, "SDK_VERSION", {
|
|
|
316
352
|
enumerable: true,
|
|
317
353
|
get: function () { return poseEstimationWeb.SDK_VERSION; }
|
|
318
354
|
});
|
|
355
|
+
Object.defineProperty(exports, "V4_ONLY_EXERCISE_IDS", {
|
|
356
|
+
enumerable: true,
|
|
357
|
+
get: function () { return poseEstimationWeb.V4_ONLY_EXERCISE_IDS; }
|
|
358
|
+
});
|
|
319
359
|
Object.defineProperty(exports, "createPoseTracker", {
|
|
320
360
|
enumerable: true,
|
|
321
361
|
get: function () { return poseEstimationWeb.createPoseTracker; }
|
|
322
362
|
});
|
|
363
|
+
Object.defineProperty(exports, "normalizeEngineChannel", {
|
|
364
|
+
enumerable: true,
|
|
365
|
+
get: function () { return poseEstimationWeb.normalizeEngineChannel; }
|
|
366
|
+
});
|
|
367
|
+
Object.defineProperty(exports, "normalizePoseSource", {
|
|
368
|
+
enumerable: true,
|
|
369
|
+
get: function () { return poseEstimationWeb.normalizePoseSource; }
|
|
370
|
+
});
|
|
371
|
+
Object.defineProperty(exports, "requiresEngineV4", {
|
|
372
|
+
enumerable: true,
|
|
373
|
+
get: function () { return poseEstimationWeb.requiresEngineV4; }
|
|
374
|
+
});
|
|
323
375
|
Object.defineProperty(exports, "resolvePoseModel", {
|
|
324
376
|
enumerable: true,
|
|
325
377
|
get: function () { return poseEstimationWeb.resolvePoseModel; }
|
package/dist/index.d.cts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { PoseTrackerClient, PoseTrackerStatus, PoseTrackerMode, ErrorEvent, SdkManifest, ExerciseConfig, PreloadOptions, StartExerciseOptions, PoseTrackerClientOptions, PoseTrackerEventListener, ClassicNativeMessage, SkeletonDefinition, PoseTrackerCallbacks } from '@pose-tracker/pose-estimation-web';
|
|
2
|
-
export { COCO_KEYPOINT_NAMES, ColdStartMode, CounterEvent, DEFAULT_LOADING_TEXT, DEFAULT_MOVENET_LIGHTNING_URL, ErrorEvent, ExerciseConfig, InitializationEvent, Keypoint, KeypointsEvent, Pose, PoseModelAlias, PoseTracker, PoseTrackerCallbacks, PoseTrackerClient, PoseTrackerClientOptions, PoseTrackerOptions, PostureEvent, PreloadOptions, SDK_NAME, SDK_VERSION, SdkManifest, StartExerciseOptions, createPoseTracker, resolvePoseModel, shouldShowWatermark } from '@pose-tracker/pose-estimation-web';
|
|
1
|
+
import { PoseTrackerClient, PoseTrackerStatus, PoseTrackerMode, ErrorEvent, SdkManifest, ExerciseConfig, PreloadOptions, StartExerciseOptions, PoseTrackerClientOptions, PoseTrackerEventListener, ClassicNativeMessage, PoseSource, PoseSourceType, SkeletonDefinition, PoseTrackerCallbacks } from '@pose-tracker/pose-estimation-web';
|
|
2
|
+
export { COCO_KEYPOINT_NAMES, ColdStartMode, CounterEvent, DEFAULT_LOADING_TEXT, DEFAULT_MOVENET_LIGHTNING_URL, EngineChannel, ErrorEvent, ExerciseConfig, InitializationEvent, Keypoint, KeypointsEvent, Pose, PoseModelAlias, PoseSource, PoseSourceType, PoseTracker, PoseTrackerCallbacks, PoseTrackerClient, PoseTrackerClientOptions, PoseTrackerOptions, PostureEvent, PreloadOptions, SDK_NAME, SDK_VERSION, SdkManifest, StartExerciseOptions, V4_ONLY_EXERCISE_IDS, createPoseTracker, normalizeEngineChannel, normalizePoseSource, requiresEngineV4, resolvePoseModel, shouldShowWatermark } from '@pose-tracker/pose-estimation-web';
|
|
3
3
|
import React from 'react';
|
|
4
4
|
|
|
5
5
|
/**
|
|
@@ -20,6 +20,9 @@ interface PoseTrackerContextValue {
|
|
|
20
20
|
startExercise: (exerciseId: string, options?: StartExerciseOptions) => void;
|
|
21
21
|
stopExercise: () => void;
|
|
22
22
|
setModel: (model?: PoseTrackerClientOptions['model'], modelUrl?: string) => Promise<void>;
|
|
23
|
+
setSource: PoseTrackerClient['setSource'];
|
|
24
|
+
analyze: PoseTrackerClient['analyze'];
|
|
25
|
+
getSource: PoseTrackerClient['getSource'];
|
|
23
26
|
getAvailableExercises: () => ExerciseConfig[];
|
|
24
27
|
getAvailableCustomExercises: () => ReturnType<PoseTrackerClient['getAvailableCustomExercises']>;
|
|
25
28
|
addEventListener: (listener: PoseTrackerEventListener) => () => void;
|
|
@@ -32,6 +35,10 @@ interface PoseTrackerContextValue {
|
|
|
32
35
|
}
|
|
33
36
|
interface PoseTrackerProviderProps {
|
|
34
37
|
apiToken?: string;
|
|
38
|
+
/**
|
|
39
|
+
* Opt-in V4 engine (`'v4'`). Default `'v3'` — production FSM, unchanged.
|
|
40
|
+
*/
|
|
41
|
+
engine?: 'v3' | 'v4';
|
|
35
42
|
options?: PoseTrackerClientOptions;
|
|
36
43
|
/**
|
|
37
44
|
* When true, PoseCamera calls `start()` after mount (full cold start).
|
|
@@ -42,7 +49,7 @@ interface PoseTrackerProviderProps {
|
|
|
42
49
|
autoPreload?: boolean;
|
|
43
50
|
children: React.ReactNode;
|
|
44
51
|
}
|
|
45
|
-
declare function PoseTrackerProvider({ apiToken, options, autoStart, autoPreload, children, }: PoseTrackerProviderProps): React.JSX.Element;
|
|
52
|
+
declare function PoseTrackerProvider({ apiToken, engine, options, autoStart, autoPreload, children, }: PoseTrackerProviderProps): React.JSX.Element;
|
|
46
53
|
declare function usePoseTrackerContext(): PoseTrackerContextValue;
|
|
47
54
|
|
|
48
55
|
interface PoseCameraProps {
|
|
@@ -51,6 +58,16 @@ interface PoseCameraProps {
|
|
|
51
58
|
className?: string;
|
|
52
59
|
/** 'front' | 'back' — mapped to getUserMedia facingMode. Default front. */
|
|
53
60
|
position?: 'front' | 'back';
|
|
61
|
+
/**
|
|
62
|
+
* Input mode. Default `camera`.
|
|
63
|
+
* Pass a full {@link PoseSource} or `'camera' | 'video' | 'image'` with
|
|
64
|
+
* `sourceUrl` / `sourceFile`.
|
|
65
|
+
*/
|
|
66
|
+
source?: PoseSource | PoseSourceType;
|
|
67
|
+
/** URL / object URL for `source: 'video' | 'image'`. */
|
|
68
|
+
sourceUrl?: string;
|
|
69
|
+
/** File/Blob for `source: 'video' | 'image'`. */
|
|
70
|
+
sourceFile?: File | Blob;
|
|
54
71
|
/** Draw navy/gold skeleton overlay. Default true. */
|
|
55
72
|
drawSkeleton?: boolean;
|
|
56
73
|
/** Placement guide while posture.ready === false. Default true. */
|
|
@@ -78,7 +95,7 @@ interface PoseCameraProps {
|
|
|
78
95
|
* Browser camera + canvas overlay (web equivalent of RN `WebViewPoseView`).
|
|
79
96
|
* Must be rendered under {@link PoseTrackerProvider}.
|
|
80
97
|
*/
|
|
81
|
-
declare function PoseCamera({ style, className, position, drawSkeleton, drawPlacementBox, placementPaddingPercent, coldStart, loadingText, showWatermark, skeletonDef, skeletonUuid, debugHud, autoStart: autoStartProp, }: PoseCameraProps): React.JSX.Element;
|
|
98
|
+
declare function PoseCamera({ style, className, position, source, sourceUrl, sourceFile, drawSkeleton, drawPlacementBox, placementPaddingPercent, coldStart, loadingText, showWatermark, skeletonDef, skeletonUuid, debugHud, autoStart: autoStartProp, }: PoseCameraProps): React.JSX.Element;
|
|
82
99
|
|
|
83
100
|
/**
|
|
84
101
|
* Access the PoseTracker pipeline and subscribe to typed events (RN light parity).
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { PoseTrackerClient, PoseTrackerStatus, PoseTrackerMode, ErrorEvent, SdkManifest, ExerciseConfig, PreloadOptions, StartExerciseOptions, PoseTrackerClientOptions, PoseTrackerEventListener, ClassicNativeMessage, SkeletonDefinition, PoseTrackerCallbacks } from '@pose-tracker/pose-estimation-web';
|
|
2
|
-
export { COCO_KEYPOINT_NAMES, ColdStartMode, CounterEvent, DEFAULT_LOADING_TEXT, DEFAULT_MOVENET_LIGHTNING_URL, ErrorEvent, ExerciseConfig, InitializationEvent, Keypoint, KeypointsEvent, Pose, PoseModelAlias, PoseTracker, PoseTrackerCallbacks, PoseTrackerClient, PoseTrackerClientOptions, PoseTrackerOptions, PostureEvent, PreloadOptions, SDK_NAME, SDK_VERSION, SdkManifest, StartExerciseOptions, createPoseTracker, resolvePoseModel, shouldShowWatermark } from '@pose-tracker/pose-estimation-web';
|
|
1
|
+
import { PoseTrackerClient, PoseTrackerStatus, PoseTrackerMode, ErrorEvent, SdkManifest, ExerciseConfig, PreloadOptions, StartExerciseOptions, PoseTrackerClientOptions, PoseTrackerEventListener, ClassicNativeMessage, PoseSource, PoseSourceType, SkeletonDefinition, PoseTrackerCallbacks } from '@pose-tracker/pose-estimation-web';
|
|
2
|
+
export { COCO_KEYPOINT_NAMES, ColdStartMode, CounterEvent, DEFAULT_LOADING_TEXT, DEFAULT_MOVENET_LIGHTNING_URL, EngineChannel, ErrorEvent, ExerciseConfig, InitializationEvent, Keypoint, KeypointsEvent, Pose, PoseModelAlias, PoseSource, PoseSourceType, PoseTracker, PoseTrackerCallbacks, PoseTrackerClient, PoseTrackerClientOptions, PoseTrackerOptions, PostureEvent, PreloadOptions, SDK_NAME, SDK_VERSION, SdkManifest, StartExerciseOptions, V4_ONLY_EXERCISE_IDS, createPoseTracker, normalizeEngineChannel, normalizePoseSource, requiresEngineV4, resolvePoseModel, shouldShowWatermark } from '@pose-tracker/pose-estimation-web';
|
|
3
3
|
import React from 'react';
|
|
4
4
|
|
|
5
5
|
/**
|
|
@@ -20,6 +20,9 @@ interface PoseTrackerContextValue {
|
|
|
20
20
|
startExercise: (exerciseId: string, options?: StartExerciseOptions) => void;
|
|
21
21
|
stopExercise: () => void;
|
|
22
22
|
setModel: (model?: PoseTrackerClientOptions['model'], modelUrl?: string) => Promise<void>;
|
|
23
|
+
setSource: PoseTrackerClient['setSource'];
|
|
24
|
+
analyze: PoseTrackerClient['analyze'];
|
|
25
|
+
getSource: PoseTrackerClient['getSource'];
|
|
23
26
|
getAvailableExercises: () => ExerciseConfig[];
|
|
24
27
|
getAvailableCustomExercises: () => ReturnType<PoseTrackerClient['getAvailableCustomExercises']>;
|
|
25
28
|
addEventListener: (listener: PoseTrackerEventListener) => () => void;
|
|
@@ -32,6 +35,10 @@ interface PoseTrackerContextValue {
|
|
|
32
35
|
}
|
|
33
36
|
interface PoseTrackerProviderProps {
|
|
34
37
|
apiToken?: string;
|
|
38
|
+
/**
|
|
39
|
+
* Opt-in V4 engine (`'v4'`). Default `'v3'` — production FSM, unchanged.
|
|
40
|
+
*/
|
|
41
|
+
engine?: 'v3' | 'v4';
|
|
35
42
|
options?: PoseTrackerClientOptions;
|
|
36
43
|
/**
|
|
37
44
|
* When true, PoseCamera calls `start()` after mount (full cold start).
|
|
@@ -42,7 +49,7 @@ interface PoseTrackerProviderProps {
|
|
|
42
49
|
autoPreload?: boolean;
|
|
43
50
|
children: React.ReactNode;
|
|
44
51
|
}
|
|
45
|
-
declare function PoseTrackerProvider({ apiToken, options, autoStart, autoPreload, children, }: PoseTrackerProviderProps): React.JSX.Element;
|
|
52
|
+
declare function PoseTrackerProvider({ apiToken, engine, options, autoStart, autoPreload, children, }: PoseTrackerProviderProps): React.JSX.Element;
|
|
46
53
|
declare function usePoseTrackerContext(): PoseTrackerContextValue;
|
|
47
54
|
|
|
48
55
|
interface PoseCameraProps {
|
|
@@ -51,6 +58,16 @@ interface PoseCameraProps {
|
|
|
51
58
|
className?: string;
|
|
52
59
|
/** 'front' | 'back' — mapped to getUserMedia facingMode. Default front. */
|
|
53
60
|
position?: 'front' | 'back';
|
|
61
|
+
/**
|
|
62
|
+
* Input mode. Default `camera`.
|
|
63
|
+
* Pass a full {@link PoseSource} or `'camera' | 'video' | 'image'` with
|
|
64
|
+
* `sourceUrl` / `sourceFile`.
|
|
65
|
+
*/
|
|
66
|
+
source?: PoseSource | PoseSourceType;
|
|
67
|
+
/** URL / object URL for `source: 'video' | 'image'`. */
|
|
68
|
+
sourceUrl?: string;
|
|
69
|
+
/** File/Blob for `source: 'video' | 'image'`. */
|
|
70
|
+
sourceFile?: File | Blob;
|
|
54
71
|
/** Draw navy/gold skeleton overlay. Default true. */
|
|
55
72
|
drawSkeleton?: boolean;
|
|
56
73
|
/** Placement guide while posture.ready === false. Default true. */
|
|
@@ -78,7 +95,7 @@ interface PoseCameraProps {
|
|
|
78
95
|
* Browser camera + canvas overlay (web equivalent of RN `WebViewPoseView`).
|
|
79
96
|
* Must be rendered under {@link PoseTrackerProvider}.
|
|
80
97
|
*/
|
|
81
|
-
declare function PoseCamera({ style, className, position, drawSkeleton, drawPlacementBox, placementPaddingPercent, coldStart, loadingText, showWatermark, skeletonDef, skeletonUuid, debugHud, autoStart: autoStartProp, }: PoseCameraProps): React.JSX.Element;
|
|
98
|
+
declare function PoseCamera({ style, className, position, source, sourceUrl, sourceFile, drawSkeleton, drawPlacementBox, placementPaddingPercent, coldStart, loadingText, showWatermark, skeletonDef, skeletonUuid, debugHud, autoStart: autoStartProp, }: PoseCameraProps): React.JSX.Element;
|
|
82
99
|
|
|
83
100
|
/**
|
|
84
101
|
* Access the PoseTracker pipeline and subscribe to typed events (RN light parity).
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createPoseTracker } from '@pose-tracker/pose-estimation-web';
|
|
2
|
-
export { COCO_KEYPOINT_NAMES, DEFAULT_LOADING_TEXT, DEFAULT_MOVENET_LIGHTNING_URL, PoseTrackerClient, SDK_NAME, SDK_VERSION, createPoseTracker, resolvePoseModel, shouldShowWatermark } from '@pose-tracker/pose-estimation-web';
|
|
2
|
+
export { COCO_KEYPOINT_NAMES, DEFAULT_LOADING_TEXT, DEFAULT_MOVENET_LIGHTNING_URL, PoseTrackerClient, SDK_NAME, SDK_VERSION, V4_ONLY_EXERCISE_IDS, createPoseTracker, normalizeEngineChannel, normalizePoseSource, requiresEngineV4, resolvePoseModel, shouldShowWatermark } from '@pose-tracker/pose-estimation-web';
|
|
3
3
|
import { createContext, useMemo, useRef, useState, useEffect, useCallback, useContext } from 'react';
|
|
4
4
|
import { jsx } from 'react/jsx-runtime';
|
|
5
5
|
|
|
@@ -7,16 +7,23 @@ import { jsx } from 'react/jsx-runtime';
|
|
|
7
7
|
var PoseTrackerContext = createContext(null);
|
|
8
8
|
function PoseTrackerProvider({
|
|
9
9
|
apiToken,
|
|
10
|
+
engine,
|
|
10
11
|
options,
|
|
11
12
|
autoStart = true,
|
|
12
13
|
autoPreload = false,
|
|
13
14
|
children
|
|
14
15
|
}) {
|
|
15
16
|
const merged = useMemo(
|
|
16
|
-
() => ({
|
|
17
|
+
() => ({
|
|
18
|
+
...options,
|
|
19
|
+
apiToken: apiToken ?? options?.apiToken,
|
|
20
|
+
engine: engine ?? options?.engine
|
|
21
|
+
}),
|
|
17
22
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
18
23
|
[
|
|
19
24
|
apiToken,
|
|
25
|
+
engine,
|
|
26
|
+
options?.engine,
|
|
20
27
|
options?.model,
|
|
21
28
|
options?.modelUrl,
|
|
22
29
|
options?.facingMode,
|
|
@@ -75,6 +82,12 @@ function PoseTrackerProvider({
|
|
|
75
82
|
(model, modelUrl) => client.setModel(model, modelUrl),
|
|
76
83
|
[client]
|
|
77
84
|
);
|
|
85
|
+
const setSource = useCallback(
|
|
86
|
+
(...args) => client.setSource(...args),
|
|
87
|
+
[client]
|
|
88
|
+
);
|
|
89
|
+
const analyze = useCallback(() => client.analyze(), [client]);
|
|
90
|
+
const getSource = useCallback(() => client.getSource(), [client]);
|
|
78
91
|
const getAvailableExercises = useCallback(() => client.getAvailableExercises(), [client]);
|
|
79
92
|
const getAvailableCustomExercises = useCallback(
|
|
80
93
|
() => client.getAvailableCustomExercises(),
|
|
@@ -105,6 +118,9 @@ function PoseTrackerProvider({
|
|
|
105
118
|
startExercise,
|
|
106
119
|
stopExercise,
|
|
107
120
|
setModel,
|
|
121
|
+
setSource,
|
|
122
|
+
analyze,
|
|
123
|
+
getSource,
|
|
108
124
|
getAvailableExercises,
|
|
109
125
|
getAvailableCustomExercises,
|
|
110
126
|
addEventListener,
|
|
@@ -126,6 +142,9 @@ function PoseTrackerProvider({
|
|
|
126
142
|
startExercise,
|
|
127
143
|
stopExercise,
|
|
128
144
|
setModel,
|
|
145
|
+
setSource,
|
|
146
|
+
analyze,
|
|
147
|
+
getSource,
|
|
129
148
|
getAvailableExercises,
|
|
130
149
|
getAvailableCustomExercises,
|
|
131
150
|
addEventListener,
|
|
@@ -149,6 +168,9 @@ function PoseCamera({
|
|
|
149
168
|
style,
|
|
150
169
|
className,
|
|
151
170
|
position,
|
|
171
|
+
source,
|
|
172
|
+
sourceUrl,
|
|
173
|
+
sourceFile,
|
|
152
174
|
drawSkeleton,
|
|
153
175
|
drawPlacementBox,
|
|
154
176
|
placementPaddingPercent,
|
|
@@ -169,6 +191,9 @@ function PoseCamera({
|
|
|
169
191
|
if (!el) return;
|
|
170
192
|
client.updateOptions({
|
|
171
193
|
...position ? { position } : {},
|
|
194
|
+
...source !== void 0 ? { source } : {},
|
|
195
|
+
...sourceUrl !== void 0 ? { sourceUrl } : {},
|
|
196
|
+
...sourceFile !== void 0 ? { sourceFile } : {},
|
|
172
197
|
...typeof drawSkeleton === "boolean" ? { drawSkeleton } : {},
|
|
173
198
|
...typeof drawPlacementBox === "boolean" ? { drawPlacementBox } : {},
|
|
174
199
|
...typeof placementPaddingPercent === "number" ? { placementPaddingPercent } : {},
|
|
@@ -183,7 +208,13 @@ function PoseCamera({
|
|
|
183
208
|
const shouldStart = autoStartProp ?? providerAutoStart;
|
|
184
209
|
if (shouldStart && !startedRef.current) {
|
|
185
210
|
startedRef.current = true;
|
|
186
|
-
|
|
211
|
+
const boot = async () => {
|
|
212
|
+
if (source !== void 0) {
|
|
213
|
+
await client.setSource(source, { sourceUrl, sourceFile });
|
|
214
|
+
}
|
|
215
|
+
await client.start();
|
|
216
|
+
};
|
|
217
|
+
boot().catch(() => {
|
|
187
218
|
});
|
|
188
219
|
}
|
|
189
220
|
return () => {
|
|
@@ -192,6 +223,11 @@ function PoseCamera({
|
|
|
192
223
|
_registerMountHost(null);
|
|
193
224
|
};
|
|
194
225
|
}, [client]);
|
|
226
|
+
useEffect(() => {
|
|
227
|
+
if (!startedRef.current || source === void 0) return;
|
|
228
|
+
void client.setSource(source, { sourceUrl, sourceFile }).catch(() => {
|
|
229
|
+
});
|
|
230
|
+
}, [client, source, sourceUrl, sourceFile]);
|
|
195
231
|
return /* @__PURE__ */ jsx(
|
|
196
232
|
"div",
|
|
197
233
|
{
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pose-tracker/pose-estimation-web-react",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "PoseTracker React (web) pose estimation — thin wrapper over @pose-tracker/pose-estimation-web. Browser camera + canvas, not React Native.",
|
|
6
6
|
"type": "module",
|
|
@@ -54,7 +54,7 @@
|
|
|
54
54
|
"access": "public"
|
|
55
55
|
},
|
|
56
56
|
"dependencies": {
|
|
57
|
-
"@pose-tracker/pose-estimation-web": "0.
|
|
57
|
+
"@pose-tracker/pose-estimation-web": "0.3.0"
|
|
58
58
|
},
|
|
59
59
|
"peerDependencies": {
|
|
60
60
|
"react": ">=18.0.0",
|