@yaelg/tresjs-core
Version:
Declarative ThreeJS using Vue Components
670 lines (669 loc) • 24.3 kB
JavaScript
/**
* 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
};