@ssafy-mhk/e-ver 1.0.1 โ†’ 1.0.3

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 CHANGED
@@ -1,9 +1,10 @@
1
1
  # `@ssafy-mhk/e-ver` - Virtual Fitting React SDK ๐Ÿ‘—๐Ÿ‘•
2
2
 
3
- S14P21M104 ๊ฐ€์ƒ ํ”ผํŒ…(WebAR) ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•œ ๊ณต์‹ ํ”„๋ก ํŠธ์—”๋“œ React SDK์ž…๋‹ˆ๋‹ค.
3
+ S14P21M104 ๊ฐ€์ƒ ํ”ผํŒ…(WebAR) ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•œ ๊ณต์‹ ํ”„๋ก ํŠธ์—”๋“œ React SDK์ž…๋‹ˆ๋‹ค.
4
4
  ๋ณต์žกํ•œ Three.js ์นด๋ฉ”๋ผ ๋ฐ ์กฐ๋ช… ์„ค์ •, MediaPipe AI ๋ฐ”๋”” ํŠธ๋ž˜ํ‚น ์—ฐ๋™, SkinnedMesh ๊ธฐ๋ฐ˜ ์˜๋ฅ˜ ๋ Œ๋”๋ง ๋กœ์ง์„ ์ถ”์ƒํ™”ํ•˜์—ฌ, **๋‹จ์ˆœํ•œ React ์ปดํฌ๋„ŒํŠธ์™€ Hook**์œผ๋กœ ์ฆ๊ฐ•ํ˜„์‹ค(AR) ๊ฐ€์ƒ ํ”ผํŒ… ๊ธฐ๋Šฅ์„ ๋น ๋ฅด๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
5
5
 
6
6
  ## ๊ฐœ๋ฐœ ์Šคํƒ (Technology Stack)
7
+
7
8
  - **Framework**: React / Next.js ํ˜ธํ™˜
8
9
  - **3D & AR Rendering**: Three.js, React Three Fiber (R3F), Drei, three-vrm
9
10
  - **AI Tracking**: MediaPipe Pose Landmarker (Lite)
@@ -13,21 +14,36 @@ S14P21M104 ๊ฐ€์ƒ ํ”ผํŒ…(WebAR) ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•œ ๊ณต์‹ ํ”„๋ก ํŠธ์—”๋“œ Re
13
14
 
14
15
  ## ๐Ÿ›  ์„ค์น˜ ๋ฐฉ๋ฒ• (Installation)
15
16
 
16
- ์ด ํŒจํ‚ค์ง€๋Š” ์‚ฌ๋‚ด ๋˜๋Š” ์™ธ๋ถ€ NPM์— ์ง์ ‘ ๋ฐฐํฌ๋˜๊ธฐ ์ „ ๋กœ์ปฌ ์ €์žฅ์†Œ๋ฅผ ํ†ตํ•œ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ(Symbolic Link) ๋ฐฉ์‹์œผ๋กœ ์—ฐ๊ฒฐํ•˜๊ฑฐ๋‚˜ ํŒŒ์ผ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
17
+ ์ด ํŒจํ‚ค์ง€๋Š” ๋ฐฐํฌ ์ „ ๋กœ์ปฌ ๊ฒ€์ฆ ์‹œ tarball๋กœ ํŒจํ‚ค์ง•ํ•œ ๋’ค ์†Œ๋น„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์„ค์น˜ํ•ด์„œ ํ™•์ธํ•˜๋Š” ๋ฐฉ์‹์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.
18
+
19
+ ### ๋ฐฐํฌ๋œ ํŒจํ‚ค์ง€ ์„ค์น˜
17
20
 
18
- ### ๋กœ์ปฌ ํ”„๋กœ์ ํŠธ์—์„œ ์ฐธ์กฐํ•˜์—ฌ ์„ค์น˜ํ•  ๊ฒฝ์šฐ:
19
- ์—ฌ๋Ÿฌ๋ถ„์˜ Next.js ํ”„๋กœ์ ํŠธ ์ตœ์ƒ์œ„ ํด๋”(`frontend`)์—์„œ ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์„ธ์š”.
21
+ ์—ฌ๋Ÿฌ๋ถ„์˜ Next.js ํ”„๋กœ์ ํŠธ ์ตœ์ƒ์œ„ ํด๋”์—์„œ ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์„ธ์š”.
20
22
 
21
23
  ```bash
22
24
  # pnpm ์‚ฌ์šฉ ์‹œ
23
- pnpm add ../sdk
25
+ pnpm add @ssafy-mhk/e-ver
24
26
 
25
27
  # ๋˜๋Š” ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €์— ๋”ฐ๋ผ
26
- npm install ../sdk
27
- yarn add file:../sdk
28
+ npm install @ssafy-mhk/e-ver
29
+ yarn add @ssafy-mhk/e-ver
30
+ ```
31
+
32
+ _(์˜์กด์„ฑ ์„ค์น˜๊ฐ€ ์ž˜ ๋˜์—ˆ๋Š”์ง€ ๊ผญ `package.json` ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.)_
33
+
34
+ ### ์ด ๋ ˆํฌ์—์„œ `frontend`๋กœ ๋กœ์ปฌ ๊ฒ€์ฆํ•  ๊ฒฝ์šฐ
35
+
36
+ `/ever/frontend`์—์„œ ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด `/ever/sdk`๋ฅผ ๋นŒ๋“œํ•˜๊ณ  tarball๋กœ ํŒจํ‚ค์ง•ํ•œ ๋’ค ํ˜„์žฌ ํ”„๋ก ํŠธ์—”๋“œ์— ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.
37
+
38
+ ```bash
39
+ pnpm run sdk:use-tarball
28
40
  ```
29
41
 
30
- *(์˜์กด์„ฑ ์„ค์น˜๊ฐ€ ์ž˜ ๋˜์—ˆ๋Š”์ง€ ๊ผญ `package.json` ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.)*
42
+ ๊ฒ€์ฆ ํ›„ ํผ๋ธ”๋ฆฌ์‹œ๋œ ๋ฒ„์ „์œผ๋กœ ๋˜๋Œ๋ฆด ๋•Œ๋Š” ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
43
+
44
+ ```bash
45
+ pnpm run sdk:use-version -- 1.0.3
46
+ ```
31
47
 
32
48
  ---
33
49
 
@@ -35,15 +51,15 @@ yarn add file:../sdk
35
51
 
36
52
  SDK๋Š” ํฌ๊ฒŒ **State(์ƒํƒœ ๊ด€๋ฆฌ)**, **Renderer(๋ Œ๋”๋ง UI)**, **Tracker(์ถ”์ /์ธก์ • Hook)** ์ด๋ ‡๊ฒŒ 3๊ฐ€์ง€ ํ•ต์‹ฌ ์ถ•์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.
37
53
 
38
- | ๋ถ„๋ฅ˜ | ๋ชจ๋“ˆ๋ช… | ์—ญํ•  |
39
- |---|---|---|
40
- | **State** | `useEverStore` | ์›น์บ  ํ™œ์„ฑํ™” ์—ฌ๋ถ€, ๋ Œ๋”๋ง ์ค‘์ธ ์˜ท/์•„๋ฐ”ํƒ€ ์ฃผ์†Œ, ์ตœ์ข… ํ• ๊ฒฐ๊ณผ(์ฒดํ˜• ์ธก์ •) ๊ด€๋ฆฌ |
41
- | **Renderer** | `EverCanvas` | AR/3D ํ™˜๊ฒฝ์— ์ตœ์ ํ™”๋œ ์กฐ๋ช…๊ณผ ์นด๋ฉ”๋ผ ์„ธํŒ…์„ ๋‚ด์žฅํ•œ R3F ์บ”๋ฒ„์Šค ๋ž˜ํผ |
42
- | **Renderer** | `AvatarModel` | ์‚ฌ์šฉ์ž์˜ AI ๊ธฐ๋ฐ˜ ์ƒ์„ฑ 3D ์•„๋ฐ”ํƒ€(GLB)๋ฅผ ๋กœ๋”ฉํ•˜๊ณ , ๋ผˆ๋Œ€(Bone) ๊ตฌ์กฐ๋ฅผ ์ถ”์ถœ |
43
- | **Renderer** | `GarmentModel` | ์‚ฌ์šฉ์ž๊ฐ€ ์„ ํƒํ•œ ์˜ท(GLB)์„ ๋กœ๋”ฉํ•˜๊ณ , ์˜ท์˜ SkinnedMesh๋ฅผ ๋Œ€์ƒ ์•„๋ฐ”ํƒ€์— ์ž…ํž˜ |
44
- | **Tracker** | `usePoseTracker` | ๋ธŒ๋ผ์šฐ์ € ๋‚ด์—์„œ MediaPipe๋ฅผ ๊ฐ€๋™์‹œ์ผœ ์‹ค์‹œ๊ฐ„ 30-60Hz ์›น์บ  ์ถ”์  |
45
- | **Tracker** | `usePoseMapper` | ์›น์บ ์—์„œ ์–ป์€ 2D/3D ์ (Landmarks)์„ ํ•„์ˆ˜ 13๋ณธ(Bone)์˜ ํšŒ์ „๊ฐ’(Quaternion)์œผ๋กœ ๋ณ€ํ™˜ |
46
- | **Tracker** | `useBodyMeasurer` | AR ์นด๋ฉ”๋ผ ์ƒ์—์„œ ์‚ฌ์šฉ์ž ์‹ค๋ฃจ์—ฃ ๊ธฐ๋ฐ˜ ์‚ฌ์ด์ฆˆ(์–ด๊นจ, ๊ฐ€์Šด, ํ—ˆ๋ฆฌ)๋ฅผ ์—ฐ์‚ฐํ•˜์—ฌ ์˜ท์˜ ํ• ํ‰๊ฐ€ |
54
+ | ๋ถ„๋ฅ˜ | ๋ชจ๋“ˆ๋ช… | ์—ญํ•  |
55
+ | ------------ | ----------------- | ------------------------------------------------------------------------------------ |
56
+ | **State** | `useEverStore` | ์›น์บ  ํ™œ์„ฑํ™” ์—ฌ๋ถ€, ๋ Œ๋”๋ง ์ค‘์ธ ์˜ท/์•„๋ฐ”ํƒ€ ์ฃผ์†Œ, ์ตœ์ข… ํ• ๊ฒฐ๊ณผ(์ฒดํ˜• ์ธก์ •) ๊ด€๋ฆฌ |
57
+ | **Renderer** | `EverCanvas` | AR/3D ํ™˜๊ฒฝ์— ์ตœ์ ํ™”๋œ ์กฐ๋ช…๊ณผ ์นด๋ฉ”๋ผ ์„ธํŒ…์„ ๋‚ด์žฅํ•œ R3F ์บ”๋ฒ„์Šค ๋ž˜ํผ |
58
+ | **Renderer** | `AvatarModel` | ์‚ฌ์šฉ์ž์˜ AI ๊ธฐ๋ฐ˜ ์ƒ์„ฑ 3D ์•„๋ฐ”ํƒ€(GLB)๋ฅผ ๋กœ๋”ฉํ•˜๊ณ , ๋ผˆ๋Œ€(Bone) ๊ตฌ์กฐ๋ฅผ ์ถ”์ถœ |
59
+ | **Renderer** | `GarmentModel` | ์‚ฌ์šฉ์ž๊ฐ€ ์„ ํƒํ•œ ์˜ท(GLB)์„ ๋กœ๋”ฉํ•˜๊ณ , ์˜ท์˜ SkinnedMesh๋ฅผ ๋Œ€์ƒ ์•„๋ฐ”ํƒ€์— ์ž…ํž˜ |
60
+ | **Tracker** | `usePoseTracker` | ๋ธŒ๋ผ์šฐ์ € ๋‚ด์—์„œ MediaPipe๋ฅผ ๊ฐ€๋™์‹œ์ผœ ์‹ค์‹œ๊ฐ„ 30-60Hz ์›น์บ  ์ถ”์  |
61
+ | **Tracker** | `usePoseMapper` | ์›น์บ ์—์„œ ์–ป์€ 2D/3D ์ (Landmarks)์„ ํ•„์ˆ˜ 13๋ณธ(Bone)์˜ ํšŒ์ „๊ฐ’(Quaternion)์œผ๋กœ ๋ณ€ํ™˜ |
62
+ | **Tracker** | `useBodyMeasurer` | AR ์นด๋ฉ”๋ผ ์ƒ์—์„œ ์‚ฌ์šฉ์ž ์‹ค๋ฃจ์—ฃ ๊ธฐ๋ฐ˜ ์‚ฌ์ด์ฆˆ(์–ด๊นจ, ๊ฐ€์Šด, ํ—ˆ๋ฆฌ)๋ฅผ ์—ฐ์‚ฐํ•˜์—ฌ ์˜ท์˜ ํ• ํ‰๊ฐ€ |
47
63
 
48
64
  ---
49
65
 
@@ -53,7 +69,7 @@ SDK๋Š” ํฌ๊ฒŒ **State(์ƒํƒœ ๊ด€๋ฆฌ)**, **Renderer(๋ Œ๋”๋ง UI)**, **Tracker(
53
69
 
54
70
  ### Step 1. Zustand๋กœ ๊ธ€๋กœ๋ฒŒ ์ƒํƒœ ์„ธํŒ…ํ•˜๊ธฐ
55
71
 
56
- ์šฐ์„ , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์™ธ๋ถ€ ๋ฒ„ํŠผ ์กฐ์ž‘์„ ์œ„ํ•ด ์Šคํ† ์–ด๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
72
+ ์šฐ์„ , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์™ธ๋ถ€ ๋ฒ„ํŠผ ์กฐ์ž‘์„ ์œ„ํ•ด ์Šคํ† ์–ด๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
57
73
 
58
74
  ```tsx
59
75
  // app/fitting/page.tsx
@@ -67,7 +83,7 @@ export default function FittingControls() {
67
83
  return (
68
84
  <div className="absolute top-4 left-4 z-10 flex flex-col gap-2">
69
85
  <button onClick={() => setWebcamActive(true)}>์›น์บ  ๊ฐ€๋™ ์‹œ์ž‘ ๐ŸŽฅ</button>
70
- <button onClick={() => setActiveGarmentUrl('/path/to/clothes.glb')}>
86
+ <button onClick={() => setActiveGarmentUrl("/path/to/clothes.glb")}>
71
87
  ์ƒˆ๋กœ์šด ์˜ท ์ž…์–ด๋ณด๊ธฐ ๐Ÿ‘•
72
88
  </button>
73
89
 
@@ -83,46 +99,44 @@ export default function FittingControls() {
83
99
 
84
100
  ### Step 2. 3D AR ์บ”๋ฒ„์Šค ๋ฐ ๋ชจ๋ธ ๊ตฌ์ถ•ํ•˜๊ธฐ
85
101
 
86
- SDK์—์„œ ์ œ๊ณตํ•˜๋Š” `EverCanvas`, `AvatarModel`, `GarmentModel`์„ ํ™œ์šฉํ•˜์—ฌ ํ™”๋ฉด์„ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค.
102
+ SDK์—์„œ ์ œ๊ณตํ•˜๋Š” `EverCanvas`, `AvatarModel`, `GarmentModel`์„ ํ™œ์šฉํ•˜์—ฌ ํ™”๋ฉด์„ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค.
87
103
 
88
104
  ```tsx
89
105
  // components/VirtualFittingScene.tsx
90
106
  "use client";
91
107
 
92
108
  import { useState } from "react";
93
- import {
94
- EverCanvas,
95
- AvatarModel,
96
- GarmentModel,
97
- useEverStore
109
+ import {
110
+ EverCanvas,
111
+ AvatarModel,
112
+ GarmentModel,
113
+ useEverStore,
98
114
  } from "@ssafy-mhk/e-ver";
99
115
 
100
116
  export default function VirtualFittingScene() {
101
117
  const [avatarBones, setAvatarBones] = useState<Record<string, THREE.Bone>>();
102
118
  const { activeGarmentUrl } = useEverStore();
103
-
119
+
104
120
  // ๋‚ด ๊ณ„์ •์˜ 3D ์•„๋ฐ”ํƒ€ ํŒŒ์ผ ๊ฒฝ๋กœ
105
- const AVATAR_URL = "/models/my-avatar.glb";
121
+ const AVATAR_URL = "/models/my-avatar.glb";
106
122
 
107
123
  return (
108
124
  <div className="w-full h-screen bg-transparent relative">
109
125
  {/* 1. ๊ธฐ๋ณธ AR ์กฐ๋ช…์ด ์„ธํŒ…๋œ ์บ”๋ฒ„์Šค ํ˜ธ์ถœ */}
110
126
  <EverCanvas showEnvironment={true}>
111
-
112
127
  {/* 2. ์‚ฌ์šฉ์ž์˜ ๋ฒ ์ด์Šค ์•„๋ฐ”ํƒ€ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ */}
113
- <AvatarModel
114
- url={AVATAR_URL}
115
- onBonesReady={(bones) => setAvatarBones(bones)}
128
+ <AvatarModel
129
+ url={AVATAR_URL}
130
+ onBonesReady={(bones) => setAvatarBones(bones)}
116
131
  />
117
-
132
+
118
133
  {/* 3. ํ™œ์„ฑํ™”๋œ ์˜ท์ด ์žˆ๋‹ค๋ฉด ์•„๋ฐ”ํƒ€ ์œ„์— ๋ง์ž…ํžˆ๊ธฐ */}
119
134
  {activeGarmentUrl && avatarBones && (
120
- <GarmentModel
121
- url={activeGarmentUrl}
122
- targetAvatarBones={avatarBones}
135
+ <GarmentModel
136
+ url={activeGarmentUrl}
137
+ targetAvatarBones={avatarBones}
123
138
  />
124
139
  )}
125
-
126
140
  </EverCanvas>
127
141
  </div>
128
142
  );
@@ -142,23 +156,23 @@ import { usePoseTracker, useEverStore } from "@ssafy-mhk/e-ver";
142
156
 
143
157
  export default function ArCameraView() {
144
158
  const videoRef = useRef<HTMLVideoElement>(null);
145
-
159
+
146
160
  // SDK ๋‚ด๋ถ€์˜ ๋กœ์ง์„ ํ†ตํ•ด ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ”„๋ ˆ์ž„์„ MediaPipe์— ์ „์†ก
147
161
  const { isTrackerReady } = usePoseTracker(videoRef);
148
162
  const { isWebcamActive } = useEverStore();
149
163
 
150
164
  return (
151
165
  <div className="absolute inset-0 z-0">
152
- <video
153
- ref={videoRef}
154
- autoPlay
155
- playsInline
156
- muted
157
- className="w-full h-full object-cover"
158
- style={{ display: isWebcamActive ? "block" : "none" }}
159
- />
160
- {/* Tracker๊ฐ€ ๋กœ๋”ฉ ์ค‘์ผ ๋•Œ ๋กœ๋”ฉ ์˜ค๋ฒ„๋ ˆ์ด ํ‘œ์‹œ ๊ฐ€๋Šฅ */}
161
- {!isTrackerReady && isWebcamActive && <p>AI ๋ชจ๋ธ ๋กœ๋”ฉ ์ค‘...</p>}
166
+ <video
167
+ ref={videoRef}
168
+ autoPlay
169
+ playsInline
170
+ muted
171
+ className="w-full h-full object-cover"
172
+ style={{ display: isWebcamActive ? "block" : "none" }}
173
+ />
174
+ {/* Tracker๊ฐ€ ๋กœ๋”ฉ ์ค‘์ผ ๋•Œ ๋กœ๋”ฉ ์˜ค๋ฒ„๋ ˆ์ด ํ‘œ์‹œ ๊ฐ€๋Šฅ */}
175
+ {!isTrackerReady && isWebcamActive && <p>AI ๋ชจ๋ธ ๋กœ๋”ฉ ์ค‘...</p>}
162
176
  </div>
163
177
  );
164
178
  }
@@ -0,0 +1 @@
1
+ export {};
@@ -1,12 +1,4 @@
1
1
  import React from "react";
2
- import * as THREE from "three";
3
- export interface EverContextType {
4
- videoRef: React.RefObject<HTMLVideoElement | null>;
5
- avatarBones: Record<string, THREE.Bone> | null;
6
- setAvatarBones: (bones: Record<string, THREE.Bone> | null) => void;
7
- isProviderReady: boolean;
8
- }
9
- export declare const useEver: () => EverContextType;
10
2
  export interface EverProviderProps {
11
3
  children: React.ReactNode;
12
4
  }
@@ -0,0 +1,9 @@
1
+ import * as THREE from "three";
2
+ export interface EverContextType {
3
+ videoRef: React.RefObject<HTMLVideoElement | null>;
4
+ avatarBones: Record<string, THREE.Bone> | null;
5
+ setAvatarBones: (bones: Record<string, THREE.Bone> | null) => void;
6
+ isProviderReady: boolean;
7
+ }
8
+ export declare const EverContext: import("react").Context<EverContextType | undefined>;
9
+ export declare function useEver(): EverContextType;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -1,7 +1,13 @@
1
1
  import * as THREE from "three";
2
+ interface PoseLandmark {
3
+ x: number;
4
+ y: number;
5
+ z: number;
6
+ }
2
7
  /**
3
8
  * Custom hook to map MediaPipe 2D/3D landmarks to 3D bones (Quaternions).
4
9
  */
5
10
  export declare const usePoseMapper: () => {
6
- mapPoseToBones: (landmarks: any[], targetBones: Record<string, THREE.Bone>) => void;
11
+ mapPoseToBones: (landmarks: PoseLandmark[], targetBones: Record<string, THREE.Bone>) => void;
7
12
  };
13
+ export {};
@@ -0,0 +1 @@
1
+ export {};
package/dist/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  export * from "./store/useEverStore";
2
2
  export * from "./components/EverProvider";
3
+ export * from "./components/ever-context";
3
4
  export * from "./components/EverCanvas";
4
5
  export * from "./components/CameraView";
5
6
  export * from "./components/AvatarModel";
package/dist/index.es.js CHANGED
@@ -17837,11 +17837,15 @@ var mg = class {
17837
17837
  let t = this.getContext();
17838
17838
  t.drawingBufferColorSpace = $n._getDrawingBufferColorSpace(e), t.unpackColorSpace = $n._getUnpackColorSpace();
17839
17839
  }
17840
- }, hg = i(void 0), gg = () => {
17840
+ }, hg = i(void 0);
17841
+ function gg() {
17841
17842
  let e = o(hg);
17842
17843
  if (!e) throw Error("useEver must be used within an EverProvider");
17843
17844
  return e;
17844
- }, _g = ({ children: e }) => {
17845
+ }
17846
+ //#endregion
17847
+ //#region src/components/EverProvider.tsx
17848
+ var _g = ({ children: e }) => {
17845
17849
  let t = u(null), [n, r] = d(null), i = {
17846
17850
  videoRef: t,
17847
17851
  avatarBones: n,
@@ -35941,7 +35945,7 @@ var Ux = ({ children: e, showEnvironment: t = !0 }) => /* @__PURE__ */ p(_g, { c
35941
35945
  if (!n) return;
35942
35946
  let e = {};
35943
35947
  return n.traverse((t) => {
35944
- t.isBone && (e[t.name] = t);
35948
+ t instanceof oo && (e[t.name] = t);
35945
35949
  }), i(e), t && t(e), () => i(null);
35946
35950
  }, [
35947
35951
  n,
@@ -35959,7 +35963,7 @@ var Ux = ({ children: e, showEnvironment: t = !0 }) => /* @__PURE__ */ p(_g, { c
35959
35963
  let { scene: n } = ax(e), r = u(null), { avatarBones: i } = gg(), a = t || i;
35960
35964
  return s(() => {
35961
35965
  !n || !a || n.traverse((e) => {
35962
- if (e.isSkinnedMesh) {
35966
+ if (e instanceof ao) {
35963
35967
  let t = e, n = [];
35964
35968
  t.skeleton.bones.forEach((e) => {
35965
35969
  a[e.name] ? n.push(a[e.name]) : n.push(e);
@@ -40789,4 +40793,4 @@ function iM(e) {
40789
40793
  };
40790
40794
  }
40791
40795
  //#endregion
40792
- export { Gx as AvatarModel, Wx as CameraView, Ux as EverCanvas, tM as EverClient, _g as EverProvider, qx as GarmentModel, Qj as useBodyMeasurer, gg as useEver, iM as useEverGeneration, E as useEverStore, Zj as usePoseMapper, Xj as usePoseTracker };
40796
+ export { Gx as AvatarModel, Wx as CameraView, Ux as EverCanvas, tM as EverClient, hg as EverContext, _g as EverProvider, qx as GarmentModel, Qj as useBodyMeasurer, gg as useEver, iM as useEverGeneration, E as useEverStore, Zj as usePoseMapper, Xj as usePoseTracker };