UNPKG

@yaelg/tresjs-core

Version:

Declarative ThreeJS using Vue Components

670 lines (669 loc) 24.3 kB
/** * name: @yaelg/tresjs-core * version: v3.3.0 * (c) 2023 * description: Declarative ThreeJS using Vue Components * author: Alvaro Saburido <hola@alvarosaburido.dev> (https://github.com/alvarosabu/) */ import { ref as B, computed as k, watchEffect as D, onUnmounted as N, shallowRef as O, watch as te, reactive as ie, readonly as ue, provide as I, inject as le, createRenderer as ce, defineComponent as U, useSlots as fe, getCurrentInstance as J, onMounted as pe, openBlock as me, createElementBlock as ve, normalizeStyle as ge, h as K, Fragment as de } from "vue"; import * as ye from "three"; import { PerspectiveCamera as $, OrthographicCamera as we, Camera as Ce, Clock as _e, Vector3 as Pe, Color as j, REVISION as Ee, SRGBColorSpace as Me, ACESFilmicToneMapping as Ae, PCFSoftShadowMap as ke, WebGLRenderer as z, LoadingManager as be, TextureLoader as De, Vector2 as xe, Raycaster as Oe, BufferAttribute as Le, Scene as Be } from "three"; import { createEventHook as L, useRafFn as he, toValue as E, unrefElement as Te, useDevicePixelRatio as Se, usePointer as Re, useElementBounding as je, useWindowSize as He, useElementSize as Fe } from "@vueuse/core"; const ze = ({ sizes: e, scene: n }) => { const t = B([]), r = k( () => t.value[0] ), a = (s, f = !1) => { t.value.some(({ uuid: i }) => i === s.uuid) || (f ? c(s) : t.value.push(s)); }, o = (s) => { t.value = t.value.filter(({ uuid: f }) => f !== s.uuid); }, c = (s) => { const f = s instanceof Ce ? s : t.value.find((p) => p.uuid === s); if (!f) return; const i = t.value.filter(({ uuid: p }) => p !== f.uuid); t.value = [f, ...i]; }; return D(() => { e.aspectRatio.value && t.value.forEach((s) => { s instanceof $ && (s.aspect = e.aspectRatio.value), (s instanceof $ || s instanceof we) && s.updateProjectionMatrix(); }); }), n.userData.tres__registerCamera = a, n.userData.tres__deregisterCamera = o, N(() => { t.value = []; }), { camera: r, cameras: t, registerCamera: a, deregisterCamera: o, setCameraActive: c }; }, re = L(), ne = L(), V = L(), x = new _e(); let H = 0, F = 0; const { pause: Ge, resume: Ie, isActive: $e } = he( () => { re.trigger({ delta: H, elapsed: F, clock: x }), ne.trigger({ delta: H, elapsed: F, clock: x }), V.trigger({ delta: H, elapsed: F, clock: x }); }, { immediate: !1 } ); V.on(() => { H = x.getDelta(), F = x.getElapsedTime(); }); const ae = () => ({ onBeforeLoop: re.on, onLoop: ne.on, onAfterLoop: V.on, pause: Ge, resume: Ie, isActive: $e }), vt = !0, X = "[TresJS ▲ ■ ●] "; function h() { function e(r, a) { console.error(`${X} ${r}`, a || ""); } function n(r) { console.warn(`${X} ${r}`); } function t(r, a) { } return { logError: e, logWarning: n, logMessage: t }; } function gt(e) { return typeof e == "number" ? [e, e, e] : e instanceof Pe ? [e.x, e.y, e.z] : e; } function We(e) { return e instanceof j ? e : Array.isArray(e) ? new j(...e) : new j(e); } const oe = (e, n) => { for (const t of Object.keys(n)) n[t] instanceof Object && Object.assign(n[t], oe(e[t], n[t])); return Object.assign(e || {}, n), e; }, Ne = "html,body,base,head,link,meta,style,title,address,article,aside,footer,header,hgroup,h1,h2,h3,h4,h5,h6,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,summary,template,blockquote,iframe,tfoot", Ve = /* @__PURE__ */ qe(Ne); function Y(e) { return e && e.nodeType === 1; } function S(e) { return e.replace(/-([a-z])/g, (n, t) => t.toUpperCase()); } function qe(e, n) { const t = /* @__PURE__ */ Object.create(null), r = e.split(","); for (let a = 0; a < r.length; a++) t[r[a]] = !0; return n ? (a) => !!t[a.toLowerCase()] : (a) => !!t[a]; } const Ue = (e, n) => { const t = /* @__PURE__ */ new Set(), r = []; for (const a of e) { const o = n(a); t.has(o) || (t.add(o), r.push(a)); } return r; }, Q = (e, n) => { if (!n) return; const t = Array.isArray(n) ? n : n.match(/([^[.\]])+/g); return t == null ? void 0 : t.reduce((r, a) => r && r[a], e); }, Je = (e, n, t) => { const r = Array.isArray(n) ? n : n.match(/([^[.\]])+/g); r && r.reduce((a, o, c) => (a[o] === void 0 && (a[o] = {}), c === r.length - 1 && (a[o] = t), a[o]), e); }; function se(e, n) { if (Y(e) && Y(n)) { const a = e.attributes, o = n.attributes; return a.length !== o.length ? !1 : Array.from(a).every(({ name: c, value: s }) => n.getAttribute(c) === s); } if (e === n) return !0; if (e === null || typeof e != "object" || n === null || typeof n != "object") return !1; const t = Object.keys(e), r = Object.keys(n); if (t.length !== r.length) return !1; for (const a of t) if (!r.includes(a) || !se(e[a], n[a])) return !1; return !0; } function Ke(e, n) { if (!Array.isArray(e) || !Array.isArray(n) || e.length !== n.length) return !1; for (let t = 0; t < e.length; t++) if (!se(e[t], n[t])) return !1; return !0; } const Xe = Array.isArray, Ye = Number.parseInt(Ee.replace("dev", "")), R = { realistic: { shadows: !0, physicallyCorrectLights: !0, outputColorSpace: Me, toneMapping: Ae, toneMappingExposure: 3, shadowMap: { enabled: !0, type: ke } } }; function Qe({ scene: e, canvas: n, options: t, disableRender: r, contextParts: { sizes: a, camera: o } }) { const c = k(() => ({ alpha: E(t.alpha), depth: E(t.depth), canvas: Te(n), context: E(t.context), stencil: E(t.stencil), antialias: E(t.antialias) === void 0 ? !0 : E(t.antialias), precision: E(t.precision), powerPreference: E(t.powerPreference), premultipliedAlpha: E(t.premultipliedAlpha), preserveDrawingBuffer: E(t.preserveDrawingBuffer), logarithmicDepthBuffer: E(t.logarithmicDepthBuffer), failIfMajorPerformanceCaveat: E(t.failIfMajorPerformanceCaveat) })), s = O(new z(c.value)); te(c, () => { s.value.dispose(), s.value = new z(c.value); }), D(() => { s.value.setSize(a.width.value, a.height.value); }); const { pixelRatio: f } = Se(); D(() => { s.value.setPixelRatio(f.value); }); const { logError: i } = h(), l = (() => { const g = new z(), w = { shadowMap: { enabled: g.shadowMap.enabled, type: g.shadowMap.type }, toneMapping: g.toneMapping, toneMappingExposure: g.toneMappingExposure, outputColorSpace: g.outputColorSpace }; return g.dispose(), w; })(); D(() => { const g = E(t.preset); g && (g in R || i(`Renderer Preset must be one of these: ${Object.keys(R).join(", ")}`), oe(s.value, R[g])); const w = (_, C) => { const b = E(_), T = () => { if (g) return Q(R[g], C); }; if (b !== void 0) return b; const y = T(); return y !== void 0 ? y : Q(l, C); }, P = (_, C) => Je(s.value, C, w(_, C)); P(t.shadows, "shadowMap.enabled"), P(t.toneMapping, "toneMapping"), P(t.shadowMapType, "shadowMap.type"), Ye < 150 && P(!t.useLegacyLights, "physicallyCorrectLights"), P(t.outputColorSpace, "outputColorSpace"), P(t.toneMappingExposure, "toneMappingExposure"); const A = w(t.clearColor, "clearColor"); A && s.value.setClearColor( A ? We(A) : new j(0) // default clear color is not easily/efficiently retrievable from three ); }); const { pause: u, resume: v, onLoop: m } = ae(); return m(() => { o.value && !E(r) && s.value.render(e, o.value); }), v(), N(() => { u(), s.value.dispose(), s.value.forceContextLoss(); }), { renderer: s }; } const Z = (e) => typeof e == "function", Ze = (e) => !!e && e.constructor === Array; function et(e) { const n = { nodes: {}, materials: {} }; return e && e.traverse((t) => { t.name && (n.nodes[t.name] = t), t.material && !n.materials[t.material.name] && (n.materials[t.material.name] = t.material); }), n; } async function dt(e, n, t, r, a) { const { logError: o } = h(), c = new e(); a && a(c), t && t(c); const f = (Array.isArray(n) ? n : [n]).map( (i) => new Promise((p, l) => { c.load( i, (u) => { u.scene && Object.assign(u, et(u.scene)), p(u); }, r, (u) => l(o("[useLoader] - Failed to load resource", u)) ); }) ); return Ze(n) ? await Promise.all(f) : await f[0]; } async function yt(e) { const n = new be(), t = new De(n), r = (a) => new Promise((o, c) => { t.load( a, (s) => o(s), () => null, () => { c(new Error("[useTextures] - Failed to load texture")); } ); }); if (Xe(e)) { const a = await Promise.all(e.map((o) => r(o))); return e.length > 1 ? a : a[0]; } else { const { map: a, displacementMap: o, normalMap: c, roughnessMap: s, metalnessMap: f, aoMap: i, alphaMap: p, matcap: l } = e; return { map: a ? await r(a) : null, displacementMap: o ? await r(o) : null, normalMap: c ? await r(c) : null, roughnessMap: s ? await r(s) : null, metalnessMap: f ? await r(f) : null, aoMap: i ? await r(i) : null, alphaMap: p ? await r(p) : null, matcap: l ? await r(l) : null }; } } const tt = (e, { renderer: n, camera: t, raycaster: r }) => { const a = k(() => n.value.domElement), { x: o, y: c } = Re({ target: a }), { width: s, height: f, top: i, left: p } = je(a), l = ({ x: y, y: M }) => { if (a.value) return { x: (y - p.value) / s.value * 2 - 1, y: -((M - i.value) / f.value) * 2 + 1 }; }, u = ({ x: y, y: M }) => { if (t.value) return r.value.setFromCamera(new xe(y, M), t.value), r.value.intersectObjects(e.value, !1); }, v = (y) => { const M = l({ x: (y == null ? void 0 : y.clientX) ?? o.value, y: (y == null ? void 0 : y.clientY) ?? c.value }); return M ? u(M) || [] : []; }, m = k(() => v()), g = L(), w = L(), P = (y, M) => { y.trigger({ event: M, intersects: v(M) }); }, A = (y) => { P(w, y); }; let _; const C = (y) => { var M; _ = (M = v(y)[0]) == null ? void 0 : M.object; }, b = (y) => { var M; y instanceof PointerEvent && _ === ((M = v(y)[0]) == null ? void 0 : M.object) && P(g, y); }, T = (y) => w.trigger({ event: y, intersects: [] }); return a.value.addEventListener("pointerup", b), a.value.addEventListener("pointerdown", C), a.value.addEventListener("pointermove", A), a.value.addEventListener("pointerleave", T), N(() => { a != null && a.value && (a.value.removeEventListener("pointerup", b), a.value.removeEventListener("pointerdown", C), a.value.removeEventListener("pointermove", A), a.value.removeEventListener("pointerleave", T)); }), { intersects: m, onClick: (y) => g.on(y).off, onPointerMove: (y) => w.on(y).off }; }; function wt() { const { logWarning: e } = h(); function n(r, a, o) { let c = null; return r.traverse((s) => { s[a] === o && (c = s); }), c || e(`Child with ${a} '${o}' not found.`), c; } function t(r, a) { return n(r, "name", a); } return { seek: n, seekByName: t }; } const rt = ({ scene: e, contextParts: n }) => { const t = ie({ click: /* @__PURE__ */ new Map(), pointerMove: /* @__PURE__ */ new Map(), pointerEnter: /* @__PURE__ */ new Map(), pointerLeave: /* @__PURE__ */ new Map() }), r = B(/* @__PURE__ */ new Set()), a = (u) => { r.value.add(u); }, o = (u) => { r.value.delete(u); }, c = (u) => { Object.values(t).forEach((v) => v.delete(u)), o(u); }, s = (u) => { const { onClick: v, onPointerMove: m, onPointerEnter: g, onPointerLeave: w } = u; v && t.click.set(u, v), m && t.pointerMove.set(u, m), g && t.pointerEnter.set(u, g), w && t.pointerLeave.set(u, w); }; e.userData.tres__registerAtPointerEventHandler = s, e.userData.tres__deregisterAtPointerEventHandler = c, e.userData.tres__registerBlockingObjectAtPointerEventHandler = a, e.userData.tres__deregisterBlockingObjectAtPointerEventHandler = o; const f = k( () => Ue( [ ...Array.from(r.value), ...Object.values(t).map((u) => Array.from(u.keys())).flat() ], ({ uuid: u }) => u ) ), { onClick: i, onPointerMove: p } = tt(f, n); i(({ intersects: u, event: v }) => { var m; u.length && ((m = t.click.get(u[0].object)) == null || m(u[0], v)); }); let l; return p(({ intersects: u, event: v }) => { var A, _, C, b; const m = (A = u == null ? void 0 : u[0]) == null ? void 0 : A.object, { pointerLeave: g, pointerEnter: w, pointerMove: P } = t; l && l !== m && ((_ = g.get(l)) == null || _(l, v)), m && (l !== m && ((C = w.get(m)) == null || C(u[0], v)), (b = P.get(m)) == null || b(u[0], v)), l = m || null; }), { registerObject: s, deregisterObject: c }; }, W = B({}), q = (e) => Object.assign(W.value, e); function nt({ scene: e, canvas: n, windowSize: t, disableRender: r, rendererOptions: a }) { const o = k( () => E(t) ? He() : Fe(E(n).parentElement) ), c = k(() => o.value.width.value), s = k(() => o.value.height.value), f = k(() => c.value / s.value), i = { height: s, width: c, aspectRatio: f }, p = O(e), { camera: l, cameras: u, registerCamera: v, deregisterCamera: m, setCameraActive: g } = ze({ sizes: i, scene: e }), { renderer: w } = Qe( { scene: e, canvas: n, options: a, contextParts: { sizes: i, camera: l }, disableRender: r } ), P = { sizes: i, scene: p, camera: l, cameras: ue(u), renderer: w, raycaster: O(new Oe()), controls: B(null), extend: q, registerCamera: v, setCameraActive: g, deregisterCamera: m }; return I("useTres", P), P; } function at() { const e = le("useTres"); if (!e) throw new Error("useTresContext must be used together with useTresContextProvider"); return e; } const Ct = at; let G = null, d = null; const { logError: ee } = h(), ot = { createElement(e, n, t, r) { var c, s; if (r || (r = {}), r.args || (r.args = []), e === "template" || Ve(e)) return null; let a = e.replace("Tres", ""), o; if (e === "primitive") { (r == null ? void 0 : r.object) === void 0 && ee("Tres primitives need a prop 'object'"); const f = r.object; a = f.type, o = Object.assign(f, { type: a, attach: r.attach, primitive: !0 }); } else { const f = W.value[a]; f || ee(`${a} is not defined on the THREE namespace. Use extend to add it to the catalog.`), o = new f(...r.args); } return o.isCamera && (r != null && r.position || o.position.set(3, 3, 3), r != null && r.lookAt || o.lookAt(0, 0, 0)), (r == null ? void 0 : r.attach) === void 0 && (o.isMaterial ? o.attach = "material" : o.isBufferGeometry && (o.attach = "geometry")), o.isObject3D && ((c = r == null ? void 0 : r.material) != null && c.isMaterial && (o.userData.tres__materialViaProp = !0), (s = r == null ? void 0 : r.geometry) != null && s.isBufferGeometry && (o.userData.tres__geometryViaProp = !0)), o.userData = { ...o.userData, tres__name: a }, o; }, insert(e, n) { var t, r, a, o, c, s, f, i, p, l; if (n && n.isScene && (d = n), (((t = e == null ? void 0 : e.__vnode) == null ? void 0 : t.type) === "TresGroup" || ((r = e == null ? void 0 : e.__vnode) == null ? void 0 : r.type) === "TresObject3D") && n === null && !((o = (a = e == null ? void 0 : e.__vnode) == null ? void 0 : a.ctx) != null && o.asyncResolved)) { G = e; return; } else n === null && ((c = e == null ? void 0 : e.__vnode) != null && c.type.includes("Controls") || (s = e == null ? void 0 : e.__vnode) != null && s.type.includes("Helper")) && (G = d); if (n || (n = G), e != null && e.isObject3D) { if (e != null && e.isCamera) { if (!(d != null && d.userData.tres__registerCamera)) throw "could not find tres__registerCamera on scene's userData"; (i = d == null ? void 0 : (f = d.userData).tres__registerCamera) == null || i.call(f, e); } if (e != null && e.onClick || e != null && e.onPointerMove || e != null && e.onPointerEnter || e != null && e.onPointerLeave) { if (!(d != null && d.userData.tres__registerAtPointerEventHandler)) throw "could not find tres__registerAtPointerEventHandler on scene's userData"; (l = d == null ? void 0 : (p = d.userData).tres__registerAtPointerEventHandler) == null || l.call(p, e); } } e != null && e.isObject3D && (n != null && n.isObject3D) ? (n.add(e), e.dispatchEvent({ type: "added" })) : e != null && e.isFog ? n.fog = e : typeof (e == null ? void 0 : e.attach) == "string" && (e.__previousAttach = e[n == null ? void 0 : n.attach], n && (n[e.attach] = e)); }, remove(e) { var n, t; if (e) { if (e.isObject3D) { const r = e, a = (i) => { var l, u; const p = i; i.userData.tres__materialViaProp || (l = p.material) == null || l.dispose(), i.userData.tres__geometryViaProp || (u = p.geometry) == null || u.dispose(); }, o = d == null ? void 0 : d.userData.tres__deregisterAtPointerEventHandler, c = d == null ? void 0 : d.userData.tres__deregisterBlockingObjectAtPointerEventHandler, s = (i) => { var p, l; if (!c) throw "could not find tres__deregisterBlockingObjectAtPointerEventHandler on scene's userData"; if ((l = d == null ? void 0 : (p = d.userData).tres__deregisterBlockingObjectAtPointerEventHandler) == null || l.call(p, i), !o) throw "could not find tres__deregisterAtPointerEventHandler on scene's userData"; (i != null && i.onClick || i != null && i.onPointerMove || i != null && i.onPointerEnter || i != null && i.onPointerLeave) && (o == null || o(i)); }, f = (i) => { const p = d == null ? void 0 : d.userData.tres__deregisterCamera; if (!p) throw "could not find tres__deregisterCamera on scene's userData"; i.isCamera && (p == null || p(i)); }; r.traverse((i) => { a(i), f(i), s == null || s(i); }), a(r), f(r), s == null || s(r); } (n = e.removeFromParent) == null || n.call(e), (t = e.dispose) == null || t.call(e); } }, patchProp(e, n, t, r) { var a, o, c, s; if (e) { let f = e, i = n; if (e.isObject3D && i === "blocks-pointer-events") { r || r === "" ? (o = d == null ? void 0 : (a = d.userData).tres__registerBlockingObjectAtPointerEventHandler) == null || o.call(a, e) : (s = d == null ? void 0 : (c = d.userData).tres__deregisterBlockingObjectAtPointerEventHandler) == null || s.call(c, e); return; } let p = S(i), l = f == null ? void 0 : f[p]; if (i === "args") { const v = e, m = t ?? [], g = r ?? [], w = e.userData.tres__name || e.type; w && m.length && !Ke(m, g) && (f = Object.assign(v, new W.value[w](...r))); return; } if (f.type === "BufferGeometry") { if (i === "args") return; f.setAttribute( S(i), new Le(...r) ); return; } if (i.includes("-") && l === void 0) { const v = i.split("-"); l = v.reduce((m, g) => m[S(g)], f), i = v.pop(), p = i.toLowerCase(), l != null && l.set || (f = v.reduce((m, g) => m[S(g)], f)); } let u = r; if (u === "" && (u = !0), Z(l)) { Array.isArray(u) ? e[p](...u) : e[p](u); return; } !(l != null && l.set) && !Z(l) ? f[p] = u : l.constructor === u.constructor && (l != null && l.copy) ? l == null || l.copy(u) : Array.isArray(u) ? l.set(...u) : !l.isColor && l.setScalar ? l.setScalar(u) : l.set(u); } }, parentNode(e) { return (e == null ? void 0 : e.parent) || null; }, createText: () => void 0, createComment: () => void 0, setText: () => void 0, setElementText: () => void 0, nextSibling: () => void 0, querySelector: () => void 0, setScopeId: () => void 0, cloneNode: () => void 0, insertStaticContent: () => void 0 }, { render: st } = ce(ot); q(ye); const it = ["data-scene"], ut = /* @__PURE__ */ U({ __name: "TresCanvas", props: { shadows: { type: Boolean, default: void 0 }, clearColor: {}, toneMapping: {}, shadowMapType: {}, useLegacyLights: { type: Boolean, default: void 0 }, outputColorSpace: {}, toneMappingExposure: {}, camera: {}, preset: {}, windowSize: { type: Boolean, default: void 0 }, disableRender: { type: Boolean, default: void 0 }, context: {}, precision: {}, alpha: { type: Boolean, default: void 0 }, premultipliedAlpha: { type: Boolean }, antialias: { type: Boolean, default: void 0 }, stencil: { type: Boolean, default: void 0 }, preserveDrawingBuffer: { type: Boolean, default: void 0 }, powerPreference: {}, depth: { type: Boolean, default: void 0 }, logarithmicDepthBuffer: { type: Boolean, default: void 0 }, failIfMajorPerformanceCaveat: { type: Boolean, default: void 0 } }, setup(e, { expose: n }) { var u; const t = e, { logWarning: r } = h(), a = B(), o = O(new Be()); ae(); const c = fe(), s = (u = J()) == null ? void 0 : u.appContext.app, f = (v) => U({ setup() { var g; const m = (g = J()) == null ? void 0 : g.appContext; return m && (m.app = s), I("useTres", v), I("extend", q), () => K(de, null, c != null && c.default ? c.default() : []); } }), i = (v) => { const m = f(v); st(K(m), o.value); }, p = k(() => t.disableRender), l = O(null); return n({ context: l }), pe(() => { const v = a; l.value = nt({ scene: o.value, canvas: v, windowSize: t.windowSize, disableRender: p, rendererOptions: t }), rt({ scene: o.value, contextParts: l.value }); const { registerCamera: m, camera: g, cameras: w, deregisterCamera: P } = l.value; i(l.value); const A = () => { const _ = new $( 45, window.innerWidth / window.innerHeight, 0.1, 1e3 ); _.position.set(3, 3, 3), _.lookAt(0, 0, 0), m(_); const C = D(() => { w.value.length >= 2 && (_.removeFromParent(), P(_), C == null || C()); }); }; te( () => t.camera, (_, C) => { _ && m(_), C && (C.removeFromParent(), P(C)); }, { immediate: !0 } ), g.value || (r( "No camera found. Creating a default perspective camera. To have full control over a camera, please add one to the scene." ), A()); }), (v, m) => (me(), ve("canvas", { ref_key: "canvas", ref: a, "data-scene": o.value.uuid, style: ge({ display: "block", width: "100%", height: "100%", position: v.windowSize ? "fixed" : "relative", top: 0, left: 0, pointerEvents: "auto", touchAction: "none" }) }, null, 12, it)); } }), lt = [ "TresCanvas", "TresLeches", "TresScene" ], ct = { template: { compilerOptions: { isCustomElement: (e) => e.startsWith("Tres") && !lt.includes(e) || e === "primitive" } } }, _t = ct, Pt = { install(e) { e.component("TresCanvas", ut); } }; export { ut as TresCanvas, W as catalogue, Pt as default, q as extend, vt as isProd, We as normalizeColor, gt as normalizeVectorFlexibleParam, _t as templateCompilerOptions, et as trasverseObjects, ze as useCamera, dt as useLoader, h as useLogger, rt as usePointerEventHandler, tt as useRaycaster, ae as useRenderLoop, Qe as useRenderer, wt as useSeek, yt as useTexture, Ct as useTres, at as useTresContext, nt as useTresContextProvider };