@tresjs/core 1.4.0 → 1.5.1

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.
@@ -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>;
@@ -14,7 +14,10 @@ export declare const TresCanvas: import("vue").DefineComponent<{
14
14
  powerPreference: PropType<"high-performance" | "low-power" | "default">;
15
15
  preserveDrawingBuffer: BooleanConstructor;
16
16
  clearColor: StringConstructor;
17
- windowSize: BooleanConstructor;
17
+ windowSize: {
18
+ type: BooleanConstructor;
19
+ default: boolean;
20
+ };
18
21
  }, () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
19
22
  [key: string]: any;
20
23
  }> | undefined, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<{
@@ -28,7 +31,10 @@ export declare const TresCanvas: import("vue").DefineComponent<{
28
31
  powerPreference: PropType<"high-performance" | "low-power" | "default">;
29
32
  preserveDrawingBuffer: BooleanConstructor;
30
33
  clearColor: StringConstructor;
31
- windowSize: BooleanConstructor;
34
+ windowSize: {
35
+ type: BooleanConstructor;
36
+ default: boolean;
37
+ };
32
38
  }>>, {
33
39
  shadows: boolean;
34
40
  physicallyCorrectLights: boolean;
package/dist/tres.js CHANGED
@@ -1,31 +1,31 @@
1
1
  /**
2
2
  * name: @tresjs/core
3
- * version: v1.4.0
4
- * (c) 2022
3
+ * version: v1.5.1
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 { computed as N, watch as O, inject as L, ref as b, defineComponent as k, shallowRef as W, reactive as Ce, toRefs as ne, provide as B, onBeforeUnmount as Se, h as Q } from "vue";
9
- import { useWindowSize as re, createEventHook as G, useRafFn as Me, resolveUnref as p, useElementSize as xe, useDevicePixelRatio as Ee, unrefElement as U } from "@vueuse/core";
10
- import * as X from "three";
11
- import { PerspectiveCamera as $, OrthographicCamera as ae, Vector3 as Pe, Color as j, BufferAttribute as Te, Clock as Re, Scene as Le, LoadingManager as be, TextureLoader as Ae, PCFShadowMap as Oe, LinearEncoding as Y, NoToneMapping as Z, WebGLRenderer as Be } from "three";
12
- var $e = /* @__PURE__ */ ((e) => (e.Perspective = "Perspective", e.Orthographic = "Orthographic", e))($e || {});
13
- const E = {
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 = {
14
14
  cameras: []
15
- }, Ie = 45;
16
- let S;
17
- function oe() {
18
- const { width: e, height: n } = re(), { setState: r } = me();
19
- function c(t = "Perspective", s) {
20
- if (t === "Perspective") {
21
- const { near: u, far: a, fov: o } = s || {
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 || {
22
22
  near: 0.1,
23
23
  far: 1e3,
24
- fov: Ie
24
+ fov: De
25
25
  };
26
- S = new $(o, i.value, u, a), E.cameras.push(S);
26
+ x = new _(l, (e == null ? void 0 : e.value) || 1, t, c), T.cameras.push(x);
27
27
  } else {
28
- const { left: u, right: a, top: o, bottom: h, near: m, far: w } = s || {
28
+ const { left: t, right: c, top: l, bottom: a, near: s, far: p } = m || {
29
29
  left: -100,
30
30
  right: 100,
31
31
  top: 100,
@@ -33,306 +33,322 @@ function oe() {
33
33
  near: 0.1,
34
34
  far: 1e3
35
35
  };
36
- S = new ae(u, a, o, h, m, w), E.cameras.push(S);
36
+ x = new ce(t, c, l, a, s, p), T.cameras.push(x);
37
37
  }
38
- return E.cameras.push(S), S;
38
+ return T.cameras.push(x), x;
39
39
  }
40
- const i = N(() => e.value / n.value), l = N(() => E.cameras[0]);
41
- function f() {
42
- l.value instanceof $ && (l.value.aspect = i.value), l.value.updateProjectionMatrix();
40
+ const o = se(() => T.cameras[0]);
41
+ function i() {
42
+ o.value instanceof _ && e && (o.value.aspect = e.value), o.value.updateProjectionMatrix();
43
43
  }
44
- function g(t) {
45
- const s = L("camera");
46
- t && s && (s.value = t, r("camera", s.value)), E.cameras.push(t), t instanceof $ && (t.aspect = i.value), t.updateProjectionMatrix();
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();
47
47
  }
48
- return O(i, f), {
49
- activeCamera: l,
50
- createCamera: c,
51
- updateCamera: f,
52
- pushCamera: g
48
+ return e && $(e, i), {
49
+ activeCamera: o,
50
+ createCamera: n,
51
+ updateCamera: i,
52
+ pushCamera: f
53
53
  };
54
54
  }
55
- const ee = "[TresJS ▲ ■ ●] ";
56
- function _() {
57
- function e(c, i) {
58
- console.error(`${ee} ${c}`, i || "");
55
+ const oe = "[TresJS ▲ ■ ●] ";
56
+ function U() {
57
+ function e(o, i) {
58
+ console.error(`${oe} ${o}`, i || "");
59
59
  }
60
- function n(c) {
61
- console.warn(`${ee} ${c}`);
60
+ function r(o) {
61
+ console.warn(`${oe} ${o}`);
62
62
  }
63
- function r(c, i) {
63
+ function n(o, i) {
64
64
  }
65
65
  return {
66
66
  logError: e,
67
- logWarning: n,
68
- logMessage: r
67
+ logWarning: r,
68
+ logMessage: n
69
69
  };
70
70
  }
71
- const R = b({ ...X, uuid: X.MathUtils.generateUUID() });
72
- delete R.value.Scene;
73
- let P;
74
- function se(e, n = "Tres") {
75
- const { logMessage: r, logError: c } = _();
76
- !P && e && (P = e);
77
- const { createComponentInstances: i } = ie(n);
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);
78
78
  return {
79
- extend: (f) => {
80
- if (!f) {
81
- c("No objects provided to extend catalogue");
79
+ extend: (u) => {
80
+ if (!u) {
81
+ o("No objects provided to extend catalogue");
82
82
  return;
83
83
  }
84
- R.value = Object.assign(R.value, f);
85
- const g = i(b(f));
86
- r("Adding objects to catalogue", { objects: f, catalogue: R.value.uuid }), P && g.forEach(([t, s]) => {
87
- P._context.components[t] || P.component(t, s);
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);
88
88
  });
89
89
  },
90
- catalogue: R
90
+ catalogue: A
91
91
  };
92
92
  }
93
- const T = (e) => typeof e < "u", _e = (e) => typeof e == "function", I = (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 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;
96
96
  }
97
- function Fe(e) {
98
- return e instanceof j ? e : Array.isArray(e) ? new j(...e) : new j(e);
97
+ function Ue(e) {
98
+ return e instanceof V ? e : Array.isArray(e) ? new V(...e) : new V(e);
99
99
  }
100
- const ze = ["rotation", "scale", "position"];
101
- function ie(e) {
102
- const { logMessage: n, logError: r } = _();
103
- function c(t, s) {
104
- T(t) && T(s) && Object.entries(t).forEach(([u, a]) => {
105
- const o = u.replace(/(-\w)/g, (h) => h[1].toUpperCase());
106
- s.setAttribute(o, new Te(...a));
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));
107
107
  });
108
108
  }
109
- function i(t, s) {
110
- T(t) && T(s) && Object.entries(t).forEach(([u, a]) => {
111
- const o = u.replace(/(-\w)/g, (h) => h[1].toUpperCase());
112
- if (!(o === "args" || a === void 0)) {
113
- ze.includes(o) && a && (a = De(a)), t.ref && (t.ref = s);
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);
114
114
  try {
115
- if (s[o] && T(s[o].set))
116
- s[o].set(...I(a) ? a : [a]);
115
+ if (c[s] && R(c[s].set))
116
+ c[s].set(...z(a) ? a : [a]);
117
117
  else {
118
- if (a === "" && (a = !0), _e(s[o])) {
119
- if (u === "center" && !a)
118
+ if (a === "" && (a = !0), Fe(c[s])) {
119
+ if (l === "center" && !a)
120
120
  return;
121
- s[o](...I(a) ? a : [a]);
121
+ c[s](...z(a) ? a : [a]);
122
122
  return;
123
123
  }
124
- s[o] = a;
124
+ c[s] = a;
125
125
  }
126
- } catch (h) {
127
- r(`There was an error setting ${o} property`, h);
126
+ } catch (p) {
127
+ n(`There was an error setting ${s} property`, p);
128
128
  }
129
129
  }
130
130
  });
131
131
  }
132
- function l(t) {
133
- var a;
134
- const s = /^Symbol\(Fragment\)$/g, u = /^Symbol\(Text\)$/g;
135
- if (s.test(t.type.toString()))
136
- return t.children.map((o) => l(o));
137
- if (u.test(t.type.toString()))
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()))
138
138
  return;
139
139
  {
140
- const o = t.type.name.replace(e, ""), { catalogue: h } = se(), m = L("catalogue") || h;
141
- let w;
142
- return m && ((a = t == null ? void 0 : t.props) != null && a.args ? m != null && m.value[o] ? w = new m.value[o](...t.props.args) : r(`There is no ${o} in the catalogue`, m == null ? void 0 : m.value.uuid) : w = new m.value[o]()), t != null && t.props && (o === "BufferGeometry" ? c(t.props, w) : i(t.props, w)), w;
140
+ const p = t.type.name.replace(e, ""), { catalogue: C } = fe(), h = M("catalogue") || C;
141
+ let v;
142
+ if (h)
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));
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;
143
149
  }
144
150
  }
145
- function f(t, s, u) {
146
- if (u.default && (u != null && u.default())) {
147
- const a = u.default().map((o) => l(o));
148
- return new t(...a.flat().filter(Boolean));
151
+ function u(t, c, l) {
152
+ if (l.default && (l != null && l.default())) {
153
+ const a = l.default().map((s) => f(s));
154
+ if (t.name === "Group") {
155
+ const s = new t();
156
+ return a.forEach((p) => {
157
+ s.add(p);
158
+ }), s;
159
+ } else
160
+ return new t(...a.flat().filter(Boolean));
149
161
  } else
150
- return s.args ? new t(...s.args) : new t();
162
+ return c.args ? new t(...c.args) : new t();
151
163
  }
152
- function g(t) {
153
- return Object.entries(t.value).filter(([s, u]) => {
154
- var a, o;
155
- return (o = (a = u == null ? void 0 : u.prototype) == null ? void 0 : a.constructor) == null ? void 0 : o.toString().includes("class");
156
- }).map(([s, u]) => {
157
- const a = `${e}${s}`, o = k({
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({
158
170
  name: a,
159
- setup(h, { slots: m, attrs: w, ...M }) {
160
- const { scene: D } = pe(), v = L("local-scene") || D, x = L("catalogue"), { pushCamera: C } = oe();
161
- let y = f(u, w, m);
162
- return i(w, y), (y instanceof $ || y instanceof ae) && C(y), y.isObject3D && (v == null || v.value.add(y)), v != null && v.value && y.isFog && (v.value.fog = y), M.expose(y), n(a, {
163
- sceneuuid: v == null ? void 0 : v.value.uuid,
164
- catalogue: x == null ? void 0 : x.value.uuid,
165
- props: h,
166
- slots: m.default ? m.default() : void 0,
167
- attrs: w,
168
- ctx: M,
169
- scene: v
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
170
182
  }), () => {
171
183
  };
172
184
  }
173
185
  });
174
- return [a, o];
186
+ return [a, s];
175
187
  });
176
188
  }
177
189
  return {
178
- createComponentInstances: g,
190
+ createComponentInstances: m,
179
191
  processProps: i,
180
- createInstanceFromVNode: l
192
+ createInstanceFromVNode: f
181
193
  };
182
194
  }
183
- const ce = G(), ue = G(), le = G(), te = new Re(), { pause: Ue, resume: je, isActive: Ve } = Me(
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(
184
198
  () => {
185
- const e = te.getElapsedTime(), n = te.getDelta();
186
- ce.trigger({ delta: n, elapsed: e }), ue.trigger({ delta: n, elapsed: e }), le.trigger({ delta: n, elapsed: e });
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 });
187
200
  },
188
201
  { immediate: !1 }
189
202
  );
190
- function fe() {
203
+ H.on(() => {
204
+ D = b.getDelta(), F = b.getElapsedTime();
205
+ });
206
+ function ge() {
191
207
  return {
192
- onBeforeLoop: ce.on,
193
- onLoop: ue.on,
194
- onAfterLoop: le.on,
195
- pause: Ue,
208
+ onBeforeLoop: me.on,
209
+ onLoop: de.on,
210
+ onAfterLoop: H.on,
211
+ pause: Ve,
196
212
  resume: je,
197
- isActive: Ve
213
+ isActive: Ne
198
214
  };
199
215
  }
200
- const Ne = W(new Le());
201
- function pe() {
216
+ const We = W(new be());
217
+ function he() {
202
218
  return {
203
- scene: Ne
219
+ scene: We
204
220
  };
205
221
  }
206
- function ke(e) {
207
- const n = { nodes: {}, materials: {} };
208
- return e && e.traverse((r) => {
209
- r.name && (n.nodes[r.name] = r), r.material && !n.materials[r.material.name] && (n.materials[r.material.name] = r.material);
210
- }), n;
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;
211
227
  }
212
- async function Xe(e, n, r, c, i) {
213
- const { logError: l } = _(), f = new e();
214
- i && i(f), r && r(f);
215
- const t = (Array.isArray(n) ? n : [n]).map(
216
- (s) => new Promise((u, a) => {
217
- f.load(
218
- s,
219
- (o) => {
220
- o.scene && Object.assign(o, ke(o.scene)), u(o);
221
- },
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(
222
234
  c,
223
- (o) => a(l("[useLoader] - Failed to load resource", o))
235
+ (s) => {
236
+ s.scene && Object.assign(s, Ge(s.scene)), l(s);
237
+ },
238
+ o,
239
+ (s) => a(f("[useLoader] - Failed to load resource", s))
224
240
  );
225
241
  })
226
242
  );
227
- return I(n) ? await Promise.all(t) : await t[0];
243
+ return z(r) ? await Promise.all(t) : await t[0];
228
244
  }
229
- async function Ye(e) {
230
- const n = new be(), r = new Ae(n), c = (i) => new Promise((l, f) => {
231
- r.load(
245
+ async function et(e) {
246
+ const r = new Be(), n = new Oe(r), o = (i) => new Promise((f, u) => {
247
+ n.load(
232
248
  i,
233
- (g) => l(g),
249
+ (m) => f(m),
234
250
  () => null,
235
251
  () => {
236
- f(new Error("[useTextures] - Failed to load texture"));
252
+ u(new Error("[useTextures] - Failed to load texture"));
237
253
  }
238
254
  );
239
255
  });
240
- if (I(e)) {
241
- const i = await Promise.all(e.map((l) => c(l)));
256
+ if (z(e)) {
257
+ const i = await Promise.all(e.map((f) => o(f)));
242
258
  return e.length > 1 ? i : i[0];
243
259
  } else {
244
- const { map: i, displacementMap: l, normalMap: f, roughnessMap: g, metalnessMap: t, aoMap: s } = e;
260
+ const { map: i, displacementMap: f, normalMap: u, roughnessMap: m, metalnessMap: t, aoMap: c } = e;
245
261
  return {
246
- map: i ? await c(i) : null,
247
- displacementMap: l ? await c(l) : null,
248
- normalMap: f ? await c(f) : null,
249
- roughnessMap: g ? await c(g) : null,
250
- metalnessMap: t ? await c(t) : null,
251
- aoMap: s ? await c(s) : null
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
252
268
  };
253
269
  }
254
270
  }
255
- const A = Ce({});
256
- function me() {
257
- function e(r) {
258
- return A[r];
271
+ const O = xe({});
272
+ function we() {
273
+ function e(n) {
274
+ return O[n];
259
275
  }
260
- function n(r, c) {
261
- A[r] = c;
276
+ function r(n, o) {
277
+ O[n] = o;
262
278
  }
263
279
  return {
264
- state: A,
265
- ...ne(A),
280
+ state: O,
281
+ ...ie(O),
266
282
  getState: e,
267
- setState: n
283
+ setState: r
268
284
  };
269
285
  }
270
- const d = W(), V = b(!1);
271
- function We(e, n, r) {
286
+ const g = W(), j = B(!1);
287
+ function He(e, r, n) {
272
288
  const {
273
- alpha: c = !0,
289
+ alpha: o = !0,
274
290
  antialias: i = !0,
275
- depth: l,
276
- logarithmicDepthBuffer: f,
277
- failIfMajorPerformanceCaveat: g,
291
+ depth: f,
292
+ logarithmicDepthBuffer: u,
293
+ failIfMajorPerformanceCaveat: m,
278
294
  precision: t,
279
- premultipliedAlpha: s,
280
- stencil: u,
295
+ premultipliedAlpha: c,
296
+ stencil: l,
281
297
  shadows: a = !1,
282
- shadowMapType: o = Oe,
283
- physicallyCorrectLights: h = !1,
284
- outputEncoding: m = Y,
285
- toneMapping: w = Z,
286
- toneMappingExposure: M = 1,
287
- context: D = void 0,
288
- powerPreference: v = "default",
289
- preserveDrawingBuffer: x = !1,
290
- clearColor: C,
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,
291
307
  windowSize: y = !1
292
- } = ne(r), { width: F, height: z } = p(y) ? re() : xe(n), { pixelRatio: H } = Ee(), { pause: de, resume: ge } = fe(), he = N(() => F.value / z.value), K = () => {
293
- d.value && (d.value.setSize(F.value, z.value), d.value.setPixelRatio(Math.min(H.value, 2)));
294
- }, J = () => {
295
- d.value && (d.value.shadowMap.enabled = p(a), d.value.shadowMap.type = p(o), d.value.toneMapping = p(w) || Z, d.value.toneMappingExposure = p(M), d.value.outputEncoding = p(m) || Y, C != null && C.value && d.value.setClearColor(Fe(p(C))), d.value.physicallyCorrectLights = p(h));
296
- }, we = () => {
297
- const q = U(e);
298
- if (d.value || !q)
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)
299
315
  return;
300
- d.value = new Be({
301
- canvas: q,
302
- alpha: p(c),
303
- antialias: p(i),
304
- context: p(D),
305
- depth: p(l),
306
- failIfMajorPerformanceCaveat: p(g),
307
- logarithmicDepthBuffer: p(f),
308
- powerPreference: p(v),
309
- precision: p(t),
310
- stencil: p(u),
311
- preserveDrawingBuffer: p(x),
312
- premultipliedAlpha: p(s)
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)
313
329
  });
314
- const { setState: ye } = me();
315
- ye("renderer", d.value), J(), K(), ge(), V.value = !0;
316
- }, ve = () => {
317
- d.value && (d.value.dispose(), d.value = void 0, V.value = !1, de());
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());
318
334
  };
319
- return O([F, z, H], K), O(
320
- [a, o, m, h, w, M, C],
321
- J
322
- ), O(
323
- () => [e, n],
335
+ return $([Q, q], X), $(
336
+ [a, s, C, p, h, v, S],
337
+ Y
338
+ ), $(
339
+ () => [e, r],
324
340
  () => {
325
- U(e) && U(n) && we();
341
+ k(e) && k(r) && Ce();
326
342
  },
327
343
  { immediate: !0, deep: !0 }
328
344
  ), {
329
- renderer: d,
330
- isReady: V,
331
- dispose: ve,
332
- aspectRatio: he
345
+ renderer: g,
346
+ isReady: j,
347
+ dispose: Se,
348
+ aspectRatio: Q
333
349
  };
334
350
  }
335
- const Ge = k({
351
+ const Ke = N({
336
352
  name: "TresCanvas",
337
353
  props: {
338
354
  shadows: Boolean,
@@ -345,74 +361,82 @@ const Ge = k({
345
361
  powerPreference: Object,
346
362
  preserveDrawingBuffer: Boolean,
347
363
  clearColor: String,
348
- windowSize: Boolean
364
+ windowSize: { type: Boolean, default: !1 }
349
365
  },
350
- setup(e, { slots: n, attrs: r }) {
351
- const { logError: c } = _(), i = b(), l = b(), { renderer: f, dispose: g, aspectRatio: t } = We(i, l, e), s = W();
352
- return B("camera", s), B("renderer", f), B("aspect-ratio", t), n.default && !n.default().some((u) => u.type.name === "Scene") && c("TresCanvas must contain a Scene component."), n.default && !n.default().some((u) => {
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) => {
353
371
  var a;
354
- return (a = u.type.name) == null ? void 0 : a.includes("Camera");
355
- }) && c("Scene must contain a Camera component."), Se(() => g()), () => {
356
- if (n.default)
357
- return Q(
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(
358
376
  "div",
359
377
  {
360
- ref: l,
378
+ ref: f,
361
379
  style: {
362
380
  position: "relative",
363
381
  width: "100%",
364
382
  height: "100vh",
365
- ...r.style
383
+ ...n.style
366
384
  }
367
385
  },
368
386
  [
369
- Q("canvas", {
387
+ te("canvas", {
370
388
  ref: i,
371
- style: { width: "100%", height: "100%", position: "absolute", top: 0, left: 0 }
389
+ style: {
390
+ width: "100%",
391
+ height: "100%",
392
+ position: e.windowSize ? "fixed" : "absolute",
393
+ top: 0,
394
+ left: 0
395
+ }
372
396
  }),
373
- n.default()
397
+ r.default()
374
398
  ]
375
399
  );
376
400
  };
377
401
  }
378
- }), He = k({
402
+ }), Je = N({
379
403
  name: "Scene",
380
- setup(e, { slots: n }) {
381
- const { scene: r } = pe(), c = L("renderer"), { activeCamera: i } = oe(), { onLoop: l } = fe();
382
- return B("local-scene", r), l(() => {
383
- c != null && c.value && (i != null && i.value) && (r != null && r.value) && c.value.render(r == null ? void 0 : r.value, i.value);
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);
384
408
  }), () => {
385
- if (n.default)
386
- return n.default();
409
+ if (r.default)
410
+ return r.default();
387
411
  };
388
412
  }
389
- }), Ze = Symbol("UseTresState"), Ke = "1.4.0", et = {
390
- install(e, n) {
391
- const r = (n == null ? void 0 : n.prefix) || "Tres";
392
- e.component(`${r}Canvas`, Ge), e.component(`${r}Scene`, He);
393
- const { catalogue: c, extend: i } = se(e, r);
394
- e.provide("catalogue", c), e.provide("extend", i);
395
- const { createComponentInstances: l } = ie(r);
396
- l(c).forEach(([g, t]) => {
397
- e.component(g, t);
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);
398
422
  }), window.__TRES__ = {
399
423
  app: e,
400
- version: Ke
424
+ version: qe
401
425
  };
402
426
  }
403
427
  };
404
428
  export {
405
- $e as CameraType,
406
- Ze as UseTresStateSymbol,
407
- et as default,
408
- ke as trasverseObjects,
409
- oe as useCamera,
410
- se as useCatalogue,
411
- ie as useInstanceCreator,
412
- Xe as useLoader,
413
- fe as useRenderLoop,
414
- We as useRenderer,
415
- pe as useScene,
416
- Ye as useTexture,
417
- me as useTres
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
418
442
  };
package/dist/tres.umd.cjs CHANGED
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * name: @tresjs/core
3
- * version: v1.4.0
4
- * (c) 2022
3
+ * version: v1.5.1
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(g,i){typeof exports=="object"&&typeof module<"u"?i(exports,require("vue"),require("@vueuse/core"),require("three")):typeof define=="function"&&define.amd?define(["exports","vue","@vueuse/core","three"],i):(g=typeof globalThis<"u"?globalThis:g||self,i(g.tres={},g.Vue,g.VueUseCore,g.Three))})(this,function(g,i,l,m){"use strict";function re(e){const n=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const r in e)if(r!=="default"){const s=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(n,r,s.get?s:{enumerable:!0,get:()=>e[r]})}}return n.default=e,Object.freeze(n)}const q=re(m);var G=(e=>(e.Perspective="Perspective",e.Orthographic="Orthographic",e))(G||{});const b={cameras:[]},ae=45;let U;function D(){const{width:e,height:n}=l.useWindowSize(),{setState:r}=V();function s(t="Perspective",c){if(t==="Perspective"){const{near:f,far:a,fov:o}=c||{near:.1,far:1e3,fov:ae};U=new m.PerspectiveCamera(o,u.value,f,a),b.cameras.push(U)}else{const{left:f,right:a,top:o,bottom:C,near:w,far:y}=c||{left:-100,right:100,top:100,bottom:-100,near:.1,far:1e3};U=new m.OrthographicCamera(f,a,o,C,w,y),b.cameras.push(U)}return b.cameras.push(U),U}const u=i.computed(()=>e.value/n.value),p=i.computed(()=>b.cameras[0]);function d(){p.value instanceof m.PerspectiveCamera&&(p.value.aspect=u.value),p.value.updateProjectionMatrix()}function v(t){const c=i.inject("camera");t&&c&&(c.value=t,r("camera",c.value)),b.cameras.push(t),t instanceof m.PerspectiveCamera&&(t.aspect=u.value),t.updateProjectionMatrix()}return i.watch(u,d),{activeCamera:p,createCamera:s,updateCamera:d,pushCamera:v}}const K="[TresJS ▲ ■ ●] ";function _(){function e(s,u){console.error(`${K} ${s}`,u||"")}function n(s){console.warn(`${K} ${s}`)}function r(s,u){}return{logError:e,logWarning:n,logMessage:r}}const O=i.ref({...q,uuid:q.MathUtils.generateUUID()});delete O.value.Scene;let L;function T(e,n="Tres"){const{logMessage:r,logError:s}=_();!L&&e&&(L=e);const{createComponentInstances:u}=$(n);return{extend:d=>{if(!d){s("No objects provided to extend catalogue");return}O.value=Object.assign(O.value,d);const v=u(i.ref(d));r("Adding objects to catalogue",{objects:d,catalogue:O.value.uuid}),L&&v.forEach(([t,c])=>{L._context.components[t]||L.component(t,c)})},catalogue:O}}const x=e=>typeof e<"u",oe=e=>typeof e=="function",B=e=>!!e&&e.constructor===Array;function se(e){return typeof e=="number"?[e,e,e]:e instanceof m.Vector3?[e.x,e.y,e.z]:e}function ie(e){return e instanceof m.Color?e:Array.isArray(e)?new m.Color(...e):new m.Color(e)}const ce=["rotation","scale","position"];function $(e){const{logMessage:n,logError:r}=_();function s(t,c){x(t)&&x(c)&&Object.entries(t).forEach(([f,a])=>{const o=f.replace(/(-\w)/g,C=>C[1].toUpperCase());c.setAttribute(o,new m.BufferAttribute(...a))})}function u(t,c){x(t)&&x(c)&&Object.entries(t).forEach(([f,a])=>{const o=f.replace(/(-\w)/g,C=>C[1].toUpperCase());if(!(o==="args"||a===void 0)){ce.includes(o)&&a&&(a=se(a)),t.ref&&(t.ref=c);try{if(c[o]&&x(c[o].set))c[o].set(...B(a)?a:[a]);else{if(a===""&&(a=!0),oe(c[o])){if(f==="center"&&!a)return;c[o](...B(a)?a:[a]);return}c[o]=a}}catch(C){r(`There was an error setting ${o} property`,C)}}})}function p(t){var a;const c=/^Symbol\(Fragment\)$/g,f=/^Symbol\(Text\)$/g;if(c.test(t.type.toString()))return t.children.map(o=>p(o));if(f.test(t.type.toString()))return;{const o=t.type.name.replace(e,""),{catalogue:C}=T(),w=i.inject("catalogue")||C;let y;return w&&((a=t==null?void 0:t.props)!=null&&a.args?w!=null&&w.value[o]?y=new w.value[o](...t.props.args):r(`There is no ${o} in the catalogue`,w==null?void 0:w.value.uuid):y=new w.value[o]),t!=null&&t.props&&(o==="BufferGeometry"?s(t.props,y):u(t.props,y)),y}}function d(t,c,f){if(f.default&&(f!=null&&f.default())){const a=f.default().map(o=>p(o));return new t(...a.flat().filter(Boolean))}else return c.args?new t(...c.args):new t}function v(t){return Object.entries(t.value).filter(([c,f])=>{var a,o;return(o=(a=f==null?void 0:f.prototype)==null?void 0:a.constructor)==null?void 0:o.toString().includes("class")}).map(([c,f])=>{const a=`${e}${c}`,o=i.defineComponent({name:a,setup(C,{slots:w,attrs:y,...j}){const{scene:N}=F(),S=i.inject("local-scene")||N,A=i.inject("catalogue"),{pushCamera:P}=D();let M=d(f,y,w);return u(y,M),(M instanceof m.PerspectiveCamera||M instanceof m.OrthographicCamera)&&P(M),M.isObject3D&&(S==null||S.value.add(M)),S!=null&&S.value&&M.isFog&&(S.value.fog=M),j.expose(M),n(a,{sceneuuid:S==null?void 0:S.value.uuid,catalogue:A==null?void 0:A.value.uuid,props:C,slots:w.default?w.default():void 0,attrs:y,ctx:j,scene:S}),()=>{}}});return[a,o]})}return{createComponentInstances:v,processProps:u,createInstanceFromVNode:p}}const J=l.createEventHook(),Q=l.createEventHook(),X=l.createEventHook(),Y=new m.Clock,{pause:ue,resume:le,isActive:fe}=l.useRafFn(()=>{const e=Y.getElapsedTime(),n=Y.getDelta();J.trigger({delta:n,elapsed:e}),Q.trigger({delta:n,elapsed:e}),X.trigger({delta:n,elapsed:e})},{immediate:!1});function z(){return{onBeforeLoop:J.on,onLoop:Q.on,onAfterLoop:X.on,pause:ue,resume:le,isActive:fe}}const pe=i.shallowRef(new m.Scene);function F(){return{scene:pe}}function Z(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 de(e,n,r,s,u){const{logError:p}=_(),d=new e;u&&u(d),r&&r(d);const t=(Array.isArray(n)?n:[n]).map(c=>new Promise((f,a)=>{d.load(c,o=>{o.scene&&Object.assign(o,Z(o.scene)),f(o)},s,o=>a(p("[useLoader] - Failed to load resource",o)))}));return B(n)?await Promise.all(t):await t[0]}async function me(e){const n=new m.LoadingManager,r=new m.TextureLoader(n),s=u=>new Promise((p,d)=>{r.load(u,v=>p(v),()=>null,()=>{d(new Error("[useTextures] - Failed to load texture"))})});if(B(e)){const u=await Promise.all(e.map(p=>s(p)));return e.length>1?u:u[0]}else{const{map:u,displacementMap:p,normalMap:d,roughnessMap:v,metalnessMap:t,aoMap:c}=e;return{map:u?await s(u):null,displacementMap:p?await s(p):null,normalMap:d?await s(d):null,roughnessMap:v?await s(v):null,metalnessMap:t?await s(t):null,aoMap:c?await s(c):null}}}const I=i.reactive({});function V(){function e(r){return I[r]}function n(r,s){I[r]=s}return{state:I,...i.toRefs(I),getState:e,setState:n}}const h=i.shallowRef(),k=i.ref(!1);function E(e,n,r){const{alpha:s=!0,antialias:u=!0,depth:p,logarithmicDepthBuffer:d,failIfMajorPerformanceCaveat:v,precision:t,premultipliedAlpha:c,stencil:f,shadows:a=!1,shadowMapType:o=m.PCFShadowMap,physicallyCorrectLights:C=!1,outputEncoding:w=m.LinearEncoding,toneMapping:y=m.NoToneMapping,toneMappingExposure:j=1,context:N=void 0,powerPreference:S="default",preserveDrawingBuffer:A=!1,clearColor:P,windowSize:M=!1}=i.toRefs(r),{width:R,height:W}=l.resolveUnref(M)?l.useWindowSize():l.useElementSize(n),{pixelRatio:H}=l.useDevicePixelRatio(),{pause:ye,resume:Se}=z(),Me=i.computed(()=>R.value/W.value),ee=()=>{h.value&&(h.value.setSize(R.value,W.value),h.value.setPixelRatio(Math.min(H.value,2)))},te=()=>{h.value&&(h.value.shadowMap.enabled=l.resolveUnref(a),h.value.shadowMap.type=l.resolveUnref(o),h.value.toneMapping=l.resolveUnref(y)||m.NoToneMapping,h.value.toneMappingExposure=l.resolveUnref(j),h.value.outputEncoding=l.resolveUnref(w)||m.LinearEncoding,P!=null&&P.value&&h.value.setClearColor(ie(l.resolveUnref(P))),h.value.physicallyCorrectLights=l.resolveUnref(C))},Pe=()=>{const ne=l.unrefElement(e);if(h.value||!ne)return;h.value=new m.WebGLRenderer({canvas:ne,alpha:l.resolveUnref(s),antialias:l.resolveUnref(u),context:l.resolveUnref(N),depth:l.resolveUnref(p),failIfMajorPerformanceCaveat:l.resolveUnref(v),logarithmicDepthBuffer:l.resolveUnref(d),powerPreference:l.resolveUnref(S),precision:l.resolveUnref(t),stencil:l.resolveUnref(f),preserveDrawingBuffer:l.resolveUnref(A),premultipliedAlpha:l.resolveUnref(c)});const{setState:be}=V();be("renderer",h.value),te(),ee(),Se(),k.value=!0},Ue=()=>{h.value&&(h.value.dispose(),h.value=void 0,k.value=!1,ye())};return i.watch([R,W,H],ee),i.watch([a,o,w,C,y,j,P],te),i.watch(()=>[e,n],()=>{l.unrefElement(e)&&l.unrefElement(n)&&Pe()},{immediate:!0,deep:!0}),{renderer:h,isReady:k,dispose:Ue,aspectRatio:Me}}const ge=i.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:Boolean},setup(e,{slots:n,attrs:r}){const{logError:s}=_(),u=i.ref(),p=i.ref(),{renderer:d,dispose:v,aspectRatio:t}=E(u,p,e),c=i.shallowRef();return i.provide("camera",c),i.provide("renderer",d),i.provide("aspect-ratio",t),n.default&&!n.default().some(f=>f.type.name==="Scene")&&s("TresCanvas must contain a Scene component."),n.default&&!n.default().some(f=>{var a;return(a=f.type.name)==null?void 0:a.includes("Camera")})&&s("Scene must contain a Camera component."),i.onBeforeUnmount(()=>v()),()=>{if(n.default)return i.h("div",{ref:p,style:{position:"relative",width:"100%",height:"100vh",...r.style}},[i.h("canvas",{ref:u,style:{width:"100%",height:"100%",position:"absolute",top:0,left:0}}),n.default()])}}}),he=i.defineComponent({name:"Scene",setup(e,{slots:n}){const{scene:r}=F(),s=i.inject("renderer"),{activeCamera:u}=D(),{onLoop:p}=z();return i.provide("local-scene",r),p(()=>{s!=null&&s.value&&(u!=null&&u.value)&&(r!=null&&r.value)&&s.value.render(r==null?void 0:r.value,u.value)}),()=>{if(n.default)return n.default()}}}),we=Symbol("UseTresState"),ve="1.4.0",Ce={install(e,n){const r=(n==null?void 0:n.prefix)||"Tres";e.component(`${r}Canvas`,ge),e.component(`${r}Scene`,he);const{catalogue:s,extend:u}=T(e,r);e.provide("catalogue",s),e.provide("extend",u);const{createComponentInstances:p}=$(r);p(s).forEach(([v,t])=>{e.component(v,t)}),window.__TRES__={app:e,version:ve}}};g.CameraType=G,g.UseTresStateSymbol=we,g.default=Ce,g.trasverseObjects=Z,g.useCamera=D,g.useCatalogue=T,g.useInstanceCreator=$,g.useLoader=de,g.useRenderLoop=z,g.useRenderer=E,g.useScene=F,g.useTexture=me,g.useTres=V,Object.defineProperties(g,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
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"}})});
@@ -9,7 +9,7 @@ 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[]
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.4.0",
4
+ "version": "1.5.1",
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.2.2",
43
- "@types/three": "^0.146.0",
41
+ "@tresjs/cientos": "^1.5.0",
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
  }