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