@tresjs/core 3.2.1 → 3.2.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.
@@ -19,7 +19,63 @@ export interface PBRTextureMaps {
19
19
  [key: string]: Texture | null;
20
20
  }
21
21
  /**
22
- * Composable for loading textures.
22
+ * Map of textures to load that can be passed to `useTexture()`.
23
+ */
24
+ export interface PBRUseTextureMap {
25
+ map?: string;
26
+ displacementMap?: string;
27
+ normalMap?: string;
28
+ roughnessMap?: string;
29
+ metalnessMap?: string;
30
+ aoMap?: string;
31
+ alphaMap?: string;
32
+ matcap?: string;
33
+ }
34
+ /**
35
+ * Loads a single texture.
36
+ *
37
+ * ```ts
38
+ * import { useTexture } from 'tres'
39
+ *
40
+ * const matcapTexture = await useTexture(['path/to/texture.png'])
41
+ * ```
42
+ * Then you can use the texture in your material.
43
+ *
44
+ * ```vue
45
+ * <TresMeshMatcapMaterial :matcap="matcapTexture" />
46
+ * ```
47
+ * @see https://tresjs.org/examples/load-textures.html
48
+ * @export
49
+ * @param paths
50
+ * @return A promise of the resulting texture
51
+ */
52
+ export declare function useTexture(paths: readonly [string]): Promise<Texture>;
53
+ /**
54
+ * Loads multiple textures.
55
+ *
56
+ * ```ts
57
+ * import { useTexture } from 'tres'
58
+ *
59
+ * const [texture1, texture2] = await useTexture([
60
+ * 'path/to/texture1.png',
61
+ * 'path/to/texture2.png',
62
+ * ])
63
+ * ```
64
+ * Then you can use the texture in your material.
65
+ *
66
+ * ```vue
67
+ * <TresMeshStandardMaterial map="texture1" />
68
+ * ```
69
+ * @see https://tresjs.org/examples/load-textures.html
70
+ * @export
71
+ * @param paths
72
+ * @return A promise of the resulting textures
73
+ */
74
+ export declare function useTexture<T extends string[]>(paths: [...T]): Promise<{
75
+ [K in keyof T]: Texture;
76
+ }>;
77
+ /**
78
+ * Loads a PBR texture map.
23
79
  *
24
80
  * ```ts
25
81
  * import { useTexture } from 'tres'
@@ -39,9 +95,9 @@ export interface PBRTextureMaps {
39
95
  * ```
40
96
  * @see https://tresjs.org/examples/load-textures.html
41
97
  * @export
42
- * @param {(Array<string> | { [key: string]: string })} paths
43
- * @return {*} {(Promise<Texture | Array<Texture> | PBRTextureMaps>)}
98
+ * @param paths
99
+ * @return A promise of the resulting pbr texture map
44
100
  */
45
- export declare function useTexture(paths: Array<string> | {
46
- [key: string]: string;
47
- }): Promise<Texture | Array<Texture> | PBRTextureMaps>;
101
+ export declare function useTexture<TextureMap extends PBRUseTextureMap>(paths: TextureMap): Promise<{
102
+ [K in keyof Required<PBRUseTextureMap>]: K extends keyof TextureMap ? Texture : null;
103
+ }>;
package/dist/tres.js CHANGED
@@ -1,23 +1,23 @@
1
1
  /**
2
2
  * name: @tresjs/core
3
- * version: v3.2.1
3
+ * version: v3.2.3
4
4
  * (c) 2023
5
5
  * description: Declarative ThreeJS using Vue Components
6
6
  * author: Alvaro Saburido <hola@alvarosaburido.dev> (https://github.com/alvarosabu/)
7
7
  */
8
- import { ref as h, computed as k, watchEffect as D, onUnmounted as N, shallowRef as F, watch as te, reactive as ue, readonly as le, provide as I, inject as ce, createRenderer as fe, defineComponent as U, useSlots as me, getCurrentInstance as J, onMounted as pe, openBlock as ve, createElementBlock as de, normalizeStyle as ge, h as K, Fragment as ye } from "vue";
9
- import * as we from "three";
10
- import { PerspectiveCamera as W, OrthographicCamera as Ce, Camera as _e, Clock as Pe, Vector3 as Ee, Color as R, REVISION as Me, SRGBColorSpace as Ae, ACESFilmicToneMapping as ke, PCFSoftShadowMap as be, WebGLRenderer as z, LoadingManager as De, TextureLoader as xe, Vector2 as Oe, Raycaster as he, BufferAttribute as Be, Scene as Le } from "three";
11
- import { createEventHook as O, useRafFn as Te, toValue as P, unrefElement as Se, useDevicePixelRatio as Re, usePointer as je, useElementBounding as He, useWindowSize as Fe, useElementSize as ze } from "@vueuse/core";
12
- const Ge = ({ sizes: e, scene: n }) => {
13
- const t = h([]), r = k(
8
+ import { ref as B, computed as k, watchEffect as D, onUnmounted as N, shallowRef as F, watch as te, reactive as ie, readonly as ue, provide as I, inject as le, createRenderer as ce, defineComponent as U, useSlots as fe, getCurrentInstance as J, onMounted as me, openBlock as pe, createElementBlock as ve, normalizeStyle as ge, h as K, Fragment as de } from "vue";
9
+ import * as ye from "three";
10
+ import { PerspectiveCamera as $, OrthographicCamera as we, Camera as Ce, Clock as _e, Vector3 as Pe, Color as R, REVISION as Ee, SRGBColorSpace as Me, ACESFilmicToneMapping as Ae, PCFSoftShadowMap as ke, WebGLRenderer as z, LoadingManager as be, TextureLoader as De, Vector2 as xe, Raycaster as Oe, BufferAttribute as Be, Scene as Le } from "three";
11
+ import { createEventHook as O, useRafFn as Te, toValue as P, unrefElement as he, useDevicePixelRatio as Se, usePointer as Re, useElementBounding as je, useWindowSize as He, useElementSize as Fe } from "@vueuse/core";
12
+ const ze = ({ sizes: e, scene: n }) => {
13
+ const t = B([]), r = k(
14
14
  () => t.value[0]
15
15
  ), a = (i, c = !1) => {
16
16
  t.value.some(({ uuid: u }) => u === i.uuid) || (c ? f(i) : t.value.push(i));
17
17
  }, o = (i) => {
18
18
  t.value = t.value.filter(({ uuid: c }) => c !== i.uuid);
19
19
  }, f = (i) => {
20
- const c = i instanceof _e ? i : t.value.find((m) => m.uuid === i);
20
+ const c = i instanceof Ce ? i : t.value.find((m) => m.uuid === i);
21
21
  if (!c)
22
22
  return;
23
23
  const u = t.value.filter(({ uuid: m }) => m !== c.uuid);
@@ -25,7 +25,7 @@ const Ge = ({ sizes: e, scene: n }) => {
25
25
  };
26
26
  return D(() => {
27
27
  e.aspectRatio.value && t.value.forEach((i) => {
28
- i instanceof W && (i.aspect = e.aspectRatio.value), (i instanceof W || i instanceof Ce) && i.updateProjectionMatrix();
28
+ i instanceof $ && (i.aspect = e.aspectRatio.value), (i instanceof $ || i instanceof we) && i.updateProjectionMatrix();
29
29
  });
30
30
  }), n.userData.tres__registerCamera = a, n.userData.tres__deregisterCamera = o, N(() => {
31
31
  t.value = [];
@@ -36,9 +36,9 @@ const Ge = ({ sizes: e, scene: n }) => {
36
36
  deregisterCamera: o,
37
37
  setCameraActive: f
38
38
  };
39
- }, re = O(), ne = O(), V = O(), x = new Pe();
39
+ }, re = O(), ne = O(), V = O(), x = new _e();
40
40
  let j = 0, H = 0;
41
- const { pause: Ie, resume: We, isActive: $e } = Te(
41
+ const { pause: Ge, resume: Ie, isActive: $e } = Te(
42
42
  () => {
43
43
  re.trigger({ delta: j, elapsed: H, clock: x }), ne.trigger({ delta: j, elapsed: H, clock: x }), V.trigger({ delta: j, elapsed: H, clock: x });
44
44
  },
@@ -51,11 +51,11 @@ const ae = () => ({
51
51
  onBeforeLoop: re.on,
52
52
  onLoop: ne.on,
53
53
  onAfterLoop: V.on,
54
- pause: Ie,
55
- resume: We,
54
+ pause: Ge,
55
+ resume: Ie,
56
56
  isActive: $e
57
- }), pt = !0, X = "[TresJS ▲ ■ ●] ";
58
- function B() {
57
+ }), vt = !0, X = "[TresJS ▲ ■ ●] ";
58
+ function L() {
59
59
  function e(r, a) {
60
60
  console.error(`${X} ${r}`, a || "");
61
61
  }
@@ -70,30 +70,30 @@ function B() {
70
70
  logMessage: t
71
71
  };
72
72
  }
73
- function vt(e) {
74
- return typeof e == "number" ? [e, e, e] : e instanceof Ee ? [e.x, e.y, e.z] : e;
73
+ function gt(e) {
74
+ return typeof e == "number" ? [e, e, e] : e instanceof Pe ? [e.x, e.y, e.z] : e;
75
75
  }
76
- function Ne(e) {
76
+ function We(e) {
77
77
  return e instanceof R ? e : Array.isArray(e) ? new R(...e) : new R(e);
78
78
  }
79
79
  const oe = (e, n) => {
80
80
  for (const t of Object.keys(n))
81
81
  n[t] instanceof Object && Object.assign(n[t], oe(e[t], n[t]));
82
82
  return Object.assign(e || {}, n), e;
83
- }, Ve = "html,body,base,head,link,meta,style,title,address,article,aside,footer,header,hgroup,h1,h2,h3,h4,h5,h6,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,summary,template,blockquote,iframe,tfoot", qe = /* @__PURE__ */ Ue(Ve);
83
+ }, Ne = "html,body,base,head,link,meta,style,title,address,article,aside,footer,header,hgroup,h1,h2,h3,h4,h5,h6,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,summary,template,blockquote,iframe,tfoot", Ve = /* @__PURE__ */ qe(Ne);
84
84
  function Y(e) {
85
85
  return e && e.nodeType === 1;
86
86
  }
87
- function T(e) {
87
+ function h(e) {
88
88
  return e.replace(/-([a-z])/g, (n, t) => t.toUpperCase());
89
89
  }
90
- function Ue(e, n) {
90
+ function qe(e, n) {
91
91
  const t = /* @__PURE__ */ Object.create(null), r = e.split(",");
92
92
  for (let a = 0; a < r.length; a++)
93
93
  t[r[a]] = !0;
94
94
  return n ? (a) => !!t[a.toLowerCase()] : (a) => !!t[a];
95
95
  }
96
- const Je = (e, n) => {
96
+ const Ue = (e, n) => {
97
97
  const t = /* @__PURE__ */ new Set(), r = [];
98
98
  for (const a of e) {
99
99
  const o = n(a);
@@ -105,7 +105,7 @@ const Je = (e, n) => {
105
105
  return;
106
106
  const t = Array.isArray(n) ? n : n.match(/([^[.\]])+/g);
107
107
  return t == null ? void 0 : t.reduce((r, a) => r && r[a], e);
108
- }, Ke = (e, n, t) => {
108
+ }, Je = (e, n, t) => {
109
109
  const r = Array.isArray(n) ? n : n.match(/([^[.\]])+/g);
110
110
  r && r.reduce((a, o, f) => (a[o] === void 0 && (a[o] = {}), f === r.length - 1 && (a[o] = t), a[o]), e);
111
111
  };
@@ -126,7 +126,7 @@ function se(e, n) {
126
126
  return !1;
127
127
  return !0;
128
128
  }
129
- function Xe(e, n) {
129
+ function Ke(e, n) {
130
130
  if (!Array.isArray(e) || !Array.isArray(n) || e.length !== n.length)
131
131
  return !1;
132
132
  for (let t = 0; t < e.length; t++)
@@ -134,14 +134,14 @@ function Xe(e, n) {
134
134
  return !1;
135
135
  return !0;
136
136
  }
137
- const Ye = Number.parseInt(Me.replace("dev", "")), S = {
137
+ const Xe = Array.isArray, Ye = Number.parseInt(Ee.replace("dev", "")), S = {
138
138
  realistic: {
139
- outputColorSpace: Ae,
140
- toneMapping: ke,
139
+ outputColorSpace: Me,
140
+ toneMapping: Ae,
141
141
  toneMappingExposure: 3,
142
142
  shadowMap: {
143
143
  enabled: !0,
144
- type: be
144
+ type: ke
145
145
  }
146
146
  }
147
147
  };
@@ -155,7 +155,7 @@ function Qe({
155
155
  const f = k(() => ({
156
156
  alpha: P(t.alpha),
157
157
  depth: P(t.depth),
158
- canvas: Se(n),
158
+ canvas: he(n),
159
159
  context: P(t.context),
160
160
  stencil: P(t.stencil),
161
161
  antialias: P(t.antialias) === void 0 ? !0 : P(t.antialias),
@@ -171,39 +171,39 @@ function Qe({
171
171
  }), D(() => {
172
172
  i.value.setSize(a.width.value, a.height.value);
173
173
  });
174
- const { pixelRatio: c } = Re();
174
+ const { pixelRatio: c } = Se();
175
175
  D(() => {
176
176
  i.value.setPixelRatio(c.value);
177
177
  });
178
- const { logError: u } = B(), l = (() => {
179
- const d = new z(), w = {
178
+ const { logError: u } = L(), l = (() => {
179
+ const g = new z(), w = {
180
180
  shadowMap: {
181
- enabled: d.shadowMap.enabled,
182
- type: d.shadowMap.type
181
+ enabled: g.shadowMap.enabled,
182
+ type: g.shadowMap.type
183
183
  },
184
- toneMapping: d.toneMapping,
185
- toneMappingExposure: d.toneMappingExposure,
186
- outputColorSpace: d.outputColorSpace
184
+ toneMapping: g.toneMapping,
185
+ toneMappingExposure: g.toneMappingExposure,
186
+ outputColorSpace: g.outputColorSpace
187
187
  };
188
- return d.dispose(), w;
188
+ return g.dispose(), w;
189
189
  })();
190
190
  D(() => {
191
- const d = P(t.preset);
192
- d && (d in S || u(`Renderer Preset must be one of these: ${Object.keys(S).join(", ")}`), oe(i.value, S[d]));
191
+ const g = P(t.preset);
192
+ g && (g in S || u(`Renderer Preset must be one of these: ${Object.keys(S).join(", ")}`), oe(i.value, S[g]));
193
193
  const w = (_, A) => {
194
- const b = P(_), L = () => {
195
- if (d)
196
- return Q(S[d], A);
194
+ const b = P(_), T = () => {
195
+ if (g)
196
+ return Q(S[g], A);
197
197
  };
198
198
  if (b !== void 0)
199
199
  return b;
200
- const g = L();
201
- return g !== void 0 ? g : Q(l, A);
202
- }, E = (_, A) => Ke(i.value, A, w(_, A));
200
+ const d = T();
201
+ return d !== void 0 ? d : Q(l, A);
202
+ }, E = (_, A) => Je(i.value, A, w(_, A));
203
203
  E(t.shadows, "shadowMap.enabled"), E(t.toneMapping, "toneMapping"), E(t.shadowMapType, "shadowMap.type"), Ye < 150 && E(!t.useLegacyLights, "physicallyCorrectLights"), E(t.outputColorSpace, "outputColorSpace"), E(t.toneMappingExposure, "toneMappingExposure");
204
204
  const C = w(t.clearColor, "clearColor");
205
205
  C && i.value.setClearColor(
206
- C ? Ne(C) : new R(0)
206
+ C ? We(C) : new R(0)
207
207
  // default clear color is not easily/efficiently retrievable from three
208
208
  );
209
209
  });
@@ -216,32 +216,32 @@ function Qe({
216
216
  renderer: i
217
217
  };
218
218
  }
219
- const Z = (e) => typeof e == "function", ie = (e) => !!e && e.constructor === Array;
220
- function Ze(e) {
219
+ const Z = (e) => typeof e == "function", Ze = (e) => !!e && e.constructor === Array;
220
+ function et(e) {
221
221
  const n = { nodes: {}, materials: {} };
222
222
  return e && e.traverse((t) => {
223
223
  t.name && (n.nodes[t.name] = t), t.material && !n.materials[t.material.name] && (n.materials[t.material.name] = t.material);
224
224
  }), n;
225
225
  }
226
226
  async function dt(e, n, t, r, a) {
227
- const { logError: o } = B(), f = new e();
227
+ const { logError: o } = L(), f = new e();
228
228
  a && a(f), t && t(f);
229
229
  const c = (Array.isArray(n) ? n : [n]).map(
230
230
  (u) => new Promise((m, l) => {
231
231
  f.load(
232
232
  u,
233
233
  (s) => {
234
- s.scene && Object.assign(s, Ze(s.scene)), m(s);
234
+ s.scene && Object.assign(s, et(s.scene)), m(s);
235
235
  },
236
236
  r,
237
237
  (s) => l(o("[useLoader] - Failed to load resource", s))
238
238
  );
239
239
  })
240
240
  );
241
- return ie(n) ? await Promise.all(c) : await c[0];
241
+ return Ze(n) ? await Promise.all(c) : await c[0];
242
242
  }
243
- async function gt(e) {
244
- const n = new De(), t = new xe(n), r = (a) => new Promise((o, f) => {
243
+ async function yt(e) {
244
+ const n = new be(), t = new De(n), r = (a) => new Promise((o, f) => {
245
245
  t.load(
246
246
  a,
247
247
  (i) => o(i),
@@ -251,7 +251,7 @@ async function gt(e) {
251
251
  }
252
252
  );
253
253
  });
254
- if (ie(e)) {
254
+ if (Xe(e)) {
255
255
  const a = await Promise.all(e.map((o) => r(o)));
256
256
  return e.length > 1 ? a : a[0];
257
257
  } else {
@@ -277,45 +277,45 @@ async function gt(e) {
277
277
  };
278
278
  }
279
279
  }
280
- const et = (e, { renderer: n, camera: t, raycaster: r }) => {
281
- const a = k(() => n.value.domElement), { x: o, y: f } = je({ target: a }), { width: i, height: c, top: u, left: m } = He(a), l = ({ x: g, y: M }) => {
280
+ const tt = (e, { renderer: n, camera: t, raycaster: r }) => {
281
+ const a = k(() => n.value.domElement), { x: o, y: f } = Re({ target: a }), { width: i, height: c, top: u, left: m } = je(a), l = ({ x: d, y: M }) => {
282
282
  if (a.value)
283
283
  return {
284
- x: (g - m.value) / i.value * 2 - 1,
284
+ x: (d - m.value) / i.value * 2 - 1,
285
285
  y: -((M - u.value) / c.value) * 2 + 1
286
286
  };
287
- }, s = ({ x: g, y: M }) => {
287
+ }, s = ({ x: d, y: M }) => {
288
288
  if (t.value)
289
- return r.value.setFromCamera(new Oe(g, M), t.value), r.value.intersectObjects(e.value, !1);
290
- }, v = (g) => {
289
+ return r.value.setFromCamera(new xe(d, M), t.value), r.value.intersectObjects(e.value, !1);
290
+ }, v = (d) => {
291
291
  const M = l({
292
- x: (g == null ? void 0 : g.clientX) ?? o.value,
293
- y: (g == null ? void 0 : g.clientY) ?? f.value
292
+ x: (d == null ? void 0 : d.clientX) ?? o.value,
293
+ y: (d == null ? void 0 : d.clientY) ?? f.value
294
294
  });
295
295
  return M ? s(M) || [] : [];
296
- }, y = k(() => v()), d = O(), w = O(), E = (g, M) => {
297
- g.trigger({ event: M, intersects: v(M) });
298
- }, C = (g) => {
299
- E(w, g);
296
+ }, y = k(() => v()), g = O(), w = O(), E = (d, M) => {
297
+ d.trigger({ event: M, intersects: v(M) });
298
+ }, C = (d) => {
299
+ E(w, d);
300
300
  };
301
301
  let _;
302
- const A = (g) => {
302
+ const A = (d) => {
303
303
  var M;
304
- _ = (M = v(g)[0]) == null ? void 0 : M.object;
305
- }, b = (g) => {
304
+ _ = (M = v(d)[0]) == null ? void 0 : M.object;
305
+ }, b = (d) => {
306
306
  var M;
307
- g instanceof PointerEvent && _ === ((M = v(g)[0]) == null ? void 0 : M.object) && E(d, g);
308
- }, L = (g) => w.trigger({ event: g, intersects: [] });
309
- return a.value.addEventListener("pointerup", b), a.value.addEventListener("pointerdown", A), a.value.addEventListener("pointermove", C), a.value.addEventListener("pointerleave", L), N(() => {
310
- a != null && a.value && (a.value.removeEventListener("pointerup", b), a.value.removeEventListener("pointerdown", A), a.value.removeEventListener("pointermove", C), a.value.removeEventListener("pointerleave", L));
307
+ d instanceof PointerEvent && _ === ((M = v(d)[0]) == null ? void 0 : M.object) && E(g, d);
308
+ }, T = (d) => w.trigger({ event: d, intersects: [] });
309
+ return a.value.addEventListener("pointerup", b), a.value.addEventListener("pointerdown", A), a.value.addEventListener("pointermove", C), a.value.addEventListener("pointerleave", T), N(() => {
310
+ a != null && a.value && (a.value.removeEventListener("pointerup", b), a.value.removeEventListener("pointerdown", A), a.value.removeEventListener("pointermove", C), a.value.removeEventListener("pointerleave", T));
311
311
  }), {
312
312
  intersects: y,
313
- onClick: (g) => d.on(g).off,
314
- onPointerMove: (g) => w.on(g).off
313
+ onClick: (d) => g.on(d).off,
314
+ onPointerMove: (d) => w.on(d).off
315
315
  };
316
316
  };
317
- function yt() {
318
- const { logWarning: e } = B();
317
+ function wt() {
318
+ const { logWarning: e } = L();
319
319
  function n(r, a, o) {
320
320
  let f = null;
321
321
  return r.traverse((i) => {
@@ -330,32 +330,32 @@ function yt() {
330
330
  seekByName: t
331
331
  };
332
332
  }
333
- const tt = ({ scene: e, contextParts: n }) => {
334
- const t = ue({
333
+ const rt = ({ scene: e, contextParts: n }) => {
334
+ const t = ie({
335
335
  click: /* @__PURE__ */ new Map(),
336
336
  pointerMove: /* @__PURE__ */ new Map(),
337
337
  pointerEnter: /* @__PURE__ */ new Map(),
338
338
  pointerLeave: /* @__PURE__ */ new Map()
339
- }), r = h(/* @__PURE__ */ new Set()), a = (s) => {
339
+ }), r = B(/* @__PURE__ */ new Set()), a = (s) => {
340
340
  r.value.add(s);
341
341
  }, o = (s) => {
342
342
  r.value.delete(s);
343
343
  }, f = (s) => {
344
344
  Object.values(t).forEach((v) => v.delete(s)), o(s);
345
345
  }, i = (s) => {
346
- const { onClick: v, onPointerMove: y, onPointerEnter: d, onPointerLeave: w } = s;
347
- v && t.click.set(s, v), y && t.pointerMove.set(s, y), d && t.pointerEnter.set(s, d), w && t.pointerLeave.set(s, w);
346
+ const { onClick: v, onPointerMove: y, onPointerEnter: g, onPointerLeave: w } = s;
347
+ v && t.click.set(s, v), y && t.pointerMove.set(s, y), g && t.pointerEnter.set(s, g), w && t.pointerLeave.set(s, w);
348
348
  };
349
349
  e.userData.tres__registerAtPointerEventHandler = i, e.userData.tres__deregisterAtPointerEventHandler = f, e.userData.tres__registerBlockingObjectAtPointerEventHandler = a, e.userData.tres__deregisterBlockingObjectAtPointerEventHandler = o;
350
350
  const c = k(
351
- () => Je(
351
+ () => Ue(
352
352
  [
353
353
  ...Array.from(r.value),
354
354
  ...Object.values(t).map((s) => Array.from(s.keys())).flat()
355
355
  ],
356
356
  ({ uuid: s }) => s
357
357
  )
358
- ), { onClick: u, onPointerMove: m } = et(c, n);
358
+ ), { onClick: u, onPointerMove: m } = tt(c, n);
359
359
  u(({ intersects: s, event: v }) => {
360
360
  var y;
361
361
  s.length && ((y = t.click.get(s[0].object)) == null || y(s[0], v));
@@ -363,14 +363,14 @@ const tt = ({ scene: e, contextParts: n }) => {
363
363
  let l;
364
364
  return m(({ intersects: s, event: v }) => {
365
365
  var C, _, A, b;
366
- const y = (C = s == null ? void 0 : s[0]) == null ? void 0 : C.object, { pointerLeave: d, pointerEnter: w, pointerMove: E } = t;
367
- l && l !== y && ((_ = d.get(l)) == null || _(l, v)), y && (l !== y && ((A = w.get(y)) == null || A(s[0], v)), (b = E.get(y)) == null || b(s[0], v)), l = y || null;
366
+ const y = (C = s == null ? void 0 : s[0]) == null ? void 0 : C.object, { pointerLeave: g, pointerEnter: w, pointerMove: E } = t;
367
+ l && l !== y && ((_ = g.get(l)) == null || _(l, v)), y && (l !== y && ((A = w.get(y)) == null || A(s[0], v)), (b = E.get(y)) == null || b(s[0], v)), l = y || null;
368
368
  }), {
369
369
  registerObject: i,
370
370
  deregisterObject: f
371
371
  };
372
- }, $ = h({}), q = (e) => Object.assign($.value, e);
373
- function rt({
372
+ }, W = B({}), q = (e) => Object.assign(W.value, e);
373
+ function nt({
374
374
  scene: e,
375
375
  canvas: n,
376
376
  windowSize: t,
@@ -378,7 +378,7 @@ function rt({
378
378
  rendererOptions: a
379
379
  }) {
380
380
  const o = k(
381
- () => P(t) ? Fe() : ze(P(n).parentElement)
381
+ () => P(t) ? He() : Fe(P(n).parentElement)
382
382
  ), f = k(() => o.value.width.value), i = k(() => o.value.height.value), c = k(() => f.value / i.value), u = {
383
383
  height: i,
384
384
  width: f,
@@ -388,8 +388,8 @@ function rt({
388
388
  cameras: s,
389
389
  registerCamera: v,
390
390
  deregisterCamera: y,
391
- setCameraActive: d
392
- } = Ge({ sizes: u, scene: e }), { renderer: w } = Qe(
391
+ setCameraActive: g
392
+ } = ze({ sizes: u, scene: e }), { renderer: w } = Qe(
393
393
  {
394
394
  scene: e,
395
395
  canvas: n,
@@ -401,29 +401,29 @@ function rt({
401
401
  sizes: u,
402
402
  scene: m,
403
403
  camera: l,
404
- cameras: le(s),
404
+ cameras: ue(s),
405
405
  renderer: w,
406
- raycaster: F(new he()),
407
- controls: h(null),
406
+ raycaster: F(new Oe()),
407
+ controls: B(null),
408
408
  extend: q,
409
409
  registerCamera: v,
410
- setCameraActive: d,
410
+ setCameraActive: g,
411
411
  deregisterCamera: y
412
412
  };
413
413
  return I("useTres", E), E;
414
414
  }
415
- function nt() {
416
- const e = ce("useTres");
415
+ function at() {
416
+ const e = le("useTres");
417
417
  if (!e)
418
418
  throw new Error("useTresContext must be used together with useTresContextProvider");
419
419
  return e;
420
420
  }
421
- const wt = nt;
421
+ const Ct = at;
422
422
  let G = null, p = null;
423
- const { logError: ee } = B(), at = {
423
+ const { logError: ee } = L(), ot = {
424
424
  createElement(e, n, t, r) {
425
425
  var f, i;
426
- if (r || (r = {}), r.args || (r.args = []), e === "template" || qe(e))
426
+ if (r || (r = {}), r.args || (r.args = []), e === "template" || Ve(e))
427
427
  return null;
428
428
  let a = e.replace("Tres", ""), o;
429
429
  if (e === "primitive") {
@@ -431,7 +431,7 @@ const { logError: ee } = B(), at = {
431
431
  const c = r.object;
432
432
  a = c.type, o = Object.assign(c, { type: a, attach: r.attach, primitive: !0 });
433
433
  } else {
434
- const c = $.value[a];
434
+ const c = W.value[a];
435
435
  c || ee(`${a} is not defined on the THREE namespace. Use extend to add it to the catalog.`), o = new c(...r.args);
436
436
  }
437
437
  return o.isCamera && (r != null && r.position || o.position.set(3, 3, 3), r != null && r.lookAt || o.lookAt(0, 0, 0)), (r == null ? void 0 : r.attach) === void 0 && (o.isMaterial ? o.attach = "material" : o.isBufferGeometry && (o.attach = "geometry")), o.isObject3D && ((f = r == null ? void 0 : r.material) != null && f.isMaterial && (o.userData.tres__materialViaProp = !0), (i = r == null ? void 0 : r.geometry) != null && i.isBufferGeometry && (o.userData.tres__geometryViaProp = !0)), o.userData = {
@@ -440,22 +440,22 @@ const { logError: ee } = B(), at = {
440
440
  }, o;
441
441
  },
442
442
  insert(e, n) {
443
- var t, r, a, o, f, i, c, u, m;
443
+ var t, r, a, o, f, i, c, u, m, l;
444
444
  if (n && n.isScene && (p = n), (((t = e == null ? void 0 : e.__vnode) == null ? void 0 : t.type) === "TresGroup" || ((r = e == null ? void 0 : e.__vnode) == null ? void 0 : r.type) === "TresObject3D") && n === null && !((o = (a = e == null ? void 0 : e.__vnode) == null ? void 0 : a.ctx) != null && o.asyncResolved)) {
445
445
  G = e;
446
446
  return;
447
447
  } else
448
- (f = e == null ? void 0 : e.__vnode) != null && f.type.includes("Controls") && n === null && (G = p);
448
+ n === null && ((f = e == null ? void 0 : e.__vnode) != null && f.type.includes("Controls") || (i = e == null ? void 0 : e.__vnode) != null && i.type.includes("Helper")) && (G = p);
449
449
  if (n || (n = G), e != null && e.isObject3D) {
450
450
  if (e != null && e.isCamera) {
451
451
  if (!(p != null && p.userData.tres__registerCamera))
452
452
  throw "could not find tres__registerCamera on scene's userData";
453
- (c = p == null ? void 0 : (i = p.userData).tres__registerCamera) == null || c.call(i, e);
453
+ (u = p == null ? void 0 : (c = p.userData).tres__registerCamera) == null || u.call(c, e);
454
454
  }
455
455
  if (e != null && e.onClick || e != null && e.onPointerMove || e != null && e.onPointerEnter || e != null && e.onPointerLeave) {
456
456
  if (!(p != null && p.userData.tres__registerAtPointerEventHandler))
457
457
  throw "could not find tres__registerAtPointerEventHandler on scene's userData";
458
- (m = p == null ? void 0 : (u = p.userData).tres__registerAtPointerEventHandler) == null || m.call(u, e);
458
+ (l = p == null ? void 0 : (m = p.userData).tres__registerAtPointerEventHandler) == null || l.call(m, e);
459
459
  }
460
460
  }
461
461
  e != null && e.isObject3D && (n != null && n.isObject3D) ? (n.add(e), e.dispatchEvent({ type: "added" })) : e != null && e.isFog ? n.fog = e : typeof (e == null ? void 0 : e.attach) == "string" && (e.__previousAttach = e[n == null ? void 0 : n.attach], n && (n[e.attach] = e));
@@ -496,24 +496,24 @@ const { logError: ee } = B(), at = {
496
496
  r || r === "" ? (o = p == null ? void 0 : (a = p.userData).tres__registerBlockingObjectAtPointerEventHandler) == null || o.call(a, e) : (i = p == null ? void 0 : (f = p.userData).tres__deregisterBlockingObjectAtPointerEventHandler) == null || i.call(f, e);
497
497
  return;
498
498
  }
499
- let m = T(u), l = c == null ? void 0 : c[m];
499
+ let m = h(u), l = c == null ? void 0 : c[m];
500
500
  if (u === "args") {
501
- const v = e, y = t ?? [], d = r ?? [], w = e.userData.tres__name || e.type;
502
- w && y.length && !Xe(y, d) && (c = Object.assign(v, new $.value[w](...r)));
501
+ const v = e, y = t ?? [], g = r ?? [], w = e.userData.tres__name || e.type;
502
+ w && y.length && !Ke(y, g) && (c = Object.assign(v, new W.value[w](...r)));
503
503
  return;
504
504
  }
505
505
  if (c.type === "BufferGeometry") {
506
506
  if (u === "args")
507
507
  return;
508
508
  c.setAttribute(
509
- T(u),
509
+ h(u),
510
510
  new Be(...r)
511
511
  );
512
512
  return;
513
513
  }
514
514
  if (u.includes("-") && l === void 0) {
515
515
  const v = u.split("-");
516
- l = v.reduce((y, d) => y[T(d)], c), u = v.pop(), m = u.toLowerCase(), l != null && l.set || (c = v.reduce((y, d) => y[T(d)], c));
516
+ l = v.reduce((y, g) => y[h(g)], c), u = v.pop(), m = u.toLowerCase(), l != null && l.set || (c = v.reduce((y, g) => y[h(g)], c));
517
517
  }
518
518
  let s = r;
519
519
  if (s === "" && (s = !0), Z(l)) {
@@ -535,9 +535,9 @@ const { logError: ee } = B(), at = {
535
535
  setScopeId: () => void 0,
536
536
  cloneNode: () => void 0,
537
537
  insertStaticContent: () => void 0
538
- }, { render: ot } = fe(at);
539
- q(we);
540
- const st = ["data-scene"], it = /* @__PURE__ */ U({
538
+ }, { render: st } = ce(ot);
539
+ q(ye);
540
+ const it = ["data-scene"], ut = /* @__PURE__ */ U({
541
541
  __name: "TresCanvas",
542
542
  props: {
543
543
  shadows: { type: Boolean, default: void 0 },
@@ -565,31 +565,31 @@ const st = ["data-scene"], it = /* @__PURE__ */ U({
565
565
  },
566
566
  setup(e) {
567
567
  var m;
568
- const n = e, { logWarning: t } = B(), r = h(), a = F(new Le());
568
+ const n = e, { logWarning: t } = L(), r = B(), a = F(new Le());
569
569
  ae();
570
- const o = me(), f = (m = J()) == null ? void 0 : m.appContext.app, i = (l) => U({
570
+ const o = fe(), f = (m = J()) == null ? void 0 : m.appContext.app, i = (l) => U({
571
571
  setup() {
572
572
  var v;
573
573
  const s = (v = J()) == null ? void 0 : v.appContext;
574
- return s && (s.app = f), I("useTres", l), I("extend", q), () => K(ye, null, o != null && o.default ? o.default() : []);
574
+ return s && (s.app = f), I("useTres", l), I("extend", q), () => K(de, null, o != null && o.default ? o.default() : []);
575
575
  }
576
576
  }), c = (l) => {
577
577
  const s = i(l);
578
- ot(K(s), a.value);
578
+ st(K(s), a.value);
579
579
  }, u = k(() => n.disableRender);
580
- return pe(() => {
581
- const l = r, s = rt({
580
+ return me(() => {
581
+ const l = r, s = nt({
582
582
  scene: a.value,
583
583
  canvas: l,
584
584
  windowSize: n.windowSize,
585
585
  disableRender: u,
586
586
  rendererOptions: n
587
587
  });
588
- tt({ scene: a.value, contextParts: s });
589
- const { registerCamera: v, camera: y, cameras: d, deregisterCamera: w } = s;
588
+ rt({ scene: a.value, contextParts: s });
589
+ const { registerCamera: v, camera: y, cameras: g, deregisterCamera: w } = s;
590
590
  c(s);
591
591
  const E = () => {
592
- const C = new W(
592
+ const C = new $(
593
593
  45,
594
594
  window.innerWidth / window.innerHeight,
595
595
  0.1,
@@ -597,13 +597,13 @@ const st = ["data-scene"], it = /* @__PURE__ */ U({
597
597
  );
598
598
  C.position.set(3, 3, 3), C.lookAt(0, 0, 0), v(C);
599
599
  const _ = D(() => {
600
- d.value.length >= 2 && (C.removeFromParent(), w(C), _ == null || _());
600
+ g.value.length >= 2 && (C.removeFromParent(), w(C), _ == null || _());
601
601
  });
602
602
  };
603
603
  te(
604
604
  () => n.camera,
605
605
  (C, _) => {
606
- C ? v(C) : _ && (_.removeFromParent(), w(_));
606
+ C && v(C), _ && (_.removeFromParent(), w(_));
607
607
  },
608
608
  {
609
609
  immediate: !0
@@ -611,7 +611,7 @@ const st = ["data-scene"], it = /* @__PURE__ */ U({
611
611
  ), y.value || (t(
612
612
  "No camera found. Creating a default perspective camera. To have full control over a camera, please add one to the scene."
613
613
  ), E());
614
- }), (l, s) => (ve(), de("canvas", {
614
+ }), (l, s) => (pe(), ve("canvas", {
615
615
  ref_key: "canvas",
616
616
  ref: r,
617
617
  "data-scene": a.value.uuid,
@@ -625,43 +625,43 @@ const st = ["data-scene"], it = /* @__PURE__ */ U({
625
625
  pointerEvents: "auto",
626
626
  touchAction: "none"
627
627
  })
628
- }, null, 12, st));
628
+ }, null, 12, it));
629
629
  }
630
- }), ut = [
630
+ }), lt = [
631
631
  "TresCanvas",
632
632
  "TresLeches",
633
633
  "TresScene"
634
- ], lt = {
634
+ ], ct = {
635
635
  template: {
636
636
  compilerOptions: {
637
- isCustomElement: (e) => e.startsWith("Tres") && !ut.includes(e) || e === "primitive"
637
+ isCustomElement: (e) => e.startsWith("Tres") && !lt.includes(e) || e === "primitive"
638
638
  }
639
639
  }
640
- }, Ct = lt, _t = {
640
+ }, _t = ct, Pt = {
641
641
  install(e) {
642
- e.component("TresCanvas", it);
642
+ e.component("TresCanvas", ut);
643
643
  }
644
644
  };
645
645
  export {
646
- it as TresCanvas,
647
- $ as catalogue,
648
- _t as default,
646
+ ut as TresCanvas,
647
+ W as catalogue,
648
+ Pt as default,
649
649
  q as extend,
650
- pt as isProd,
651
- Ne as normalizeColor,
652
- vt as normalizeVectorFlexibleParam,
653
- Ct as templateCompilerOptions,
654
- Ze as trasverseObjects,
655
- Ge as useCamera,
650
+ vt as isProd,
651
+ We as normalizeColor,
652
+ gt as normalizeVectorFlexibleParam,
653
+ _t as templateCompilerOptions,
654
+ et as trasverseObjects,
655
+ ze as useCamera,
656
656
  dt as useLoader,
657
- B as useLogger,
658
- tt as usePointerEventHandler,
659
- et as useRaycaster,
657
+ L as useLogger,
658
+ rt as usePointerEventHandler,
659
+ tt as useRaycaster,
660
660
  ae as useRenderLoop,
661
661
  Qe as useRenderer,
662
- yt as useSeek,
663
- gt as useTexture,
664
- wt as useTres,
665
- nt as useTresContext,
666
- rt as useTresContextProvider
662
+ wt as useSeek,
663
+ yt as useTexture,
664
+ Ct as useTres,
665
+ at as useTresContext,
666
+ nt as useTresContextProvider
667
667
  };
package/dist/tres.umd.cjs CHANGED
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * name: @tresjs/core
3
- * version: v3.2.1
3
+ * version: v3.2.3
4
4
  * (c) 2023
5
5
  * description: Declarative ThreeJS using Vue Components
6
6
  * author: Alvaro Saburido <hola@alvarosaburido.dev> (https://github.com/alvarosabu/)
7
7
  */
8
- (function(y,c){typeof exports=="object"&&typeof module<"u"?c(exports,require("vue"),require("three"),require("@vueuse/core")):typeof define=="function"&&define.amd?define(["exports","vue","three","@vueuse/core"],c):(y=typeof globalThis<"u"?globalThis:y||self,c(y.tres={},y.Vue,y.Three,y.VueUseCore))})(this,function(y,c,_,w){"use strict";function se(e){const n=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const t in e)if(t!=="default"){const r=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(n,t,r.get?r:{enumerable:!0,get:()=>e[t]})}}return n.default=e,Object.freeze(n)}const ie=se(_),I=({sizes:e,scene:n})=>{const t=c.ref([]),r=c.computed(()=>t.value[0]),a=(i,f=!1)=>{t.value.some(({uuid:l})=>l===i.uuid)||(f?m(i):t.value.push(i))},o=i=>{t.value=t.value.filter(({uuid:f})=>f!==i.uuid)},m=i=>{const f=i instanceof _.Camera?i:t.value.find(d=>d.uuid===i);if(!f)return;const l=t.value.filter(({uuid:d})=>d!==f.uuid);t.value=[f,...l]};return c.watchEffect(()=>{e.aspectRatio.value&&t.value.forEach(i=>{i instanceof _.PerspectiveCamera&&(i.aspect=e.aspectRatio.value),(i instanceof _.PerspectiveCamera||i instanceof _.OrthographicCamera)&&i.updateProjectionMatrix()})}),n.userData.tres__registerCamera=a,n.userData.tres__deregisterCamera=o,c.onUnmounted(()=>{t.value=[]}),{camera:r,cameras:t,registerCamera:a,deregisterCamera:o,setCameraActive:m}},W=w.createEventHook(),N=w.createEventHook(),F=w.createEventHook(),S=new _.Clock;let B=0,x=0;const{pause:le,resume:ue,isActive:ce}=w.useRafFn(()=>{W.trigger({delta:B,elapsed:x,clock:S}),N.trigger({delta:B,elapsed:x,clock:S}),F.trigger({delta:B,elapsed:x,clock:S})},{immediate:!1});F.on(()=>{B=S.getDelta(),x=S.getElapsedTime()});const G=()=>({onBeforeLoop:W.on,onLoop:N.on,onAfterLoop:F.on,pause:le,resume:ue,isActive:ce}),fe=!0,$="[TresJS ▲ ■ ●] ";function L(){function e(r,a){console.error(`${$} ${r}`,a||"")}function n(r){console.warn(`${$} ${r}`)}function t(r,a){}return{logError:e,logWarning:n,logMessage:t}}function me(e){return typeof e=="number"?[e,e,e]:e instanceof _.Vector3?[e.x,e.y,e.z]:e}function q(e){return e instanceof _.Color?e:Array.isArray(e)?new _.Color(...e):new _.Color(e)}const U=(e,n)=>{for(const t of Object.keys(n))n[t]instanceof Object&&Object.assign(n[t],U(e[t],n[t]));return Object.assign(e||{},n),e},de=pe("html,body,base,head,link,meta,style,title,address,article,aside,footer,header,hgroup,h1,h2,h3,h4,h5,h6,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,summary,template,blockquote,iframe,tfoot");function H(e){return e&&e.nodeType===1}function j(e){return e.replace(/-([a-z])/g,(n,t)=>t.toUpperCase())}function pe(e,n){const t=Object.create(null),r=e.split(",");for(let a=0;a<r.length;a++)t[r[a]]=!0;return n?a=>!!t[a.toLowerCase()]:a=>!!t[a]}const ge=(e,n)=>{const t=new Set,r=[];for(const a of e){const o=n(a);t.has(o)||(t.add(o),r.push(a))}return r},J=(e,n)=>{if(!n)return;const t=Array.isArray(n)?n:n.match(/([^[.\]])+/g);return t==null?void 0:t.reduce((r,a)=>r&&r[a],e)},ve=(e,n,t)=>{const r=Array.isArray(n)?n:n.match(/([^[.\]])+/g);r&&r.reduce((a,o,m)=>(a[o]===void 0&&(a[o]={}),m===r.length-1&&(a[o]=t),a[o]),e)};function K(e,n){if(H(e)&&H(n)){const a=e.attributes,o=n.attributes;return a.length!==o.length?!1:Array.from(a).every(({name:m,value:i})=>n.getAttribute(m)===i)}if(e===n)return!0;if(e===null||typeof e!="object"||n===null||typeof n!="object")return!1;const t=Object.keys(e),r=Object.keys(n);if(t.length!==r.length)return!1;for(const a of t)if(!r.includes(a)||!K(e[a],n[a]))return!1;return!0}function ye(e,n){if(!Array.isArray(e)||!Array.isArray(n)||e.length!==n.length)return!1;for(let t=0;t<e.length;t++)if(!K(e[t],n[t]))return!1;return!0}const we=Number.parseInt(_.REVISION.replace("dev","")),T={realistic:{outputColorSpace:_.SRGBColorSpace,toneMapping:_.ACESFilmicToneMapping,toneMappingExposure:3,shadowMap:{enabled:!0,type:_.PCFSoftShadowMap}}};function X({scene:e,canvas:n,options:t,disableRender:r,contextParts:{sizes:a,camera:o}}){const m=c.computed(()=>({alpha:w.toValue(t.alpha),depth:w.toValue(t.depth),canvas:w.unrefElement(n),context:w.toValue(t.context),stencil:w.toValue(t.stencil),antialias:w.toValue(t.antialias)===void 0?!0:w.toValue(t.antialias),precision:w.toValue(t.precision),powerPreference:w.toValue(t.powerPreference),premultipliedAlpha:w.toValue(t.premultipliedAlpha),preserveDrawingBuffer:w.toValue(t.preserveDrawingBuffer),logarithmicDepthBuffer:w.toValue(t.logarithmicDepthBuffer),failIfMajorPerformanceCaveat:w.toValue(t.failIfMajorPerformanceCaveat)})),i=c.shallowRef(new _.WebGLRenderer(m.value));c.watch(m,()=>{i.value.dispose(),i.value=new _.WebGLRenderer(m.value)}),c.watchEffect(()=>{i.value.setSize(a.width.value,a.height.value)});const{pixelRatio:f}=w.useDevicePixelRatio();c.watchEffect(()=>{i.value.setPixelRatio(f.value)});const{logError:l}=L(),u=(()=>{const v=new _.WebGLRenderer,M={shadowMap:{enabled:v.shadowMap.enabled,type:v.shadowMap.type},toneMapping:v.toneMapping,toneMappingExposure:v.toneMappingExposure,outputColorSpace:v.outputColorSpace};return v.dispose(),M})();c.watchEffect(()=>{const v=w.toValue(t.preset);v&&(v in T||l(`Renderer Preset must be one of these: ${Object.keys(T).join(", ")}`),U(i.value,T[v]));const M=(k,O)=>{const D=w.toValue(k),z=()=>{if(v)return J(T[v],O)};if(D!==void 0)return D;const C=z();return C!==void 0?C:J(u,O)},h=(k,O)=>ve(i.value,O,M(k,O));h(t.shadows,"shadowMap.enabled"),h(t.toneMapping,"toneMapping"),h(t.shadowMapType,"shadowMap.type"),we<150&&h(!t.useLegacyLights,"physicallyCorrectLights"),h(t.outputColorSpace,"outputColorSpace"),h(t.toneMappingExposure,"toneMappingExposure");const b=M(t.clearColor,"clearColor");b&&i.value.setClearColor(b?q(b):new _.Color(0))});const{pause:s,resume:g,onLoop:P}=G();return P(()=>{o.value&&!w.toValue(r)&&i.value.render(e,o.value)}),g(),c.onUnmounted(()=>{s(),i.value.dispose(),i.value.forceContextLoss()}),{renderer:i}}const Y=e=>typeof e=="function",Q=e=>!!e&&e.constructor===Array;function Z(e){const n={nodes:{},materials:{}};return e&&e.traverse(t=>{t.name&&(n.nodes[t.name]=t),t.material&&!n.materials[t.material.name]&&(n.materials[t.material.name]=t.material)}),n}async function Ce(e,n,t,r,a){const{logError:o}=L(),m=new e;a&&a(m),t&&t(m);const f=(Array.isArray(n)?n:[n]).map(l=>new Promise((d,u)=>{m.load(l,s=>{s.scene&&Object.assign(s,Z(s.scene)),d(s)},r,s=>u(o("[useLoader] - Failed to load resource",s)))}));return Q(n)?await Promise.all(f):await f[0]}async function Pe(e){const n=new _.LoadingManager,t=new _.TextureLoader(n),r=a=>new Promise((o,m)=>{t.load(a,i=>o(i),()=>null,()=>{m(new Error("[useTextures] - Failed to load texture"))})});if(Q(e)){const a=await Promise.all(e.map(o=>r(o)));return e.length>1?a:a[0]}else{const{map:a,displacementMap:o,normalMap:m,roughnessMap:i,metalnessMap:f,aoMap:l,alphaMap:d,matcap:u}=e;return{map:a?await r(a):null,displacementMap:o?await r(o):null,normalMap:m?await r(m):null,roughnessMap:i?await r(i):null,metalnessMap:f?await r(f):null,aoMap:l?await r(l):null,alphaMap:d?await r(d):null,matcap:u?await r(u):null}}}const ee=(e,{renderer:n,camera:t,raycaster:r})=>{const a=c.computed(()=>n.value.domElement),{x:o,y:m}=w.usePointer({target:a}),{width:i,height:f,top:l,left:d}=w.useElementBounding(a),u=({x:C,y:A})=>{if(a.value)return{x:(C-d.value)/i.value*2-1,y:-((A-l.value)/f.value)*2+1}},s=({x:C,y:A})=>{if(t.value)return r.value.setFromCamera(new _.Vector2(C,A),t.value),r.value.intersectObjects(e.value,!1)},g=C=>{const A=u({x:(C==null?void 0:C.clientX)??o.value,y:(C==null?void 0:C.clientY)??m.value});return A?s(A)||[]:[]},P=c.computed(()=>g()),v=w.createEventHook(),M=w.createEventHook(),h=(C,A)=>{C.trigger({event:A,intersects:g(A)})},b=C=>{h(M,C)};let k;const O=C=>{var A;k=(A=g(C)[0])==null?void 0:A.object},D=C=>{var A;C instanceof PointerEvent&&k===((A=g(C)[0])==null?void 0:A.object)&&h(v,C)},z=C=>M.trigger({event:C,intersects:[]});return a.value.addEventListener("pointerup",D),a.value.addEventListener("pointerdown",O),a.value.addEventListener("pointermove",b),a.value.addEventListener("pointerleave",z),c.onUnmounted(()=>{a!=null&&a.value&&(a.value.removeEventListener("pointerup",D),a.value.removeEventListener("pointerdown",O),a.value.removeEventListener("pointermove",b),a.value.removeEventListener("pointerleave",z))}),{intersects:P,onClick:C=>v.on(C).off,onPointerMove:C=>M.on(C).off}};function _e(){const{logWarning:e}=L();function n(r,a,o){let m=null;return r.traverse(i=>{i[a]===o&&(m=i)}),m||e(`Child with ${a} '${o}' not found.`),m}function t(r,a){return n(r,"name",a)}return{seek:n,seekByName:t}}const te=({scene:e,contextParts:n})=>{const t=c.reactive({click:new Map,pointerMove:new Map,pointerEnter:new Map,pointerLeave:new Map}),r=c.ref(new Set),a=s=>{r.value.add(s)},o=s=>{r.value.delete(s)},m=s=>{Object.values(t).forEach(g=>g.delete(s)),o(s)},i=s=>{const{onClick:g,onPointerMove:P,onPointerEnter:v,onPointerLeave:M}=s;g&&t.click.set(s,g),P&&t.pointerMove.set(s,P),v&&t.pointerEnter.set(s,v),M&&t.pointerLeave.set(s,M)};e.userData.tres__registerAtPointerEventHandler=i,e.userData.tres__deregisterAtPointerEventHandler=m,e.userData.tres__registerBlockingObjectAtPointerEventHandler=a,e.userData.tres__deregisterBlockingObjectAtPointerEventHandler=o;const f=c.computed(()=>ge([...Array.from(r.value),...Object.values(t).map(s=>Array.from(s.keys())).flat()],({uuid:s})=>s)),{onClick:l,onPointerMove:d}=ee(f,n);l(({intersects:s,event:g})=>{var P;s.length&&((P=t.click.get(s[0].object))==null||P(s[0],g))});let u;return d(({intersects:s,event:g})=>{var b,k,O,D;const P=(b=s==null?void 0:s[0])==null?void 0:b.object,{pointerLeave:v,pointerEnter:M,pointerMove:h}=t;u&&u!==P&&((k=v.get(u))==null||k(u,g)),P&&(u!==P&&((O=M.get(P))==null||O(s[0],g)),(D=h.get(P))==null||D(s[0],g)),u=P||null}),{registerObject:i,deregisterObject:m}},E=c.ref({}),V=e=>Object.assign(E.value,e);function re({scene:e,canvas:n,windowSize:t,disableRender:r,rendererOptions:a}){const o=c.computed(()=>w.toValue(t)?w.useWindowSize():w.useElementSize(w.toValue(n).parentElement)),m=c.computed(()=>o.value.width.value),i=c.computed(()=>o.value.height.value),f=c.computed(()=>m.value/i.value),l={height:i,width:m,aspectRatio:f},d=c.shallowRef(e),{camera:u,cameras:s,registerCamera:g,deregisterCamera:P,setCameraActive:v}=I({sizes:l,scene:e}),{renderer:M}=X({scene:e,canvas:n,options:a,contextParts:{sizes:l,camera:u},disableRender:r}),h={sizes:l,scene:d,camera:u,cameras:c.readonly(s),renderer:M,raycaster:c.shallowRef(new _.Raycaster),controls:c.ref(null),extend:V,registerCamera:g,setCameraActive:v,deregisterCamera:P};return c.provide("useTres",h),h}function ne(){const e=c.inject("useTres");if(!e)throw new Error("useTresContext must be used together with useTresContextProvider");return e}const Me=ne;function Se(e){}let R=null,p=null;const{logError:ae}=L(),be={createElement(e,n,t,r){var m,i;if(r||(r={}),r.args||(r.args=[]),e==="template"||de(e))return null;let a=e.replace("Tres",""),o;if(e==="primitive"){(r==null?void 0:r.object)===void 0&&ae("Tres primitives need a prop 'object'");const f=r.object;a=f.type,o=Object.assign(f,{type:a,attach:r.attach,primitive:!0})}else{const f=E.value[a];f||ae(`${a} is not defined on the THREE namespace. Use extend to add it to the catalog.`),o=new f(...r.args)}return o.isCamera&&(r!=null&&r.position||o.position.set(3,3,3),r!=null&&r.lookAt||o.lookAt(0,0,0)),(r==null?void 0:r.attach)===void 0&&(o.isMaterial?o.attach="material":o.isBufferGeometry&&(o.attach="geometry")),o.isObject3D&&((m=r==null?void 0:r.material)!=null&&m.isMaterial&&(o.userData.tres__materialViaProp=!0),(i=r==null?void 0:r.geometry)!=null&&i.isBufferGeometry&&(o.userData.tres__geometryViaProp=!0)),o.userData={...o.userData,tres__name:a},o},insert(e,n){var t,r,a,o,m,i,f,l,d;if(n&&n.isScene&&(p=n),(((t=e==null?void 0:e.__vnode)==null?void 0:t.type)==="TresGroup"||((r=e==null?void 0:e.__vnode)==null?void 0:r.type)==="TresObject3D")&&n===null&&!((o=(a=e==null?void 0:e.__vnode)==null?void 0:a.ctx)!=null&&o.asyncResolved)){R=e;return}else(m=e==null?void 0:e.__vnode)!=null&&m.type.includes("Controls")&&n===null&&(R=p);if(n||(n=R),e!=null&&e.isObject3D){if(e!=null&&e.isCamera){if(!(p!=null&&p.userData.tres__registerCamera))throw"could not find tres__registerCamera on scene's userData";(f=p==null?void 0:(i=p.userData).tres__registerCamera)==null||f.call(i,e)}if(e!=null&&e.onClick||e!=null&&e.onPointerMove||e!=null&&e.onPointerEnter||e!=null&&e.onPointerLeave){if(!(p!=null&&p.userData.tres__registerAtPointerEventHandler))throw"could not find tres__registerAtPointerEventHandler on scene's userData";(d=p==null?void 0:(l=p.userData).tres__registerAtPointerEventHandler)==null||d.call(l,e)}}e!=null&&e.isObject3D&&(n!=null&&n.isObject3D)?(n.add(e),e.dispatchEvent({type:"added"})):e!=null&&e.isFog?n.fog=e:typeof(e==null?void 0:e.attach)=="string"&&(e.__previousAttach=e[n==null?void 0:n.attach],n&&(n[e.attach]=e))},remove(e){var n,t;if(e){if(e.isObject3D){const r=e,a=l=>{var u,s;const d=l;l.userData.tres__materialViaProp||(u=d.material)==null||u.dispose(),l.userData.tres__geometryViaProp||(s=d.geometry)==null||s.dispose()},o=p==null?void 0:p.userData.tres__deregisterAtPointerEventHandler,m=p==null?void 0:p.userData.tres__deregisterBlockingObjectAtPointerEventHandler,i=l=>{var d,u;if(!m)throw"could not find tres__deregisterBlockingObjectAtPointerEventHandler on scene's userData";if((u=p==null?void 0:(d=p.userData).tres__deregisterBlockingObjectAtPointerEventHandler)==null||u.call(d,l),!o)throw"could not find tres__deregisterAtPointerEventHandler on scene's userData";(l!=null&&l.onClick||l!=null&&l.onPointerMove||l!=null&&l.onPointerEnter||l!=null&&l.onPointerLeave)&&(o==null||o(l))},f=l=>{const d=p==null?void 0:p.userData.tres__deregisterCamera;if(!d)throw"could not find tres__deregisterCamera on scene's userData";l.isCamera&&(d==null||d(l))};r.traverse(l=>{a(l),f(l),i==null||i(l)}),a(r),f(r),i==null||i(r)}(n=e.removeFromParent)==null||n.call(e),(t=e.dispose)==null||t.call(e)}},patchProp(e,n,t,r){var a,o,m,i;if(e){let f=e,l=n;if(e.isObject3D&&l==="blocks-pointer-events"){r||r===""?(o=p==null?void 0:(a=p.userData).tres__registerBlockingObjectAtPointerEventHandler)==null||o.call(a,e):(i=p==null?void 0:(m=p.userData).tres__deregisterBlockingObjectAtPointerEventHandler)==null||i.call(m,e);return}let d=j(l),u=f==null?void 0:f[d];if(l==="args"){const g=e,P=t??[],v=r??[],M=e.userData.tres__name||e.type;M&&P.length&&!ye(P,v)&&(f=Object.assign(g,new E.value[M](...r)));return}if(f.type==="BufferGeometry"){if(l==="args")return;f.setAttribute(j(l),new _.BufferAttribute(...r));return}if(l.includes("-")&&u===void 0){const g=l.split("-");u=g.reduce((P,v)=>P[j(v)],f),l=g.pop(),d=l.toLowerCase(),u!=null&&u.set||(f=g.reduce((P,v)=>P[j(v)],f))}let s=r;if(s===""&&(s=!0),Y(u)){Array.isArray(s)?e[d](...s):e[d](s);return}!(u!=null&&u.set)&&!Y(u)?f[d]=s:u.constructor===s.constructor&&(u!=null&&u.copy)?u==null||u.copy(s):Array.isArray(s)?u.set(...s):!u.isColor&&u.setScalar?u.setScalar(s):u.set(s)}},parentNode(e){return(e==null?void 0:e.parent)||null},createText:()=>void 0,createComment:()=>void 0,setText:()=>void 0,setElementText:()=>void 0,nextSibling:()=>void 0,querySelector:()=>void 0,setScopeId:()=>void 0,cloneNode:()=>void 0,insertStaticContent:()=>void 0},{render:ke}=c.createRenderer(be);V(ie);const he=["data-scene"],oe=c.defineComponent({__name:"TresCanvas",props:{shadows:{type:Boolean,default:void 0},clearColor:{},toneMapping:{},shadowMapType:{},useLegacyLights:{type:Boolean,default:void 0},outputColorSpace:{},toneMappingExposure:{},camera:{},preset:{},windowSize:{type:Boolean,default:void 0},disableRender:{type:Boolean,default:void 0},context:{},precision:{},alpha:{type:Boolean,default:void 0},premultipliedAlpha:{type:Boolean},antialias:{type:Boolean,default:void 0},stencil:{type:Boolean,default:void 0},preserveDrawingBuffer:{type:Boolean,default:void 0},powerPreference:{},depth:{type:Boolean,default:void 0},logarithmicDepthBuffer:{type:Boolean,default:void 0},failIfMajorPerformanceCaveat:{type:Boolean,default:void 0}},setup(e){var d;const n=e,{logWarning:t}=L(),r=c.ref(),a=c.shallowRef(new _.Scene);G();const o=c.useSlots(),m=(d=c.getCurrentInstance())==null?void 0:d.appContext.app,i=u=>c.defineComponent({setup(){var g;const s=(g=c.getCurrentInstance())==null?void 0:g.appContext;return s&&(s.app=m),c.provide("useTres",u),c.provide("extend",V),()=>c.h(c.Fragment,null,o!=null&&o.default?o.default():[])}}),f=u=>{const s=i(u);ke(c.h(s),a.value)},l=c.computed(()=>n.disableRender);return c.onMounted(()=>{const u=r,s=re({scene:a.value,canvas:u,windowSize:n.windowSize,disableRender:l,rendererOptions:n});te({scene:a.value,contextParts:s});const{registerCamera:g,camera:P,cameras:v,deregisterCamera:M}=s;f(s);const h=()=>{const b=new _.PerspectiveCamera(45,window.innerWidth/window.innerHeight,.1,1e3);b.position.set(3,3,3),b.lookAt(0,0,0),g(b);const k=c.watchEffect(()=>{v.value.length>=2&&(b.removeFromParent(),M(b),k==null||k())})};c.watch(()=>n.camera,(b,k)=>{b?g(b):k&&(k.removeFromParent(),M(k))},{immediate:!0}),P.value||(t("No camera found. Creating a default perspective camera. To have full control over a camera, please add one to the scene."),h())}),(u,s)=>(c.openBlock(),c.createElementBlock("canvas",{ref_key:"canvas",ref:r,"data-scene":a.value.uuid,style:c.normalizeStyle({display:"block",width:"100%",height:"100%",position:u.windowSize?"fixed":"relative",top:0,left:0,pointerEvents:"auto",touchAction:"none"})},null,12,he))}}),Ae=["TresCanvas","TresLeches","TresScene"],Oe={template:{compilerOptions:{isCustomElement:e=>e.startsWith("Tres")&&!Ae.includes(e)||e==="primitive"}}},De={install(e){e.component("TresCanvas",oe)}};y.TresCanvas=oe,y.catalogue=E,y.default=De,y.extend=V,y.isProd=fe,y.normalizeColor=q,y.normalizeVectorFlexibleParam=me,y.templateCompilerOptions=Oe,y.trasverseObjects=Z,y.useCamera=I,y.useLoader=Ce,y.useLogger=L,y.usePointerEventHandler=te,y.useRaycaster=ee,y.useRenderLoop=G,y.useRenderer=X,y.useSeek=_e,y.useTexture=Pe,y.useTres=Me,y.useTresContext=ne,y.useTresContextProvider=re,Object.defineProperties(y,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
8
+ (function(y,c){typeof exports=="object"&&typeof module<"u"?c(exports,require("vue"),require("three"),require("@vueuse/core")):typeof define=="function"&&define.amd?define(["exports","vue","three","@vueuse/core"],c):(y=typeof globalThis<"u"?globalThis:y||self,c(y.tres={},y.Vue,y.Three,y.VueUseCore))})(this,function(y,c,P,w){"use strict";function oe(e){const n=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const t in e)if(t!=="default"){const r=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(n,t,r.get?r:{enumerable:!0,get:()=>e[t]})}}return n.default=e,Object.freeze(n)}const se=oe(P),I=({sizes:e,scene:n})=>{const t=c.ref([]),r=c.computed(()=>t.value[0]),a=(i,f=!1)=>{t.value.some(({uuid:l})=>l===i.uuid)||(f?m(i):t.value.push(i))},o=i=>{t.value=t.value.filter(({uuid:f})=>f!==i.uuid)},m=i=>{const f=i instanceof P.Camera?i:t.value.find(d=>d.uuid===i);if(!f)return;const l=t.value.filter(({uuid:d})=>d!==f.uuid);t.value=[f,...l]};return c.watchEffect(()=>{e.aspectRatio.value&&t.value.forEach(i=>{i instanceof P.PerspectiveCamera&&(i.aspect=e.aspectRatio.value),(i instanceof P.PerspectiveCamera||i instanceof P.OrthographicCamera)&&i.updateProjectionMatrix()})}),n.userData.tres__registerCamera=a,n.userData.tres__deregisterCamera=o,c.onUnmounted(()=>{t.value=[]}),{camera:r,cameras:t,registerCamera:a,deregisterCamera:o,setCameraActive:m}},W=w.createEventHook(),$=w.createEventHook(),F=w.createEventHook(),S=new P.Clock;let B=0,x=0;const{pause:ie,resume:le,isActive:ue}=w.useRafFn(()=>{W.trigger({delta:B,elapsed:x,clock:S}),$.trigger({delta:B,elapsed:x,clock:S}),F.trigger({delta:B,elapsed:x,clock:S})},{immediate:!1});F.on(()=>{B=S.getDelta(),x=S.getElapsedTime()});const G=()=>({onBeforeLoop:W.on,onLoop:$.on,onAfterLoop:F.on,pause:ie,resume:le,isActive:ue}),ce=!0,N="[TresJS ▲ ■ ●] ";function L(){function e(r,a){console.error(`${N} ${r}`,a||"")}function n(r){console.warn(`${N} ${r}`)}function t(r,a){}return{logError:e,logWarning:n,logMessage:t}}function fe(e){return typeof e=="number"?[e,e,e]:e instanceof P.Vector3?[e.x,e.y,e.z]:e}function q(e){return e instanceof P.Color?e:Array.isArray(e)?new P.Color(...e):new P.Color(e)}const U=(e,n)=>{for(const t of Object.keys(n))n[t]instanceof Object&&Object.assign(n[t],U(e[t],n[t]));return Object.assign(e||{},n),e},me=de("html,body,base,head,link,meta,style,title,address,article,aside,footer,header,hgroup,h1,h2,h3,h4,h5,h6,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,summary,template,blockquote,iframe,tfoot");function H(e){return e&&e.nodeType===1}function j(e){return e.replace(/-([a-z])/g,(n,t)=>t.toUpperCase())}function de(e,n){const t=Object.create(null),r=e.split(",");for(let a=0;a<r.length;a++)t[r[a]]=!0;return n?a=>!!t[a.toLowerCase()]:a=>!!t[a]}const pe=(e,n)=>{const t=new Set,r=[];for(const a of e){const o=n(a);t.has(o)||(t.add(o),r.push(a))}return r},J=(e,n)=>{if(!n)return;const t=Array.isArray(n)?n:n.match(/([^[.\]])+/g);return t==null?void 0:t.reduce((r,a)=>r&&r[a],e)},ge=(e,n,t)=>{const r=Array.isArray(n)?n:n.match(/([^[.\]])+/g);r&&r.reduce((a,o,m)=>(a[o]===void 0&&(a[o]={}),m===r.length-1&&(a[o]=t),a[o]),e)};function K(e,n){if(H(e)&&H(n)){const a=e.attributes,o=n.attributes;return a.length!==o.length?!1:Array.from(a).every(({name:m,value:i})=>n.getAttribute(m)===i)}if(e===n)return!0;if(e===null||typeof e!="object"||n===null||typeof n!="object")return!1;const t=Object.keys(e),r=Object.keys(n);if(t.length!==r.length)return!1;for(const a of t)if(!r.includes(a)||!K(e[a],n[a]))return!1;return!0}function ve(e,n){if(!Array.isArray(e)||!Array.isArray(n)||e.length!==n.length)return!1;for(let t=0;t<e.length;t++)if(!K(e[t],n[t]))return!1;return!0}const ye=Array.isArray,we=Number.parseInt(P.REVISION.replace("dev","")),T={realistic:{outputColorSpace:P.SRGBColorSpace,toneMapping:P.ACESFilmicToneMapping,toneMappingExposure:3,shadowMap:{enabled:!0,type:P.PCFSoftShadowMap}}};function X({scene:e,canvas:n,options:t,disableRender:r,contextParts:{sizes:a,camera:o}}){const m=c.computed(()=>({alpha:w.toValue(t.alpha),depth:w.toValue(t.depth),canvas:w.unrefElement(n),context:w.toValue(t.context),stencil:w.toValue(t.stencil),antialias:w.toValue(t.antialias)===void 0?!0:w.toValue(t.antialias),precision:w.toValue(t.precision),powerPreference:w.toValue(t.powerPreference),premultipliedAlpha:w.toValue(t.premultipliedAlpha),preserveDrawingBuffer:w.toValue(t.preserveDrawingBuffer),logarithmicDepthBuffer:w.toValue(t.logarithmicDepthBuffer),failIfMajorPerformanceCaveat:w.toValue(t.failIfMajorPerformanceCaveat)})),i=c.shallowRef(new P.WebGLRenderer(m.value));c.watch(m,()=>{i.value.dispose(),i.value=new P.WebGLRenderer(m.value)}),c.watchEffect(()=>{i.value.setSize(a.width.value,a.height.value)});const{pixelRatio:f}=w.useDevicePixelRatio();c.watchEffect(()=>{i.value.setPixelRatio(f.value)});const{logError:l}=L(),u=(()=>{const v=new P.WebGLRenderer,M={shadowMap:{enabled:v.shadowMap.enabled,type:v.shadowMap.type},toneMapping:v.toneMapping,toneMappingExposure:v.toneMappingExposure,outputColorSpace:v.outputColorSpace};return v.dispose(),M})();c.watchEffect(()=>{const v=w.toValue(t.preset);v&&(v in T||l(`Renderer Preset must be one of these: ${Object.keys(T).join(", ")}`),U(i.value,T[v]));const M=(k,h)=>{const D=w.toValue(k),z=()=>{if(v)return J(T[v],h)};if(D!==void 0)return D;const C=z();return C!==void 0?C:J(u,h)},A=(k,h)=>ge(i.value,h,M(k,h));A(t.shadows,"shadowMap.enabled"),A(t.toneMapping,"toneMapping"),A(t.shadowMapType,"shadowMap.type"),we<150&&A(!t.useLegacyLights,"physicallyCorrectLights"),A(t.outputColorSpace,"outputColorSpace"),A(t.toneMappingExposure,"toneMappingExposure");const b=M(t.clearColor,"clearColor");b&&i.value.setClearColor(b?q(b):new P.Color(0))});const{pause:s,resume:g,onLoop:_}=G();return _(()=>{o.value&&!w.toValue(r)&&i.value.render(e,o.value)}),g(),c.onUnmounted(()=>{s(),i.value.dispose(),i.value.forceContextLoss()}),{renderer:i}}const Y=e=>typeof e=="function",Ce=e=>!!e&&e.constructor===Array;function Q(e){const n={nodes:{},materials:{}};return e&&e.traverse(t=>{t.name&&(n.nodes[t.name]=t),t.material&&!n.materials[t.material.name]&&(n.materials[t.material.name]=t.material)}),n}async function _e(e,n,t,r,a){const{logError:o}=L(),m=new e;a&&a(m),t&&t(m);const f=(Array.isArray(n)?n:[n]).map(l=>new Promise((d,u)=>{m.load(l,s=>{s.scene&&Object.assign(s,Q(s.scene)),d(s)},r,s=>u(o("[useLoader] - Failed to load resource",s)))}));return Ce(n)?await Promise.all(f):await f[0]}async function Pe(e){const n=new P.LoadingManager,t=new P.TextureLoader(n),r=a=>new Promise((o,m)=>{t.load(a,i=>o(i),()=>null,()=>{m(new Error("[useTextures] - Failed to load texture"))})});if(ye(e)){const a=await Promise.all(e.map(o=>r(o)));return e.length>1?a:a[0]}else{const{map:a,displacementMap:o,normalMap:m,roughnessMap:i,metalnessMap:f,aoMap:l,alphaMap:d,matcap:u}=e;return{map:a?await r(a):null,displacementMap:o?await r(o):null,normalMap:m?await r(m):null,roughnessMap:i?await r(i):null,metalnessMap:f?await r(f):null,aoMap:l?await r(l):null,alphaMap:d?await r(d):null,matcap:u?await r(u):null}}}const Z=(e,{renderer:n,camera:t,raycaster:r})=>{const a=c.computed(()=>n.value.domElement),{x:o,y:m}=w.usePointer({target:a}),{width:i,height:f,top:l,left:d}=w.useElementBounding(a),u=({x:C,y:O})=>{if(a.value)return{x:(C-d.value)/i.value*2-1,y:-((O-l.value)/f.value)*2+1}},s=({x:C,y:O})=>{if(t.value)return r.value.setFromCamera(new P.Vector2(C,O),t.value),r.value.intersectObjects(e.value,!1)},g=C=>{const O=u({x:(C==null?void 0:C.clientX)??o.value,y:(C==null?void 0:C.clientY)??m.value});return O?s(O)||[]:[]},_=c.computed(()=>g()),v=w.createEventHook(),M=w.createEventHook(),A=(C,O)=>{C.trigger({event:O,intersects:g(O)})},b=C=>{A(M,C)};let k;const h=C=>{var O;k=(O=g(C)[0])==null?void 0:O.object},D=C=>{var O;C instanceof PointerEvent&&k===((O=g(C)[0])==null?void 0:O.object)&&A(v,C)},z=C=>M.trigger({event:C,intersects:[]});return a.value.addEventListener("pointerup",D),a.value.addEventListener("pointerdown",h),a.value.addEventListener("pointermove",b),a.value.addEventListener("pointerleave",z),c.onUnmounted(()=>{a!=null&&a.value&&(a.value.removeEventListener("pointerup",D),a.value.removeEventListener("pointerdown",h),a.value.removeEventListener("pointermove",b),a.value.removeEventListener("pointerleave",z))}),{intersects:_,onClick:C=>v.on(C).off,onPointerMove:C=>M.on(C).off}};function Me(){const{logWarning:e}=L();function n(r,a,o){let m=null;return r.traverse(i=>{i[a]===o&&(m=i)}),m||e(`Child with ${a} '${o}' not found.`),m}function t(r,a){return n(r,"name",a)}return{seek:n,seekByName:t}}const ee=({scene:e,contextParts:n})=>{const t=c.reactive({click:new Map,pointerMove:new Map,pointerEnter:new Map,pointerLeave:new Map}),r=c.ref(new Set),a=s=>{r.value.add(s)},o=s=>{r.value.delete(s)},m=s=>{Object.values(t).forEach(g=>g.delete(s)),o(s)},i=s=>{const{onClick:g,onPointerMove:_,onPointerEnter:v,onPointerLeave:M}=s;g&&t.click.set(s,g),_&&t.pointerMove.set(s,_),v&&t.pointerEnter.set(s,v),M&&t.pointerLeave.set(s,M)};e.userData.tres__registerAtPointerEventHandler=i,e.userData.tres__deregisterAtPointerEventHandler=m,e.userData.tres__registerBlockingObjectAtPointerEventHandler=a,e.userData.tres__deregisterBlockingObjectAtPointerEventHandler=o;const f=c.computed(()=>pe([...Array.from(r.value),...Object.values(t).map(s=>Array.from(s.keys())).flat()],({uuid:s})=>s)),{onClick:l,onPointerMove:d}=Z(f,n);l(({intersects:s,event:g})=>{var _;s.length&&((_=t.click.get(s[0].object))==null||_(s[0],g))});let u;return d(({intersects:s,event:g})=>{var b,k,h,D;const _=(b=s==null?void 0:s[0])==null?void 0:b.object,{pointerLeave:v,pointerEnter:M,pointerMove:A}=t;u&&u!==_&&((k=v.get(u))==null||k(u,g)),_&&(u!==_&&((h=M.get(_))==null||h(s[0],g)),(D=A.get(_))==null||D(s[0],g)),u=_||null}),{registerObject:i,deregisterObject:m}},E=c.ref({}),V=e=>Object.assign(E.value,e);function te({scene:e,canvas:n,windowSize:t,disableRender:r,rendererOptions:a}){const o=c.computed(()=>w.toValue(t)?w.useWindowSize():w.useElementSize(w.toValue(n).parentElement)),m=c.computed(()=>o.value.width.value),i=c.computed(()=>o.value.height.value),f=c.computed(()=>m.value/i.value),l={height:i,width:m,aspectRatio:f},d=c.shallowRef(e),{camera:u,cameras:s,registerCamera:g,deregisterCamera:_,setCameraActive:v}=I({sizes:l,scene:e}),{renderer:M}=X({scene:e,canvas:n,options:a,contextParts:{sizes:l,camera:u},disableRender:r}),A={sizes:l,scene:d,camera:u,cameras:c.readonly(s),renderer:M,raycaster:c.shallowRef(new P.Raycaster),controls:c.ref(null),extend:V,registerCamera:g,setCameraActive:v,deregisterCamera:_};return c.provide("useTres",A),A}function re(){const e=c.inject("useTres");if(!e)throw new Error("useTresContext must be used together with useTresContextProvider");return e}const be=re;function Be(e){}let R=null,p=null;const{logError:ne}=L(),ke={createElement(e,n,t,r){var m,i;if(r||(r={}),r.args||(r.args=[]),e==="template"||me(e))return null;let a=e.replace("Tres",""),o;if(e==="primitive"){(r==null?void 0:r.object)===void 0&&ne("Tres primitives need a prop 'object'");const f=r.object;a=f.type,o=Object.assign(f,{type:a,attach:r.attach,primitive:!0})}else{const f=E.value[a];f||ne(`${a} is not defined on the THREE namespace. Use extend to add it to the catalog.`),o=new f(...r.args)}return o.isCamera&&(r!=null&&r.position||o.position.set(3,3,3),r!=null&&r.lookAt||o.lookAt(0,0,0)),(r==null?void 0:r.attach)===void 0&&(o.isMaterial?o.attach="material":o.isBufferGeometry&&(o.attach="geometry")),o.isObject3D&&((m=r==null?void 0:r.material)!=null&&m.isMaterial&&(o.userData.tres__materialViaProp=!0),(i=r==null?void 0:r.geometry)!=null&&i.isBufferGeometry&&(o.userData.tres__geometryViaProp=!0)),o.userData={...o.userData,tres__name:a},o},insert(e,n){var t,r,a,o,m,i,f,l,d,u;if(n&&n.isScene&&(p=n),(((t=e==null?void 0:e.__vnode)==null?void 0:t.type)==="TresGroup"||((r=e==null?void 0:e.__vnode)==null?void 0:r.type)==="TresObject3D")&&n===null&&!((o=(a=e==null?void 0:e.__vnode)==null?void 0:a.ctx)!=null&&o.asyncResolved)){R=e;return}else n===null&&((m=e==null?void 0:e.__vnode)!=null&&m.type.includes("Controls")||(i=e==null?void 0:e.__vnode)!=null&&i.type.includes("Helper"))&&(R=p);if(n||(n=R),e!=null&&e.isObject3D){if(e!=null&&e.isCamera){if(!(p!=null&&p.userData.tres__registerCamera))throw"could not find tres__registerCamera on scene's userData";(l=p==null?void 0:(f=p.userData).tres__registerCamera)==null||l.call(f,e)}if(e!=null&&e.onClick||e!=null&&e.onPointerMove||e!=null&&e.onPointerEnter||e!=null&&e.onPointerLeave){if(!(p!=null&&p.userData.tres__registerAtPointerEventHandler))throw"could not find tres__registerAtPointerEventHandler on scene's userData";(u=p==null?void 0:(d=p.userData).tres__registerAtPointerEventHandler)==null||u.call(d,e)}}e!=null&&e.isObject3D&&(n!=null&&n.isObject3D)?(n.add(e),e.dispatchEvent({type:"added"})):e!=null&&e.isFog?n.fog=e:typeof(e==null?void 0:e.attach)=="string"&&(e.__previousAttach=e[n==null?void 0:n.attach],n&&(n[e.attach]=e))},remove(e){var n,t;if(e){if(e.isObject3D){const r=e,a=l=>{var u,s;const d=l;l.userData.tres__materialViaProp||(u=d.material)==null||u.dispose(),l.userData.tres__geometryViaProp||(s=d.geometry)==null||s.dispose()},o=p==null?void 0:p.userData.tres__deregisterAtPointerEventHandler,m=p==null?void 0:p.userData.tres__deregisterBlockingObjectAtPointerEventHandler,i=l=>{var d,u;if(!m)throw"could not find tres__deregisterBlockingObjectAtPointerEventHandler on scene's userData";if((u=p==null?void 0:(d=p.userData).tres__deregisterBlockingObjectAtPointerEventHandler)==null||u.call(d,l),!o)throw"could not find tres__deregisterAtPointerEventHandler on scene's userData";(l!=null&&l.onClick||l!=null&&l.onPointerMove||l!=null&&l.onPointerEnter||l!=null&&l.onPointerLeave)&&(o==null||o(l))},f=l=>{const d=p==null?void 0:p.userData.tres__deregisterCamera;if(!d)throw"could not find tres__deregisterCamera on scene's userData";l.isCamera&&(d==null||d(l))};r.traverse(l=>{a(l),f(l),i==null||i(l)}),a(r),f(r),i==null||i(r)}(n=e.removeFromParent)==null||n.call(e),(t=e.dispose)==null||t.call(e)}},patchProp(e,n,t,r){var a,o,m,i;if(e){let f=e,l=n;if(e.isObject3D&&l==="blocks-pointer-events"){r||r===""?(o=p==null?void 0:(a=p.userData).tres__registerBlockingObjectAtPointerEventHandler)==null||o.call(a,e):(i=p==null?void 0:(m=p.userData).tres__deregisterBlockingObjectAtPointerEventHandler)==null||i.call(m,e);return}let d=j(l),u=f==null?void 0:f[d];if(l==="args"){const g=e,_=t??[],v=r??[],M=e.userData.tres__name||e.type;M&&_.length&&!ve(_,v)&&(f=Object.assign(g,new E.value[M](...r)));return}if(f.type==="BufferGeometry"){if(l==="args")return;f.setAttribute(j(l),new P.BufferAttribute(...r));return}if(l.includes("-")&&u===void 0){const g=l.split("-");u=g.reduce((_,v)=>_[j(v)],f),l=g.pop(),d=l.toLowerCase(),u!=null&&u.set||(f=g.reduce((_,v)=>_[j(v)],f))}let s=r;if(s===""&&(s=!0),Y(u)){Array.isArray(s)?e[d](...s):e[d](s);return}!(u!=null&&u.set)&&!Y(u)?f[d]=s:u.constructor===s.constructor&&(u!=null&&u.copy)?u==null||u.copy(s):Array.isArray(s)?u.set(...s):!u.isColor&&u.setScalar?u.setScalar(s):u.set(s)}},parentNode(e){return(e==null?void 0:e.parent)||null},createText:()=>void 0,createComment:()=>void 0,setText:()=>void 0,setElementText:()=>void 0,nextSibling:()=>void 0,querySelector:()=>void 0,setScopeId:()=>void 0,cloneNode:()=>void 0,insertStaticContent:()=>void 0},{render:Ae}=c.createRenderer(ke);V(se);const Oe=["data-scene"],ae=c.defineComponent({__name:"TresCanvas",props:{shadows:{type:Boolean,default:void 0},clearColor:{},toneMapping:{},shadowMapType:{},useLegacyLights:{type:Boolean,default:void 0},outputColorSpace:{},toneMappingExposure:{},camera:{},preset:{},windowSize:{type:Boolean,default:void 0},disableRender:{type:Boolean,default:void 0},context:{},precision:{},alpha:{type:Boolean,default:void 0},premultipliedAlpha:{type:Boolean},antialias:{type:Boolean,default:void 0},stencil:{type:Boolean,default:void 0},preserveDrawingBuffer:{type:Boolean,default:void 0},powerPreference:{},depth:{type:Boolean,default:void 0},logarithmicDepthBuffer:{type:Boolean,default:void 0},failIfMajorPerformanceCaveat:{type:Boolean,default:void 0}},setup(e){var d;const n=e,{logWarning:t}=L(),r=c.ref(),a=c.shallowRef(new P.Scene);G();const o=c.useSlots(),m=(d=c.getCurrentInstance())==null?void 0:d.appContext.app,i=u=>c.defineComponent({setup(){var g;const s=(g=c.getCurrentInstance())==null?void 0:g.appContext;return s&&(s.app=m),c.provide("useTres",u),c.provide("extend",V),()=>c.h(c.Fragment,null,o!=null&&o.default?o.default():[])}}),f=u=>{const s=i(u);Ae(c.h(s),a.value)},l=c.computed(()=>n.disableRender);return c.onMounted(()=>{const u=r,s=te({scene:a.value,canvas:u,windowSize:n.windowSize,disableRender:l,rendererOptions:n});ee({scene:a.value,contextParts:s});const{registerCamera:g,camera:_,cameras:v,deregisterCamera:M}=s;f(s);const A=()=>{const b=new P.PerspectiveCamera(45,window.innerWidth/window.innerHeight,.1,1e3);b.position.set(3,3,3),b.lookAt(0,0,0),g(b);const k=c.watchEffect(()=>{v.value.length>=2&&(b.removeFromParent(),M(b),k==null||k())})};c.watch(()=>n.camera,(b,k)=>{b&&g(b),k&&(k.removeFromParent(),M(k))},{immediate:!0}),_.value||(t("No camera found. Creating a default perspective camera. To have full control over a camera, please add one to the scene."),A())}),(u,s)=>(c.openBlock(),c.createElementBlock("canvas",{ref_key:"canvas",ref:r,"data-scene":a.value.uuid,style:c.normalizeStyle({display:"block",width:"100%",height:"100%",position:u.windowSize?"fixed":"relative",top:0,left:0,pointerEvents:"auto",touchAction:"none"})},null,12,Oe))}}),he=["TresCanvas","TresLeches","TresScene"],De={template:{compilerOptions:{isCustomElement:e=>e.startsWith("Tres")&&!he.includes(e)||e==="primitive"}}},Le={install(e){e.component("TresCanvas",ae)}};y.TresCanvas=ae,y.catalogue=E,y.default=Le,y.extend=V,y.isProd=ce,y.normalizeColor=q,y.normalizeVectorFlexibleParam=fe,y.templateCompilerOptions=De,y.trasverseObjects=Q,y.useCamera=I,y.useLoader=_e,y.useLogger=L,y.usePointerEventHandler=ee,y.useRaycaster=Z,y.useRenderLoop=G,y.useRenderer=X,y.useSeek=Me,y.useTexture=Pe,y.useTres=be,y.useTresContext=re,y.useTresContextProvider=te,Object.defineProperties(y,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
@@ -9,3 +9,7 @@ export declare const get: <T>(obj: any, path: string | string[]) => T | undefine
9
9
  export declare const set: (obj: any, path: string | string[], value: any) => void;
10
10
  export declare function deepEqual(a: any, b: any): boolean;
11
11
  export declare function deepArrayEqual(arr1: any[], arr2: any[]): boolean;
12
+ /**
13
+ * TypeSafe version of Array.isArray
14
+ */
15
+ export declare const isArray: (a: any) => a is any[] | readonly any[];
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tresjs/core",
3
3
  "type": "module",
4
- "version": "3.2.1",
4
+ "version": "3.2.3",
5
5
  "packageManager": "pnpm@8.3.1",
6
6
  "description": "Declarative ThreeJS using Vue Components",
7
7
  "author": "Alvaro Saburido <hola@alvarosaburido.dev> (https://github.com/alvarosabu/)",