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