@tresjs/core 1.5.1 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,66 @@
1
+ import { Raycaster, Vector2 } from 'three';
2
+ export declare function useRaycaster(): {
3
+ raycaster: import("vue").ShallowRef<Raycaster>;
4
+ pointer: import("vue").Ref<{
5
+ x: number;
6
+ y: number;
7
+ width: number;
8
+ height: number;
9
+ readonly isVector2: true;
10
+ set: (x: number, y: number) => Vector2;
11
+ setScalar: (scalar: number) => Vector2;
12
+ setX: (x: number) => Vector2;
13
+ setY: (y: number) => Vector2;
14
+ setComponent: (index: number, value: number) => Vector2;
15
+ getComponent: (index: number) => number;
16
+ clone: () => Vector2;
17
+ copy: (v: Vector2) => Vector2;
18
+ add: (v: Vector2, w?: Vector2 | undefined) => Vector2;
19
+ addScalar: (s: number) => Vector2;
20
+ addVectors: (a: Vector2, b: Vector2) => Vector2;
21
+ addScaledVector: (v: Vector2, s: number) => Vector2;
22
+ sub: (v: Vector2) => Vector2;
23
+ subScalar: (s: number) => Vector2;
24
+ subVectors: (a: Vector2, b: Vector2) => Vector2;
25
+ multiply: (v: Vector2) => Vector2;
26
+ multiplyScalar: (scalar: number) => Vector2;
27
+ divide: (v: Vector2) => Vector2;
28
+ divideScalar: (s: number) => Vector2;
29
+ applyMatrix3: (m: import("three").Matrix3) => Vector2;
30
+ min: (v: Vector2) => Vector2;
31
+ max: (v: Vector2) => Vector2;
32
+ clamp: (min: Vector2, max: Vector2) => Vector2;
33
+ clampScalar: (min: number, max: number) => Vector2;
34
+ clampLength: (min: number, max: number) => Vector2;
35
+ floor: () => Vector2;
36
+ ceil: () => Vector2;
37
+ round: () => Vector2;
38
+ roundToZero: () => Vector2;
39
+ negate: () => Vector2;
40
+ dot: (v: Vector2) => number;
41
+ cross: (v: Vector2) => number;
42
+ lengthSq: () => number;
43
+ length: () => number;
44
+ lengthManhattan: () => number;
45
+ manhattanLength: () => number;
46
+ normalize: () => Vector2;
47
+ angle: () => number;
48
+ distanceTo: (v: Vector2) => number;
49
+ distanceToSquared: (v: Vector2) => number;
50
+ distanceToManhattan: (v: Vector2) => number;
51
+ manhattanDistanceTo: (v: Vector2) => number;
52
+ setLength: (length: number) => Vector2;
53
+ lerp: (v: Vector2, alpha: number) => Vector2;
54
+ lerpVectors: (v1: Vector2, v2: Vector2, alpha: number) => Vector2;
55
+ equals: (v: Vector2) => boolean;
56
+ fromArray: (array: number[] | ArrayLike<number>, offset?: number | undefined) => Vector2;
57
+ toArray: {
58
+ (array?: number[] | undefined, offset?: number | undefined): number[];
59
+ (array?: import("three").Vector2Tuple | undefined, offset?: 0 | undefined): import("three").Vector2Tuple;
60
+ (array: ArrayLike<number>, offset?: number | undefined): ArrayLike<number>;
61
+ };
62
+ fromBufferAttribute: (attribute: import("three").BufferAttribute, index: number) => Vector2;
63
+ rotateAround: (center: Vector2, angle: number) => Vector2;
64
+ random: () => Vector2;
65
+ }>;
66
+ };
package/dist/tres.js CHANGED
@@ -1,31 +1,31 @@
1
1
  /**
2
2
  * name: @tresjs/core
3
- * version: v1.5.1
3
+ * version: v1.6.0
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 { inject as M, computed as se, watch as $, ref as B, defineComponent as N, shallowRef as W, reactive as xe, toRefs as ie, provide as I, onBeforeUnmount as Me, h as te } from "vue";
9
- import { createEventHook as G, useRafFn as Ee, resolveUnref as d, useWindowSize as Pe, useElementSize as Te, useDevicePixelRatio as Le, unrefElement as k } from "@vueuse/core";
10
- import * as ne from "three";
11
- import { PerspectiveCamera as _, OrthographicCamera as ce, Vector3 as Re, Color as V, BufferAttribute as Ae, Clock as ue, Scene as be, LoadingManager as Be, TextureLoader as Oe, PCFShadowMap as $e, LinearEncoding as re, NoToneMapping as ae, WebGLRenderer as Ie } from "three";
12
- var _e = /* @__PURE__ */ ((e) => (e.Perspective = "Perspective", e.Orthographic = "Orthographic", e))(_e || {});
13
- const T = {
8
+ import { inject as R, computed as fe, watch as z, ref as L, defineComponent as X, onUnmounted as pe, shallowRef as W, shallowReactive as Le, toRefs as me, provide as x, onBeforeUnmount as Pe, h as ae } from "vue";
9
+ import { useEventListener as Te, createEventHook as Y, useRafFn as Re, resolveUnref as m, useWindowSize as be, useElementSize as Ae, useDevicePixelRatio as Be, unrefElement as H } from "@vueuse/core";
10
+ import * as ie from "three";
11
+ import { PerspectiveCamera as U, OrthographicCamera as de, Vector3 as Oe, Color as K, BufferAttribute as Ie, Clock as ge, Scene as $e, LoadingManager as _e, TextureLoader as Fe, PCFShadowMap as De, LinearEncoding as se, NoToneMapping as ce, WebGLRenderer as ze, Raycaster as Ue, Vector2 as je } from "three";
12
+ var ke = /* @__PURE__ */ ((e) => (e.Perspective = "Perspective", e.Orthographic = "Orthographic", e))(ke || {});
13
+ const A = {
14
14
  cameras: []
15
- }, De = 45;
16
- let x;
17
- function le() {
18
- const e = M("aspect-ratio"), { setState: r } = we();
19
- function n(u = "Perspective", m) {
20
- if (u === "Perspective") {
21
- const { near: t, far: c, fov: l } = m || {
15
+ }, Ve = 45;
16
+ let T;
17
+ function we() {
18
+ const e = R("aspect-ratio"), { setState: n } = Z();
19
+ function r(f = "Perspective", t) {
20
+ if (f === "Perspective") {
21
+ const { near: i, far: u, fov: a } = t || {
22
22
  near: 0.1,
23
23
  far: 1e3,
24
- fov: De
24
+ fov: Ve
25
25
  };
26
- x = new _(l, (e == null ? void 0 : e.value) || 1, t, c), T.cameras.push(x);
26
+ T = new U(a, (e == null ? void 0 : e.value) || 1, i, u), A.cameras.push(T);
27
27
  } else {
28
- const { left: t, right: c, top: l, bottom: a, near: s, far: p } = m || {
28
+ const { left: i, right: u, top: a, bottom: c, near: l, far: S } = t || {
29
29
  left: -100,
30
30
  right: 100,
31
31
  top: 100,
@@ -33,322 +33,330 @@ function le() {
33
33
  near: 0.1,
34
34
  far: 1e3
35
35
  };
36
- x = new ce(t, c, l, a, s, p), T.cameras.push(x);
36
+ T = new de(i, u, a, c, l, S), A.cameras.push(T);
37
37
  }
38
- return T.cameras.push(x), x;
38
+ return A.cameras.push(T), T;
39
39
  }
40
- const o = se(() => T.cameras[0]);
41
- function i() {
42
- o.value instanceof _ && e && (o.value.aspect = e.value), o.value.updateProjectionMatrix();
40
+ const o = fe(() => A.cameras[0]);
41
+ function s() {
42
+ o.value instanceof U && e && (o.value.aspect = e.value), o.value.updateProjectionMatrix();
43
43
  }
44
- function f(u) {
45
- const m = M("camera");
46
- u && m && (m.value = u, r("camera", m.value)), T.cameras.push(u), u instanceof _ && e && (u.aspect = e.value), u.updateProjectionMatrix();
44
+ function p(f) {
45
+ const t = R("camera");
46
+ f && t && (t.value = f, n("camera", t.value)), A.cameras.push(f), f instanceof U && e && (f.aspect = e.value), f.updateProjectionMatrix();
47
47
  }
48
- return e && $(e, i), {
48
+ return e && z(e, s), {
49
49
  activeCamera: o,
50
- createCamera: n,
51
- updateCamera: i,
52
- pushCamera: f
50
+ createCamera: r,
51
+ updateCamera: s,
52
+ pushCamera: p
53
53
  };
54
54
  }
55
- const oe = "[TresJS ▲ ■ ●] ";
56
- function U() {
57
- function e(o, i) {
58
- console.error(`${oe} ${o}`, i || "");
55
+ const ue = "[TresJS ▲ ■ ●] ";
56
+ function G() {
57
+ function e(o, s) {
58
+ console.error(`${ue} ${o}`, s || "");
59
59
  }
60
- function r(o) {
61
- console.warn(`${oe} ${o}`);
60
+ function n(o) {
61
+ console.warn(`${ue} ${o}`);
62
62
  }
63
- function n(o, i) {
63
+ function r(o, s) {
64
64
  }
65
65
  return {
66
66
  logError: e,
67
- logWarning: r,
68
- logMessage: n
67
+ logWarning: n,
68
+ logMessage: r
69
69
  };
70
70
  }
71
- const A = B({ ...ne, uuid: ne.MathUtils.generateUUID() });
72
- delete A.value.Scene;
73
- let L;
74
- function fe(e, r = "Tres") {
75
- const { logMessage: n, logError: o } = U();
76
- !L && e && (L = e);
77
- const { createComponentInstances: i } = pe(r);
71
+ const j = L({ ...ie, uuid: ie.MathUtils.generateUUID() });
72
+ delete j.value.Scene;
73
+ let B;
74
+ function he(e, n = "Tres") {
75
+ const { logError: r } = G();
76
+ !B && e && (B = e);
77
+ const { createComponentInstances: o } = ve(n);
78
78
  return {
79
- extend: (u) => {
80
- if (!u) {
81
- o("No objects provided to extend catalogue");
79
+ extend: (p) => {
80
+ if (!p) {
81
+ r("No objects provided to extend catalogue");
82
82
  return;
83
83
  }
84
- A.value = Object.assign(A.value, u);
85
- const m = i(B(u));
86
- n("Adding objects to catalogue", { objects: u, catalogue: A.value.uuid }), L && m.forEach(([t, c]) => {
87
- L._context.components[t] || L.component(t, c);
84
+ j.value = Object.assign(j.value, p);
85
+ const f = o(L(p));
86
+ B && f.forEach(([t, i]) => {
87
+ B._context.components[t] || B.component(t, i);
88
88
  });
89
89
  },
90
- catalogue: A
90
+ catalogue: j
91
91
  };
92
92
  }
93
- const R = (e) => typeof e < "u", Fe = (e) => typeof e == "function", z = (e) => !!e && e.constructor === Array;
94
- function ze(e) {
95
- return typeof e == "number" ? [e, e, e] : e instanceof Re ? [e.x, e.y, e.z] : e;
93
+ const O = (e) => typeof e < "u", Ne = (e) => typeof e == "function", N = (e) => !!e && e.constructor === Array;
94
+ function We(e) {
95
+ return typeof e == "number" ? [e, e, e] : e instanceof Oe ? [e.x, e.y, e.z] : e;
96
96
  }
97
- function Ue(e) {
98
- return e instanceof V ? e : Array.isArray(e) ? new V(...e) : new V(e);
97
+ function Ge(e) {
98
+ return e instanceof K ? e : Array.isArray(e) ? new K(...e) : new K(e);
99
99
  }
100
- const ke = ["rotation", "scale", "position"];
101
- function pe(e) {
102
- const { logMessage: r, logError: n } = U();
103
- function o(t, c) {
104
- R(t) && R(c) && Object.entries(t).forEach(([l, a]) => {
105
- const s = l.replace(/(-\w)/g, (p) => p[1].toUpperCase());
106
- c.setAttribute(s, new Ae(...a));
100
+ const He = ["rotation", "scale", "position"];
101
+ function ve(e) {
102
+ const { logError: n } = G();
103
+ function r(t, i) {
104
+ O(t) && O(i) && Object.entries(t).forEach(([u, a]) => {
105
+ const c = u.replace(/(-\w)/g, (l) => l[1].toUpperCase());
106
+ i.setAttribute(c, new Ie(...a));
107
107
  });
108
108
  }
109
- function i(t, c) {
110
- R(t) && R(c) && Object.entries(t).forEach(([l, a]) => {
111
- const s = l.replace(/(-\w)/g, (p) => p[1].toUpperCase());
112
- if (!(s === "args" || a === void 0)) {
113
- ke.includes(s) && a && (a = ze(a)), t.ref && (t.ref = c);
109
+ function o(t, i) {
110
+ O(t) && O(i) && Object.entries(t).forEach(([u, a]) => {
111
+ const c = u.replace(/(-\w)/g, (l) => l[1].toUpperCase());
112
+ if (!(c === "args" || a === void 0)) {
113
+ He.includes(c) && a && (a = We(a)), t.ref && (t.ref = i);
114
114
  try {
115
- if (c[s] && R(c[s].set))
116
- c[s].set(...z(a) ? a : [a]);
115
+ if (i[c] && O(i[c].set))
116
+ i[c].set(...N(a) ? a : [a]);
117
117
  else {
118
- if (a === "" && (a = !0), Fe(c[s])) {
119
- if (l === "center" && !a)
118
+ if (a === "" && (a = !0), Ne(i[c])) {
119
+ if (u === "center" && !a)
120
120
  return;
121
- c[s](...z(a) ? a : [a]);
121
+ i[c](...N(a) ? a : [a]);
122
122
  return;
123
123
  }
124
- c[s] = a;
124
+ i[c] = a;
125
125
  }
126
- } catch (p) {
127
- n(`There was an error setting ${s} property`, p);
126
+ } catch (l) {
127
+ n(`There was an error setting ${c} property`, l);
128
128
  }
129
129
  }
130
130
  });
131
131
  }
132
- function f(t) {
133
- var a, s;
134
- const c = /^Symbol\(Fragment\)$/g, l = /^Symbol\(Text\)$/g;
135
- if (c.test(t.type.toString()))
136
- return t.children.map((p) => f(p));
137
- if (l.test(t.type.toString()))
132
+ function s(t) {
133
+ var a, c;
134
+ const i = /^Symbol\(Fragment\)$/g, u = /^Symbol\(Text\)$/g;
135
+ if (i.test(t.type.toString()))
136
+ return t.children.map((l) => s(l));
137
+ if (u.test(t.type.toString()))
138
138
  return;
139
139
  {
140
- const p = t.type.name.replace(e, ""), { catalogue: C } = fe(), h = M("catalogue") || C;
141
- let v;
142
- if (h)
140
+ const l = t.type.name.replace(e, ""), { catalogue: S } = he(), g = R("catalogue") || S;
141
+ let w;
142
+ if (g)
143
143
  if ((a = t.children) != null && a.default) {
144
- const E = t.children.default().map((w) => f(w));
145
- v = new h.value[p](...E.flat().filter(Boolean));
144
+ const P = t.children.default().map((b) => s(b));
145
+ w = new g.value[l](...P.flat().filter(Boolean));
146
146
  } else
147
- (s = t == null ? void 0 : t.props) != null && s.args ? h != null && h.value[p] ? v = new h.value[p](...t.props.args) : n(`There is no ${p} in the catalogue`, h == null ? void 0 : h.value.uuid) : v = new h.value[p]();
148
- return t != null && t.props && (p === "BufferGeometry" ? o(t.props, v) : i(t.props, v)), r(`Created ${p} instance`, v), v;
147
+ (c = t == null ? void 0 : t.props) != null && c.args ? g != null && g.value[l] ? w = new g.value[l](...t.props.args) : n(`There is no ${l} in the catalogue`, g == null ? void 0 : g.value.uuid) : w = new g.value[l]();
148
+ return t != null && t.props && (l === "BufferGeometry" ? r(t.props, w) : o(t.props, w)), w;
149
149
  }
150
150
  }
151
- function u(t, c, l) {
152
- if (l.default && (l != null && l.default())) {
153
- const a = l.default().map((s) => f(s));
151
+ function p(t, i, u) {
152
+ if (u.default && (u != null && u.default())) {
153
+ const a = u.default().map((c) => s(c));
154
154
  if (t.name === "Group") {
155
- const s = new t();
156
- return a.forEach((p) => {
157
- s.add(p);
158
- }), s;
155
+ const c = new t();
156
+ return a.forEach((l) => {
157
+ c.add(l);
158
+ }), c;
159
159
  } else
160
160
  return new t(...a.flat().filter(Boolean));
161
161
  } else
162
- return c.args ? new t(...c.args) : new t();
162
+ return i.args ? new t(...i.args) : new t();
163
163
  }
164
- function m(t) {
165
- return Object.entries(t.value).filter(([c, l]) => {
166
- var a, s;
167
- return (s = (a = l == null ? void 0 : l.prototype) == null ? void 0 : a.constructor) == null ? void 0 : s.toString().includes("class");
168
- }).map(([c, l]) => {
169
- const a = `${e}${c}`, s = N({
164
+ function f(t) {
165
+ return Object.entries(t.value).filter(([i, u]) => {
166
+ var a, c;
167
+ return (c = (a = u == null ? void 0 : u.prototype) == null ? void 0 : a.constructor) == null ? void 0 : c.toString().includes("class");
168
+ }).map(([i, u]) => {
169
+ const a = `${e}${i}`, c = X({
170
170
  name: a,
171
- setup(p, { slots: C, attrs: h, ...v }) {
172
- const { scene: E } = he(), w = M("local-scene") || E, P = M("catalogue"), { pushCamera: S } = le();
173
- let y = u(l, h, C);
174
- return i(h, y), (y instanceof _ || y instanceof ce) && S(y), y.isObject3D && (w == null || w.value.add(y)), w != null && w.value && y.isFog && (w.value.fog = y), v.expose(y), r(a, {
175
- sceneuuid: w == null ? void 0 : w.value.uuid,
176
- catalogue: P == null ? void 0 : P.value.uuid,
177
- props: p,
178
- slots: C.default ? C.default() : void 0,
179
- attrs: h,
180
- ctx: v,
181
- scene: w
182
- }), () => {
171
+ setup(l, { slots: S, attrs: g, ...w }) {
172
+ const { scene: P } = Se(), { onLoop: b } = Q(), y = R("local-scene") || P, E = R("raycaster"), { pushCamera: M } = we();
173
+ let h = p(u, g, S);
174
+ o(g, h), (h instanceof U || h instanceof de) && M(h), h.isObject3D && (y == null || y.value.add(h));
175
+ let C = null, v = null;
176
+ if (h.isMesh) {
177
+ b(() => {
178
+ if (h && (E != null && E.value)) {
179
+ const _ = E == null ? void 0 : E.value.intersectObjects(y.value.children);
180
+ _.length > 0 ? (v = _[0], (C === null || C.object.uuid !== (v == null ? void 0 : v.object.uuid)) && w.emit("pointer-enter", v), w.emit("pointer-move", v)) : (v = null, C !== null && w.emit("pointer-leave", C)), C = v;
181
+ }
182
+ });
183
+ const $ = Te(window, "click", () => {
184
+ w.emit("click", C);
185
+ });
186
+ pe(() => {
187
+ $();
188
+ });
189
+ }
190
+ return y != null && y.value && h.isFog && (y.value.fog = h), w.expose(h), () => {
183
191
  };
184
192
  }
185
193
  });
186
- return [a, s];
194
+ return [a, c];
187
195
  });
188
196
  }
189
197
  return {
190
- createComponentInstances: m,
191
- processProps: i,
192
- createInstanceFromVNode: f
198
+ createComponentInstances: f,
199
+ processProps: o,
200
+ createInstanceFromVNode: s
193
201
  };
194
202
  }
195
- const me = G(), de = G(), H = G(), b = new ue();
196
- let D = 0, F = 0;
197
- const { pause: Ve, resume: je, isActive: Ne } = Ee(
203
+ const ye = Y(), Ce = Y(), q = Y(), I = new ge();
204
+ let k = 0, V = 0;
205
+ const { pause: Ke, resume: Je, isActive: Xe } = Re(
198
206
  () => {
199
- me.trigger({ delta: D, elapsed: F, clock: b }), de.trigger({ delta: D, elapsed: F, clock: b }), H.trigger({ delta: D, elapsed: F, clock: b });
207
+ ye.trigger({ delta: k, elapsed: V, clock: I }), Ce.trigger({ delta: k, elapsed: V, clock: I }), q.trigger({ delta: k, elapsed: V, clock: I });
200
208
  },
201
209
  { immediate: !1 }
202
210
  );
203
- H.on(() => {
204
- D = b.getDelta(), F = b.getElapsedTime();
211
+ q.on(() => {
212
+ k = I.getDelta(), V = I.getElapsedTime();
205
213
  });
206
- function ge() {
214
+ function Q() {
207
215
  return {
208
- onBeforeLoop: me.on,
209
- onLoop: de.on,
210
- onAfterLoop: H.on,
211
- pause: Ve,
212
- resume: je,
213
- isActive: Ne
216
+ onBeforeLoop: ye.on,
217
+ onLoop: Ce.on,
218
+ onAfterLoop: q.on,
219
+ pause: Ke,
220
+ resume: Je,
221
+ isActive: Xe
214
222
  };
215
223
  }
216
- const We = W(new be());
217
- function he() {
224
+ const Ye = W(new $e());
225
+ function Se() {
218
226
  return {
219
- scene: We
227
+ scene: Ye
220
228
  };
221
229
  }
222
- function Ge(e) {
223
- const r = { nodes: {}, materials: {} };
224
- return e && e.traverse((n) => {
225
- n.name && (r.nodes[n.name] = n), n.material && !r.materials[n.material.name] && (r.materials[n.material.name] = n.material);
226
- }), r;
230
+ function qe(e) {
231
+ const n = { nodes: {}, materials: {} };
232
+ return e && e.traverse((r) => {
233
+ r.name && (n.nodes[r.name] = r), r.material && !n.materials[r.material.name] && (n.materials[r.material.name] = r.material);
234
+ }), n;
227
235
  }
228
- async function Ze(e, r, n, o, i) {
229
- const { logError: f } = U(), u = new e();
230
- i && i(u), n && n(u);
231
- const t = (Array.isArray(r) ? r : [r]).map(
232
- (c) => new Promise((l, a) => {
233
- u.load(
234
- c,
235
- (s) => {
236
- s.scene && Object.assign(s, Ge(s.scene)), l(s);
236
+ async function st(e, n, r, o, s) {
237
+ const { logError: p } = G(), f = new e();
238
+ s && s(f), r && r(f);
239
+ const i = (Array.isArray(n) ? n : [n]).map(
240
+ (u) => new Promise((a, c) => {
241
+ f.load(
242
+ u,
243
+ (l) => {
244
+ l.scene && Object.assign(l, qe(l.scene)), a(l);
237
245
  },
238
246
  o,
239
- (s) => a(f("[useLoader] - Failed to load resource", s))
247
+ (l) => c(p("[useLoader] - Failed to load resource", l))
240
248
  );
241
249
  })
242
250
  );
243
- return z(r) ? await Promise.all(t) : await t[0];
251
+ return N(n) ? await Promise.all(i) : await i[0];
244
252
  }
245
- async function et(e) {
246
- const r = new Be(), n = new Oe(r), o = (i) => new Promise((f, u) => {
247
- n.load(
248
- i,
249
- (m) => f(m),
253
+ async function ct(e) {
254
+ const n = new _e(), r = new Fe(n), o = (s) => new Promise((p, f) => {
255
+ r.load(
256
+ s,
257
+ (t) => p(t),
250
258
  () => null,
251
259
  () => {
252
- u(new Error("[useTextures] - Failed to load texture"));
260
+ f(new Error("[useTextures] - Failed to load texture"));
253
261
  }
254
262
  );
255
263
  });
256
- if (z(e)) {
257
- const i = await Promise.all(e.map((f) => o(f)));
258
- return e.length > 1 ? i : i[0];
264
+ if (N(e)) {
265
+ const s = await Promise.all(e.map((p) => o(p)));
266
+ return e.length > 1 ? s : s[0];
259
267
  } else {
260
- const { map: i, displacementMap: f, normalMap: u, roughnessMap: m, metalnessMap: t, aoMap: c } = e;
268
+ const { map: s, displacementMap: p, normalMap: f, roughnessMap: t, metalnessMap: i, aoMap: u } = e;
261
269
  return {
262
- map: i ? await o(i) : null,
263
- displacementMap: f ? await o(f) : null,
264
- normalMap: u ? await o(u) : null,
265
- roughnessMap: m ? await o(m) : null,
266
- metalnessMap: t ? await o(t) : null,
267
- aoMap: c ? await o(c) : null
270
+ map: s ? await o(s) : null,
271
+ displacementMap: p ? await o(p) : null,
272
+ normalMap: f ? await o(f) : null,
273
+ roughnessMap: t ? await o(t) : null,
274
+ metalnessMap: i ? await o(i) : null,
275
+ aoMap: u ? await o(u) : null
268
276
  };
269
277
  }
270
278
  }
271
- const O = xe({});
272
- function we() {
273
- function e(n) {
274
- return O[n];
279
+ const F = Le({});
280
+ function Z() {
281
+ function e(r) {
282
+ return F[r];
275
283
  }
276
- function r(n, o) {
277
- O[n] = o;
284
+ function n(r, o) {
285
+ F[r] = o;
278
286
  }
279
287
  return {
280
- state: O,
281
- ...ie(O),
288
+ state: F,
289
+ ...me(F),
282
290
  getState: e,
283
- setState: r
291
+ setState: n
284
292
  };
285
293
  }
286
- const g = W(), j = B(!1);
287
- function He(e, r, n) {
294
+ const d = W(), J = L(!1);
295
+ function Qe(e, n, r) {
288
296
  const {
289
297
  alpha: o = !0,
290
- antialias: i = !0,
291
- depth: f,
292
- logarithmicDepthBuffer: u,
293
- failIfMajorPerformanceCaveat: m,
294
- precision: t,
295
- premultipliedAlpha: c,
296
- stencil: l,
297
- shadows: a = !1,
298
- shadowMapType: s = $e,
299
- physicallyCorrectLights: p = !1,
300
- outputEncoding: C = re,
301
- toneMapping: h = ae,
302
- toneMappingExposure: v = 1,
303
- context: E = void 0,
304
- powerPreference: w = "default",
305
- preserveDrawingBuffer: P = !1,
306
- clearColor: S,
307
- windowSize: y = !1
308
- } = ie(n), { width: K, height: J } = d(y) ? Pe() : Te(r), { pixelRatio: q } = Le(), { pause: ve, resume: ye } = ge(), Q = se(() => K.value / J.value), X = () => {
309
- g.value && (g.value.setSize(K.value, J.value), g.value.setPixelRatio(Math.min(q.value, 2)));
310
- }, Y = () => {
311
- g.value && (g.value.shadowMap.enabled = d(a), g.value.shadowMap.type = d(s), g.value.toneMapping = d(h) || ae, g.value.toneMappingExposure = d(v), g.value.outputEncoding = d(C) || re, S != null && S.value && g.value.setClearColor(Ue(d(S))), g.value.physicallyCorrectLights = d(p));
312
- }, Ce = () => {
313
- const Z = k(e);
314
- if (g.value || !Z)
298
+ antialias: s = !0,
299
+ depth: p,
300
+ logarithmicDepthBuffer: f,
301
+ failIfMajorPerformanceCaveat: t,
302
+ precision: i,
303
+ premultipliedAlpha: u,
304
+ stencil: a,
305
+ shadows: c = !1,
306
+ shadowMapType: l = De,
307
+ physicallyCorrectLights: S = !1,
308
+ outputEncoding: g = se,
309
+ toneMapping: w = ce,
310
+ toneMappingExposure: P = 1,
311
+ context: b = void 0,
312
+ powerPreference: y = "default",
313
+ preserveDrawingBuffer: E = !1,
314
+ clearColor: M,
315
+ windowSize: h = !1
316
+ } = me(r), { width: C, height: v } = m(h) ? be() : Ae(n), { pixelRatio: $ } = Be(), { pause: _, resume: Ee } = Q(), ee = fe(() => C.value / v.value), te = () => {
317
+ d.value && (d.value.setSize(C.value, v.value), d.value.setPixelRatio(Math.min($.value, 2)));
318
+ }, ne = () => {
319
+ d.value && (d.value.shadowMap.enabled = m(c), d.value.shadowMap.type = m(l), d.value.toneMapping = m(w) || ce, d.value.toneMappingExposure = m(P), d.value.outputEncoding = m(g) || se, M != null && M.value && d.value.setClearColor(Ge(m(M))), d.value.physicallyCorrectLights = m(S));
320
+ }, Me = () => {
321
+ const re = H(e);
322
+ if (d.value || !re)
315
323
  return;
316
- g.value = new Ie({
317
- canvas: Z,
318
- alpha: d(o),
319
- antialias: d(i),
320
- context: d(E),
321
- depth: d(f),
322
- failIfMajorPerformanceCaveat: d(m),
323
- logarithmicDepthBuffer: d(u),
324
- powerPreference: d(w),
325
- precision: d(t),
326
- stencil: d(l),
327
- preserveDrawingBuffer: d(P),
328
- premultipliedAlpha: d(c)
324
+ d.value = new ze({
325
+ canvas: re,
326
+ alpha: m(o),
327
+ antialias: m(s),
328
+ context: m(b),
329
+ depth: m(p),
330
+ failIfMajorPerformanceCaveat: m(t),
331
+ logarithmicDepthBuffer: m(f),
332
+ powerPreference: m(y),
333
+ precision: m(i),
334
+ stencil: m(a),
335
+ preserveDrawingBuffer: m(E),
336
+ premultipliedAlpha: m(u)
329
337
  });
330
- const { setState: ee } = we();
331
- ee("renderer", g.value), ee("clock", new ue()), Y(), X(), ye(), j.value = !0;
332
- }, Se = () => {
333
- g.value && (g.value.dispose(), g.value = void 0, j.value = !1, ve());
338
+ const { setState: oe } = Z();
339
+ oe("renderer", d.value), oe("clock", new ge()), ne(), te(), Ee(), J.value = !0;
340
+ }, xe = () => {
341
+ d.value && (d.value.dispose(), d.value = void 0, J.value = !1, _());
334
342
  };
335
- return $([Q, q], X), $(
336
- [a, s, C, p, h, v, S],
337
- Y
338
- ), $(
339
- () => [e, r],
343
+ return z([ee, $], te), z(
344
+ [c, l, g, S, w, P, M],
345
+ ne
346
+ ), z(
347
+ () => [e, n],
340
348
  () => {
341
- k(e) && k(r) && Ce();
349
+ H(e) && H(n) && Me();
342
350
  },
343
351
  { immediate: !0, deep: !0 }
344
352
  ), {
345
- renderer: g,
346
- isReady: j,
347
- dispose: Se,
348
- aspectRatio: Q
353
+ renderer: d,
354
+ isReady: J,
355
+ dispose: xe,
356
+ aspectRatio: ee
349
357
  };
350
358
  }
351
- const Ke = N({
359
+ const Ze = X({
352
360
  name: "TresCanvas",
353
361
  props: {
354
362
  shadows: Boolean,
@@ -363,29 +371,29 @@ const Ke = N({
363
371
  clearColor: String,
364
372
  windowSize: { type: Boolean, default: !1 }
365
373
  },
366
- setup(e, { slots: r, attrs: n }) {
367
- const { logError: o } = U(), i = B(), f = B(), { renderer: u, dispose: m, aspectRatio: t } = He(i, f, e);
368
- I("aspect-ratio", t), I("renderer", u);
369
- const c = W();
370
- return I("camera", c), r.default && !r.default().some((l) => l.type.name === "Scene") && o("TresCanvas must contain a Scene component."), r.default && !r.default().some((l) => {
371
- var a;
372
- return (a = l.type.name) == null ? void 0 : a.includes("Camera");
373
- }) && o("Scene must contain a Camera component."), Me(() => m()), () => {
374
- if (r.default)
375
- return te(
374
+ setup(e, { slots: n, attrs: r }) {
375
+ const { logError: o } = G(), s = L(), p = L(), { renderer: f, dispose: t, aspectRatio: i } = Qe(s, p, e);
376
+ x("aspect-ratio", i), x("renderer", f);
377
+ const u = W();
378
+ return x("camera", u), n.default && !n.default().some((a) => a.type.name === "Scene") && o("TresCanvas must contain a Scene component."), n.default && !n.default().some((a) => {
379
+ var c;
380
+ return (c = a.type.name) == null ? void 0 : c.includes("Camera");
381
+ }) && o("Scene must contain a Camera component."), Pe(() => t()), () => {
382
+ if (n.default)
383
+ return ae(
376
384
  "div",
377
385
  {
378
- ref: f,
386
+ ref: p,
379
387
  style: {
380
388
  position: "relative",
381
389
  width: "100%",
382
390
  height: "100vh",
383
- ...n.style
391
+ ...r.style
384
392
  }
385
393
  },
386
394
  [
387
- te("canvas", {
388
- ref: i,
395
+ ae("canvas", {
396
+ ref: s,
389
397
  style: {
390
398
  width: "100%",
391
399
  height: "100%",
@@ -394,49 +402,62 @@ const Ke = N({
394
402
  left: 0
395
403
  }
396
404
  }),
397
- r.default()
405
+ n.default()
398
406
  ]
399
407
  );
400
408
  };
401
409
  }
402
- }), Je = N({
410
+ }), le = W(new Ue()), D = L(new je()), et = L(null);
411
+ function tt() {
412
+ x("raycaster", le), x("pointer", D), x("currentInstance", et);
413
+ function e(n) {
414
+ D.value.x = n.clientX / window.innerWidth * 2 - 1, D.value.y = -(n.clientY / window.innerHeight) * 2 + 1;
415
+ }
416
+ return window.addEventListener("pointermove", e), pe(() => {
417
+ window.removeEventListener("pointermove", e);
418
+ }), {
419
+ raycaster: le,
420
+ pointer: D
421
+ };
422
+ }
423
+ const nt = X({
403
424
  name: "Scene",
404
- setup(e, { slots: r }) {
405
- const { scene: n } = he(), o = M("renderer"), { activeCamera: i } = le(), { onLoop: f } = ge();
406
- return I("local-scene", n), f(({ clock: u }) => {
407
- o != null && o.value && (i != null && i.value) && (n != null && n.value) && o.value.render(n == null ? void 0 : n.value, i.value);
425
+ setup(e, { slots: n }) {
426
+ const { scene: r } = Se(), o = R("renderer"), { activeCamera: s } = we(), { raycaster: p, pointer: f } = tt(), { onLoop: t } = Q();
427
+ return x("local-scene", r), t(() => {
428
+ p.value.setFromCamera(f.value, s.value), o != null && o.value && (s != null && s.value) && (r != null && r.value) && o.value.render(r == null ? void 0 : r.value, s.value);
408
429
  }), () => {
409
- if (r.default)
410
- return r.default();
430
+ if (n.default)
431
+ return n.default();
411
432
  };
412
433
  }
413
- }), tt = Symbol("UseTresState"), qe = "1.5.1", nt = {
414
- install(e, r) {
415
- const n = (r == null ? void 0 : r.prefix) || "Tres";
416
- e.component(`${n}Canvas`, Ke), e.component(`${n}Scene`, Je);
417
- const { catalogue: o, extend: i } = fe(e, n);
418
- e.provide("catalogue", o), e.provide("extend", i);
419
- const { createComponentInstances: f } = pe(n);
420
- f(o).forEach(([m, t]) => {
421
- e.component(m, t);
434
+ }), ut = Symbol("UseTresState"), rt = "1.6.0", lt = {
435
+ install(e, n) {
436
+ const r = (n == null ? void 0 : n.prefix) || "Tres";
437
+ e.component(`${r}Canvas`, Ze), e.component(`${r}Scene`, nt);
438
+ const { catalogue: o, extend: s } = he(e, r);
439
+ e.provide("catalogue", o), e.provide("extend", s), e.provide("useTres", Z());
440
+ const { createComponentInstances: p } = ve(r);
441
+ p(o).forEach(([t, i]) => {
442
+ e.component(t, i);
422
443
  }), window.__TRES__ = {
423
444
  app: e,
424
- version: qe
445
+ version: rt
425
446
  };
426
447
  }
427
448
  };
428
449
  export {
429
- _e as CameraType,
430
- tt as UseTresStateSymbol,
431
- nt as default,
432
- Ge as trasverseObjects,
433
- le as useCamera,
434
- fe as useCatalogue,
435
- pe as useInstanceCreator,
436
- Ze as useLoader,
437
- ge as useRenderLoop,
438
- He as useRenderer,
439
- he as useScene,
440
- et as useTexture,
441
- we as useTres
450
+ ke as CameraType,
451
+ ut as UseTresStateSymbol,
452
+ lt as default,
453
+ qe as trasverseObjects,
454
+ we as useCamera,
455
+ he as useCatalogue,
456
+ ve as useInstanceCreator,
457
+ st as useLoader,
458
+ Q as useRenderLoop,
459
+ Qe as useRenderer,
460
+ Se as useScene,
461
+ ct as useTexture,
462
+ Z as useTres
442
463
  };
package/dist/tres.umd.cjs CHANGED
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * name: @tresjs/core
3
- * version: v1.5.1
3
+ * version: v1.6.0
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(w,s){typeof exports=="object"&&typeof module<"u"?s(exports,require("vue"),require("@vueuse/core"),require("three")):typeof define=="function"&&define.amd?define(["exports","vue","@vueuse/core","three"],s):(w=typeof globalThis<"u"?globalThis:w||self,s(w.tres={},w.Vue,w.VueUseCore,w.Three))})(this,function(w,s,p,g){"use strict";function ie(e){const r=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const n in e)if(n!=="default"){const a=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(r,n,a.get?a:{enumerable:!0,get:()=>e[n]})}}return r.default=e,Object.freeze(r)}const K=ie(g);var J=(e=>(e.Perspective="Perspective",e.Orthographic="Orthographic",e))(J||{});const L={cameras:[]},ce=45;let b;function F(){const e=s.inject("aspect-ratio"),{setState:r}=G();function n(u="Perspective",h){if(u==="Perspective"){const{near:t,far:l,fov:f}=h||{near:.1,far:1e3,fov:ce};b=new g.PerspectiveCamera(f,(e==null?void 0:e.value)||1,t,l),L.cameras.push(b)}else{const{left:t,right:l,top:f,bottom:o,near:i,far:m}=h||{left:-100,right:100,top:100,bottom:-100,near:.1,far:1e3};b=new g.OrthographicCamera(t,l,f,o,i,m),L.cameras.push(b)}return L.cameras.push(b),b}const a=s.computed(()=>L.cameras[0]);function c(){a.value instanceof g.PerspectiveCamera&&e&&(a.value.aspect=e.value),a.value.updateProjectionMatrix()}function d(u){const h=s.inject("camera");u&&h&&(h.value=u,r("camera",h.value)),L.cameras.push(u),u instanceof g.PerspectiveCamera&&e&&(u.aspect=e.value),u.updateProjectionMatrix()}return e&&s.watch(e,c),{activeCamera:a,createCamera:n,updateCamera:c,pushCamera:d}}const Q="[TresJS ▲ ■ ●] ";function I(){function e(a,c){console.error(`${Q} ${a}`,c||"")}function r(a){console.warn(`${Q} ${a}`)}function n(a,c){}return{logError:e,logWarning:r,logMessage:n}}const x=s.ref({...K,uuid:K.MathUtils.generateUUID()});delete x.value.Scene;let O;function k(e,r="Tres"){const{logMessage:n,logError:a}=I();!O&&e&&(O=e);const{createComponentInstances:c}=V(r);return{extend:u=>{if(!u){a("No objects provided to extend catalogue");return}x.value=Object.assign(x.value,u);const h=c(s.ref(u));n("Adding objects to catalogue",{objects:u,catalogue:x.value.uuid}),O&&h.forEach(([t,l])=>{O._context.components[t]||O.component(t,l)})},catalogue:x}}const j=e=>typeof e<"u",le=e=>typeof e=="function",$=e=>!!e&&e.constructor===Array;function ue(e){return typeof e=="number"?[e,e,e]:e instanceof g.Vector3?[e.x,e.y,e.z]:e}function fe(e){return e instanceof g.Color?e:Array.isArray(e)?new g.Color(...e):new g.Color(e)}const pe=["rotation","scale","position"];function V(e){const{logMessage:r,logError:n}=I();function a(t,l){j(t)&&j(l)&&Object.entries(t).forEach(([f,o])=>{const i=f.replace(/(-\w)/g,m=>m[1].toUpperCase());l.setAttribute(i,new g.BufferAttribute(...o))})}function c(t,l){j(t)&&j(l)&&Object.entries(t).forEach(([f,o])=>{const i=f.replace(/(-\w)/g,m=>m[1].toUpperCase());if(!(i==="args"||o===void 0)){pe.includes(i)&&o&&(o=ue(o)),t.ref&&(t.ref=l);try{if(l[i]&&j(l[i].set))l[i].set(...$(o)?o:[o]);else{if(o===""&&(o=!0),le(l[i])){if(f==="center"&&!o)return;l[i](...$(o)?o:[o]);return}l[i]=o}}catch(m){n(`There was an error setting ${i} property`,m)}}})}function d(t){var o,i;const l=/^Symbol\(Fragment\)$/g,f=/^Symbol\(Text\)$/g;if(l.test(t.type.toString()))return t.children.map(m=>d(m));if(f.test(t.type.toString()))return;{const m=t.type.name.replace(e,""),{catalogue:P}=k(),C=s.inject("catalogue")||P;let S;if(C)if((o=t.children)!=null&&o.default){const _=t.children.default().map(y=>d(y));S=new C.value[m](..._.flat().filter(Boolean))}else(i=t==null?void 0:t.props)!=null&&i.args?C!=null&&C.value[m]?S=new C.value[m](...t.props.args):n(`There is no ${m} in the catalogue`,C==null?void 0:C.value.uuid):S=new C.value[m];return t!=null&&t.props&&(m==="BufferGeometry"?a(t.props,S):c(t.props,S)),r(`Created ${m} instance`,S),S}}function u(t,l,f){if(f.default&&(f!=null&&f.default())){const o=f.default().map(i=>d(i));if(t.name==="Group"){const i=new t;return o.forEach(m=>{i.add(m)}),i}else return new t(...o.flat().filter(Boolean))}else return l.args?new t(...l.args):new t}function h(t){return Object.entries(t.value).filter(([l,f])=>{var o,i;return(i=(o=f==null?void 0:f.prototype)==null?void 0:o.constructor)==null?void 0:i.toString().includes("class")}).map(([l,f])=>{const o=`${e}${l}`,i=s.defineComponent({name:o,setup(m,{slots:P,attrs:C,...S}){const{scene:_}=q(),y=s.inject("local-scene")||_,B=s.inject("catalogue"),{pushCamera:U}=F();let M=u(f,C,P);return c(C,M),(M instanceof g.PerspectiveCamera||M instanceof g.OrthographicCamera)&&U(M),M.isObject3D&&(y==null||y.value.add(M)),y!=null&&y.value&&M.isFog&&(y.value.fog=M),S.expose(M),r(o,{sceneuuid:y==null?void 0:y.value.uuid,catalogue:B==null?void 0:B.value.uuid,props:m,slots:P.default?P.default():void 0,attrs:C,ctx:S,scene:y}),()=>{}}});return[o,i]})}return{createComponentInstances:h,processProps:c,createInstanceFromVNode:d}}const X=p.createEventHook(),Y=p.createEventHook(),N=p.createEventHook(),A=new g.Clock;let D=0,T=0;const{pause:de,resume:me,isActive:ge}=p.useRafFn(()=>{X.trigger({delta:D,elapsed:T,clock:A}),Y.trigger({delta:D,elapsed:T,clock:A}),N.trigger({delta:D,elapsed:T,clock:A})},{immediate:!1});N.on(()=>{D=A.getDelta(),T=A.getElapsedTime()});function W(){return{onBeforeLoop:X.on,onLoop:Y.on,onAfterLoop:N.on,pause:de,resume:me,isActive:ge}}const he=s.shallowRef(new g.Scene);function q(){return{scene:he}}function Z(e){const r={nodes:{},materials:{}};return e&&e.traverse(n=>{n.name&&(r.nodes[n.name]=n),n.material&&!r.materials[n.material.name]&&(r.materials[n.material.name]=n.material)}),r}async function we(e,r,n,a,c){const{logError:d}=I(),u=new e;c&&c(u),n&&n(u);const t=(Array.isArray(r)?r:[r]).map(l=>new Promise((f,o)=>{u.load(l,i=>{i.scene&&Object.assign(i,Z(i.scene)),f(i)},a,i=>o(d("[useLoader] - Failed to load resource",i)))}));return $(r)?await Promise.all(t):await t[0]}async function ve(e){const r=new g.LoadingManager,n=new g.TextureLoader(r),a=c=>new Promise((d,u)=>{n.load(c,h=>d(h),()=>null,()=>{u(new Error("[useTextures] - Failed to load texture"))})});if($(e)){const c=await Promise.all(e.map(d=>a(d)));return e.length>1?c:c[0]}else{const{map:c,displacementMap:d,normalMap:u,roughnessMap:h,metalnessMap:t,aoMap:l}=e;return{map:c?await a(c):null,displacementMap:d?await a(d):null,normalMap:u?await a(u):null,roughnessMap:h?await a(h):null,metalnessMap:t?await a(t):null,aoMap:l?await a(l):null}}}const z=s.reactive({});function G(){function e(n){return z[n]}function r(n,a){z[n]=a}return{state:z,...s.toRefs(z),getState:e,setState:r}}const v=s.shallowRef(),R=s.ref(!1);function E(e,r,n){const{alpha:a=!0,antialias:c=!0,depth:d,logarithmicDepthBuffer:u,failIfMajorPerformanceCaveat:h,precision:t,premultipliedAlpha:l,stencil:f,shadows:o=!1,shadowMapType:i=g.PCFShadowMap,physicallyCorrectLights:m=!1,outputEncoding:P=g.LinearEncoding,toneMapping:C=g.NoToneMapping,toneMappingExposure:S=1,context:_=void 0,powerPreference:y="default",preserveDrawingBuffer:B=!1,clearColor:U,windowSize:M=!1}=s.toRefs(n),{width:H,height:ee}=p.resolveUnref(M)?p.useWindowSize():p.useElementSize(r),{pixelRatio:te}=p.useDevicePixelRatio(),{pause:Ue,resume:be}=W(),ne=s.computed(()=>H.value/ee.value),re=()=>{v.value&&(v.value.setSize(H.value,ee.value),v.value.setPixelRatio(Math.min(te.value,2)))},ae=()=>{v.value&&(v.value.shadowMap.enabled=p.resolveUnref(o),v.value.shadowMap.type=p.resolveUnref(i),v.value.toneMapping=p.resolveUnref(C)||g.NoToneMapping,v.value.toneMappingExposure=p.resolveUnref(S),v.value.outputEncoding=p.resolveUnref(P)||g.LinearEncoding,U!=null&&U.value&&v.value.setClearColor(fe(p.resolveUnref(U))),v.value.physicallyCorrectLights=p.resolveUnref(m))},Le=()=>{const oe=p.unrefElement(e);if(v.value||!oe)return;v.value=new g.WebGLRenderer({canvas:oe,alpha:p.resolveUnref(a),antialias:p.resolveUnref(c),context:p.resolveUnref(_),depth:p.resolveUnref(d),failIfMajorPerformanceCaveat:p.resolveUnref(h),logarithmicDepthBuffer:p.resolveUnref(u),powerPreference:p.resolveUnref(y),precision:p.resolveUnref(t),stencil:p.resolveUnref(f),preserveDrawingBuffer:p.resolveUnref(B),premultipliedAlpha:p.resolveUnref(l)});const{setState:se}=G();se("renderer",v.value),se("clock",new g.Clock),ae(),re(),be(),R.value=!0},xe=()=>{v.value&&(v.value.dispose(),v.value=void 0,R.value=!1,Ue())};return s.watch([ne,te],re),s.watch([o,i,P,m,C,S,U],ae),s.watch(()=>[e,r],()=>{p.unrefElement(e)&&p.unrefElement(r)&&Le()},{immediate:!0,deep:!0}),{renderer:v,isReady:R,dispose:xe,aspectRatio:ne}}const Ce=s.defineComponent({name:"TresCanvas",props:{shadows:Boolean,shadowMapType:Object,physicallyCorrectLights:Boolean,outputEncoding:Object,toneMapping:Object,toneMappingExposure:Number,context:Object,powerPreference:Object,preserveDrawingBuffer:Boolean,clearColor:String,windowSize:{type:Boolean,default:!1}},setup(e,{slots:r,attrs:n}){const{logError:a}=I(),c=s.ref(),d=s.ref(),{renderer:u,dispose:h,aspectRatio:t}=E(c,d,e);s.provide("aspect-ratio",t),s.provide("renderer",u);const l=s.shallowRef();return s.provide("camera",l),r.default&&!r.default().some(f=>f.type.name==="Scene")&&a("TresCanvas must contain a Scene component."),r.default&&!r.default().some(f=>{var o;return(o=f.type.name)==null?void 0:o.includes("Camera")})&&a("Scene must contain a Camera component."),s.onBeforeUnmount(()=>h()),()=>{if(r.default)return s.h("div",{ref:d,style:{position:"relative",width:"100%",height:"100vh",...n.style}},[s.h("canvas",{ref:c,style:{width:"100%",height:"100%",position:e.windowSize?"fixed":"absolute",top:0,left:0}}),r.default()])}}}),ye=s.defineComponent({name:"Scene",setup(e,{slots:r}){const{scene:n}=q(),a=s.inject("renderer"),{activeCamera:c}=F(),{onLoop:d}=W();return s.provide("local-scene",n),d(({clock:u})=>{a!=null&&a.value&&(c!=null&&c.value)&&(n!=null&&n.value)&&a.value.render(n==null?void 0:n.value,c.value)}),()=>{if(r.default)return r.default()}}}),Se=Symbol("UseTresState"),Me="1.5.1",Pe={install(e,r){const n=(r==null?void 0:r.prefix)||"Tres";e.component(`${n}Canvas`,Ce),e.component(`${n}Scene`,ye);const{catalogue:a,extend:c}=k(e,n);e.provide("catalogue",a),e.provide("extend",c);const{createComponentInstances:d}=V(n);d(a).forEach(([h,t])=>{e.component(h,t)}),window.__TRES__={app:e,version:Me}}};w.CameraType=J,w.UseTresStateSymbol=Se,w.default=Pe,w.trasverseObjects=Z,w.useCamera=F,w.useCatalogue=k,w.useInstanceCreator=V,w.useLoader=we,w.useRenderLoop=W,w.useRenderer=E,w.useScene=q,w.useTexture=ve,w.useTres=G,Object.defineProperties(w,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
8
+ (function(h,o){typeof exports=="object"&&typeof module<"u"?o(exports,require("vue"),require("@vueuse/core"),require("three")):typeof define=="function"&&define.amd?define(["exports","vue","@vueuse/core","three"],o):(h=typeof globalThis<"u"?globalThis:h||self,o(h.tres={},h.Vue,h.VueUseCore,h.Three))})(this,function(h,o,f,m){"use strict";function ue(e){const n=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const r in e)if(r!=="default"){const a=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(n,r,a.get?a:{enumerable:!0,get:()=>e[r]})}}return n.default=e,Object.freeze(n)}const Z=ue(m);var E=(e=>(e.Perspective="Perspective",e.Orthographic="Orthographic",e))(E||{});const j={cameras:[]},fe=45;let O;function G(){const e=o.inject("aspect-ratio"),{setState:n}=N();function r(d="Perspective",t){if(d==="Perspective"){const{near:s,far:u,fov:i}=t||{near:.1,far:1e3,fov:fe};O=new m.PerspectiveCamera(i,(e==null?void 0:e.value)||1,s,u),j.cameras.push(O)}else{const{left:s,right:u,top:i,bottom:l,near:p,far:U}=t||{left:-100,right:100,top:100,bottom:-100,near:.1,far:1e3};O=new m.OrthographicCamera(s,u,i,l,p,U),j.cameras.push(O)}return j.cameras.push(O),O}const a=o.computed(()=>j.cameras[0]);function c(){a.value instanceof m.PerspectiveCamera&&e&&(a.value.aspect=e.value),a.value.updateProjectionMatrix()}function g(d){const t=o.inject("camera");d&&t&&(t.value=d,n("camera",t.value)),j.cameras.push(d),d instanceof m.PerspectiveCamera&&e&&(d.aspect=e.value),d.updateProjectionMatrix()}return e&&o.watch(e,c),{activeCamera:a,createCamera:r,updateCamera:c,pushCamera:g}}const H="[TresJS ▲ ■ ●] ";function D(){function e(a,c){console.error(`${H} ${a}`,c||"")}function n(a){console.warn(`${H} ${a}`)}function r(a,c){}return{logError:e,logWarning:n,logMessage:r}}const $=o.ref({...Z,uuid:Z.MathUtils.generateUUID()});delete $.value.Scene;let _;function K(e,n="Tres"){const{logError:r}=D();!_&&e&&(_=e);const{createComponentInstances:a}=J(n);return{extend:g=>{if(!g){r("No objects provided to extend catalogue");return}$.value=Object.assign($.value,g);const d=a(o.ref(g));_&&d.forEach(([t,s])=>{_._context.components[t]||_.component(t,s)})},catalogue:$}}const A=e=>typeof e<"u",pe=e=>typeof e=="function",k=e=>!!e&&e.constructor===Array;function de(e){return typeof e=="number"?[e,e,e]:e instanceof m.Vector3?[e.x,e.y,e.z]:e}function me(e){return e instanceof m.Color?e:Array.isArray(e)?new m.Color(...e):new m.Color(e)}const ge=["rotation","scale","position"];function J(e){const{logError:n}=D();function r(t,s){A(t)&&A(s)&&Object.entries(t).forEach(([u,i])=>{const l=u.replace(/(-\w)/g,p=>p[1].toUpperCase());s.setAttribute(l,new m.BufferAttribute(...i))})}function a(t,s){A(t)&&A(s)&&Object.entries(t).forEach(([u,i])=>{const l=u.replace(/(-\w)/g,p=>p[1].toUpperCase());if(!(l==="args"||i===void 0)){ge.includes(l)&&i&&(i=de(i)),t.ref&&(t.ref=s);try{if(s[l]&&A(s[l].set))s[l].set(...k(i)?i:[i]);else{if(i===""&&(i=!0),pe(s[l])){if(u==="center"&&!i)return;s[l](...k(i)?i:[i]);return}s[l]=i}}catch(p){n(`There was an error setting ${l} property`,p)}}})}function c(t){var i,l;const s=/^Symbol\(Fragment\)$/g,u=/^Symbol\(Text\)$/g;if(s.test(t.type.toString()))return t.children.map(p=>c(p));if(u.test(t.type.toString()))return;{const p=t.type.name.replace(e,""),{catalogue:U}=K(),v=o.inject("catalogue")||U;let y;if(v)if((i=t.children)!=null&&i.default){const x=t.children.default().map(I=>c(I));y=new v.value[p](...x.flat().filter(Boolean))}else(l=t==null?void 0:t.props)!=null&&l.args?v!=null&&v.value[p]?y=new v.value[p](...t.props.args):n(`There is no ${p} in the catalogue`,v==null?void 0:v.value.uuid):y=new v.value[p];return t!=null&&t.props&&(p==="BufferGeometry"?r(t.props,y):a(t.props,y)),y}}function g(t,s,u){if(u.default&&(u!=null&&u.default())){const i=u.default().map(l=>c(l));if(t.name==="Group"){const l=new t;return i.forEach(p=>{l.add(p)}),l}else return new t(...i.flat().filter(Boolean))}else return s.args?new t(...s.args):new t}function d(t){return Object.entries(t.value).filter(([s,u])=>{var i,l;return(l=(i=u==null?void 0:u.prototype)==null?void 0:i.constructor)==null?void 0:l.toString().includes("class")}).map(([s,u])=>{const i=`${e}${s}`,l=o.defineComponent({name:i,setup(p,{slots:U,attrs:v,...y}){const{scene:x}=Y(),{onLoop:I}=T(),M=o.inject("local-scene")||x,L=o.inject("raycaster"),{pushCamera:b}=G();let C=g(u,v,U);a(v,C),(C instanceof m.PerspectiveCamera||C instanceof m.OrthographicCamera)&&b(C),C.isObject3D&&(M==null||M.value.add(C));let P=null,S=null;if(C.isMesh){I(()=>{if(C&&(L!=null&&L.value)){const q=L==null?void 0:L.value.intersectObjects(M.value.children);q.length>0?(S=q[0],(P===null||P.object.uuid!==(S==null?void 0:S.object.uuid))&&y.emit("pointer-enter",S),y.emit("pointer-move",S)):(S=null,P!==null&&y.emit("pointer-leave",P)),P=S}});const W=f.useEventListener(window,"click",()=>{y.emit("click",P)});o.onUnmounted(()=>{W()})}return M!=null&&M.value&&C.isFog&&(M.value.fog=C),y.expose(C),()=>{}}});return[i,l]})}return{createComponentInstances:d,processProps:a,createInstanceFromVNode:c}}const ee=f.createEventHook(),te=f.createEventHook(),X=f.createEventHook(),B=new m.Clock;let F=0,z=0;const{pause:he,resume:we,isActive:ve}=f.useRafFn(()=>{ee.trigger({delta:F,elapsed:z,clock:B}),te.trigger({delta:F,elapsed:z,clock:B}),X.trigger({delta:F,elapsed:z,clock:B})},{immediate:!1});X.on(()=>{F=B.getDelta(),z=B.getElapsedTime()});function T(){return{onBeforeLoop:ee.on,onLoop:te.on,onAfterLoop:X.on,pause:he,resume:we,isActive:ve}}const ye=o.shallowRef(new m.Scene);function Y(){return{scene:ye}}function ne(e){const n={nodes:{},materials:{}};return e&&e.traverse(r=>{r.name&&(n.nodes[r.name]=r),r.material&&!n.materials[r.material.name]&&(n.materials[r.material.name]=r.material)}),n}async function Ce(e,n,r,a,c){const{logError:g}=D(),d=new e;c&&c(d),r&&r(d);const s=(Array.isArray(n)?n:[n]).map(u=>new Promise((i,l)=>{d.load(u,p=>{p.scene&&Object.assign(p,ne(p.scene)),i(p)},a,p=>l(g("[useLoader] - Failed to load resource",p)))}));return k(n)?await Promise.all(s):await s[0]}async function Se(e){const n=new m.LoadingManager,r=new m.TextureLoader(n),a=c=>new Promise((g,d)=>{r.load(c,t=>g(t),()=>null,()=>{d(new Error("[useTextures] - Failed to load texture"))})});if(k(e)){const c=await Promise.all(e.map(g=>a(g)));return e.length>1?c:c[0]}else{const{map:c,displacementMap:g,normalMap:d,roughnessMap:t,metalnessMap:s,aoMap:u}=e;return{map:c?await a(c):null,displacementMap:g?await a(g):null,normalMap:d?await a(d):null,roughnessMap:t?await a(t):null,metalnessMap:s?await a(s):null,aoMap:u?await a(u):null}}}const V=o.shallowReactive({});function N(){function e(r){return V[r]}function n(r,a){V[r]=a}return{state:V,...o.toRefs(V),getState:e,setState:n}}const w=o.shallowRef(),Q=o.ref(!1);function re(e,n,r){const{alpha:a=!0,antialias:c=!0,depth:g,logarithmicDepthBuffer:d,failIfMajorPerformanceCaveat:t,precision:s,premultipliedAlpha:u,stencil:i,shadows:l=!1,shadowMapType:p=m.PCFShadowMap,physicallyCorrectLights:U=!1,outputEncoding:v=m.LinearEncoding,toneMapping:y=m.NoToneMapping,toneMappingExposure:x=1,context:I=void 0,powerPreference:M="default",preserveDrawingBuffer:L=!1,clearColor:b,windowSize:C=!1}=o.toRefs(r),{width:P,height:S}=f.resolveUnref(C)?f.useWindowSize():f.useElementSize(n),{pixelRatio:W}=f.useDevicePixelRatio(),{pause:q,resume:je}=T(),ae=o.computed(()=>P.value/S.value),ie=()=>{w.value&&(w.value.setSize(P.value,S.value),w.value.setPixelRatio(Math.min(W.value,2)))},se=()=>{w.value&&(w.value.shadowMap.enabled=f.resolveUnref(l),w.value.shadowMap.type=f.resolveUnref(p),w.value.toneMapping=f.resolveUnref(y)||m.NoToneMapping,w.value.toneMappingExposure=f.resolveUnref(x),w.value.outputEncoding=f.resolveUnref(v)||m.LinearEncoding,b!=null&&b.value&&w.value.setClearColor(me(f.resolveUnref(b))),w.value.physicallyCorrectLights=f.resolveUnref(U))},_e=()=>{const ce=f.unrefElement(e);if(w.value||!ce)return;w.value=new m.WebGLRenderer({canvas:ce,alpha:f.resolveUnref(a),antialias:f.resolveUnref(c),context:f.resolveUnref(I),depth:f.resolveUnref(g),failIfMajorPerformanceCaveat:f.resolveUnref(t),logarithmicDepthBuffer:f.resolveUnref(d),powerPreference:f.resolveUnref(M),precision:f.resolveUnref(s),stencil:f.resolveUnref(i),preserveDrawingBuffer:f.resolveUnref(L),premultipliedAlpha:f.resolveUnref(u)});const{setState:le}=N();le("renderer",w.value),le("clock",new m.Clock),se(),ie(),je(),Q.value=!0},Ae=()=>{w.value&&(w.value.dispose(),w.value=void 0,Q.value=!1,q())};return o.watch([ae,W],ie),o.watch([l,p,v,U,y,x,b],se),o.watch(()=>[e,n],()=>{f.unrefElement(e)&&f.unrefElement(n)&&_e()},{immediate:!0,deep:!0}),{renderer:w,isReady:Q,dispose:Ae,aspectRatio:ae}}const Me=o.defineComponent({name:"TresCanvas",props:{shadows:Boolean,shadowMapType:Object,physicallyCorrectLights:Boolean,outputEncoding:Object,toneMapping:Object,toneMappingExposure:Number,context:Object,powerPreference:Object,preserveDrawingBuffer:Boolean,clearColor:String,windowSize:{type:Boolean,default:!1}},setup(e,{slots:n,attrs:r}){const{logError:a}=D(),c=o.ref(),g=o.ref(),{renderer:d,dispose:t,aspectRatio:s}=re(c,g,e);o.provide("aspect-ratio",s),o.provide("renderer",d);const u=o.shallowRef();return o.provide("camera",u),n.default&&!n.default().some(i=>i.type.name==="Scene")&&a("TresCanvas must contain a Scene component."),n.default&&!n.default().some(i=>{var l;return(l=i.type.name)==null?void 0:l.includes("Camera")})&&a("Scene must contain a Camera component."),o.onBeforeUnmount(()=>t()),()=>{if(n.default)return o.h("div",{ref:g,style:{position:"relative",width:"100%",height:"100vh",...r.style}},[o.h("canvas",{ref:c,style:{width:"100%",height:"100%",position:e.windowSize?"fixed":"absolute",top:0,left:0}}),n.default()])}}}),oe=o.shallowRef(new m.Raycaster),R=o.ref(new m.Vector2),Pe=o.ref(null);function Ue(){o.provide("raycaster",oe),o.provide("pointer",R),o.provide("currentInstance",Pe);function e(n){R.value.x=n.clientX/window.innerWidth*2-1,R.value.y=-(n.clientY/window.innerHeight)*2+1}return window.addEventListener("pointermove",e),o.onUnmounted(()=>{window.removeEventListener("pointermove",e)}),{raycaster:oe,pointer:R}}const Le=o.defineComponent({name:"Scene",setup(e,{slots:n}){const{scene:r}=Y(),a=o.inject("renderer"),{activeCamera:c}=G(),{raycaster:g,pointer:d}=Ue(),{onLoop:t}=T();return o.provide("local-scene",r),t(()=>{g.value.setFromCamera(d.value,c.value),a!=null&&a.value&&(c!=null&&c.value)&&(r!=null&&r.value)&&a.value.render(r==null?void 0:r.value,c.value)}),()=>{if(n.default)return n.default()}}}),be=Symbol("UseTresState"),Oe="1.6.0",xe={install(e,n){const r=(n==null?void 0:n.prefix)||"Tres";e.component(`${r}Canvas`,Me),e.component(`${r}Scene`,Le);const{catalogue:a,extend:c}=K(e,r);e.provide("catalogue",a),e.provide("extend",c),e.provide("useTres",N());const{createComponentInstances:g}=J(r);g(a).forEach(([t,s])=>{e.component(t,s)}),window.__TRES__={app:e,version:Oe}}};h.CameraType=E,h.UseTresStateSymbol=be,h.default=xe,h.trasverseObjects=ne,h.useCamera=G,h.useCatalogue=K,h.useInstanceCreator=J,h.useLoader=Ce,h.useRenderLoop=T,h.useRenderer=re,h.useScene=Y,h.useTexture=Se,h.useTres=N,Object.defineProperties(h,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
@@ -13,6 +13,16 @@ export type TresVNode = VNode & { children?: Array<VNode | { default: any }>; ty
13
13
  export type TresAttributes = Record<string, any> & { args?: number[] }
14
14
 
15
15
  export type TresColor = string | number | Color | number[]
16
+
17
+ export interface TresEvent extends Intersection<Object3D<Event>> {
18
+ object: Object3D
19
+ distance: number
20
+ face?: Face3
21
+ faceIndex?: number | undefined
22
+ point: Vector3
23
+ uv?: Vector2
24
+ }
25
+
16
26
  declare global {
17
27
  // Define the window interface, with type annotations for the properties and methods of the window object
18
28
  interface Window {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tresjs/core",
3
3
  "description": "Declarative ThreeJS using Vue Components",
4
- "version": "1.5.1",
4
+ "version": "1.6.0",
5
5
  "type": "module",
6
6
  "author": "Alvaro Saburido <hola@alvarosaburido.dev> (https://github.com/alvarosabu/)",
7
7
  "files": [
@@ -38,7 +38,7 @@
38
38
  },
39
39
  "devDependencies": {
40
40
  "@alvarosabu/utils": "^2.2.0",
41
- "@tresjs/cientos": "^1.5.0",
41
+ "@tresjs/cientos": "^1.6.0",
42
42
  "@types/three": "^0.148.0",
43
43
  "@vitejs/plugin-vue": "^4.0.0",
44
44
  "@vitest/coverage-c8": "^0.25.8",