@tresjs/core 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  export declare const isProd: boolean;
2
2
  interface LoggerComposition {
3
- logError: (message: string, error: Error) => void;
3
+ logError: (message: string, error?: Error | ErrorEvent) => void;
4
4
  logWarning: (message: string) => void;
5
5
  logMessage: (name: string, value: any) => void;
6
6
  }
@@ -1,9 +1,9 @@
1
- export * from './useCamera/useCamera';
2
- export * from './useCatalog/useCatalog';
3
- export * from './useInstanceCreator/useInstanceCreator';
4
- export * from './useLoop/useLoop';
5
- export * from './useRenderer/useRenderer';
6
- export * from './useScene/useScene';
7
- export * from './useLoader/useLoader';
8
- export * from './useTexture/useTexture';
1
+ export * from './useCamera';
2
+ export * from './useCatalog';
3
+ export * from './useInstanceCreator';
4
+ export * from './useRenderLoop/';
5
+ export * from './useRenderer/';
6
+ export * from './useScene/';
7
+ export * from './useLoader';
8
+ export * from './useTexture';
9
9
  export * from './useTres';
@@ -0,0 +1,15 @@
1
+ import { EventHookOn, Fn } from '@vueuse/core';
2
+ import { Ref } from 'vue';
3
+ export interface RenderLoop {
4
+ delta: number;
5
+ elapsed: number;
6
+ }
7
+ export interface UseRenderLoopReturn {
8
+ onBeforeLoop: EventHookOn<RenderLoop>;
9
+ onLoop: EventHookOn<RenderLoop>;
10
+ onAfterLoop: EventHookOn<RenderLoop>;
11
+ pause: Fn;
12
+ resume: Fn;
13
+ isActive: Ref<boolean>;
14
+ }
15
+ export declare function useRenderLoop(): UseRenderLoopReturn;
@@ -0,0 +1,37 @@
1
+ import { ShadowMapType, TextureEncoding, ToneMapping } from 'three';
2
+ import { PropType } from 'vue';
3
+ /**
4
+ * Vue component for rendering a Tres component.
5
+ */
6
+ export declare const TresCanvas: import("vue").DefineComponent<{
7
+ shadows: BooleanConstructor;
8
+ shadowMapType: PropType<ShadowMapType>;
9
+ physicallyCorrectLights: BooleanConstructor;
10
+ outputEncoding: PropType<TextureEncoding>;
11
+ toneMapping: PropType<ToneMapping>;
12
+ toneMappingExposure: NumberConstructor;
13
+ context: PropType<WebGLRenderingContext>;
14
+ powerPreference: PropType<"high-performance" | "low-power" | "default">;
15
+ preserveDrawingBuffer: BooleanConstructor;
16
+ clearColor: StringConstructor;
17
+ windowSize: BooleanConstructor;
18
+ }, () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
19
+ [key: string]: any;
20
+ }> | undefined, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<{
21
+ shadows: BooleanConstructor;
22
+ shadowMapType: PropType<ShadowMapType>;
23
+ physicallyCorrectLights: BooleanConstructor;
24
+ outputEncoding: PropType<TextureEncoding>;
25
+ toneMapping: PropType<ToneMapping>;
26
+ toneMappingExposure: NumberConstructor;
27
+ context: PropType<WebGLRenderingContext>;
28
+ powerPreference: PropType<"high-performance" | "low-power" | "default">;
29
+ preserveDrawingBuffer: BooleanConstructor;
30
+ clearColor: StringConstructor;
31
+ windowSize: BooleanConstructor;
32
+ }>>, {
33
+ shadows: boolean;
34
+ physicallyCorrectLights: boolean;
35
+ preserveDrawingBuffer: boolean;
36
+ windowSize: boolean;
37
+ }>;
@@ -0,0 +1,81 @@
1
+ import { MaybeComputedRef, MaybeElementRef } from '@vueuse/core';
2
+ import { WebGLRendererParameters, WebGLRenderer, ShadowMapType } from 'three';
3
+ import type { TextureEncoding, ToneMapping } from 'three';
4
+ export interface UseRendererOptions extends WebGLRendererParameters {
5
+ /**
6
+ * Enable shadows in the Renderer
7
+ *
8
+ * @default false
9
+ */
10
+ shadows?: MaybeComputedRef<boolean>;
11
+ /**
12
+ * Set the shadow map type
13
+ *
14
+ * @default PCFSoftShadowMap
15
+ */
16
+ shadowMapType?: MaybeComputedRef<ShadowMapType>;
17
+ /**
18
+ * Whether to use physically correct lighting mode.
19
+ * See the [lights / physical example](https://threejs.org/examples/#webgl_lights_physical).
20
+ *
21
+ * @default false
22
+ */
23
+ physicallyCorrectLights?: MaybeComputedRef<boolean>;
24
+ /**
25
+ * Defines the output encoding of the renderer.
26
+ *
27
+ * @default LinearEncoding
28
+ */
29
+ outputEncoding?: MaybeComputedRef<TextureEncoding>;
30
+ /**
31
+ * Defines the tone mapping used by the renderer.
32
+ *
33
+ * @default NoToneMapping
34
+ */
35
+ toneMapping?: MaybeComputedRef<ToneMapping>;
36
+ /**
37
+ * Defines the tone mapping exposure used by the renderer.
38
+ *
39
+ * @default 1
40
+ */
41
+ toneMappingExposure?: MaybeComputedRef<number>;
42
+ /**
43
+ * The context used by the renderer.
44
+ *
45
+ * @default undefined
46
+ */
47
+ context?: WebGLRenderingContext | undefined;
48
+ /**
49
+ * Provides a hint to the user agent indicating what configuration of GPU is suitable for this WebGL context.
50
+ * Can be "high-performance", "low-power" or "default".
51
+ *
52
+ * @default "default"
53
+ */
54
+ powerPreference?: 'high-performance' | 'low-power' | 'default';
55
+ /**
56
+ * Whether to preserve the buffers until manually cleared or overwritten.
57
+ *
58
+ * @default false
59
+ */
60
+ preserveDrawingBuffer?: boolean;
61
+ /**
62
+ * The color value to use when clearing the canvas.
63
+ *
64
+ * @default 0x000000
65
+ */
66
+ clearColor?: MaybeComputedRef<string | number>;
67
+ windowSize?: MaybeComputedRef<boolean>;
68
+ }
69
+ /**
70
+ * Reactive Three.js WebGLRenderer instance
71
+ *
72
+ * @param canvas
73
+ * @param options
74
+ */
75
+ export declare function useRenderer(canvas: MaybeElementRef, container: MaybeElementRef, options: UseRendererOptions): {
76
+ renderer: import("vue").ShallowRef<WebGLRenderer | undefined>;
77
+ isReady: import("vue").Ref<boolean>;
78
+ dispose: () => void;
79
+ aspectRatio: import("vue").ComputedRef<number>;
80
+ };
81
+ export declare type UseRendererReturn = ReturnType<typeof useRenderer>;
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Vue component for rendering a Tres component.
3
+ */
4
+ export declare const Scene: import("vue").DefineComponent<{}, () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
5
+ [key: string]: any;
6
+ }>[] | undefined, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<{}>>, {}>;
@@ -0,0 +1,4 @@
1
+ import { Scene } from 'three';
2
+ export declare function useScene(): {
3
+ scene: import("vue").ShallowRef<Scene>;
4
+ };
package/dist/index.d.ts CHANGED
@@ -1,6 +1,5 @@
1
1
  import { App } from 'vue';
2
2
  export * from './core';
3
- export * as TresCanvas from './components/TresCanvas.vue';
4
3
  export * from './keys';
5
4
  export interface TresPlugin {
6
5
  [key: string]: any;
package/dist/tres.js CHANGED
@@ -1,31 +1,31 @@
1
1
  /**
2
2
  * name: @tresjs/core
3
- * version: v0.3.0
3
+ * version: v0.4.0
4
4
  * (c) 2022
5
5
  * description: Declarative ThreeJS using Vue Components
6
6
  * author: Alvaro Saburido <hola@alvarosaburido.dev> (https://github.com/alvarosabu/)
7
7
  */
8
- import { computed as v, watch as F, ref as L, defineComponent as J, reactive as ee, toRefs as te, useSlots as re, useAttrs as ne, provide as ae, onMounted as oe, onBeforeUnmount as se, openBlock as _, createElementBlock as j, normalizeStyle as V, unref as U, createElementVNode as ce, createBlock as ie, Suspense as le, withCtx as ue, renderSlot as W, createCommentVNode as D, Fragment as fe } from "vue";
9
- import * as pe from "three";
10
- import { PerspectiveCamera as B, OrthographicCamera as de, Vector3 as me, Color as A, Scene as ge, Clock as he, LoadingManager as we, TextureLoader as ye, WebGLRenderer as Ce, PCFSoftShadowMap as Me, sRGBEncoding as Se } from "three";
11
- import { useWindowSize as K } from "@vueuse/core";
12
- var E = /* @__PURE__ */ ((e) => (e.Perspective = "Perspective", e.Orthographic = "Orthographic", e))(E || {});
13
- const R = {
8
+ import { computed as F, watch as R, inject as Q, defineComponent as _, shallowRef as $, ref as O, reactive as le, toRefs as fe, provide as T, onBeforeUnmount as me, h as G } from "vue";
9
+ import { useWindowSize as X, createEventHook as U, useRafFn as de, useElementSize as ge, useDevicePixelRatio as he, unrefElement as A, resolveUnref as v } from "@vueuse/core";
10
+ import * as we from "three";
11
+ import { PerspectiveCamera as I, OrthographicCamera as Ce, Color as z, Vector3 as ve, Clock as Me, Scene as Se, LoadingManager as Y, TextureLoader as ye, PCFShadowMap as xe, LinearEncoding as Ee, NoToneMapping as Pe, WebGLRenderer as Le } from "three";
12
+ var Re = /* @__PURE__ */ ((e) => (e.Perspective = "Perspective", e.Orthographic = "Orthographic", e))(Re || {});
13
+ const P = {
14
14
  cameras: []
15
- }, xe = 45;
16
- let x;
17
- function z() {
18
- const { width: e, height: t } = K();
19
- function u(o = "Perspective", a) {
20
- if (o === "Perspective") {
21
- const { near: p, far: g, fov: f } = a || {
15
+ }, Te = 45;
16
+ let y;
17
+ function Z() {
18
+ const { width: e, height: t } = X();
19
+ function a(s = "Perspective", i) {
20
+ if (s === "Perspective") {
21
+ const { near: l, far: d, fov: m } = i || {
22
22
  near: 0.1,
23
23
  far: 1e3,
24
- fov: xe
24
+ fov: Te
25
25
  };
26
- x = new B(f, r.value, p, g), R.cameras.push(x);
26
+ y = new I(m, r.value, l, d), P.cameras.push(y);
27
27
  } else {
28
- const { left: p, right: g, top: f, bottom: w, near: S, far: h } = a || {
28
+ const { left: l, right: d, top: m, bottom: h, near: M, far: S } = i || {
29
29
  left: -100,
30
30
  right: 100,
31
31
  top: 100,
@@ -33,328 +33,323 @@ function z() {
33
33
  near: 0.1,
34
34
  far: 1e3
35
35
  };
36
- x = new de(p, g, f, w, S, h), R.cameras.push(x);
36
+ y = new Ce(l, d, m, h, M, S), P.cameras.push(y);
37
37
  }
38
- return R.cameras.push(x), x;
38
+ return P.cameras.push(y), y;
39
39
  }
40
- const r = v(() => e.value / t.value), n = v(() => R.cameras[0]);
41
- function s() {
42
- n.value instanceof B && (n.value.aspect = r.value), n.value.updateProjectionMatrix();
40
+ const r = F(() => e.value / t.value), n = F(() => P.cameras[0]);
41
+ function o() {
42
+ n.value instanceof I && (n.value.aspect = r.value), n.value.updateProjectionMatrix();
43
43
  }
44
- function c(o) {
45
- R.cameras.push(o), o instanceof B && (o.aspect = r.value), o.updateProjectionMatrix();
44
+ function p(s) {
45
+ const i = Q("camera");
46
+ s && i && (i.value = s), P.cameras.push(s), s instanceof I && (s.aspect = r.value), s.updateProjectionMatrix();
46
47
  }
47
- return F(r, s), {
48
+ return R(r, o), {
48
49
  activeCamera: n,
49
- createCamera: u,
50
- updateCamera: s,
51
- pushCamera: c
50
+ createCamera: a,
51
+ updateCamera: o,
52
+ pushCamera: p
52
53
  };
53
54
  }
54
- let I = { ...pe };
55
- function Re() {
55
+ let b = { ...we };
56
+ delete b.Scene;
57
+ function be() {
56
58
  return {
57
59
  extend: (t) => {
58
- I = Object.assign(I, t);
60
+ b = Object.assign(b, t);
59
61
  },
60
- catalogue: I
62
+ catalogue: b
61
63
  };
62
64
  }
63
- const Pe = (e) => typeof e < "u", Q = (e) => !!e && e.constructor === Array;
64
- function X(e) {
65
- return typeof e == "number" ? [e, e, e] : e instanceof me ? [e.x, e.y, e.z] : e;
65
+ const Oe = (e) => typeof e < "u", k = (e) => !!e && e.constructor === Array;
66
+ function je(e) {
67
+ return typeof e == "number" ? [e, e, e] : e instanceof ve ? [e.x, e.y, e.z] : e;
66
68
  }
67
- function Ee(e) {
68
- return e instanceof A ? e : Array.isArray(e) ? new A(...e) : new A(e);
69
+ function J(e) {
70
+ return e instanceof z ? e : Array.isArray(e) ? new z(...e) : new z(e);
69
71
  }
70
72
  const q = "[TresJS \u25B2 \u25A0 \u25CF] ";
71
- function $() {
73
+ function ee() {
72
74
  function e(r, n) {
73
- console.error(`${q} ${r}`, n);
75
+ console.error(`${q} ${r}`, n || "");
74
76
  }
75
77
  function t(r) {
76
78
  console.warn(`${q} ${r}`);
77
79
  }
78
- function u(r, n) {
80
+ function a(r, n) {
79
81
  }
80
82
  return {
81
83
  logError: e,
82
84
  logWarning: t,
83
- logMessage: u
85
+ logMessage: a
84
86
  };
85
87
  }
86
- const P = new ge(), k = L(!1);
87
- function b() {
88
- const { logMessage: e } = $();
89
- function t() {
90
- P == null || P.clear(), k.value = !k.value, e("clear Scene", P);
91
- }
92
- return {
93
- isSceneReset: k,
94
- clearScene: t,
95
- scene: P
96
- };
97
- }
98
- const Te = ["rotation", "scale", "position"];
99
- function Le() {
100
- const { catalogue: e } = Re(), { logMessage: t, logError: u } = $();
88
+ const Be = ["rotation", "scale", "position"];
89
+ function Ae() {
90
+ const { catalogue: e } = be(), { logMessage: t, logError: a } = ee();
101
91
  function r() {
102
- return Object.entries(e).filter(([n, s]) => {
103
- var c, o;
104
- return (o = (c = s == null ? void 0 : s.prototype) == null ? void 0 : c.constructor) == null ? void 0 : o.toString().includes("class");
105
- }).map(([n, s]) => {
106
- const c = J({
92
+ return Object.entries(e).filter(([n, o]) => {
93
+ var p, s;
94
+ return (s = (p = o == null ? void 0 : o.prototype) == null ? void 0 : p.constructor) == null ? void 0 : s.toString().includes("class");
95
+ }).map(([n, o]) => {
96
+ const p = _({
107
97
  name: n,
108
- setup(o, { slots: a, attrs: p, ...g }) {
98
+ setup(s, { slots: i, attrs: l, ...d }) {
109
99
  t(n, {
110
- props: o,
111
- slots: a,
112
- attrs: p,
113
- ctx: g
100
+ props: s,
101
+ slots: i,
102
+ attrs: l,
103
+ ctx: d
114
104
  });
115
- let f;
116
- const { scene: w } = b(), { pushCamera: S } = z();
117
- function h() {
118
- if ((a == null ? void 0 : a.default) && (a == null ? void 0 : a.default())) {
119
- const M = a.default().map((i) => {
120
- var m;
121
- let y;
122
- return (m = i == null ? void 0 : i.props) != null && m.args ? y = new e[i.type.name](...i.props.args) : y = new e[i.type.name](), i != null && i.props && d(i.props, y), y;
105
+ let m;
106
+ const { scene: h } = oe(), { pushCamera: M } = Z();
107
+ function S() {
108
+ if ((i == null ? void 0 : i.default) && (i == null ? void 0 : i.default())) {
109
+ const C = i.default().map((c) => {
110
+ var f;
111
+ let w;
112
+ return (f = c == null ? void 0 : c.props) != null && f.args ? w = new e[c.type.name](...c.props.args) : w = new e[c.type.name](), c != null && c.props && x(c.props, w), w;
123
113
  });
124
- f = new s(...M);
114
+ m = new o(...C);
125
115
  } else
126
- p.args ? f = new s(...p.args) : f = new s();
127
- d(p, f), n === "PerspectiveCamera" || n === "OrtographicCamera" ? S(f) : w == null || w.add(f), t("Instance added", w), g.expose(f);
116
+ l.args ? m = new o(...l.args) : m = new o();
117
+ x(l, m), n === "PerspectiveCamera" || n === "OrtographicCamera" ? M(m) : h == null || h.value.add(m), t("Instance added", h), d.expose(m);
128
118
  }
129
- function d(M, i) {
130
- Object.entries(M).forEach(([y, m]) => {
131
- const C = y.replace(/(-\w)/g, (O) => O[1].toUpperCase());
132
- if (!(C === "args" || m === void 0)) {
133
- Te.includes(y) && m && (m = X(m));
119
+ function x(C, c) {
120
+ Object.entries(C).forEach(([w, f]) => {
121
+ const g = w.replace(/(-\w)/g, (E) => E[1].toUpperCase());
122
+ if (!(g === "args" || f === void 0)) {
123
+ Be.includes(w) && f && (f = je(f));
134
124
  try {
135
- i[C] && Pe(i[C].set) ? Q(m) ? i[C].set(...m) : i[C].set(m) : (m === "" && (m = !0), i[C] = m);
136
- } catch (O) {
137
- u(`There was an error setting ${C} property`, O);
125
+ c[g] && Oe(c[g].set) ? k(f) ? c[g].set(...f) : c[g].set(f) : (f === "" && (f = !0), c[g] = f);
126
+ } catch (E) {
127
+ a(`There was an error setting ${g} property`, E);
138
128
  }
139
129
  }
140
- }), M.ref && (M.ref = i);
130
+ }), C.ref && (C.ref = c);
141
131
  }
142
- return h(), () => {
132
+ return S(), () => {
143
133
  };
144
134
  }
145
135
  });
146
- return [n, c];
136
+ return [n, p];
147
137
  });
148
138
  }
149
139
  return {
150
140
  createComponentInstances: r
151
141
  };
152
142
  }
153
- let G;
154
- function N(e, t, u) {
155
- const r = new he(), { scene: n } = b(), s = () => {
156
- const o = r.getElapsedTime(), a = r.getDelta();
157
- n && (t && t(a, o), e(a, o), u && u(a, o)), G = requestAnimationFrame(s);
143
+ const te = U(), ne = U(), re = U(), K = new Me(), { pause: Ie, resume: ze, isActive: De } = de(
144
+ () => {
145
+ const e = K.getElapsedTime(), t = K.getDelta();
146
+ te.trigger({ delta: t, elapsed: e }), ne.trigger({ delta: t, elapsed: e }), re.trigger({ delta: t, elapsed: e });
147
+ },
148
+ { immediate: !1 }
149
+ );
150
+ function ae() {
151
+ return {
152
+ onBeforeLoop: te.on,
153
+ onLoop: ne.on,
154
+ onAfterLoop: re.on,
155
+ pause: Ie,
156
+ resume: ze,
157
+ isActive: De
158
158
  };
159
- s();
160
- function c() {
161
- cancelAnimationFrame(G);
162
- }
159
+ }
160
+ const Fe = $(new Se());
161
+ function oe() {
163
162
  return {
164
- disposeLoop: c
163
+ scene: Fe
165
164
  };
166
165
  }
167
- function be() {
168
- const e = new we(), t = L(e);
166
+ function Ne() {
167
+ const e = new Y(), t = O(e);
169
168
  return { loadingManager: e, loadingManagerRef: t };
170
169
  }
171
- async function Ie(e) {
172
- const { loadingManager: t } = be(), u = new ye(t), r = (n) => new Promise((s, c) => {
173
- u.load(
170
+ async function Ge(e) {
171
+ const t = new Y(), a = new ye(t), r = (n) => new Promise((o, p) => {
172
+ a.load(
174
173
  n,
175
- (o) => s(o),
174
+ (s) => o(s),
176
175
  () => null,
177
176
  () => {
178
- c(new Error("[useTextures] - Failed to load texture"));
177
+ p(new Error("[useTextures] - Failed to load texture"));
179
178
  }
180
179
  );
181
180
  });
182
- if (Q(e)) {
183
- const n = await Promise.all(e.map((s) => r(s)));
181
+ if (k(e)) {
182
+ const n = await Promise.all(e.map((o) => r(o)));
184
183
  return e.length > 1 ? n : n[0];
185
184
  } else {
186
- const { map: n, displacementMap: s, normalMap: c, roughnessMap: o, metalnessMap: a, aoMap: p } = e;
185
+ const { map: n, displacementMap: o, normalMap: p, roughnessMap: s, metalnessMap: i, aoMap: l } = e;
187
186
  return {
188
187
  map: n ? await r(n) : null,
189
- displacementMap: s ? await r(s) : null,
190
- normalMap: c ? await r(c) : null,
191
- roughnessMap: o ? await r(o) : null,
192
- metalnessMap: a ? await r(a) : null,
193
- aoMap: p ? await r(p) : null
188
+ displacementMap: o ? await r(o) : null,
189
+ normalMap: p ? await r(p) : null,
190
+ roughnessMap: s ? await r(s) : null,
191
+ metalnessMap: i ? await r(i) : null,
192
+ aoMap: l ? await r(l) : null
194
193
  };
195
194
  }
196
195
  }
197
- const T = ee({});
198
- function Y() {
199
- function e(u) {
200
- return T[u];
196
+ const L = le({});
197
+ function Je() {
198
+ function e(a) {
199
+ return L[a];
201
200
  }
202
- function t(u, r) {
203
- T[u] = r;
201
+ function t(a, r) {
202
+ L[a] = r;
204
203
  }
205
204
  return {
206
- state: T,
207
- ...te(T),
205
+ state: L,
206
+ ...fe(L),
208
207
  getState: e,
209
208
  setState: t
210
209
  };
211
210
  }
212
- let l, H;
213
- function Oe(e, t) {
214
- const { width: u, height: r } = K(), { logMessage: n } = $(), s = v(() => u.value / r.value), { scene: c } = b(), { activeCamera: o } = z(), { setState: a } = Y();
215
- a("scene", c), a("camera", o);
216
- function p() {
217
- l && (l.shadowMap.enabled = !0, l.shadowMap.type = Me);
218
- }
219
- function g() {
220
- l && (l.setSize(u.value, r.value), l.setPixelRatio(Math.min(window.devicePixelRatio, 2)));
221
- }
222
- function f() {
223
- l && (l.dispose(), l = null), n("disposeRenderer", l), H();
224
- }
225
- F(s, g);
226
- function w() {
227
- if (n("Render init", {
228
- renderer: l,
229
- canvas: e,
230
- scene: c
231
- }), !l && e.value && c) {
232
- const h = {
233
- canvas: e.value,
234
- ...t
235
- };
236
- t != null && t.context && (h.context = t.context), l = new Ce(h), t != null && t.shadows && p(), l.physicallyCorrectLights = (t == null ? void 0 : t.physicallyCorrectLights) || !1, t != null && t.outputEncoding && (l.outputEncoding = t.outputEncoding), t != null && t.toneMapping && (l.toneMapping = t.toneMapping, l.toneMappingExposure = 1), g(), l.render(c, o.value), a("renderer", l), H = N(() => {
237
- c && l && l.render(c, o.value);
238
- }).disposeLoop;
239
- }
240
- a("loop", N);
241
- }
242
- function S(h) {
243
- l && l.setClearColor(Ee(h));
244
- }
245
- return w(), {
246
- renderer: l,
247
- setClearColor: S,
248
- updateRenderer: g,
249
- disposeRenderer: f
211
+ const u = $(), D = O(!1);
212
+ function _e(e, t, a) {
213
+ const {
214
+ alpha: r = !1,
215
+ antialias: n,
216
+ depth: o,
217
+ logarithmicDepthBuffer: p,
218
+ failIfMajorPerformanceCaveat: s,
219
+ precision: i,
220
+ premultipliedAlpha: l,
221
+ stencil: d,
222
+ shadows: m = !1,
223
+ shadowMapType: h = xe,
224
+ physicallyCorrectLights: M = !1,
225
+ outputEncoding: S = Ee,
226
+ toneMapping: x = Pe,
227
+ toneMappingExposure: C = 1,
228
+ context: c = void 0,
229
+ powerPreference: w = "default",
230
+ preserveDrawingBuffer: f = !1,
231
+ clearColor: g = J("#000000"),
232
+ windowSize: E = !1
233
+ } = a, { width: j, height: B } = E ? X() : ge(t), { pixelRatio: V } = he(), { pause: se, resume: ie } = ae(), ce = F(() => j.value / B.value), W = () => {
234
+ !u.value || (u.value.setSize(j.value, B.value), u.value.setPixelRatio(V.value));
235
+ }, H = () => {
236
+ !u.value || (u.value.shadowMap.enabled = v(m), u.value.outputEncoding = v(S), u.value.shadowMap.type = v(h), u.value.physicallyCorrectLights = v(M), u.value.toneMapping = v(x), u.value.toneMappingExposure = v(C), u.value.setClearColor(J(v(g))));
237
+ }, ue = () => {
238
+ const N = A(e);
239
+ u.value || !N || (u.value = new Le({
240
+ canvas: N,
241
+ alpha: r,
242
+ antialias: n,
243
+ context: c,
244
+ depth: o,
245
+ failIfMajorPerformanceCaveat: s,
246
+ logarithmicDepthBuffer: p,
247
+ powerPreference: w,
248
+ precision: i,
249
+ stencil: d,
250
+ preserveDrawingBuffer: f,
251
+ premultipliedAlpha: l
252
+ }), H(), W(), ie(), D.value = !0);
253
+ }, pe = () => {
254
+ !u.value || (u.value.dispose(), u.value = void 0, D.value = !1, se());
255
+ };
256
+ return R([j, B, V], W), R(
257
+ () => [
258
+ m,
259
+ h,
260
+ S,
261
+ M,
262
+ x,
263
+ C,
264
+ g
265
+ ],
266
+ H
267
+ ), R(
268
+ () => [e, t],
269
+ () => {
270
+ A(e) && A(t) && ue();
271
+ },
272
+ { immediate: !0, deep: !0 }
273
+ ), {
274
+ renderer: u,
275
+ isReady: D,
276
+ dispose: pe,
277
+ aspectRatio: ce
250
278
  };
251
279
  }
252
- const Z = /* @__PURE__ */ J({
253
- __name: "TresCanvas",
280
+ const $e = _({
281
+ name: "TresCanvas",
254
282
  props: {
255
- camera: null,
256
- ortographic: { type: Boolean },
257
- gl: null,
258
- shadows: { type: Boolean, default: !1 },
259
- physicallyCorrectLights: { type: Boolean, default: !1 },
260
- outputEncoding: { default: Se },
261
- alpha: { type: Boolean, default: !1 },
262
- background: null,
263
- async: { type: Boolean, default: !1 }
283
+ shadows: Boolean,
284
+ shadowMapType: Object,
285
+ physicallyCorrectLights: Boolean,
286
+ outputEncoding: Object,
287
+ toneMapping: Object,
288
+ toneMappingExposure: Number,
289
+ context: Object,
290
+ powerPreference: Object,
291
+ preserveDrawingBuffer: Boolean,
292
+ clearColor: String,
293
+ windowSize: Boolean
264
294
  },
265
- setup(e) {
266
- const t = e;
267
- let u, r = () => {
268
- };
269
- const n = L(), s = L(!0), { scene: c, clearScene: o } = b(), a = re(), p = ne(), { createCamera: g } = z();
270
- let f;
271
- const w = Y();
272
- ae("UseTresState", w.state);
273
- const S = a.default ? a == null ? void 0 : a.default().some(
295
+ setup(e, { slots: t, attrs: a }) {
296
+ const { logError: r } = ee(), n = O(), o = O(), { renderer: p, dispose: s, aspectRatio: i } = _e(n, o, e), l = $();
297
+ return T("camera", l), T("renderer", p), T("aspect-ratio", i), t.default && !t.default().some((d) => d.type.name === "Scene") && r("TresCanvas must contain a Scene component."), t.default && !t.default().some(
274
298
  (d) => d.type.name === "PerspectiveCamera" || d.type.name === "OrtographicCamera"
275
- ) : !1;
276
- if (c && !S)
277
- if (t.camera) {
278
- const { position: d, ...M } = t.camera;
279
- if (f = g(t.ortographic === !0 ? E.Orthographic : E.Perspective, M || {}), d) {
280
- const i = X(d);
281
- f.position.set(i[0], i[1], i[2]);
282
- }
283
- c.add(f);
284
- } else
285
- f = g(t.ortographic === !0 ? E.Orthographic : E.Perspective, {}), f.position.set(5, 5, 5), c.add(f);
286
- F(t, () => {
287
- u && (r(), o(), h());
288
- });
289
- function h() {
290
- const d = Oe(n, {
291
- antialias: !0,
292
- physicallyCorrectLights: t.physicallyCorrectLights,
293
- shadows: t.shadows,
294
- context: t.gl || null,
295
- alpha: t.alpha
296
- });
297
- u = d.renderer, r = d.disposeRenderer, t.background && d.setClearColor(t.background);
298
- }
299
- return oe(() => {
300
- h();
301
- }), se(() => {
302
- o(), r();
303
- }), (d, M) => {
304
- var i, y, m, C;
305
- return _(), j("div", {
306
- id: "tres-container",
307
- style: V({
308
- position: "relative",
309
- top: 0,
310
- left: 0,
311
- right: 0,
312
- bottom: 0,
313
- overflow: "hidden",
314
- width: ((y = (i = U(p)) == null ? void 0 : i.style) == null ? void 0 : y.width) || "100%",
315
- height: "100%"
316
- })
317
- }, [
318
- ce("canvas", {
319
- ref_key: "canvasRef",
320
- ref: n,
321
- style: V({ width: ((C = (m = U(p)) == null ? void 0 : m.style) == null ? void 0 : C.width) || "100%", height: "100%", overflow: "hidden" })
322
- }, null, 4),
323
- e.async ? (_(), ie(le, { key: 0 }, {
324
- default: ue(() => [
325
- s.value ? W(d.$slots, "default", { key: 0 }) : D("", !0)
326
- ]),
327
- _: 3
328
- })) : (_(), j(fe, { key: 1 }, [
329
- s.value ? W(d.$slots, "default", { key: 0 }) : D("", !0)
330
- ], 64))
331
- ], 4);
299
+ ) && r("Scene must contain a Camera component."), me(() => s()), () => {
300
+ if (t.default)
301
+ return G(
302
+ "div",
303
+ {
304
+ ref: o,
305
+ style: {
306
+ position: "relative",
307
+ width: "100%",
308
+ height: "100vh",
309
+ ...a.style
310
+ }
311
+ },
312
+ [
313
+ G("canvas", {
314
+ ref: n,
315
+ style: { width: "100%", height: "100%", position: "absolute", top: 0, left: 0 }
316
+ }),
317
+ t.default()
318
+ ]
319
+ );
320
+ };
321
+ }
322
+ }), Ue = _({
323
+ name: "Scene",
324
+ setup(e, { slots: t }) {
325
+ const { scene: a } = oe(), r = Q("renderer"), { activeCamera: n } = Z(), { onLoop: o } = ae();
326
+ return T("local-scene", a), o(() => {
327
+ (r == null ? void 0 : r.value) && (n == null ? void 0 : n.value) && (a == null ? void 0 : a.value) && r.value.render(a == null ? void 0 : a.value, n.value);
328
+ }), () => {
329
+ if (t.default)
330
+ return t.default();
332
331
  };
333
332
  }
334
- }), ke = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
335
- __proto__: null,
336
- default: Z
337
- }, Symbol.toStringTag, { value: "Module" })), ve = Symbol("UseTresState"), Fe = {
333
+ }), qe = Symbol("UseTresState"), Ke = {
338
334
  install(e) {
339
- e.component("TresCanvas", Z);
340
- const { createComponentInstances: t } = Le();
335
+ e.component("TresCanvas", $e), e.component("Scene", Ue);
336
+ const { createComponentInstances: t } = Ae();
341
337
  t().forEach(([r, n]) => {
342
338
  e.component(r, n);
343
339
  });
344
340
  }
345
341
  };
346
342
  export {
347
- E as CameraType,
348
- ke as TresCanvas,
349
- ve as UseTresStateSymbol,
350
- Fe as default,
351
- z as useCamera,
352
- Re as useCatalog,
353
- Le as useInstanceCreator,
354
- be as useLoadingManager,
355
- N as useLoop,
356
- Oe as useRenderer,
357
- b as useScene,
358
- Ie as useTexture,
359
- Y as useTres
343
+ Re as CameraType,
344
+ qe as UseTresStateSymbol,
345
+ Ke as default,
346
+ Z as useCamera,
347
+ be as useCatalog,
348
+ Ae as useInstanceCreator,
349
+ Ne as useLoadingManager,
350
+ ae as useRenderLoop,
351
+ _e as useRenderer,
352
+ oe as useScene,
353
+ Ge as useTexture,
354
+ Je as useTres
360
355
  };
package/dist/tres.umd.cjs CHANGED
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * name: @tresjs/core
3
- * version: v0.3.0
3
+ * version: v0.4.0
4
4
  * (c) 2022
5
5
  * description: Declarative ThreeJS using Vue Components
6
6
  * author: Alvaro Saburido <hola@alvarosaburido.dev> (https://github.com/alvarosabu/)
7
7
  */
8
- (function(d,n){typeof exports=="object"&&typeof module<"u"?n(exports,require("vue"),require("three"),require("@vueuse/core")):typeof define=="function"&&define.amd?define(["exports","vue","three","@vueuse/core"],n):(d=typeof globalThis<"u"?globalThis:d||self,n(d.tres={},d.Vue,d.Three,d.VueUseCore))})(this,function(d,n,m,$){"use strict";function Y(e){if(e&&e.__esModule)return e;const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const s in e)if(s!=="default"){const r=Object.getOwnPropertyDescriptor(e,s);Object.defineProperty(t,s,r.get?r:{enumerable:!0,get:()=>e[s]})}}return t.default=e,Object.freeze(t)}const Z=Y(m);var _=(e=>(e.Perspective="Perspective",e.Orthographic="Orthographic",e))(_||{});const x={cameras:[]},E=45;let L;function k(){const{width:e,height:t}=$.useWindowSize();function s(c="Perspective",o){if(c==="Perspective"){const{near:g,far:y,fov:p}=o||{near:.1,far:1e3,fov:E};L=new m.PerspectiveCamera(p,r.value,g,y),x.cameras.push(L)}else{const{left:g,right:y,top:p,bottom:S,near:O,far:w}=o||{left:-100,right:100,top:100,bottom:-100,near:.1,far:1e3};L=new m.OrthographicCamera(g,y,p,S,O,w),x.cameras.push(L)}return x.cameras.push(L),L}const r=n.computed(()=>e.value/t.value),a=n.computed(()=>x.cameras[0]);function i(){a.value instanceof m.PerspectiveCamera&&(a.value.aspect=r.value),a.value.updateProjectionMatrix()}function u(c){x.cameras.push(c),c instanceof m.PerspectiveCamera&&(c.aspect=r.value),c.updateProjectionMatrix()}return n.watch(r,i),{activeCamera:a,createCamera:s,updateCamera:i,pushCamera:u}}let z={...Z};function U(){return{extend:t=>{z=Object.assign(z,t)},catalogue:z}}const H=e=>typeof e<"u",q=e=>!!e&&e.constructor===Array;function W(e){return typeof e=="number"?[e,e,e]:e instanceof m.Vector3?[e.x,e.y,e.z]:e}function v(e){return e instanceof m.Color?e:Array.isArray(e)?new m.Color(...e):new m.Color(e)}const D="[TresJS \u25B2 \u25A0 \u25CF] ";function I(){function e(r,a){console.error(`${D} ${r}`,a)}function t(r){console.warn(`${D} ${r}`)}function s(r,a){}return{logError:e,logWarning:t,logMessage:s}}const B=new m.Scene,R=n.ref(!1);function j(){const{logMessage:e}=I();function t(){B==null||B.clear(),R.value=!R.value,e("clear Scene",B)}return{isSceneReset:R,clearScene:t,scene:B}}const ee=["rotation","scale","position"];function N(){const{catalogue:e}=U(),{logMessage:t,logError:s}=I();function r(){return Object.entries(e).filter(([a,i])=>{var u,c;return(c=(u=i==null?void 0:i.prototype)==null?void 0:u.constructor)==null?void 0:c.toString().includes("class")}).map(([a,i])=>{const u=n.defineComponent({name:a,setup(c,{slots:o,attrs:g,...y}){t(a,{props:c,slots:o,attrs:g,ctx:y});let p;const{scene:S}=j(),{pushCamera:O}=k();function w(){if((o==null?void 0:o.default)&&(o==null?void 0:o.default())){const b=o.default().map(f=>{var C;let M;return(C=f==null?void 0:f.props)!=null&&C.args?M=new e[f.type.name](...f.props.args):M=new e[f.type.name],f!=null&&f.props&&h(f.props,M),M});p=new i(...b)}else g.args?p=new i(...g.args):p=new i;h(g,p),a==="PerspectiveCamera"||a==="OrtographicCamera"?O(p):S==null||S.add(p),t("Instance added",S),y.expose(p)}function h(b,f){Object.entries(b).forEach(([M,C])=>{const P=M.replace(/(-\w)/g,F=>F[1].toUpperCase());if(!(P==="args"||C===void 0)){ee.includes(M)&&C&&(C=W(C));try{f[P]&&H(f[P].set)?q(C)?f[P].set(...C):f[P].set(C):(C===""&&(C=!0),f[P]=C)}catch(F){s(`There was an error setting ${P} property`,F)}}}),b.ref&&(b.ref=f)}return w(),()=>{}}});return[a,u]})}return{createComponentInstances:r}}let G;function A(e,t,s){const r=new m.Clock,{scene:a}=j(),i=()=>{const c=r.getElapsedTime(),o=r.getDelta();a&&(t&&t(o,c),e(o,c),s&&s(o,c)),G=requestAnimationFrame(i)};i();function u(){cancelAnimationFrame(G)}return{disposeLoop:u}}function J(){const e=new m.LoadingManager,t=n.ref(e);return{loadingManager:e,loadingManagerRef:t}}async function te(e){const{loadingManager:t}=J(),s=new m.TextureLoader(t),r=a=>new Promise((i,u)=>{s.load(a,c=>i(c),()=>null,()=>{u(new Error("[useTextures] - Failed to load texture"))})});if(q(e)){const a=await Promise.all(e.map(i=>r(i)));return e.length>1?a:a[0]}else{const{map:a,displacementMap:i,normalMap:u,roughnessMap:c,metalnessMap:o,aoMap:g}=e;return{map:a?await r(a):null,displacementMap:i?await r(i):null,normalMap:u?await r(u):null,roughnessMap:c?await r(c):null,metalnessMap:o?await r(o):null,aoMap:g?await r(g):null}}}const T=n.reactive({});function V(){function e(s){return T[s]}function t(s,r){T[s]=r}return{state:T,...n.toRefs(T),getState:e,setState:t}}let l,K;function Q(e,t){const{width:s,height:r}=$.useWindowSize(),{logMessage:a}=I(),i=n.computed(()=>s.value/r.value),{scene:u}=j(),{activeCamera:c}=k(),{setState:o}=V();o("scene",u),o("camera",c);function g(){l&&(l.shadowMap.enabled=!0,l.shadowMap.type=m.PCFSoftShadowMap)}function y(){l&&(l.setSize(s.value,r.value),l.setPixelRatio(Math.min(window.devicePixelRatio,2)))}function p(){l&&(l.dispose(),l=null),a("disposeRenderer",l),K()}n.watch(i,y);function S(){if(a("Render init",{renderer:l,canvas:e,scene:u}),!l&&e.value&&u){const w={canvas:e.value,...t};t!=null&&t.context&&(w.context=t.context),l=new m.WebGLRenderer(w),t!=null&&t.shadows&&g(),l.physicallyCorrectLights=(t==null?void 0:t.physicallyCorrectLights)||!1,t!=null&&t.outputEncoding&&(l.outputEncoding=t.outputEncoding),t!=null&&t.toneMapping&&(l.toneMapping=t.toneMapping,l.toneMappingExposure=1),y(),l.render(u,c.value),o("renderer",l),K=A(()=>{u&&l&&l.render(u,c.value)}).disposeLoop}o("loop",A)}function O(w){l&&l.setClearColor(v(w))}return S(),{renderer:l,setClearColor:O,updateRenderer:y,disposeRenderer:p}}const X=n.defineComponent({__name:"TresCanvas",props:{camera:null,ortographic:{type:Boolean},gl:null,shadows:{type:Boolean,default:!1},physicallyCorrectLights:{type:Boolean,default:!1},outputEncoding:{default:m.sRGBEncoding},alpha:{type:Boolean,default:!1},background:null,async:{type:Boolean,default:!1}},setup(e){const t=e;let s,r=()=>{};const a=n.ref(),i=n.ref(!0),{scene:u,clearScene:c}=j(),o=n.useSlots(),g=n.useAttrs(),{createCamera:y}=k();let p;const S=V();n.provide("UseTresState",S.state);const O=o.default?o==null?void 0:o.default().some(h=>h.type.name==="PerspectiveCamera"||h.type.name==="OrtographicCamera"):!1;if(u&&!O)if(t.camera){const{position:h,...b}=t.camera;if(p=y(t.ortographic===!0?_.Orthographic:_.Perspective,b||{}),h){const f=W(h);p.position.set(f[0],f[1],f[2])}u.add(p)}else p=y(t.ortographic===!0?_.Orthographic:_.Perspective,{}),p.position.set(5,5,5),u.add(p);n.watch(t,()=>{s&&(r(),c(),w())});function w(){const h=Q(a,{antialias:!0,physicallyCorrectLights:t.physicallyCorrectLights,shadows:t.shadows,context:t.gl||null,alpha:t.alpha});s=h.renderer,r=h.disposeRenderer,t.background&&h.setClearColor(t.background)}return n.onMounted(()=>{w()}),n.onBeforeUnmount(()=>{c(),r()}),(h,b)=>{var f,M,C,P;return n.openBlock(),n.createElementBlock("div",{id:"tres-container",style:n.normalizeStyle({position:"relative",top:0,left:0,right:0,bottom:0,overflow:"hidden",width:((M=(f=n.unref(g))==null?void 0:f.style)==null?void 0:M.width)||"100%",height:"100%"})},[n.createElementVNode("canvas",{ref_key:"canvasRef",ref:a,style:n.normalizeStyle({width:((P=(C=n.unref(g))==null?void 0:C.style)==null?void 0:P.width)||"100%",height:"100%",overflow:"hidden"})},null,4),e.async?(n.openBlock(),n.createBlock(n.Suspense,{key:0},{default:n.withCtx(()=>[i.value?n.renderSlot(h.$slots,"default",{key:0}):n.createCommentVNode("",!0)]),_:3})):(n.openBlock(),n.createElementBlock(n.Fragment,{key:1},[i.value?n.renderSlot(h.$slots,"default",{key:0}):n.createCommentVNode("",!0)],64))],4)}}}),ne=Object.freeze(Object.defineProperty({__proto__:null,default:X},Symbol.toStringTag,{value:"Module"})),re=Symbol("UseTresState"),ae={install(e){e.component("TresCanvas",X);const{createComponentInstances:t}=N();t().forEach(([r,a])=>{e.component(r,a)})}};d.CameraType=_,d.TresCanvas=ne,d.UseTresStateSymbol=re,d.default=ae,d.useCamera=k,d.useCatalog=U,d.useInstanceCreator=N,d.useLoadingManager=J,d.useLoop=A,d.useRenderer=Q,d.useScene=j,d.useTexture=te,d.useTres=V,Object.defineProperties(d,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
8
+ (function(u,a){typeof exports=="object"&&typeof module<"u"?a(exports,require("vue"),require("@vueuse/core"),require("three")):typeof define=="function"&&define.amd?define(["exports","vue","@vueuse/core","three"],a):(u=typeof globalThis<"u"?globalThis:u||self,a(u.tres={},u.Vue,u.VueUseCore,u.Three))})(this,function(u,a,p,f){"use strict";function H(e){if(e&&e.__esModule)return e;const n=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const o in e)if(o!=="default"){const t=Object.getOwnPropertyDescriptor(e,o);Object.defineProperty(n,o,t.get?t:{enumerable:!0,get:()=>e[o]})}}return n.default=e,Object.freeze(n)}const ee=H(f);var F=(e=>(e.Perspective="Perspective",e.Orthographic="Orthographic",e))(F||{});const O={cameras:[]},ne=45;let b;function z(){const{width:e,height:n}=p.useWindowSize();function o(i="Perspective",c){if(i==="Perspective"){const{near:g,far:C,fov:w}=c||{near:.1,far:1e3,fov:ne};b=new f.PerspectiveCamera(w,t.value,g,C),O.cameras.push(b)}else{const{left:g,right:C,top:w,bottom:y,near:v,far:L}=c||{left:-100,right:100,top:100,bottom:-100,near:.1,far:1e3};b=new f.OrthographicCamera(g,C,w,y,v,L),O.cameras.push(b)}return O.cameras.push(b),b}const t=a.computed(()=>e.value/n.value),r=a.computed(()=>O.cameras[0]);function s(){r.value instanceof f.PerspectiveCamera&&(r.value.aspect=t.value),r.value.updateProjectionMatrix()}function m(i){const c=a.inject("camera");i&&c&&(c.value=i),O.cameras.push(i),i instanceof f.PerspectiveCamera&&(i.aspect=t.value),i.updateProjectionMatrix()}return a.watch(t,s),{activeCamera:r,createCamera:o,updateCamera:s,pushCamera:m}}let _={...ee};delete _.Scene;function R(){return{extend:n=>{_=Object.assign(_,n)},catalogue:_}}const te=e=>typeof e<"u",V=e=>!!e&&e.constructor===Array;function re(e){return typeof e=="number"?[e,e,e]:e instanceof f.Vector3?[e.x,e.y,e.z]:e}function $(e){return e instanceof f.Color?e:Array.isArray(e)?new f.Color(...e):new f.Color(e)}const W="[TresJS \u25B2 \u25A0 \u25CF] ";function q(){function e(t,r){console.error(`${W} ${t}`,r||"")}function n(t){console.warn(`${W} ${t}`)}function o(t,r){}return{logError:e,logWarning:n,logMessage:o}}const ae=["rotation","scale","position"];function N(){const{catalogue:e}=R(),{logMessage:n,logError:o}=q();function t(){return Object.entries(e).filter(([r,s])=>{var m,i;return(i=(m=s==null?void 0:s.prototype)==null?void 0:m.constructor)==null?void 0:i.toString().includes("class")}).map(([r,s])=>{const m=a.defineComponent({name:r,setup(i,{slots:c,attrs:g,...C}){n(r,{props:i,slots:c,attrs:g,ctx:C});let w;const{scene:y}=I(),{pushCamera:v}=z();function L(){if((c==null?void 0:c.default)&&(c==null?void 0:c.default())){const P=c.default().map(l=>{var h;let S;return(h=l==null?void 0:l.props)!=null&&h.args?S=new e[l.type.name](...l.props.args):S=new e[l.type.name],l!=null&&l.props&&j(l.props,S),S});w=new s(...P)}else g.args?w=new s(...g.args):w=new s;j(g,w),r==="PerspectiveCamera"||r==="OrtographicCamera"?v(w):y==null||y.value.add(w),n("Instance added",y),C.expose(w)}function j(P,l){Object.entries(P).forEach(([S,h])=>{const M=S.replace(/(-\w)/g,x=>x[1].toUpperCase());if(!(M==="args"||h===void 0)){ae.includes(S)&&h&&(h=re(h));try{l[M]&&te(l[M].set)?V(h)?l[M].set(...h):l[M].set(h):(h===""&&(h=!0),l[M]=h)}catch(x){o(`There was an error setting ${M} property`,x)}}}),P.ref&&(P.ref=l)}return L(),()=>{}}});return[r,m]})}return{createComponentInstances:t}}const k=p.createEventHook(),G=p.createEventHook(),J=p.createEventHook(),K=new f.Clock,{pause:oe,resume:se,isActive:ie}=p.useRafFn(()=>{const e=K.getElapsedTime(),n=K.getDelta();k.trigger({delta:n,elapsed:e}),G.trigger({delta:n,elapsed:e}),J.trigger({delta:n,elapsed:e})},{immediate:!1});function B(){return{onBeforeLoop:k.on,onLoop:G.on,onAfterLoop:J.on,pause:oe,resume:se,isActive:ie}}const ce=a.shallowRef(new f.Scene);function I(){return{scene:ce}}function ue(){const e=new f.LoadingManager,n=a.ref(e);return{loadingManager:e,loadingManagerRef:n}}async function le(e){const n=new f.LoadingManager,o=new f.TextureLoader(n),t=r=>new Promise((s,m)=>{o.load(r,i=>s(i),()=>null,()=>{m(new Error("[useTextures] - Failed to load texture"))})});if(V(e)){const r=await Promise.all(e.map(s=>t(s)));return e.length>1?r:r[0]}else{const{map:r,displacementMap:s,normalMap:m,roughnessMap:i,metalnessMap:c,aoMap:g}=e;return{map:r?await t(r):null,displacementMap:s?await t(s):null,normalMap:m?await t(m):null,roughnessMap:i?await t(i):null,metalnessMap:c?await t(c):null,aoMap:g?await t(g):null}}}const U=a.reactive({});function pe(){function e(o){return U[o]}function n(o,t){U[o]=t}return{state:U,...a.toRefs(U),getState:e,setState:n}}const d=a.shallowRef(),T=a.ref(!1);function Q(e,n,o){const{alpha:t=!1,antialias:r,depth:s,logarithmicDepthBuffer:m,failIfMajorPerformanceCaveat:i,precision:c,premultipliedAlpha:g,stencil:C,shadows:w=!1,shadowMapType:y=f.PCFShadowMap,physicallyCorrectLights:v=!1,outputEncoding:L=f.LinearEncoding,toneMapping:j=f.NoToneMapping,toneMappingExposure:P=1,context:l=void 0,powerPreference:S="default",preserveDrawingBuffer:h=!1,clearColor:M=$("#000000"),windowSize:x=!1}=o,{width:A,height:D}=x?p.useWindowSize():p.useElementSize(n),{pixelRatio:X}=p.useDevicePixelRatio(),{pause:he,resume:we}=B(),Ce=a.computed(()=>A.value/D.value),Y=()=>{!d.value||(d.value.setSize(A.value,D.value),d.value.setPixelRatio(X.value))},Z=()=>{!d.value||(d.value.shadowMap.enabled=p.resolveUnref(w),d.value.outputEncoding=p.resolveUnref(L),d.value.shadowMap.type=p.resolveUnref(y),d.value.physicallyCorrectLights=p.resolveUnref(v),d.value.toneMapping=p.resolveUnref(j),d.value.toneMappingExposure=p.resolveUnref(P),d.value.setClearColor($(p.resolveUnref(M))))},Me=()=>{const E=p.unrefElement(e);d.value||!E||(d.value=new f.WebGLRenderer({canvas:E,alpha:t,antialias:r,context:l,depth:s,failIfMajorPerformanceCaveat:i,logarithmicDepthBuffer:m,powerPreference:S,precision:c,stencil:C,preserveDrawingBuffer:h,premultipliedAlpha:g}),Z(),Y(),we(),T.value=!0)},ye=()=>{!d.value||(d.value.dispose(),d.value=void 0,T.value=!1,he())};return a.watch([A,D,X],Y),a.watch(()=>[w,y,L,v,j,P,M],Z),a.watch(()=>[e,n],()=>{p.unrefElement(e)&&p.unrefElement(n)&&Me()},{immediate:!0,deep:!0}),{renderer:d,isReady:T,dispose:ye,aspectRatio:Ce}}const fe=a.defineComponent({name:"TresCanvas",props:{shadows:Boolean,shadowMapType:Object,physicallyCorrectLights:Boolean,outputEncoding:Object,toneMapping:Object,toneMappingExposure:Number,context:Object,powerPreference:Object,preserveDrawingBuffer:Boolean,clearColor:String,windowSize:Boolean},setup(e,{slots:n,attrs:o}){const{logError:t}=q(),r=a.ref(),s=a.ref(),{renderer:m,dispose:i,aspectRatio:c}=Q(r,s,e),g=a.shallowRef();return a.provide("camera",g),a.provide("renderer",m),a.provide("aspect-ratio",c),n.default&&!n.default().some(C=>C.type.name==="Scene")&&t("TresCanvas must contain a Scene component."),n.default&&!n.default().some(C=>C.type.name==="PerspectiveCamera"||C.type.name==="OrtographicCamera")&&t("Scene must contain a Camera component."),a.onBeforeUnmount(()=>i()),()=>{if(n.default)return a.h("div",{ref:s,style:{position:"relative",width:"100%",height:"100vh",...o.style}},[a.h("canvas",{ref:r,style:{width:"100%",height:"100%",position:"absolute",top:0,left:0}}),n.default()])}}}),de=a.defineComponent({name:"Scene",setup(e,{slots:n}){const{scene:o}=I(),t=a.inject("renderer"),{activeCamera:r}=z(),{onLoop:s}=B();return a.provide("local-scene",o),s(()=>{(t==null?void 0:t.value)&&(r==null?void 0:r.value)&&(o==null?void 0:o.value)&&t.value.render(o==null?void 0:o.value,r.value)}),()=>{if(n.default)return n.default()}}}),me=Symbol("UseTresState"),ge={install(e){e.component("TresCanvas",fe),e.component("Scene",de);const{createComponentInstances:n}=N();n().forEach(([t,r])=>{e.component(t,r)})}};u.CameraType=F,u.UseTresStateSymbol=me,u.default=ge,u.useCamera=z,u.useCatalog=R,u.useInstanceCreator=N,u.useLoadingManager=ue,u.useRenderLoop=B,u.useRenderer=Q,u.useScene=I,u.useTexture=le,u.useTres=pe,Object.defineProperties(u,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
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": "0.3.0",
4
+ "version": "0.4.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
  "devDependencies": {
39
39
  "@alvarosabu/utils": "^2.2.0",
40
40
  "@histoire/plugin-vue": "0.11.7",
41
- "@tresjs/cientos": "^0.2.0",
41
+ "@tresjs/cientos": "^0.3.0",
42
42
  "@vitejs/plugin-vue": "^3.2.0",
43
43
  "@vitest/coverage-c8": "^0.25.1",
44
44
  "@vitest/ui": "^0.25.1",
@@ -1,124 +0,0 @@
1
- import { TextureEncoding, WebGLRenderer } from 'three';
2
- import { CameraType, PerspectiveCameraOptions, Camera } from '../core/useCamera/useCamera';
3
- import { VectorFlexibleParams } from '../utils/normalize';
4
- export interface CanvasCameraOptions extends PerspectiveCameraOptions {
5
- position: VectorFlexibleParams;
6
- }
7
- declare const _sfc_main: import("vue").DefineComponent<{
8
- camera: {
9
- type: ObjectConstructor;
10
- required: false;
11
- };
12
- ortographic: {
13
- type: BooleanConstructor;
14
- required: false;
15
- };
16
- gl: {
17
- type: null;
18
- required: false;
19
- };
20
- shadows: {
21
- type: BooleanConstructor;
22
- required: false;
23
- default: boolean;
24
- };
25
- physicallyCorrectLights: {
26
- type: BooleanConstructor;
27
- required: false;
28
- default: boolean;
29
- };
30
- outputEncoding: {
31
- type: null;
32
- required: false;
33
- default: TextureEncoding;
34
- };
35
- alpha: {
36
- type: BooleanConstructor;
37
- required: false;
38
- default: boolean;
39
- };
40
- background: {
41
- type: StringConstructor;
42
- required: false;
43
- };
44
- async: {
45
- type: BooleanConstructor;
46
- required: false;
47
- default: boolean;
48
- };
49
- }, {
50
- props: any;
51
- renderer: WebGLRenderer | null;
52
- disposeRenderer: () => void;
53
- canvasRef: import("vue").Ref<any>;
54
- renderComponent: import("vue").Ref<boolean>;
55
- scene: import("three").Scene | null;
56
- clearScene: () => void;
57
- slots: Readonly<{
58
- [name: string]: import("vue").Slot | undefined;
59
- }>;
60
- attrs: {
61
- [x: string]: unknown;
62
- };
63
- createCamera: (cameraType?: CameraType | undefined, options?: PerspectiveCameraOptions | import('../core/useCamera/useCamera').OrthographicCameraOptions | undefined) => Camera;
64
- camera: Camera;
65
- tres: {
66
- getState: (key: string) => any;
67
- setState: (key: string, value: any) => void;
68
- camera?: import("vue").Ref<Camera | undefined> | undefined;
69
- renderer?: import("vue").Ref<WebGLRenderer | undefined> | undefined;
70
- state: import("../core").TresState;
71
- };
72
- thereIsCameraAlready: boolean;
73
- setupRenderer: () => void;
74
- }, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<{
75
- camera: {
76
- type: ObjectConstructor;
77
- required: false;
78
- };
79
- ortographic: {
80
- type: BooleanConstructor;
81
- required: false;
82
- };
83
- gl: {
84
- type: null;
85
- required: false;
86
- };
87
- shadows: {
88
- type: BooleanConstructor;
89
- required: false;
90
- default: boolean;
91
- };
92
- physicallyCorrectLights: {
93
- type: BooleanConstructor;
94
- required: false;
95
- default: boolean;
96
- };
97
- outputEncoding: {
98
- type: null;
99
- required: false;
100
- default: TextureEncoding;
101
- };
102
- alpha: {
103
- type: BooleanConstructor;
104
- required: false;
105
- default: boolean;
106
- };
107
- background: {
108
- type: StringConstructor;
109
- required: false;
110
- };
111
- async: {
112
- type: BooleanConstructor;
113
- required: false;
114
- default: boolean;
115
- };
116
- }>>, {
117
- ortographic: boolean;
118
- shadows: boolean;
119
- physicallyCorrectLights: boolean;
120
- outputEncoding: any;
121
- alpha: boolean;
122
- async: boolean;
123
- }>;
124
- export default _sfc_main;
@@ -1,4 +0,0 @@
1
- export declare type TresLoop = (delta: number, elapsedTime: number) => void;
2
- export declare function useLoop(cb: TresLoop, beforeCb?: TresLoop, afterCb?: TresLoop): {
3
- disposeLoop: () => void;
4
- };
@@ -1,18 +0,0 @@
1
- import { Ref } from 'vue';
2
- import { TextureEncoding, ToneMapping, WebGLRenderer, WebGLRendererParameters, Color } from 'three';
3
- export interface RendererOptions extends WebGLRendererParameters {
4
- shadows?: boolean;
5
- controls?: boolean;
6
- physicallyCorrectLights?: boolean;
7
- outputEncoding?: TextureEncoding;
8
- toneMapping?: ToneMapping;
9
- context?: WebGLRenderingContext | undefined;
10
- powerPreference?: string;
11
- preserveDrawingBuffer?: boolean;
12
- }
13
- export declare function useRenderer(canvas: Ref<HTMLCanvasElement>, options?: RendererOptions): {
14
- renderer: WebGLRenderer | null;
15
- setClearColor: (color: Color | string | number) => void;
16
- updateRenderer: () => void;
17
- disposeRenderer: () => void;
18
- };
@@ -1,6 +0,0 @@
1
- import { Scene } from 'three';
2
- export declare function useScene(): {
3
- isSceneReset: import("vue").Ref<boolean>;
4
- clearScene: () => void;
5
- scene: Scene | null;
6
- };