@tresjs/core 1.5.0 → 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
+ };
@@ -1,8 +1,10 @@
1
1
  import { EventHookOn, Fn } from '@vueuse/core';
2
2
  import { Ref } from 'vue';
3
+ import { Clock } from 'three';
3
4
  export interface RenderLoop {
4
5
  delta: number;
5
6
  elapsed: number;
7
+ clock: Clock;
6
8
  }
7
9
  export interface UseRenderLoopReturn {
8
10
  onBeforeLoop: EventHookOn<RenderLoop>;
package/dist/tres.js CHANGED
@@ -1,31 +1,31 @@
1
1
  /**
2
2
  * name: @tresjs/core
3
- * version: v1.5.0
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 ne, watch as O, ref as b, defineComponent as V, shallowRef as j, reactive as ye, toRefs as re, provide as $, onBeforeUnmount as Ce, h as Q } from "vue";
9
- import { createEventHook as N, useRafFn as Se, resolveUnref as d, useWindowSize as xe, useElementSize as Me, useDevicePixelRatio as Ee, unrefElement as F } from "@vueuse/core";
10
- import * as X from "three";
11
- import { PerspectiveCamera as I, OrthographicCamera as ae, Vector3 as Pe, Color as z, BufferAttribute as Te, Clock as Le, Scene as Re, LoadingManager as Ae, TextureLoader as be, PCFShadowMap as Be, LinearEncoding as Y, NoToneMapping as Z, WebGLRenderer as Oe } 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
- }, Ie = 45;
16
- let x;
17
- function oe() {
18
- const e = M("aspect-ratio"), { setState: n } = me();
19
- function r(l = "Perspective", m) {
20
- if (l === "Perspective") {
21
- const { near: t, far: c, fov: u } = 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: Ie
24
+ fov: Ve
25
25
  };
26
- x = new I(u, (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: u, 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,34 +33,34 @@ function oe() {
33
33
  near: 0.1,
34
34
  far: 1e3
35
35
  };
36
- x = new ae(t, c, u, 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 = ne(() => T.cameras[0]);
41
- function i() {
42
- o.value instanceof I && 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(l) {
45
- const m = M("camera");
46
- l && m && (m.value = l, n("camera", m.value)), T.cameras.push(l), l instanceof I && e && (l.aspect = e.value), l.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 && O(e, i), {
48
+ return e && z(e, s), {
49
49
  activeCamera: o,
50
50
  createCamera: r,
51
- updateCamera: i,
52
- pushCamera: f
51
+ updateCamera: s,
52
+ pushCamera: p
53
53
  };
54
54
  }
55
- const ee = "[TresJS ▲ ■ ●] ";
56
- function D() {
57
- function e(o, i) {
58
- console.error(`${ee} ${o}`, i || "");
55
+ const ue = "[TresJS ▲ ■ ●] ";
56
+ function G() {
57
+ function e(o, s) {
58
+ console.error(`${ue} ${o}`, s || "");
59
59
  }
60
60
  function n(o) {
61
- console.warn(`${ee} ${o}`);
61
+ console.warn(`${ue} ${o}`);
62
62
  }
63
- function r(o, i) {
63
+ function r(o, s) {
64
64
  }
65
65
  return {
66
66
  logError: e,
@@ -68,283 +68,295 @@ function D() {
68
68
  logMessage: r
69
69
  };
70
70
  }
71
- const A = b({ ...X, uuid: X.MathUtils.generateUUID() });
72
- delete A.value.Scene;
73
- let L;
74
- function se(e, n = "Tres") {
75
- const { logMessage: r, logError: o } = D();
76
- !L && e && (L = e);
77
- const { createComponentInstances: i } = ie(n);
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: (l) => {
80
- if (!l) {
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, l);
85
- const m = i(b(l));
86
- r("Adding objects to catalogue", { objects: l, 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", _e = (e) => typeof e == "function", _ = (e) => !!e && e.constructor === Array;
94
- function De(e) {
95
- return typeof e == "number" ? [e, e, e] : e instanceof Pe ? [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 Fe(e) {
98
- return e instanceof z ? e : Array.isArray(e) ? new z(...e) : new z(e);
97
+ function Ge(e) {
98
+ return e instanceof K ? e : Array.isArray(e) ? new K(...e) : new K(e);
99
99
  }
100
- const ze = ["rotation", "scale", "position"];
101
- function ie(e) {
102
- const { logMessage: n, logError: r } = D();
103
- function o(t, c) {
104
- R(t) && R(c) && Object.entries(t).forEach(([u, a]) => {
105
- const s = u.replace(/(-\w)/g, (p) => p[1].toUpperCase());
106
- c.setAttribute(s, new Te(...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(([u, a]) => {
111
- const s = u.replace(/(-\w)/g, (p) => p[1].toUpperCase());
112
- if (!(s === "args" || a === void 0)) {
113
- ze.includes(s) && a && (a = De(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(..._(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), _e(c[s])) {
118
+ if (a === "" && (a = !0), Ne(i[c])) {
119
119
  if (u === "center" && !a)
120
120
  return;
121
- c[s](..._(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
- r(`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, u = /^Symbol\(Text\)$/g;
135
- if (c.test(t.type.toString()))
136
- return t.children.map((p) => f(p));
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
137
  if (u.test(t.type.toString()))
138
138
  return;
139
139
  {
140
- const p = t.type.name.replace(e, ""), { catalogue: C } = se(), 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) : r(`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)), n(`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 l(t, c, u) {
151
+ function p(t, i, u) {
152
152
  if (u.default && (u != null && u.default())) {
153
- const a = u.default().map((s) => f(s));
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, u]) => {
166
- var a, s;
167
- return (s = (a = u == null ? void 0 : u.prototype) == null ? void 0 : a.constructor) == null ? void 0 : s.toString().includes("class");
168
- }).map(([c, u]) => {
169
- const a = `${e}${c}`, s = V({
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 } = pe(), w = M("local-scene") || E, P = M("catalogue"), { pushCamera: S } = oe();
173
- let y = l(u, h, C);
174
- return i(h, y), (y instanceof I || y instanceof ae) && S(y), y.isObject3D && (w == null || w.value.add(y)), w != null && w.value && y.isFog && (w.value.fog = y), v.expose(y), n(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 ce = N(), ue = N(), le = N(), te = new Le(), { pause: Ue, resume: Ve, isActive: je } = Se(
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(
196
206
  () => {
197
- const e = te.getElapsedTime(), n = te.getDelta();
198
- ce.trigger({ delta: n, elapsed: e }), ue.trigger({ delta: n, elapsed: e }), le.trigger({ delta: n, elapsed: e });
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 });
199
208
  },
200
209
  { immediate: !1 }
201
210
  );
202
- function fe() {
211
+ q.on(() => {
212
+ k = I.getDelta(), V = I.getElapsedTime();
213
+ });
214
+ function Q() {
203
215
  return {
204
- onBeforeLoop: ce.on,
205
- onLoop: ue.on,
206
- onAfterLoop: le.on,
207
- pause: Ue,
208
- resume: Ve,
209
- isActive: je
216
+ onBeforeLoop: ye.on,
217
+ onLoop: Ce.on,
218
+ onAfterLoop: q.on,
219
+ pause: Ke,
220
+ resume: Je,
221
+ isActive: Xe
210
222
  };
211
223
  }
212
- const Ne = j(new Re());
213
- function pe() {
224
+ const Ye = W(new $e());
225
+ function Se() {
214
226
  return {
215
- scene: Ne
227
+ scene: Ye
216
228
  };
217
229
  }
218
- function ke(e) {
230
+ function qe(e) {
219
231
  const n = { nodes: {}, materials: {} };
220
232
  return e && e.traverse((r) => {
221
233
  r.name && (n.nodes[r.name] = r), r.material && !n.materials[r.material.name] && (n.materials[r.material.name] = r.material);
222
234
  }), n;
223
235
  }
224
- async function Xe(e, n, r, o, i) {
225
- const { logError: f } = D(), l = new e();
226
- i && i(l), r && r(l);
227
- const t = (Array.isArray(n) ? n : [n]).map(
228
- (c) => new Promise((u, a) => {
229
- l.load(
230
- c,
231
- (s) => {
232
- s.scene && Object.assign(s, ke(s.scene)), u(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);
233
245
  },
234
246
  o,
235
- (s) => a(f("[useLoader] - Failed to load resource", s))
247
+ (l) => c(p("[useLoader] - Failed to load resource", l))
236
248
  );
237
249
  })
238
250
  );
239
- return _(n) ? await Promise.all(t) : await t[0];
251
+ return N(n) ? await Promise.all(i) : await i[0];
240
252
  }
241
- async function Ye(e) {
242
- const n = new Ae(), r = new be(n), o = (i) => new Promise((f, l) => {
253
+ async function ct(e) {
254
+ const n = new _e(), r = new Fe(n), o = (s) => new Promise((p, f) => {
243
255
  r.load(
244
- i,
245
- (m) => f(m),
256
+ s,
257
+ (t) => p(t),
246
258
  () => null,
247
259
  () => {
248
- l(new Error("[useTextures] - Failed to load texture"));
260
+ f(new Error("[useTextures] - Failed to load texture"));
249
261
  }
250
262
  );
251
263
  });
252
- if (_(e)) {
253
- const i = await Promise.all(e.map((f) => o(f)));
254
- 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];
255
267
  } else {
256
- const { map: i, displacementMap: f, normalMap: l, roughnessMap: m, metalnessMap: t, aoMap: c } = e;
268
+ const { map: s, displacementMap: p, normalMap: f, roughnessMap: t, metalnessMap: i, aoMap: u } = e;
257
269
  return {
258
- map: i ? await o(i) : null,
259
- displacementMap: f ? await o(f) : null,
260
- normalMap: l ? await o(l) : null,
261
- roughnessMap: m ? await o(m) : null,
262
- metalnessMap: t ? await o(t) : null,
263
- 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
264
276
  };
265
277
  }
266
278
  }
267
- const B = ye({});
268
- function me() {
279
+ const F = Le({});
280
+ function Z() {
269
281
  function e(r) {
270
- return B[r];
282
+ return F[r];
271
283
  }
272
284
  function n(r, o) {
273
- B[r] = o;
285
+ F[r] = o;
274
286
  }
275
287
  return {
276
- state: B,
277
- ...re(B),
288
+ state: F,
289
+ ...me(F),
278
290
  getState: e,
279
291
  setState: n
280
292
  };
281
293
  }
282
- const g = j(), U = b(!1);
283
- function We(e, n, r) {
294
+ const d = W(), J = L(!1);
295
+ function Qe(e, n, r) {
284
296
  const {
285
297
  alpha: o = !0,
286
- antialias: i = !0,
287
- depth: f,
288
- logarithmicDepthBuffer: l,
289
- failIfMajorPerformanceCaveat: m,
290
- precision: t,
291
- premultipliedAlpha: c,
292
- stencil: u,
293
- shadows: a = !1,
294
- shadowMapType: s = Be,
295
- physicallyCorrectLights: p = !1,
296
- outputEncoding: C = Y,
297
- toneMapping: h = Z,
298
- toneMappingExposure: v = 1,
299
- context: E = void 0,
300
- powerPreference: w = "default",
301
- preserveDrawingBuffer: P = !1,
302
- clearColor: S,
303
- windowSize: y = !1
304
- } = re(r), { width: k, height: W } = d(y) ? xe() : Me(n), { pixelRatio: G } = Ee(), { pause: de, resume: ge } = fe(), H = ne(() => k.value / W.value), K = () => {
305
- g.value && (g.value.setSize(k.value, W.value), g.value.setPixelRatio(Math.min(G.value, 2)));
306
- }, J = () => {
307
- g.value && (g.value.shadowMap.enabled = d(a), g.value.shadowMap.type = d(s), g.value.toneMapping = d(h) || Z, g.value.toneMappingExposure = d(v), g.value.outputEncoding = d(C) || Y, S != null && S.value && g.value.setClearColor(Fe(d(S))), g.value.physicallyCorrectLights = d(p));
308
- }, he = () => {
309
- const q = F(e);
310
- if (g.value || !q)
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)
311
323
  return;
312
- g.value = new Oe({
313
- canvas: q,
314
- alpha: d(o),
315
- antialias: d(i),
316
- context: d(E),
317
- depth: d(f),
318
- failIfMajorPerformanceCaveat: d(m),
319
- logarithmicDepthBuffer: d(l),
320
- powerPreference: d(w),
321
- precision: d(t),
322
- stencil: d(u),
323
- preserveDrawingBuffer: d(P),
324
- 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)
325
337
  });
326
- const { setState: ve } = me();
327
- ve("renderer", g.value), J(), K(), ge(), U.value = !0;
328
- }, we = () => {
329
- g.value && (g.value.dispose(), g.value = void 0, U.value = !1, de());
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, _());
330
342
  };
331
- return O([H, G], K), O(
332
- [a, s, C, p, h, v, S],
333
- J
334
- ), O(
343
+ return z([ee, $], te), z(
344
+ [c, l, g, S, w, P, M],
345
+ ne
346
+ ), z(
335
347
  () => [e, n],
336
348
  () => {
337
- F(e) && F(n) && he();
349
+ H(e) && H(n) && Me();
338
350
  },
339
351
  { immediate: !0, deep: !0 }
340
352
  ), {
341
- renderer: g,
342
- isReady: U,
343
- dispose: we,
344
- aspectRatio: H
353
+ renderer: d,
354
+ isReady: J,
355
+ dispose: xe,
356
+ aspectRatio: ee
345
357
  };
346
358
  }
347
- const Ge = V({
359
+ const Ze = X({
348
360
  name: "TresCanvas",
349
361
  props: {
350
362
  shadows: Boolean,
@@ -360,18 +372,18 @@ const Ge = V({
360
372
  windowSize: { type: Boolean, default: !1 }
361
373
  },
362
374
  setup(e, { slots: n, attrs: r }) {
363
- const { logError: o } = D(), i = b(), f = b(), { renderer: l, dispose: m, aspectRatio: t } = We(i, f, e);
364
- $("aspect-ratio", t), $("renderer", l);
365
- const c = j();
366
- return $("camera", c), n.default && !n.default().some((u) => u.type.name === "Scene") && o("TresCanvas must contain a Scene component."), n.default && !n.default().some((u) => {
367
- var a;
368
- return (a = u.type.name) == null ? void 0 : a.includes("Camera");
369
- }) && o("Scene must contain a Camera component."), Ce(() => m()), () => {
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()), () => {
370
382
  if (n.default)
371
- return Q(
383
+ return ae(
372
384
  "div",
373
385
  {
374
- ref: f,
386
+ ref: p,
375
387
  style: {
376
388
  position: "relative",
377
389
  width: "100%",
@@ -380,8 +392,8 @@ const Ge = V({
380
392
  }
381
393
  },
382
394
  [
383
- Q("canvas", {
384
- ref: i,
395
+ ae("canvas", {
396
+ ref: s,
385
397
  style: {
386
398
  width: "100%",
387
399
  height: "100%",
@@ -395,44 +407,57 @@ const Ge = V({
395
407
  );
396
408
  };
397
409
  }
398
- }), He = V({
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({
399
424
  name: "Scene",
400
425
  setup(e, { slots: n }) {
401
- const { scene: r } = pe(), o = M("renderer"), { activeCamera: i } = oe(), { onLoop: f } = fe();
402
- return $("local-scene", r), f(() => {
403
- o != null && o.value && (i != null && i.value) && (r != null && r.value) && o.value.render(r == null ? void 0 : r.value, i.value);
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);
404
429
  }), () => {
405
430
  if (n.default)
406
431
  return n.default();
407
432
  };
408
433
  }
409
- }), Ze = Symbol("UseTresState"), Ke = "1.5.0", et = {
434
+ }), ut = Symbol("UseTresState"), rt = "1.6.0", lt = {
410
435
  install(e, n) {
411
436
  const r = (n == null ? void 0 : n.prefix) || "Tres";
412
- e.component(`${r}Canvas`, Ge), e.component(`${r}Scene`, He);
413
- const { catalogue: o, extend: i } = se(e, r);
414
- e.provide("catalogue", o), e.provide("extend", i);
415
- const { createComponentInstances: f } = ie(r);
416
- f(o).forEach(([m, t]) => {
417
- e.component(m, t);
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);
418
443
  }), window.__TRES__ = {
419
444
  app: e,
420
- version: Ke
445
+ version: rt
421
446
  };
422
447
  }
423
448
  };
424
449
  export {
425
- $e as CameraType,
426
- Ze as UseTresStateSymbol,
427
- et as default,
428
- ke as trasverseObjects,
429
- oe as useCamera,
430
- se as useCatalogue,
431
- ie as useInstanceCreator,
432
- Xe as useLoader,
433
- fe as useRenderLoop,
434
- We as useRenderer,
435
- pe as useScene,
436
- Ye as useTexture,
437
- me 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
438
463
  };
package/dist/tres.umd.cjs CHANGED
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * name: @tresjs/core
3
- * version: v1.5.0
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,f,g){"use strict";function ae(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 R=ae(g);var W=(e=>(e.Perspective="Perspective",e.Orthographic="Orthographic",e))(W||{});const L={cameras:[]},oe=45;let b;function D(){const e=s.inject("aspect-ratio"),{setState:n}=k();function r(p="Perspective",h){if(p==="Perspective"){const{near:t,far:l,fov:u}=h||{near:.1,far:1e3,fov:oe};b=new g.PerspectiveCamera(u,(e==null?void 0:e.value)||1,t,l),L.cameras.push(b)}else{const{left:t,right:l,top:u,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,u,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(p){const h=s.inject("camera");p&&h&&(h.value=p,n("camera",h.value)),L.cameras.push(p),p instanceof g.PerspectiveCamera&&e&&(p.aspect=e.value),p.updateProjectionMatrix()}return e&&s.watch(e,c),{activeCamera:a,createCamera:r,updateCamera:c,pushCamera:d}}const q="[TresJS ▲ ■ ●] ";function B(){function e(a,c){console.error(`${q} ${a}`,c||"")}function n(a){console.warn(`${q} ${a}`)}function r(a,c){}return{logError:e,logWarning:n,logMessage:r}}const x=s.ref({...R,uuid:R.MathUtils.generateUUID()});delete x.value.Scene;let O;function T(e,n="Tres"){const{logMessage:r,logError:a}=B();!O&&e&&(O=e);const{createComponentInstances:c}=z(n);return{extend:p=>{if(!p){a("No objects provided to extend catalogue");return}x.value=Object.assign(x.value,p);const h=c(s.ref(p));r("Adding objects to catalogue",{objects:p,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",se=e=>typeof e=="function",I=e=>!!e&&e.constructor===Array;function ie(e){return typeof e=="number"?[e,e,e]:e instanceof g.Vector3?[e.x,e.y,e.z]:e}function ce(e){return e instanceof g.Color?e:Array.isArray(e)?new g.Color(...e):new g.Color(e)}const le=["rotation","scale","position"];function z(e){const{logMessage:n,logError:r}=B();function a(t,l){j(t)&&j(l)&&Object.entries(t).forEach(([u,o])=>{const i=u.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(([u,o])=>{const i=u.replace(/(-\w)/g,m=>m[1].toUpperCase());if(!(i==="args"||o===void 0)){le.includes(i)&&o&&(o=ie(o)),t.ref&&(t.ref=l);try{if(l[i]&&j(l[i].set))l[i].set(...I(o)?o:[o]);else{if(o===""&&(o=!0),se(l[i])){if(u==="center"&&!o)return;l[i](...I(o)?o:[o]);return}l[i]=o}}catch(m){r(`There was an error setting ${i} property`,m)}}})}function d(t){var o,i;const l=/^Symbol\(Fragment\)$/g,u=/^Symbol\(Text\)$/g;if(l.test(t.type.toString()))return t.children.map(m=>d(m));if(u.test(t.type.toString()))return;{const m=t.type.name.replace(e,""),{catalogue:P}=T(),C=s.inject("catalogue")||P;let S;if(C)if((o=t.children)!=null&&o.default){const A=t.children.default().map(y=>d(y));S=new C.value[m](...A.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):r(`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)),n(`Created ${m} instance`,S),S}}function p(t,l,u){if(u.default&&(u!=null&&u.default())){const o=u.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,u])=>{var o,i;return(i=(o=u==null?void 0:u.prototype)==null?void 0:o.constructor)==null?void 0:i.toString().includes("class")}).map(([l,u])=>{const o=`${e}${l}`,i=s.defineComponent({name:o,setup(m,{slots:P,attrs:C,...S}){const{scene:A}=V(),y=s.inject("local-scene")||A,_=s.inject("catalogue"),{pushCamera:U}=D();let M=p(u,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),n(o,{sceneuuid:y==null?void 0:y.value.uuid,catalogue:_==null?void 0:_.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 G=f.createEventHook(),K=f.createEventHook(),J=f.createEventHook(),Q=new g.Clock,{pause:ue,resume:fe,isActive:pe}=f.useRafFn(()=>{const e=Q.getElapsedTime(),n=Q.getDelta();G.trigger({delta:n,elapsed:e}),K.trigger({delta:n,elapsed:e}),J.trigger({delta:n,elapsed:e})},{immediate:!1});function F(){return{onBeforeLoop:G.on,onLoop:K.on,onAfterLoop:J.on,pause:ue,resume:fe,isActive:pe}}const de=s.shallowRef(new g.Scene);function V(){return{scene:de}}function X(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 me(e,n,r,a,c){const{logError:d}=B(),p=new e;c&&c(p),r&&r(p);const t=(Array.isArray(n)?n:[n]).map(l=>new Promise((u,o)=>{p.load(l,i=>{i.scene&&Object.assign(i,X(i.scene)),u(i)},a,i=>o(d("[useLoader] - Failed to load resource",i)))}));return I(n)?await Promise.all(t):await t[0]}async function ge(e){const n=new g.LoadingManager,r=new g.TextureLoader(n),a=c=>new Promise((d,p)=>{r.load(c,h=>d(h),()=>null,()=>{p(new Error("[useTextures] - Failed to load texture"))})});if(I(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:p,roughnessMap:h,metalnessMap:t,aoMap:l}=e;return{map:c?await a(c):null,displacementMap:d?await a(d):null,normalMap:p?await a(p):null,roughnessMap:h?await a(h):null,metalnessMap:t?await a(t):null,aoMap:l?await a(l):null}}}const $=s.reactive({});function k(){function e(r){return $[r]}function n(r,a){$[r]=a}return{state:$,...s.toRefs($),getState:e,setState:n}}const v=s.shallowRef(),N=s.ref(!1);function Y(e,n,r){const{alpha:a=!0,antialias:c=!0,depth:d,logarithmicDepthBuffer:p,failIfMajorPerformanceCaveat:h,precision:t,premultipliedAlpha:l,stencil:u,shadows:o=!1,shadowMapType:i=g.PCFShadowMap,physicallyCorrectLights:m=!1,outputEncoding:P=g.LinearEncoding,toneMapping:C=g.NoToneMapping,toneMappingExposure:S=1,context:A=void 0,powerPreference:y="default",preserveDrawingBuffer:_=!1,clearColor:U,windowSize:M=!1}=s.toRefs(r),{width:Z,height:E}=f.resolveUnref(M)?f.useWindowSize():f.useElementSize(n),{pixelRatio:H}=f.useDevicePixelRatio(),{pause:Se,resume:Me}=F(),ee=s.computed(()=>Z.value/E.value),te=()=>{v.value&&(v.value.setSize(Z.value,E.value),v.value.setPixelRatio(Math.min(H.value,2)))},ne=()=>{v.value&&(v.value.shadowMap.enabled=f.resolveUnref(o),v.value.shadowMap.type=f.resolveUnref(i),v.value.toneMapping=f.resolveUnref(C)||g.NoToneMapping,v.value.toneMappingExposure=f.resolveUnref(S),v.value.outputEncoding=f.resolveUnref(P)||g.LinearEncoding,U!=null&&U.value&&v.value.setClearColor(ce(f.resolveUnref(U))),v.value.physicallyCorrectLights=f.resolveUnref(m))},Pe=()=>{const re=f.unrefElement(e);if(v.value||!re)return;v.value=new g.WebGLRenderer({canvas:re,alpha:f.resolveUnref(a),antialias:f.resolveUnref(c),context:f.resolveUnref(A),depth:f.resolveUnref(d),failIfMajorPerformanceCaveat:f.resolveUnref(h),logarithmicDepthBuffer:f.resolveUnref(p),powerPreference:f.resolveUnref(y),precision:f.resolveUnref(t),stencil:f.resolveUnref(u),preserveDrawingBuffer:f.resolveUnref(_),premultipliedAlpha:f.resolveUnref(l)});const{setState:be}=k();be("renderer",v.value),ne(),te(),Me(),N.value=!0},Ue=()=>{v.value&&(v.value.dispose(),v.value=void 0,N.value=!1,Se())};return s.watch([ee,H],te),s.watch([o,i,P,m,C,S,U],ne),s.watch(()=>[e,n],()=>{f.unrefElement(e)&&f.unrefElement(n)&&Pe()},{immediate:!0,deep:!0}),{renderer:v,isReady:N,dispose:Ue,aspectRatio:ee}}const he=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:n,attrs:r}){const{logError:a}=B(),c=s.ref(),d=s.ref(),{renderer:p,dispose:h,aspectRatio:t}=Y(c,d,e);s.provide("aspect-ratio",t),s.provide("renderer",p);const l=s.shallowRef();return s.provide("camera",l),n.default&&!n.default().some(u=>u.type.name==="Scene")&&a("TresCanvas must contain a Scene component."),n.default&&!n.default().some(u=>{var o;return(o=u.type.name)==null?void 0:o.includes("Camera")})&&a("Scene must contain a Camera component."),s.onBeforeUnmount(()=>h()),()=>{if(n.default)return s.h("div",{ref:d,style:{position:"relative",width:"100%",height:"100vh",...r.style}},[s.h("canvas",{ref:c,style:{width:"100%",height:"100%",position:e.windowSize?"fixed":"absolute",top:0,left:0}}),n.default()])}}}),we=s.defineComponent({name:"Scene",setup(e,{slots:n}){const{scene:r}=V(),a=s.inject("renderer"),{activeCamera:c}=D(),{onLoop:d}=F();return s.provide("local-scene",r),d(()=>{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()}}}),ve=Symbol("UseTresState"),Ce="1.5.0",ye={install(e,n){const r=(n==null?void 0:n.prefix)||"Tres";e.component(`${r}Canvas`,he),e.component(`${r}Scene`,we);const{catalogue:a,extend:c}=T(e,r);e.provide("catalogue",a),e.provide("extend",c);const{createComponentInstances:d}=z(r);d(a).forEach(([h,t])=>{e.component(h,t)}),window.__TRES__={app:e,version:Ce}}};w.CameraType=W,w.UseTresStateSymbol=ve,w.default=ye,w.trasverseObjects=X,w.useCamera=D,w.useCatalogue=T,w.useInstanceCreator=z,w.useLoader=me,w.useRenderLoop=F,w.useRenderer=Y,w.useScene=V,w.useTexture=ge,w.useTres=k,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"}})});
@@ -9,10 +9,20 @@ export type TresVNodeType = VNodeTypes & {
9
9
  __name?: string
10
10
  setup?: (props: Readonly<any>) => void
11
11
  }
12
- export type TresVNode = VNode & { children?: Array<VNode>; type: TresVNodeType }
12
+ export type TresVNode = VNode & { children?: Array<VNode | { default: any }>; type: TresVNodeType }
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.0",
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,26 +38,24 @@
38
38
  },
39
39
  "devDependencies": {
40
40
  "@alvarosabu/utils": "^2.2.0",
41
- "@histoire/plugin-vue": "0.11.7",
42
- "@tresjs/cientos": "^1.4.0",
41
+ "@tresjs/cientos": "^1.6.0",
43
42
  "@types/three": "^0.148.0",
44
43
  "@vitejs/plugin-vue": "^4.0.0",
45
44
  "@vitest/coverage-c8": "^0.25.8",
46
45
  "@vitest/ui": "^0.25.8",
47
- "@vueuse/core": "^9.7.0",
46
+ "@vueuse/core": "^9.11.0",
48
47
  "gl": "6.0.1",
49
48
  "happy-dom": "^8.1.0",
50
- "histoire": "0.11.9",
51
49
  "kolorist": "^1.6.0",
52
50
  "pathe": "^1.0.0",
53
51
  "release-it": "^15.5.1",
54
52
  "rollup-plugin-analyzer": "^4.0.0",
55
53
  "rollup-plugin-visualizer": "^5.8.3",
56
54
  "unplugin-vue-components": "^0.22.12",
57
- "vite": "^4.0.3",
55
+ "vite": "^4.0.4",
58
56
  "vite-plugin-banner": "^0.7.0",
59
57
  "vite-plugin-dts": "^1.7.1",
60
- "vite-plugin-glsl": "^1.0.1",
58
+ "vite-plugin-glsl": "^1.1.0",
61
59
  "vite-plugin-require-transform": "^1.0.4",
62
60
  "vitest": "^0.25.8",
63
61
  "vue-demi": "^0.13.11"
@@ -70,9 +68,6 @@
70
68
  "test:ci": "vitest run",
71
69
  "test:ui": "vitest --ui",
72
70
  "coverage": "vitest run --coverage",
73
- "story:dev": "histoire dev",
74
- "story:build": "histoire build",
75
- "story:preview": "histoire preview",
76
71
  "lint": "eslint . --ext .js,.jsx,.ts,.tsx,.vue",
77
72
  "changelog": "conventional-changelog -p angular -i CHANGELOG.md -s"
78
73
  }