@needle-tools/engine
Version:
Needle Engine is a web-based runtime for 3D apps. It runs on your machine for development with great integrations into editors like Unity or Blender - and can be deployed onto any device! It is flexible, extensible and networking and XR are built-in.
1,364 lines (1,351 loc) • 1.84 MB
JavaScript
import { createLoaders as Zm, getRaycastMesh as pv, LODsManager as er, NEEDLE_progressive as Ve, addDracoAndKTX2Loaders as lS, configureLoader as cS, setKTX2TranscoderLocation as hS, setDracoDecoderLocation as dS } from "./gltf-progressive-BJ9OrddA.js";
import { Vector2 as Z, Vector3 as _, Vector4 as ye, Quaternion as V, PlaneGeometry as Pn, WebGLRenderer as Ur, PerspectiveCamera as de, OrthographicCamera as fu, Scene as Qi, Mesh as H, Texture as xe, Uniform$1 as qi, Color as re, ShaderMaterial as Xn, Box3 as Ut, ShadowMaterial as mv, Euler as ht, MeshStandardMaterial as mt, Box3Helper as uS, GridHelper as gv, Object3D as M, Material as be, Matrix3 as yv, Matrix4 as ee, Layers as ko, Ray as Is, MathUtils as ks, AxesHelper as Oi, MeshBasicMaterial as Se, DoubleSide as Ei, BufferGeometry as bn, Group as Os, CylinderGeometry as _v, SphereGeometry as pu, BoxGeometry as Ua, SpriteMaterial as fS, Sprite as pS, Shape as mS, ExtrudeGeometry as gS, Fog as bv, DirectionalLight as Wp, PointLight as Jm, TextureLoader as Er, EdgesGeometry as yS, LineSegments as vv, LineBasicMaterial as eg, Line as Na, BufferAttribute as gt, Raycaster as mu, Sphere as gu, ArrayCamera as _S, Plane as Rr, SkinnedMesh as vo, InterleavedBufferAttribute as wv, Skeleton as bS, Bone as vS, WebGLCubeRenderTarget as wS, CubeCamera as xS, AnimationClip as Mi, FileLoader as tg, PropertyBinding as $a, KeyframeTrack as SS, CubeUVReflectionMapping as Ls, LinearSRGBColorSpace as Ds, ShaderChunk as ei, DataTexture as ig, RGBAFormat as yu, EquirectangularReflectionMapping as Ms, SRGBColorSpace as js, Clock as CS, NeutralToneMapping as Wa, AgXToneMapping as _u, ACESFilmicToneMapping as bu, NoToneMapping as Td, PCFSoftShadowMap$1 as PS, BasicNodeLibrary as kS, WebGLRenderTarget as Qn, DepthTexture as xv, NearestFilter as Ad, LoopRepeat as OS, LoopOnce as Vp, AnimationMixer as ng, CompressedTexture as MS, FrontSide as Oo, Camera as ES, Frustum as Uy, AudioListener as RS, PositionalAudio as TS, AudioLoader as Hp, EventDispatcher as sg, BackSide as vu, MeshDepthMaterial as AS, CustomBlending as IS, MaxEquation as LS, AlwaysStencilFunc as DS, GreaterEqualStencilFunc as jS, NotEqualStencilFunc as BS, GreaterStencilFunc as FS, LessEqualStencilFunc as zS, EqualStencilFunc as US, LessStencilFunc as NS, NeverStencilFunc as Ny, InvertStencilOp as $S, DecrementWrapStencilOp as WS, IncrementWrapStencilOp as VS, DecrementStencilOp as HS, IncrementStencilOp as GS, ReplaceStencilOp as qS, ZeroStencilOp as XS, KeepStencilOp as QS, EquirectangularRefractionMapping as Sv, CubeTexture as Cv, AmbientLight as YS, HemisphereLight as KS, Loader as ZS, RawShaderMaterial as Pv, GLSL3 as JS, AlwaysDepth as eC, GreaterEqualDepth as tC, GreaterDepth as iC, LessEqualDepth as nC, LessDepth as sC, NotEqualDepth as oC, EqualDepth as rC, BatchedMesh as $y, LinearFilter as Id, UnsignedByteType as aC, MeshPhysicalMaterial as Wy, RingGeometry as lC, Line3 as cC, AdditiveBlending as kv, BoxHelper as hC, SpotLight as dC, DirectionalLightHelper as uC, CameraHelper as fC, LOD as pC, Triangle as mC, NormalBlending as gC, ReinhardToneMapping as og, LinearToneMapping as rg, HalfFloatType as Rf, VideoTexture as yC, CompressedCubeTexture as _C, CatmullRomCurve3 as bC, VectorKeyframeTrack as vC, QuaternionKeyframeTrack as wC, Audio as xC, ShaderLib as Ld, UniformsUtils as Ov, MirroredRepeatWrapping as Vy, MeshNormalMaterial as SC, AudioContext as CC, PMREMGenerator$1 as PC } from "./three.js";
import { GroundedSkybox as Va, Font as kC, TextGeometry as OC, FontLoader as MC, GLTFLoader as Bs, TransformControlsGizmo as Mv, EXRLoader as ag, RGBELoader as Ev, Stats as EC, nodeFrame as Hy, OrbitControls as RC, PositionalAudioHelper as TC, HorizontalBlurShader as AC, VerticalBlurShader as IC, GLTFExporter as Rv, strToU8 as Tv, zipSync as LC, XRControllerModelFactory as DC, XRHandMeshModel as jC, Line2 as BC, LineGeometry as FC, LineMaterial as zC, TransformControls as UC, InteractiveGroup as NC, HTMLMesh as $C, VertexNormalsHelper as WC, OBJLoader as lg, FBXLoader as Av, mergeVertices as VC } from "./three-examples.js";
import { fetchProfile as HC, MotionController as GC, $70d766613f57b014$export$2e2bcd8739ae039 as Gy, ByteBuffer as qC, v5 as qy, md5 as Xy, SIZE_PREFIX_LENGTH as Iv, Builder as cg, createNoise4D as XC, Matrix4 as Tf, BatchedParticleRenderer as QC, ParticleSystem as YC, RenderMode as ms, ConstantColor as KC, Vector4 as ZC, ConstantValue as JC, TrailParticle as Qy, WorkerBase as e1, MeshBVH as t1 } from "./vendor-CQMI3jTS.js";
import { __webpack_exports__default as Pe, __webpack_exports__Text as Lv, __webpack_exports__Block as Dv, __webpack_exports__update as i1, SimpleStateBehavior as n1, __webpack_exports__Inline as Af, __webpack_exports__FontLibrary as Yy, ThreeMeshUI as Ky } from "./three-mesh-ui-B-lqrZWj.js";
import { EffectAttribute as s1 } from "./postprocessing-BUS23YkY.js";
const If = /* @__PURE__ */ new Map();
function Yi(s = globalThis.location?.hostname) {
if (If.has(s)) return If.get(s);
const e = /(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})|localhost/.test(s);
return If.set(s, e), e === !0;
}
function o1() {
return window.location.hostname.includes("glitch.me");
}
const Zy = typeof window !== void 0 ? window.location.search.includes("debugcontext") : !1;
var ue = /* @__PURE__ */ ((s) => (s.ContextRegistered = "ContextRegistered", s.ContextCreationStart = "ContextCreationStart", s.ContextCreated = "ContextCreated", s.ContextFirstFrameRendered = "ContextFirstFrameRendered", s.ContextDestroying = "ContextDestroying", s.ContextDestroyed = "ContextDestroyed", s.MissingCamera = "MissingCamera", s.ContextClearing = "ContextClearing", s.ContextCleared = "ContextCleared", s))(ue || {});
class pe {
/** The currently active (rendering) Needle Engine context */
static get Current() {
return globalThis["NeedleEngine.Context.Current"];
}
/** @internal */
static set Current(e) {
globalThis["NeedleEngine.Context.Current"] = e;
}
/** Returns the array of all registered Needle Engine contexts. Do not modify */
static get All() {
return this.Registered;
}
/** All currently registered Needle Engine contexts. Do not modify */
static Registered = [];
/** @internal Internal use only */
static register(e) {
this.Registered.indexOf(e) === -1 && (Zy && console.warn("Registering context"), this.Registered.push(e), this.dispatchCallback("ContextRegistered", e));
}
/** @internal Internal use only */
static unregister(e) {
const t = this.Registered.indexOf(e);
t !== -1 && (Zy && console.warn("Unregistering context"), this.Registered.splice(t, 1));
}
static _callbacks = {};
/**
* Register a callback to be called when the given event occurs
*/
static registerCallback(e, t) {
this._callbacks[e] || (this._callbacks[e] = []), this._callbacks[e].push(t);
}
/** Unregister a callback */
static unregisterCallback(e, t) {
if (!this._callbacks[e]) return;
const i = this._callbacks[e].indexOf(t);
i !== -1 && this._callbacks[e].splice(i, 1);
}
/** @internal */
static dispatchCallback(e, t, i) {
if (!this._callbacks[e]) return !0;
const n = { event: e, context: t };
if (i)
for (const r in i)
n[r] = i[r];
const o = new Array();
return this._callbacks[e].forEach((r) => {
const a = r(n);
a instanceof Promise && o.push(a);
}), Promise.all(o);
}
/**
* Register a callback to be called when a context is created
*/
static addContextCreatedCallback(e) {
this.registerCallback("ContextCreated", e);
}
/**
* Register a callback to be called when a context is registered
*/
static addContextDestroyedCallback(e) {
this.registerCallback("ContextDestroyed", e);
}
}
const r1 = () => (s) => s;
function o2(s) {
return r1()(s);
}
function r2() {
return !!x("debug");
}
class Ki {
_factory;
_cache = [];
_maxSize;
_index = 0;
constructor(e, t) {
this._factory = e, this._maxSize = t;
}
get() {
const e = this._index % this._maxSize;
return this._index++, this._cache.length <= e && (this._cache[e] = this._factory()), this._cache[e];
}
}
let fr = !1;
const Gp = new Array();
typeof window < "u" && setTimeout(() => {
if (fr) {
const s = {}, e = new URL(window.location.href), t = new URL(e);
t.searchParams.append("console", "");
const i = t.toString().replace(/=$|=(?=&)/g, "");
for (const o of Gp) {
const r = new URL(e);
r.searchParams.append(o, ""), s[o] = r.toString().replace(/=$|=(?=&)/g, "");
}
console.log(
`🌵 ?help: Debug Options for Needle Engine.
Append any of these parameters to the URL to enable specific debug options.
Example: ${i} will show an onscreen console window.`
);
const n = fr === !0 ? "" : ` (containing "${fr}")`;
console.group("Available URL parameters:" + n);
for (const o of Object.keys(s).sort())
typeof fr == "string" && !o.toLowerCase().includes(fr.toLowerCase()) || (console.groupCollapsed(o), console.log("Reload with this flag enabled:"), console.log(s[o]), console.groupEnd());
console.groupEnd();
}
}, 100);
function wu() {
return new URLSearchParams(globalThis.location?.search);
}
function x(s) {
fr && !Gp.includes(s) && Gp.push(s);
const e = wu();
if (e.has(s)) {
const t = e.get(s);
if (t) {
const i = Number(t);
return isNaN(i) ? t : i;
} else return !0;
}
return !1;
}
fr = x("help");
function a2(s, e) {
const t = wu();
t.has(s) ? t.set(s, e) : t.append(s, e), document.location.search = t.toString();
}
function Dd(s, e, t = !0) {
const i = wu();
i.has(s) ? e === null ? i.delete(s) : i.set(s, e) : e !== null && i.append(s, e), t ? a1(s, i) : jv(s, i);
}
function Jy(s, e, t) {
s.has(e) ? s.set(e, t.toString()) : s.append(e, t.toString());
}
function a1(s, e, t) {
window.history.pushState(t, s, "?" + e.toString());
}
function jv(s, e, t) {
window.history.replaceState(t, s, "?" + e.toString());
}
function l2(s) {
for (var e = "", t = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", i = t.length, n = 0; n < s; n++)
e += t.charAt(Math.floor(Math.random() * i));
return e;
}
function c2(s, e) {
return Math.floor(Math.random() * (e - s + 1)) + s;
}
const e_ = ["smol", "tiny", "giant", "interesting", "smart", "bright", "dull", "extreme", "beautiful", "pretty", "dark", "epic", "salty", "silly", "funny", "lame", "lazy", "loud", "lucky", "mad", "mean", "mighty", "mysterious", "nasty", "odd", "old", "powerful", "quiet", "rapid", "scary", "shiny", "shy", "silly", "smooth", "sour", "spicy", "stupid", "sweet", "tasty", "terrible", "ugly", "unusual", "vast", "wet", "wild", "witty", "wrong", "zany", "zealous", "zippy", "zombie", "zorro"], t_ = ["cat", "dog", "mouse", "pig", "cow", "horse", "sheep", "chicken", "duck", "goat", "panda", "tiger", "lion", "elephant", "monkey", "bird", "fish", "snake", "frog", "turtle", "hamster", "penguin", "kangaroo", "whale", "dolphin", "crocodile", "snail", "ant", "bee", "beetle", "butterfly", "dragon", "eagle", "fish", "giraffe", "lizard", "panda", "penguin", "rabbit", "snake", "spider", "tiger", "zebra"];
function l1() {
const s = e_[Math.floor(Math.random() * e_.length)], e = t_[Math.floor(Math.random() * t_.length)];
return s + "_" + e;
}
function c1(s) {
return s = s.replace(/[^a-z0-9áéÃóúñü \.,_-]/gim, ""), s.trim();
}
function Ec(s, e, t = !0, i = !1) {
if (e == null) return null;
if (e.userData && e.userData.guid === s) return e;
if (e.guid == s) return e;
if (i && e.userData?.components) {
for (const n of e.userData.components)
if (n.guid === s) return n;
}
if (t) {
if (e.scenes)
for (const n in e.scenes) {
const o = e.scenes[n], r = Ec(s, o, t, i);
if (r) return r;
}
if (e.children)
for (const n in e.children) {
const o = e.children[n], r = Ec(s, o, t, i);
if (r) return r;
}
}
}
function xu(s, e) {
if (s != null && typeof s == "object") {
let t;
Array.isArray(s) ? t = [] : (t = Object.create(s), Object.assign(t, s));
for (const i of Object.keys(s)) {
const n = s[i];
e && !e(s, i, n) ? t[i] = n : n?.clone !== void 0 && typeof n.clone == "function" ? t[i] = n.clone() : t[i] = xu(n, e);
}
return t;
}
return s;
}
function Mo(s) {
return new Promise((e, t) => {
setTimeout(e, s);
});
}
function Su(s, e) {
if (s <= 0) return Promise.resolve();
if (e || (e = pe.Current), !e) return Promise.reject("No context");
const t = e.time.frameCount + s;
return new Promise((i, n) => {
if (!e) return n("No context");
const o = () => {
e.time.frameCount >= t && (e.pre_update_callbacks.splice(e.pre_update_callbacks.indexOf(o), 1), i());
};
e.pre_update_callbacks.push(o);
});
}
const kh = x("debugresolveurl"), h1 = "rel:";
function h2(s, e) {
return To(s, e);
}
function To(s, e) {
if (e === void 0)
return kh && console.warn("getPath: uri is undefined, returning uri", e), e;
if (e.startsWith("./"))
return e;
if (e.startsWith("http"))
return kh && console.warn("getPath: uri is absolute, returning uri", e), e;
if (s === void 0)
return kh && console.warn("getPath: source is undefined, returning uri", e), e;
e.startsWith(h1) && (e = e.substring(4));
const t = s.lastIndexOf("/");
if (t >= 0) {
const i = s.substring(0, t + 1);
for (; i.endsWith("/") && e.startsWith("/"); ) e = e.substring(1);
const n = i + e;
return kh && console.log("source:", s, `changed uri
from`, e, `
to `, n, `
basePath: ` + i), n;
}
return e;
}
function d1(s) {
if (s)
return s = s.trim(), s = s.split("?")[0]?.split("#")[0], s;
}
class u1 {
subscribeWrite(e) {
this.writeCallbacks.push(e);
}
unsubscribeWrite(e) {
const t = this.writeCallbacks.indexOf(e);
t !== -1 && this.writeCallbacks.splice(t, 1);
}
writeCallbacks = [];
constructor(e, t) {
this._object = e, this._prop = t, this._wrapperProp = /* @__PURE__ */ Symbol("$" + t), this.apply();
}
_applied = !1;
_object;
_prop;
_wrapperProp;
apply() {
if (this._applied || !this._object) return;
const e = this._object, t = this._prop;
if (e[t] === void 0) return;
this._applied = !0, e[this._wrapperProp] !== void 0 && console.warn("Watcher is being applied to an object that already has a wrapper property. This is not (yet) supported");
const i = e[t];
e[this._wrapperProp] = i, Object.defineProperty(e, t, {
get: () => e[this._wrapperProp],
set: (r) => {
e[this._wrapperProp] = r;
for (const a of this.writeCallbacks)
a(r, this._prop);
}
});
}
revoke() {
if (!this._applied || !this._object) return;
this._applied = !1;
const e = this._object, t = this._prop;
Reflect.deleteProperty(e, t);
const i = e[this._wrapperProp];
e[t] = i, Reflect.deleteProperty(e, this._wrapperProp);
}
dispose() {
this.revoke(), this.writeCallbacks.length = 0, this._object = null;
}
}
class wo {
_watches = [];
constructor(e, t) {
if (Array.isArray(t))
for (const i of t)
this._watches.push(new wo(e, i));
else
this._watches.push(new u1(e, t));
}
subscribeWrite(e) {
for (const t of this._watches)
t.subscribeWrite(e);
}
unsubscribeWrite(e) {
for (const t of this._watches)
t.unsubscribeWrite(e);
}
apply() {
for (const e of this._watches)
e.apply();
}
revoke() {
for (const e of this._watches)
e.revoke();
}
dispose() {
for (const e of this._watches)
e.dispose();
this._watches.length = 0;
}
}
const ua = /* @__PURE__ */ Symbol("needle:watches");
function hg(s, e) {
if (!s[ua])
if (s instanceof Z)
s[ua] = new wo(s, ["x", "y"]);
else if (s instanceof _)
s[ua] = new wo(s, ["x", "y", "z"]);
else if (s instanceof ye || s instanceof V)
s[ua] = new wo(s, ["x", "y", "z", "w"]);
else
return !1;
return s[ua].subscribeWrite(e), !0;
}
function Bv(s, e) {
if (!s) return;
const t = s[ua];
t && t.unsubscribeWrite(e);
}
var D;
((s) => {
let e;
function t() {
if (e !== void 0) return e;
const J = window.navigator.userAgent, Oe = /Windows|MacOS|Mac OS/.test(J), ai = /Windows NT/.test(J) && /Edg/.test(J) && !/Win64/.test(J);
return e = Oe && !ai && !T();
}
s.isDesktop = t;
let i;
function n() {
return i !== void 0 ? i : typeof window.orientation < "u" || navigator.userAgent.indexOf("IEMobile") !== -1 ? i = !0 : i = /iPhone|iPad|iPod|Android|IEMobile/i.test(navigator.userAgent);
}
s.isMobileDevice = n;
function o() {
return a();
}
s.isIPad = o;
let r;
function a() {
if (r !== void 0) return r;
const J = navigator.userAgent.toLowerCase();
return r = /iPad/.test(navigator.userAgent) || J.includes("macintosh") && "ontouchend" in document;
}
s.isiPad = a;
let l;
function c() {
return l !== void 0 ? l : l = /Android/.test(navigator.userAgent);
}
s.isAndroidDevice = c;
let h;
function d() {
return h !== void 0 ? h : h = /WebXRViewer\//i.test(navigator.userAgent);
}
s.isMozillaXR = d;
let f;
function p() {
return f !== void 0 ? f : f = /NeedleAppClip\//i.test(navigator.userAgent);
}
s.isNeedleAppClip = p;
let g;
function y() {
if (g !== void 0) return g;
if (T() || a()) return g = !1;
const J = navigator.userAgent.toLowerCase();
return navigator.userAgentData ? g = navigator.userAgentData.platform === "macOS" : g = J.includes("mac os x") || J.includes("macintosh");
}
s.isMacOS = y;
let m;
function w() {
return m !== void 0 ? m : m = a() && "xr" in navigator && G();
}
s.isVisionOS = w;
let b;
const v = ["iPad Simulator", "iPhone Simulator", "iPod Simulator", "iPad", "iPhone", "iPod"];
function T() {
return b !== void 0 ? b : b = v.includes(navigator.platform) || navigator.userAgent.includes("Mac") && "ontouchend" in document;
}
s.isiOS = T;
let k;
function E() {
return k !== void 0 || (k = /^((?!chrome|android).)*safari/i.test(navigator.userAgent)), k;
}
s.isSafari = E;
let I;
function j() {
return I !== void 0 ? I : I = navigator.userAgent.includes("OculusBrowser");
}
s.isQuest = j;
let B;
function G() {
return B !== void 0 || (B = document.createElement("a").relList.supports("ar")), B;
}
s.supportsQuickLookAR = G;
async function X() {
try {
return (await navigator.permissions.query({ name: "microphone" })).state !== "denied";
} catch (J) {
return console.error("Error querying `microphone` permissions.", J), !1;
}
}
s.microphonePermissionsGranted = X;
let O;
function W() {
if (O !== void 0) return O;
const J = navigator.userAgent.match(/iPhone OS (\d+_\d+)/);
if (J && (O = J[1].replace("_", ".")), !O) {
const Oe = navigator.userAgent.match(/(?:\(Macintosh;|iPhone;|iPad;).*Version\/(\d+\.\d+)/);
Oe && (O = Oe[1]);
}
return O || (O = null), O;
}
s.getiOSVersion = W;
let q;
function se() {
if (q !== void 0) return q;
const J = navigator.userAgent.match(/(?:CriOS|Chrome)\/(\d+\.\d+\.\d+\.\d+)/);
return J ? q = J[1].replace("_", ".") : q = null, q;
}
s.getChromeVersion = se;
let oe;
function fe() {
if (oe !== void 0) return oe;
const J = navigator.userAgent.match(/Version\/(\d+\.\d+)/);
return J && E() ? oe = J[1] : oe = null, oe;
}
s.getSafariVersion = fe;
})(D || (D = {}));
function d2() {
return D.isDesktop();
}
function u2() {
return D.isMobileDevice();
}
function f2() {
return D.isiPad();
}
function p2() {
return D.isiPad();
}
function m2() {
return D.isAndroidDevice();
}
function g2() {
return D.isMozillaXR();
}
function y2() {
return D.isMacOS();
}
function _2() {
return D.isiOS();
}
function b2() {
return D.isSafari();
}
function v2() {
return D.isQuest();
}
async function w2() {
return D.microphonePermissionsGranted();
}
const go = /* @__PURE__ */ new WeakMap();
function Fv(s, e, t) {
if (!go.get(s)) {
const n = new MutationObserver((o) => {
f1(s, o);
});
go.set(s, {
observer: n,
attributeChangedListeners: /* @__PURE__ */ new Map()
}), n.observe(s, { attributes: !0 });
}
const i = go.get(s).attributeChangedListeners;
return i.has(e) || i.set(e, []), i.get(e).push(t), () => {
zv(s, e, t);
};
}
function zv(s, e, t) {
if (!go.get(s)) return;
const i = go.get(s).attributeChangedListeners;
if (!i.has(e)) return;
const n = i.get(e), o = n.indexOf(t);
o !== -1 && (n.splice(o, 1), n.length <= 0 && (i.delete(e), go.get(s)?.observer.disconnect(), go.delete(s)));
}
function f1(s, e) {
const t = go.get(s).attributeChangedListeners;
for (const i of e)
if (i.type === "attributes") {
const n = i.attributeName, o = s.getAttribute(n);
if (t.has(n))
for (const r of t.get(n))
r(o);
}
}
class i_ {
reason;
constructor(e) {
this.reason = e;
}
}
async function Uv(s) {
const e = await Promise.allSettled(s).catch((n) => [
new i_(n.message)
]);
let t = !1;
const i = e.map((n) => "value" in n ? n.value : (t = !0, new i_(n.reason)));
return {
anyFailed: t,
results: i
};
}
const p1 = x("debugdebug");
let dg = !1;
(x("noerrors") || x("nooverlaymessages")) && (dg = !0);
const Lf = "needle_engine_global_error_container";
var Xi = /* @__PURE__ */ ((s) => (s[s.Log = 0] = "Log", s[s.Warn = 1] = "Warn", s[s.Error = 2] = "Error", s))(Xi || {});
function Nv() {
return Wv;
}
const qp = new Array();
function m1(s) {
qp.push(s);
}
let Df = !1;
function g1(...s) {
if (!Df) {
Df = !0;
try {
for (let e = 0; e < qp.length; e++)
qp[e](...s);
} catch (e) {
console.error(e);
}
Df = !1;
}
}
const $v = console.error, y1 = function(...s) {
$v.apply(console, s), v1(s), yr(2, s, {}), b1(...s);
};
function _1(s) {
dg = !s, s ? console.error = y1 : console.error = $v;
}
function x2(s) {
return _1(s);
}
let Wv = 0;
function b1(...s) {
Wv += 1, g1(...s);
}
function v1(s) {
if (Array.isArray(s))
for (let e = 0; e < s.length; e++) {
const t = s[e];
typeof t == "string" && t.startsWith("THREE.PropertyBinding: Trying to update node for track:") && (s[e] = "Some animated objects couldn't be found: see console for details");
}
}
const n_ = /* @__PURE__ */ new Set();
function yr(s, e, t = {}, i, n) {
if (dg) return;
if (t.once === !0) {
let a = "";
if (Array.isArray(e))
for (let l = 0; l < e.length; l++) {
let c = e[l];
c instanceof Error && (c = c.message), typeof c != "object" && (l > 0 && (a += " "), a += c);
}
else typeof e == "string" && (a = e);
if (n_.has(a)) return;
n_.add(a);
}
const o = pe.Current;
let r = o?.domElement ?? document.querySelector("needle-engine");
if (o?.isInAR && (r = o.arOverlayElement), !!r) {
if (Array.isArray(e)) {
let a = "";
for (let l = 0; l < e.length; l++) {
let c = e[l];
c instanceof Error && (c = c.message), typeof c != "object" && (l > 0 && (a += " "), a += c);
}
e = a;
}
!e || e.length <= 0 || w1(s, r, e, t);
}
}
const wa = /* @__PURE__ */ new Map(), s_ = 0.2;
function w1(s, e, t, i = {}) {
if (t == null) return;
const n = S1(e);
if (n.childElementCount >= 20) {
const c = n.lastElementChild;
o_(c);
}
t.length > 400 && (t = t.substring(0, 400) + "...");
const o = i.key ?? t;
if (wa.has(o)) {
wa.get(o)?.update(t, i);
return;
}
const r = C1(s, t);
n.prepend(r);
const a = () => {
wa.delete(o), o_(r);
};
let l = setTimeout(a, Math.max(s_, i.duration ?? 10) * 1e3);
wa.set(o, {
update: (c, h) => {
c.length > 400 && (c = c.substring(0, 400) + "..."), r.innerHTML = c, h.duration && (clearTimeout(l), l = setTimeout(a, Math.max(s_, h.duration) * 1e3));
},
removeFunction: a
});
}
function S2() {
p1 && console.log("Clearing messages");
for (const s of wa.values())
s?.removeFunction.call(s);
wa.clear();
}
const x1 = `
@import url('https://fonts.googleapis.com/css2?family=Roboto+Flex:opsz,wght@8..144,100..1000&display=swap');
div[data-needle_engine_debug_overlay] {
font-family: 'Roboto Flex', sans-serif;
font-weight: 400;
font-size: 16px;
}
div[data-needle_engine_debug_overlay] strong {
font-weight: 700;
}
div[data-needle_engine_debug_overlay] a {
color: white;
text-decoration: none;
border-bottom: 1px solid rgba(255, 255, 255, 0.3);
}
div[data-needle_engine_debug_overlay] a:hover {
text-decoration: none;
border: none;
}
div[data-needle_engine_debug_overlay] .log strong {
color: rgba(200,200,200,.9);
}
div[data-needle_engine_debug_overlay] .warn strong {
color: rgba(255,255,230, 1);
}
div[data-needle_engine_debug_overlay] .error strong {
color: rgba(255,100,120, 1);
}
`;
function S1(s) {
globalThis[Lf] || (globalThis[Lf] = /* @__PURE__ */ new Map());
const e = globalThis[Lf];
if (e.has(s))
return e.get(s);
{
const t = document.createElement("div");
e.set(s, t), t.setAttribute("data-needle_engine_debug_overlay", ""), t.classList.add("debug-container"), t.style.cssText = `
position: absolute;
top: 0;
right: 5px;
padding-top: env(safe-area-inset-top, 0px);
max-width: 70%;
max-height: calc(100% - 105px);
z-index: 100000;
pointer-events: scroll;
display: flex;
align-items: end;
flex-direction: column;
color: white;
overflow: auto;
word-break: break-word;
`, D.isNeedleAppClip() && (t.style.left = "5px", t.style.right = "unset");
const i = document.querySelector('meta[name="viewport"]');
i && !i.getAttribute("content")?.includes("viewport-fit=") && i.setAttribute("content", i.getAttribute("content") + ",viewport-fit=cover"), s.shadowRoot ? s.shadowRoot.appendChild(t) : s.appendChild(t);
const n = document.createElement("style");
return n.innerHTML = x1, t.appendChild(n), t;
}
}
const Vv = /* @__PURE__ */ Symbol("logtype"), jd = /* @__PURE__ */ new Map();
function o_(s) {
s.remove();
const e = s[Vv], t = jd.get(e) ?? [];
t.push(s), jd.set(e, t);
}
function C1(s, e) {
if (jd.has(s)) {
const i = jd.get(s);
if (i.length > 0) {
const n = i.pop();
return n.innerHTML = e, n;
}
}
const t = document.createElement("div");
switch (t.setAttribute("data-id", "__needle_engine_debug_overlay"), t.style.marginRight = "5px", t.style.padding = ".5em", t.style.backgroundColor = "rgba(0,0,0,.9)", t.style.marginTop = "5px", t.style.marginBottom = "3px", t.style.borderRadius = "8px", t.style.pointerEvents = "all", t.style.userSelect = "text", t.style.maxWidth = "250px", t.style.whiteSpace = "pre-wrap", t.style["backdrop-filter"] = "blur(10px)", t.style["-webkit-backdrop-filter"] = "blur(10px)", t.style.backgroundColor = "rgba(20,20,20,.8)", t.style.boxShadow = "inset 0 0 80px rgba(0,0,0,.2), 0 0 5px rgba(0,0,0,.2)", t.style.border = "1px solid rgba(160,160,160,.2)", t[Vv] = s, s) {
case 0:
t.classList.add("log"), t.style.color = "rgba(200,200,200,.7)", t.style.backgroundColor = "rgba(40,40,40,.7)";
break;
case 1:
t.classList.add("warn"), t.style.color = "rgb(255, 255, 150)", t.style.backgroundColor = "rgba(50,50,20,.8)";
break;
case 2:
t.classList.add("error"), t.style.color = "rgb(255, 50, 50", t.style.backgroundColor = "rgba(50,20,20,.8)";
break;
}
return t.title = "Open the browser console (F12) for more information", t.innerHTML = e, t;
}
class P1 {
random(e, t) {
return Array.isArray(e) ? e.length <= 0 ? null : e[Math.floor(Math.random() * e.length)] : e !== void 0 && t !== void 0 ? Math.random() * (t - e) + e : Math.random();
}
/**
* Fills a Vector3 with random values.
* @param target Vector3 to fill with random values
* @param min Minimum value for each component
* @param max Maximum value for each component
*/
randomVector3(e, t = 0, i = 1) {
e.x = this.random(t, i), e.y = this.random(t, i), e.z = this.random(t, i);
}
/**
* Clamps a value between min and max.
* @param value Value to clamp
* @param min Minimum bound
* @param max Maximum bound
* @returns Clamped value
*/
clamp(e, t, i) {
return e < t ? t : e > i ? i : e;
}
/**
* Clamps a value between 0 and 1.
* @param value Value to clamp
* @returns Value clamped to [0, 1]
*/
clamp01(e) {
return this.clamp(e, 0, 1);
}
/**
* Linearly interpolates between two values.
* @param value1 Start value (returned when t=0)
* @param value2 End value (returned when t=1)
* @param t Interpolation factor, clamped to [0, 1]
* @returns Interpolated value
*/
lerp(e, t, i) {
return i = i < 0 ? 0 : i, i = i > 1 ? 1 : i, e + (t - e) * i;
}
/**
* Calculates the linear interpolation parameter that produces the given value.
* Inverse of lerp: if `lerp(a, b, t) = v`, then `inverseLerp(a, b, v) = t`
* @param value1 Start value
* @param value2 End value
* @param t The value to find the parameter for
* @returns The interpolation parameter (may be outside [0,1] if t is outside [value1, value2])
*/
inverseLerp(e, t, i) {
return (i - e) / (t - e);
}
/**
* Remaps a value from one range to another.
* @param value The value to remap.
* @param min1 The minimum value of the current range.
* @param max1 The maximum value of the current range.
* @param min2 The minimum value of the target range.
* @param max2 The maximum value of the target range.
*/
remap(e, t, i, n, o) {
return n + (o - n) * (e - t) / (i - t);
}
/**
* Moves a value towards a target by a maximum step amount.
* Useful for smooth following or gradual value changes.
* @param value1 Current value
* @param value2 Target value
* @param amount Maximum step to move (positive moves toward target)
* @returns New value moved toward target, never overshooting
*/
moveTowards(e, t, i) {
return e += i, (i < 0 && e < t || i > 0 && e > t) && (e = t), e;
}
Rad2Deg = 180 / Math.PI;
Deg2Rad = Math.PI / 180;
Epsilon = 1e-5;
/**
* Converts radians to degrees
*/
toDegrees(e) {
return e * 180 / Math.PI;
}
/**
* Converts degrees to radians
*/
toRadians(e) {
return e * Math.PI / 180;
}
tan(e) {
return Math.tan(e);
}
gammaToLinear(e) {
return Math.pow(e, 2.2);
}
linearToGamma(e) {
return Math.pow(e, 1 / 2.2);
}
/**
* Checks if two vectors are approximately equal within epsilon tolerance.
* Works with Vector2, Vector3, Vector4, and Quaternion.
* @param v1 First vector
* @param v2 Second vector
* @param epsilon Tolerance for comparison (default: Number.EPSILON)
* @returns True if all components are within epsilon of each other
*/
approximately(e, t, i = Number.EPSILON) {
for (const n of k1) {
const o = e[n], r = t[n];
if (o === void 0 || r === void 0) break;
if (Math.abs(o - r) > i)
return !1;
}
return !0;
}
/**
* Easing function: slow start, fast middle, slow end (cubic).
* @param x Input value from 0 to 1
* @returns Eased value from 0 to 1
*/
easeInOutCubic(e) {
return e < 0.5 ? 4 * e * e * e : 1 - Math.pow(-2 * e + 2, 3) / 2;
}
}
const k1 = ["x", "y", "z", "w"], F = new P1();
class r_ {
y;
s;
alpha = 0;
constructor(e) {
this.setAlpha(e), this.y = null, this.s = null;
}
setAlpha(e) {
if (e <= 0 || e > 1)
throw new Error();
this.alpha = e;
}
filter(e, t) {
t && this.setAlpha(t);
let i;
return this.y ? i = this.alpha * e + (1 - this.alpha) * this.s : i = e, this.y = e, this.s = i, i;
}
lastValue() {
return this.y;
}
reset(e) {
this.y = e, this.s = e;
}
}
class jf {
/**
* An estimate of the frequency in Hz of the signal (> 0), if timestamps are not available.
*/
freq;
/**
* Min cutoff frequency in Hz (> 0). Lower values allow to remove more jitter.
*/
minCutOff;
/**
* Parameter to reduce latency (> 0). Higher values make the filter react faster to changes.
*/
beta;
/**
* Used to filter the derivates. 1 Hz by default. Change this parameter if you know what you are doing.
*/
dCutOff;
/**
* The low-pass filter for the signal.
*/
x;
/**
* The low-pass filter for the derivates.
*/
dx;
/**
* The last time the filter was called.
*/
lasttime;
/** Create a new OneEuroFilter
* @param freq - An estimate of the frequency in Hz of the signal (> 0), if timestamps are not available.
* @param minCutOff - Min cutoff frequency in Hz (> 0). Lower values allow to remove more jitter.
* @param beta - Parameter to reduce latency (> 0). Higher values make the filter react faster to changes.
* @param dCutOff - Used to filter the derivates. 1 Hz by default. Change this parameter if you know what you are doing.
*/
constructor(e, t = 1, i = 0, n = 1) {
if (e <= 0 || t <= 0 || n <= 0)
throw new Error();
this.freq = e, this.minCutOff = t, this.beta = i, this.dCutOff = n, this.x = new r_(this.alpha(this.minCutOff)), this.dx = new r_(this.alpha(this.dCutOff)), this.lasttime = null;
}
alpha(e) {
const t = 1 / this.freq;
return 1 / (1 + 1 / (2 * Math.PI * e) / t);
}
/** Filter your value: call with your value and the current timestamp (e.g. from this.context.time.time) */
filter(e, t = null) {
this.lasttime && t && (this.freq = 1 / (t - this.lasttime)), this.lasttime = t;
const i = this.x.lastValue(), n = i ? (e - i) * this.freq : 0, o = this.dx.filter(n, this.alpha(this.dCutOff)), r = this.minCutOff + this.beta * Math.abs(o);
return this.x.filter(e, this.alpha(r));
}
reset(e) {
e != null && this.x.reset(e), this.x.alpha = this.alpha(this.minCutOff), this.dx.alpha = this.alpha(this.dCutOff), this.lasttime = null;
}
}
class Hv {
x;
y;
z;
/** Create a new OneEuroFilter
* @param freq - An estimate of the frequency in Hz of the signal (> 0), if timestamps are not available.
* @param minCutOff - Min cutoff frequency in Hz (> 0). Lower values allow to remove more jitter.
* @param beta - Parameter to reduce latency (> 0). Higher values make the filter react faster to changes.
* @param dCutOff - Used to filter the derivates. 1 Hz by default. Change this parameter if you know what you are doing.
*/
constructor(e, t = 1, i = 0, n = 1) {
this.x = new jf(e, t, i, n), this.y = new jf(e, t, i, n), this.z = new jf(e, t, i, n);
}
filter(e, t, i = null) {
t.x = this.x.filter(e.x, i), t.y = this.y.filter(e.y, i), t.z = this.z.filter(e.z, i);
}
reset(e) {
this.x.reset(e?.x), this.y.reset(e?.y), this.z.reset(e?.z);
}
}
const hd = "needle:cameraController";
function O1(s) {
return s[hd];
}
function a_(s, e, t) {
t ? s[hd] = e : s[hd] === e && (s[hd] = null);
}
const Xp = "needle:autofit";
function M1(s) {
return s[Xp] === void 0 ? !0 : s[Xp] !== !1;
}
function Qp(s, e) {
s[Xp] = e;
}
let an;
const E1 = { x: 0, y: 0, width: 0, height: 0 }, R1 = x("debugfocusrect");
function T1(s, e, t, i, n) {
s instanceof Element && (R1 && s instanceof HTMLElement && (s.style.outline = "2px dashed rgba(255, 150, 0, .8)"), s = s.getBoundingClientRect()), an = n.domElement.getBoundingClientRect();
const o = E1;
o.x = s.x, o.y = s.y, o.width = s.width, o.height = s.height, o.x -= an.x, o.y -= an.y;
const r = an.width, a = an.height, l = i.view, c = e.zoom;
let h = l?.offsetX || 0, d = l?.offsetY || 0, f = an.width, p = an.height;
f /= c, p /= c, h = f * (c - 1) * 0.5, d = p * (c - 1) * 0.5;
const g = o.x + o.width * 0.5, y = o.y + o.height * 0.5, m = an.width * 0.5, w = an.height * 0.5, b = g - m, v = y - w;
h -= b / c, d -= v / c, e.offsetX !== void 0 && (h += e.offsetX * (an.width * 0.5)), e.offsetY !== void 0 && (d -= e.offsetY * (an.height * 0.5));
const T = l?.offsetX || h, k = l?.offsetY || d;
h = F.lerp(T, h, t), d = F.lerp(k, d, t);
const E = l?.width || r, I = l?.height || a;
f = F.lerp(E, f, t), p = F.lerp(I, p, t), i.setViewOffset(r, a, h, d, f, p), i.updateProjectionMatrix(), e.damping > 0 && (e.damping *= 1 - t, e.damping < 0.01 && (e.damping = 0), e.damping = Math.max(0, e.damping));
}
function C2(s, e, t) {
const i = s.length(), n = e.length(), o = F.lerp(i, n, t);
return s.lerp(e, t).normalize().multiplyScalar(o);
}
const Bf = new V(), Gv = new V().setFromAxisAngle(new _(0, 1, 0), Math.PI);
function P2(s, e) {
s.lookAt(e), s.quaternion.multiply(Gv);
}
function Cu(s, e, t = !0, i = !1) {
if (s === e) return;
Bf.copy(s.quaternion);
const n = te(e), o = te(s);
if (i) {
if (Yn(s, ve(e)), t) {
const r = o.y, a = o.sub(U1(s));
a.y = r, s.lookAt(a), s.quaternion.multiply(Gv);
}
Number.isNaN(s.quaternion.x) && s.quaternion.copy(Bf);
return;
}
t && (n.y = o.y), s.lookAt(n), Number.isNaN(s.quaternion.x) && s.quaternion.copy(Bf);
}
function k2(s, e, t, i = 1) {
if (t) {
const n = U(0, 0, 0), o = e.x / window.innerWidth * 2 - 1, r = -(e.y / window.innerHeight) * 2 + 1;
n.set(
o,
r,
0
), n.unproject(t);
const a = t.worldPosition, l = s.worldPosition.distanceTo(a), c = n.sub(a);
c.multiplyScalar(i * 3.6 * l);
const h = t.worldPosition.add(c);
return s.lookAt(h), h;
}
return null;
}
const A1 = new Ki(() => new _(), 100);
function U(s, e, t) {
const i = A1.get();
return i.set(0, 0, 0), s instanceof _ ? i.copy(s) : Array.isArray(s) ? i.set(s[0], s[1], s[2]) : s instanceof DOMPointReadOnly ? i.set(s.x, s.y, s.z) : typeof s == "number" ? (i.x = s, i.y = e !== void 0 ? e : i.x, i.z = t !== void 0 ? t : i.x) : typeof s == "object" && (i.x = s.x, i.y = s.y, i.z = s.z), i;
}
const I1 = new Ki(() => new re(), 30);
function L1(s) {
const e = I1.get();
return s ? e.copy(s) : e.set(0, 0, 0), e;
}
const D1 = new Ki(() => new V(), 100);
function vi(s, e, t, i) {
const n = D1.get();
return n.identity(), s instanceof V ? n.copy(s) : s instanceof DOMPointReadOnly ? n.set(s.x, s.y, s.z, s.w) : typeof s == "number" && e !== void 0 && t !== void 0 && i !== void 0 ? n.set(s, e, t, i) : typeof s == "object" && "x" in s && "y" in s && "z" in s && "w" in s && n.set(s.x, s.y, s.z, s.w), n;
}
const ug = new Ki(() => new _(), 100), l_ = /* @__PURE__ */ Symbol("lastMatrixWorldUpdateKey");
function te(s, e = null, t = !0) {
const i = e ?? ug.get();
return s ? s.parent ? (t && s.updateWorldMatrix(!0, !1), s.matrixWorldNeedsUpdate && s[l_] !== Date.now() && (s[l_] = Date.now(), s.updateMatrixWorld()), i.setFromMatrixPosition(s.matrixWorld), i) : i.copy(s.position) : i.set(0, 0, 0);
}
function Tt(s, e) {
if (!s) return s;
const t = ug.get();
return e !== t && t.copy(e), s.parent !== null && s.parent.worldToLocal(t), s.position.set(t.x, t.y, t.z), s;
}
function Ha(s, e, t, i) {
const n = ug.get();
return n.set(e, t, i), Tt(s, n), s;
}
const Bd = new Ki(() => new V(), 100), wr = new V(), Ff = new V();
function ve(s, e = null) {
if (!s) return Bd.get().identity();
const t = e ?? Bd.get();
return s.parent ? (s.getWorldQuaternion(t), t) : t.copy(s.quaternion);
}
function Yn(s, e) {
if (!s) return;
e !== wr && wr.copy(e);
const t = wr;
s?.parent?.getWorldQuaternion(Ff), Ff.invert();
const n = Ff.multiply(t);
s.quaternion.set(n.x, n.y, n.z, n.w);
}
function qv(s, e, t, i, n) {
wr.set(e, t, i, n), Yn(s, wr);
}
const j1 = new Ki(() => new _(), 100), B1 = new _();
function Qe(s, e = null) {
return e || (e = j1.get()), s ? s.parent ? (s.getWorldScale(e), e) : e.copy(s.scale) : e.set(0, 0, 0);
}
function Rc(s, e) {
if (!s) return;
if (!s.parent) {
s.scale.copy(e);
return;
}
const t = B1;
s.parent.getWorldScale(t), s.scale.copy(e), s.scale.divide(t);
}
const F1 = new _(), c_ = new V();
function O2(s) {
return ve(s, c_), F1.set(0, 0, 1).applyQuaternion(c_);
}
const z1 = new Ki(() => new _(), 100), h_ = new V();
function U1(s, e) {
return e || (e = z1.get().set(0, 0, 1)), ve(s, h_), e.applyQuaternion(h_);
}
const d_ = new ht(), u_ = new ht(), N1 = new _();
function Xv(s) {
const e = Bd.get();
return s.getWorldQuaternion(e), u_.setFromQuaternion(e), u_;
}
function Qv(s, e) {
const t = Bd.get();
Yn(s, t.setFromEuler(e));
}
function fg(s) {
const e = Xv(s), t = N1;
return t.set(e.x, e.y, e.z), t.x = F.toDegrees(t.x), t.y = F.toDegrees(t.y), t.z = F.toDegrees(t.z), t;
}
function $1(s, e) {
Pu(s, e.x, e.y, e.z, !0);
}
function Pu(s, e, t, i, n = !0) {
n && (e = F.toRadians(e), t = F.toRadians(t), i = F.toRadians(i)), d_.set(e, t, i), wr.setFromEuler(d_), Yn(s, wr);
}
function Yp(s, e = !0) {
s && (e ? (function t(i) {
console.groupCollapsed((i.name ? i.name : "(no name : " + i.type + ")") + " %o", i), i.children.forEach(t), console.groupEnd();
})(s) : s.traverse(function(t) {
for (var i = "|___", n = t; n.parent !== null; )
i = " " + i, n = n.parent;
console.log(i + t.name + " <" + t.type + ">");
}));
}
function M2(s) {
let e = s?.name || "";
if (!s) return e;
let t = s.parent;
for (; t; )
e = t.name + "/" + e, t = t.parent;
return e;
}
function W1(s) {
if (s) {
const e = s;
return e.blendMode !== void 0 && e.clampWhenFinished !== void 0 && e.enabled !== void 0 && e.fadeIn !== void 0 && e.getClip !== void 0;
}
return !1;
}
class Fd extends Xn {
static vertex = `
varying vec2 vUv;
void main(){
vUv = uv;
gl_Position = vec4(position.xy, 0., 1.0);
}`;
constructor() {
super({
vertexShader: Fd.vertex,
uniforms: {
map: new qi(null),
flipY: new qi(!0),
writeDepth: new qi(!1),
depthTexture: new qi(null)
},
fragmentShader: `
uniform sampler2D map;
uniform bool flipY;
uniform bool writeDepth;
uniform sampler2D depthTexture;
varying vec2 vUv;
void main(){
vec2 uv = vUv;
if (flipY) uv.y = 1.0 - uv.y;
gl_FragColor = texture2D(map, uv);
if (writeDepth) {
float depth = texture2D(depthTexture, uv).r;
gl_FragDepth = depth;
// float linearDepth = (depth - 0.99) * 100.0; // Enhance near 1.0 values
// gl_FragColor = vec4(linearDepth, linearDepth, linearDepth, 1.0);
}
}`
});
}
reset() {
this.uniforms.map.value = null, this.uniforms.flipY.value = !0, this.uniforms.writeDepth.value = !1, this.uniforms.depthTexture.value = null, this.needsUpdate = !0, this.uniformsNeedUpdate = !0;
}
}
class Tr {
static planeGeometry = new Pn(2, 2, 1, 1);
static renderer = new Ur({ antialias: !1, alpha: !0 });
static perspectiveCam = new de();
static orthographicCam = new fu();
static scene = new Qi();
static blitMaterial = new Fd();
static mesh = new H(Tr.planeGeometry, Tr.blitMaterial);
/**
* Copy a texture to a new texture
* @param texture the texture to copy
* @param blitMaterial the material to use for copying (optional)
* @returns the newly created, copied texture
*/
static copyTexture(e, t) {
t || (t = this.blitMaterial), this.blitMaterial.reset();
const i = t || this.blitMaterial;
i.uniforms.map.value = e, i.needsUpdate = !0, i.uniformsNeedUpdate = !0;
const n = i.vertexShader;
i.vertexShader = Fd.vertex;
const o = this.mesh;
o.material = i, o.frustumCulled = !1, this.scene.children.length = 0, this.scene.add(o), this.renderer.setSize(e.image.width, e.image.height), this.renderer.clear(), this.renderer.render(this.scene, this.perspectiveCam);
const r = new xe(this.renderer.domElement);
return r.name = "Copy", r.needsUpdate = !0, i.vertexShader = n, r;
}
static blit(e, t, i) {
const {
renderer: n = this.renderer,
blitMaterial: o = this.blitMaterial,
flipY: r = !1,
depthTexture: a = null,
depthTest: l = !0,
depthWrite: c = !0
} = i || {};
this.blitMaterial.reset(), o.uniforms.map && (o.uniforms.map.value = e), o.uniforms.flipY && (o.uniforms.flipY.value = r), a ? (o.uniforms.writeDepth = new qi(!0), o.uniforms.depthTexture.value = a) : (o.uniforms.writeDepth = new qi(!1), o.uniforms.depthTexture.value = null), o.needsUpdate = !0, o.uniformsNeedUpdate = !0;
const h = this.mesh;
h.material = o, h.frustumCulled = !1, this.scene.children.length = 0, this.scene.add(h);
const d = n.getRenderTarget(), f = n.getContext();
l ? f.enable(f.DEPTH_TEST) : f.disable(f.DEPTH_TEST), n.state.buffers.depth.setMask(c), n.setClearColor(new re(0, 0, 0), 0), n.pixelRatio !== window.devicePixelRatio && n.xr.isPresenting === !1 && n.setPixelRatio(window.devicePixelRatio), n.setRenderTarget(t), n.clear(), n.render(this.scene, this.perspectiveCam), n.setRenderTarget(d), f.enable(f.DEPTH_TEST), n.state.buffers.depth.setMask(!0);
}
/**
* Copy a texture to a HTMLCanvasElement
* @param texture the texture convert
* @param force if true the texture will be copied to a new texture before converting
* @returns the HTMLCanvasElement with the texture or null if the texture could not be copied
*/
static textureToCanvas(e, t = !1) {
if (!e)
return null;
(t === !0 || e.isCompressedTexture === !0) && (e = V1(e));
const i = e.image;
if (H1(i)) {
const n = document.createElement("canvas");
n.width = i.width, n.height = i.height;
const o = n.getContext("2d");
return o ? (o.drawImage(i, 0, 0, i.width, i.height, 0, 0, n.width, n.height), n) : (console.error("Failed getting canvas 2d context"), null);
}
return null;
}
}
function V1(s) {
return Tr.copyTexture(s);
}
function E2(s, e = !1) {
return Tr.textureToCanvas(s, e);
}
function H1(s) {
return typeof HTMLImageElement < "u" && s instanceof HTMLImageElement || typeof HTMLCanvasElement < "u" && s instanceof HTMLCanvasElement || typeof OffscreenCanvas < "u" && s instanceof OffscreenCanvas || typeof ImageBitmap < "u" && s instanceof ImageBitmap;
}
function G1(s) {
const e = s.type;
return e === "Mesh" || e === "SkinnedMesh";
}
function Yv(s, e) {
e ? s["needle:rendercustomshadow"] = !0 : s["needle:rendercustomshadow"] = !1;
}
function q1(s) {
if (s) {
if (s["needle:rendercustomshadow"] === !0)
return !0;
if (s["needle:rendercustomshadow"] == null)
return !0;
}
return !1;
}
function Ri(s, e = void 0, t = void 0, i = void 0) {
const n = i || new Ut();
n.makeEmpty();
const o = [];
function r(l) {
let c = !0;
if (l.visible && M1(l) !== !1 && !(l.type === "TransformControlsGizmo" || l.type === "TransformControlsPlane")) {
if (l instanceof uS && (c = !1), l instanceof gv && (c = !1), l instanceof Va && (c = !1), l.isGizmo === !0 && (c = !1), l.material instanceof mv && (c = !1), G1(l) || (c = !1), t && l.layers.test(t) === !1 && (c = !1), c) {
if (e && Array.isArray(e) && e?.includes(l)) return;
if (typeof e == "function" && e(l) === !0)
return;
}
if (l.isUI !== !0) {
if (c) {
const h = l.children;
l.children = o;
const d = l.position, f = l.scale;
if (Number.isNaN(d.x) || Number.isNaN(d.y) || Number.isNaN(d.z)) {
console.warn(`Object "${l.name}" has NaN values in position or scale.... will ignore it`, d, f);
return;
}
l.geometry === null && (l.geometry = void 0), n.expandByObject(l, !0), l.children = h;
}
for (const h of l.children)
r(h);
}
}
}
let a = !1;
Array.isArray(s) || (s = [s]);
for (const l of s)
l && (a = !0, l.updateMatrixWorld(), r(l));
return a || console.warn("No objects to fit camera to..."), n;
}
function X1(s, e, t) {
const i = Ri([s], t?.ignore), n = new _();
i.getSize(n);
const o = new _();
i.getCenter(o);
const r = new _();
e.getSize(r);
const a = new _();
e.getCenter(a);
const l = new _();
l.set(r.x / n.x, r.y / n.y, r.z / n.z);
const c = Math.min(l.x, l.y, l.z), h = t?.scale !== !1;
if (h && Rc(s, Qe(s).multiplyScalar(c)), t?.position !== !1) {
const d = new _();
i.getCenter(d), d.y = i.min.y;
const f = new _();
e.getCenter(f), f.y = e.min.y;
const p = f.clone().sub(d);
h && p.multiplyScalar(c), Tt(s, te(s).add(p));
}
return {
boundsBefore: i,
scale: l
};
}
function Q1(s, e) {
const t = Ri([s]), i = new _();
t.getCenter(i), i.y = t.min.y;
const n = e.clone().sub(i), o = te(s);
return Tt(s, o.add(n)), {
offset: n,
bounds: t
};
}
function Kv(s, e, t, i) {
if (Array.isArray(e)) {
let r = !0;
for (let a = 0; a < e.length; a++)
Kv(s, e[a], a, e) || (r = !1);
return r;
}
if (e.type === "MeshStandardMaterial" || e.type === "MeshBasicMaterial")
return !1;
if (e["material:fbx"] != null)
return !0;
const n = new mt();
n["material:fbx"] = e;
const o = e;
return o && (o.map ? n.color.set(1, 1, 1) : n.color.copyLinearToSRGB(o.color), n.emissive.copyLinearToSRGB(o.emissive), n.emissiveIntensity = o.emissiveIntensity, n.opacity = o.opacity, n.displacementScale = o.displacementScale, n.transparent = o.transparent, n.bumpMap = o.bumpMap, n.aoMap = o.aoMap, n.map = o.map, n.displacementMap = o.displacementMap, n.emissiveMap = o.emissiveMap, n.normalMap = o.normalMap, n.envMap = o.envMap, n.alphaMap = o.alphaMap, n.metalness = o.reflectivity, n.vertexColors = o.vertexColors, o.shininess && (n.roughness = 1 - Math.sqrt(o.shininess) / 10), n.needsUpdate = !0), t === void 0 ? s.material = n : i[t] = n, !0;
}
let Oh = !1;
m1((...s) => {
L() && pe.Current?.isInXR && (dc(!0), Zv("error", ...s));
});
function dc(s) {
if (s) {
if (Oh) return;
Oh = !0, K1();
} else {
if (!Oh) return;
Oh = !1, Z1();
}
}
const uc = {
log: void 0,
warn: void 0,