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