@needle-tools/engine 4.10.0-beta.5 → 4.10.0-beta.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -1
- package/README.md +2 -1
- package/dist/{needle-engine.bundle-DcvMQ1Nq.js → needle-engine.bundle-B_wUQWD9.js} +19 -18
- package/dist/{needle-engine.bundle-DzVytSSo.umd.cjs → needle-engine.bundle-CrO5PE4u.umd.cjs} +11 -11
- package/dist/{needle-engine.bundle-BGVvfSfQ.min.js → needle-engine.bundle-DjiUOI9O.min.js} +11 -11
- package/dist/needle-engine.js +331 -332
- package/dist/needle-engine.min.js +1 -1
- package/dist/needle-engine.umd.cjs +1 -1
- package/dist/vendor-CPuBPspY.umd.cjs +1121 -0
- package/dist/vendor-DPCU8cUF.min.js +1121 -0
- package/dist/vendor-MBoqSyFm.js +16240 -0
- package/lib/engine/codegen/register_types.js +1 -1
- package/lib/engine/codegen/register_types.js.map +1 -1
- package/lib/engine/engine_license.js +1 -1
- package/lib/engine/engine_license.js.map +1 -1
- package/lib/engine-components/codegen/components.d.ts +1 -1
- package/lib/engine-components/codegen/components.js +1 -1
- package/lib/engine-components/codegen/components.js.map +1 -1
- package/lib/engine-components/timeline/TimelineTracks.js +2 -4
- package/lib/engine-components/timeline/TimelineTracks.js.map +1 -1
- package/lib/engine-components/web/ScrollFollow.d.ts +1 -0
- package/lib/engine-components/web/ScrollFollow.js +2 -0
- package/lib/engine-components/web/ScrollFollow.js.map +1 -1
- package/lib/engine-components/web/ViewBox.js +1 -1
- package/lib/engine-components/web/ViewBox.js.map +1 -1
- package/package.json +2 -1
- package/src/engine/codegen/register_types.ts +1 -1
- package/src/engine/engine_license.ts +1 -1
- package/src/engine-components/codegen/components.ts +1 -1
- package/src/engine-components/timeline/TimelineTracks.ts +2 -4
- package/src/engine-components/web/ScrollFollow.ts +3 -2
- package/src/engine-components/web/ViewBox.ts +1 -1
- package/dist/vendor-D0Yvltn9.umd.cjs +0 -1121
- package/dist/vendor-DU8tJyl_.js +0 -14366
- package/dist/vendor-JyrX4DVM.min.js +0 -1121
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{Vector2 as J,Vector3 as b,Vector4 as pe,Quaternion as U,PlaneGeometry as Bn,WebGLRenderer as rr,PerspectiveCamera as re,OrthographicCamera as hd,Scene as yi,Mesh as H,Texture as Re,Uniform$1 as Vi,Color as ne,ShaderMaterial as Fn,Box3 as bi,ShadowMaterial as H0,Euler as nt,MeshStandardMaterial as ut,Box3Helper as uS,GridHelper as am,Object3D as k,Material as ve,Matrix3 as G0,Matrix4 as ee,Layers as as,Ray as ls,MathUtils as yo,AxesHelper as _i,MeshBasicMaterial as we,DoubleSide as vi,BufferGeometry as mn,Group as cs,CylinderGeometry as q0,SphereGeometry as dd,BoxGeometry as va,SpriteMaterial as pS,Sprite as mS,Shape as gS,ExtrudeGeometry as fS,Fog as X0,DirectionalLight as lm,PointLight as cm,EdgesGeometry as yS,LineSegments as Q0,LineBasicMaterial as hm,Line as xa,BufferAttribute as pt,Raycaster as ud,Sphere as pd,ArrayCamera as bS,Plane as ar,SkinnedMesh as hs,InterleavedBufferAttribute as Y0,Skeleton as _S,Bone as vS,WebGLCubeRenderTarget as xS,CubeCamera as wS,AnimationClip as Wi,FileLoader as dm,TextureLoader as Gl,PropertyBinding as wa,KeyframeTrack as SS,LinearSRGBColorSpace as bo,ShaderChunk as Wt,UniformsLib as CS,DataTexture as um,RGBAFormat as md,EquirectangularReflectionMapping as _o,SRGBColorSpace as vo,Clock as PS,NeutralToneMapping as Sa,AgXToneMapping as gd,ACESFilmicToneMapping as fd,NoToneMapping as yd,PCFSoftShadowMap$1 as OS,BasicNodeLibrary as kS,WebGLRenderTarget as zn,DepthTexture as Z0,NearestFilter as bd,LoopRepeat as MS,LoopOnce as pm,AnimationMixer as mm,CompressedTexture as RS,FrontSide as ds,Camera as TS,Frustum as K0,AudioListener as ES,PositionalAudio as AS,AudioLoader as gm,EventDispatcher as fm,BackSide as _d,MeshDepthMaterial as IS,CustomBlending as LS,MaxEquation as jS,AmbientLight as DS,HemisphereLight as BS,AlwaysStencilFunc as FS,GreaterEqualStencilFunc as zS,NotEqualStencilFunc as US,GreaterStencilFunc as NS,LessEqualStencilFunc as VS,EqualStencilFunc as WS,LessStencilFunc as $S,NeverStencilFunc as J0,InvertStencilOp as HS,DecrementWrapStencilOp as GS,IncrementWrapStencilOp as qS,DecrementStencilOp as XS,IncrementStencilOp as QS,ReplaceStencilOp as YS,ZeroStencilOp as ZS,KeepStencilOp as KS,RawShaderMaterial as eb,GLSL3 as JS,AlwaysDepth as eC,GreaterEqualDepth as tC,GreaterDepth as iC,LessEqualDepth as nC,LessDepth as oC,NotEqualDepth as sC,EqualDepth as rC,BatchedMesh as tb,MeshPhysicalMaterial as ym,LinearFilter as vd,UnsignedByteType as aC,RingGeometry as lC,Line3 as cC,AdditiveBlending as ib,BoxHelper as hC,SpotLight as dC,DirectionalLightHelper as uC,CameraHelper as pC,LOD as mC,Triangle as gC,NormalBlending as fC,ReinhardToneMapping as bm,LinearToneMapping as _m,HalfFloatType as vm,VideoTexture as yC,CubeUVReflectionMapping as nb,CubeTexture as bC,CompressedCubeTexture as _C,EquirectangularRefractionMapping as vC,CatmullRomCurve3 as xC,VectorKeyframeTrack as wC,QuaternionKeyframeTrack as SC,Audio as CC,ShaderLib as xd,UniformsUtils as ob,MirroredRepeatWrapping as sb,MeshNormalMaterial as PC,AudioContext as OC,PMREMGenerator$1 as kC}from"./three-qw28ZtTy.min.js";import{createLoaders as xm,getRaycastMesh as rb,LODsManager as lr,NEEDLE_progressive as $e,addDracoAndKTX2Loaders as MC,configureLoader as RC,setKTX2TranscoderLocation as TC,setDracoDecoderLocation as EC}from"./gltf-progressive-CoZbSfPR.min.js";import{GroundedSkybox as Ca,Font as AC,TextGeometry as IC,FontLoader as LC,GLTFLoader as xo,TransformControlsGizmo as ab,EXRLoader as wm,RGBELoader as lb,Stats as jC,nodeFrame as DC,OrbitControls as cb,PositionalAudioHelper as BC,HorizontalBlurShader as FC,VerticalBlurShader as zC,GLTFExporter as hb,strToU8 as db,zipSync as UC,XRControllerModelFactory as NC,XRHandMeshModel as VC,Line2 as WC,LineGeometry as $C,LineMaterial as HC,TransformControls as GC,InteractiveGroup as qC,HTMLMesh as XC,VertexNormalsHelper as QC,OBJLoader as Sm,FBXLoader as ub,mergeVertices as YC}from"./three-examples-BivkhnvN.min.js";import{fetchProfile as ZC,MotionController as KC,$70d766613f57b014$export$2e2bcd8739ae039 as pb,ByteBuffer as JC,v5 as mb,md5 as gb,SIZE_PREFIX_LENGTH as fb,Builder as Cm,createNoise4D as eP,Matrix4 as Pm,BatchedParticleRenderer as tP,ParticleSystem as iP,RenderMode as wo,ConstantColor as nP,Vector4 as oP,ConstantValue as sP,TrailParticle as yb,WorkerBase as rP,MeshBVH as aP}from"./vendor-JyrX4DVM.min.js";import{__webpack_exports__default as Ce,__webpack_exports__Text as bb,__webpack_exports__Block as _b,__webpack_exports__update as lP,SimpleStateBehavior as cP,__webpack_exports__Inline as Om,__webpack_exports__FontLibrary as vb,ThreeMeshUI as xb}from"./three-mesh-ui-DhYXcXZe.min.js";import{EffectAttribute as hP}from"./postprocessing-BHMVuZQ1.min.js";const km=new Map;function $i(o=globalThis.location?.hostname){if(km.has(o))return km.get(o);const e=/(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})|localhost/.test(o);return km.set(o,e),e===!0}function wb(){return window.location.hostname.includes("glitch.me")}const dP='<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 160 187.74"><defs><linearGradient id="a" x1="89.64" y1="184.81" x2="90.48" y2="21.85" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#62d399"/><stop offset=".51" stop-color="#acd842"/><stop offset=".9" stop-color="#d7db0a"/></linearGradient><linearGradient id="b" x1="69.68" y1="178.9" x2="68.08" y2="16.77" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#0ba398"/><stop offset=".5" stop-color="#4ca352"/><stop offset="1" stop-color="#76a30a"/></linearGradient><linearGradient id="c" x1="36.6" y1="152.17" x2="34.7" y2="84.19" gradientUnits="userSpaceOnUse"><stop offset=".19" stop-color="#36a382"/><stop offset=".54" stop-color="#49a459"/><stop offset="1" stop-color="#76a30b"/></linearGradient><linearGradient id="d" x1="15.82" y1="153.24" x2="18" y2="90.86" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#267880"/><stop offset=".51" stop-color="#457a5c"/><stop offset="1" stop-color="#717516"/></linearGradient><linearGradient id="e" x1="135.08" y1="135.43" x2="148.93" y2="63.47" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#b0d939"/><stop offset="1" stop-color="#eadb04"/></linearGradient><linearGradient id="f" x1="-4163.25" y1="2285.12" x2="-4160.81" y2="2215.34" gradientTransform="rotate(20 4088.49 13316.712)" gradientUnits="userSpaceOnUse"><stop offset=".17" stop-color="#74af52"/><stop offset=".48" stop-color="#99be32"/><stop offset="1" stop-color="#c0c40a"/></linearGradient><symbol id="g" viewBox="0 0 160 187.74"><path style="fill:url(#a)" d="M79.32 36.98v150.76L95 174.54l6.59-156.31-22.27 18.75z"/><path style="fill:url(#b)" d="M79.32 36.98 57.05 18.23l6.59 156.31 15.68 13.2V36.98z"/><path style="fill:url(#c)" d="m25.19 104.83 8.63 49.04 12.5-14.95-2.46-56.42-18.67 22.33z"/><path style="fill:url(#d)" d="M25.19 104.83 0 90.24l16.97 53.86 16.85 9.77-8.63-49.04z"/><path style="fill:#9c3" d="M43.86 82.5 18.69 67.98 0 90.24l25.18 14.59L43.86 82.5z"/><path style="fill:url(#e)" d="m134.82 78.69-9.97 56.5 15.58-9.04L160 64.1l-25.18 14.59z"/><path style="fill:url(#f)" d="m134.82 78.69-18.68-22.33-2.86 65 11.57 13.83 9.97-56.5z"/><path style="fill:#ffe113" d="m160 64.1-18.69-22.26-25.17 14.52 18.67 22.33L160 64.1z"/><path style="fill:#f3e600" d="M101.59 18.23 79.32 0 57.05 18.23l22.27 18.75 22.27-18.75z"/></symbol></defs><use width="160" height="187.74" xlink:href="#g"/></svg>',uP=btoa(dP),pP="data:image/svg+xml;base64,"+uP,Mm=pP,mP=`<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN' 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'> <svg clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="2" version="1.1" viewBox="0 0 1014 282" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"> <g transform="matrix(1.008 0 0 1.008 -2.239 .61874)"> <path d="m665.95 132.73v44.88l-10.56-8.4c-0.8-0.64-1.2-1.44-1.2-2.4v-32.4c0-6.48-4.12-9.72-12.36-9.72-2.16 0-4.18 0.4-6.06 1.2s-3.54 1.8-4.98 3-2.56 2.5-3.36 3.9-1.2 2.7-1.2 3.9v40.92l-10.68-8.4c-0.72-0.64-1.08-1.44-1.08-2.4v-53.76l10.92 8.52c0.32 0.24 0.56 0.44 0.72 0.6s0.36 0.32 0.6 0.48c0.96-1.2 2.14-2.28 3.54-3.24s2.92-1.76 4.56-2.4 3.34-1.14 5.1-1.5 3.44-0.54 5.04-0.54c1.44 0 2.92 0.04 4.44 0.12s2.84 0.28 3.96 0.6c4.56 1.12 7.8 3.12 9.72 6s2.88 6.56 2.88 11.04z" fill-rule="nonzero"/> </g> <g transform="matrix(1.008 0 0 1.008 -2.239 .61874)"> <path d="m732.38 146.05c0 0.88 0.02 1.5 0.06 1.86s-0.02 0.98-0.18 1.86h-7.08c-2.08 0-4.44-0.02-7.08-0.06s-5.36-0.06-8.16-0.06h-22.08c0 2.88 0.56 5.36 1.68 7.44s2.6 3.8 4.44 5.16 3.94 2.36 6.3 3 4.74 0.96 7.14 0.96c3.04 0 5.9-0.76 8.58-2.28s4.94-3.52 6.78-6c0.64 0.56 1.54 1.48 2.7 2.76s2.94 3.2 5.34 5.76c-2.8 3.36-6.22 6.02-10.26 7.98s-8.42 2.94-13.14 2.94-8.92-0.64-12.84-1.92-7.32-3.24-10.2-5.88-5.12-5.98-6.72-10.02-2.4-8.82-2.4-14.34c0-4.96 0.66-9.42 1.98-13.38s3.22-7.32 5.7-10.08 5.44-4.9 8.88-6.42 7.32-2.28 11.64-2.28c5.76 0 10.52 0.88 14.28 2.64s6.72 4.16 8.88 7.2 3.66 6.54 4.5 10.5 1.26 8.18 1.26 12.66zm-29.4-22.8c-2.16 0.16-4.16 0.72-6 1.68s-3.42 2.2-4.74 3.72-2.36 3.28-3.12 5.28-1.14 4.12-1.14 6.36h33.12c0-2-0.22-4.06-0.66-6.18s-1.3-4.02-2.58-5.7-3.1-3.02-5.46-4.02-5.5-1.38-9.42-1.14z" fill-rule="nonzero"/> </g> <g transform="matrix(1.008 0 0 1.008 -2.239 .61874)"> <path d="m795.93 146.05c0 0.88 0.02 1.5 0.06 1.86s-0.02 0.98-0.18 1.86h-7.08c-2.08 0-4.44-0.02-7.08-0.06s-5.36-0.06-8.16-0.06h-22.08c0 2.88 0.56 5.36 1.68 7.44s2.6 3.8 4.44 5.16 3.94 2.36 6.3 3 4.74 0.96 7.14 0.96c3.04 0 5.9-0.76 8.58-2.28s4.94-3.52 6.78-6c0.64 0.56 1.54 1.48 2.7 2.76s2.94 3.2 5.34 5.76c-2.8 3.36-6.22 6.02-10.26 7.98s-8.42 2.94-13.14 2.94-8.92-0.64-12.84-1.92-7.32-3.24-10.2-5.88-5.12-5.98-6.72-10.02-2.4-8.82-2.4-14.34c0-4.96 0.66-9.42 1.98-13.38s3.22-7.32 5.7-10.08 5.44-4.9 8.88-6.42 7.32-2.28 11.64-2.28c5.76 0 10.52 0.88 14.28 2.64s6.72 4.16 8.88 7.2 3.66 6.54 4.5 10.5 1.26 8.18 1.26 12.66zm-29.4-22.8c-2.16 0.16-4.16 0.72-6 1.68s-3.42 2.2-4.74 3.72-2.36 3.28-3.12 5.28-1.14 4.12-1.14 6.36h33.12c0-2-0.22-4.06-0.66-6.18s-1.3-4.02-2.58-5.7-3.1-3.02-5.46-4.02-5.5-1.38-9.42-1.14z" fill-rule="nonzero"/> </g> <g transform="matrix(1.008 0 0 1.008 -2.239 .61874)"> <path d="m858.57 97.21c0.64 0.48 0.96 1.16 0.96 2.04v74.88c-0.08 1.04-0.12 2.12-0.12 3.24-1.84-1.52-3.56-2.92-5.16-4.2-1.36-1.12-2.66-2.18-3.9-3.18s-2.06-1.66-2.46-1.98c-1.76 2.48-4.26 4.44-7.5 5.88s-7.02 2.16-11.34 2.16c-3.84 0-7.4-0.7-10.68-2.1s-6.14-3.44-8.58-6.12-4.34-5.94-5.7-9.78-2.04-8.16-2.04-12.96c0-4.32 0.78-8.34 2.34-12.06s3.6-6.92 6.12-9.6 5.38-4.78 8.58-6.3 6.48-2.28 9.84-2.28c2.56 0 4.82 0.22 6.78 0.66s3.68 1.06 5.16 1.86 2.78 1.74 3.9 2.82 2.16 2.22 3.12 3.42v-35.04l10.68 8.64zm-27.96 67.92c3.6 0 6.52-0.68 8.76-2.04s3.98-3.06 5.22-5.1 2.1-4.22 2.58-6.54 0.72-4.44 0.72-6.36v-1.2c0-1.12-0.22-2.7-0.66-4.74s-1.28-4.06-2.52-6.06-3-3.7-5.28-5.1-5.22-2.02-8.82-1.86c-3.44 0-6.26 0.74-8.46 2.22s-3.96 3.26-5.28 5.34-2.24 4.2-2.76 6.36-0.78 3.92-0.78 5.28c0 1.84 0.24 3.92 0.72 6.24s1.36 4.48 2.64 6.48 3.04 3.68 5.28 5.04 5.12 2.04 8.64 2.04z" fill-rule="nonzero"/> </g> <g transform="matrix(1.008 0 0 1.008 -2.239 .61874)"> <path d="m882.81 97.09c0.64 0.48 0.96 1.12 0.96 1.92l-0.12 41.04v37.08l-10.56-8.4c-0.72-0.64-1.08-1.44-1.08-2.4v-77.88l10.8 8.64z" fill-rule="nonzero"/> </g> <g transform="matrix(1.008 0 0 1.008 -2.239 .61874)"> <path d="m950.36 146.05c0 0.88 0.02 1.5 0.06 1.86s-0.02 0.98-0.18 1.86h-7.08c-2.08 0-4.44-0.02-7.08-0.06s-5.36-0.06-8.16-0.06h-22.08c0 2.88 0.56 5.36 1.68 7.44s2.6 3.8 4.44 5.16 3.94 2.36 6.3 3 4.74 0.96 7.14 0.96c3.04 0 5.9-0.76 8.58-2.28s4.94-3.52 6.78-6c0.64 0.56 1.54 1.48 2.7 2.76s2.94 3.2 5.34 5.76c-2.8 3.36-6.22 6.02-10.26 7.98s-8.42 2.94-13.14 2.94-8.92-0.64-12.84-1.92-7.32-3.24-10.2-5.88-5.12-5.98-6.72-10.02-2.4-8.82-2.4-14.34c0-4.96 0.66-9.42 1.98-13.38s3.22-7.32 5.7-10.08 5.44-4.9 8.88-6.42 7.32-2.28 11.64-2.28c5.76 0 10.52 0.88 14.28 2.64s6.72 4.16 8.88 7.2 3.66 6.54 4.5 10.5 1.26 8.18 1.26 12.66zm-29.4-22.8c-2.16 0.16-4.16 0.72-6 1.68s-3.42 2.2-4.74 3.72-2.36 3.28-3.12 5.28-1.14 4.12-1.14 6.36h33.12c0-2-0.22-4.06-0.66-6.18s-1.3-4.02-2.58-5.7-3.1-3.02-5.46-4.02-5.5-1.38-9.42-1.14z" fill-rule="nonzero"/> </g> <g transform="matrix(1.8559 0 0 .7642 45.348 36.475)"> <g transform="translate(2.7114)"> <path d="m3.935 173.02c-0.331 0-0.497-0.402-0.497-1.207v-51.002c0-0.738 0.138-1.107 0.414-1.107h1.781c0.277 0 0.415 0.335 0.415 1.006v5.935c0 0.336 0.027 0.553 0.083 0.654 0.055 0.101 0.151-0.017 0.289-0.352 0.912-1.744 1.754-3.236 2.527-4.477 0.773-1.24 1.554-2.179 2.341-2.816s1.65-0.956 2.588-0.956c1.685 0 3.011 0.922 3.977 2.766 0.967 1.845 1.602 3.84 1.905 5.986 0.056 0.268 0.139 0.369 0.249 0.302s0.221-0.235 0.331-0.503c0.939-1.811 1.802-3.353 2.589-4.628 0.787-1.274 1.581-2.246 2.382-2.917s1.671-1.006 2.61-1.006c2.016 0 3.569 1.392 4.66 4.175 1.09 2.783 1.636 6.421 1.636 10.915v37.925c0 0.871-0.18 1.307-0.539 1.307h-1.739c-0.138 0-0.249-0.1-0.332-0.301-0.083-0.202-0.124-0.503-0.124-0.906v-36.315c0-3.555-0.338-6.321-1.015-8.3-0.676-1.978-1.76-2.967-3.251-2.967-0.884 0-1.726 0.386-2.527 1.157s-1.519 1.727-2.154 2.867-1.201 2.213-1.699 3.219c-0.248 0.469-0.421 0.905-0.517 1.308-0.097 0.402-0.145 0.972-0.145 1.71v37.221c0 0.871-0.166 1.307-0.497 1.307h-1.74c-0.166 0-0.29-0.1-0.373-0.301-0.083-0.202-0.124-0.503-0.124-0.906v-36.315c0-3.555-0.332-6.321-0.994-8.3-0.663-1.978-1.754-2.967-3.273-2.967-1.242 0-2.375 0.704-3.396 2.112-1.022 1.409-2.223 3.555-3.604 6.439v39.031c0 0.805-0.18 1.207-0.539 1.207h-1.698z" fill-rule="nonzero" stroke="#000" stroke-width=".7px"/> </g> <g transform="translate(2.7114)"> <path d="m53.642 166.28c-1.077 2.549-2.237 4.477-3.479 5.785-1.243 1.307-2.61 1.961-4.101 1.961-2.154 0-3.853-1.324-5.095-3.973-1.243-2.649-1.864-6.187-1.864-10.613 0-3.488 0.4-6.489 1.201-9.004s1.988-4.51 3.562-5.985c1.574-1.476 3.521-2.414 5.841-2.817l3.686-0.704c0.221-0.067 0.394-0.218 0.518-0.453 0.124-0.234 0.187-0.587 0.187-1.056v-2.917c0-3.89-0.504-6.975-1.512-9.255s-2.354-3.42-4.039-3.42c-1.298 0-2.472 0.72-3.521 2.162s-2.002 3.572-2.858 6.388c-0.083 0.268-0.159 0.453-0.228 0.554-0.069 0.1-0.172 0.083-0.311-0.051l-1.698-1.71c-0.083-0.134-0.138-0.285-0.166-0.453-0.027-0.167 0.014-0.452 0.125-0.855 0.856-3.353 2.009-6.052 3.459-8.098 1.449-2.045 3.224-3.068 5.322-3.068 1.74 0 3.211 0.687 4.412 2.062s2.112 3.37 2.734 5.986c0.621 2.615 0.932 5.7 0.932 9.255v35.712c0 0.536-0.035 0.888-0.104 1.056s-0.2 0.251-0.393 0.251h-1.533c-0.166 0-0.29-0.117-0.373-0.352-0.083-0.234-0.124-0.553-0.124-0.955l-0.083-5.231c-0.055-0.939-0.221-1.006-0.497-0.202zm0.456-19.314c0-1.14-0.194-1.643-0.58-1.509l-3.107 0.603c-1.436 0.202-2.686 0.638-3.749 1.308-1.063 0.671-1.953 1.543-2.671 2.616s-1.257 2.33-1.616 3.772-0.538 3.102-0.538 4.98c0 3.152 0.455 5.616 1.367 7.393 0.911 1.778 2.14 2.666 3.686 2.666 0.939 0 1.85-0.419 2.734-1.257s1.671-1.895 2.361-3.169c0.663-1.408 1.181-2.85 1.553-4.326 0.373-1.475 0.56-2.883 0.56-4.225v-8.852z" fill-rule="nonzero" stroke="#000" stroke-width=".7px"/> </g> <g transform="translate(2.7114)"> <path d="m79.034 173.02c-0.166 0-0.297-0.117-0.394-0.352-0.096-0.234-0.145-0.553-0.145-0.955v-4.628c0-0.536-0.041-0.838-0.124-0.905s-0.207 0.1-0.373 0.503c-0.276 0.67-0.69 1.593-1.242 2.766-0.553 1.174-1.271 2.23-2.154 3.169-0.884 0.939-1.961 1.408-3.231 1.408-1.74 0-3.314-0.989-4.722-2.967-1.409-1.979-2.534-4.963-3.376-8.953-0.843-3.991-1.264-8.937-1.264-14.838 0-5.701 0.415-10.68 1.243-14.939s1.988-7.595 3.479-10.009c1.492-2.415 3.204-3.622 5.137-3.622 1.436 0 2.616 0.57 3.541 1.71 0.926 1.14 1.719 2.381 2.382 3.722 0.249 0.47 0.414 0.637 0.497 0.503s0.125-0.536 0.125-1.207v-23.841c0-0.805 0.151-1.208 0.455-1.208h1.864c0.276 0 0.414 0.369 0.414 1.107v72.128c0 0.537-0.041 0.905-0.124 1.107-0.083 0.201-0.235 0.301-0.455 0.301h-1.533zm-0.621-42.049c-0.939-2.213-1.885-3.94-2.838-5.181s-2.009-1.861-3.169-1.861c-1.463 0-2.768 0.889-3.914 2.666s-2.044 4.376-2.693 7.796-0.973 7.578-0.973 12.474c0 5.097 0.338 9.272 1.015 12.524 0.676 3.253 1.567 5.651 2.672 7.193 1.104 1.543 2.305 2.314 3.603 2.314 1.188 0 2.258-0.704 3.211-2.113 0.952-1.408 1.705-3.118 2.257-5.13s0.829-3.957 0.829-5.835v-24.847z" fill-rule="nonzero" stroke="#000" stroke-width=".7px"/> </g> <g transform="translate(2.7114)"> <path d="m89.514 149.38c0 3.42 0.345 6.606 1.035 9.557 0.691 2.951 1.609 5.315 2.755 7.092s2.437 2.666 3.873 2.666c1.519 0 2.837-0.738 3.956-2.213 1.118-1.476 2.064-3.655 2.837-6.539 0.083-0.336 0.166-0.52 0.249-0.554 0.083-0.033 0.179 0.017 0.29 0.151l1.408 1.912c0.221 0.268 0.235 0.67 0.041 1.207-0.69 2.548-1.47 4.661-2.34 6.337-0.87 1.677-1.857 2.935-2.962 3.773-1.104 0.838-2.319 1.257-3.645 1.257-2.043 0-3.838-1.14-5.385-3.42-1.546-2.28-2.761-5.482-3.645-9.607-0.884-4.124-1.325-8.836-1.325-14.134 0-5.901 0.455-10.931 1.367-15.089 0.911-4.158 2.14-7.377 3.686-9.658 1.547-2.28 3.3-3.42 5.261-3.42 1.988 0 3.714 1.073 5.178 3.219 1.463 2.146 2.595 5.231 3.396 9.255s1.201 8.886 1.201 14.587c0 0.469-0.02 0.939-0.062 1.408-0.041 0.469-0.214 0.704-0.517 0.704h-16.362c-0.083 0-0.152 0.151-0.207 0.453-0.056 0.302-0.083 0.654-0.083 1.056zm13.752-6.237c0.304 0 0.497-0.1 0.58-0.302 0.083-0.201 0.124-0.57 0.124-1.106 0-3.219-0.283-6.187-0.849-8.903s-1.367-4.896-2.402-6.539c-1.036-1.643-2.272-2.464-3.708-2.464-1.629 0-2.996 0.955-4.101 2.867-1.104 1.911-1.94 4.342-2.506 7.293s-0.849 6.002-0.849 9.154h13.711z" fill-rule="nonzero" stroke="#000" stroke-width=".7px"/> </g> <g transform="translate(2.7114)"> <path d="m148.54 119.7c0.165 0 0.283 0.117 0.352 0.352s0.076 0.52 0.02 0.855l-6.254 50.902c-0.028 0.47-0.104 0.788-0.228 0.956s-0.297 0.251-0.518 0.251h-1.615c-0.442 0-0.718-0.402-0.829-1.207l-5.26-40.138c-0.111-0.604-0.201-0.905-0.27-0.905s-0.131 0.301-0.186 0.905l-5.012 40.138c-0.028 0.47-0.097 0.788-0.207 0.956-0.111 0.168-0.277 0.251-0.497 0.251h-1.74c-0.442 0-0.718-0.402-0.829-1.207l-6.503-50.801c-0.055-0.403-0.048-0.721 0.021-0.956s0.2-0.352 0.393-0.352h1.823c0.166 0 0.297 0.067 0.393 0.201 0.097 0.134 0.159 0.403 0.187 0.805l5.302 41.848c0.083 0.671 0.179 0.989 0.29 0.956 0.11-0.034 0.207-0.386 0.29-1.056l5.219-41.949c0.055-0.268 0.124-0.47 0.207-0.604s0.193-0.201 0.331-0.201h1.533c0.138 0 0.262 0.067 0.373 0.201 0.11 0.134 0.179 0.403 0.207 0.805l5.468 41.848c0.083 0.671 0.179 0.989 0.29 0.956 0.11-0.034 0.207-0.386 0.29-1.056l5.053-41.849c0.055-0.335 0.138-0.57 0.249-0.704 0.11-0.134 0.234-0.201 0.373-0.201h1.284z" fill-rule="nonzero" stroke="#000" stroke-width=".7px"/> </g> <g transform="translate(2.7114)"> <path d="m156.49 171.51c0 0.604-0.042 1.006-0.125 1.208-0.082 0.201-0.262 0.301-0.538 0.301h-1.533c-0.221 0-0.366-0.083-0.435-0.251s-0.103-0.486-0.103-0.956v-50.902c0-0.805 0.152-1.207 0.456-1.207h1.822c0.304 0 0.456 0.402 0.456 1.207v50.6zm0.165-63.979c0 1.207-0.207 1.811-0.621 1.811h-1.905c-0.221 0-0.366-0.135-0.435-0.403s-0.104-0.67-0.104-1.207v-7.847c0-1.006 0.18-1.509 0.539-1.509h1.988c0.359 0 0.538 0.47 0.538 1.409v7.746z" fill-rule="nonzero" stroke="#000" stroke-width=".7px"/> </g> <g transform="translate(2.7114)"> <path d="m168.3 124.83c-0.221 0-0.331 0.269-0.331 0.805v33.801c0 3.42 0.221 5.667 0.663 6.74 0.441 1.073 1.09 1.609 1.946 1.609h3.024c0.138 0 0.242 0.084 0.311 0.252 0.069 0.167 0.103 0.419 0.103 0.754v2.716c0 0.537-0.138 0.906-0.414 1.107-0.248 0.067-0.614 0.134-1.098 0.201-0.483 0.067-0.959 0.118-1.429 0.151-0.469 0.034-0.828 0.05-1.077 0.05-1.712 0-2.934-0.955-3.665-2.867-0.732-1.911-1.098-5.013-1.098-9.305v-35.108c0-0.604-0.124-0.906-0.373-0.906h-3.521c-0.248 0-0.373-0.268-0.373-0.804v-3.521c0-0.537 0.111-0.805 0.332-0.805h3.686c0.166 0 0.263-0.268 0.29-0.805l0.415-16.095c0-0.805 0.124-1.207 0.372-1.207h1.492c0.303 0 0.455 0.436 0.455 1.307v15.995c0 0.537 0.097 0.805 0.29 0.805h5.468c0.221 0 0.331 0.268 0.331 0.805v3.521c0 0.536-0.124 0.804-0.373 0.804h-5.426z" fill-rule="nonzero" stroke="#000" stroke-width=".7px"/> </g> <g transform="translate(2.7114)"> <path d="m179.4 173.02c-0.331 0-0.497-0.402-0.497-1.207v-72.329c0-0.738 0.138-1.107 0.414-1.107h1.782c0.276 0 0.414 0.336 0.414 1.006v27.162c0 0.335 0.034 0.536 0.103 0.603s0.159-0.033 0.27-0.302c0.994-1.81 1.898-3.319 2.713-4.526 0.814-1.208 1.629-2.113 2.444-2.717 0.814-0.603 1.691-0.905 2.63-0.905 2.182 0 3.839 1.375 4.971 4.125 1.132 2.749 1.698 6.404 1.698 10.965v37.925c0 0.871-0.166 1.307-0.497 1.307h-1.74c-0.165 0-0.29-0.1-0.373-0.301-0.082-0.202-0.124-0.503-0.124-0.906v-36.315c0-3.555-0.366-6.321-1.097-8.3-0.732-1.978-1.899-2.967-3.501-2.967-0.883 0-1.705 0.318-2.464 0.956-0.76 0.637-1.526 1.576-2.299 2.816-0.773 1.241-1.643 2.834-2.61 4.779v39.031c0 0.805-0.179 1.207-0.538 1.207h-1.699z" fill-rule="nonzero" stroke="#000" stroke-width=".7px"/> </g> </g> <g transform="matrix(.80638 0 0 .80638 452.53 65.421)" fill-rule="nonzero"> <path d="m79.32 36.98v150.76l15.68-13.2 6.59-156.31-22.27 18.75z" fill="url(#f)"/> <path d="m79.32 36.98-22.27-18.75 6.59 156.31 15.68 13.2v-150.76z" fill="url(#e)"/> <path d="m25.19 104.83 8.63 49.04 12.5-14.95-2.46-56.42-18.67 22.33z" fill="url(#d)"/> <path d="m25.19 104.83-25.19-14.59 16.97 53.86 16.85 9.77-8.63-49.04z" fill="url(#c)"/> <path d="M43.86,82.5L18.69,67.98L0,90.24L25.18,104.83L43.86,82.5Z" fill="#9c3"/> <path d="m134.82 78.69-9.97 56.5 15.58-9.04 19.57-62.05-25.18 14.59z" fill="url(#b)"/> <path d="m134.82 78.69-18.68-22.33-2.86 65 11.57 13.83 9.97-56.5z" fill="url(#a)"/> <path d="m160 64.1-18.69-22.26-25.17 14.52 18.67 22.33 25.19-14.59z" fill="#ffe113"/> <path d="M101.59,18.23L79.32,0L57.05,18.23L79.32,36.98L101.59,18.23Z" fill="#f3e600"/> </g> <defs> <linearGradient id="f" x2="1" gradientTransform="matrix(.84 -162.96 162.96 .84 89.64 184.81)" gradientUnits="userSpaceOnUse"><stop stop-color="#62d399" offset="0"/><stop stop-color="#acd842" offset=".51"/><stop stop-color="#d7db0a" offset=".9"/><stop stop-color="#d7db0a" offset="1"/></linearGradient> <linearGradient id="e" x2="1" gradientTransform="matrix(-1.6,-162.13,162.13,-1.6,69.68,178.9)" gradientUnits="userSpaceOnUse"><stop stop-color="#0ba398" offset="0"/><stop stop-color="#4ca352" offset=".5"/><stop stop-color="#76a30a" offset="1"/></linearGradient> <linearGradient id="d" x2="1" gradientTransform="matrix(-1.9,-67.98,67.98,-1.9,36.6,152.17)" gradientUnits="userSpaceOnUse"><stop stop-color="#36a382" offset="0"/><stop stop-color="#36a382" offset=".19"/><stop stop-color="#49a459" offset=".54"/><stop stop-color="#76a30b" offset="1"/></linearGradient> <linearGradient id="c" x2="1" gradientTransform="matrix(2.18,-62.38,62.38,2.18,15.82,153.24)" gradientUnits="userSpaceOnUse"><stop stop-color="#267880" offset="0"/><stop stop-color="#457a5c" offset=".51"/><stop stop-color="#717516" offset="1"/></linearGradient> <linearGradient id="b" x2="1" gradientTransform="matrix(13.85,-71.96,71.96,13.85,135.08,135.43)" gradientUnits="userSpaceOnUse"><stop stop-color="#b0d939" offset="0"/><stop stop-color="#eadb04" offset="1"/></linearGradient> <linearGradient id="a" x2="1" gradientTransform="matrix(26.159 -64.737 64.737 26.159 107.42 128.14)" gradientUnits="userSpaceOnUse"><stop stop-color="#74af52" offset="0"/><stop stop-color="#74af52" offset=".17"/><stop stop-color="#99be32" offset=".48"/><stop stop-color="#c0c40a" offset="1"/></linearGradient> </defs> </svg>`;btoa(mP);const gP='<svg viewBox="0 0 509 154" xmlns="http://www.w3.org/2000/svg" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2"><path d="M665.95 132.73v44.88l-10.56-8.4c-.8-.64-1.2-1.44-1.2-2.4v-32.4c0-6.48-4.12-9.72-12.36-9.72-2.16 0-4.18.4-6.06 1.2-1.88.8-3.54 1.8-4.98 3-1.44 1.2-2.56 2.5-3.36 3.9-.8 1.4-1.2 2.7-1.2 3.9v40.92l-10.68-8.4c-.72-.64-1.08-1.44-1.08-2.4v-53.76l10.92 8.52c.32.24.56.44.72.6.16.16.36.32.6.48.96-1.2 2.14-2.28 3.54-3.24 1.4-.96 2.92-1.76 4.56-2.4 1.64-.64 3.34-1.14 5.1-1.5 1.76-.36 3.44-.54 5.04-.54 1.44 0 2.92.04 4.44.12 1.52.08 2.84.28 3.96.6 4.56 1.12 7.8 3.12 9.72 6 1.92 2.88 2.88 6.56 2.88 11.04ZM732.38 146.05c0 .88.02 1.5.06 1.86.04.36-.02.98-.18 1.86h-7.08c-2.08 0-4.44-.02-7.08-.06-2.64-.04-5.36-.06-8.16-.06h-22.08c0 2.88.56 5.36 1.68 7.44 1.12 2.08 2.6 3.8 4.44 5.16 1.84 1.36 3.94 2.36 6.3 3 2.36.64 4.74.96 7.14.96 3.04 0 5.9-.76 8.58-2.28 2.68-1.52 4.94-3.52 6.78-6 .64.56 1.54 1.48 2.7 2.76 1.16 1.28 2.94 3.2 5.34 5.76-2.8 3.36-6.22 6.02-10.26 7.98-4.04 1.96-8.42 2.94-13.14 2.94-4.72 0-8.92-.64-12.84-1.92-3.92-1.28-7.32-3.24-10.2-5.88-2.88-2.64-5.12-5.98-6.72-10.02-1.6-4.04-2.4-8.82-2.4-14.34 0-4.96.66-9.42 1.98-13.38 1.32-3.96 3.22-7.32 5.7-10.08s5.44-4.9 8.88-6.42c3.44-1.52 7.32-2.28 11.64-2.28 5.76 0 10.52.88 14.28 2.64 3.76 1.76 6.72 4.16 8.88 7.2 2.16 3.04 3.66 6.54 4.5 10.5.84 3.96 1.26 8.18 1.26 12.66Zm-29.4-22.8c-2.16.16-4.16.72-6 1.68-1.84.96-3.42 2.2-4.74 3.72-1.32 1.52-2.36 3.28-3.12 5.28-.76 2-1.14 4.12-1.14 6.36h33.12c0-2-.22-4.06-.66-6.18-.44-2.12-1.3-4.02-2.58-5.7-1.28-1.68-3.1-3.02-5.46-4.02-2.36-1-5.5-1.38-9.42-1.14ZM795.93 146.05c0 .88.02 1.5.06 1.86.04.36-.02.98-.18 1.86h-7.08c-2.08 0-4.44-.02-7.08-.06-2.64-.04-5.36-.06-8.16-.06h-22.08c0 2.88.56 5.36 1.68 7.44 1.12 2.08 2.6 3.8 4.44 5.16 1.84 1.36 3.94 2.36 6.3 3 2.36.64 4.74.96 7.14.96 3.04 0 5.9-.76 8.58-2.28 2.68-1.52 4.94-3.52 6.78-6 .64.56 1.54 1.48 2.7 2.76 1.16 1.28 2.94 3.2 5.34 5.76-2.8 3.36-6.22 6.02-10.26 7.98-4.04 1.96-8.42 2.94-13.14 2.94-4.72 0-8.92-.64-12.84-1.92-3.92-1.28-7.32-3.24-10.2-5.88-2.88-2.64-5.12-5.98-6.72-10.02-1.6-4.04-2.4-8.82-2.4-14.34 0-4.96.66-9.42 1.98-13.38 1.32-3.96 3.22-7.32 5.7-10.08s5.44-4.9 8.88-6.42c3.44-1.52 7.32-2.28 11.64-2.28 5.76 0 10.52.88 14.28 2.64 3.76 1.76 6.72 4.16 8.88 7.2 2.16 3.04 3.66 6.54 4.5 10.5.84 3.96 1.26 8.18 1.26 12.66Zm-29.4-22.8c-2.16.16-4.16.72-6 1.68-1.84.96-3.42 2.2-4.74 3.72-1.32 1.52-2.36 3.28-3.12 5.28-.76 2-1.14 4.12-1.14 6.36h33.12c0-2-.22-4.06-.66-6.18-.44-2.12-1.3-4.02-2.58-5.7-1.28-1.68-3.1-3.02-5.46-4.02-2.36-1-5.5-1.38-9.42-1.14ZM858.57 97.21c.64.48.96 1.16.96 2.04v74.88c-.08 1.04-.12 2.12-.12 3.24-1.84-1.52-3.56-2.92-5.16-4.2-1.36-1.12-2.66-2.18-3.9-3.18-1.24-1-2.06-1.66-2.46-1.98-1.76 2.48-4.26 4.44-7.5 5.88-3.24 1.44-7.02 2.16-11.34 2.16-3.84 0-7.4-.7-10.68-2.1-3.28-1.4-6.14-3.44-8.58-6.12-2.44-2.68-4.34-5.94-5.7-9.78-1.36-3.84-2.04-8.16-2.04-12.96 0-4.32.78-8.34 2.34-12.06 1.56-3.72 3.6-6.92 6.12-9.6 2.52-2.68 5.38-4.78 8.58-6.3 3.2-1.52 6.48-2.28 9.84-2.28 2.56 0 4.82.22 6.78.66 1.96.44 3.68 1.06 5.16 1.86s2.78 1.74 3.9 2.82a35.92 35.92 0 0 1 3.12 3.42V88.57l10.68 8.64Zm-27.96 67.92c3.6 0 6.52-.68 8.76-2.04 2.24-1.36 3.98-3.06 5.22-5.1a20.5 20.5 0 0 0 2.58-6.54c.48-2.32.72-4.44.72-6.36v-1.2c0-1.12-.22-2.7-.66-4.74-.44-2.04-1.28-4.06-2.52-6.06s-3-3.7-5.28-5.1c-2.28-1.4-5.22-2.02-8.82-1.86-3.44 0-6.26.74-8.46 2.22-2.2 1.48-3.96 3.26-5.28 5.34-1.32 2.08-2.24 4.2-2.76 6.36-.52 2.16-.78 3.92-.78 5.28 0 1.84.24 3.92.72 6.24.48 2.32 1.36 4.48 2.64 6.48s3.04 3.68 5.28 5.04c2.24 1.36 5.12 2.04 8.64 2.04ZM882.81 97.09c.64.48.96 1.12.96 1.92l-.12 41.04v37.08l-10.56-8.4c-.72-.64-1.08-1.44-1.08-2.4V88.45l10.8 8.64ZM950.36 146.05c0 .88.02 1.5.06 1.86.04.36-.02.98-.18 1.86h-7.08c-2.08 0-4.44-.02-7.08-.06-2.64-.04-5.36-.06-8.16-.06h-22.08c0 2.88.56 5.36 1.68 7.44 1.12 2.08 2.6 3.8 4.44 5.16 1.84 1.36 3.94 2.36 6.3 3 2.36.64 4.74.96 7.14.96 3.04 0 5.9-.76 8.58-2.28 2.68-1.52 4.94-3.52 6.78-6 .64.56 1.54 1.48 2.7 2.76 1.16 1.28 2.94 3.2 5.34 5.76-2.8 3.36-6.22 6.02-10.26 7.98-4.04 1.96-8.42 2.94-13.14 2.94-4.72 0-8.92-.64-12.84-1.92-3.92-1.28-7.32-3.24-10.2-5.88-2.88-2.64-5.12-5.98-6.72-10.02-1.6-4.04-2.4-8.82-2.4-14.34 0-4.96.66-9.42 1.98-13.38 1.32-3.96 3.22-7.32 5.7-10.08s5.44-4.9 8.88-6.42c3.44-1.52 7.32-2.28 11.64-2.28 5.76 0 10.52.88 14.28 2.64 3.76 1.76 6.72 4.16 8.88 7.2 2.16 3.04 3.66 6.54 4.5 10.5.84 3.96 1.26 8.18 1.26 12.66Zm-29.4-22.8c-2.16.16-4.16.72-6 1.68-1.84.96-3.42 2.2-4.74 3.72-1.32 1.52-2.36 3.28-3.12 5.28-.76 2-1.14 4.12-1.14 6.36h33.12c0-2-.22-4.06-.66-6.18-.44-2.12-1.3-4.02-2.58-5.7-1.28-1.68-3.1-3.02-5.46-4.02-2.36-1-5.5-1.38-9.42-1.14Z" style="fill-rule:nonzero" transform="translate(-452.406 -63.709) scale(1.00797)"/><path d="M79.32 36.98v150.76L95 174.54l6.59-156.31-22.27 18.75Z" style="fill:url(#a);fill-rule:nonzero" transform="matrix(.80638 0 0 .80638 2.361 1.094)"/><path d="M79.32 36.98 57.05 18.23l6.59 156.31 15.68 13.2V36.98Z" style="fill:url(#b);fill-rule:nonzero" transform="matrix(.80638 0 0 .80638 2.361 1.094)"/><path d="m25.19 104.83 8.63 49.04 12.5-14.95-2.46-56.42-18.67 22.33Z" style="fill:url(#c);fill-rule:nonzero" transform="matrix(.80638 0 0 .80638 2.361 1.094)"/><path d="M25.19 104.83 0 90.24l16.97 53.86 16.85 9.77-8.63-49.04Z" style="fill:url(#d);fill-rule:nonzero" transform="matrix(.80638 0 0 .80638 2.361 1.094)"/><path d="M43.86 82.5 18.69 67.98 0 90.24l25.18 14.59L43.86 82.5Z" style="fill:#9c3;fill-rule:nonzero" transform="matrix(.80638 0 0 .80638 2.361 1.094)"/><path d="m134.82 78.69-9.97 56.5 15.58-9.04L160 64.1l-25.18 14.59Z" style="fill:url(#e);fill-rule:nonzero" transform="matrix(.80638 0 0 .80638 2.361 1.094)"/><path d="m134.82 78.69-18.68-22.33-2.86 65 11.57 13.83 9.97-56.5Z" style="fill:url(#f);fill-rule:nonzero" transform="matrix(.80638 0 0 .80638 2.361 1.094)"/><path d="m160 64.1-18.69-22.26-25.17 14.52 18.67 22.33L160 64.1Z" style="fill:#ffe113;fill-rule:nonzero" transform="matrix(.80638 0 0 .80638 2.361 1.094)"/><path d="M101.59 18.23 79.32 0 57.05 18.23l22.27 18.75 22.27-18.75Z" style="fill:#f3e600;fill-rule:nonzero" transform="matrix(.80638 0 0 .80638 2.361 1.094)"/><defs><linearGradient id="a" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(.84 -162.96 162.96 .84 89.64 184.81)"><stop offset="0" style="stop-color:#62d399;stop-opacity:1"/><stop offset=".51" style="stop-color:#acd842;stop-opacity:1"/><stop offset=".9" style="stop-color:#d7db0a;stop-opacity:1"/><stop offset="1" style="stop-color:#d7db0a;stop-opacity:1"/></linearGradient><linearGradient id="b" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="rotate(-90.565 123.412 54.953) scale(162.14)"><stop offset="0" style="stop-color:#0ba398;stop-opacity:1"/><stop offset=".5" style="stop-color:#4ca352;stop-opacity:1"/><stop offset="1" style="stop-color:#76a30a;stop-opacity:1"/></linearGradient><linearGradient id="c" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="scale(-68) rotate(88.4 .881 -1.396)"><stop offset="0" style="stop-color:#36a382;stop-opacity:1"/><stop offset=".19" style="stop-color:#36a382;stop-opacity:1"/><stop offset=".54" style="stop-color:#49a459;stop-opacity:1"/><stop offset="1" style="stop-color:#76a30b;stop-opacity:1"/></linearGradient><linearGradient id="d" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="rotate(-88 87.255 68.431) scale(62.42)"><stop offset="0" style="stop-color:#267880;stop-opacity:1"/><stop offset=".51" style="stop-color:#457a5c;stop-opacity:1"/><stop offset="1" style="stop-color:#717516;stop-opacity:1"/></linearGradient><linearGradient id="e" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="rotate(-79.1 149.53 -14.065) scale(73.28)"><stop offset="0" style="stop-color:#b0d939;stop-opacity:1"/><stop offset="1" style="stop-color:#eadb04;stop-opacity:1"/></linearGradient><linearGradient id="f" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="rotate(-67.997 148.705 -15.558) scale(69.8226)"><stop offset="0" style="stop-color:#74af52;stop-opacity:1"/><stop offset=".17" style="stop-color:#74af52;stop-opacity:1"/><stop offset=".48" style="stop-color:#99be32;stop-opacity:1"/><stop offset="1" style="stop-color:#c0c40a;stop-opacity:1"/></linearGradient></defs></svg>',fP=btoa(gP),yP="data:image/svg+xml;charset=utf-8;base64,"+fP,Sb=yP,Cb=typeof window!==void 0?window.location.search.includes("debugcontext"):!1;var de=(o=>(o.ContextRegistered="ContextRegistered",o.ContextCreationStart="ContextCreationStart",o.ContextCreated="ContextCreated",o.ContextFirstFrameRendered="ContextFirstFrameRendered",o.ContextDestroying="ContextDestroying",o.ContextDestroyed="ContextDestroyed",o.MissingCamera="MissingCamera",o.ContextClearing="ContextClearing",o.ContextCleared="ContextCleared",o))(de||{});class ue{static get Current(){return globalThis["NeedleEngine.Context.Current"]}static set Current(e){globalThis["NeedleEngine.Context.Current"]=e}static get All(){return this.Registered}static Registered=[];static register(e){this.Registered.indexOf(e)===-1&&(Cb&&console.warn("Registering context"),this.Registered.push(e),this.dispatchCallback("ContextRegistered",e))}static unregister(e){const t=this.Registered.indexOf(e);t!==-1&&(Cb&&console.warn("Unregistering context"),this.Registered.splice(t,1))}static _callbacks={};static registerCallback(e,t){this._callbacks[e]||(this._callbacks[e]=[]),this._callbacks[e].push(t)}static unregisterCallback(e,t){if(!this._callbacks[e])return;const i=this._callbacks[e].indexOf(t);i!==-1&&this._callbacks[e].splice(i,1)}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 s=new Array;return this._callbacks[e].forEach(r=>{const a=r(n);a instanceof Promise&&s.push(a)}),Promise.all(s)}static addContextCreatedCallback(e){this.registerCallback("ContextCreated",e)}static addContextDestroyedCallback(e){this.registerCallback("ContextDestroyed",e)}}const Pb=()=>o=>o;function bP(o){return Pb()(o)}function _P(){return!!x("debug")}class xi{_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 cr=!1;const Rm=new Array;typeof window<"u"&&setTimeout(()=>{if(cr){const o={},e=new URL(window.location.href),t=new URL(e);t.searchParams.append("console","");const i=t.toString().replace(/=$|=(?=&)/g,"");for(const s of Rm){const r=new URL(e);r.searchParams.append(s,""),o[s]=r.toString().replace(/=$|=(?=&)/g,"")}console.log(`\u{1F335} ?help: Debug Options for Needle Engine.
|
|
1
|
+
import{Vector2 as J,Vector3 as b,Vector4 as pe,Quaternion as U,PlaneGeometry as Bn,WebGLRenderer as rr,PerspectiveCamera as re,OrthographicCamera as hd,Scene as yi,Mesh as H,Texture as Re,Uniform$1 as Vi,Color as ne,ShaderMaterial as Fn,Box3 as bi,ShadowMaterial as H0,Euler as nt,MeshStandardMaterial as ut,Box3Helper as uS,GridHelper as am,Object3D as k,Material as ve,Matrix3 as G0,Matrix4 as ee,Layers as as,Ray as ls,MathUtils as yo,AxesHelper as _i,MeshBasicMaterial as we,DoubleSide as vi,BufferGeometry as mn,Group as cs,CylinderGeometry as q0,SphereGeometry as dd,BoxGeometry as va,SpriteMaterial as pS,Sprite as mS,Shape as gS,ExtrudeGeometry as fS,Fog as X0,DirectionalLight as lm,PointLight as cm,EdgesGeometry as yS,LineSegments as Q0,LineBasicMaterial as hm,Line as xa,BufferAttribute as pt,Raycaster as ud,Sphere as pd,ArrayCamera as bS,Plane as ar,SkinnedMesh as hs,InterleavedBufferAttribute as Y0,Skeleton as _S,Bone as vS,WebGLCubeRenderTarget as xS,CubeCamera as wS,AnimationClip as Wi,FileLoader as dm,TextureLoader as Gl,PropertyBinding as wa,KeyframeTrack as SS,LinearSRGBColorSpace as bo,ShaderChunk as Wt,UniformsLib as CS,DataTexture as um,RGBAFormat as md,EquirectangularReflectionMapping as _o,SRGBColorSpace as vo,Clock as PS,NeutralToneMapping as Sa,AgXToneMapping as gd,ACESFilmicToneMapping as fd,NoToneMapping as yd,PCFSoftShadowMap$1 as OS,BasicNodeLibrary as kS,WebGLRenderTarget as zn,DepthTexture as Z0,NearestFilter as bd,LoopRepeat as MS,LoopOnce as pm,AnimationMixer as mm,CompressedTexture as RS,FrontSide as ds,Camera as TS,Frustum as K0,AudioListener as ES,PositionalAudio as AS,AudioLoader as gm,EventDispatcher as fm,BackSide as _d,MeshDepthMaterial as IS,CustomBlending as LS,MaxEquation as jS,AmbientLight as DS,HemisphereLight as BS,AlwaysStencilFunc as FS,GreaterEqualStencilFunc as zS,NotEqualStencilFunc as US,GreaterStencilFunc as NS,LessEqualStencilFunc as VS,EqualStencilFunc as WS,LessStencilFunc as $S,NeverStencilFunc as J0,InvertStencilOp as HS,DecrementWrapStencilOp as GS,IncrementWrapStencilOp as qS,DecrementStencilOp as XS,IncrementStencilOp as QS,ReplaceStencilOp as YS,ZeroStencilOp as ZS,KeepStencilOp as KS,RawShaderMaterial as eb,GLSL3 as JS,AlwaysDepth as eC,GreaterEqualDepth as tC,GreaterDepth as iC,LessEqualDepth as nC,LessDepth as oC,NotEqualDepth as sC,EqualDepth as rC,BatchedMesh as tb,MeshPhysicalMaterial as ym,LinearFilter as vd,UnsignedByteType as aC,RingGeometry as lC,Line3 as cC,AdditiveBlending as ib,BoxHelper as hC,SpotLight as dC,DirectionalLightHelper as uC,CameraHelper as pC,LOD as mC,Triangle as gC,NormalBlending as fC,ReinhardToneMapping as bm,LinearToneMapping as _m,HalfFloatType as vm,VideoTexture as yC,CubeUVReflectionMapping as nb,CubeTexture as bC,CompressedCubeTexture as _C,EquirectangularRefractionMapping as vC,CatmullRomCurve3 as xC,VectorKeyframeTrack as wC,QuaternionKeyframeTrack as SC,Audio as CC,ShaderLib as xd,UniformsUtils as ob,MirroredRepeatWrapping as sb,MeshNormalMaterial as PC,AudioContext as OC,PMREMGenerator$1 as kC}from"./three-qw28ZtTy.min.js";import{createLoaders as xm,getRaycastMesh as rb,LODsManager as lr,NEEDLE_progressive as $e,addDracoAndKTX2Loaders as MC,configureLoader as RC,setKTX2TranscoderLocation as TC,setDracoDecoderLocation as EC}from"./gltf-progressive-CoZbSfPR.min.js";import{GroundedSkybox as Ca,Font as AC,TextGeometry as IC,FontLoader as LC,GLTFLoader as xo,TransformControlsGizmo as ab,EXRLoader as wm,RGBELoader as lb,Stats as jC,nodeFrame as DC,OrbitControls as cb,PositionalAudioHelper as BC,HorizontalBlurShader as FC,VerticalBlurShader as zC,GLTFExporter as hb,strToU8 as db,zipSync as UC,XRControllerModelFactory as NC,XRHandMeshModel as VC,Line2 as WC,LineGeometry as $C,LineMaterial as HC,TransformControls as GC,InteractiveGroup as qC,HTMLMesh as XC,VertexNormalsHelper as QC,OBJLoader as Sm,FBXLoader as ub,mergeVertices as YC}from"./three-examples-BivkhnvN.min.js";import{fetchProfile as ZC,MotionController as KC,$70d766613f57b014$export$2e2bcd8739ae039 as pb,ByteBuffer as JC,v5 as mb,md5 as gb,SIZE_PREFIX_LENGTH as fb,Builder as Cm,createNoise4D as eP,Matrix4 as Pm,BatchedParticleRenderer as tP,ParticleSystem as iP,RenderMode as wo,ConstantColor as nP,Vector4 as oP,ConstantValue as sP,TrailParticle as yb,WorkerBase as rP,MeshBVH as aP}from"./vendor-DPCU8cUF.min.js";import{__webpack_exports__default as Ce,__webpack_exports__Text as bb,__webpack_exports__Block as _b,__webpack_exports__update as lP,SimpleStateBehavior as cP,__webpack_exports__Inline as Om,__webpack_exports__FontLibrary as vb,ThreeMeshUI as xb}from"./three-mesh-ui-DhYXcXZe.min.js";import{EffectAttribute as hP}from"./postprocessing-BHMVuZQ1.min.js";const km=new Map;function $i(o=globalThis.location?.hostname){if(km.has(o))return km.get(o);const e=/(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})|localhost/.test(o);return km.set(o,e),e===!0}function wb(){return window.location.hostname.includes("glitch.me")}const dP='<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 160 187.74"><defs><linearGradient id="a" x1="89.64" y1="184.81" x2="90.48" y2="21.85" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#62d399"/><stop offset=".51" stop-color="#acd842"/><stop offset=".9" stop-color="#d7db0a"/></linearGradient><linearGradient id="b" x1="69.68" y1="178.9" x2="68.08" y2="16.77" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#0ba398"/><stop offset=".5" stop-color="#4ca352"/><stop offset="1" stop-color="#76a30a"/></linearGradient><linearGradient id="c" x1="36.6" y1="152.17" x2="34.7" y2="84.19" gradientUnits="userSpaceOnUse"><stop offset=".19" stop-color="#36a382"/><stop offset=".54" stop-color="#49a459"/><stop offset="1" stop-color="#76a30b"/></linearGradient><linearGradient id="d" x1="15.82" y1="153.24" x2="18" y2="90.86" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#267880"/><stop offset=".51" stop-color="#457a5c"/><stop offset="1" stop-color="#717516"/></linearGradient><linearGradient id="e" x1="135.08" y1="135.43" x2="148.93" y2="63.47" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#b0d939"/><stop offset="1" stop-color="#eadb04"/></linearGradient><linearGradient id="f" x1="-4163.25" y1="2285.12" x2="-4160.81" y2="2215.34" gradientTransform="rotate(20 4088.49 13316.712)" gradientUnits="userSpaceOnUse"><stop offset=".17" stop-color="#74af52"/><stop offset=".48" stop-color="#99be32"/><stop offset="1" stop-color="#c0c40a"/></linearGradient><symbol id="g" viewBox="0 0 160 187.74"><path style="fill:url(#a)" d="M79.32 36.98v150.76L95 174.54l6.59-156.31-22.27 18.75z"/><path style="fill:url(#b)" d="M79.32 36.98 57.05 18.23l6.59 156.31 15.68 13.2V36.98z"/><path style="fill:url(#c)" d="m25.19 104.83 8.63 49.04 12.5-14.95-2.46-56.42-18.67 22.33z"/><path style="fill:url(#d)" d="M25.19 104.83 0 90.24l16.97 53.86 16.85 9.77-8.63-49.04z"/><path style="fill:#9c3" d="M43.86 82.5 18.69 67.98 0 90.24l25.18 14.59L43.86 82.5z"/><path style="fill:url(#e)" d="m134.82 78.69-9.97 56.5 15.58-9.04L160 64.1l-25.18 14.59z"/><path style="fill:url(#f)" d="m134.82 78.69-18.68-22.33-2.86 65 11.57 13.83 9.97-56.5z"/><path style="fill:#ffe113" d="m160 64.1-18.69-22.26-25.17 14.52 18.67 22.33L160 64.1z"/><path style="fill:#f3e600" d="M101.59 18.23 79.32 0 57.05 18.23l22.27 18.75 22.27-18.75z"/></symbol></defs><use width="160" height="187.74" xlink:href="#g"/></svg>',uP=btoa(dP),pP="data:image/svg+xml;base64,"+uP,Mm=pP,mP=`<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN' 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'> <svg clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="2" version="1.1" viewBox="0 0 1014 282" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"> <g transform="matrix(1.008 0 0 1.008 -2.239 .61874)"> <path d="m665.95 132.73v44.88l-10.56-8.4c-0.8-0.64-1.2-1.44-1.2-2.4v-32.4c0-6.48-4.12-9.72-12.36-9.72-2.16 0-4.18 0.4-6.06 1.2s-3.54 1.8-4.98 3-2.56 2.5-3.36 3.9-1.2 2.7-1.2 3.9v40.92l-10.68-8.4c-0.72-0.64-1.08-1.44-1.08-2.4v-53.76l10.92 8.52c0.32 0.24 0.56 0.44 0.72 0.6s0.36 0.32 0.6 0.48c0.96-1.2 2.14-2.28 3.54-3.24s2.92-1.76 4.56-2.4 3.34-1.14 5.1-1.5 3.44-0.54 5.04-0.54c1.44 0 2.92 0.04 4.44 0.12s2.84 0.28 3.96 0.6c4.56 1.12 7.8 3.12 9.72 6s2.88 6.56 2.88 11.04z" fill-rule="nonzero"/> </g> <g transform="matrix(1.008 0 0 1.008 -2.239 .61874)"> <path d="m732.38 146.05c0 0.88 0.02 1.5 0.06 1.86s-0.02 0.98-0.18 1.86h-7.08c-2.08 0-4.44-0.02-7.08-0.06s-5.36-0.06-8.16-0.06h-22.08c0 2.88 0.56 5.36 1.68 7.44s2.6 3.8 4.44 5.16 3.94 2.36 6.3 3 4.74 0.96 7.14 0.96c3.04 0 5.9-0.76 8.58-2.28s4.94-3.52 6.78-6c0.64 0.56 1.54 1.48 2.7 2.76s2.94 3.2 5.34 5.76c-2.8 3.36-6.22 6.02-10.26 7.98s-8.42 2.94-13.14 2.94-8.92-0.64-12.84-1.92-7.32-3.24-10.2-5.88-5.12-5.98-6.72-10.02-2.4-8.82-2.4-14.34c0-4.96 0.66-9.42 1.98-13.38s3.22-7.32 5.7-10.08 5.44-4.9 8.88-6.42 7.32-2.28 11.64-2.28c5.76 0 10.52 0.88 14.28 2.64s6.72 4.16 8.88 7.2 3.66 6.54 4.5 10.5 1.26 8.18 1.26 12.66zm-29.4-22.8c-2.16 0.16-4.16 0.72-6 1.68s-3.42 2.2-4.74 3.72-2.36 3.28-3.12 5.28-1.14 4.12-1.14 6.36h33.12c0-2-0.22-4.06-0.66-6.18s-1.3-4.02-2.58-5.7-3.1-3.02-5.46-4.02-5.5-1.38-9.42-1.14z" fill-rule="nonzero"/> </g> <g transform="matrix(1.008 0 0 1.008 -2.239 .61874)"> <path d="m795.93 146.05c0 0.88 0.02 1.5 0.06 1.86s-0.02 0.98-0.18 1.86h-7.08c-2.08 0-4.44-0.02-7.08-0.06s-5.36-0.06-8.16-0.06h-22.08c0 2.88 0.56 5.36 1.68 7.44s2.6 3.8 4.44 5.16 3.94 2.36 6.3 3 4.74 0.96 7.14 0.96c3.04 0 5.9-0.76 8.58-2.28s4.94-3.52 6.78-6c0.64 0.56 1.54 1.48 2.7 2.76s2.94 3.2 5.34 5.76c-2.8 3.36-6.22 6.02-10.26 7.98s-8.42 2.94-13.14 2.94-8.92-0.64-12.84-1.92-7.32-3.24-10.2-5.88-5.12-5.98-6.72-10.02-2.4-8.82-2.4-14.34c0-4.96 0.66-9.42 1.98-13.38s3.22-7.32 5.7-10.08 5.44-4.9 8.88-6.42 7.32-2.28 11.64-2.28c5.76 0 10.52 0.88 14.28 2.64s6.72 4.16 8.88 7.2 3.66 6.54 4.5 10.5 1.26 8.18 1.26 12.66zm-29.4-22.8c-2.16 0.16-4.16 0.72-6 1.68s-3.42 2.2-4.74 3.72-2.36 3.28-3.12 5.28-1.14 4.12-1.14 6.36h33.12c0-2-0.22-4.06-0.66-6.18s-1.3-4.02-2.58-5.7-3.1-3.02-5.46-4.02-5.5-1.38-9.42-1.14z" fill-rule="nonzero"/> </g> <g transform="matrix(1.008 0 0 1.008 -2.239 .61874)"> <path d="m858.57 97.21c0.64 0.48 0.96 1.16 0.96 2.04v74.88c-0.08 1.04-0.12 2.12-0.12 3.24-1.84-1.52-3.56-2.92-5.16-4.2-1.36-1.12-2.66-2.18-3.9-3.18s-2.06-1.66-2.46-1.98c-1.76 2.48-4.26 4.44-7.5 5.88s-7.02 2.16-11.34 2.16c-3.84 0-7.4-0.7-10.68-2.1s-6.14-3.44-8.58-6.12-4.34-5.94-5.7-9.78-2.04-8.16-2.04-12.96c0-4.32 0.78-8.34 2.34-12.06s3.6-6.92 6.12-9.6 5.38-4.78 8.58-6.3 6.48-2.28 9.84-2.28c2.56 0 4.82 0.22 6.78 0.66s3.68 1.06 5.16 1.86 2.78 1.74 3.9 2.82 2.16 2.22 3.12 3.42v-35.04l10.68 8.64zm-27.96 67.92c3.6 0 6.52-0.68 8.76-2.04s3.98-3.06 5.22-5.1 2.1-4.22 2.58-6.54 0.72-4.44 0.72-6.36v-1.2c0-1.12-0.22-2.7-0.66-4.74s-1.28-4.06-2.52-6.06-3-3.7-5.28-5.1-5.22-2.02-8.82-1.86c-3.44 0-6.26 0.74-8.46 2.22s-3.96 3.26-5.28 5.34-2.24 4.2-2.76 6.36-0.78 3.92-0.78 5.28c0 1.84 0.24 3.92 0.72 6.24s1.36 4.48 2.64 6.48 3.04 3.68 5.28 5.04 5.12 2.04 8.64 2.04z" fill-rule="nonzero"/> </g> <g transform="matrix(1.008 0 0 1.008 -2.239 .61874)"> <path d="m882.81 97.09c0.64 0.48 0.96 1.12 0.96 1.92l-0.12 41.04v37.08l-10.56-8.4c-0.72-0.64-1.08-1.44-1.08-2.4v-77.88l10.8 8.64z" fill-rule="nonzero"/> </g> <g transform="matrix(1.008 0 0 1.008 -2.239 .61874)"> <path d="m950.36 146.05c0 0.88 0.02 1.5 0.06 1.86s-0.02 0.98-0.18 1.86h-7.08c-2.08 0-4.44-0.02-7.08-0.06s-5.36-0.06-8.16-0.06h-22.08c0 2.88 0.56 5.36 1.68 7.44s2.6 3.8 4.44 5.16 3.94 2.36 6.3 3 4.74 0.96 7.14 0.96c3.04 0 5.9-0.76 8.58-2.28s4.94-3.52 6.78-6c0.64 0.56 1.54 1.48 2.7 2.76s2.94 3.2 5.34 5.76c-2.8 3.36-6.22 6.02-10.26 7.98s-8.42 2.94-13.14 2.94-8.92-0.64-12.84-1.92-7.32-3.24-10.2-5.88-5.12-5.98-6.72-10.02-2.4-8.82-2.4-14.34c0-4.96 0.66-9.42 1.98-13.38s3.22-7.32 5.7-10.08 5.44-4.9 8.88-6.42 7.32-2.28 11.64-2.28c5.76 0 10.52 0.88 14.28 2.64s6.72 4.16 8.88 7.2 3.66 6.54 4.5 10.5 1.26 8.18 1.26 12.66zm-29.4-22.8c-2.16 0.16-4.16 0.72-6 1.68s-3.42 2.2-4.74 3.72-2.36 3.28-3.12 5.28-1.14 4.12-1.14 6.36h33.12c0-2-0.22-4.06-0.66-6.18s-1.3-4.02-2.58-5.7-3.1-3.02-5.46-4.02-5.5-1.38-9.42-1.14z" fill-rule="nonzero"/> </g> <g transform="matrix(1.8559 0 0 .7642 45.348 36.475)"> <g transform="translate(2.7114)"> <path d="m3.935 173.02c-0.331 0-0.497-0.402-0.497-1.207v-51.002c0-0.738 0.138-1.107 0.414-1.107h1.781c0.277 0 0.415 0.335 0.415 1.006v5.935c0 0.336 0.027 0.553 0.083 0.654 0.055 0.101 0.151-0.017 0.289-0.352 0.912-1.744 1.754-3.236 2.527-4.477 0.773-1.24 1.554-2.179 2.341-2.816s1.65-0.956 2.588-0.956c1.685 0 3.011 0.922 3.977 2.766 0.967 1.845 1.602 3.84 1.905 5.986 0.056 0.268 0.139 0.369 0.249 0.302s0.221-0.235 0.331-0.503c0.939-1.811 1.802-3.353 2.589-4.628 0.787-1.274 1.581-2.246 2.382-2.917s1.671-1.006 2.61-1.006c2.016 0 3.569 1.392 4.66 4.175 1.09 2.783 1.636 6.421 1.636 10.915v37.925c0 0.871-0.18 1.307-0.539 1.307h-1.739c-0.138 0-0.249-0.1-0.332-0.301-0.083-0.202-0.124-0.503-0.124-0.906v-36.315c0-3.555-0.338-6.321-1.015-8.3-0.676-1.978-1.76-2.967-3.251-2.967-0.884 0-1.726 0.386-2.527 1.157s-1.519 1.727-2.154 2.867-1.201 2.213-1.699 3.219c-0.248 0.469-0.421 0.905-0.517 1.308-0.097 0.402-0.145 0.972-0.145 1.71v37.221c0 0.871-0.166 1.307-0.497 1.307h-1.74c-0.166 0-0.29-0.1-0.373-0.301-0.083-0.202-0.124-0.503-0.124-0.906v-36.315c0-3.555-0.332-6.321-0.994-8.3-0.663-1.978-1.754-2.967-3.273-2.967-1.242 0-2.375 0.704-3.396 2.112-1.022 1.409-2.223 3.555-3.604 6.439v39.031c0 0.805-0.18 1.207-0.539 1.207h-1.698z" fill-rule="nonzero" stroke="#000" stroke-width=".7px"/> </g> <g transform="translate(2.7114)"> <path d="m53.642 166.28c-1.077 2.549-2.237 4.477-3.479 5.785-1.243 1.307-2.61 1.961-4.101 1.961-2.154 0-3.853-1.324-5.095-3.973-1.243-2.649-1.864-6.187-1.864-10.613 0-3.488 0.4-6.489 1.201-9.004s1.988-4.51 3.562-5.985c1.574-1.476 3.521-2.414 5.841-2.817l3.686-0.704c0.221-0.067 0.394-0.218 0.518-0.453 0.124-0.234 0.187-0.587 0.187-1.056v-2.917c0-3.89-0.504-6.975-1.512-9.255s-2.354-3.42-4.039-3.42c-1.298 0-2.472 0.72-3.521 2.162s-2.002 3.572-2.858 6.388c-0.083 0.268-0.159 0.453-0.228 0.554-0.069 0.1-0.172 0.083-0.311-0.051l-1.698-1.71c-0.083-0.134-0.138-0.285-0.166-0.453-0.027-0.167 0.014-0.452 0.125-0.855 0.856-3.353 2.009-6.052 3.459-8.098 1.449-2.045 3.224-3.068 5.322-3.068 1.74 0 3.211 0.687 4.412 2.062s2.112 3.37 2.734 5.986c0.621 2.615 0.932 5.7 0.932 9.255v35.712c0 0.536-0.035 0.888-0.104 1.056s-0.2 0.251-0.393 0.251h-1.533c-0.166 0-0.29-0.117-0.373-0.352-0.083-0.234-0.124-0.553-0.124-0.955l-0.083-5.231c-0.055-0.939-0.221-1.006-0.497-0.202zm0.456-19.314c0-1.14-0.194-1.643-0.58-1.509l-3.107 0.603c-1.436 0.202-2.686 0.638-3.749 1.308-1.063 0.671-1.953 1.543-2.671 2.616s-1.257 2.33-1.616 3.772-0.538 3.102-0.538 4.98c0 3.152 0.455 5.616 1.367 7.393 0.911 1.778 2.14 2.666 3.686 2.666 0.939 0 1.85-0.419 2.734-1.257s1.671-1.895 2.361-3.169c0.663-1.408 1.181-2.85 1.553-4.326 0.373-1.475 0.56-2.883 0.56-4.225v-8.852z" fill-rule="nonzero" stroke="#000" stroke-width=".7px"/> </g> <g transform="translate(2.7114)"> <path d="m79.034 173.02c-0.166 0-0.297-0.117-0.394-0.352-0.096-0.234-0.145-0.553-0.145-0.955v-4.628c0-0.536-0.041-0.838-0.124-0.905s-0.207 0.1-0.373 0.503c-0.276 0.67-0.69 1.593-1.242 2.766-0.553 1.174-1.271 2.23-2.154 3.169-0.884 0.939-1.961 1.408-3.231 1.408-1.74 0-3.314-0.989-4.722-2.967-1.409-1.979-2.534-4.963-3.376-8.953-0.843-3.991-1.264-8.937-1.264-14.838 0-5.701 0.415-10.68 1.243-14.939s1.988-7.595 3.479-10.009c1.492-2.415 3.204-3.622 5.137-3.622 1.436 0 2.616 0.57 3.541 1.71 0.926 1.14 1.719 2.381 2.382 3.722 0.249 0.47 0.414 0.637 0.497 0.503s0.125-0.536 0.125-1.207v-23.841c0-0.805 0.151-1.208 0.455-1.208h1.864c0.276 0 0.414 0.369 0.414 1.107v72.128c0 0.537-0.041 0.905-0.124 1.107-0.083 0.201-0.235 0.301-0.455 0.301h-1.533zm-0.621-42.049c-0.939-2.213-1.885-3.94-2.838-5.181s-2.009-1.861-3.169-1.861c-1.463 0-2.768 0.889-3.914 2.666s-2.044 4.376-2.693 7.796-0.973 7.578-0.973 12.474c0 5.097 0.338 9.272 1.015 12.524 0.676 3.253 1.567 5.651 2.672 7.193 1.104 1.543 2.305 2.314 3.603 2.314 1.188 0 2.258-0.704 3.211-2.113 0.952-1.408 1.705-3.118 2.257-5.13s0.829-3.957 0.829-5.835v-24.847z" fill-rule="nonzero" stroke="#000" stroke-width=".7px"/> </g> <g transform="translate(2.7114)"> <path d="m89.514 149.38c0 3.42 0.345 6.606 1.035 9.557 0.691 2.951 1.609 5.315 2.755 7.092s2.437 2.666 3.873 2.666c1.519 0 2.837-0.738 3.956-2.213 1.118-1.476 2.064-3.655 2.837-6.539 0.083-0.336 0.166-0.52 0.249-0.554 0.083-0.033 0.179 0.017 0.29 0.151l1.408 1.912c0.221 0.268 0.235 0.67 0.041 1.207-0.69 2.548-1.47 4.661-2.34 6.337-0.87 1.677-1.857 2.935-2.962 3.773-1.104 0.838-2.319 1.257-3.645 1.257-2.043 0-3.838-1.14-5.385-3.42-1.546-2.28-2.761-5.482-3.645-9.607-0.884-4.124-1.325-8.836-1.325-14.134 0-5.901 0.455-10.931 1.367-15.089 0.911-4.158 2.14-7.377 3.686-9.658 1.547-2.28 3.3-3.42 5.261-3.42 1.988 0 3.714 1.073 5.178 3.219 1.463 2.146 2.595 5.231 3.396 9.255s1.201 8.886 1.201 14.587c0 0.469-0.02 0.939-0.062 1.408-0.041 0.469-0.214 0.704-0.517 0.704h-16.362c-0.083 0-0.152 0.151-0.207 0.453-0.056 0.302-0.083 0.654-0.083 1.056zm13.752-6.237c0.304 0 0.497-0.1 0.58-0.302 0.083-0.201 0.124-0.57 0.124-1.106 0-3.219-0.283-6.187-0.849-8.903s-1.367-4.896-2.402-6.539c-1.036-1.643-2.272-2.464-3.708-2.464-1.629 0-2.996 0.955-4.101 2.867-1.104 1.911-1.94 4.342-2.506 7.293s-0.849 6.002-0.849 9.154h13.711z" fill-rule="nonzero" stroke="#000" stroke-width=".7px"/> </g> <g transform="translate(2.7114)"> <path d="m148.54 119.7c0.165 0 0.283 0.117 0.352 0.352s0.076 0.52 0.02 0.855l-6.254 50.902c-0.028 0.47-0.104 0.788-0.228 0.956s-0.297 0.251-0.518 0.251h-1.615c-0.442 0-0.718-0.402-0.829-1.207l-5.26-40.138c-0.111-0.604-0.201-0.905-0.27-0.905s-0.131 0.301-0.186 0.905l-5.012 40.138c-0.028 0.47-0.097 0.788-0.207 0.956-0.111 0.168-0.277 0.251-0.497 0.251h-1.74c-0.442 0-0.718-0.402-0.829-1.207l-6.503-50.801c-0.055-0.403-0.048-0.721 0.021-0.956s0.2-0.352 0.393-0.352h1.823c0.166 0 0.297 0.067 0.393 0.201 0.097 0.134 0.159 0.403 0.187 0.805l5.302 41.848c0.083 0.671 0.179 0.989 0.29 0.956 0.11-0.034 0.207-0.386 0.29-1.056l5.219-41.949c0.055-0.268 0.124-0.47 0.207-0.604s0.193-0.201 0.331-0.201h1.533c0.138 0 0.262 0.067 0.373 0.201 0.11 0.134 0.179 0.403 0.207 0.805l5.468 41.848c0.083 0.671 0.179 0.989 0.29 0.956 0.11-0.034 0.207-0.386 0.29-1.056l5.053-41.849c0.055-0.335 0.138-0.57 0.249-0.704 0.11-0.134 0.234-0.201 0.373-0.201h1.284z" fill-rule="nonzero" stroke="#000" stroke-width=".7px"/> </g> <g transform="translate(2.7114)"> <path d="m156.49 171.51c0 0.604-0.042 1.006-0.125 1.208-0.082 0.201-0.262 0.301-0.538 0.301h-1.533c-0.221 0-0.366-0.083-0.435-0.251s-0.103-0.486-0.103-0.956v-50.902c0-0.805 0.152-1.207 0.456-1.207h1.822c0.304 0 0.456 0.402 0.456 1.207v50.6zm0.165-63.979c0 1.207-0.207 1.811-0.621 1.811h-1.905c-0.221 0-0.366-0.135-0.435-0.403s-0.104-0.67-0.104-1.207v-7.847c0-1.006 0.18-1.509 0.539-1.509h1.988c0.359 0 0.538 0.47 0.538 1.409v7.746z" fill-rule="nonzero" stroke="#000" stroke-width=".7px"/> </g> <g transform="translate(2.7114)"> <path d="m168.3 124.83c-0.221 0-0.331 0.269-0.331 0.805v33.801c0 3.42 0.221 5.667 0.663 6.74 0.441 1.073 1.09 1.609 1.946 1.609h3.024c0.138 0 0.242 0.084 0.311 0.252 0.069 0.167 0.103 0.419 0.103 0.754v2.716c0 0.537-0.138 0.906-0.414 1.107-0.248 0.067-0.614 0.134-1.098 0.201-0.483 0.067-0.959 0.118-1.429 0.151-0.469 0.034-0.828 0.05-1.077 0.05-1.712 0-2.934-0.955-3.665-2.867-0.732-1.911-1.098-5.013-1.098-9.305v-35.108c0-0.604-0.124-0.906-0.373-0.906h-3.521c-0.248 0-0.373-0.268-0.373-0.804v-3.521c0-0.537 0.111-0.805 0.332-0.805h3.686c0.166 0 0.263-0.268 0.29-0.805l0.415-16.095c0-0.805 0.124-1.207 0.372-1.207h1.492c0.303 0 0.455 0.436 0.455 1.307v15.995c0 0.537 0.097 0.805 0.29 0.805h5.468c0.221 0 0.331 0.268 0.331 0.805v3.521c0 0.536-0.124 0.804-0.373 0.804h-5.426z" fill-rule="nonzero" stroke="#000" stroke-width=".7px"/> </g> <g transform="translate(2.7114)"> <path d="m179.4 173.02c-0.331 0-0.497-0.402-0.497-1.207v-72.329c0-0.738 0.138-1.107 0.414-1.107h1.782c0.276 0 0.414 0.336 0.414 1.006v27.162c0 0.335 0.034 0.536 0.103 0.603s0.159-0.033 0.27-0.302c0.994-1.81 1.898-3.319 2.713-4.526 0.814-1.208 1.629-2.113 2.444-2.717 0.814-0.603 1.691-0.905 2.63-0.905 2.182 0 3.839 1.375 4.971 4.125 1.132 2.749 1.698 6.404 1.698 10.965v37.925c0 0.871-0.166 1.307-0.497 1.307h-1.74c-0.165 0-0.29-0.1-0.373-0.301-0.082-0.202-0.124-0.503-0.124-0.906v-36.315c0-3.555-0.366-6.321-1.097-8.3-0.732-1.978-1.899-2.967-3.501-2.967-0.883 0-1.705 0.318-2.464 0.956-0.76 0.637-1.526 1.576-2.299 2.816-0.773 1.241-1.643 2.834-2.61 4.779v39.031c0 0.805-0.179 1.207-0.538 1.207h-1.699z" fill-rule="nonzero" stroke="#000" stroke-width=".7px"/> </g> </g> <g transform="matrix(.80638 0 0 .80638 452.53 65.421)" fill-rule="nonzero"> <path d="m79.32 36.98v150.76l15.68-13.2 6.59-156.31-22.27 18.75z" fill="url(#f)"/> <path d="m79.32 36.98-22.27-18.75 6.59 156.31 15.68 13.2v-150.76z" fill="url(#e)"/> <path d="m25.19 104.83 8.63 49.04 12.5-14.95-2.46-56.42-18.67 22.33z" fill="url(#d)"/> <path d="m25.19 104.83-25.19-14.59 16.97 53.86 16.85 9.77-8.63-49.04z" fill="url(#c)"/> <path d="M43.86,82.5L18.69,67.98L0,90.24L25.18,104.83L43.86,82.5Z" fill="#9c3"/> <path d="m134.82 78.69-9.97 56.5 15.58-9.04 19.57-62.05-25.18 14.59z" fill="url(#b)"/> <path d="m134.82 78.69-18.68-22.33-2.86 65 11.57 13.83 9.97-56.5z" fill="url(#a)"/> <path d="m160 64.1-18.69-22.26-25.17 14.52 18.67 22.33 25.19-14.59z" fill="#ffe113"/> <path d="M101.59,18.23L79.32,0L57.05,18.23L79.32,36.98L101.59,18.23Z" fill="#f3e600"/> </g> <defs> <linearGradient id="f" x2="1" gradientTransform="matrix(.84 -162.96 162.96 .84 89.64 184.81)" gradientUnits="userSpaceOnUse"><stop stop-color="#62d399" offset="0"/><stop stop-color="#acd842" offset=".51"/><stop stop-color="#d7db0a" offset=".9"/><stop stop-color="#d7db0a" offset="1"/></linearGradient> <linearGradient id="e" x2="1" gradientTransform="matrix(-1.6,-162.13,162.13,-1.6,69.68,178.9)" gradientUnits="userSpaceOnUse"><stop stop-color="#0ba398" offset="0"/><stop stop-color="#4ca352" offset=".5"/><stop stop-color="#76a30a" offset="1"/></linearGradient> <linearGradient id="d" x2="1" gradientTransform="matrix(-1.9,-67.98,67.98,-1.9,36.6,152.17)" gradientUnits="userSpaceOnUse"><stop stop-color="#36a382" offset="0"/><stop stop-color="#36a382" offset=".19"/><stop stop-color="#49a459" offset=".54"/><stop stop-color="#76a30b" offset="1"/></linearGradient> <linearGradient id="c" x2="1" gradientTransform="matrix(2.18,-62.38,62.38,2.18,15.82,153.24)" gradientUnits="userSpaceOnUse"><stop stop-color="#267880" offset="0"/><stop stop-color="#457a5c" offset=".51"/><stop stop-color="#717516" offset="1"/></linearGradient> <linearGradient id="b" x2="1" gradientTransform="matrix(13.85,-71.96,71.96,13.85,135.08,135.43)" gradientUnits="userSpaceOnUse"><stop stop-color="#b0d939" offset="0"/><stop stop-color="#eadb04" offset="1"/></linearGradient> <linearGradient id="a" x2="1" gradientTransform="matrix(26.159 -64.737 64.737 26.159 107.42 128.14)" gradientUnits="userSpaceOnUse"><stop stop-color="#74af52" offset="0"/><stop stop-color="#74af52" offset=".17"/><stop stop-color="#99be32" offset=".48"/><stop stop-color="#c0c40a" offset="1"/></linearGradient> </defs> </svg>`;btoa(mP);const gP='<svg viewBox="0 0 509 154" xmlns="http://www.w3.org/2000/svg" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2"><path d="M665.95 132.73v44.88l-10.56-8.4c-.8-.64-1.2-1.44-1.2-2.4v-32.4c0-6.48-4.12-9.72-12.36-9.72-2.16 0-4.18.4-6.06 1.2-1.88.8-3.54 1.8-4.98 3-1.44 1.2-2.56 2.5-3.36 3.9-.8 1.4-1.2 2.7-1.2 3.9v40.92l-10.68-8.4c-.72-.64-1.08-1.44-1.08-2.4v-53.76l10.92 8.52c.32.24.56.44.72.6.16.16.36.32.6.48.96-1.2 2.14-2.28 3.54-3.24 1.4-.96 2.92-1.76 4.56-2.4 1.64-.64 3.34-1.14 5.1-1.5 1.76-.36 3.44-.54 5.04-.54 1.44 0 2.92.04 4.44.12 1.52.08 2.84.28 3.96.6 4.56 1.12 7.8 3.12 9.72 6 1.92 2.88 2.88 6.56 2.88 11.04ZM732.38 146.05c0 .88.02 1.5.06 1.86.04.36-.02.98-.18 1.86h-7.08c-2.08 0-4.44-.02-7.08-.06-2.64-.04-5.36-.06-8.16-.06h-22.08c0 2.88.56 5.36 1.68 7.44 1.12 2.08 2.6 3.8 4.44 5.16 1.84 1.36 3.94 2.36 6.3 3 2.36.64 4.74.96 7.14.96 3.04 0 5.9-.76 8.58-2.28 2.68-1.52 4.94-3.52 6.78-6 .64.56 1.54 1.48 2.7 2.76 1.16 1.28 2.94 3.2 5.34 5.76-2.8 3.36-6.22 6.02-10.26 7.98-4.04 1.96-8.42 2.94-13.14 2.94-4.72 0-8.92-.64-12.84-1.92-3.92-1.28-7.32-3.24-10.2-5.88-2.88-2.64-5.12-5.98-6.72-10.02-1.6-4.04-2.4-8.82-2.4-14.34 0-4.96.66-9.42 1.98-13.38 1.32-3.96 3.22-7.32 5.7-10.08s5.44-4.9 8.88-6.42c3.44-1.52 7.32-2.28 11.64-2.28 5.76 0 10.52.88 14.28 2.64 3.76 1.76 6.72 4.16 8.88 7.2 2.16 3.04 3.66 6.54 4.5 10.5.84 3.96 1.26 8.18 1.26 12.66Zm-29.4-22.8c-2.16.16-4.16.72-6 1.68-1.84.96-3.42 2.2-4.74 3.72-1.32 1.52-2.36 3.28-3.12 5.28-.76 2-1.14 4.12-1.14 6.36h33.12c0-2-.22-4.06-.66-6.18-.44-2.12-1.3-4.02-2.58-5.7-1.28-1.68-3.1-3.02-5.46-4.02-2.36-1-5.5-1.38-9.42-1.14ZM795.93 146.05c0 .88.02 1.5.06 1.86.04.36-.02.98-.18 1.86h-7.08c-2.08 0-4.44-.02-7.08-.06-2.64-.04-5.36-.06-8.16-.06h-22.08c0 2.88.56 5.36 1.68 7.44 1.12 2.08 2.6 3.8 4.44 5.16 1.84 1.36 3.94 2.36 6.3 3 2.36.64 4.74.96 7.14.96 3.04 0 5.9-.76 8.58-2.28 2.68-1.52 4.94-3.52 6.78-6 .64.56 1.54 1.48 2.7 2.76 1.16 1.28 2.94 3.2 5.34 5.76-2.8 3.36-6.22 6.02-10.26 7.98-4.04 1.96-8.42 2.94-13.14 2.94-4.72 0-8.92-.64-12.84-1.92-3.92-1.28-7.32-3.24-10.2-5.88-2.88-2.64-5.12-5.98-6.72-10.02-1.6-4.04-2.4-8.82-2.4-14.34 0-4.96.66-9.42 1.98-13.38 1.32-3.96 3.22-7.32 5.7-10.08s5.44-4.9 8.88-6.42c3.44-1.52 7.32-2.28 11.64-2.28 5.76 0 10.52.88 14.28 2.64 3.76 1.76 6.72 4.16 8.88 7.2 2.16 3.04 3.66 6.54 4.5 10.5.84 3.96 1.26 8.18 1.26 12.66Zm-29.4-22.8c-2.16.16-4.16.72-6 1.68-1.84.96-3.42 2.2-4.74 3.72-1.32 1.52-2.36 3.28-3.12 5.28-.76 2-1.14 4.12-1.14 6.36h33.12c0-2-.22-4.06-.66-6.18-.44-2.12-1.3-4.02-2.58-5.7-1.28-1.68-3.1-3.02-5.46-4.02-2.36-1-5.5-1.38-9.42-1.14ZM858.57 97.21c.64.48.96 1.16.96 2.04v74.88c-.08 1.04-.12 2.12-.12 3.24-1.84-1.52-3.56-2.92-5.16-4.2-1.36-1.12-2.66-2.18-3.9-3.18-1.24-1-2.06-1.66-2.46-1.98-1.76 2.48-4.26 4.44-7.5 5.88-3.24 1.44-7.02 2.16-11.34 2.16-3.84 0-7.4-.7-10.68-2.1-3.28-1.4-6.14-3.44-8.58-6.12-2.44-2.68-4.34-5.94-5.7-9.78-1.36-3.84-2.04-8.16-2.04-12.96 0-4.32.78-8.34 2.34-12.06 1.56-3.72 3.6-6.92 6.12-9.6 2.52-2.68 5.38-4.78 8.58-6.3 3.2-1.52 6.48-2.28 9.84-2.28 2.56 0 4.82.22 6.78.66 1.96.44 3.68 1.06 5.16 1.86s2.78 1.74 3.9 2.82a35.92 35.92 0 0 1 3.12 3.42V88.57l10.68 8.64Zm-27.96 67.92c3.6 0 6.52-.68 8.76-2.04 2.24-1.36 3.98-3.06 5.22-5.1a20.5 20.5 0 0 0 2.58-6.54c.48-2.32.72-4.44.72-6.36v-1.2c0-1.12-.22-2.7-.66-4.74-.44-2.04-1.28-4.06-2.52-6.06s-3-3.7-5.28-5.1c-2.28-1.4-5.22-2.02-8.82-1.86-3.44 0-6.26.74-8.46 2.22-2.2 1.48-3.96 3.26-5.28 5.34-1.32 2.08-2.24 4.2-2.76 6.36-.52 2.16-.78 3.92-.78 5.28 0 1.84.24 3.92.72 6.24.48 2.32 1.36 4.48 2.64 6.48s3.04 3.68 5.28 5.04c2.24 1.36 5.12 2.04 8.64 2.04ZM882.81 97.09c.64.48.96 1.12.96 1.92l-.12 41.04v37.08l-10.56-8.4c-.72-.64-1.08-1.44-1.08-2.4V88.45l10.8 8.64ZM950.36 146.05c0 .88.02 1.5.06 1.86.04.36-.02.98-.18 1.86h-7.08c-2.08 0-4.44-.02-7.08-.06-2.64-.04-5.36-.06-8.16-.06h-22.08c0 2.88.56 5.36 1.68 7.44 1.12 2.08 2.6 3.8 4.44 5.16 1.84 1.36 3.94 2.36 6.3 3 2.36.64 4.74.96 7.14.96 3.04 0 5.9-.76 8.58-2.28 2.68-1.52 4.94-3.52 6.78-6 .64.56 1.54 1.48 2.7 2.76 1.16 1.28 2.94 3.2 5.34 5.76-2.8 3.36-6.22 6.02-10.26 7.98-4.04 1.96-8.42 2.94-13.14 2.94-4.72 0-8.92-.64-12.84-1.92-3.92-1.28-7.32-3.24-10.2-5.88-2.88-2.64-5.12-5.98-6.72-10.02-1.6-4.04-2.4-8.82-2.4-14.34 0-4.96.66-9.42 1.98-13.38 1.32-3.96 3.22-7.32 5.7-10.08s5.44-4.9 8.88-6.42c3.44-1.52 7.32-2.28 11.64-2.28 5.76 0 10.52.88 14.28 2.64 3.76 1.76 6.72 4.16 8.88 7.2 2.16 3.04 3.66 6.54 4.5 10.5.84 3.96 1.26 8.18 1.26 12.66Zm-29.4-22.8c-2.16.16-4.16.72-6 1.68-1.84.96-3.42 2.2-4.74 3.72-1.32 1.52-2.36 3.28-3.12 5.28-.76 2-1.14 4.12-1.14 6.36h33.12c0-2-.22-4.06-.66-6.18-.44-2.12-1.3-4.02-2.58-5.7-1.28-1.68-3.1-3.02-5.46-4.02-2.36-1-5.5-1.38-9.42-1.14Z" style="fill-rule:nonzero" transform="translate(-452.406 -63.709) scale(1.00797)"/><path d="M79.32 36.98v150.76L95 174.54l6.59-156.31-22.27 18.75Z" style="fill:url(#a);fill-rule:nonzero" transform="matrix(.80638 0 0 .80638 2.361 1.094)"/><path d="M79.32 36.98 57.05 18.23l6.59 156.31 15.68 13.2V36.98Z" style="fill:url(#b);fill-rule:nonzero" transform="matrix(.80638 0 0 .80638 2.361 1.094)"/><path d="m25.19 104.83 8.63 49.04 12.5-14.95-2.46-56.42-18.67 22.33Z" style="fill:url(#c);fill-rule:nonzero" transform="matrix(.80638 0 0 .80638 2.361 1.094)"/><path d="M25.19 104.83 0 90.24l16.97 53.86 16.85 9.77-8.63-49.04Z" style="fill:url(#d);fill-rule:nonzero" transform="matrix(.80638 0 0 .80638 2.361 1.094)"/><path d="M43.86 82.5 18.69 67.98 0 90.24l25.18 14.59L43.86 82.5Z" style="fill:#9c3;fill-rule:nonzero" transform="matrix(.80638 0 0 .80638 2.361 1.094)"/><path d="m134.82 78.69-9.97 56.5 15.58-9.04L160 64.1l-25.18 14.59Z" style="fill:url(#e);fill-rule:nonzero" transform="matrix(.80638 0 0 .80638 2.361 1.094)"/><path d="m134.82 78.69-18.68-22.33-2.86 65 11.57 13.83 9.97-56.5Z" style="fill:url(#f);fill-rule:nonzero" transform="matrix(.80638 0 0 .80638 2.361 1.094)"/><path d="m160 64.1-18.69-22.26-25.17 14.52 18.67 22.33L160 64.1Z" style="fill:#ffe113;fill-rule:nonzero" transform="matrix(.80638 0 0 .80638 2.361 1.094)"/><path d="M101.59 18.23 79.32 0 57.05 18.23l22.27 18.75 22.27-18.75Z" style="fill:#f3e600;fill-rule:nonzero" transform="matrix(.80638 0 0 .80638 2.361 1.094)"/><defs><linearGradient id="a" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(.84 -162.96 162.96 .84 89.64 184.81)"><stop offset="0" style="stop-color:#62d399;stop-opacity:1"/><stop offset=".51" style="stop-color:#acd842;stop-opacity:1"/><stop offset=".9" style="stop-color:#d7db0a;stop-opacity:1"/><stop offset="1" style="stop-color:#d7db0a;stop-opacity:1"/></linearGradient><linearGradient id="b" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="rotate(-90.565 123.412 54.953) scale(162.14)"><stop offset="0" style="stop-color:#0ba398;stop-opacity:1"/><stop offset=".5" style="stop-color:#4ca352;stop-opacity:1"/><stop offset="1" style="stop-color:#76a30a;stop-opacity:1"/></linearGradient><linearGradient id="c" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="scale(-68) rotate(88.4 .881 -1.396)"><stop offset="0" style="stop-color:#36a382;stop-opacity:1"/><stop offset=".19" style="stop-color:#36a382;stop-opacity:1"/><stop offset=".54" style="stop-color:#49a459;stop-opacity:1"/><stop offset="1" style="stop-color:#76a30b;stop-opacity:1"/></linearGradient><linearGradient id="d" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="rotate(-88 87.255 68.431) scale(62.42)"><stop offset="0" style="stop-color:#267880;stop-opacity:1"/><stop offset=".51" style="stop-color:#457a5c;stop-opacity:1"/><stop offset="1" style="stop-color:#717516;stop-opacity:1"/></linearGradient><linearGradient id="e" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="rotate(-79.1 149.53 -14.065) scale(73.28)"><stop offset="0" style="stop-color:#b0d939;stop-opacity:1"/><stop offset="1" style="stop-color:#eadb04;stop-opacity:1"/></linearGradient><linearGradient id="f" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="rotate(-67.997 148.705 -15.558) scale(69.8226)"><stop offset="0" style="stop-color:#74af52;stop-opacity:1"/><stop offset=".17" style="stop-color:#74af52;stop-opacity:1"/><stop offset=".48" style="stop-color:#99be32;stop-opacity:1"/><stop offset="1" style="stop-color:#c0c40a;stop-opacity:1"/></linearGradient></defs></svg>',fP=btoa(gP),yP="data:image/svg+xml;charset=utf-8;base64,"+fP,Sb=yP,Cb=typeof window!==void 0?window.location.search.includes("debugcontext"):!1;var de=(o=>(o.ContextRegistered="ContextRegistered",o.ContextCreationStart="ContextCreationStart",o.ContextCreated="ContextCreated",o.ContextFirstFrameRendered="ContextFirstFrameRendered",o.ContextDestroying="ContextDestroying",o.ContextDestroyed="ContextDestroyed",o.MissingCamera="MissingCamera",o.ContextClearing="ContextClearing",o.ContextCleared="ContextCleared",o))(de||{});class ue{static get Current(){return globalThis["NeedleEngine.Context.Current"]}static set Current(e){globalThis["NeedleEngine.Context.Current"]=e}static get All(){return this.Registered}static Registered=[];static register(e){this.Registered.indexOf(e)===-1&&(Cb&&console.warn("Registering context"),this.Registered.push(e),this.dispatchCallback("ContextRegistered",e))}static unregister(e){const t=this.Registered.indexOf(e);t!==-1&&(Cb&&console.warn("Unregistering context"),this.Registered.splice(t,1))}static _callbacks={};static registerCallback(e,t){this._callbacks[e]||(this._callbacks[e]=[]),this._callbacks[e].push(t)}static unregisterCallback(e,t){if(!this._callbacks[e])return;const i=this._callbacks[e].indexOf(t);i!==-1&&this._callbacks[e].splice(i,1)}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 s=new Array;return this._callbacks[e].forEach(r=>{const a=r(n);a instanceof Promise&&s.push(a)}),Promise.all(s)}static addContextCreatedCallback(e){this.registerCallback("ContextCreated",e)}static addContextDestroyedCallback(e){this.registerCallback("ContextDestroyed",e)}}const Pb=()=>o=>o;function bP(o){return Pb()(o)}function _P(){return!!x("debug")}class xi{_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 cr=!1;const Rm=new Array;typeof window<"u"&&setTimeout(()=>{if(cr){const o={},e=new URL(window.location.href),t=new URL(e);t.searchParams.append("console","");const i=t.toString().replace(/=$|=(?=&)/g,"");for(const s of Rm){const r=new URL(e);r.searchParams.append(s,""),o[s]=r.toString().replace(/=$|=(?=&)/g,"")}console.log(`\u{1F335} ?help: Debug Options for Needle Engine.
|
|
2
2
|
Append any of these parameters to the URL to enable specific debug options.
|
|
3
3
|
Example: ${i} will show an onscreen console window.`);const n=cr===!0?"":` (containing "${cr}")`;console.group("Available URL parameters:"+n);for(const s of Object.keys(o).sort())typeof cr=="string"&&!s.toLowerCase().includes(cr.toLowerCase())||(console.groupCollapsed(s),console.log("Reload with this flag enabled:"),console.log(o[s]),console.groupEnd());console.groupEnd()}},100);function ql(){return new URLSearchParams(globalThis.location?.search)}function x(o){cr&&!Rm.includes(o)&&Rm.push(o);const e=ql();if(e.has(o)){const t=e.get(o);if(t){const i=Number(t);return isNaN(i)?t:i}else return!0}return!1}cr=x("help");function vP(o,e){const t=ql();t.has(o)?t.set(o,e):t.append(o,e),document.location.search=t.toString()}function Xl(o,e,t=!0){const i=ql();i.has(o)?e===null?i.delete(o):i.set(o,e):e!==null&&i.append(o,e),t?Ob(o,i):Em(o,i)}function Tm(o,e,t){o.has(e)?o.set(e,t.toString()):o.append(e,t.toString())}function Ob(o,e,t){window.history.pushState(t,o,"?"+e.toString())}function Em(o,e,t){window.history.replaceState(t,o,"?"+e.toString())}function xP(o){for(var e="",t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",i=t.length,n=0;n<o;n++)e+=t.charAt(Math.floor(Math.random()*i));return e}function wP(o,e){return Math.floor(Math.random()*(e-o+1))+o}const kb=["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"],Mb=["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 Rb(){const o=kb[Math.floor(Math.random()*kb.length)],e=Mb[Math.floor(Math.random()*Mb.length)];return o+"_"+e}function Tb(o){return o=o.replace(/[^a-z0-9áéíóúñü \.,_-]/gim,""),o.trim()}function Pa(o,e,t=!0,i=!1){if(e==null)return null;if(e.userData&&e.userData.guid===o||e.guid==o)return e;if(i&&e.userData?.components){for(const n of e.userData.components)if(n.guid===o)return n}if(t){if(e.scenes)for(const n in e.scenes){const s=e.scenes[n],r=Pa(o,s,t,i);if(r)return r}if(e.children)for(const n in e.children){const s=e.children[n],r=Pa(o,s,t,i);if(r)return r}}}function Ql(o,e){if(o!=null&&typeof o=="object"){let t;Array.isArray(o)?t=[]:(t=Object.create(o),Object.assign(t,o));for(const i of Object.keys(o)){const n=o[i];e&&!e(o,i,n)?t[i]=n:n?.clone!==void 0&&typeof n.clone=="function"?t[i]=n.clone():t[i]=Ql(n,e)}return t}return o}function Un(o){return new Promise((e,t)=>{setTimeout(e,o)})}function Yl(o,e){if(o<=0)return Promise.resolve();if(e||(e=ue.Current),!e)return Promise.reject("No context");const t=e.time.frameCount+o;return new Promise((i,n)=>{if(!e)return n("No context");const s=()=>{e.time.frameCount>=t&&(e.pre_update_callbacks.splice(e.pre_update_callbacks.indexOf(s),1),i())};e.pre_update_callbacks.push(s)})}const wd=x("debugresolveurl"),Eb="rel:";function SP(o,e){return us(o,e)}function us(o,e){if(e===void 0)return wd&&console.warn("getPath: uri is undefined, returning uri",e),e;if(e.startsWith("./"))return e;if(e.startsWith("http"))return wd&&console.warn("getPath: uri is absolute, returning uri",e),e;if(o===void 0)return wd&&console.warn("getPath: source is undefined, returning uri",e),e;e.startsWith(Eb)&&(e=e.substring(4));const t=o.lastIndexOf("/");if(t>=0){const i=o.substring(0,t+1);for(;i.endsWith("/")&&e.startsWith("/");)e=e.substring(1);const n=i+e;return wd&&console.log("source:",o,`changed uri
|
|
4
4
|
from`,e,`
|
|
@@ -141,7 +141,7 @@ void main(){
|
|
|
141
141
|
#__vconsole .vc-mask {
|
|
142
142
|
overflow: hidden;
|
|
143
143
|
}
|
|
144
|
-
`,gr?.prepend(i),o===!0&&Lb()<=0&&r_(),console.log("\u{1F335} Debug console has loaded")}},e.onerror=()=>{console.warn("\u{1F335} Debug console failed to load."+(window.crossOriginIsolated?"This page is using cross-origin isolation, so external scripts can't be loaded.":"")),nc=!1,Hi=null},e.src="https://cdn.jsdelivr.net/npm/vconsole@3.15.1/dist/vconsole.min.js",document.body.appendChild(e)}function RO(){if(!globalThis.VConsole)return;const o=new VConsole.VConsolePlugin("needle-console","\u{1F335} Inspect glTF"),e=()=>document.querySelector("#__vc_plug_"+o._id+" iframe");return o.on("renderTab",function(t){const i=globalThis["needle:codegen_files"];if(!i||i.length===0)return;let n=globalThis["needle:codegen_files"][0];const s=n.indexOf("?");s>-1&&(n=n.substring(0,s));const r=location.protocol+"//"+location.host+location.pathname+"/"+n,a=encodeURIComponent(r);o.fullUrl="https://viewer.needle.tools?inspect&file="+a;var l='<iframe src="" style="width: 100%; height: 99%; border: none;"></iframe>';t(l)}),o.on("show",function(){const t=e();t&&t.src!==o.fullUrl&&(t.src=o.fullUrl)}),o.on("hide",function(){const t=e();t&&(t.src="")}),o.on("addTopBar",function(t){var i=new Array;i.push({name:"Open in new window \u2197",onClick:function(n){window.open(o.fullUrl,"_blank"),Hi?.hide()}}),i.push({name:"Reload",onClick:function(n){const s=e();s&&(s.src=o.fullUrl)}}),i.push({name:"Fullscreen",onClick:function(n){const s=e();s.requestFullscreen?s.requestFullscreen():s.webkitRequestFullscreen instanceof Function&&s.webkitRequestFullscreen()}}),t(i)}),o}function TO(){return document.querySelector("#__vconsole .vc-switch")||null}function EO(){return document.querySelector("#__vconsole")||null}const l_=x("debugdefines");ms('if(!globalThis["NEEDLE_ENGINE_VERSION"]) globalThis["NEEDLE_ENGINE_VERSION"] = "0.0.0";'),ms('if(!globalThis["NEEDLE_ENGINE_GENERATOR"]) globalThis["NEEDLE_ENGINE_GENERATOR"] = "unknown";'),ms('if(!globalThis["NEEDLE_PROJECT_BUILD_TIME"]) globalThis["NEEDLE_PROJECT_BUILD_TIME"] = "unknown";'),ms('if(!globalThis["NEEDLE_PUBLIC_KEY"]) globalThis["NEEDLE_PUBLIC_KEY"] = "unknown";'),ms('globalThis["__NEEDLE_ENGINE_VERSION__"] = "4.10.0-beta.
|
|
144
|
+
`,gr?.prepend(i),o===!0&&Lb()<=0&&r_(),console.log("\u{1F335} Debug console has loaded")}},e.onerror=()=>{console.warn("\u{1F335} Debug console failed to load."+(window.crossOriginIsolated?"This page is using cross-origin isolation, so external scripts can't be loaded.":"")),nc=!1,Hi=null},e.src="https://cdn.jsdelivr.net/npm/vconsole@3.15.1/dist/vconsole.min.js",document.body.appendChild(e)}function RO(){if(!globalThis.VConsole)return;const o=new VConsole.VConsolePlugin("needle-console","\u{1F335} Inspect glTF"),e=()=>document.querySelector("#__vc_plug_"+o._id+" iframe");return o.on("renderTab",function(t){const i=globalThis["needle:codegen_files"];if(!i||i.length===0)return;let n=globalThis["needle:codegen_files"][0];const s=n.indexOf("?");s>-1&&(n=n.substring(0,s));const r=location.protocol+"//"+location.host+location.pathname+"/"+n,a=encodeURIComponent(r);o.fullUrl="https://viewer.needle.tools?inspect&file="+a;var l='<iframe src="" style="width: 100%; height: 99%; border: none;"></iframe>';t(l)}),o.on("show",function(){const t=e();t&&t.src!==o.fullUrl&&(t.src=o.fullUrl)}),o.on("hide",function(){const t=e();t&&(t.src="")}),o.on("addTopBar",function(t){var i=new Array;i.push({name:"Open in new window \u2197",onClick:function(n){window.open(o.fullUrl,"_blank"),Hi?.hide()}}),i.push({name:"Reload",onClick:function(n){const s=e();s&&(s.src=o.fullUrl)}}),i.push({name:"Fullscreen",onClick:function(n){const s=e();s.requestFullscreen?s.requestFullscreen():s.webkitRequestFullscreen instanceof Function&&s.webkitRequestFullscreen()}}),t(i)}),o}function TO(){return document.querySelector("#__vconsole .vc-switch")||null}function EO(){return document.querySelector("#__vconsole")||null}const l_=x("debugdefines");ms('if(!globalThis["NEEDLE_ENGINE_VERSION"]) globalThis["NEEDLE_ENGINE_VERSION"] = "0.0.0";'),ms('if(!globalThis["NEEDLE_ENGINE_GENERATOR"]) globalThis["NEEDLE_ENGINE_GENERATOR"] = "unknown";'),ms('if(!globalThis["NEEDLE_PROJECT_BUILD_TIME"]) globalThis["NEEDLE_PROJECT_BUILD_TIME"] = "unknown";'),ms('if(!globalThis["NEEDLE_PUBLIC_KEY"]) globalThis["NEEDLE_PUBLIC_KEY"] = "unknown";'),ms('globalThis["__NEEDLE_ENGINE_VERSION__"] = "4.10.0-beta.9";'),ms('globalThis["__NEEDLE_ENGINE_GENERATOR__"] = "undefined";'),ms('globalThis["__NEEDLE_PROJECT_BUILD_TIME__"] = "Mon Sep 29 2025 12:36:40 GMT+0000 (Coordinated Universal Time)";'),ms('globalThis["__NEEDLE_PUBLIC_KEY__"] = "'+NEEDLE_PUBLIC_KEY+'";');const yn="4.10.0-beta.9",Ad="undefined",tg="Mon Sep 29 2025 12:36:40 GMT+0000 (Coordinated Universal Time)";l_&&console.log(`Engine version: ${yn} (generator: ${Ad})
|
|
145
145
|
Project built at ${tg}`);const Ma=NEEDLE_PUBLIC_KEY,So="needle_isActiveInHierarchy",fr="builtin_components",oc="needle_editor_guid";function ms(o){try{(0,eval)(o)}catch(e){l_&&console.error(e)}}let c_,h_=null;function bn(){return c_}function ig(o){if(o==null){console.warn("Oh no: someone tried registering a non-existend gltf-loader. When you see this log it might mean that needle-engine is being imported multiple times. Please check your project setup.");return}h_!==o&&(h_=o,c_=new o)}const Si=Symbol("shadowDomOwner"),AO=x("debugpatch");function Id(o,e,t,i){const n=AO===e;if(!t&&!i)return;const s=e+"___needle";LO(o,e,t,i);const r=Object.getOwnPropertyDescriptor(o,e),a=o[e];n&&console.log("Patch",o.constructor.name,e,r,a),r?(n&&console.log("Apply patch with existing descriptor",o.constructor.name,e,r),typeof r.value=="function"&&(o[e]=u_(r.value,o,e))):(n&&console.log("Create patch with new property",o.constructor.name,e,r),Object.defineProperty(o,e,{set:function(l){if(typeof l=="function")this[s]=u_(l,o,e);else{const c=this[s];p_(o,e,this,c,l),this[s]=l,m_(o,e,this,c,l)}},get:function(){const l=this[s];return typeof l=="function"&&l[s]?l[s]:l}}))}function IO(o,e,t){const i=og(o,e);if(i)for(let n=i.length-1;n>=0;n--){const s=i[n];s.prefix===t&&(s.prefix=null),s.postfix===t&&(s.postfix=null),!s.prefix&&!s.postfix&&i.splice(n,1)}}const d_=Symbol("Needle:Patches:WrappedFunction");function u_(o,e,t){if(o[d_])return o;const i=function(...n){p_(e,t,this,...n);const s=o.apply(this,n);return m_(e,t,this,s,...n),s};return i[d_]=!0,i}const Ld="Needle:Patches";function ng(){return globalThis[Ld]||(globalThis[Ld]=new WeakMap),globalThis[Ld]}function og(o,e){const t=ng().get(o);return t?t.get(e):null}function LO(o,e,t,i){let n=ng().get(o);n||(n=new Map,ng().set(o,n));let s=n.get(e);s||(s=[],n.set(e,s)),s.push({prefix:t,postfix:i})}function p_(o,e,t,...i){if(!t)return;const n=og(o,e);if(n)for(const s of n)s.prefix?.call(t,...i)}function m_(o,e,t,i,...n){if(!t)return;const s=og(o,e);if(s)for(const r of s)r.postfix?.call(t,i,...n)}const Ra=[];function jd(o){Ra.indexOf(o)===-1&&Ra.push(o)}function jO(o){const e=Ra.indexOf(o);e!==-1&&Ra.splice(e,1)}const Ta=[];function sg(o){Ta.indexOf(o)===-1&&Ta.push(o)}function DO(o){const e=Ta.indexOf(o);e!==-1&&Ta.splice(e,1)}function g_(o){globalThis.dispatchEvent(new CustomEvent("needle-xrsession-start",{detail:o}));for(let e=0;e<Ra.length;e++)Ra[e](o)}function f_(o){globalThis.dispatchEvent(new CustomEvent("needle-xrsession-end",{detail:o}));for(let e=0;e<Ta.length;e++)Ta[e](o)}const ot=x("debuginput");var Dd=(o=>(o.Mouse="mouse",o.Touch="touch",o.Controller="controller",o.Hand="hand",o))(Dd||{}),Ee=(o=>(o.PointerDown="pointerdown",o.PointerUp="pointerup",o.PointerMove="pointermove",o.KeyDown="keydown",o.KeyUp="keyup",o.KeyPressed="keypress",o))(Ee||{});class Co extends PointerEvent{clientZ;deviceIndex;origin;source;mode;get isSpatial(){return this.mode!="screen"}get ray(){return this._ray||(this._ray=new ls(this.space.worldPosition.clone(),this.space.worldForward.clone())),this._ray}set ray(e){this._ray=e}get hasRay(){return this._ray!==void 0}_ray;space;isClick=!1;isDoubleClick=!1;get used(){return this._used}_used=!1;use(){this._used=!0}get pointerId(){return this._pointerid}_pointerid;get pointerType(){return this._pointerType}_pointerType;get type(){return this._type}_type;metadata={};intersections=new Array;constructor(e,t,i){super(e,i),this.clientZ=i.clientZ,this._pointerid=i.pointerId,this._pointerType=i.pointerType,this._type=e,this.deviceIndex=i.deviceIndex,this.origin=i.origin,this.source=t,this.mode=i.mode,this._ray=i.ray,this.space=i.device}_immediatePropagationStopped=!1;get immediatePropagationStopped(){return this._immediatePropagationStopped}_propagationStopped=!1;get propagationStopped(){return this._immediatePropagationStopped||this._propagationStopped}stopImmediatePropagation(){this._immediatePropagationStopped=!0,super.stopImmediatePropagation(),this.source?.stopImmediatePropagation()}stopPropagation(){this._propagationStopped=!0,super.stopPropagation(),this.source?.stopPropagation(),ot&&console.warn("Stop propagation...",this.pointerId,this.pointerType)}}class sc extends KeyboardEvent{source;constructor(e,t,i){super(e,i),this.source=t}stopImmediatePropagation(){super.stopImmediatePropagation(),this.source?.stopImmediatePropagation()}}class BO{key;keyType;source;constructor(e){this.key=e.key,this.keyType=e.type,this.source=e}}var ii=(o=>(o[o.Early=-100]="Early",o[o.Default=0]="Default",o[o.Late=100]="Late",o))(ii||{});class y_{_eventListeners={};addEventListener(e,t,i){if(this._eventListeners[e]||(this._eventListeners[e]=[]),!t||typeof t!="function"){console.error("Invalid call to addEventListener: callback is required and must be a function!");return}i?i={...i}:i={};let n=0;i?.queue!=null&&(n=i.queue);const s=this._eventListeners[e],r=s.find(a=>a.priority===n);r?r.listeners.push({callback:t,options:i}):(s.push({priority:n,listeners:[{callback:t,options:i}]}),s.sort((a,l)=>a.priority-l.priority))}removeEventListener(e,t,i){if(!this._eventListeners[e]||!t)return;const n=this._eventListeners[e];if(i?.queue!=null){const s=n.find(a=>a.priority===i.queue);if(!s)return;const r=s.listeners.findIndex(a=>a.callback===t);r>=0&&s.listeners.splice(r,1)}else for(const s of n){const r=s.listeners.findIndex(a=>a.callback===t);r>=0&&s.listeners.splice(r,1)}}dispatchEvent(e){let t=!1;if(e instanceof sc){const i=this._eventListeners[e.type];if(i)for(const n of i)for(let s=0;s<n.listeners.length;s++){const r=n.listeners[s];if(r.options?.signal?.aborted){n.listeners.splice(s,1),s--;continue}r.options.once&&(n.listeners.splice(s,1),s--),r.callback(e)}}if(e instanceof Co){const i=this._eventListeners[e.type];if(i)for(const n of i){if(t)break;for(let s=0;s<n.listeners.length;s++){const r=n.listeners[s];if(r.options?.signal?.aborted){n.listeners.splice(s,1),s--;continue}if(e.immediatePropagationStopped){t=!0,ot&&console.log("immediatePropagationStopped",e.type);break}else e.propagationStopped&&(t=!0,ot&&console.log("propagationStopped",e.type));r.options.once&&(n.listeners.splice(s,1),s--),r.callback(e)}}}}_doubleClickTimeThreshold=.2;_longPressTimeThreshold=1;get mousePosition(){return this._pointerPositions[0]}get mousePositionRC(){return this._pointerPositionsRC[0]}get mouseDown(){return this._pointerDown[0]}get mouseUp(){return this._pointerUp[0]}get mouseClick(){return this._pointerClick[0]}get mouseDoubleClick(){return this._pointerDoubleClick[0]}get mousePressed(){return this._pointerPressed[0]}get mouseWheelChanged(){return this.getMouseWheelChanged(0)}get click(){return this._pointerClick[0]}get doubleClick(){return this._pointerDoubleClick[0]}getGamepad(e=0){return typeof navigator<"u"&&"getGamepads"in navigator&&navigator.getGamepads()[e]||null}_setCursorTypes=[];setCursorPointer(){this.setCursor("pointer")}setCursorNormal(){this.unsetCursor("pointer")}setCursor(e){this._setCursorTypes.push(e),this._setCursorTypes.length>10&&this._setCursorTypes.shift(),this.updateCursor()}unsetCursor(e){for(let t=this._setCursorTypes.length-1;t>=0;t--)if(this._setCursorTypes[t]===e){this._setCursorTypes.splice(t,1),this.updateCursor();break}}updateCursor(){this._setCursorTypes?.length==0?this.context.domElement.style.cursor="default":this.context.domElement.style.cursor=this._setCursorTypes[this._setCursorTypes.length-1]}getIsPointerIdInUse(e){for(const t of this._pointerEventsPressed)if(t.pointerId===e&&t.used)return!0;return!1}getPointerPressedCount(){let e=0;for(let t=0;t<this._pointerPressed.length;t++)this._pointerPressed[t]&&e++;return e}getPointerPosition(e){return e>=this._pointerPositions.length?null:this._pointerPositions[e]}getPointerPositionLastFrame(e){return e>=this._pointerPositionsLastFrame.length?null:this._pointerPositionsLastFrame[e]}getPointerPositionDelta(e){return e>=this._pointerPositionsDelta.length?null:this._pointerPositionsDelta[e]}getPointerPositionRC(e){return e>=this._pointerPositionsRC.length?null:this._pointerPositionsRC[e]}getPointerDown(e){return e>=this._pointerDown.length?!1:this._pointerDown[e]}getPointerUp(e){return e>=this._pointerUp.length?!1:this._pointerUp[e]}getPointerPressed(e){return e>=this._pointerPressed.length?!1:this._pointerPressed[e]}getPointerClicked(e){return e>=this._pointerClick.length?!1:this._pointerClick[e]}getPointerDoubleClicked(e){return e>=this._pointerDoubleClick.length?!1:this._pointerDoubleClick[e]}getPointerDownTime(e){return e>=this._pointerDownTime.length?-1:this._pointerDownTime[e]}getPointerUpTime(e){return e>=this._pointerUpTime.length?-1:this._pointerUpTime[e]}getPointerLongPress(e){return e>=this._pointerDownTime.length?!1:this.getPointerPressed(e)&&this.context.time.time-this._pointerDownTime[e]>this._longPressTimeThreshold}getIsMouse(e){return e<0||e>=this._pointerTypes.length?!1:this._pointerTypes[e]==="mouse"}getIsTouch(e){return e<0||e>=this._pointerTypes.length?!1:this._pointerTypes[e]==="touch"}getTouchesPressedCount(){let e=0;for(let t=0;t<this._pointerPressed.length;t++)this._pointerPressed[t]&&this.getIsTouch(t)&&e++;return e}getMouseWheelChanged(e=0){return e>=this._mouseWheelChanged.length?!1:this._mouseWheelChanged[e]}getMouseWheelDeltaY(e=0){return e>=this._mouseWheelDeltaY.length?0:this._mouseWheelDeltaY[e]}getPointerEvent(e){if(!(e>=this._pointerEvent.length))return this._pointerEvent[e]??void 0}*foreachPointerId(e){for(let t=0;t<this._pointerTypes.length;t++)if(this._pointerIsActive(t)){if(e!==void 0){const i=this._pointerTypes[t];if(Array.isArray(e)){let n=!1;for(const s of e)if(i===s){n=!0;break}if(!n)continue}else if(e!==i)continue}yield t}}*foreachTouchId(){for(let e=0;e<this._pointerTypes.length;e++)this._pointerTypes[e]==="touch"&&this._pointerIsActive[e]&&(yield e)}_pointerIsActive(e){return e<0?!1:this._pointerPressed[e]||this._pointerDown[e]||this._pointerUp[e]}context;_pointerDown=[!1];_pointerUp=[!1];_pointerClick=[!1];_pointerDoubleClick=[!1];_pointerPressed=[!1];_pointerPositions=[new J];_pointerPositionsLastFrame=[new J];_pointerPositionsDelta=[new J];_pointerPositionsRC=[new J];_pointerPositionDown=[new b];_pointerDownTime=[];_pointerUpTime=[];_pointerUpTimestamp=[];_pointerIds=[];_pointerTypes=[""];_mouseWheelChanged=[!1];_mouseWheelDeltaY=[0];_pointerEvent=[];_pointerEventsPressed=[];_pointerSpace=[];_pressedStack=new Map;onDownButton(e,t){let i=this._pressedStack.get(e);i||(i=[],this._pressedStack.set(e,i)),i.push(t)}onReleaseButton(e,t){const i=this._pressedStack.get(e);if(!i)return;const n=i.indexOf(t);n>=0&&i.splice(n,1)}getFirstPressedButtonForPointer(e){const t=this._pressedStack.get(e);if(t)return t[0]}getLatestPressedButtonForPointer(e){const t=this._pressedStack.get(e);if(t)return t[t.length-1]}getKeyDown(e){if(e!==void 0)return this.isKeyDown(e);for(const t in this.keysPressed){const i=this.keysPressed[t];if(i.startFrame===this.context.time.frameCount)return i.key}return null}getKeyPressed(e){if(e!==void 0)return this.isKeyPressed(e);for(const t in this.keysPressed){const i=this.keysPressed[t];if(i.pressed)return i.key}return null}getKeyUp(e){if(e!==void 0)return this.isKeyUp(e);for(const t in this.keysPressed){const i=this.keysPressed[t];return i.pressed===!1&&i.frame===this.context.time.frameCount}return null}isKeyDown(e){if(!this.context.application.isVisible||!this.context.application.hasFocus)return!1;const t=this.getCodeForCommonKeyName(e);if(t!==null){for(const n of t)if(this.isKeyDown(n))return!0;return!1}const i=this.keysPressed[e];return i?i.startFrame===this.context.time.frameCount&&i.pressed:!1}isKeyUp(e){if(!this.context.application.isVisible||!this.context.application.hasFocus)return!1;const t=this.getCodeForCommonKeyName(e);if(t!==null){for(const n of t)if(this.isKeyUp(n))return!0;return!1}const i=this.keysPressed[e];return i?i.frame===this.context.time.frameCount&&i.pressed===!1:!1}isKeyPressed(e){if(!this.context.application.isVisible||!this.context.application.hasFocus)return!1;const t=this.getCodeForCommonKeyName(e);if(t!==null){for(const n of t)if(this.isKeyPressed(n))return!0;return!1}const i=this.keysPressed[e];return i&&i.pressed||!1}getCodeForCommonKeyName(e){if(e.length===1){if(e>="0"&&e<="9")return["Digit"+e];if(e>="a"&&e<="z")return["Key"+e.toUpperCase()];if(e==" ")return["Space"]}switch(e){case"shift":case"Shift":return["ShiftLeft","ShiftRight"];case"control":case"Control":return["ControlLeft","ControlRight"];case"alt":case"Alt":return["AltLeft","AltRight"]}return null}createInputEvent(e){switch(e.type){case"pointerdown":ot&&Te("Create Pointer down"),this.onDownButton(e.deviceIndex,e.button),this.onDown(e);break;case"pointermove":ot&&Te("Create Pointer move"),this.onMove(e);break;case"pointerup":ot&&Te("Create Pointer up"),this.onUp(e),this.onReleaseButton(e.deviceIndex,e.button);break}}convertScreenspaceToRaycastSpace(e){return e.x=(e.x-this.context.domX)/this.context.domWidth*2-1,e.y=-((e.y-this.context.domY)/this.context.domHeight)*2+1,e}constructor(e){this.context=e,this.context.post_render_callbacks.push(this.onEndOfFrame)}_htmlEventSource;bindEvents(){this.unbindEvents(),this._htmlEventSource=this.context.renderer.domElement,window.addEventListener("contextmenu",this.onContextMenu),this._htmlEventSource.addEventListener("pointerdown",this.onPointerDown,{passive:!0}),window.addEventListener("pointermove",this.onPointerMove,{passive:!0,capture:!0}),window.addEventListener("pointerup",this.onPointerUp,{passive:!0}),window.addEventListener("pointercancel",this.onPointerCancel,{passive:!0}),window.addEventListener("touchstart",this.onTouchStart,{passive:!0}),window.addEventListener("touchmove",this.onTouchMove,{passive:!0}),window.addEventListener("touchend",this.onTouchEnd,{passive:!0}),this._htmlEventSource.addEventListener("wheel",this.onMouseWheel,{passive:!0}),window.addEventListener("wheel",this.onWheelWindow,{passive:!0}),window.addEventListener("keydown",this.onKeyDown,!1),window.addEventListener("keypress",this.onKeyPressed,!1),window.addEventListener("keyup",this.onKeyUp,!1),window.addEventListener("blur",this.onLostFocus)}unbindEvents(){for(const e in this._eventListeners)this._eventListeners[e].length=0;window.removeEventListener("contextmenu",this.onContextMenu),this._htmlEventSource?.removeEventListener("pointerdown",this.onPointerDown),window.removeEventListener("pointermove",this.onPointerMove),window.removeEventListener("pointerup",this.onPointerUp),window.removeEventListener("pointercancel",this.onPointerCancel),window.removeEventListener("touchstart",this.onTouchStart),window.removeEventListener("touchmove",this.onTouchMove),window.removeEventListener("touchend",this.onTouchEnd),this._htmlEventSource?.removeEventListener("wheel",this.onMouseWheel,!1),window.removeEventListener("wheel",this.onWheelWindow,!1),window.removeEventListener("keydown",this.onKeyDown,!1),window.removeEventListener("keypress",this.onKeyPressed,!1),window.removeEventListener("keyup",this.onKeyUp,!1),window.removeEventListener("blur",this.onLostFocus)}dispose(){const e=this.context.post_render_callbacks.indexOf(this.onEndOfFrame);e>=0&&this.context.post_render_callbacks.splice(e,1),this.unbindEvents()}onLostFocus=()=>{for(const e in this.keysPressed)this.keysPressed[e].pressed=!1};_receivedPointerMoveEventsThisFrame=new Array;onEndOfFrame=()=>{this._receivedPointerMoveEventsThisFrame.length=0;for(let e=0;e<this._pointerUp.length;e++)this._pointerUp[e]=!1;for(let e=0;e<this._pointerDown.length;e++)this._pointerDown[e]=!1;for(let e=0;e<this._pointerClick.length;e++)this._pointerClick[e]=!1;for(let e=0;e<this._pointerDoubleClick.length;e++)this._pointerDoubleClick[e]=!1;for(const e of this._pointerPositionsDelta)e.set(0,0);for(let e=0;e<this._mouseWheelChanged.length;e++)this._mouseWheelChanged[e]=!1;for(let e=0;e<this._mouseWheelDeltaY.length;e++)this._mouseWheelDeltaY[e]=0};canReceiveInput(e){return e.target===this.context.renderer?.domElement||e.target===this.context.domElement||this.context.isInAR||this.context.isInAR&&e.target===document.body&&G.isMozillaXR()?!0:(ot&&console.warn("CanReceiveInput:False for",e.target),!1)}onContextMenu=e=>{this.canReceiveInput(e)!==!1&&e instanceof PointerEvent&&e.pointerType};keysPressed={};onKeyDown=e=>{if(ot&&console.log(`key down ${e.code}, ${this.context.application.hasFocus}`,e),!this.context.application.hasFocus)return;const t=this.keysPressed[e.code];if(t&&t.pressed)return;this.keysPressed[e.code]={pressed:!0,frame:this.context.time.frameCount+1,startFrame:this.context.time.frameCount+1,key:e.key,code:e.code};const i=new sc("keydown",e,e);this.onDispatchEvent(i)};onKeyPressed=e=>{if(!this.context.application.hasFocus)return;const t=this.keysPressed[e.code];if(!t)return;t.pressed=!0,t.frame=this.context.time.frameCount+1;const i=new sc("keypress",e,e);this.onDispatchEvent(i)};onKeyUp=e=>{if(!this.context.application.hasFocus)return;const t=this.keysPressed[e.code];if(!t)return;t.pressed=!1,t.frame=this.context.time.frameCount+1;const i=new sc("keyup",e,e);this.onDispatchEvent(i)};onWheelWindow=e=>{document.pointerLockElement&&this.onMouseWheel(e)};onMouseWheel=e=>{if(this.canReceiveInput(e)===!1)return;this._mouseWheelDeltaY.length<=0&&this._mouseWheelDeltaY.push(0),this._mouseWheelChanged.length<=0&&this._mouseWheelChanged.push(!1),this._mouseWheelChanged[0]=!0;const t=this._mouseWheelDeltaY[0];this._mouseWheelDeltaY[0]=t+e.deltaY};onPointerDown=e=>{if(this.context.isInAR||this.canReceiveInput(e)===!1)return;e.target instanceof HTMLElement&&e.target.setPointerCapture(e.pointerId);const t=this.getPointerId(e);ot&&Te(`pointer down #${t}, identifier:${e.pointerId}`);const i=this.getAndUpdateSpatialObjectForScreenPosition(t,e.clientX,e.clientY),n=new Co("pointerdown",e,{origin:this,mode:"screen",deviceIndex:0,pointerId:t,button:e.button,clientX:e.clientX,clientY:e.clientY,pointerType:e.pointerType,buttonName:this.getButtonName(e),device:i,pressure:e.pressure});this.onDown(n)};onPointerMove=e=>{if(this.context.isInAR||this._receivedPointerMoveEventsThisFrame.includes(e.pointerId))return;this._receivedPointerMoveEventsThisFrame.push(e.pointerId);let t=e.button;e.pointerType==="mouse"&&(t=this.getFirstPressedButtonForPointer(0)??0);const i=this.getPointerId(e,t);t===-1&&(t=i);const n=this.getAndUpdateSpatialObjectForScreenPosition(i,e.clientX,e.clientY),s=new Co("pointermove",e,{origin:this,mode:"screen",deviceIndex:0,pointerId:i,button:t,clientX:e.clientX,clientY:e.clientY,pointerType:e.pointerType,buttonName:this.getButtonName(e),device:n,pressure:e.pressure});this.onMove(s)};onPointerCancel=e=>{this.context.isInAR||(ot&&console.log("Pointer cancel",e),this.onPointerUp(e))};onPointerUp=e=>{if(this.context.isInAR)return;e.target instanceof HTMLElement&&e.target.releasePointerCapture(e.pointerId);const t=this.getPointerId(e),i=new Co("pointerup",e,{origin:this,mode:"screen",deviceIndex:0,pointerId:t,button:e.button,clientX:e.clientX,clientY:e.clientY,pointerType:e.pointerType,buttonName:this.getButtonName(e),device:this.getAndUpdateSpatialObjectForScreenPosition(t,e.clientX,e.clientY),pressure:e.pressure});this.onUp(i),this._pointerIds[t]=-1,ot&&console.log("ID="+t,"PointerId="+e.pointerId,"ALL:",[...this._pointerIds])};getPointerId(e,t){return e.pointerType==="mouse"?0+(t??e.button):this.getPointerIndex(e.pointerId)}getButtonName(e){const t=e.button;if(e.pointerType==="mouse")switch(t){case 0:return"left";case 1:return"middle";case 2:return"right"}return"unknown"}onTouchStart=e=>{if(this.context.isInAR)for(let t=0;t<e.changedTouches.length;t++){const i=e.changedTouches[t],n=this.getPointerIndex(i.identifier),s=this.getAndUpdateSpatialObjectForScreenPosition(n,i.clientX,i.clientY),r=new Co("pointerdown",e,{origin:this,mode:"screen",deviceIndex:0,pointerId:n,button:0,clientX:i.clientX,clientY:i.clientY,pointerType:"touch",buttonName:"unknown",device:s,pressure:i.force});this.onDown(r)}};onTouchMove=e=>{if(this.context.isInAR)for(let t=0;t<e.changedTouches.length;t++){const i=e.changedTouches[t],n=this.getPointerIndex(i.identifier),s=this.getAndUpdateSpatialObjectForScreenPosition(n,i.clientX,i.clientY),r=new Co("pointermove",e,{origin:this,mode:"screen",deviceIndex:0,pointerId:n,button:0,clientX:i.clientX,clientY:i.clientY,pointerType:"touch",buttonName:"unknown",device:s,pressure:i.force});this.onMove(r)}};onTouchEnd=e=>{if(this.context.isInAR)for(let t=0;t<e.changedTouches.length;t++){const i=e.changedTouches[t],n=this.getPointerIndex(i.identifier),s=new Co("pointerup",e,{origin:this,mode:"screen",deviceIndex:0,pointerId:n,button:0,clientX:i.clientX,clientY:i.clientY,pointerType:"touch",buttonName:"unknown",device:this.getAndUpdateSpatialObjectForScreenPosition(n,i.clientX,i.clientY),pressure:i.force});this.onUp(s),this._pointerIds[n]=-1}};tempNearPlaneVector=new b;tempFarPlaneVector=new b;tempLookMatrix=new ee;getAndUpdateSpatialObjectForScreenPosition(e,t,i){let n=this._pointerSpace[e];n||(n=new k,this._pointerSpace[e]=n),this._pointerSpace[e]=n;const s=this.context.mainCamera;if(s){const r=this.tempNearPlaneVector.set(t,i,-1);this.convertScreenspaceToRaycastSpace(r);const a=this.tempFarPlaneVector.set(r.x,r.y,1);r.unproject(s),a.unproject(s);const l=s.worldUp||z(0,1,0).applyQuaternion(be(s));this.tempLookMatrix.lookAt(a,r,l),n.position.set(r.x,r.y,r.z),n.quaternion.setFromRotationMatrix(this.tempLookMatrix)}return n}isInRect(e){if(this.context.isInXR)return!0;const t=this.context.domElement.getBoundingClientRect(),i=e.clientX,n=e.clientY,s=i>=t.x&&i<=t.right&&n>=t.y&&n<=t.bottom;return ot&&!s&&console.log("Not in rect",t,i,n),s}onDown(e){const t=e.pointerId;if(this.getPointerPressed(t)&&console.warn(`Received pointerDown for pointerId that is already pressed: ${t}`,ot?e:""),ot&&console.log(e.pointerType,"DOWN",t),!!this.isInRect(e)){for(this.setPointerState(t,this._pointerPressed,!0),this.setPointerState(t,this._pointerDown,!0),this.setPointerStateT(t,this._pointerEvent,e.source);t>=this._pointerTypes.length;)this._pointerTypes.push(e.pointerType);for(this._pointerTypes[t]=e.pointerType;t>=this._pointerPositionDown.length;)this._pointerPositionDown.push(new b);for(this._pointerPositionDown[t].set(e.clientX,e.clientY,e.clientZ??0);t>=this._pointerPositions.length;)this._pointerPositions.push(new J);this._pointerPositions[t].set(e.clientX,e.clientY),t>=this._pointerDownTime.length&&this._pointerDownTime.push(0),this._pointerDownTime[t]=this.context.time.realtimeSinceStartup,this.updatePointerPosition(e),this._pointerEventsPressed.push(e),this.onDispatchEvent(e)}}onMove(e){const t=e.pointerId,i=this.getPointerPressed(t);i===!1&&!this.isInRect(e)||e.pointerType==="touch"&&!i||(this.updatePointerPosition(e),this.setPointerStateT(t,this._pointerEvent,e.source),this.onDispatchEvent(e))}onUp(e){const t=e.pointerId;if(!this.getPointerPressed(t)){ot&&console.log(e.pointerType,"UP",t,"was not down");return}ot&&console.log(e.pointerType,"UP",t),this.setPointerState(t,this._pointerPressed,!1),this.setPointerStateT(t,this._pointerEvent,e.source),this.setPointerState(t,this._pointerUp,!0),this.updatePointerPosition(e);for(let a=this._pointerEventsPressed.length-1;a>=0;a--)if(this._pointerEventsPressed[a].pointerId===t){this._pointerEventsPressed.splice(a,1);break}if(!this._pointerPositionDown[t]){ot&&ge("Received pointer up event without matching down event for button: "+t),console.warn("Received pointer up event without matching down event for button: "+t);return}const i=this._pointerUpTime[t],n=this._pointerDownTime[t],s=this.context.time.realtimeSinceStartup,r=s-n;if(t>=this._pointerUpTime.length&&this._pointerUpTime.push(-99),this._pointerUpTime[t]=s,r<1){let a=e.clientX-this._pointerPositionDown[t].x,l=e.clientY-this._pointerPositionDown[t].y,c=0;if(e.isSpatial&&e.clientZ!=null&&(c=e.clientZ-this._pointerPositionDown[t].z,a*=200,l*=200,c*=200),Math.abs(a)<5&&Math.abs(l)<5&&Math.abs(c)<5){this.setPointerState(t,this._pointerClick,!0),e.isClick=!0;const h=s-i;ot&&console.log("CLICK",t,a,l,c,h),h<this._doubleClickTimeThreshold&&h>0&&(this.setPointerState(t,this._pointerDoubleClick,!0),e.isDoubleClick=!0)}}this.onDispatchEvent(e)}updatePointerPosition(e){const t=e.pointerId;for(;t>=this._pointerPositions.length;)this._pointerPositions.push(new J);for(;t>=this._pointerPositionsLastFrame.length;)this._pointerPositionsLastFrame.push(new J);for(;t>=this._pointerPositionsDelta.length;)this._pointerPositionsDelta.push(new J);const i=this._pointerPositionsLastFrame[t];i.copy(this._pointerPositions[t]);const n=this._pointerPositionsDelta[t];let s=e.clientX-i.x,r=e.clientY-i.y;if(e.source instanceof MouseEvent||e.source instanceof TouchEvent){const h=e.source;s===0&&h.movementX!==0&&(s=h.movementX||0),r===0&&h.movementY!==0&&(r=h.movementY||0)}n.x+=s,n.y+=r,this._pointerPositions[t].x=e.clientX,this._pointerPositions[t].y=e.clientY;const a=e.clientX,l=e.clientY;for(;t>=this._pointerPositionsRC.length;)this._pointerPositionsRC.push(new J);const c=this._pointerPositionsRC[t];c.set(a,l),this.convertScreenspaceToRaycastSpace(c)}getPointerIndex(e){let t=-1;for(let i=0;i<this._pointerIds.length;i++){if(this._pointerIds[i]===e)return i;t===-1&&this._pointerIds[i]===-1&&(t=i)}return t!==-1?(this._pointerIds[t]=e,t):(ot&&console.log("PUSH pointerId:",e),this._pointerIds.push(e),this._pointerIds.length-1)}setPointerState(e,t,i){t[e]=i}setPointerStateT(e,t,i){return t[e]=i,i}onDispatchEvent(e){const t=N.Current;try{N.Current=this.context,this.dispatchEvent(e)}finally{N.Current=t}}}const Ea=new ee().makeRotationY(Math.PI),Gi=new U().setFromAxisAngle(new b(0,1,0),Math.PI),FO=x("debugwebxr");class zO{priority=-1e5;gameObject;isXRRig(){return!0}get isActive(){return this.gameObject.visible}constructor(){if(this.gameObject=new k,this.gameObject.name="Implicit XR Rig",FO){const e=vg(16733661);e.position.y+=.5,this.gameObject.add(e)}}}const Po=x("debugwebxr"),Bd=x("debugcustomgesture"),UO="https://cdn.jsdelivr.net/npm/@webxr-input-profiles/assets@1.0/dist/profiles",NO="generic-trigger",VO=new U().setFromEuler(new nt(yo.degToRad(0),yo.degToRad(-90),yo.degToRad(-90))),WO=new b(.04,-.04,0);class rg{xr;get context(){return this.xr.context}inputSource;index=0;emitEvents=!0;get connected(){return this._connected}_connected=!0;get isTracking(){return this._isTracking}_isTracking=!1;get gamepad(){return this.__gamepad??=this.inputSource.gamepad}__gamepad;get isHand(){return this.hand!=null}get hand(){return this.__hand??=this.inputSource.hand}__hand;get handObject(){return this.context.renderer.xr.getHand(this.index)}get profiles(){return this.inputSource.profiles}get layout(){return this._layout}get targetRayMode(){return this.inputSource.targetRayMode}get targetRaySpace(){return this.inputSource.targetRaySpace}get gripSpace(){return this.inputSource.gripSpace}get side(){return this.__side??=this.inputSource.handedness}__side=void 0;get isRight(){return this.side==="right"}get isLeft(){return this.side==="left"}get isStylus(){return this._isMxInk}getHitTestSource(){return this._hitTestSource||this._requestHitTestSource(),this._hitTestSource}get hasHitTestSource(){return this._hitTestSource}cancelHitTestSource(){this._hitTestSource&&(this._hitTestSource.cancel(),this._hitTestSource=void 0)}_hitTestSource=void 0;_hasSelectEvent=!1;get hasSelectEvent(){return this._hasSelectEvent}_isMxInk=!1;_isMetaQuestTouchController=!1;getHitTest(){return this.xr.getHitTest(this)}_handJointPoses=new Map;getHandJointPose(e,t){if(t=t||this.xr.frame,!this.hand||!t?.getJointPose||!this.xr.referenceSpace)return null;let i=this._handJointPoses?.get(e);return i||(i=t.getJointPose(e,this.xr.referenceSpace),i&&this._handJointPoses.set(e,i),i)}_gripMatrix=new ee;_gripPosition=new b;_gripQuaternion=new U;_linearVelocity=new b;_rayPositionRaw=new b;_rayRotationRaw=new U;_rayMatrix=new ee;_rayPosition=new b;_rayQuaternion=new U;get gripPosition(){return z(this._gripPosition)}get gripQuaternion(){return ti(this._gripQuaternion)}get gripMatrix(){return this._gripMatrix}get gripLinearVelocity(){return z(this._linearVelocity).applyQuaternion(Gi)}get rayPosition(){return z(this._rayPosition)}get rayQuaternion(){return ti(this._rayQuaternion)}get gripWorldPosition(){return z(this._gripWorldPosition)}_gripWorldPosition=new b;get gripWorldQuaternion(){return ti(this._gripWorldQuaternion)}_gripWorldQuaternion=new U;get rayWorldPosition(){return z(this._rayWorldPosition)}_rayWorldPosition=new b;updateRayWorldPosition(){const e=this.xr.context.mainCamera?.parent;this._rayWorldPosition.copy(this._rayPositionRaw),e&&this._rayWorldPosition.applyMatrix4(e.matrixWorld)}get rayWorldQuaternion(){return ti(this._rayWorldQuaternion)}_rayWorldQuaternion=new U;get pinchPosition(){return z(this._pinchPosition)}_pinchPosition=new b;updateRayWorldQuaternion(){const e=this.xr.context.mainCamera?.parent,t=e?be(e):void 0;this._rayWorldQuaternion.copy(this._rayRotationRaw).multiply(Gi),t&&this._rayWorldQuaternion.premultiply(t)}get ray(){return this._ray.origin.copy(this.rayWorldPosition),this._ray.direction.copy(z(0,0,1).applyQuaternion(this.rayWorldQuaternion)),this._ray}_ray;_hand_wristDotUp=void 0;get handWristDotUp(){if(this._hand_wristDotUp!==void 0)return this._hand_wristDotUp;const e=this.handObject?.joints.wrist;if(e){const t=z(0,1,0).applyQuaternion(e.quaternion),i=z(0,1,0).dot(t);return this._hand_wristDotUp=i}}get isHandUpsideDown(){return this.handWristDotUp!==void 0?this.handWristDotUp<-.7:!1}get isTeleportGesture(){return this.isHandUpsideDown&&this.getGesture("pinch")?.isDown}get object(){return this._object}_object;_gripSpaceObject;_raySpaceObject;model=null;_debugAxesHelper=new _i(.15);_debugGripAxesHelper=new _i(.07);_debugRayAxesHelper=new _i(.07);async getModelUrl(){return this.getMotionController?.then(e=>e?.assetUrl||null)}constructor(e,t,i){this.xr=e,this.inputSource=t,this.index=i,this._object=new k,this._object.name=`NeedleXRController_${i}`,Po&&(this._object.add(this._debugAxesHelper),this._gripSpaceObject=new k,this._raySpaceObject=new k,this._gripSpaceObject.name=`NeedleXRController_${i}_gripSpace`,this._raySpaceObject.name=`NeedleXRController_${i}_raySpace`,this._gripSpaceObject.add(this._debugGripAxesHelper),this._raySpaceObject.add(this._debugRayAxesHelper),this.xr.context.scene.add(this._gripSpaceObject),this.xr.context.scene.add(this._raySpaceObject)),this.xr.context.scene.add(this._object),this._ray=new ls,this.pointerInit={origin:this,pointerType:this.hand?"hand":"controller",deviceIndex:this.index,pointerId:-1,mode:this.inputSource.targetRayMode,ray:this._ray,device:this._object,buttonName:"none"},this.initialize(),this.subscribeEvents()}_hitTestSourcePromise=null;_requestHitTestSource(){return this._hitTestSourcePromise?this._hitTestSourcePromise:this.xr.mode==="immersive-ar"&&this.inputSource.targetRayMode==="tracked-pointer"&&this.xr.session.requestHitTestSourceForTransientInput?this._hitTestSourcePromise=this.xr.session.requestHitTestSourceForTransientInput({profile:this.inputSource.profiles[0],offsetRay:new XRRay})?.then(e=>(this._hitTestSourcePromise=null,this.connected?this._hitTestSource=e:(e.cancel(),null)))??null:null}onPointerHits=e=>{};onUpdate(e){this.onUpdateFrame(e),this.updateInputEvents(),this.onUpdateMove()}onRenderDebug(){F.DrawSphere(this.rayWorldPosition,.003),F.DrawDirection(this.rayWorldPosition,z(0,0,10).applyQuaternion(this.rayWorldQuaternion));const e=(this.inputSource.gripSpace?this.gripWorldPosition:this.object.worldPosition).sub(this.object.worldForward.multiplyScalar(.1)),t=this.inputSource.profiles.join(`
|
|
146
146
|
`);let i=`Controller[${this.index}] (${this.inputSource.targetRayMode}, ${this.side})
|
|
147
147
|
C:${this.connected?"x":"-"} T:${this.isTracking?"x":"-"} Hand:${this.inputSource.hand?"x":"-"} Pen: ${this._isMxInk?"x":"-"}`;if(this.inputSource.hand&&(i+=`
|
|
@@ -160,11 +160,11 @@ To unregister you can call the function returned by your event hook (e.g.const u
|
|
|
160
160
|
|
|
161
161
|
or by using the once option like onStart(()=>{}, { once:true }).
|
|
162
162
|
|
|
163
|
-
See https://engine.needle.tools/docs/scripting.html#special-lifecycle-hooks for more information.`))}}function gs(o,e){const t=La.get(e);if(t){for(let n=0;n<t.length;n++)if(t[n].method===o){t.splice(n,1);return}}const i=Ia.get(e);if(i){for(let n=0;n<i.length;n++)if(i[n].method===o){i.splice(n,1);return}}}function Vn(o,e){e===de.ContextCreated&&lg.delete(o),x_(o,e)}function x_(o,e){e===xe.Start&&Ia.get(de.ContextCreated)&&x_(o,de.ContextCreated);const t=e===xe.Start||e===de.ContextCreated,i=La.get(e);i&&i.length>0&&S_(o,i,t);const n=Ia.get(e);if(n&&n.length>0){const s=[...n];n.length=0,S_(o,s,t),s.length>0&&(La.has(e)||La.set(e,new Array),La.get(e).push(...s))}}const zd=new Array,w_={context:null};function S_(o,e,t){zd.length=0;for(let n=0;n<e.length;n++)zd.push(e[n]);let i=lg.get(o);for(let n=0;n<zd.length;n++){const s=zd[n];let r=!0;if(i&&i.has(s)&&(r=!1),r)try{w_.context=o,s.method?.call(w_,o)}catch(a){console.error("Error in lifecycle method",a)}if(s.options?.once){for(let a=0;a<e.length;a++)if(e[a]===s){e.splice(a,1);break}}else t&&(i||(i=new Set,lg.set(o,i)),i.add(s))}}const lg=new WeakMap,cg={};function hg(o,e){cg[o]=e}function C_(o){const e=o.getBufferIdentifier(),t=cg[e];return t(o)}function P_(o){return typeof o.guid=="function"?o.guid():null}let dg;function $O(){return dg}function HO(o){dg=o}function O_(o,e){return e||(e={}),e={...dg,...e},o?new pb(o,e):new pb(e)}async function k_(){const o=await import("./vendor-JyrX4DVM.min.js").then(e=>e.bundler);return console.log(o),o.default===void 0?o:o.default}class M_{get isHost(){return this._host!==void 0}_host;_client;_clientData;constructor(){this.onEnable()}onEnable(){this.trySetupHost("HOST-5980e65c-8438-453e-8b35-f13c736dcd81")}async trySetupHost(e){const t=await k_(),i=new t(e);i.on("error",n=>{console.error(n),this._host=void 0,this.trySetupClient(e)}),i.on("open",n=>{this._host=new qO(i)})}async trySetupClient(e){const t=await k_();this._client=new t,this._client.on("error",i=>{console.error("Client error",i)}),this._client.on("open",i=>{console.log("client connected",i),this._clientData=this._client.connect(e,{metadata:{id:i}}),this._clientData.on("open",()=>{console.log("Connected to host")}),this._clientData.on("data",n=>{console.log("<<",n)})})}}class GO{_peer;constructor(e){this._peer=e}}class qO extends GO{get isHost(){return!0}_connections=[];constructor(e){super(e),console.log("I AM THE HOST"),this._peer?.on("connection",this.onConnection.bind(this)),this._peer.on("close",()=>{this.broadcast("BYE")}),setInterval(()=>{this.broadcast("HELLO")},2e3)}onConnection(e){console.log("host connection",e),e.on("open",()=>{this._connections.push(e),this.broadcastConnection(e)})}broadcastConnection(e){const t=this._connections.map(i=>i.metadata?.id).filter(i=>i!==void 0);this.broadcast({type:"connection-list",connections:t})}broadcast(e){if(e!=null){console.log(">>",e);for(const t in this._peer.connections){const i=this._peer.connections[t];if(i)if(Array.isArray(i))for(const n of i)n&&n.send(e);else console.warn(i)}}}}var _n=(o=>(o[o.OnConnection=0]="OnConnection",o[o.OnRoomJoin=1]="OnRoomJoin",o[o.Queued=2]="Queued",o[o.Immediate=3]="Immediate",o))(_n||{});const R_="https://urls.needle.tools/default-networking-backend/index";let qi="wss://networking.needle.tools/socket";const ni=!!x("debugnet"),rc=!!(ni||x("debugowner")),Ud=x("debugnetbin");var T_=(o=>(o.ConnectionInfo="connection-start-info",o))(T_||{}),te=(o=>(o.Join="join-room",o.Leave="leave-room",o.JoinedRoom="joined-room",o.LeftRoom="left-room",o.UserJoinedRoom="user-joined-room",o.UserLeftRoom="user-left-room",o.RoomStateSent="room-state-sent",o))(te||{});class XO{room;viewId;allowEditing;inRoom}class QO{room}class YO{userId}var E_=(o=>(o.RequestHasOwner="request-has-owner",o.ResponseHasOwner="response-has-owner",o.RequestIsOwner="request-is-owner",o.ResponseIsOwner="response-is-owner",o.RequestOwnership="request-ownership",o.GainedOwnership="gained-ownership",o.RemoveOwnership="remove-ownership",o.LostOwnership="lost-ownership",o.GainedOwnershipBroadcast="gained-ownership-broadcast",o.LostOwnershipBroadcast="lost-ownership-broadcast",o))(E_||{});class ug{guid;connection;get hasOwnership(){return this._hasOwnership}get isOwned(){return this._isOwned}get isConnected(){return this.connection.isConnected}_hasOwnership=!1;_isOwned=void 0;_gainSubscription;_lostSubscription;_hasOwnerResponse;constructor(e,t){this.connection=e,this.guid=t,this._gainSubscription=this.onGainedOwnership.bind(this),this._lostSubscription=this.onLostOwnership.bind(this),e.beginListen("lost-ownership",this._lostSubscription),e.beginListen("gained-ownership-broadcast",this._gainSubscription),this._hasOwnerResponse=this.onHasOwnerResponse.bind(this),e.beginListen("response-has-owner",this._hasOwnerResponse)}_isWaitingForOwnershipResponseCallback=null;updateIsOwned(){this.connection.send("request-has-owner",{guid:this.guid})}onHasOwnerResponse(e){e.guid===this.guid&&(this._isOwned=e.value)}requestOwnershipIfNotOwned(){return this._isWaitingForOwnershipResponseCallback!==null?this:(this._isWaitingForOwnershipResponseCallback=this.waitForHasOwnershipRequestResponse.bind(this),this.connection.beginListen("response-has-owner",this._isWaitingForOwnershipResponseCallback),this.connection.send("request-has-owner",{guid:this.guid}),this)}waitForHasOwnershipRequestResponse(e){e.guid===this.guid&&(this._isWaitingForOwnershipResponseCallback&&(this.connection.stopListen("response-has-owner",this._isWaitingForOwnershipResponseCallback),this._isWaitingForOwnershipResponseCallback=null),this._isOwned=e.value,e.value||(rc&&console.log("request ownership",this.guid),this.requestOwnership()))}requestOwnershipAsync(){return new Promise((e,t)=>{this.requestOwnership();let i=0;const n=()=>{if(i++>10)return t("Timeout");setTimeout(()=>{this.hasOwnership?e(this):n()},100)};n()})}requestOwnership(){return rc&&console.log("Request ownership",this.guid),this.connection.send("request-ownership",{guid:this.guid}),this}freeOwnership(){return this.connection.send("remove-ownership",{guid:this.guid}),this._isWaitingForOwnershipResponseCallback&&(this.connection.stopListen("response-has-owner",this._isWaitingForOwnershipResponseCallback),this._isWaitingForOwnershipResponseCallback=null),this}destroy(){this.connection.stopListen("gained-ownership",this._gainSubscription),this.connection.stopListen("lost-ownership",this._lostSubscription),this.connection.stopListen("response-has-owner",this._hasOwnerResponse),this._isWaitingForOwnershipResponseCallback&&(this.connection.stopListen("response-has-owner",this._isWaitingForOwnershipResponseCallback),this._isWaitingForOwnershipResponseCallback=null)}onGainedOwnership(e){e.guid===this.guid&&(this._isOwned=!0,this.connection.connectionId===e.owner?(rc&&console.log("GAINED OWNERSHIP",this.guid),this._hasOwnership=!0):this._hasOwnership=!1)}onLostOwnership(e){e===this.guid&&(rc&&console.log("LOST OWNERSHIP",this.guid),this._hasOwnership=!1,this._isOwned=!1)}}class A_{context;_peer=null;constructor(e){this.context=e}get peer(){return this._peer||(this._peer=new M_),this._peer}tryGetState(e){return e==="invalid"?null:this._state[e]}get connectionId(){return this._connectionId}get isDebugEnabled(){return ni}get isConnected(){return this.connected}get currentRoomName(){return this._currentRoomName}get allowEditing(){return this._currentRoomAllowEditing}get currentRoomViewId(){return this._currentRoomViewId}getViewOnlyUrl(){if(this.currentRoomViewId===null)return null;const e=new URL(window.location.href);return e.searchParams.set("view",this.currentRoomViewId),e.href}get isInRoom(){return this._isInRoom}get currentLatency(){return this._currentDelay}get currentServerUrl(){return this._ws?.url??null}sendPing(){this.send("ping",{time:this.context.time.time})}userIsInRoom(e){return this._currentInRoom.indexOf(e)!==-1}_usersInRoomCopy=[];usersInRoom(e=null){e||(e=this._usersInRoomCopy),e.length=0;for(const t of this._currentInRoom)e.push(t);return e}joinRoom(e,t=!1){return e?e.length>1024?(console.error('Room name too long, can not join: "'+e+'". Max length is 1024 characters.'),!1):(this.isInRoom&&this.currentRoomName!==e&&console.warn("Needle Engine is already connected to a networking room. Connecting to multiple rooms is not supported"),this.connect(),ni&&console.log("join: "+e),this.send("join-room",{room:e,viewOnly:t},_n.OnConnection),!0):(console.error('Missing room name, can not join: "'+e+'"'),!1)}leaveRoom(e=null){return e||(e=this.currentRoomName),e?(this.send("leave-room",{room:e}),!0):(console.error('Missing room name, can not join: "'+e+'"'),!1)}send(e,t=null,i=_n.Queued){if(t===null&&(t={}),i===_n.Queued){this._defaultMessagesBuffer.push({key:e,value:t});return}return this.sendWithWebsocket(e,t,i)}sendDeleteRemoteState(e){this.send("delete-state",{guid:e,dontSave:!0}),delete this._state[e]}sendDeleteRemoteStateAll(){this.send("delete-all-state"),this._state={}}sendBinary(e){Ud&&console.log("<< send binary",this.context.time.frame,e.length/1024+" KB"),this._ws?.send(e)}_defaultMessagesBuffer=[];_defaultMessagesBufferArray=[];sendBufferedMessagesNow(){if(!this._ws)return;this._defaultMessagesBufferArray.length=0;const e=Object.keys(this._defaultMessagesBuffer).length;for(const i in this._defaultMessagesBuffer){const n=this._defaultMessagesBuffer[i];if(e<=1){this.sendWithWebsocket(n.key,n.value,_n.Immediate);break}const s=this.toMessage(n.key,n.value);this._defaultMessagesBufferArray.push(s)}if(this._defaultMessagesBuffer.length=0,this._defaultMessagesBufferArray.length>0&&ni&&console.log("SEND BUFFERED",this._defaultMessagesBufferArray.length),this._defaultMessagesBufferArray.length<=0)return;const t=JSON.stringify(this._defaultMessagesBufferArray);this._ws?.send(t)}beginListen(e,t){return this._listeners[e]||(this._listeners[e]=[]),this._listeners[e].push(t),t}stopListening(e,t){return this.stopListen(e,t)}stopListen(e,t){if(!t||!this._listeners[e])return;const i=this._listeners[e].indexOf(t);i>=0&&this._listeners[e].splice(i,1)}beginListenBinary(e,t){return this._listenersBinary[e]||(this._listenersBinary[e]=[]),this._listenersBinary[e].push(t),t}stopListenBinary(e,t){if(!this._listenersBinary[e])return;const i=this._listenersBinary[e].indexOf(t);i>=0&&this._listenersBinary[e].splice(i,1)}netWebSocketUrlProvider;registerProvider(e){this.netWebSocketUrlProvider=e}async connect(e){if(this.connected&&e&&e!==qi)return Promise.reject("Can not connect to different server url. Please disconnect first.");if(this.connected)return Promise.resolve(!0);e&&console.debug("Connecting to user provided url "+e);const t=e||this.netWebSocketUrlProvider?.getWebsocketUrl();return t?qi=t:wb()&&(qi="wss://"+window.location.host+"/socket"),this.connectWebsocket()}disconnect(){this._ws?.close(),this._ws=void 0,qi=void 0,this._currentRoomAllowEditing=!0,this._currentRoomName=null,this._currentRoomViewId=null,this._isInRoom=!1,this._currentInRoom.length=0,this._state={},this._currentDelay=-1}_listeners={};_listenersBinary={};connected=!1;channelId;_connectionId=null;_ws;_waitingForSocket={};_isInRoom=!1;_currentRoomName=null;_currentRoomViewId=null;_currentRoomAllowEditing=!0;_currentInRoom=[];_state={};_currentDelay=-1;_connectingToWebsocketPromise=null;connectWebsocket(){return this._connectingToWebsocketPromise?this._connectingToWebsocketPromise:this._connectingToWebsocketPromise=new Promise(async(e,t)=>{let i=!1;const n=c=>{i||(i=!0,e(c))};if(qi===void 0&&(console.log("Fetch default backend url: "+R_),qi=await(await fetch(R_)).text()),qi===void 0){n(!1);return}console.debug(`\u22A1 Connecting to networking backend on
|
|
164
|
-
`+qi);const s=await import("./vendor-
|
|
163
|
+
See https://engine.needle.tools/docs/scripting.html#special-lifecycle-hooks for more information.`))}}function gs(o,e){const t=La.get(e);if(t){for(let n=0;n<t.length;n++)if(t[n].method===o){t.splice(n,1);return}}const i=Ia.get(e);if(i){for(let n=0;n<i.length;n++)if(i[n].method===o){i.splice(n,1);return}}}function Vn(o,e){e===de.ContextCreated&&lg.delete(o),x_(o,e)}function x_(o,e){e===xe.Start&&Ia.get(de.ContextCreated)&&x_(o,de.ContextCreated);const t=e===xe.Start||e===de.ContextCreated,i=La.get(e);i&&i.length>0&&S_(o,i,t);const n=Ia.get(e);if(n&&n.length>0){const s=[...n];n.length=0,S_(o,s,t),s.length>0&&(La.has(e)||La.set(e,new Array),La.get(e).push(...s))}}const zd=new Array,w_={context:null};function S_(o,e,t){zd.length=0;for(let n=0;n<e.length;n++)zd.push(e[n]);let i=lg.get(o);for(let n=0;n<zd.length;n++){const s=zd[n];let r=!0;if(i&&i.has(s)&&(r=!1),r)try{w_.context=o,s.method?.call(w_,o)}catch(a){console.error("Error in lifecycle method",a)}if(s.options?.once){for(let a=0;a<e.length;a++)if(e[a]===s){e.splice(a,1);break}}else t&&(i||(i=new Set,lg.set(o,i)),i.add(s))}}const lg=new WeakMap,cg={};function hg(o,e){cg[o]=e}function C_(o){const e=o.getBufferIdentifier(),t=cg[e];return t(o)}function P_(o){return typeof o.guid=="function"?o.guid():null}let dg;function $O(){return dg}function HO(o){dg=o}function O_(o,e){return e||(e={}),e={...dg,...e},o?new pb(o,e):new pb(e)}async function k_(){const o=await import("./vendor-DPCU8cUF.min.js").then(e=>e.bundler);return console.log(o),o.default===void 0?o:o.default}class M_{get isHost(){return this._host!==void 0}_host;_client;_clientData;constructor(){this.onEnable()}onEnable(){this.trySetupHost("HOST-5980e65c-8438-453e-8b35-f13c736dcd81")}async trySetupHost(e){const t=await k_(),i=new t(e);i.on("error",n=>{console.error(n),this._host=void 0,this.trySetupClient(e)}),i.on("open",n=>{this._host=new qO(i)})}async trySetupClient(e){const t=await k_();this._client=new t,this._client.on("error",i=>{console.error("Client error",i)}),this._client.on("open",i=>{console.log("client connected",i),this._clientData=this._client.connect(e,{metadata:{id:i}}),this._clientData.on("open",()=>{console.log("Connected to host")}),this._clientData.on("data",n=>{console.log("<<",n)})})}}class GO{_peer;constructor(e){this._peer=e}}class qO extends GO{get isHost(){return!0}_connections=[];constructor(e){super(e),console.log("I AM THE HOST"),this._peer?.on("connection",this.onConnection.bind(this)),this._peer.on("close",()=>{this.broadcast("BYE")}),setInterval(()=>{this.broadcast("HELLO")},2e3)}onConnection(e){console.log("host connection",e),e.on("open",()=>{this._connections.push(e),this.broadcastConnection(e)})}broadcastConnection(e){const t=this._connections.map(i=>i.metadata?.id).filter(i=>i!==void 0);this.broadcast({type:"connection-list",connections:t})}broadcast(e){if(e!=null){console.log(">>",e);for(const t in this._peer.connections){const i=this._peer.connections[t];if(i)if(Array.isArray(i))for(const n of i)n&&n.send(e);else console.warn(i)}}}}var _n=(o=>(o[o.OnConnection=0]="OnConnection",o[o.OnRoomJoin=1]="OnRoomJoin",o[o.Queued=2]="Queued",o[o.Immediate=3]="Immediate",o))(_n||{});const R_="https://urls.needle.tools/default-networking-backend/index";let qi="wss://networking.needle.tools/socket";const ni=!!x("debugnet"),rc=!!(ni||x("debugowner")),Ud=x("debugnetbin");var T_=(o=>(o.ConnectionInfo="connection-start-info",o))(T_||{}),te=(o=>(o.Join="join-room",o.Leave="leave-room",o.JoinedRoom="joined-room",o.LeftRoom="left-room",o.UserJoinedRoom="user-joined-room",o.UserLeftRoom="user-left-room",o.RoomStateSent="room-state-sent",o))(te||{});class XO{room;viewId;allowEditing;inRoom}class QO{room}class YO{userId}var E_=(o=>(o.RequestHasOwner="request-has-owner",o.ResponseHasOwner="response-has-owner",o.RequestIsOwner="request-is-owner",o.ResponseIsOwner="response-is-owner",o.RequestOwnership="request-ownership",o.GainedOwnership="gained-ownership",o.RemoveOwnership="remove-ownership",o.LostOwnership="lost-ownership",o.GainedOwnershipBroadcast="gained-ownership-broadcast",o.LostOwnershipBroadcast="lost-ownership-broadcast",o))(E_||{});class ug{guid;connection;get hasOwnership(){return this._hasOwnership}get isOwned(){return this._isOwned}get isConnected(){return this.connection.isConnected}_hasOwnership=!1;_isOwned=void 0;_gainSubscription;_lostSubscription;_hasOwnerResponse;constructor(e,t){this.connection=e,this.guid=t,this._gainSubscription=this.onGainedOwnership.bind(this),this._lostSubscription=this.onLostOwnership.bind(this),e.beginListen("lost-ownership",this._lostSubscription),e.beginListen("gained-ownership-broadcast",this._gainSubscription),this._hasOwnerResponse=this.onHasOwnerResponse.bind(this),e.beginListen("response-has-owner",this._hasOwnerResponse)}_isWaitingForOwnershipResponseCallback=null;updateIsOwned(){this.connection.send("request-has-owner",{guid:this.guid})}onHasOwnerResponse(e){e.guid===this.guid&&(this._isOwned=e.value)}requestOwnershipIfNotOwned(){return this._isWaitingForOwnershipResponseCallback!==null?this:(this._isWaitingForOwnershipResponseCallback=this.waitForHasOwnershipRequestResponse.bind(this),this.connection.beginListen("response-has-owner",this._isWaitingForOwnershipResponseCallback),this.connection.send("request-has-owner",{guid:this.guid}),this)}waitForHasOwnershipRequestResponse(e){e.guid===this.guid&&(this._isWaitingForOwnershipResponseCallback&&(this.connection.stopListen("response-has-owner",this._isWaitingForOwnershipResponseCallback),this._isWaitingForOwnershipResponseCallback=null),this._isOwned=e.value,e.value||(rc&&console.log("request ownership",this.guid),this.requestOwnership()))}requestOwnershipAsync(){return new Promise((e,t)=>{this.requestOwnership();let i=0;const n=()=>{if(i++>10)return t("Timeout");setTimeout(()=>{this.hasOwnership?e(this):n()},100)};n()})}requestOwnership(){return rc&&console.log("Request ownership",this.guid),this.connection.send("request-ownership",{guid:this.guid}),this}freeOwnership(){return this.connection.send("remove-ownership",{guid:this.guid}),this._isWaitingForOwnershipResponseCallback&&(this.connection.stopListen("response-has-owner",this._isWaitingForOwnershipResponseCallback),this._isWaitingForOwnershipResponseCallback=null),this}destroy(){this.connection.stopListen("gained-ownership",this._gainSubscription),this.connection.stopListen("lost-ownership",this._lostSubscription),this.connection.stopListen("response-has-owner",this._hasOwnerResponse),this._isWaitingForOwnershipResponseCallback&&(this.connection.stopListen("response-has-owner",this._isWaitingForOwnershipResponseCallback),this._isWaitingForOwnershipResponseCallback=null)}onGainedOwnership(e){e.guid===this.guid&&(this._isOwned=!0,this.connection.connectionId===e.owner?(rc&&console.log("GAINED OWNERSHIP",this.guid),this._hasOwnership=!0):this._hasOwnership=!1)}onLostOwnership(e){e===this.guid&&(rc&&console.log("LOST OWNERSHIP",this.guid),this._hasOwnership=!1,this._isOwned=!1)}}class A_{context;_peer=null;constructor(e){this.context=e}get peer(){return this._peer||(this._peer=new M_),this._peer}tryGetState(e){return e==="invalid"?null:this._state[e]}get connectionId(){return this._connectionId}get isDebugEnabled(){return ni}get isConnected(){return this.connected}get currentRoomName(){return this._currentRoomName}get allowEditing(){return this._currentRoomAllowEditing}get currentRoomViewId(){return this._currentRoomViewId}getViewOnlyUrl(){if(this.currentRoomViewId===null)return null;const e=new URL(window.location.href);return e.searchParams.set("view",this.currentRoomViewId),e.href}get isInRoom(){return this._isInRoom}get currentLatency(){return this._currentDelay}get currentServerUrl(){return this._ws?.url??null}sendPing(){this.send("ping",{time:this.context.time.time})}userIsInRoom(e){return this._currentInRoom.indexOf(e)!==-1}_usersInRoomCopy=[];usersInRoom(e=null){e||(e=this._usersInRoomCopy),e.length=0;for(const t of this._currentInRoom)e.push(t);return e}joinRoom(e,t=!1){return e?e.length>1024?(console.error('Room name too long, can not join: "'+e+'". Max length is 1024 characters.'),!1):(this.isInRoom&&this.currentRoomName!==e&&console.warn("Needle Engine is already connected to a networking room. Connecting to multiple rooms is not supported"),this.connect(),ni&&console.log("join: "+e),this.send("join-room",{room:e,viewOnly:t},_n.OnConnection),!0):(console.error('Missing room name, can not join: "'+e+'"'),!1)}leaveRoom(e=null){return e||(e=this.currentRoomName),e?(this.send("leave-room",{room:e}),!0):(console.error('Missing room name, can not join: "'+e+'"'),!1)}send(e,t=null,i=_n.Queued){if(t===null&&(t={}),i===_n.Queued){this._defaultMessagesBuffer.push({key:e,value:t});return}return this.sendWithWebsocket(e,t,i)}sendDeleteRemoteState(e){this.send("delete-state",{guid:e,dontSave:!0}),delete this._state[e]}sendDeleteRemoteStateAll(){this.send("delete-all-state"),this._state={}}sendBinary(e){Ud&&console.log("<< send binary",this.context.time.frame,e.length/1024+" KB"),this._ws?.send(e)}_defaultMessagesBuffer=[];_defaultMessagesBufferArray=[];sendBufferedMessagesNow(){if(!this._ws)return;this._defaultMessagesBufferArray.length=0;const e=Object.keys(this._defaultMessagesBuffer).length;for(const i in this._defaultMessagesBuffer){const n=this._defaultMessagesBuffer[i];if(e<=1){this.sendWithWebsocket(n.key,n.value,_n.Immediate);break}const s=this.toMessage(n.key,n.value);this._defaultMessagesBufferArray.push(s)}if(this._defaultMessagesBuffer.length=0,this._defaultMessagesBufferArray.length>0&&ni&&console.log("SEND BUFFERED",this._defaultMessagesBufferArray.length),this._defaultMessagesBufferArray.length<=0)return;const t=JSON.stringify(this._defaultMessagesBufferArray);this._ws?.send(t)}beginListen(e,t){return this._listeners[e]||(this._listeners[e]=[]),this._listeners[e].push(t),t}stopListening(e,t){return this.stopListen(e,t)}stopListen(e,t){if(!t||!this._listeners[e])return;const i=this._listeners[e].indexOf(t);i>=0&&this._listeners[e].splice(i,1)}beginListenBinary(e,t){return this._listenersBinary[e]||(this._listenersBinary[e]=[]),this._listenersBinary[e].push(t),t}stopListenBinary(e,t){if(!this._listenersBinary[e])return;const i=this._listenersBinary[e].indexOf(t);i>=0&&this._listenersBinary[e].splice(i,1)}netWebSocketUrlProvider;registerProvider(e){this.netWebSocketUrlProvider=e}async connect(e){if(this.connected&&e&&e!==qi)return Promise.reject("Can not connect to different server url. Please disconnect first.");if(this.connected)return Promise.resolve(!0);e&&console.debug("Connecting to user provided url "+e);const t=e||this.netWebSocketUrlProvider?.getWebsocketUrl();return t?qi=t:wb()&&(qi="wss://"+window.location.host+"/socket"),this.connectWebsocket()}disconnect(){this._ws?.close(),this._ws=void 0,qi=void 0,this._currentRoomAllowEditing=!0,this._currentRoomName=null,this._currentRoomViewId=null,this._isInRoom=!1,this._currentInRoom.length=0,this._state={},this._currentDelay=-1}_listeners={};_listenersBinary={};connected=!1;channelId;_connectionId=null;_ws;_waitingForSocket={};_isInRoom=!1;_currentRoomName=null;_currentRoomViewId=null;_currentRoomAllowEditing=!0;_currentInRoom=[];_state={};_currentDelay=-1;_connectingToWebsocketPromise=null;connectWebsocket(){return this._connectingToWebsocketPromise?this._connectingToWebsocketPromise:this._connectingToWebsocketPromise=new Promise(async(e,t)=>{let i=!1;const n=c=>{i||(i=!0,e(c))};if(qi===void 0&&(console.log("Fetch default backend url: "+R_),qi=await(await fetch(R_)).text()),qi===void 0){n(!1);return}console.debug(`\u22A1 Connecting to networking backend on
|
|
164
|
+
`+qi);const s=await import("./vendor-DPCU8cUF.min.js").then(c=>c.index),r=s.default?.WebsocketBuilder??s.WebsocketBuilder,a=s.default?.ExponentialBackoff??s.ExponentialBackoff,l=new r(qi).withMaxRetries(10).withBackoff(new a(2e3,4)).onOpen(()=>{this._connectingToWebsocketPromise=null,this._ws=l,this.connected=!0,A()||ni?console.log(`\u229E Connected to networking backend
|
|
165
165
|
`+qi):console.debug("\u229E Connected to networking backend",qi),n(!0),this.onSendQueued(_n.OnConnection)}).onClose(c=>{this._connectingToWebsocketPromise=null,this.connected=!1,this._isInRoom=!1,n(!1);let h="Websocket connection closed...";qi?.includes("/socket")||(h+=' Do you perhaps mean to connect to "/socket"?'),console.error(h)}).onError(c=>{console.error("\u22A0 Websocket connection failed..."),n(!1)}).onRetry(()=>{console.log("\u2192 Retry connecting to networking websocket")}).build();l.addEventListener(s.WebsocketEvent.message,(c,h)=>{this.onMessage(c,h)})})}onMessage(e,t){const i=t.data;try{if(typeof i!="string"){i.size&&this.handleIncomingBinaryMessage(i);return}const n=JSON.parse(i);if(Array.isArray(n))for(const s of n)this.handleIncomingStringMessage(s);else this.handleIncomingStringMessage(n);return}catch(n){ni&&i==="pong"?console.log("<<",i):A()&&console.error("Failed to parse message",n)}}async handleIncomingBinaryMessage(e){Ud&&console.log("<< bin",this.context.time.frame);const t=await e.arrayBuffer();var i=new Uint8Array(t);const n=new JC(i),s=n.getBufferIdentifier(),r=this._listenersBinary[s],a=C_(n),l=P_(a);if(l&&typeof l=="string"&&(this._state[l]=a),!r)return;const c=a??n;for(const h of r)h(c)}handleIncomingStringMessage(e){if(ni&&console.log("<<",e.key??e),e.key)switch(e.key){case"connection-start-info":if(e.data){const r=e.data;r&&(console.assert(r.id!==void 0&&r.id!==null&&r.id.length>0,"server did not send connection id",r.id),console.debug("Your id is: "+r.id,this.context.alias??""),this._connectionId=r.id)}else console.warn("Expected connection id in "+e.key);break;case"joined-room":if(ni&&console.log(e),e){this._isInRoom=!0;const r=e;this._currentRoomName=r.room,this._currentRoomViewId=r.viewId,this._currentRoomAllowEditing=r.allowEditing??!0,this._currentInRoom.length=0,this._currentInRoom.push(...r.inRoom),(Ud||A())&&console.debug("Joined Needle Engine Room: "+r.room);const a=new URL(window.location.href);a.searchParams.has("room")&&a.searchParams.delete("room"),a.searchParams.set("view",this._currentRoomViewId),console.debug(`Room view id: ${this._currentRoomViewId}
|
|
166
166
|
${a.href}`)}this.onSendQueued(_n.OnRoomJoin);break;case"left-room":const n=e;n.room===this.currentRoomName&&(this._isInRoom=!1,this._currentRoomName=null,this._currentRoomAllowEditing=!0,this._currentInRoom.length=0,(Ud||A())&&console.debug("Left Needle Engine Room: "+n.room));break;case"user-joined-room":if(e.data){const r=e.data;this._currentInRoom.push(r.userId),ni&&console.log(r.userId+" joined","now in room:",this._currentInRoom)}break;case"user-left-room":if(e.data){const r=e.data,a=this._currentInRoom.indexOf(r.userId);a>=0&&(ni&&console.log(r.userId+" left","now in room:",this._currentInRoom),this._currentInRoom.splice(a,1)),r.userId===this.connectionId&&console.log("you left the room")}break;case"all-room-state-deleted":ni&&console.log("RECEIVED all-room-state-deleted"),this._state={};break;case"ping":case"pong":const s=e.data?.time;s&&(this._currentDelay=this.context.time.time-s),ni&&console.log(`Current latency: ${(this._currentDelay*1e3).toFixed()} ms`,"Clients in room: "+this._currentInRoom?.length);break}const t=e.data;t&&(this._state[t.guid]=t);let i=this._listeners[e.key];if(i){i=[...i];for(const n of i)try{n(e.data)}catch(s){console.error('Error invoking callback for "'+e.key+'"',s)}}}toMessage(e,t){return{key:e,data:t}}sendWithWebsocket(e,t,i=_n.OnRoomJoin){if(!this._ws){const s=this._waitingForSocket[i]||[];s.push(()=>this.sendWithWebsocket(e,t,i)),this._waitingForSocket[i]=s;return}const n=JSON.stringify(this.toMessage(e,t));ni&&console.log(">>",e),this._ws.send(n)}onSendQueued(e){const t=this._waitingForSocket[e];if(t){for(const i of t)i();t.length=0}}}const ac=x("debugwebxr");class pg{controllerStates=[];userId;context;userStateEvtName;constructor(e,t){this.userId=e,this.context=t,this.userStateEvtName="xr-sync-user-state-"+e,this.context.connection.beginListen(this.userStateEvtName,this.onReceivedControllerState)}dispose(){this.context.connection.stopListen(this.userStateEvtName,this.onReceivedControllerState)}onReceivedControllerState=e=>{ac&&console.log(`XRSync: Received change for ${this.userId}: ${e.type} ${e.handedness}; tracked=${e.isTracking}`);let t=!1;for(let i=0;i<this.controllerStates.length;i++)if(this.controllerStates[i].index===e.index){this.controllerStates[i]=e,t=!0;break}t||this.controllerStates.push(e)};update(e){if(this.context.connection.isConnected!=!1){for(let t=this.controllerStates.length-1;t>=0;t--){const i=this.controllerStates[t];let n=!1;for(let s=0;s<e.controllers.length;s++)e.controllers[s].index===i.index&&(n=!0);n||(ac&&console.log(`XRSync: ${i.type} ${i.handedness} removed`,i.index),this.controllerStates.splice(t,1),this.sendControllerRemoved(i))}for(const t of e.controllers)this.updateControllerStates(t)}}onExitXR(e){for(const t of this.controllerStates)this.sendControllerRemoved(t);this.controllerStates.length=0}sendControllerRemoved(e){e.isTracking=!1,e.guid="",this.context.connection.send(this.userStateEvtName,e),this.context.connection.sendDeleteRemoteState(e.guid)}updateControllerStates(e){const t=this.controllerStates.find(i=>i.index===e.index);if(t){let i=!1;i||=t.isTracking!=e.isTracking,i&&(t.isTracking=e.isTracking,this.context.connection.send(this.userStateEvtName,t))}else{const i={guid:this.userId+"-"+e.index,isTracking:e.isTracking,handedness:e.side,index:e.index,type:e.hand?"hand":"controller"};this.controllerStates.push(i),this.context.connection.send(this.userStateEvtName,i),ac&&console.log(`XRSync: ${i.type} ${i.handedness} added`,i.index)}}}class I_{hasState(e){return e?this._states.has(e):!1}isTracking(e,t){if(!e)return;const i=this._states.get(e);return i?i.controllerStates.find(n=>n.handedness===t)?.isTracking||!1:void 0}getDeviceType(e,t){if(!e)return;const i=this._states.get(e);return i?i.controllerStates.find(n=>n.handedness===t)?.type||"unknown":void 0}context;constructor(e){this.context=e,this.context.connection.beginListen(te.JoinedRoom,this.onJoinedRoom),this.context.connection.beginListen(te.LeftRoom,this.onLeftRoom),this.context.connection.beginListen(te.UserJoinedRoom,this.onOtherUserJoinedRoom),this.context.connection.beginListen(te.UserLeftRoom,this.onOtherUserLeftRoom)}destroy(){this.context.connection.stopListen(te.JoinedRoom,this.onJoinedRoom),this.context.connection.stopListen(te.LeftRoom,this.onLeftRoom),this.context.connection.stopListen(te.UserJoinedRoom,this.onOtherUserJoinedRoom),this.context.connection.stopListen(te.UserLeftRoom,this.onOtherUserLeftRoom)}onJoinedRoom=()=>{if(this.context.connection.connectionId){this._states.has(this.context.connection.connectionId)||(ac&&console.log("XRSync: Local user joined room",this.context.connection.connectionId),this._states.set(this.context.connection.connectionId,new pg(this.context.connection.connectionId,this.context)));for(const e of this.context.connection.usersInRoom())this._states.has(e)||this._states.set(e,new pg(e,this.context))}};onLeftRoom=()=>{this.context.connection.connectionId&&(this._states.has(this.context.connection.connectionId)||(this._states.get(this.context.connection.connectionId)?.dispose(),this._states.delete(this.context.connection.connectionId)))};onOtherUserJoinedRoom=e=>{const t=e.userId;this._states.has(t)||(ac&&console.log("XRSync: Remote user joined room",t),this._states.set(t,new pg(t,this.context)))};onOtherUserLeftRoom=e=>{const t=e.userId;this._states.has(t)||(this._states.get(t)?.dispose(),this._states.delete(t))};_states=new Map;onUpdate(e){this.context.connection.isConnected&&this.context.connection.connectionId&&this._states.get(this.context.connection.connectionId)?.update(e)}onExitXR(e){this.context.connection.isConnected&&this.context.connection.connectionId&&this._states.get(this.context.connection.connectionId)?.onExitXR(e)}}class L_{_fadeToColorQuad;_fadeToColorMaterial;constructor(){this._fadeToColorMaterial=new we({color:0,transparent:!0,depthTest:!1,fog:!1,side:vi}),this._fadeToColorQuad=new H(new Bn(10,10),this._fadeToColorMaterial)}dispose(){this._fadeToColorQuad.geometry.dispose(),this._fadeToColorMaterial.dispose()}update(e,t){const i=this._fadeToColorQuad,n=this._fadeToColorMaterial;i.parent!==e&&n.opacity>0?e.add(i):n.opacity===0&&i.removeFromParent(),i.layers.set(2),i.material=this._fadeToColorMaterial,i.position.z=-1,i.renderOrder=1/0;const s=this._requestedFadeValue;n.opacity=j.lerp(n.opacity,s,t/.03),Math.abs(n.opacity-s)<=.01&&this._transitionResolve&&(this._transitionResolve(),this._transitionResolve=null,this._transitionPromise=null,this._requestedFadeValue=0)}remove(){this._fadeToColorQuad.removeFromParent()}fadeTransition(){if(this._transitionPromise)return this._transitionPromise;this._requestedFadeValue=1;const e=new Promise(t=>{this._transitionResolve=t});return this._transitionPromise=e,e}_requestedFadeValue=0;_transitionPromise=null;_transitionResolve=null}var br=(o=>(o[o.Quad=0]="Quad",o[o.Cube=1]="Cube",o[o.Sphere=2]="Sphere",o[o.Cylinder=3]="Cylinder",o[o.RoundedCube=10]="RoundedCube",o))(br||{});class _r{static createText(e,t){let i=null;const n=t?.font||KO(t?.familyFamily||null);n instanceof AC?i=this.#t(e,n,t):i==null&&(i=new mn);const s=t?.color||16777215,r=new H(i,t?.material??new ut({color:s}));return this.applyDefaultObjectOptions(r,t),n instanceof Promise?n.then(a=>{r.geometry=this.#t(e,a,t),t?.onGeometry&&t.onGeometry(r)}):t?.onGeometry&&t.onGeometry(r),r}static#t(e,t,i){const n=i?.depth||.1;return new IC(e,{font:t,size:1,depth:n,height:n,bevelEnabled:i?.bevel||!1,bevelThickness:.01,bevelOffset:.01,bevelSize:.01})}static createOccluder(e){const t=new we({colorWrite:!1,depthWrite:!0,side:vi});return this.createPrimitive(e,{material:t})}static createPrimitive(e,t){let i;const n=t?.color||16777215;switch(e){case"Quad":case 0:{const s=new Bn(1,1,1,1),r=t?.material??new ut({color:n});t?.texture&&"map"in r&&(r.map=t.texture),i=new H(s,r),i.name="Quad"}break;case"Cube":case 1:{const s=new va(1,1,1),r=t?.material??new ut({color:n});t?.texture&&"map"in r&&(r.map=t.texture),i=new H(s,r),i.name="Cube"}break;case 10:case"RoundedCube":{const s=ZO(1,1,1,.1,2),r=t?.material??new ut({color:n});t?.texture&&"map"in r&&(r.map=t.texture),i=new H(s,r),i.name="RoundedCube"}break;case"Sphere":case 2:{const s=new dd(.5,16,16),r=t?.material??new ut({color:n});t?.texture&&"map"in r&&(r.map=t.texture),i=new H(s,r),i.name="Sphere"}break;case"Cylinder":case 3:{const s=new q0(.5,.5,1,32),r=t?.material??new ut({color:n});t?.texture&&"map"in r&&(r.map=t.texture),i=new H(s,r),i.name="Cylinder"}break;case"ShaderBall":i=new cs,i.name="ShaderBall",JO(i,t);break}return this.applyDefaultObjectOptions(i,t),i}static createSprite(e){const t=new pS({color:16777215});e?.texture&&"map"in t&&(t.map=e.texture);const i=new mS(t);return this.applyDefaultObjectOptions(i,e),i}static applyDefaultObjectOptions(e,t){e.receiveShadow=!0,e.castShadow=!0,t?.name&&(e.name=t.name),t?.position&&(Array.isArray(t.position)?e.position.set(t.position[0],t.position[1],t.position[2]):e.position.set(t.position.x||0,t.position.y||0,t.position.z||0)),t?.rotation&&(Array.isArray(t.rotation)?e.rotation.set(t.rotation[0],t.rotation[1],t.rotation[2]):e.rotation.set(t.rotation.x||0,t.rotation.y||0,t.rotation.z||0)),t?.scale&&(typeof t.scale=="number"?e.scale.set(t.scale,t.scale,t.scale):Array.isArray(t.scale)?e.scale.set(t.scale[0],t.scale[1],t.scale[2]):e.scale.set(t.scale.x||1,t.scale.y||1,t.scale.z||1)),t?.receiveShadow!=null&&(e.receiveShadow=t.receiveShadow),t?.castShadow!=null&&(e.castShadow=t.castShadow),t?.parent&&t.parent.add(e)}}function ZO(o,e,t,i,n){const s=new gS,r=1e-5,a=i-r;s.absarc(r,r,r,-Math.PI/2,-Math.PI,!0),s.absarc(r,e-a*2,r,Math.PI,Math.PI/2,!0),s.absarc(o-a*2,e-a*2,r,Math.PI/2,0,!0),s.absarc(o-a*2,r,r,0,-Math.PI/2,!0);const l=new fS(s,{bevelEnabled:!0,bevelSegments:n*2,steps:1,bevelSize:a,bevelThickness:i,curveSegments:n,UVGenerator:{generateTopUV:(c,h)=>{const d=[];for(let p=0;p<h.length;p+=3)d.push(new J(h[p]/o,h[p+1]/e));return d},generateSideWallUV:(c,h,d,p,m,f)=>{const g=[];return g.push(new J(h[d]/o,h[d+1]/e)),g.push(new J(h[p]/o,h[p+1]/e)),g.push(new J(h[m]/o,h[m+1]/e)),g.push(new J(h[f]/o,h[f+1]/e)),g}}});return l.scale(1,1,1-i),l.center(),l.index||l.setIndex(Array.from({length:l.attributes.position.count},(c,h)=>h)),l.computeVertexNormals(),l}const Nd=new Map;function KO(o){let e="";switch(o){default:case"OpenSans":e="https://cdn.needle.tools/static/fonts/facetype/Open Sans_Regular_ascii.json";break;case"Helvetiker":e="https://raw.githubusercontent.com/mrdoob/three.js/master/examples/fonts/helvetiker_regular.typeface.json";break}if(Nd.has(e)){const n=Nd.get(e);if(n)return n}const t=new LC,i=new Promise((n,s)=>{t.load(e,r=>{Nd.set(e,r),n(r)},void 0,s)});return Nd.set(e,i),i}let mg=!1,gg=null;function JO(o,e){if(gg===null){const t="https://cdn.needle.tools/static/models/shaderball.glb",i=new xo,n=xm(null);i.setDRACOLoader(n.dracoLoader),i.setKTX2Loader(n.ktx2Loader),mg=!0,gg=i.loadAsync(t).then(s=>{const r=s.scene;return r.position.y-=.5,r}).catch(s=>(console.warn("Failed to load shaderball mesh: "+s.message),D_())).finally(()=>{mg=!1})}if(mg){const t=D_();t.name="ShaderBall-Placeholder";const i=t.children[0];i?.type==="Mesh"&&j_(i,e),o.add(t)}gg.then(t=>{o.children.forEach(s=>{s.name==="ShaderBall-Placeholder"&&o.remove(s)});const i=t.clone(),n=i.children[0];n?.type==="Mesh"&&(n.geometry.attributes.tangent||n.geometry.computeTangents(),j_(n,e)),o.add(i)})}function j_(o,e){if(e?.color||e?.material||e?.texture){const t=e?.material??o.material?.clone()??new ut;e.color&&"color"in t&&t.color instanceof ne&&t.color.set(e.color),e?.texture&&"map"in t&&(t.map=e.texture),o.material=t}}function D_(){return new cs().add(_r.createPrimitive("Sphere",{material:new we({transparent:!0,opacity:.1})}))}class Fl{static _active=null;static get active(){return this._active}static _requestInFlight=!1;static async start(e,t){if(this._active)return console.error("Cannot start a new XR session while one is already active"),null;if(this._requestInFlight)return console.error("Cannot start a new XR session while a request is already in flight"),null;if("xr"in navigator&&navigator.xr){if(!t)return console.error("XRSessionInit must be provided"),null;this._requestInFlight=!0;const i=await navigator.xr.requestSession(e,t);return i.addEventListener("end",()=>{this._active=null}),this._requestInFlight?(this._requestInFlight=!1,this._active=new Fl(e,t,i),this._active):(i.end(),null)}return null}static async handoff(){return this._active?this._active.handoff():null}static async stop(){this._requestInFlight=!1,this._active&&(await this._active.end(),await Un(100)),this._active=null}_session;_mode;_init;get isAR(){return this._mode==="immersive-ar"}_renderer;_camera;_scene;constructor(e,t,i){this._mode=e,this._init=t,this._session=i,this._session.addEventListener("end",this.onEnd),this._renderer=new rr({alpha:!0}),this._renderer.setAnimationLoop(this.onFrame),this._renderer.xr.setSession(i),this._renderer.xr.enabled=!0,this._camera=new re,this._scene=new yi,this._scene.fog=new X0(4473924,10,250),this._scene.add(this._camera),this.setupScene()}end(){return this._session?this._session.end():Promise.resolve()}async handoff(){if(!this._session)throw new Error("Cannot handoff a session that has already ended");const e={session:this._session,mode:this._mode,init:this._init};return await this.onBeforeHandoff(),this.onEnd(),this._session=null,e}onEnd=()=>{this._session?.removeEventListener("end",this.onEnd),this._renderer.setAnimationLoop(null),this._renderer.dispose(),this._scene.clear()};_lastTime=0;onFrame=(e,t)=>{const i=e-this._lastTime;this.update(e,i),this._camera.parent!==this._scene&&this._scene.add(this._camera),this._renderer.render(this._scene,this._camera)};async onBeforeHandoff(){await Un(1e3),this._scene.clear()}_objects=[];setupScene(){this._scene.background=new ne(0),this._scene.add(new am(5,10,1118481,1118481));const e=new lm(16777215,1);e.position.set(0,20,0),e.castShadow=!1,this._scene.add(e);const t=new lm(16777215,1);t.position.set(0,-1,0),t.castShadow=!1,this._scene.add(t);const i=new cm(16777215,1,100,1);i.position.set(0,2,0),i.castShadow=!1,i.distance=200,this._scene.add(i);const n=50;for(let s=0;s<100;s++){const r=new ut({color:2236962,metalness:1,roughness:.8});this.isAR&&(r.emissive=new ne(Math.random(),Math.random(),Math.random()),r.emissiveIntensity=Math.random());const a=j.random(0,1)>.5?br.Sphere:br.Cube,l=_r.createPrimitive(a,{material:r});l.position.x=j.random(-n,n),l.position.y=j.random(-2,n),l.position.z=j.random(-n,n),l.rotation.x=j.random(0,Math.PI*2),l.rotation.y=j.random(0,Math.PI*2),l.rotation.z=j.random(0,Math.PI*2),l.scale.multiplyScalar(.5+Math.random()*10);const c=l.position.distanceTo(this._camera.position)-l.scale.x;c<1&&l.position.multiplyScalar(1+1/c),this._objects.push(l),this._scene.add(l)}}update(e,t){const i=e*4e-4;for(let n=0;n<this._objects.length;n++){const s=this._objects[n];s.position.y+=Math.sin(i+n*.5)*.005,s.rotateY(.002)}}}var lc;(o=>{const e=[];function t(){if(!e?.length)return!1;for(const s of e)s.exportAndOpen();return!0}o.exportAndOpen=t;function i(s){e.push(s)}o.registerExporter=i;function n(s){if(!e)return;const r=e.indexOf(s);r>=0&&e.splice(r,1)}o.unregisterExporter=n})(lc||(lc={}));const Ge=x("debugwebxr"),B_=x("stats");let fg=0;function ek(o){let e=null;const t=o;return t.getAROverlayContainer?e=t.getAROverlayContainer():e=o,e}tk();async function tk(){if(x("debugasap")){let o=globalThis["needle:XRSession"];if(o instanceof Promise){delete globalThis["needle:XRSession"],ue.addContextCreatedCallback(async e=>{if(!o)return;pr(!0);const t=await o;if(t){const i=Y.getDefaultSessionInit("immersive-vr");Y.setSession("immersive-vr",t,i,e.context)}else console.error("NeedleXRSession: ASAP session was rejected");o=void 0});return}}if("xr"in navigator){if(/WebXRViewer\//i.test(navigator.userAgent)){console.warn("WebXRViewer does not support addEventListener");return}navigator.xr?.addEventListener("sessiongranted",async()=>{pr(!0),console.log("Received Session Granted..."),await Un(100);const o=sessionStorage.getItem("needle_xr_session_mode"),e=sessionStorage.getItem("needle_xr_session_init")??null,t=e?JSON.parse(e):null;let i=null;if(F_()&&(await Fl.start(o||"immersive-vr",t||Y.getDefaultSessionInit("immersive-vr")),await ok(),i=await Fl.handoff()),i)Y.setSession(i.mode,i.session,i.init,N.Current);else if(o&&e){console.log("Session Granted: Restore last session");const n=JSON.parse(e);Y.start(o,n).catch(s=>console.warn(s))}else Y.start("immersive-vr").catch(n=>console.warn("Session Granted failed:",n))},{once:!0})}}function ik(o,e){sessionStorage.setItem("needle_xr_session_mode",o),sessionStorage.setItem("needle_xr_session_init",JSON.stringify(e))}function nk(){sessionStorage.removeItem("needle_xr_session_mode"),sessionStorage.removeItem("needle_xr_session_init")}const yg=new Set;ue.registerCallback(de.ContextCreationStart,async o=>{yg.add(o.context)}),ue.registerCallback(de.ContextCreated,async o=>{yg.delete(o.context);const e=o.context?.domElement.getAttribute("autostart")||null;sk(e)});function F_(){return yg.size>0}function ok(){return new Promise(o=>{const e=Date.now(),t=setInterval(()=>{(!F_()||Date.now()-e>6e4)&&(clearInterval(t),o())},100)})}G.isDesktop()&&A()&&window.addEventListener("keydown",o=>{(o.key==="x"||o.key==="Escape")&&Y.active&&Y.stop()});function sk(o){if(o)switch(o?.toLowerCase()){case"ar":Ln.registerWaitForInteraction(()=>{Y.start("ar")});break}}const Vd=Symbol("initial-fov");class Y{static _sync=null;static getXRSync(e){return this._sync||(this._sync=new I_(e)),this._sync}static get currentSessionRequest(){return this._currentSessionRequestMode}static _currentSessionRequestMode=null;static get active(){return this._activeSession}static get activeMode(){return this._activeSession?.mode??null}static get xrSystem(){return"xr"in navigator?navigator.xr:void 0}static isXRSupported(){return Promise.all([this.isVRSupported(),this.isARSupported()]).then(e=>e.some(t=>t)).catch(()=>!1)}static isVRSupported(){return this.isSessionSupported("immersive-vr")}static isARSupported(){return this.isSessionSupported("immersive-ar")}static isSessionSupported(e){return this.xrSystem?.isSessionSupported(e).catch(t=>(Ge&&console.error(t),!1))??Promise.resolve(!1)}static _currentSessionRequest;static _activeSession;static onSessionRequestStart(e){this._sessionRequestStartListeners.push(e)}static offSessionRequestStart(e){const t=this._sessionRequestStartListeners.indexOf(e);t>=0&&this._sessionRequestStartListeners.splice(t,1)}static _sessionRequestStartListeners=[];static onSessionRequestEnd(e){this._sessionRequestEndListeners.push(e)}static offSessionRequestEnd(e){const t=this._sessionRequestEndListeners.indexOf(e);t>=0&&this._sessionRequestEndListeners.splice(t,1)}static _sessionRequestEndListeners=[];static onXRSessionStart(e){this._xrStartListeners.push(e)}static offXRSessionStart(e){const t=this._xrStartListeners.indexOf(e);t>=0&&this._xrStartListeners.splice(t,1)}static _xrStartListeners=[];static onXRSessionEnd(e){this._xrEndListeners.push(e)}static offXRSessionEnd(e){const t=this._xrEndListeners.indexOf(e);t>=0&&this._xrEndListeners.splice(t,1)}static _xrEndListeners=[];static onControllerAdded(e){this._controllerAddedListeners.push(e)}static offControllerAdded(e){const t=this._controllerAddedListeners.indexOf(e);t>=0&&this._controllerAddedListeners.splice(t,1)}static _controllerAddedListeners=[];static onControllerRemoved(e){this._controllerRemovedListeners.push(e)}static offControllerRemoved(e){const t=this._controllerRemovedListeners.indexOf(e);t>=0&&this._controllerRemovedListeners.splice(t,1)}static _controllerRemovedListeners=[];static offerSession(e,t,i){return"xr"in navigator&&navigator.xr&&"offerSession"in navigator.xr?(typeof navigator.xr.offerSession=="function"&&(console.log("WebXR offerSession is available - requesting mode: "+e),t=="default"&&(t=this.getDefaultSessionInit(e)),navigator.xr.offerSession(e,{...t}).then(n=>Y.setSession(e,n,t,i)).catch(n=>{console.log("XRSession offer rejected (perhaps because another call to offerSession was made or a call to requestSession was made)")})),!0):!1}static getDefaultSessionInit(e){switch(e){case"immersive-ar":const t=["anchors","local-floor","layers","dom-overlay","hit-test","unbounded"];return G.isVisionOS()||t.push("hand-tracking"),{optionalFeatures:t};case"immersive-vr":const i=["local-floor","bounded-floor","high-fixed-foveation-level","layers"];return G.isVisionOS()||i.push("hand-tracking"),{optionalFeatures:i};default:return console.warn("No default session init for mode",e),{}}}static async start(e,t,i){if(G.isiOS()){if(e==="ar")if(await this.isARSupported())e="immersive-ar";else return lc.exportAndOpen(),null}else e=="ar"&&(e="immersive-ar");if(A()&&x("debugxrpreroom"))return console.warn("Debug: Starting temporary XR session"),await Fl.start(e,t||Y.getDefaultSessionInit(e)),null;if(this._currentSessionRequest)return console.warn("A XRSession is already being requested"),(Ge||A())&&ge("A XRSession is already being requested"),this._currentSessionRequest.then(()=>this._activeSession);if(this._activeSession)return console.error("A XRSession is already running"),this._activeSession;if(i||(i=N.Current),i||(i=ue.All[0]),!i)throw new Error("No Needle Engine Context found");switch(t||(t={}),e){case"immersive-ar":{if(await this.xrSystem?.isSessionSupported("immersive-ar")!==!0)return console.error(e+" is not supported by this browser."),null;const r=this.getDefaultSessionInit(e),a=ek(i.domElement);a&&!G.isQuest()&&(r.domOverlay={root:a},r.optionalFeatures.push("dom-overlay")),t={...r,...t}}break;case"immersive-vr":{if(await this.xrSystem?.isSessionSupported("immersive-vr")!==!0)return console.error(e+" is not supported by this browser."),null;t={...this.getDefaultSessionInit(e),...t}}break;default:console.warn("No default session init for mode",e);break}t.optionalFeatures??=[],t.requiredFeatures??=[],await Fl.stop();const n=e=="immersive-ar"?i.scripts_immersive_ar:i.scripts_immersive_vr;Ge?console.log(`%cRequesting ${e} session`,"font-weight:bold;",t,n):console.log(`%cRequesting ${e} session`,"font-weight:bold;");for(const r of n)r.onBeforeXR&&r.onBeforeXR(e,t);for(const r of this._sessionRequestStartListeners)r({mode:e,init:t});Ge&&Te("Requesting "+e+" session ("+Date.now()+")"),this._currentSessionRequest=navigator?.xr?.requestSession(e,t),this._currentSessionRequestMode=e;const s=await this._currentSessionRequest?.catch(r=>{console.error(r,"Code: "+r.code),r.code===9&&ge("Make sure your device has the required permissions (e.g. camera access)"),console.log("If the specified XR configuration is not supported (e.g. entering AR doesnt work) - make sure you access the website on a secure connection (HTTPS) and your device has the required permissions (e.g. camera access)"),location.protocol==="http:"&&ge("XR requires a secure connection (HTTPS)")});this._currentSessionRequest=void 0,this._currentSessionRequestMode=null;for(const r of this._sessionRequestEndListeners)r({mode:e,init:t,newSession:s||null});return s?this.setSession(e,s,t,i):(console.warn("XR Session request was rejected"),null)}static setSession(e,t,i,n){if(this._activeSession)return console.error("A XRSession is already running"),this._activeSession;const s=e=="immersive-ar"?n.scripts_immersive_ar:n.scripts_immersive_vr;return this._activeSession=new Y(e,t,n,{scripts:s,controller_added:this._controllerAddedListeners,controller_removed:this._controllerRemovedListeners,init:i}),t.addEventListener("end",this.onEnd),Ge?console.log(`%cStarted ${e} session`,"font-weight:bold;",s):console.log(`%cStarted ${e} session`,"font-weight:bold;"),this._activeSession}static $_stop_request=Symbol();static stop(){const e=this._activeSession;e&&(e[this.$_stop_request]===void 0?(Ge&&console.log("[NeedleXRSession] Stopping XR Session... (new)"),e[this.$_stop_request]=setTimeout(()=>{e.end()})):Ge&&console.warn("[NeedleXRSession] XR Session stop already requested"))}static onEnd=()=>{Ge&&console.log("XR Session ended"),this._activeSession=null};context;get sync(){return Y._sync}get running(){return!this._ended&&this.session!=null}session;mode;get interactionMode(){return this.session.interactionMode}get visibilityState(){return this.session.visibilityState}get isVisibleBlurred(){return this.session.visibilityState==="visible-blurred"}get isSystemKeyboardSupported(){return this.session.isSystemKeyboardSupported}get environmentBlendMode(){return this.session.environmentBlendMode}get frame(){return this.context.xrFrame}controllers=[];get leftController(){return this.controllers.find(e=>e.side==="left")}get rightController(){return this.controllers.find(e=>e.side==="right")}getController(e){return typeof e=="number"?this.controllers[e]||null:this.controllers.find(t=>t.side===e)||null}get isPassThrough(){return!!(this.environmentBlendMode!=="opaque"&&this.interactionMode==="world-space"||this.mode==="immersive-ar"&&this.environmentBlendMode!=="opaque"&&this.controllers.some(e=>e.inputSource.targetRayMode==="tracked-pointer")||A()&&G.isDesktop()&&this.mode==="immersive-ar")}get isAR(){return this.mode==="immersive-ar"}get isVR(){return this.mode==="immersive-vr"}get isScreenBasedAR(){return this.isAR&&!this.isPassThrough}get posePosition(){return this._transformPosition}get poseOrientation(){return this._transformOrientation}get referenceSpace(){return this.context.renderer.xr.getReferenceSpace()}get viewerPose(){return this._viewerPose}get isTrackingImages(){if(this.frame&&"getImageTrackingResults"in this.frame&&typeof this.frame.getImageTrackingResults=="function")try{const e=this.frame.getImageTrackingResults();for(const t of e)if(t.trackingState==="tracked")return!0}catch{return!1}return!1}get rig(){const e=this._rigs[0]??null;return e?.gameObject&&Or(e.gameObject)||e?.isActive===!1?(this.updateActiveXRRig(),this._rigs[0]??null):e}_rigScale=1;_lastRigScaleUpdate=-1;get rigScale(){return this._rigs[0]?(this._lastRigScaleUpdate!==this.context.time.frame&&(this._lastRigScaleUpdate=this.context.time.frame,this._rigScale=this._rigs[0].gameObject.worldScale.x),this._rigScale):1}addRig(e){this._rigs.indexOf(e)>=0||(e.priority===void 0&&(e.priority=0),this._rigs.push(e),this.updateActiveXRRig())}removeRig(e){const t=this._rigs.indexOf(e);t!==-1&&(this._rigs.splice(t,1),this.updateActiveXRRig())}setRigActive(e){const t=this._rigs.indexOf(e),i=this._rigs[0];this._rigs.splice(t,1),this._rigs.unshift(e),e.priority=i?.priority??0,this.updateActiveXRRig()}getUserOffsetInRig(){const e=this.context.mainCamera?.position;if(!e||!this.rig)return z(0,0,0);const t=z(e);return t.x*=-1,t.z*=-1,t.applyQuaternion(ti(this.rig.gameObject.quaternion)),t}updateActiveXRRig(){const e=this._rigs[0]??null;this._defaultRig.gameObject.parent!==this.context.scene&&this.context.scene.add(this._defaultRig.gameObject),this._defaultRig.gameObject.visible=!0,this._rigs.includes(this._defaultRig)||this._rigs.push(this._defaultRig);let t=this._rigs[0];t&&t.priority===void 0&&(t.priority=0);for(let i=1;i<this._rigs.length;i++){const n=this._rigs[i];if(n.isActive){if(Or(n.gameObject)){this._rigs.splice(i,1),i--;continue}(!t||t.isActive===!1||n.priority!==void 0&&n.priority>t.priority)&&(t=n)}}if(e!==t){const i=this._rigs.indexOf(t);i>=0&&this._rigs.splice(i,1),this._rigs.unshift(t)}Ge&&(e===t?console.log("Updated Active XR Rig:",t,"prev:",e):console.log("Updated Active XRRig:",t," (the same as before)"))}_rigs=[];_viewerHitTestSource=null;getHitTest(e){if(e)return this.getControllerHitTest(e);if(!this._viewerHitTestSource)return null;const t=this._viewerHitTestSource,i=this.frame.getHitTestResults(t);if(i.length>0){const n=i[0];return this.convertHitTestResult(n)}return null}getControllerHitTest(e){const t=e.getHitTestSource();if(!t)return null;const i=this.frame.getHitTestResultsForTransientInput(t);for(const n of i)if(n.inputSource===e.inputSource)for(const s of n.results)return this.convertHitTestResult(s);return null}convertHitTestResult(e){const t=this.context.renderer.xr.getReferenceSpace(),i=t&&e.getPose(t);if(i){const n=z(i.transform.position),s=ti(i.transform.orientation),r=this.context.mainCamera;if(r?.parent!==this._cameraRenderParent&&n.applyMatrix4(Ea),r?.parent){n.applyMatrix4(r.parent.matrixWorld),s.multiply(Gi);const a=be(r.parent);a.premultiply(Gi),s.premultiply(a)}return{hit:e,position:n,quaternion:s}}return null}convertSpace(e){const t=z(e.position);t.applyMatrix4(Ea);const i=ti(e.orientation);return i.premultiply(Gi),{position:t,quaternion:i}}_defaultRig;_xr_scripts;_xr_update_scripts=[];_inactive_scripts=[];_controllerAdded;_controllerRemoved;_originalCameraWorldPosition;_originalCameraWorldRotation;_originalCameraWorldScale;_originalCameraParent;_mainCamera=null;constructor(e,t,i,n){ik(e,n.init),this.session=t,this.mode=e,this.context=i,(Ge||x("console"))&&pr(!0),this._xr_scripts=[...n.scripts],this._xr_update_scripts=this._xr_scripts.filter(s=>typeof s.onUpdateXR=="function"),this._controllerAdded=n.controller_added,this._controllerRemoved=n.controller_removed,Oo(this.onBefore,xe.LateUpdate),this.context.pre_render_callbacks.push(this.onBeforeRender),this.context.post_render_callbacks.push(this.onAfterRender),(n.init.optionalFeatures?.includes("hit-test")||n.init.requiredFeatures?.includes("hit-test"))&&t.requestReferenceSpace("viewer").then(s=>t.requestHitTestSource?.call(t,{space:s})?.then(r=>this._viewerHitTestSource=r).catch(r=>console.error(r))).catch(s=>console.error(s)),this.context.mainCamera&&(this._originalCameraWorldPosition=K(this.context.mainCamera,new b),this._originalCameraWorldRotation=be(this.context.mainCamera,new U),this._originalCameraWorldScale=He(this.context.mainCamera,new b),this._originalCameraParent=this.context.mainCamera.parent,this.context.mainCamera instanceof re&&(this.context.mainCamera[Vd]=this.context.mainCamera.fov)),this._defaultRig=new zO,this.context.scene.add(this._defaultRig.gameObject),this.addRig(this._defaultRig);for(let s=0;s<t.inputSources.length;s++){const r=t.inputSources[s];if(!r.handedness){console.warn("Input source in xr session has no handedness - ignoring",s);continue}this.onInputSourceAdded(r)}this.session.addEventListener("end",this.onEnd),this.session.addEventListener("inputsourceschange",s=>{for(const r of s.removed)this.disconnectInputSource(r);for(const r of s.added)this.onInputSourceAdded(r)}),this.context.xr=this,this.context.renderer.xr.setSession(this.session).then(this.onRendererSessionSet),"controllerAutoUpdate"in this.context.renderer.xr?(console.debug("Disabling three.js controllerAutoUpdate"),this.context.renderer.xr.controllerAutoUpdate=!1):Ge&&console.warn("controllerAutoUpdate is not available in three.js - cannot disable it")}onRendererSessionSet=()=>{this.running&&(this.context.renderer.xr.enabled=!0,this.context.renderer.xr.updateCamera(this.context.mainCamera),this.context.mainCameraComponent?.applyClearFlags())};onInputSourceAdded=e=>{if(e.targetRayMode==="screen")return;let t=0;for(let n=0;n<this.session.inputSources.length;n++)if(this.session.inputSources[n]===e){t=n;break}if(this.controllers.find(n=>n.inputSource===e)){console.debug("Controller already exists for input source",t);return}else if(this._newControllers.find(n=>n.inputSource===e)){console.debug("Controller already registered for input source",t);return}const i=new rg(this,e,t);this._newControllers.push(i)};disconnectInputSource(e){const t=(s,r)=>{if(s.inputSource===e){Ge&&console.log("Disconnecting controller",s.index);const a=r.indexOf(s);a>=0&&r.splice(a,1),this.invokeControllerEvent(s,this._controllerRemoved,"removed");const l={xr:this,controller:s,change:"removed"};for(const c of this._xr_scripts)c.onXRControllerRemoved&&c.onXRControllerRemoved(l);s.onDisconnected()}},i=[...this.controllers];for(let s=i.length-1;s>=0;s--){const r=i[s];t(r,this.controllers)}const n=[...this._newControllers];for(let s=n.length-1;s>=0;s--){const r=n[s];t(r,this._newControllers)}}end(){this._ended||this.session.end().catch(e=>console.warn(e))}_ended=!1;_newControllers=[];onEnd=e=>{if(this._ended)return;this._ended=!0,console.debug("XR Session ended"),nk(),this.onAfterRender(),this.revertCustomForward(),this._didStart=!1,this._previousCameraParent=null,this.requestedCameraNearPlane=null,gs(this.onBefore,xe.LateUpdate);const t=this.context.pre_render_callbacks.indexOf(this.onBeforeRender);t>=0&&this.context.pre_render_callbacks.splice(t,1);const i=this.context.post_render_callbacks.indexOf(this.onAfterRender);i>=0&&this.context.post_render_callbacks.splice(i,1),this.context.xr=null,this.context.renderer.xr.enabled=!1,this.context.pre_update_oneshot_callbacks.push(()=>{this.context.mainCameraComponent?.applyClearFlags(),this.context.mainCameraComponent?.applyClippingPlane()}),f_({session:this});for(const s of Y._xrEndListeners)s({xr:this});const n=[...this.controllers];for(let s=0;s<n.length;s++)this.disconnectInputSource(n[s].inputSource);this.controllers.length=0,this._newControllers.length=0;for(const s of this._xr_scripts)s?.onLeaveXR?.({xr:this});this.sync?.onExitXR(this),this.context.mainCamera&&(this._originalCameraParent?.add(this.context.mainCamera),this._originalCameraWorldPosition&&mt(this.context.mainCamera,this._originalCameraWorldPosition),this._originalCameraWorldRotation&&fn(this.context.mainCamera,this._originalCameraWorldRotation),this._originalCameraWorldScale&&ka(this.context.mainCamera,this._originalCameraWorldScale),this.context.mainCamera instanceof re&&this.context.mainCamera[Vd]&&(this.context.mainCamera.fov=this.context.mainCamera[Vd],this.context.mainCamera[Vd]=0)),this.context.requestSizeUpdate(),this._defaultRig.gameObject.removeFromParent(),pr(!1)};_didStart=!1;onBefore=e=>{const t=e.xrFrame;if(!t)return;this.context.xr=this,this.context.mainCameraComponent&&this.context.mainCameraComponent!==this._mainCamera&&(this._mainCamera=this.context.mainCameraComponent),this.rig?.isActive==!1&&(Ge&&console.warn("Latest rig is not active - trying to activate a different rig",this.rig),this.updateActiveXRRig()),this.rig&&this._mainCamera?.gameObject&&this._mainCamera?.gameObject?.parent!==this.rig.gameObject&&this.rig.gameObject.add(this._mainCamera?.gameObject),this.internalUpdateState(),this.applyCustomForward();const i={xr:this};if(this._didStart){if(this.context.new_scripts_xr.length>0){const n=[...this.context.new_scripts_xr];for(let s=0;s<n.length;s++){const r=this.context.new_scripts_xr[s];if(!r||r.destroyed||r.supportsXR?.(this.mode)==!1){this.context.new_scripts_xr.splice(s,1);continue}if(!r.activeAndEnabled){this.context.new_scripts_xr.splice(s,1),this.markInactive(r);continue}if(this.addScript(r)){this.invokeCallback_EnterXR(r);for(const a of this.controllers)this.invokeCallback_ControllerAdded(r,a)}}}}else{if(this._didStart=!0,this.mode==="immersive-vr"){const s=$t(this.context.scene.children);if(s){const r=s.getSize(z());if(r.length()>0){const a=this._defaultRig.gameObject;a.position.set(s.min.x+r.x*.5,s.min.y,s.max.z+r.z*.5+1.5);const l=s.getCenter(z());l.y=a.position.y,a.lookAt(l)}}}g_({session:this}),yr();for(const s of Y._xrStartListeners)s(i);const n=[...this._xr_scripts];Ge&&console.log("NeedleXRSession start, handle scripts:",n);for(const s of n){if(s.destroyed){this._script_to_remove.push(s);continue}if(!s.activeAndEnabled){this.markInactive(s);continue}this.invokeCallback_EnterXR(s);for(const r of this.controllers)this.invokeCallback_ControllerAdded(s,r)}}this.syncCameraCullingMask();for(const n of this.controllers)n.onUpdate(t);if(this._newControllers.length>0){const n=[...this._newControllers];this._newControllers.length=0;for(const s of n){if(!s.connected){console.warn("New controller is not connected",s);continue}this.controllers.push(s);for(const r of this._xr_scripts){if(r.destroyed){this._script_to_remove.push(r);continue}r.activeAndEnabled!==!1&&this.invokeCallback_ControllerAdded(r,s)}}this.controllers.sort((s,r)=>s.index-r.index)}Ge&&this.context.time.frame%30===0&&this.controllers.length<=0&&this.session.inputSources.length>0&&(pr(!0),console.error("XRControllers are not added but inputSources are present"));for(const n of this._xr_update_scripts){if(n.destroyed===!0){this._script_to_remove.push(n);continue}if(n.activeAndEnabled===!1){this.markInactive(n);continue}n.onUpdateXR&&n.onUpdateXR(i)}if(this.handleInactiveScripts(),this._script_to_remove.length>0){const n=[...new Set(this._script_to_remove)];this._script_to_remove.length=0;for(const s of n)!s.destroyed&&this.running&&s.onLeaveXR?.(i),this.removeScript(s)}this.sync?.onUpdate(this),this.onRenderDebug()};onRenderDebug(){if(Ge)for(const e of this.controllers)e.onRenderDebug();if((Ge||B_)&&this.rig&&(fg++,fg>=20)){const e=this.rig.gameObject.worldPosition,t=this.rig.gameObject.worldForward;e.add(t.multiplyScalar(1.5));const i=this.rig.gameObject.worldUp;e.add(i.multiplyScalar(2.5));let n="";if(n+=`${this.context.time.smoothedFps.toFixed(0)} FPS`,n+=`, calls: ${this.context.renderer.info.render.calls}, tris: ${this.context.renderer.info.render.triangles.toLocaleString()}`,Ge||B_)for(const s of this.controllers)n+=`
|
|
167
|
-
${s.hand?"hand":"ctrl"} ${s.inputSource.handedness}[${s.index}] con:${s.connected} tr:${s.isTracking} hts:${s.hasHitTestSource?"yes":"no"}`;fg=0,F.DrawLabel(e,n,void 0,1/60*20)}}onBeforeRender=()=>{this.context.mainCamera&&(this.updateFade(this.context.mainCamera),this.requestedCameraNearPlane!==null&&this.context.mainCamera instanceof re&&(this.context.mainCamera.near=this.requestedCameraNearPlane,this.requestedCameraNearPlane=null))};onAfterRender=()=>{if(this.onUpdateFade_PostRender(),G.isDesktop()||!this._renderOnceOnDevice){const e=this.context.renderer;if(e.xr.isPresenting&&this.context.mainCamera){this._renderOnceOnDevice=!0;const t=e.xr.enabled,i=e.getRenderTarget(),n=this.context.scene.background;e.xr.enabled=!1,e.setRenderTarget(null),this.isPassThrough&&(this.context.scene.background=null),this.context.composer?this.context.composer.render(this.context.time.deltaTime):e.render(this.context.scene,this.context.mainCamera),e.xr.enabled=t,e.setRenderTarget(i),this.context.scene.background=n}}};addScript(e){return this._xr_scripts.includes(e)?!1:(Ge&&console.log("Register new XRScript",e),this._xr_scripts.push(e),typeof e.onUpdateXR=="function"&&this._xr_update_scripts.push(e),!0)}markInactive(e){if(!(this._inactive_scripts.indexOf(e)>=0)){this.removeScript(e,!1),this._inactive_scripts.push(e);for(const t of this.controllers)this.invokeCallback_ControllerRemoved(e,t);this.invokeCallback_LeaveXR(e)}}handleInactiveScripts(){if(this._inactive_scripts.length>0)for(let e=this._inactive_scripts.length-1;e>=0;e--){const t=this._inactive_scripts[e];if(t.activeAndEnabled){this._inactive_scripts.splice(e,1),this.addScript(t),this.invokeCallback_EnterXR(t);for(const i of this.controllers)this.invokeCallback_ControllerAdded(t,i)}}}_script_to_remove=[];removeScript(e,t=!0){Ge&&console.log("Remove XRScript",e);const i=this._xr_scripts.indexOf(e);i>=0&&this._xr_scripts.splice(i,1);const n=this._xr_update_scripts.indexOf(e);if(n>=0&&this._xr_update_scripts.splice(n,1),t){const s=this._inactive_scripts.indexOf(e);s>=0&&this._inactive_scripts.splice(s,1)}}invokeCallback_EnterXR(e){e.onEnterXR&&e.onEnterXR({xr:this})}invokeCallback_ControllerAdded(e,t){e.onXRControllerAdded&&e.onXRControllerAdded({xr:this,controller:t,change:"added"})}invokeCallback_ControllerRemoved(e,t){e.onXRControllerRemoved&&e.onXRControllerRemoved({xr:this,controller:t,change:"removed"})}invokeCallback_LeaveXR(e){e.onLeaveXR&&!e.destroyed&&e.onLeaveXR({xr:this})}syncCameraCullingMask(){const e=this.context.xrCamera,t=this.context.mainCameraComponent?.cullingMask;if(e&&t!==void 0){for(const i of e.cameras)i.layers.mask=t;e.layers.mask=t}else if(e){for(const i of e.cameras)i.layers.enableAll();e.layers.enableAll()}}invokeControllerEvent(e,t,i){for(let n=t.length-1;n>=0;n--){const s=t[n];if(s)try{s({xr:this,controller:e,change:i})}catch(r){console.error(r)}}}_camera;_cameraRenderParent=new k().rotateY(Math.PI);_previousCameraParent;_customforward=!0;originalCameraNearPlane;requestedCameraNearPlane=null;applyCustomForward(){if(this.context.mainCamera&&this._customforward){this._camera=this.context.mainCamera,this._camera.parent!==this._cameraRenderParent&&(this._previousCameraParent=this._camera.parent,this._previousCameraParent?.add(this._cameraRenderParent)),this._cameraRenderParent.name="XR Camera Render Parent",this._cameraRenderParent.add(this._camera);{let e=.02;const t=.001;if(this.rig){const i=He(this.rig.gameObject);e*=i.x}this._camera instanceof re&&Math.abs(this._camera.near-e)>t&&(this.isAR?this.originalCameraNearPlane=this._camera.near:this._camera.near=e,Ge&&console.debug(`Setting camera near plane to ${e} (was ${this.originalCameraNearPlane}) to account for XR rendering scale`))}}}revertCustomForward(){this._camera&&this._previousCameraParent&&this._previousCameraParent.add(this._camera),this._previousCameraParent=null,this._camera instanceof re&&this.originalCameraNearPlane!=null&&(this._camera.near=this.originalCameraNearPlane,this.originalCameraNearPlane=void 0)}_viewerPose;_transformOrientation=new U;_transformPosition=new b;internalUpdateState(){const e=this.context.renderer.xr.getReferenceSpace();if(!e){this._viewerPose=void 0;return}if(this._viewerPose=this.frame.getViewerPose(e),this._viewerPose){const t=this._viewerPose.transform;this._transformPosition.set(t.position.x,t.position.y,t.position.z),this._transformOrientation.set(t.orientation.x,t.orientation.y,t.orientation.z,t.orientation.w)}}_transition;get transition(){return this._transition||(this._transition=new L_),this._transition}fadeTransition(){return this._transition||(this._transition=new L_),this._transition.fadeTransition()}updateFade(e){this._transition&&e instanceof re&&this._transition.update(e,this.context.time.deltaTime)}onUpdateFade_PostRender(){this._transition?.remove()}}const bg=x("debugwebxr");class z_{static tryFindAvatarObjects(e,t,i){if(i.head&&i.leftHand&&i.rightHand)return;const n=e.name.toLocaleLowerCase();!i.head&&n.includes("head")&&(bg&&console.log("FOUND AVATAR HEAD",e.name),i.head=new ie("",t,e)),n.includes("hand")&&(!i.leftHand&&n.includes("left")&&(bg&&console.log("FOUND AVATAR LEFT HAND",e.name),i.leftHand=new ie("",t,e)),!i.rightHand&&n.includes("right")&&(bg&&console.log("FOUND AVATAR RIGHT HAND",e.name),i.rightHand=new ie("",t,e)));for(let s=0;s<e.children.length;s++){if(i.head&&i.leftHand&&i.rightHand)return;const r=e.children[s];this.tryFindAvatarObjects(r,t,i)}}}class oe extends ne{alpha=1;get isRGBAColor(){return!0}set a(e){this.alpha=e}get a(){return this.alpha}constructor(e,t,i,n){super(),typeof e=="number"&&typeof t=="number"&&typeof i=="number"?(this.set(e,t,i),this.alpha=typeof n=="number"?n:1):e!==void 0&&(this.set(e),this.alpha=1)}clone(){const e=super.clone();return e.alpha=this.alpha,e}copy(e){return this.r=e.r,this.g=e.g,this.b=e.b,"alpha"in e&&typeof e.alpha=="number"?this.alpha=e.alpha:typeof e.a=="number"&&(this.alpha=e.a),this}lerp(e,t){const i=e;return i.alpha!=null&&(this.alpha=j.lerp(this.alpha,i.alpha,t)),super.lerp(e,t)}lerpColors(e,t,i){const n=e,s=t;return n.alpha!=null&&s.alpha!=null&&(this.alpha=j.lerp(n.alpha,s.alpha,i)),super.lerpColors(e,t,i)}multiply(e){const t=e;return t.alpha!=null&&(this.alpha=this.alpha*t.alpha),super.multiply(e)}fromArray(e,t=0){return this.alpha=e[t+3],super.fromArray(e,t)}static fromColorRepresentation(e){if(typeof e=="string"){if(e.trim()==="transparent")return new oe(0,0,0,0);if(e.startsWith("#")&&e.length===9){const t=parseInt(e.slice(1,9),16),i=t>>24&255,n=t>>16&255,s=t>>8&255,r=t>>0&255;return new oe(i/255,n/255,s/255,r/255)}else if(e.startsWith("#")){const t=parseInt(e.slice(1),16),i=t>>16&255,n=t>>8&255,s=t>>0&255;return new oe(i/255,n/255,s/255,1)}else if(e.startsWith("rgba")){const t=e.slice(5,-1).split(",").map(Number);return new oe(t[0]/255,t[1]/255,t[2]/255,t[3])}else if(e.startsWith("rgb")){const t=e.slice(4,-1).split(",").map(Number);return new oe(t[0]/255,t[1]/255,t[2]/255,1)}}else if(Array.isArray(e)){if(e.length===4)return new oe(e[0],e[1],e[2],e[3]);if(e.length===3)return new oe(e[0],e[1],e[2],1);console.error("Invalid color array length. Expected 3 or 4, got "+e.length)}return new oe(e)}}const It=new b,U_=new b,N_=new U,rk=x("debuggizmos"),vn=8947848,_g=32;class F{constructor(){}static enabled=!0;static isGizmo(e){return e[xg]!==void 0}static setVisible(e){for(const t of Xi.timedObjectsBuffer)t.visible=e}static DrawLabel(e,t,i=.05,n=0,s,r,a){if(!F.enabled)return null;s||(s=vn);const l=Y.active?.rigScale??1,c=Xi.getTextLabel(n,t,i*l,s,r);return a instanceof k&&a.add(c),c.position.x=e.x,c.position.y=e.y,c.position.z=e.z,c}static DrawRay(e,t,i=vn,n=0,s=!0){if(!F.enabled)return;const r=Xi.getLine(n),a=r.geometry.getAttribute("position");a.setXYZ(0,e.x,e.y,e.z),It.set(t.x,t.y,t.z).multiplyScalar(999999999),a.setXYZ(1,e.x+It.x,e.y+It.y,e.z+It.z),a.needsUpdate=!0,r.material.depthTest=s,r.material.depthWrite=!1,r.material.fog=!1,xn(r.material,i)}static DrawDirection(e,t,i=vn,n=0,s=!0,r=1){if(!F.enabled)return;const a=Xi.getLine(n),l=a.geometry.getAttribute("position");l.setXYZ(0,e.x,e.y,e.z),t.w!==void 0?(It.set(0,0,-r),N_.set(t.x,t.y,t.z,t.w),It.applyQuaternion(N_)):(It.set(t.x,t.y,t.z),It.multiplyScalar(r)),l.setXYZ(1,e.x+It.x,e.y+It.y,e.z+It.z),l.needsUpdate=!0,a.material.depthTest=s,a.material.depthWrite=!1,xn(a.material,i)}static DrawLine(e,t,i=vn,n=0,s=!0){if(!F.enabled)return;const r=Xi.getLine(n),a=r.geometry.getAttribute("position");a.setXYZ(0,e.x,e.y,e.z),a.setXYZ(1,t.x,t.y,t.z),a.needsUpdate=!0,r.material.depthTest=s,r.material.depthWrite=!1,r.material.fog=!1,xn(r.material,i)}static DrawCircle(e,t,i,n=vn,s=0,r=!0){if(!F.enabled)return;const a=Xi.getCircle(s);a.position.set(e.x,e.y,e.z),a.scale.set(i,i,i),a.quaternion.setFromUnitVectors(this._up,It.set(t.x,t.y,t.z).normalize()),a.material.depthTest=r,a.material.depthWrite=!1,a.material.fog=!1,xn(a.material,n)}static DrawWireSphere(e,t,i=vn,n=0,s=!0){if(!F.enabled)return;const r=Xi.getSphere(t,n,!0);dr(r,e.x,e.y,e.z),r.material.depthTest=s,r.material.depthWrite=!1,r.material.fog=!1,xn(r.material,i)}static DrawSphere(e,t,i=vn,n=0,s=!0){if(!F.enabled)return;const r=Xi.getSphere(t,n,!1);dr(r,e.x,e.y,e.z),r.material.depthTest=s,r.material.depthWrite=!1,xn(r.material,i)}static DrawWireBox(e,t,i=vn,n=0,s=!0,r=void 0){if(!F.enabled)return;const a=Xi.getBox(n);a.position.set(e.x,e.y,e.z),a.scale.set(t.x,t.y,t.z),r?a.quaternion.copy(r):a.quaternion.identity(),a.material.depthTest=s,a.material.wireframe=!0,a.material.depthWrite=!1,a.material.fog=!1,xn(a.material,i)}static DrawWireBox3(e,t=vn,i=0,n=!0){if(!F.enabled)return;const s=Xi.getBox(i);s.position.copy(e.getCenter(It)),s.scale.copy(e.getSize(It)),s.material.depthTest=n,s.material.wireframe=!0,s.material.depthWrite=!1,s.material.fog=!1,xn(s.material,t)}static _up=new b(0,1,0);static DrawArrow(e,t,i=vn,n=0,s=!0,r=!1){if(!F.enabled)return;const a=Xi.getArrowHead(n);a.position.set(t.x,t.y,t.z),a.quaternion.setFromUnitVectors(this._up.set(0,1,0),It.set(t.x,t.y,t.z).sub(U_.set(e.x,e.y,e.z)).normalize());const l=It.set(t.x,t.y,t.z).sub(U_.set(e.x,e.y,e.z)).length()*.1;a.scale.set(l,l,l),a.material.depthTest=s,a.material.wireframe=r,xn(a.material,i),this.DrawLine(e,t,i,n,s)}static DrawWireMesh(e){const t=Xi.getMesh(e.duration??0);"mesh"in e?(t.geometry=e.mesh.geometry,t.matrix.copy(e.mesh.matrixWorld)):(t.geometry=e.geometry,t.matrix.copy(e.matrix)),t.matrixAutoUpdate=!1,t.matrixWorldAutoUpdate=!1,t.material.depthTest=e.depthTest??!0,t.material.wireframe=!0,xn(t.material,e.color??vn)}}const ak=new va(1,1,1);function vg(o=null){const e=new ne(o??14540253),t=new yS(ak);return new Q0(t,new hm({color:e}))}function xn(o,e){if(Array.isArray(o)){for(const i of o)xn(i,e);return}const t=e instanceof oe?e.a:1;o.color.set(e),o.opacity=t,o.transparent=t<1}const xg=Symbol("GizmoCache");class Xi{static familyName="needle-gizmos";static ensureFont(){let e=Ce.FontLibrary.getFontFamily(this.familyName);e||(e=Ce.FontLibrary.addFontFamily(this.familyName),e.addVariant("normal","normal","https://uploads.needle.tools/include/font-msdf.json","https://uploads.needle.tools/include/font.png")?.addEventListener("ready",()=>{Ce.update()}))}static getTextLabel(e,t,i,n,s){this.ensureFont();let r=this.textLabelCache.pop(),a=1;s&&typeof s=="string"&&s?.length>=8&&s.startsWith("#")?(a=parseInt(s.substring(7),16)/255,s=s.substring(0,7),rk&&console.log(s,a)):typeof s=="object"&&s.a!==void 0&&(a=s.a);const l={boxSizing:"border-box",fontFamily:this.familyName,width:"auto",fontSize:i,color:n,lineHeight:1,backgroundColor:s??void 0,backgroundOpacity:a,textContent:t,borderRadius:.5*i,padding:.8*i,whiteSpace:"pre",offset:.05*i};if(r)r.set(l);else{r=new bb(l);const c=this,h=r;h.setText=function(d){this.set({textContent:d}),c.tmuiNeedsUpdate=!0}}return this.tmuiNeedsUpdate=!0,this.registerTimedObject(N.Current,r,e,this.textLabelCache),r}static getBox(e){let t=this.boxesCache.pop();if(!t){const i=new va(1,1,1);t=new H(i)}return this.registerTimedObject(N.Current,t,e,this.boxesCache),t}static getLine(e){let t=this.linesCache.pop();if(!t){t=new xa;let i=t.geometry.getAttribute("position");i||(i=new pt(new Float32Array(6),3),t.geometry.setAttribute("position",i))}return t.frustumCulled=!1,this.registerTimedObject(N.Current,t,e,this.linesCache),t}static getCircle(e){let t=this.circlesCache.pop();if(!t){t=new xa;let i=t.geometry.getAttribute("position");if(!i){i=new pt(new Float32Array(_g*3),3),t.geometry.setAttribute("position",i);const n=z(0,1,0),s=z(0,0,1),r=z(s);r.cross(n).normalize();const a=z(r),l=Math.PI*2/(_g-1);for(let c=0;c<_g+1;c++){const h=l*c;n.copy(a).multiplyScalar(Math.cos(h)*1),r.copy(s).multiplyScalar(Math.sin(h)*1);const d=n.add(r);i.setXYZ(c,d.x,d.y,d.z)}}}return t.frustumCulled=!1,this.registerTimedObject(N.Current,t,e,this.circlesCache),t}static getSphere(e,t,i){let n=this.spheresCache.pop();return n||(n=new H(new dd(1,8,8))),n.scale.set(e,e,e),n.material.wireframe=i,this.registerTimedObject(N.Current,n,t,this.spheresCache),n}static getArrowHead(e){let t=this.arrowHeadsCache.pop();return t||(t=new H(new q0(0,.5,1,8))),this.registerTimedObject(N.Current,t,e,this.arrowHeadsCache),t}static getMesh(e){let t=this.mesh.pop();return t||(t=new H,t.material=new we),this.registerTimedObject(N.Current,t,e,this.mesh),t}static linesCache=[];static circlesCache=[];static spheresCache=[];static boxesCache=[];static arrowHeadsCache=[];static mesh=[];static textLabelCache=[];static registerTimedObject(e,t,i,n){if(!e){console.error("No Needle Engine context available. Did you call a Gizmos function in global scope?");return}const s=this.contextBeforeRenderCallbacks.get(e),r=this.contextPostRenderCallbacks.get(e);if(s){if(e.pre_render_callbacks[e.pre_render_callbacks.length-1]!==s){const a=e.pre_render_callbacks.indexOf(s);a>=0&&e.pre_render_callbacks.splice(a,1),e.pre_render_callbacks.push(s)}}else{const a=()=>{this.onBeforeRender(e,this.timedObjectsBuffer)};this.contextBeforeRenderCallbacks.set(e,a),e.pre_render_callbacks.push(a)}if(r){if(e.post_render_callbacks[e.post_render_callbacks.length-1]!==r){const a=e.post_render_callbacks.indexOf(r);a>=0&&e.post_render_callbacks.splice(a,1),e.post_render_callbacks.push(r)}}else{const a=()=>{this.onPostRender(e,this.timedObjectsBuffer,this.timesBuffer)};this.contextPostRenderCallbacks.set(e,a),e.post_render_callbacks.push(a)}t.traverse(a=>{a.layers.disableAll(),a.layers.enable(2)}),t.renderOrder=999999,t[xg]=n,t.castShadow=!1,t.receiveShadow=!1,t.isGizmo=!0,this.timedObjectsBuffer.push(t),this.timesBuffer.push(N.Current.time.realtimeSinceStartup+i),e.scene.add(t)}static timedObjectsBuffer=new Array;static timesBuffer=new Array;static contextPostRenderCallbacks=new Map;static contextBeforeRenderCallbacks=new Map;static tmuiNeedsUpdate=!1;static onBeforeRender(e,t){this.tmuiNeedsUpdate&&(this.tmuiNeedsUpdate=!1,Ce.update());for(let i=0;i<t.length;i++){const n=t[i];if(e.mainCamera&&n instanceof Ce.MeshUIBaseElement){if(Or(n))continue;const s=e.isInVR,r=!1,a=!s;Kl(n,e.mainCamera,r,a)}}}static onPostRender(e,t,i){const n=e.time.realtimeSinceStartup;for(let s=t.length-1;s>=0;s--){const r=t[s];n>=i[s]-1e-6&&(t.splice(s,1),i.splice(s,1),r.removeFromParent(),Or(r)!=!0&&r[xg].push(r))}}}const Ht=x("debugphysics"),V_=new as;class fs{static AllLayers=4294967295;ray;cam;screenPoint;raycaster;results;targets;recursive=!0;minDistance;maxDistance;lineThreshold;layerMask;ignore;testObject;useAcceleratedRaycast;allowSlowRaycastFallback=!0;screenPointFromOffset(e,t){this.screenPoint===void 0&&(this.screenPoint=new J),this.screenPoint.x=e/window.innerWidth*2-1,this.screenPoint.y=-(t/window.innerHeight)*2+1}setLayer(e){V_.set(e),this.layerMask=V_}setMask(e){this.layerMask||(this.layerMask=new as);const t=this.layerMask;t?t.mask=e:this.layerMask=e}}class wg{distance;point;object;constructor(e,t,i){this.object=e,this.distance=t,this.point=i}}class zl{static _raycasting=0;static get raycasting(){return this._raycasting>0}raycastPhysicsFast(e,t=void 0,i=1/0,n=!0){return this.context.physics.engine?.raycast(e,t,{maxDistance:i,solid:n})??null}raycastPhysicsFastAndGetNormal(e,t=void 0,i=1/0,n=!0){return this.context.physics.engine?.raycastAndGetNormal(e,t,{maxDistance:i,solid:n})??null}sphereOverlapPhysics(e,t){return this.context.physics.engine?.sphereOverlap(e,t)??null}context;engine;constructor(e){this.context=e}raycaster=new ud;defaultRaycastOptions=new fs;targetBuffer=new Array(1);defaultThresholds={Mesh:{},Line:{threshold:-1},LOD:{},Points:{threshold:0},Sprite:{}};sphereResults=new Array;sphereMask=new as;sphere=new pd;sphereOverlap(e,t,i=!0,n=!1,s=null){if(this.sphereResults.length=0,!this.context.scene)return this.sphereResults;const r=this.sphereMask;r.enableAll(),r.disable(2);for(const a of this.context.scene.children)this.intersectSphere(a,e,t,r,this.sphereResults,i,n,s);return this.sphereResults.sort((a,l)=>a.distance-l.distance)}raycastFromRay(e,t=null){const i=t??this.defaultRaycastOptions;i.ray=e;const n=this.raycast(i);return i===this.defaultRaycastOptions&&(i.ray=void 0),n}raycast(e=null){Ht&&performance.mark("raycast.start"),e||(e=this.defaultRaycastOptions);const t=e.screenPoint??this.context.input.mousePositionRC,i=e.raycaster??this.raycaster;if(i.near=e.minDistance??0,i.far=e.maxDistance??1/0,i.params=this.defaultThresholds,e.lineThreshold===void 0&&(e.lineThreshold=-1),i.params.Line={threshold:e.lineThreshold},e.ray)i.ray.copy(e.ray);else{const a=e.cam??this.context.mainCamera;if(!a)return Ht&&console.error("Can not perform raycast - no main camera found"),this.defaultRaycastOptions.results&&(this.defaultRaycastOptions.results.length=0),this.defaultRaycastOptions.results??[];const l=this.context.xrCamera;this.context.isInXR&&l instanceof bS&&l.cameras.length>0?i.setFromCamera(t,l.cameras[0]):i.setFromCamera(t,a)}let n=e.targets;n||(n=this.targetBuffer,n.length=1,n[0]=this.context.scene);let s=e.results;this.defaultRaycastOptions.results&&(this.defaultRaycastOptions.results.length=0),s||(this.defaultRaycastOptions.results||(this.defaultRaycastOptions.results=new Array),s=this.defaultRaycastOptions.results),e.layerMask!==void 0?e.layerMask instanceof as?i.layers.mask=e.layerMask.mask:i.layers.mask=e.layerMask:(i.layers.enableAll(),i.layers.disable(2)),Ht&&console.time("raycast"),s.length=0,zl._raycasting++,this.intersect(this.raycaster,n,s,e),s.sort((a,l)=>a.distance-l.distance);const r=e.ignore;return r!==void 0&&r.length>0&&(s=s.filter(a=>!r.includes(a.object))),zl._raycasting--,Ht&&(console.timeEnd("raycast"),console.warn("#"+this.context.time.frame+", hits:",s?.length?[...s]:"nothing"),performance.mark("raycast.end"),performance.measure("raycast","raycast.start","raycast.end")),s}intersect(e,t,i,n){for(const s of t){if(!s||s.visible===!1||F.isGizmo(s)||n.lineThreshold!==void 0&&n.lineThreshold<0&&s instanceof xa)continue;let r=!0;const a=s,l=a.geometry;if(n.testObject){const c=n.testObject?.(s);if(c===!1)continue;c==="continue in children"&&(r=!1)}if(r&&(l&&W_(l)||(r=!1)),r){const c=rb(s);c&&(a.geometry=c);const h=i.length;let d=!0;if(n.precise===!1&&(d=!1),d||=l.getAttribute("position")?.array?.length<64,a instanceof Ca&&(d=!1),!d&&ck(a,e,i)||(n.useAcceleratedRaycast!==!1?$d.runMeshBVHRaycast(e,a,i,this.context,n):e.intersectObject(a,!1,i)),Ht&&i.length!=h){const p=i[i.length-1],m=c?8969557:7798784;F.DrawWireSphere(p.point,.1,m,1,!1),F.DrawWireMesh({mesh:s,depthTest:!1,duration:.2,color:m})}a.geometry=l}n.recursive!==!1&&this.intersect(e,s.children,i,n)}return i}tempBoundingBox=new bi;intersectSphere(e,t,i,n,s,r,a,l){let c=e&&e.isMesh&&e.layers.test(n)&&!F.isGizmo(e);c&&=e.visible,c&&=!(e instanceof xa),c&&=!(e instanceof Ca);const h=e,d=h.geometry;if(c&&l){const p=l(e);if(p===!1)return;p==="continue in children"&&(c=!1)}if(d&&W_(d)||(c=!1),c){if(a){const p=this.sphere;p.center.copy(t),p.radius=i;const m=s.length;if($d.runMeshBVHRaycast(this.sphere,h,s,this.context,{}),m!=s.length&&!r)return}else if(d.boundingBox||d.computeBoundingBox(),d.boundingBox){h.matrixWorldNeedsUpdate&&h.updateWorldMatrix(!1,!1);const p=this.tempBoundingBox.copy(d.boundingBox).applyMatrix4(h.matrixWorld),m=this.sphere;if(m.center.copy(t),m.radius=i,m.intersectsBox(p)){const f=K(e),g=f.distanceTo(m.center),y=new wg(e,g,f);if(s.push(y),!r)return}}}if(e.children)for(const p of e.children){const m=s.length;if(this.intersectSphere(p,t,i,n,s,r,a,l),m!=s.length&&!r)return}}}function W_(o){return!(o.index&&o.index.array.length<3)}const vr=new pd,Wd=new ar,lk=new G0;function ck(o,e,t){const i=o._computeIntersections;if(!i)return!1;let n=o["_computeIntersections:Needle"];return n||(n=o["_computeIntersections:Needle"]=function(s,r,a){const l=this,c=l.geometry.boundingSphere;if(c){if(l instanceof Ca){Wd.setFromNormalAndCoplanarPoint(z(0,1,0),z(0,-l.position.y,0)),Wd.applyMatrix4(l.matrixWorld,lk);const d=s.ray.intersectPlane(Wd,z());if(d){vr.copy(c),vr.applyMatrix4(l.matrixWorld);const p=z(d).sub(s.ray.origin).length(),m=vr.radius*.5;p<m&&r.push({distance:p,point:d,object:l,normal:Wd.normal.clone()})}return}vr.copy(c),vr.applyMatrix4(l.matrixWorld);const h=s.ray.intersectSphere(vr,z());if(h){const d=z(h).sub(s.ray.origin),p=d.length();if(p>vr.radius){const m=d.clone().normalize();r.push({distance:p,point:h,object:l,normal:m})}}}}),o._computeIntersections=n,e.intersectObject(o,!1,t),o._computeIntersections=i,!0}var $d;(o=>{function e(_,v,P,M,O){if(!v.geometry||!v.geometry.hasAttribute("position"))return!1;const E=v.geometry;if(v?.isSkinnedMesh){const L=v,$=L.bvhNeedsUpdate;if(!L.staticGenerator)a(),s&&(L.staticGenerator=new s(v),L.staticGenerator.applyWorldTransforms=!1,L.staticGeometry=L.staticGenerator.generate(),E.boundsTree=r?.call(L.staticGeometry),L.staticGeometryLastUpdate=performance.now()+Math.random()*200,L.bvhNeedsUpdate=!0);else if(E.boundsTree&&(L.autoUpdateMeshBvhInterval!==void 0&&L.autoUpdateMeshBvhInterval>=0||$===!0)){const D=performance.now(),q=D-L.staticGeometryLastUpdate,Z=L.autoUpdateMeshBvhInterval??100;($||q>Z)&&(Ht&&console.warn(`Physics: updating skinned mesh bvh for ${v.name} after ${q.toFixed(2)}ms`),L.bvhNeedsUpdate=!1,L.staticGeometryLastUpdate=D,L.staticGenerator?.generate(L.staticGeometry),E.boundsTree.refit())}}else if(!E.boundsTree){c||y();let L=!0;if((M.xr||E[m]===!1||E.getAttribute("position")?.isInterleavedBufferAttribute||E.index&&E.index?.isInterleavedBufferAttribute)&&(L=!1),L&&d){if(E[p]===void 0){let $=null;if(g.length>0){const D=g.shift();D&&!D.running&&($=D)}if(!$&&f.length<3&&($=new d,f.push($)),$!=null&&!$.running){const D=v.name;Ht&&console.log("<<<< worker start",D,$),E[p]="queued",performance.mark("bvh.create.start");const q=E.clone();try{$.generate(q).then(Z=>{E[p]="done",E.boundsTree=Z}).catch(Z=>{E[p]="failed - "+Z?.message,E[m]=!1,Ht&&console.error("Failed to generate mesh bvh on worker",Z)}).finally(()=>{Ht&&console.log(">>>>> worker done",D,{hasBoundsTre:E.boundsTree!=null}),g.push($),q.dispose(),performance.mark("bvh.create.end"),performance.measure("bvh.create (worker)","bvh.create.start","bvh.create.end")})}catch(Z){console.error("Failed to generate mesh bvh on worker",Z)}}else Ht&&console.warn("No worker available")}}else(!h||!L)&&(a(),n&&(performance.mark("bvh.create.start"),E.boundsTree=new n(E),performance.mark("bvh.create.end"),performance.measure("bvh.create","bvh.create.start","bvh.create.end")))}if(_ instanceof ud){const L=_,$=v.raycast;if(E.boundsTree)a(),i&&(v.acceleratedRaycast||(v.acceleratedRaycast=i.bind(v),Ht&&console.debug(`Physics: bind acceleratedRaycast fn to "${v.name}"`)),v.raycast=v.acceleratedRaycast);else if(Ht&&console.warn("No bounds tree found for mesh",v.name,{workerTask:E[p],hasAcceleratedRaycast:i!=null}),O.allowSlowRaycastFallback===!1&&(E.getAttribute("position")?.array?.length??0)>2e3)return Ht&&console.warn("Skipping raycast because no bounds tree is available and allowSlowRaycastFallback is false"),!1;const D=L.firstHitOnly;return L.firstHitOnly=!1,L.intersectObject(v,!1,P),L.firstHitOnly=D,v.raycast=$,!0}else if(_ instanceof pd){const L=E.boundsTree;if(L){const $=_;if(l.copy(v.matrixWorld).invert(),$.applyMatrix4(l),L.intersectsSphere($)){const D=K(v),q=D.distanceTo($.center),Z=new wg(v,q,D);P.push(Z)}}return!0}return!1}o.runMeshBVHRaycast=e;let t=!1,i=null,n=null,s=null,r=null;function a(){t||(t=!0,import("./vendor-JyrX4DVM.min.js").then(_=>_.index$1).then(_=>{i=_.acceleratedRaycast,n=_.MeshBVH,s=_.StaticGeometryGenerator,r=_.computeBoundsTree}).catch(_=>{(Ht||A())&&console.error("Failed to load BVH library...",_.message)}))}const l=new ee;let c=!1,h=!1,d=null;const p=Symbol("Needle:MeshBVH-Worker"),m=Symbol("Needle:MeshBVH-CanUseWorker"),f=[],g=[];function y(){c=!0,h=!0,Promise.resolve().then(()=>eL).then(_=>{d=_.GenerateMeshBVHWorker}).catch(_=>{(Ht||A())&&console.warn("Failed to setup mesh bvh worker")}).finally(()=>{h=!1})}})($d||($d={}));const $_=Symbol("gltf-loader-internal-usage-tracker"),hk=x("debugusers");class Ul{get name(){return"NEEDLE_internal_usage_tracker"}static isLoading(e){return Ul._loadingProcesses>0}static _loadingProcesses=0;parser;_getDependency;_loadingId;_loadedObjects=new Set;constructor(e){this.parser=e,this._getDependency=this.parser.getDependency,this._loadingId=Date.now().toString()}beforeRoot(){Ul._loadingProcesses++;const e=this,t=this._getDependency;return this.parser.getDependency=function(i,n){const s=t.call(this,i,n);return s.then(r=>(r&&(e._loadedObjects.add(r),r[$_]=e._loadingId),r)),s},null}afterRoot(e){Ul._loadingProcesses--,this.parser.getDependency=this._getDependency;for(const t of this._loadedObjects)delete t[$_],t instanceof k&&(t.parent||t instanceof H&&setTimeout(()=>{hk&&console.warn("> GLTF LOADER: Mesh not used in scene!",t),t.material=null,t.geometry=null},1e3));return null}}class H_{constructor(){window.addEventListener("unhandledrejection",e=>{if(e.defaultPrevented)return;const t=e?.reason?.path;if(t){const i=t[0];i&&i.tagName==="IMG"&&(console.warn(`Could not load image:
|
|
167
|
+
${s.hand?"hand":"ctrl"} ${s.inputSource.handedness}[${s.index}] con:${s.connected} tr:${s.isTracking} hts:${s.hasHitTestSource?"yes":"no"}`;fg=0,F.DrawLabel(e,n,void 0,1/60*20)}}onBeforeRender=()=>{this.context.mainCamera&&(this.updateFade(this.context.mainCamera),this.requestedCameraNearPlane!==null&&this.context.mainCamera instanceof re&&(this.context.mainCamera.near=this.requestedCameraNearPlane,this.requestedCameraNearPlane=null))};onAfterRender=()=>{if(this.onUpdateFade_PostRender(),G.isDesktop()||!this._renderOnceOnDevice){const e=this.context.renderer;if(e.xr.isPresenting&&this.context.mainCamera){this._renderOnceOnDevice=!0;const t=e.xr.enabled,i=e.getRenderTarget(),n=this.context.scene.background;e.xr.enabled=!1,e.setRenderTarget(null),this.isPassThrough&&(this.context.scene.background=null),this.context.composer?this.context.composer.render(this.context.time.deltaTime):e.render(this.context.scene,this.context.mainCamera),e.xr.enabled=t,e.setRenderTarget(i),this.context.scene.background=n}}};addScript(e){return this._xr_scripts.includes(e)?!1:(Ge&&console.log("Register new XRScript",e),this._xr_scripts.push(e),typeof e.onUpdateXR=="function"&&this._xr_update_scripts.push(e),!0)}markInactive(e){if(!(this._inactive_scripts.indexOf(e)>=0)){this.removeScript(e,!1),this._inactive_scripts.push(e);for(const t of this.controllers)this.invokeCallback_ControllerRemoved(e,t);this.invokeCallback_LeaveXR(e)}}handleInactiveScripts(){if(this._inactive_scripts.length>0)for(let e=this._inactive_scripts.length-1;e>=0;e--){const t=this._inactive_scripts[e];if(t.activeAndEnabled){this._inactive_scripts.splice(e,1),this.addScript(t),this.invokeCallback_EnterXR(t);for(const i of this.controllers)this.invokeCallback_ControllerAdded(t,i)}}}_script_to_remove=[];removeScript(e,t=!0){Ge&&console.log("Remove XRScript",e);const i=this._xr_scripts.indexOf(e);i>=0&&this._xr_scripts.splice(i,1);const n=this._xr_update_scripts.indexOf(e);if(n>=0&&this._xr_update_scripts.splice(n,1),t){const s=this._inactive_scripts.indexOf(e);s>=0&&this._inactive_scripts.splice(s,1)}}invokeCallback_EnterXR(e){e.onEnterXR&&e.onEnterXR({xr:this})}invokeCallback_ControllerAdded(e,t){e.onXRControllerAdded&&e.onXRControllerAdded({xr:this,controller:t,change:"added"})}invokeCallback_ControllerRemoved(e,t){e.onXRControllerRemoved&&e.onXRControllerRemoved({xr:this,controller:t,change:"removed"})}invokeCallback_LeaveXR(e){e.onLeaveXR&&!e.destroyed&&e.onLeaveXR({xr:this})}syncCameraCullingMask(){const e=this.context.xrCamera,t=this.context.mainCameraComponent?.cullingMask;if(e&&t!==void 0){for(const i of e.cameras)i.layers.mask=t;e.layers.mask=t}else if(e){for(const i of e.cameras)i.layers.enableAll();e.layers.enableAll()}}invokeControllerEvent(e,t,i){for(let n=t.length-1;n>=0;n--){const s=t[n];if(s)try{s({xr:this,controller:e,change:i})}catch(r){console.error(r)}}}_camera;_cameraRenderParent=new k().rotateY(Math.PI);_previousCameraParent;_customforward=!0;originalCameraNearPlane;requestedCameraNearPlane=null;applyCustomForward(){if(this.context.mainCamera&&this._customforward){this._camera=this.context.mainCamera,this._camera.parent!==this._cameraRenderParent&&(this._previousCameraParent=this._camera.parent,this._previousCameraParent?.add(this._cameraRenderParent)),this._cameraRenderParent.name="XR Camera Render Parent",this._cameraRenderParent.add(this._camera);{let e=.02;const t=.001;if(this.rig){const i=He(this.rig.gameObject);e*=i.x}this._camera instanceof re&&Math.abs(this._camera.near-e)>t&&(this.isAR?this.originalCameraNearPlane=this._camera.near:this._camera.near=e,Ge&&console.debug(`Setting camera near plane to ${e} (was ${this.originalCameraNearPlane}) to account for XR rendering scale`))}}}revertCustomForward(){this._camera&&this._previousCameraParent&&this._previousCameraParent.add(this._camera),this._previousCameraParent=null,this._camera instanceof re&&this.originalCameraNearPlane!=null&&(this._camera.near=this.originalCameraNearPlane,this.originalCameraNearPlane=void 0)}_viewerPose;_transformOrientation=new U;_transformPosition=new b;internalUpdateState(){const e=this.context.renderer.xr.getReferenceSpace();if(!e){this._viewerPose=void 0;return}if(this._viewerPose=this.frame.getViewerPose(e),this._viewerPose){const t=this._viewerPose.transform;this._transformPosition.set(t.position.x,t.position.y,t.position.z),this._transformOrientation.set(t.orientation.x,t.orientation.y,t.orientation.z,t.orientation.w)}}_transition;get transition(){return this._transition||(this._transition=new L_),this._transition}fadeTransition(){return this._transition||(this._transition=new L_),this._transition.fadeTransition()}updateFade(e){this._transition&&e instanceof re&&this._transition.update(e,this.context.time.deltaTime)}onUpdateFade_PostRender(){this._transition?.remove()}}const bg=x("debugwebxr");class z_{static tryFindAvatarObjects(e,t,i){if(i.head&&i.leftHand&&i.rightHand)return;const n=e.name.toLocaleLowerCase();!i.head&&n.includes("head")&&(bg&&console.log("FOUND AVATAR HEAD",e.name),i.head=new ie("",t,e)),n.includes("hand")&&(!i.leftHand&&n.includes("left")&&(bg&&console.log("FOUND AVATAR LEFT HAND",e.name),i.leftHand=new ie("",t,e)),!i.rightHand&&n.includes("right")&&(bg&&console.log("FOUND AVATAR RIGHT HAND",e.name),i.rightHand=new ie("",t,e)));for(let s=0;s<e.children.length;s++){if(i.head&&i.leftHand&&i.rightHand)return;const r=e.children[s];this.tryFindAvatarObjects(r,t,i)}}}class oe extends ne{alpha=1;get isRGBAColor(){return!0}set a(e){this.alpha=e}get a(){return this.alpha}constructor(e,t,i,n){super(),typeof e=="number"&&typeof t=="number"&&typeof i=="number"?(this.set(e,t,i),this.alpha=typeof n=="number"?n:1):e!==void 0&&(this.set(e),this.alpha=1)}clone(){const e=super.clone();return e.alpha=this.alpha,e}copy(e){return this.r=e.r,this.g=e.g,this.b=e.b,"alpha"in e&&typeof e.alpha=="number"?this.alpha=e.alpha:typeof e.a=="number"&&(this.alpha=e.a),this}lerp(e,t){const i=e;return i.alpha!=null&&(this.alpha=j.lerp(this.alpha,i.alpha,t)),super.lerp(e,t)}lerpColors(e,t,i){const n=e,s=t;return n.alpha!=null&&s.alpha!=null&&(this.alpha=j.lerp(n.alpha,s.alpha,i)),super.lerpColors(e,t,i)}multiply(e){const t=e;return t.alpha!=null&&(this.alpha=this.alpha*t.alpha),super.multiply(e)}fromArray(e,t=0){return this.alpha=e[t+3],super.fromArray(e,t)}static fromColorRepresentation(e){if(typeof e=="string"){if(e.trim()==="transparent")return new oe(0,0,0,0);if(e.startsWith("#")&&e.length===9){const t=parseInt(e.slice(1,9),16),i=t>>24&255,n=t>>16&255,s=t>>8&255,r=t>>0&255;return new oe(i/255,n/255,s/255,r/255)}else if(e.startsWith("#")){const t=parseInt(e.slice(1),16),i=t>>16&255,n=t>>8&255,s=t>>0&255;return new oe(i/255,n/255,s/255,1)}else if(e.startsWith("rgba")){const t=e.slice(5,-1).split(",").map(Number);return new oe(t[0]/255,t[1]/255,t[2]/255,t[3])}else if(e.startsWith("rgb")){const t=e.slice(4,-1).split(",").map(Number);return new oe(t[0]/255,t[1]/255,t[2]/255,1)}}else if(Array.isArray(e)){if(e.length===4)return new oe(e[0],e[1],e[2],e[3]);if(e.length===3)return new oe(e[0],e[1],e[2],1);console.error("Invalid color array length. Expected 3 or 4, got "+e.length)}return new oe(e)}}const It=new b,U_=new b,N_=new U,rk=x("debuggizmos"),vn=8947848,_g=32;class F{constructor(){}static enabled=!0;static isGizmo(e){return e[xg]!==void 0}static setVisible(e){for(const t of Xi.timedObjectsBuffer)t.visible=e}static DrawLabel(e,t,i=.05,n=0,s,r,a){if(!F.enabled)return null;s||(s=vn);const l=Y.active?.rigScale??1,c=Xi.getTextLabel(n,t,i*l,s,r);return a instanceof k&&a.add(c),c.position.x=e.x,c.position.y=e.y,c.position.z=e.z,c}static DrawRay(e,t,i=vn,n=0,s=!0){if(!F.enabled)return;const r=Xi.getLine(n),a=r.geometry.getAttribute("position");a.setXYZ(0,e.x,e.y,e.z),It.set(t.x,t.y,t.z).multiplyScalar(999999999),a.setXYZ(1,e.x+It.x,e.y+It.y,e.z+It.z),a.needsUpdate=!0,r.material.depthTest=s,r.material.depthWrite=!1,r.material.fog=!1,xn(r.material,i)}static DrawDirection(e,t,i=vn,n=0,s=!0,r=1){if(!F.enabled)return;const a=Xi.getLine(n),l=a.geometry.getAttribute("position");l.setXYZ(0,e.x,e.y,e.z),t.w!==void 0?(It.set(0,0,-r),N_.set(t.x,t.y,t.z,t.w),It.applyQuaternion(N_)):(It.set(t.x,t.y,t.z),It.multiplyScalar(r)),l.setXYZ(1,e.x+It.x,e.y+It.y,e.z+It.z),l.needsUpdate=!0,a.material.depthTest=s,a.material.depthWrite=!1,xn(a.material,i)}static DrawLine(e,t,i=vn,n=0,s=!0){if(!F.enabled)return;const r=Xi.getLine(n),a=r.geometry.getAttribute("position");a.setXYZ(0,e.x,e.y,e.z),a.setXYZ(1,t.x,t.y,t.z),a.needsUpdate=!0,r.material.depthTest=s,r.material.depthWrite=!1,r.material.fog=!1,xn(r.material,i)}static DrawCircle(e,t,i,n=vn,s=0,r=!0){if(!F.enabled)return;const a=Xi.getCircle(s);a.position.set(e.x,e.y,e.z),a.scale.set(i,i,i),a.quaternion.setFromUnitVectors(this._up,It.set(t.x,t.y,t.z).normalize()),a.material.depthTest=r,a.material.depthWrite=!1,a.material.fog=!1,xn(a.material,n)}static DrawWireSphere(e,t,i=vn,n=0,s=!0){if(!F.enabled)return;const r=Xi.getSphere(t,n,!0);dr(r,e.x,e.y,e.z),r.material.depthTest=s,r.material.depthWrite=!1,r.material.fog=!1,xn(r.material,i)}static DrawSphere(e,t,i=vn,n=0,s=!0){if(!F.enabled)return;const r=Xi.getSphere(t,n,!1);dr(r,e.x,e.y,e.z),r.material.depthTest=s,r.material.depthWrite=!1,xn(r.material,i)}static DrawWireBox(e,t,i=vn,n=0,s=!0,r=void 0){if(!F.enabled)return;const a=Xi.getBox(n);a.position.set(e.x,e.y,e.z),a.scale.set(t.x,t.y,t.z),r?a.quaternion.copy(r):a.quaternion.identity(),a.material.depthTest=s,a.material.wireframe=!0,a.material.depthWrite=!1,a.material.fog=!1,xn(a.material,i)}static DrawWireBox3(e,t=vn,i=0,n=!0){if(!F.enabled)return;const s=Xi.getBox(i);s.position.copy(e.getCenter(It)),s.scale.copy(e.getSize(It)),s.material.depthTest=n,s.material.wireframe=!0,s.material.depthWrite=!1,s.material.fog=!1,xn(s.material,t)}static _up=new b(0,1,0);static DrawArrow(e,t,i=vn,n=0,s=!0,r=!1){if(!F.enabled)return;const a=Xi.getArrowHead(n);a.position.set(t.x,t.y,t.z),a.quaternion.setFromUnitVectors(this._up.set(0,1,0),It.set(t.x,t.y,t.z).sub(U_.set(e.x,e.y,e.z)).normalize());const l=It.set(t.x,t.y,t.z).sub(U_.set(e.x,e.y,e.z)).length()*.1;a.scale.set(l,l,l),a.material.depthTest=s,a.material.wireframe=r,xn(a.material,i),this.DrawLine(e,t,i,n,s)}static DrawWireMesh(e){const t=Xi.getMesh(e.duration??0);"mesh"in e?(t.geometry=e.mesh.geometry,t.matrix.copy(e.mesh.matrixWorld)):(t.geometry=e.geometry,t.matrix.copy(e.matrix)),t.matrixAutoUpdate=!1,t.matrixWorldAutoUpdate=!1,t.material.depthTest=e.depthTest??!0,t.material.wireframe=!0,xn(t.material,e.color??vn)}}const ak=new va(1,1,1);function vg(o=null){const e=new ne(o??14540253),t=new yS(ak);return new Q0(t,new hm({color:e}))}function xn(o,e){if(Array.isArray(o)){for(const i of o)xn(i,e);return}const t=e instanceof oe?e.a:1;o.color.set(e),o.opacity=t,o.transparent=t<1}const xg=Symbol("GizmoCache");class Xi{static familyName="needle-gizmos";static ensureFont(){let e=Ce.FontLibrary.getFontFamily(this.familyName);e||(e=Ce.FontLibrary.addFontFamily(this.familyName),e.addVariant("normal","normal","https://uploads.needle.tools/include/font-msdf.json","https://uploads.needle.tools/include/font.png")?.addEventListener("ready",()=>{Ce.update()}))}static getTextLabel(e,t,i,n,s){this.ensureFont();let r=this.textLabelCache.pop(),a=1;s&&typeof s=="string"&&s?.length>=8&&s.startsWith("#")?(a=parseInt(s.substring(7),16)/255,s=s.substring(0,7),rk&&console.log(s,a)):typeof s=="object"&&s.a!==void 0&&(a=s.a);const l={boxSizing:"border-box",fontFamily:this.familyName,width:"auto",fontSize:i,color:n,lineHeight:1,backgroundColor:s??void 0,backgroundOpacity:a,textContent:t,borderRadius:.5*i,padding:.8*i,whiteSpace:"pre",offset:.05*i};if(r)r.set(l);else{r=new bb(l);const c=this,h=r;h.setText=function(d){this.set({textContent:d}),c.tmuiNeedsUpdate=!0}}return this.tmuiNeedsUpdate=!0,this.registerTimedObject(N.Current,r,e,this.textLabelCache),r}static getBox(e){let t=this.boxesCache.pop();if(!t){const i=new va(1,1,1);t=new H(i)}return this.registerTimedObject(N.Current,t,e,this.boxesCache),t}static getLine(e){let t=this.linesCache.pop();if(!t){t=new xa;let i=t.geometry.getAttribute("position");i||(i=new pt(new Float32Array(6),3),t.geometry.setAttribute("position",i))}return t.frustumCulled=!1,this.registerTimedObject(N.Current,t,e,this.linesCache),t}static getCircle(e){let t=this.circlesCache.pop();if(!t){t=new xa;let i=t.geometry.getAttribute("position");if(!i){i=new pt(new Float32Array(_g*3),3),t.geometry.setAttribute("position",i);const n=z(0,1,0),s=z(0,0,1),r=z(s);r.cross(n).normalize();const a=z(r),l=Math.PI*2/(_g-1);for(let c=0;c<_g+1;c++){const h=l*c;n.copy(a).multiplyScalar(Math.cos(h)*1),r.copy(s).multiplyScalar(Math.sin(h)*1);const d=n.add(r);i.setXYZ(c,d.x,d.y,d.z)}}}return t.frustumCulled=!1,this.registerTimedObject(N.Current,t,e,this.circlesCache),t}static getSphere(e,t,i){let n=this.spheresCache.pop();return n||(n=new H(new dd(1,8,8))),n.scale.set(e,e,e),n.material.wireframe=i,this.registerTimedObject(N.Current,n,t,this.spheresCache),n}static getArrowHead(e){let t=this.arrowHeadsCache.pop();return t||(t=new H(new q0(0,.5,1,8))),this.registerTimedObject(N.Current,t,e,this.arrowHeadsCache),t}static getMesh(e){let t=this.mesh.pop();return t||(t=new H,t.material=new we),this.registerTimedObject(N.Current,t,e,this.mesh),t}static linesCache=[];static circlesCache=[];static spheresCache=[];static boxesCache=[];static arrowHeadsCache=[];static mesh=[];static textLabelCache=[];static registerTimedObject(e,t,i,n){if(!e){console.error("No Needle Engine context available. Did you call a Gizmos function in global scope?");return}const s=this.contextBeforeRenderCallbacks.get(e),r=this.contextPostRenderCallbacks.get(e);if(s){if(e.pre_render_callbacks[e.pre_render_callbacks.length-1]!==s){const a=e.pre_render_callbacks.indexOf(s);a>=0&&e.pre_render_callbacks.splice(a,1),e.pre_render_callbacks.push(s)}}else{const a=()=>{this.onBeforeRender(e,this.timedObjectsBuffer)};this.contextBeforeRenderCallbacks.set(e,a),e.pre_render_callbacks.push(a)}if(r){if(e.post_render_callbacks[e.post_render_callbacks.length-1]!==r){const a=e.post_render_callbacks.indexOf(r);a>=0&&e.post_render_callbacks.splice(a,1),e.post_render_callbacks.push(r)}}else{const a=()=>{this.onPostRender(e,this.timedObjectsBuffer,this.timesBuffer)};this.contextPostRenderCallbacks.set(e,a),e.post_render_callbacks.push(a)}t.traverse(a=>{a.layers.disableAll(),a.layers.enable(2)}),t.renderOrder=999999,t[xg]=n,t.castShadow=!1,t.receiveShadow=!1,t.isGizmo=!0,this.timedObjectsBuffer.push(t),this.timesBuffer.push(N.Current.time.realtimeSinceStartup+i),e.scene.add(t)}static timedObjectsBuffer=new Array;static timesBuffer=new Array;static contextPostRenderCallbacks=new Map;static contextBeforeRenderCallbacks=new Map;static tmuiNeedsUpdate=!1;static onBeforeRender(e,t){this.tmuiNeedsUpdate&&(this.tmuiNeedsUpdate=!1,Ce.update());for(let i=0;i<t.length;i++){const n=t[i];if(e.mainCamera&&n instanceof Ce.MeshUIBaseElement){if(Or(n))continue;const s=e.isInVR,r=!1,a=!s;Kl(n,e.mainCamera,r,a)}}}static onPostRender(e,t,i){const n=e.time.realtimeSinceStartup;for(let s=t.length-1;s>=0;s--){const r=t[s];n>=i[s]-1e-6&&(t.splice(s,1),i.splice(s,1),r.removeFromParent(),Or(r)!=!0&&r[xg].push(r))}}}const Ht=x("debugphysics"),V_=new as;class fs{static AllLayers=4294967295;ray;cam;screenPoint;raycaster;results;targets;recursive=!0;minDistance;maxDistance;lineThreshold;layerMask;ignore;testObject;useAcceleratedRaycast;allowSlowRaycastFallback=!0;screenPointFromOffset(e,t){this.screenPoint===void 0&&(this.screenPoint=new J),this.screenPoint.x=e/window.innerWidth*2-1,this.screenPoint.y=-(t/window.innerHeight)*2+1}setLayer(e){V_.set(e),this.layerMask=V_}setMask(e){this.layerMask||(this.layerMask=new as);const t=this.layerMask;t?t.mask=e:this.layerMask=e}}class wg{distance;point;object;constructor(e,t,i){this.object=e,this.distance=t,this.point=i}}class zl{static _raycasting=0;static get raycasting(){return this._raycasting>0}raycastPhysicsFast(e,t=void 0,i=1/0,n=!0){return this.context.physics.engine?.raycast(e,t,{maxDistance:i,solid:n})??null}raycastPhysicsFastAndGetNormal(e,t=void 0,i=1/0,n=!0){return this.context.physics.engine?.raycastAndGetNormal(e,t,{maxDistance:i,solid:n})??null}sphereOverlapPhysics(e,t){return this.context.physics.engine?.sphereOverlap(e,t)??null}context;engine;constructor(e){this.context=e}raycaster=new ud;defaultRaycastOptions=new fs;targetBuffer=new Array(1);defaultThresholds={Mesh:{},Line:{threshold:-1},LOD:{},Points:{threshold:0},Sprite:{}};sphereResults=new Array;sphereMask=new as;sphere=new pd;sphereOverlap(e,t,i=!0,n=!1,s=null){if(this.sphereResults.length=0,!this.context.scene)return this.sphereResults;const r=this.sphereMask;r.enableAll(),r.disable(2);for(const a of this.context.scene.children)this.intersectSphere(a,e,t,r,this.sphereResults,i,n,s);return this.sphereResults.sort((a,l)=>a.distance-l.distance)}raycastFromRay(e,t=null){const i=t??this.defaultRaycastOptions;i.ray=e;const n=this.raycast(i);return i===this.defaultRaycastOptions&&(i.ray=void 0),n}raycast(e=null){Ht&&performance.mark("raycast.start"),e||(e=this.defaultRaycastOptions);const t=e.screenPoint??this.context.input.mousePositionRC,i=e.raycaster??this.raycaster;if(i.near=e.minDistance??0,i.far=e.maxDistance??1/0,i.params=this.defaultThresholds,e.lineThreshold===void 0&&(e.lineThreshold=-1),i.params.Line={threshold:e.lineThreshold},e.ray)i.ray.copy(e.ray);else{const a=e.cam??this.context.mainCamera;if(!a)return Ht&&console.error("Can not perform raycast - no main camera found"),this.defaultRaycastOptions.results&&(this.defaultRaycastOptions.results.length=0),this.defaultRaycastOptions.results??[];const l=this.context.xrCamera;this.context.isInXR&&l instanceof bS&&l.cameras.length>0?i.setFromCamera(t,l.cameras[0]):i.setFromCamera(t,a)}let n=e.targets;n||(n=this.targetBuffer,n.length=1,n[0]=this.context.scene);let s=e.results;this.defaultRaycastOptions.results&&(this.defaultRaycastOptions.results.length=0),s||(this.defaultRaycastOptions.results||(this.defaultRaycastOptions.results=new Array),s=this.defaultRaycastOptions.results),e.layerMask!==void 0?e.layerMask instanceof as?i.layers.mask=e.layerMask.mask:i.layers.mask=e.layerMask:(i.layers.enableAll(),i.layers.disable(2)),Ht&&console.time("raycast"),s.length=0,zl._raycasting++,this.intersect(this.raycaster,n,s,e),s.sort((a,l)=>a.distance-l.distance);const r=e.ignore;return r!==void 0&&r.length>0&&(s=s.filter(a=>!r.includes(a.object))),zl._raycasting--,Ht&&(console.timeEnd("raycast"),console.warn("#"+this.context.time.frame+", hits:",s?.length?[...s]:"nothing"),performance.mark("raycast.end"),performance.measure("raycast","raycast.start","raycast.end")),s}intersect(e,t,i,n){for(const s of t){if(!s||s.visible===!1||F.isGizmo(s)||n.lineThreshold!==void 0&&n.lineThreshold<0&&s instanceof xa)continue;let r=!0;const a=s,l=a.geometry;if(n.testObject){const c=n.testObject?.(s);if(c===!1)continue;c==="continue in children"&&(r=!1)}if(r&&(l&&W_(l)||(r=!1)),r){const c=rb(s);c&&(a.geometry=c);const h=i.length;let d=!0;if(n.precise===!1&&(d=!1),d||=l.getAttribute("position")?.array?.length<64,a instanceof Ca&&(d=!1),!d&&ck(a,e,i)||(n.useAcceleratedRaycast!==!1?$d.runMeshBVHRaycast(e,a,i,this.context,n):e.intersectObject(a,!1,i)),Ht&&i.length!=h){const p=i[i.length-1],m=c?8969557:7798784;F.DrawWireSphere(p.point,.1,m,1,!1),F.DrawWireMesh({mesh:s,depthTest:!1,duration:.2,color:m})}a.geometry=l}n.recursive!==!1&&this.intersect(e,s.children,i,n)}return i}tempBoundingBox=new bi;intersectSphere(e,t,i,n,s,r,a,l){let c=e&&e.isMesh&&e.layers.test(n)&&!F.isGizmo(e);c&&=e.visible,c&&=!(e instanceof xa),c&&=!(e instanceof Ca);const h=e,d=h.geometry;if(c&&l){const p=l(e);if(p===!1)return;p==="continue in children"&&(c=!1)}if(d&&W_(d)||(c=!1),c){if(a){const p=this.sphere;p.center.copy(t),p.radius=i;const m=s.length;if($d.runMeshBVHRaycast(this.sphere,h,s,this.context,{}),m!=s.length&&!r)return}else if(d.boundingBox||d.computeBoundingBox(),d.boundingBox){h.matrixWorldNeedsUpdate&&h.updateWorldMatrix(!1,!1);const p=this.tempBoundingBox.copy(d.boundingBox).applyMatrix4(h.matrixWorld),m=this.sphere;if(m.center.copy(t),m.radius=i,m.intersectsBox(p)){const f=K(e),g=f.distanceTo(m.center),y=new wg(e,g,f);if(s.push(y),!r)return}}}if(e.children)for(const p of e.children){const m=s.length;if(this.intersectSphere(p,t,i,n,s,r,a,l),m!=s.length&&!r)return}}}function W_(o){return!(o.index&&o.index.array.length<3)}const vr=new pd,Wd=new ar,lk=new G0;function ck(o,e,t){const i=o._computeIntersections;if(!i)return!1;let n=o["_computeIntersections:Needle"];return n||(n=o["_computeIntersections:Needle"]=function(s,r,a){const l=this,c=l.geometry.boundingSphere;if(c){if(l instanceof Ca){Wd.setFromNormalAndCoplanarPoint(z(0,1,0),z(0,-l.position.y,0)),Wd.applyMatrix4(l.matrixWorld,lk);const d=s.ray.intersectPlane(Wd,z());if(d){vr.copy(c),vr.applyMatrix4(l.matrixWorld);const p=z(d).sub(s.ray.origin).length(),m=vr.radius*.5;p<m&&r.push({distance:p,point:d,object:l,normal:Wd.normal.clone()})}return}vr.copy(c),vr.applyMatrix4(l.matrixWorld);const h=s.ray.intersectSphere(vr,z());if(h){const d=z(h).sub(s.ray.origin),p=d.length();if(p>vr.radius){const m=d.clone().normalize();r.push({distance:p,point:h,object:l,normal:m})}}}}),o._computeIntersections=n,e.intersectObject(o,!1,t),o._computeIntersections=i,!0}var $d;(o=>{function e(_,v,P,M,O){if(!v.geometry||!v.geometry.hasAttribute("position"))return!1;const E=v.geometry;if(v?.isSkinnedMesh){const L=v,$=L.bvhNeedsUpdate;if(!L.staticGenerator)a(),s&&(L.staticGenerator=new s(v),L.staticGenerator.applyWorldTransforms=!1,L.staticGeometry=L.staticGenerator.generate(),E.boundsTree=r?.call(L.staticGeometry),L.staticGeometryLastUpdate=performance.now()+Math.random()*200,L.bvhNeedsUpdate=!0);else if(E.boundsTree&&(L.autoUpdateMeshBvhInterval!==void 0&&L.autoUpdateMeshBvhInterval>=0||$===!0)){const D=performance.now(),q=D-L.staticGeometryLastUpdate,Z=L.autoUpdateMeshBvhInterval??100;($||q>Z)&&(Ht&&console.warn(`Physics: updating skinned mesh bvh for ${v.name} after ${q.toFixed(2)}ms`),L.bvhNeedsUpdate=!1,L.staticGeometryLastUpdate=D,L.staticGenerator?.generate(L.staticGeometry),E.boundsTree.refit())}}else if(!E.boundsTree){c||y();let L=!0;if((M.xr||E[m]===!1||E.getAttribute("position")?.isInterleavedBufferAttribute||E.index&&E.index?.isInterleavedBufferAttribute)&&(L=!1),L&&d){if(E[p]===void 0){let $=null;if(g.length>0){const D=g.shift();D&&!D.running&&($=D)}if(!$&&f.length<3&&($=new d,f.push($)),$!=null&&!$.running){const D=v.name;Ht&&console.log("<<<< worker start",D,$),E[p]="queued",performance.mark("bvh.create.start");const q=E.clone();try{$.generate(q).then(Z=>{E[p]="done",E.boundsTree=Z}).catch(Z=>{E[p]="failed - "+Z?.message,E[m]=!1,Ht&&console.error("Failed to generate mesh bvh on worker",Z)}).finally(()=>{Ht&&console.log(">>>>> worker done",D,{hasBoundsTre:E.boundsTree!=null}),g.push($),q.dispose(),performance.mark("bvh.create.end"),performance.measure("bvh.create (worker)","bvh.create.start","bvh.create.end")})}catch(Z){console.error("Failed to generate mesh bvh on worker",Z)}}else Ht&&console.warn("No worker available")}}else(!h||!L)&&(a(),n&&(performance.mark("bvh.create.start"),E.boundsTree=new n(E),performance.mark("bvh.create.end"),performance.measure("bvh.create","bvh.create.start","bvh.create.end")))}if(_ instanceof ud){const L=_,$=v.raycast;if(E.boundsTree)a(),i&&(v.acceleratedRaycast||(v.acceleratedRaycast=i.bind(v),Ht&&console.debug(`Physics: bind acceleratedRaycast fn to "${v.name}"`)),v.raycast=v.acceleratedRaycast);else if(Ht&&console.warn("No bounds tree found for mesh",v.name,{workerTask:E[p],hasAcceleratedRaycast:i!=null}),O.allowSlowRaycastFallback===!1&&(E.getAttribute("position")?.array?.length??0)>2e3)return Ht&&console.warn("Skipping raycast because no bounds tree is available and allowSlowRaycastFallback is false"),!1;const D=L.firstHitOnly;return L.firstHitOnly=!1,L.intersectObject(v,!1,P),L.firstHitOnly=D,v.raycast=$,!0}else if(_ instanceof pd){const L=E.boundsTree;if(L){const $=_;if(l.copy(v.matrixWorld).invert(),$.applyMatrix4(l),L.intersectsSphere($)){const D=K(v),q=D.distanceTo($.center),Z=new wg(v,q,D);P.push(Z)}}return!0}return!1}o.runMeshBVHRaycast=e;let t=!1,i=null,n=null,s=null,r=null;function a(){t||(t=!0,import("./vendor-DPCU8cUF.min.js").then(_=>_.index$1).then(_=>{i=_.acceleratedRaycast,n=_.MeshBVH,s=_.StaticGeometryGenerator,r=_.computeBoundsTree}).catch(_=>{(Ht||A())&&console.error("Failed to load BVH library...",_.message)}))}const l=new ee;let c=!1,h=!1,d=null;const p=Symbol("Needle:MeshBVH-Worker"),m=Symbol("Needle:MeshBVH-CanUseWorker"),f=[],g=[];function y(){c=!0,h=!0,Promise.resolve().then(()=>eL).then(_=>{d=_.GenerateMeshBVHWorker}).catch(_=>{(Ht||A())&&console.warn("Failed to setup mesh bvh worker")}).finally(()=>{h=!1})}})($d||($d={}));const $_=Symbol("gltf-loader-internal-usage-tracker"),hk=x("debugusers");class Ul{get name(){return"NEEDLE_internal_usage_tracker"}static isLoading(e){return Ul._loadingProcesses>0}static _loadingProcesses=0;parser;_getDependency;_loadingId;_loadedObjects=new Set;constructor(e){this.parser=e,this._getDependency=this.parser.getDependency,this._loadingId=Date.now().toString()}beforeRoot(){Ul._loadingProcesses++;const e=this,t=this._getDependency;return this.parser.getDependency=function(i,n){const s=t.call(this,i,n);return s.then(r=>(r&&(e._loadedObjects.add(r),r[$_]=e._loadingId),r)),s},null}afterRoot(e){Ul._loadingProcesses--,this.parser.getDependency=this._getDependency;for(const t of this._loadedObjects)delete t[$_],t instanceof k&&(t.parent||t instanceof H&&setTimeout(()=>{hk&&console.warn("> GLTF LOADER: Mesh not used in scene!",t),t.material=null,t.geometry=null},1e3));return null}}class H_{constructor(){window.addEventListener("unhandledrejection",e=>{if(e.defaultPrevented)return;const t=e?.reason?.path;if(t){const i=t[0];i&&i.tagName==="IMG"&&(console.warn(`Could not load image:
|
|
168
168
|
`+i.src),e.preventDefault())}})}}const Hd=x("trackresources");function G_(){return Hd==="dispose"}let xr=!0;Hd===0&&(xr=!1);function dk(o){xr=o}function q_(){return xr}const X_=Symbol("disposable");function Q_(o,e){o&&(o[X_]=e,wr&&console.warn("Set disposable",e,o))}const Y_=Symbol("disposed");function uk(o){return o[Y_]===!0}function Pe(o){if(o){if(o[X_]===!1){wr&&console.warn("Object is marked as not disposable",o);return}if(typeof o=="object"&&(o[Y_]=!0),o instanceof yi)Pe(o.environment),Pe(o.background),Pe(o.customDepthMaterial),Pe(o.customDistanceMaterial);else if(o instanceof hs)Pe(o.geometry),Pe(o.material),Pe(o.skeleton),Pe(o.bindMatrix),Pe(o.bindMatrixInverse),Pe(o.customDepthMaterial),Pe(o.customDistanceMaterial),o.visible=!1;else if(o instanceof H)Pe(o.geometry),Pe(o.material),Pe(o.customDepthMaterial),Pe(o.customDistanceMaterial),o.visible=!1;else if(o instanceof k)o.visible=!1;else if(o instanceof mn){ja(o);for(const e of Object.keys(o.attributes)){const t=o.attributes[e];Pe(t)}}else if(o instanceof pt||o instanceof Y0)wr&&console.warn("BufferAttribute dispose not supported",o.count);else if(o instanceof Array)for(const e of o)e instanceof ve&&Pe(e);else if(o instanceof ve){ja(o);for(const t of Object.keys(o)){const i=o[t];i instanceof Re&&Pe(i)}const e=o.uniforms;if(e)for(const t of Object.keys(e)){const i=e[t];i instanceof Re?Pe(i):i instanceof Vi&&Pe(i.value)}}else o instanceof Re?(ja(o),ja(o.source),o.source?.data instanceof ImageBitmap&&ja(o.source.data)):o instanceof _S?(ja(o.boneTexture),o.boneTexture=null):o instanceof vS||!(o instanceof k)&&wr&&console.warn("Unknown object type",o)}}function ja(o){o&&((wr||G_()||Hd)&&console.warn("\u{1F9E8} FREE",o),o instanceof ImageBitmap||"dispose"in o&&typeof o.dispose=="function"&&o.dispose())}function pk(o){}const mk=new Set;function Sg(o,e,t=null,i){if(i||(i=mk,i.clear()),!o)return i;const n=o[cc];if(n)for(const s of n)i.has(s)||t?.call(null,s)!==!1&&(i.add(s),e&&Sg(s,!0,t,i));return i}function gk(o){return o[hc]}const wr=x("debugresourceusers")||x("debugmemory"),cc=Symbol("needle-resource-users"),hc=Symbol("needle-resource-users-count");function Gt(o,e){Id(o,e,function(t,i){xr&&!zl.raycasting&&(Gd(cc,this,t,!1),Gd(cc,this,i,!0))})}xr&&(Gt(H.prototype,"material"),Gt(H.prototype,"geometry"),Gt(ve.prototype,"map"),Gt(ve.prototype,"bumpMap"),Gt(ve.prototype,"alphaMap"),Gt(ve.prototype,"normalMap"),Gt(ve.prototype,"displacementMap"),Gt(ve.prototype,"roughnessMap"),Gt(ve.prototype,"metalnessMap"),Gt(ve.prototype,"emissiveMap"),Gt(ve.prototype,"specularMap"),Gt(ve.prototype,"envMap"),Gt(ve.prototype,"lightMap"),Gt(ve.prototype,"aoMap"),Gt(ve.prototype,"gradientMap"));function fk(o){if(xr===!1)return;const e=o[cc];if(e)for(const t of e)Gd(cc,t,o,!1)}xr&&Id(ve.prototype,"dispose",function(){fk(this)});let Cg=0;function Gd(o,e,t,i){if(Cg>0)return;if(Array.isArray(t)){for(const s of t)Gd(o,e,s,i);return}if(!t)return;let n=t[o];if(n||(n=new Set),i){if(e&&!n.has(e)){n.add(e);let s=t[hc]||0;s+=1,t[hc]=s,wr&&console.warn(`\u{1F7E2} Added user of "${t.type}"`,e,t,s,"users:",n)}}else if(e&&n.has(e)){n.delete(e);let s=t[hc]||0;s>0&&(s-=1,t[hc]=s),wr&&console.warn(`\u{1F534} Removed user of "${t.type}"`,e,t,s,"users:",n),s<=0&&(Ul.isLoading(t)||(Hd&&console.warn(`\u{1F534} Removed all user of "${t.type}"`,t),G_()&&Pe(t)))}t[o]=n}try{Id(rr.prototype,"render",function(){Cg++},function(){Cg--})}catch(o){console.warn("Could not wrap WebGLRenderer.render",o)}const Z_=x("debugcomponentevents");class qd{static eventListeners=new Map;static addComponentLifecylceEventListener(e,t){this.eventListeners.has(e)&&this.eventListeners.set(e,[]);let i=this.eventListeners.get(e);i||(i=[]),i.push(t),this.eventListeners.set(e,i),Z_&&console.log("Added event listener for "+e,this.eventListeners)}static removeComponentLifecylceEventListener(e,t){const i=this.eventListeners.get(e);if(!i)return;const n=i.indexOf(t);n<0||i.splice(n,1)}static dispatchComponentLifecycleEvent(e,t){const i=this.eventListeners.get(e);if(Z_&&console.log("Dispatching event "+e,i),!!i)for(const n of i)n(t)}}const dc=Symbol("NEEDLE_NEED_UPDATE_INSTANCE"),K_=Symbol("isUsingInstancing"),J_=Symbol("instancingRenderer"),uc=Symbol("instancingAutoUpdateBounds");class cn{static isUsingInstancing(e){return e[K_]===!0}static getRenderer(e){return e[J_]||null}setAutoUpdateBounds(e,t){const i=cn.getRenderer(e);i&&(i[uc]=t)}static markDirty(e,t=!0){if(e&&(this.isUsingInstancing(e)&&(e[dc]=!0,e.matrixWorldNeedsUpdate=!0),t))for(const i of e.children)cn.markDirty(i,!0)}}var pc;(o=>{o.experimentalSmartHierarchyUpdate=!1})(pc||(pc={}));function Da(o,e){try{e||o()}catch(t){return console.error(t),!1}return!0}const Pg=x("debugnewscripts"),yk=x("debughierarchy"),Ae=[];function bk(){return Ae.length>0}function Xd(o){if(Pg&&console.log("Register new components",o.new_scripts.length,[...o.new_scripts],o.alias?"element: "+o.alias:o.hash,o),o.new_scripts_pre_setup_callbacks.length>0){for(const e of o.new_scripts_pre_setup_callbacks)e&&e();o.new_scripts_pre_setup_callbacks.length=0}if(!(o.new_scripts.length<=0)){Ae.length=0,o.new_scripts.length>0&&Ae.push(...o.new_scripts),o.new_scripts.length=0;for(let e=0;e<Ae.length;e++)try{const t=Ae[e];if(t.isComponent!==!0){(A()||Pg)&&console.error(`Registered script is not a Needle Engine component.
|
|
169
169
|
The script will be ignored. Please make sure your component extends "Behaviour" imported from "@needle-tools/engine"
|
|
170
170
|
`,t),Ae.splice(e,1),e--;continue}if(t.destroyed)continue;if(!t.gameObject){console.warn(`Component can not be initialized: no GameObject assigned.
|
|
@@ -876,7 +876,7 @@ Target Framerate: `+this.targetFrameRate)),this._dispatchReadyAfterFrame&&(this.
|
|
|
876
876
|
padding-left: 25px;
|
|
877
877
|
border-radius: .5em;
|
|
878
878
|
border: 2px solid rgba(160,160,160,.3);
|
|
879
|
-
`,i=`Needle Engine \u2014 No license active, commercial use is not allowed. Visit https://needle.tools/pricing for more information and licensing options! v${yn}`;N.Current?.xr?console.log(i):console.log("%c "+i,t)}async function RM(o){if(!window.crossOriginIsolated){if(Hn==="pro"){const e=o?.domElement?.getAttribute("no-telemetry");if(e===""||e==="true"||e==="1"){Pi&&console.debug("Telemetry is disabled");return}Pi&&console.debug("Telemetry attribute: "+e)}try{const e="https://needle-engine-analytics-v2-r26roub2hq-lz.a.run.app";if(e){const t=window.location.href.split("?")[0];let i="api/v2/new/request";e.endsWith("/")||(i="/"+i);const n=Hn,s=`${e}${i}`;Pi&&console.debug("Sending beacon");const r={license:n,url:t,hostname:window.location.hostname,pathname:window.location.pathname,version:yn,generator:Ad,build_time:tg,public_key:Ma},a=navigator.sendBeacon?.(s,JSON.stringify(r));Pi&&console.debug("Sent beacon: "+a)}}catch(e){Pi&&console.log("Failed to send non-commercial usage message to analytics backend",e)}}}function cx(o,e){return Oo(o,de.ContextCreated,e),()=>gs(o,de.ContextCreated)}function TM(o,e){return Oo(o,de.ContextClearing,e),()=>gs(o,de.ContextClearing)}function EM(o,e){return Oo(o,de.ContextDestroying,e),()=>gs(o,de.ContextDestroying)}function bu(o,e){return Oo(o,xe.Start,e),()=>gs(o,xe.Start)}function hx(o,e){return Oo(o,xe.Update,e),()=>gs(o,xe.Update)}function AM(o,e){return Oo(o,xe.OnBeforeRender,e),()=>gs(o,xe.OnBeforeRender)}function IM(o,e){return Oo(o,xe.OnAfterRender,e),()=>gs(o,xe.OnAfterRender)}const LM=x("debugdecoders");let lf=null;function dx(){if(!lf){const o=xm(null);lf={dracoLoader:o.dracoLoader,ktx2Loader:o.ktx2Loader,meshoptDecoder:o.meshoptDecoder}}return lf}function ux(o){o!==void 0&&typeof o=="string"&&EC(o)}function px(o){if(o!==void 0&&typeof o=="string"&&o!=="js"){const e=dx();LM&&console.log("Setting draco decoder type to",o),e.dracoLoader.setDecoderConfig({type:o})}}function mx(o){o!==void 0&&typeof o=="string"&&TC(o)}function cf(o,e){const t=dx();return e.renderer?t.ktx2Loader.detectSupport(e.renderer):console.warn("No renderer provided to detect ktx2 support - loading KTX2 textures will probably fail"),MC(o),o.dracoLoader||o.setDRACOLoader(t.dracoLoader),o.ktx2Loader||o.setKTX2Loader(t.ktx2Loader),o.meshoptDecoder||o.setMeshoptDecoder(t.meshoptDecoder),RC(o,{progressive:!0}),o}const Ye=function(o){return u(o)},u=function(o){if(o===void 0&&(o=null),!Array.isArray(o))o=gx(o);else for(let e=0;e<o.length;e++){const t=o[e];o[e]=gx(t)}return function(e,t){if(!e){const n=typeof t=="string"?t:t.name;console.warn(`@serializable without a target at '${n}'.`);return}typeof t!="string"&&(t=t.name),Object.getOwnPropertyDescriptor(e,"$serializedTypes")||(e.$serializedTypes={});const i=e.$serializedTypes=e.$serializedTypes||{};i[t]=o}};function gx(o){switch(o?.prototype?.constructor?.name){case"Number":case"String":case"Boolean":return null}return o}const xs=x("debughotreload");let Oc=!1;const kc=new Map;function jM(){return Oc}function hf(){return globalThis.NEEDLE_HOT_RELOAD_ENABLED===!0}function fx(o){if(Oc){xs&&console.warn("[Needle Engine] Hot reloading is in progress, not registering instance",o);return}xs&&console.log("[Needle Engine] Registering hot reload instance",o);const e=o.constructor.name;kc.has(e)?kc.get(e)?.push(o):kc.set(e,[o])}function yx(o){if(Oc){xs&&console.warn("[Needle Engine] Hot reloading is in progress, not unregistering instance",o);return}xs&&console.log("[Needle Engine] Unregistering hot reload instance",o);const e=o.constructor.name,t=kc.get(e);if(!t)return;const i=t.indexOf(o);i!==-1&&t.splice(i,1)}let bx=!1;function DM(){if(xs||bx)return;bx=!0;const o=console.error;console.error=(...e)=>{if(e.length){const t=e[0];if(typeof t=="string"&&t.includes("[hmr] Failed to reload ")){console.log("[Needle Engine] Hot reloading failed"),window.location.reload();return}}o.apply(console,e)}}function BM(o){xs&&console.log("[HMR] Apply changes",o,Object.keys(o)),DM();for(const e of Object.keys(o))try{Oc=!0;const t=C.get(e);if(!t){xs&&console.log("[HMR] Type not found: "+e);continue}const i=o[e],n=kc.get(i.name);let s="[Needle Engine] Updating type: "+e;const r=n?.length??-1;r>0?s+=" x"+r:s+=" (No instances registered)",console.log(s);const a=Object.getOwnPropertyNames(t.prototype),l=Object.getOwnPropertyDescriptors(i.prototype);for(const c in l)l[c].writable&&(t.prototype[c]=o[e].prototype[c]);for(const c of a)l[c]||delete t.prototype[c];if(n){const c=new i,h=Object.getOwnPropertyDescriptors(c);for(const d of n){const p=d,m=p.isComponent===!0,f=m?p.activeAndEnabled:!0,g=m?p.context:void 0;try{if(m&&g&&ko(p,g),m&&f&&(p.enabled=!1),d.onBeforeHotReloadFields&&d.onBeforeHotReloadFields()===!1)continue;for(const y in h)if(h[y].writable){if(d[y]===void 0)d[y]=c[y];else if(typeof d[y]=="function"&&!d[y].prototype){const _=d[y],v=_.name,P="bound ";if(v===P)continue;const M=_.name.substring(P.length),O=i.prototype[M];O&&(d[y]=O.bind(d))}}d.onAfterHotReloadFields&&d.onAfterHotReloadFields()}finally{m&&g&&Og(p,g),m&&f&&(p.enabled=!0)}}}}catch(t){if(xs)console.error(t);else return!1}finally{Oc=!1,hr(wi.Log,"Script changes applied (HMR)")}return!0}class w extends k{guid;static isDestroyed(e){return Or(e)}static setActive(e,t,i=!0){e&&(xc(e,t),Qd(e),t&&i&&ev(N.Current,e))}static isActiveSelf(e){return Na(e)}static isActiveInHierarchy(e){return Av(e)}static markAsInstancedRendered(e,t){Iv(e,t)}static isUsingInstancing(e){return ou(e)}static foreachComponent(e,t,i=!0){return kr(e,t,i)}static instantiateSynced(e,t){return e?Ig(e,t):null}static instantiate(e,t=null){return"isAssetReference"in e,Wa(e,t)}static destroySynced(e,t,i=!0){if(!e)return;const n=e;t=t??N.Current,gc(n,t.connection,i)}static destroy(e,t=!0){return Ci(e,t)}static add(e,t,i){if(!(!e||!t)){if(e===t){console.warn("Can not add object to self",e);return}i||(i=N.Current),t.add(e),xc(e,!0),Qd(e),i?w.foreachComponent(e,n=>{Og(n,i),!n.__internalDidAwakeAndStart&&i.new_script_start.includes(n)===!1&&i.new_script_start.push(n)},!0):console.warn("Missing context")}}static remove(e){e&&(e.parent?.remove(e),xc(e,!1),Qd(e),w.foreachComponent(e,t=>{_k(t)},!0))}static invokeOnChildren(e,t,...i){this.invoke(e,t,!0,i)}static invoke(e,t,i=!1,...n){e&&this.foreachComponent(e,s=>{const r=s[t];r&&typeof r=="function"&&r?.call(s,...n)},i)}static addNewComponent(e,t,i,n=!0){return wn(e,t,i,{callAwake:n})}static addComponent(e,t,i,n){return wn(e,t,i,n)}static moveComponent(e,t){return wn(e,t)}static removeComponent(e){return Wg(e.gameObject,e),e}static getOrAddComponent(e,t){return yc(e,t)}static getComponent(e,t){return e===null?null:Cr(e,t)}static getComponents(e,t,i=null){return e===null?i??[]:bc(e,t,i)}static findByGuid(e,t){return $g(e,t)}static findObjectOfType(e,t,i=!0){return Ua(e,t??N.Current,i)}static findObjectsOfType(e,t){const i=[];return Ev(e,i,t),i}static getComponentInChildren(e,t){return _c(e,t)}static getComponentsInChildren(e,t,i=null){return za(e,t,i??void 0)}static getComponentInParent(e,t){return vc(e,t)}static getComponentsInParent(e,t,i=null){return tu(e,t,i)}static getAllComponents(e){const t=e.userData?.components;return t?[...t]:[]}static*iterateComponents(e){const t=e?.userData?.components;if(t&&Array.isArray(t))for(let i=0;i<t.length;i++)yield t[i]}}class R{get isComponent(){return!0}__context;get context(){return this.__context??N.Current}set context(e){this.__context=e}get scene(){return this.context.scene}get layer(){return this.gameObject?.userData?.layer}get name(){return this.gameObject?.name?this.gameObject.name:this.gameObject?.userData.name}__name;set name(e){this.gameObject?(this.gameObject.userData||(this.gameObject.userData={}),this.gameObject.userData.name=e,this.__name=e):this.__name=e}get tag(){return this.gameObject?.userData.tag}set tag(e){this.gameObject&&(this.gameObject.userData||(this.gameObject.userData={}),this.gameObject.userData.tag=e)}get static(){return this.gameObject?.userData.static}set static(e){this.gameObject&&(this.gameObject.userData||(this.gameObject.userData={}),this.gameObject.userData.static=e)}get activeAndEnabled(){return!(this.destroyed||this.__isEnabled===!1||!this.__isActiveInHierarchy)}get __isActive(){return this.gameObject.visible}get __isActiveInHierarchy(){if(!this.gameObject)return!1;const e=this.gameObject[So];return e===void 0?!0:e}set __isActiveInHierarchy(e){this.gameObject&&(this.gameObject[So]=e)}gameObject;guid="invalid";sourceId;awake(){}onEnable(){}onDisable(){}onDestroy(){this.__destroyed=!0}startCoroutine(e,t=xe.Update){return this.context.registerCoroutineUpdate(this,e,t)}stopCoroutine(e,t=xe.Update){this.context.unregisterCoroutineUpdate(e,t)}get destroyed(){return this.__destroyed}destroy(){this.__destroyed||this.__internalDestroy()}__didAwake=!1;__didStart=!1;__didEnable=!1;__isEnabled=void 0;__destroyed=!1;get __internalDidAwakeAndStart(){return this.__didAwake&&this.__didStart}constructor(e){this.__didAwake=!1,this.__didStart=!1,this.__didEnable=!1,this.__isEnabled=void 0,this.__destroyed=!1,this._internalInit(e),hf()&&fx(this)}__internalNewInstanceCreated(e){return this.__didAwake=!1,this.__didStart=!1,this.__didEnable=!1,this.__isEnabled=void 0,this.__destroyed=!1,this._internalInit(e),this}_internalInit(e){if(typeof e=="object")for(const t of Object.keys(e)){const i=e[t];typeof i!="function"&&(this[t]=i)}}__internalAwake(){this.__didAwake||(this.__didAwake=!0,this.awake())}__internalStart(){this.__didStart||(this.__didStart=!0,this.start&&this.start())}__internalEnable(e){return this.__destroyed?(A()&&console.warn("[Needle Engine Dev] Trying to enable destroyed component"),!1):this.__didAwake?this.__didEnable?(e!==!0&&(this.__isEnabled=!0),!1):(this.__didEnable=!0,this.__isEnabled=!0,this.onEnable(),!0):!1}__internalDisable(e){if(this.__didAwake){if(!this.__didEnable){e!==!0&&(this.__isEnabled=!1);return}this.__didEnable=!1,this.__isEnabled=!1,this.onDisable()}}__internalDestroy(){this.__destroyed||(this.__destroyed=!0,this.__didAwake&&(this.onDestroy?.call(this),this.dispatchEvent(new CustomEvent("destroyed",{detail:this}))),Mv(this),hf()&&yx(this))}get enabled(){return typeof this.__isEnabled=="boolean"?this.__isEnabled:!0}set enabled(e){if(this.__destroyed){A()&&console.warn(`[Needle Engine Dev] Trying to ${e?"enable":"disable"} destroyed component`);return}if(typeof e=="number"&&(e>=.5?e=!0:e=!1),!this.__didAwake){this.__isEnabled=e;return}e?this.__internalEnable():this.__internalDisable()}get worldPosition(){return K(this.gameObject)}set worldPosition(e){mt(this.gameObject,e)}setWorldPosition(e,t,i){dr(this.gameObject,e,t,i)}get worldQuaternion(){return be(this.gameObject)}set worldQuaternion(e){fn(this.gameObject,e)}setWorldQuaternion(e,t,i,n){qm(this.gameObject,e,t,i,n)}get worldEuler(){return Xm(this.gameObject)}set worldEuler(e){Qm(this.gameObject,e)}get worldRotation(){return this.gameObject.worldRotation}set worldRotation(e){this.setWorldRotation(e.x,e.y,e.z,!0)}setWorldRotation(e,t,i,n=!0){Jl(this.gameObject,e,t,i,n)}static _forward=new b;get forward(){return R._forward.set(0,0,-1).applyQuaternion(this.worldQuaternion)}static _right=new b;get right(){return R._right.set(1,0,0).applyQuaternion(this.worldQuaternion)}static _up=new b;get up(){return R._up.set(0,1,0).applyQuaternion(this.worldQuaternion)}_eventListeners=new Map;addEventListener(e,t){this._eventListeners[e]=this._eventListeners[e]||[],this._eventListeners[e].push(t)}removeEventListener(e,t){if(!this._eventListeners[e])return;const i=this._eventListeners[e].indexOf(t);i>=0&&this._eventListeners[e].splice(i,1)}dispatchEvent(e){if(!e||!this._eventListeners[e.type])return!1;const t=this._eventListeners[e.type];for(let i=0;i<t.length;i++)t[i](e);return!1}}const FM=Object.freeze(Object.defineProperty({__proto__:null,Behaviour:R,Component:R,GameObject:w},Symbol.toStringTag,{value:"Module"}));var zM=Object.defineProperty,_x=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&zM(e,t,n),n};class Mc extends R{from;to;width=0;centered=!0;_centerPos;awake(){this._centerPos=new b}update(){if(!this.from||!this.to)return;const e=K(this.from).clone(),t=K(this.to).clone(),i=e.distanceTo(t);this._centerPos.copy(e),this._centerPos.add(t),this._centerPos.multiplyScalar(.5),mt(this.gameObject,this.centered?this._centerPos:e),this.gameObject.lookAt(K(this.to).clone()),this.gameObject.scale.set(this.width,this.width,i)}}_x([u(w)],Mc.prototype,"from"),_x([u(w)],Mc.prototype,"to");var UM=Object.defineProperty,NM=Object.getOwnPropertyDescriptor,Tr=(o,e,t,i)=>{for(var n=i>1?void 0:i?NM(e,t):e,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=(i?r(e,t,n):r(n))||n);return i&&n&&UM(e,t,n),n};const ws=x("debuganimation");let vx=class{x;y};class Lt extends R{get isAnimationComponent(){return!0}addClip(e){this.animations||(this.animations=[]),this.animations.includes(e)||this.animations.push(e)}playAutomatically=!0;randomStartTime=!0;minMaxSpeed;minMaxOffsetNormalized;loop=!0;clampWhenFinished=!1;get time(){if(this.actions){for(const e of this.actions)if(e.isRunning())return e.time}return 0}set time(e){if(this.actions)for(const t of this.actions)t.time=e}get duration(){if(this.actions){for(const e of this.actions)if(e.isRunning())return e.getClip().duration}return 0}_tempAnimationClipBeforeGameObjectExisted=null;get clip(){return this.animations?.length?this.animations[0]:null}set clip(e){if(!this.__didAwake){ws&&console.warn("Assign clip during serialization",e),this._tempAnimationClipBeforeGameObjectExisted=e;return}e&&(this.gameObject.animations||(this.gameObject.animations=[]),!this.animations.includes(e)&&(this.animations.length>0?this.animations.splice(0,0,e):this.animations.push(e)))}set clips(e){this.animations=e}_tempAnimationsArray;set animations(e){e==null||!Array.isArray(e)||(this.gameObject?this.gameObject.animations=e:this._tempAnimationsArray=e)}get animations(){return this.gameObject?.animations||this._tempAnimationsArray||[]}mixer=void 0;get actions(){return this._actions}set actions(e){this._actions=e}_actions;_handles;awake(){this.mixer=void 0,ws&&console.log("Animation Awake",this.name,this),this._tempAnimationsArray&&(this.animations=this._tempAnimationsArray,this._tempAnimationsArray=void 0),this._tempAnimationClipBeforeGameObjectExisted&&(this.clip=this._tempAnimationClipBeforeGameObjectExisted,this._tempAnimationClipBeforeGameObjectExisted=null),this.actions=[],this._handles=[]}onEnable(){if(this.playAutomatically&&this.animations?.length>0){const e=Math.floor(Math.random()*this.animations.length),t=this.animations[e];this.play(e,{exclusive:!0,fadeDuration:0,startTime:this.randomStartTime?Math.random()*t.duration:0,loop:this.loop,clampWhenFinished:this.clampWhenFinished})}}update(){this.mixer&&(this.mixer.update(this.context.time.deltaTime),this._handles.forEach(e=>e.update()))}onDisable(){this.mixer&&this.mixer.stopAllAction()}onDestroy(){this.context.animations.unregisterAnimationMixer(this.mixer)}getAction(e){return this.actions?.find(t=>t.getClip().name===e)||null}get isPlaying(){if(this.actions){for(let e=0;e<this.actions.length;e++)if(this.actions[e].isRunning())return!0}return!1}stopAll(e){if(this.actions)for(const t of this.actions)e?.fadeDuration?t.fadeOut(e.fadeDuration):t.stop()}stop(e,t){if(e===void 0){this.stopAll();return}else if(typeof e=="number"){if(e>=this.animations.length){ws&&console.log("No animation at index",e);return}e=this.animations[e]}else typeof e=="string"&&(e=this.animations.find(n=>n.name===e));if(!e){console.error("Could not find clip",e);return}const i=this.actions.find(n=>n.getClip()===e);if(!i){console.error("Could not find action",e);return}t?.fadeDuration?i.fadeOut(t.fadeDuration):i.stop()}pause(e,t=!1){if(e===void 0){for(const n of this.actions)n.paused=!t;return}else if(typeof e=="number"){if(e>=this.animations.length){ws&&console.log("No animation at index",e);return}e=this.animations[e]}else typeof e=="string"&&(e=this.animations.find(n=>n.name===e));if(!e){console.error("Could not find clip",e);return}const i=this.actions.find(n=>n.getClip()===e);if(!i){console.error("Could not find action",e);return}i.paused=!t}resume(){for(const e of this.actions)e.paused=!1}play(e=0,t){if(ws&&console.log("PLAY",e),this.ensureMixer(),!this.mixer){ws&&console.warn("Missing mixer",this);return}e===void 0&&(e=0);let i=e;if(typeof e=="number"){if(e>=this.animations.length){ws&&console.log("No animation at index",e);return}i=this.animations[e]}else typeof e=="string"&&(i=this.animations.find(s=>s.name===e));if(!i){console.error("Could not find clip",e);return}t||(t={});for(const s of this.actions)if(s.getClip()===i)return this.internalOnPlay(s,t);if(!i.tracks){console.warn("Clip is no AnimationClip",i);return}const n=this.mixer.clipAction(i);return this.actions.push(n),this.internalOnPlay(n,t)}internalOnPlay(e,t){var i=this.actions.find(s=>s===e);if(i===e&&i.isRunning()&&i.time<i.getClip().duration){const s=this.tryFindHandle(e);if(i.paused&&(i.paused=!1),s)return s.waitForFinish()}if(t.loop===void 0&&(t.loop=this.loop),t.clampWhenFinished===void 0&&(t.clampWhenFinished=this.clampWhenFinished),t.minMaxOffsetNormalized===void 0&&this.randomStartTime&&(t.minMaxOffsetNormalized=this.minMaxOffsetNormalized),t.minMaxSpeed===void 0&&(t.minMaxSpeed=this.minMaxSpeed),t?.exclusive??!0)for(const s of this.actions)s!=i&&(t.fadeDuration?s.fadeOut(t.fadeDuration):s.stop());if(t?.fadeDuration&&e.fadeIn(t.fadeDuration),e.enabled=!0,t?.startTime!=null)e.time=t.startTime;else if(t?.minMaxOffsetNormalized&&t.minMaxOffsetNormalized.x!=0&&t.minMaxOffsetNormalized.y!=0){const s=e.getClip();e.time=j.lerp(t.minMaxOffsetNormalized.x,t.minMaxOffsetNormalized.y,Math.random())*s.duration}else e.time>=e.getClip().duration&&(e.time=0);t?.minMaxSpeed?e.timeScale=j.lerp(t.minMaxSpeed.x,t.minMaxSpeed.y,Math.random()):e.timeScale=t?.speed??1,t?.loop!=null?e.loop=t.loop?MS:pm:e.loop=pm,t?.clampWhenFinished&&(e.clampWhenFinished=!0),e.paused=!1,e.play(),ws&&console.log("PLAY",e.getClip().name,e);const n=new VM(e,this.mixer,t,s=>{this._handles.splice(this._handles.indexOf(n),1)});return this._handles.push(n),n.waitForFinish()}tryFindHandle(e){for(const t of this._handles)if(t.action===e)return t}ensureMixer(){if(!this.mixer){const e="animationMixer";this.gameObject[e]&&(this.mixer=this.gameObject[e]),(!this.mixer||!this.mixer.clipAction)&&(this.mixer=new mm(this.gameObject),this.gameObject[e]=this.mixer)}this.context.animations.registerAnimationMixer(this.mixer)}}Tr([u()],Lt.prototype,"playAutomatically",2),Tr([u()],Lt.prototype,"randomStartTime",2),Tr([u(vx)],Lt.prototype,"minMaxSpeed",2),Tr([u(vx)],Lt.prototype,"minMaxOffsetNormalized",2),Tr([u()],Lt.prototype,"loop",2),Tr([u()],Lt.prototype,"clampWhenFinished",2),Tr([u(Wi)],Lt.prototype,"clips",1);class VM{mixer;action;promise=null;_options;_resolveCallback=null;_resolvedOrRejectedCallback;constructor(e,t,i,n){this.action=e,this.mixer=t,this._resolvedOrRejectedCallback=n,this._options=i}waitForFinish(){return this.promise?this.promise:(this.promise=new Promise(e=>{this._resolveCallback=e}),this.mixer.addEventListener("finished",this.onFinished),this.promise)}update(){this._options&&this._options.endTime!==void 0&&this.action.time>this._options.endTime&&(this._options.loop===!0?this.action.time=this._options.startTime??0:(this.action.time=this._options.endTime,this.action.timeScale=0,this.onResolve()))}onResolve(){this.dispose(),this._resolvedOrRejectedCallback?.call(this,this),this._resolveCallback?.call(this,this.action)}onFinished=e=>{e.action===this.action&&this.onResolve()};dispose(){this.mixer.removeEventListener("finished",this.onFinished)}}const _u=Symbol("objectIsAnimatedData");function xx(o,e,t){if(!o)return;if(o[_u]===void 0){if(!t)return;o[_u]=new Set}const i=o[_u];t?i.add(e):i.has(e)&&i.delete(e)}function WM(o){if(!o)return!1;const e=o[_u];return e!==void 0&&e.size>0}class $M{_context;get context(){return this._context??N.Current}get isStateMachineBehaviour(){return!0}}class Rc{name;nameHash;normalizedTime;length;speed;action;hasTransitions;constructor(e,t,i,n){this.name=e.name,this.nameHash=e.hash,this.normalizedTime=t,this.length=i,this.speed=n,this.action=e.motion.action||null,this.hasTransitions=e.transitions?.length>0||!1}}function wx(o,e){return{name:"Empty",isLooping:!1,guid:e?.generateUUID()??yo.generateUUID(),index:-1,clip:new Wi(o,0,[])}}var Ss=(o=>(o[o.If=1]="If",o[o.IfNot=2]="IfNot",o[o.Greater=3]="Greater",o[o.Less=4]="Less",o[o.Equals=6]="Equals",o[o.NotEqual=7]="NotEqual",o))(Ss||{}),df=(o=>(o[o.Float=1]="Float",o[o.Int=3]="Int",o[o.Bool=4]="Bool",o[o.Trigger=9]="Trigger",o))(df||{});const st=x("debuganimatorcontroller"),vu=x("debugrootmotion");class hn{static createFromClips(e,t={looping:!1,autoTransition:!0,transitionDuration:0}){const i=[];for(let s=0;s<e.length;s++){const r=e[s],a=[];if(t.autoTransition!==!1){const c=t.transitionDuration??0,h=c/r.duration;let d=s;(t.autoTransition===void 0||t.autoTransition===!0)&&(d=(s+1)%e.length),a.push({exitTime:1-h,offset:0,duration:c,hasExitTime:!0,destinationState:d,conditions:[]})}const l={name:r.name,hash:s,motion:{name:r.name,clip:r,isLooping:t?.looping??!1},transitions:a,behaviours:[]};i.push(l)}const n={name:"AnimatorController",guid:new At(Date.now()).generateUUID(),parameters:[],layers:[{name:"Base Layer",stateMachine:{defaultState:0,states:i}}]};return new hn(n)}play(e,t=-1,i=Number.NEGATIVE_INFINITY,n=0){if(t<0)t=0;else if(t>=this.model.layers.length){console.warn("invalid layer");return}const s=this.model.layers[t].stateMachine;for(const r of s.states)if(r.name===e||r.hash===e){st&&console.log("transition to ",r),this.transitionTo(r,n,i);return}console.warn("Could not find "+e+" to play")}reset(){this.setStartTransition()}setBool(e,t){const i=typeof e=="string"?"name":"hash";return this.model?.parameters?.filter(n=>n[i]===e).forEach(n=>n.value=t)}getBool(e){const t=typeof e=="string"?"name":"hash";return this.model?.parameters?.find(i=>i[t]===e)?.value??!1}setFloat(e,t){const i=typeof e=="string"?"name":"hash",n=this.model?.parameters?.filter(s=>s[i]===e);return n.forEach(s=>s.value=t),n?.length>0}getFloat(e){const t=typeof e=="string"?"name":"hash";return this.model?.parameters?.find(i=>i[t]===e)?.value??0}setInteger(e,t){const i=typeof e=="string"?"name":"hash";return this.model?.parameters?.filter(n=>n[i]===e).forEach(n=>n.value=t)}getInteger(e){const t=typeof e=="string"?"name":"hash";return this.model?.parameters?.find(i=>i[t]===e)?.value??0}setTrigger(e){st&&console.log("SET TRIGGER",e);const t=typeof e=="string"?"name":"hash";return this.model?.parameters?.filter(i=>i[t]===e).forEach(i=>i.value=!0)}resetTrigger(e){const t=typeof e=="string"?"name":"hash";return this.model?.parameters?.filter(i=>i[t]===e).forEach(i=>i.value=!1)}getTrigger(e){const t=typeof e=="string"?"name":"hash";return this.model?.parameters?.find(i=>i[t]===e)?.value??!1}isInTransition(){return this._activeStates.length>1}setSpeed(e){this._speed=e}_speed=1;FindState(e){return this.findState(e)}findState(e){if(!e)return null;if(Array.isArray(this.model.layers)){for(const t of this.model.layers)for(const i of t.stateMachine.states)if(i.name===e||i.hash==e)return i}return null}getCurrentStateInfo(){if(!this._activeState)return null;const e=this._activeState.motion.action;if(!e)return null;const t=this._activeState.motion.clip.duration,i=t<=0?0:Math.abs(e.time/t);return new Rc(this._activeState,i,t,this._speed)}get currentAction(){return this._activeState&&this._activeState.motion.action||null}normalizedStartOffset=0;animator;model;get context(){return this.animator?.context}get mixer(){return this._mixer}dispose(){if(this._mixer.stopAllAction(),this.animator){this._mixer.uncacheRoot(this.animator.gameObject);for(const e of this._activeStates)e.motion.clip&&this.mixer.uncacheAction(e.motion.clip,this.animator.gameObject)}this.context?.animations.unregisterAnimationMixer(this._mixer)}bind(e){e?this.animator!==e&&(this._mixer&&(this._mixer.stopAllAction(),this.context?.animations.unregisterAnimationMixer(this._mixer)),this.animator=e,this._mixer=new mm(this.animator.gameObject),this.context?.animations.registerAnimationMixer(this._mixer),this.createActions(this.animator)):console.error("AnimatorController.bind: animator is null")}clone(){if(typeof this.model=="string")return console.warn("AnimatorController has not been resolved, can not create model from string",this.model),null;st&&console.warn("AnimatorController clone()",this.model);const e=Ql(this.model,(t,i,n)=>n==null?!0:!(n.type==="Object3D"||n.isObject3D===!0||Kb(n)||n.tracks!==void 0||n instanceof hn));return console.assert(e!==this.model),new hn(e)}update(e){if(!this.animator)return;this.evaluateTransitions(),this.updateActiveStates(e);const t=this.animator.context.time.deltaTime;this.animator.applyRootMotion&&this.rootMotionHandler?.onBeforeUpdate(e),this._mixer.update(t),this.animator.applyRootMotion&&this.rootMotionHandler?.onAfterUpdate(e)}_mixer;_activeState;get activeState(){return this._activeState}constructor(e){this.model=e,st&&console.log(this)}_activeStates=[];updateActiveStates(e){for(let t=0;t<this._activeStates.length;t++){const i=this._activeStates[t],n=i.motion;if(!n.action)this._activeStates.splice(t,1),t--;else{const s=n.action;s.weight=e,s.getEffectiveWeight()<=0&&!s.isRunning()&&(st&&console.debug("REMOVE",i.name,s.getEffectiveWeight(),s.isRunning(),s.isScheduled()),this._activeStates.splice(t,1),t--)}}}setStartTransition(){this.model.layers.length>1&&(st||A())&&console.warn("Multiple layers are not supported yet "+this.animator?.name);for(const e of this.model.layers){const t=e.stateMachine;t.defaultState===void 0&&(st&&console.warn("AnimatorController default state is undefined, will assign state 0 as default",e),t.defaultState=0);const i=t.states[t.defaultState];this.transitionTo(i,0,this.normalizedStartOffset);break}}evaluateTransitions(){let e=!1;if(!this._activeState){if(this.setStartTransition(),!this._activeState)return;e=!0}const t=this._activeState,i=t.motion.action;for(const s of t.transitions){if(!s.hasExitTime&&s.conditions.length<=0)continue;let r=!0;for(const a of s.conditions)if(!this.evaluateCondition(a)){r=!1;break}if(r)if(i){const a=t.motion.clip.duration,l=a<=0?1:Math.abs(i.time/a);let c=s.exitTime;i.timeScale<0&&(c=1-c);let h=!1;if(s.hasExitTime?i.timeScale>0?h=l>=s.exitTime:i.timeScale<0&&(h=1-l>=s.exitTime):h=!0,h){for(const d of s.conditions){const p=this.model.parameters.find(m=>m.name===d.parameter);p?.type===df.Trigger&&p.value&&(p.value=!1)}if(i.clampWhenFinished=!0,st){const d=this.getState(s.destinationState,0);console.log(`Transition to ${s.destinationState} / ${d?.name}`,s,`
|
|
879
|
+
`,i=`Needle Engine \u2014 No license active, commercial use is not allowed. Visit https://needle.tools/pricing for more information and licensing options! v${yn}`;N.Current?.xr?console.log(i):console.log("%c "+i,t)}async function RM(o){if(window.crossOriginIsolated)return;const e=Hn;if(e==="pro"||e==="enterprise"){const t=o?.domElement?.getAttribute("no-telemetry");if(t===""||t==="true"||t==="1"){Pi&&console.debug("Telemetry is disabled");return}Pi&&console.debug("Telemetry attribute: "+t)}try{const t="https://needle-engine-analytics-v2-r26roub2hq-lz.a.run.app";if(t){const i=window.location.href.split("?")[0];let n="api/v2/new/request";t.endsWith("/")||(n="/"+n);const s=Hn,r=`${t}${n}`;Pi&&console.debug("Sending beacon");const a={license:s,url:i,hostname:window.location.hostname,pathname:window.location.pathname,version:yn,generator:Ad,build_time:tg,public_key:Ma},l=navigator.sendBeacon?.(r,JSON.stringify(a));Pi&&console.debug("Sent beacon: "+l)}}catch(t){Pi&&console.log("Failed to send non-commercial usage message to analytics backend",t)}}function cx(o,e){return Oo(o,de.ContextCreated,e),()=>gs(o,de.ContextCreated)}function TM(o,e){return Oo(o,de.ContextClearing,e),()=>gs(o,de.ContextClearing)}function EM(o,e){return Oo(o,de.ContextDestroying,e),()=>gs(o,de.ContextDestroying)}function bu(o,e){return Oo(o,xe.Start,e),()=>gs(o,xe.Start)}function hx(o,e){return Oo(o,xe.Update,e),()=>gs(o,xe.Update)}function AM(o,e){return Oo(o,xe.OnBeforeRender,e),()=>gs(o,xe.OnBeforeRender)}function IM(o,e){return Oo(o,xe.OnAfterRender,e),()=>gs(o,xe.OnAfterRender)}const LM=x("debugdecoders");let lf=null;function dx(){if(!lf){const o=xm(null);lf={dracoLoader:o.dracoLoader,ktx2Loader:o.ktx2Loader,meshoptDecoder:o.meshoptDecoder}}return lf}function ux(o){o!==void 0&&typeof o=="string"&&EC(o)}function px(o){if(o!==void 0&&typeof o=="string"&&o!=="js"){const e=dx();LM&&console.log("Setting draco decoder type to",o),e.dracoLoader.setDecoderConfig({type:o})}}function mx(o){o!==void 0&&typeof o=="string"&&TC(o)}function cf(o,e){const t=dx();return e.renderer?t.ktx2Loader.detectSupport(e.renderer):console.warn("No renderer provided to detect ktx2 support - loading KTX2 textures will probably fail"),MC(o),o.dracoLoader||o.setDRACOLoader(t.dracoLoader),o.ktx2Loader||o.setKTX2Loader(t.ktx2Loader),o.meshoptDecoder||o.setMeshoptDecoder(t.meshoptDecoder),RC(o,{progressive:!0}),o}const Ye=function(o){return u(o)},u=function(o){if(o===void 0&&(o=null),!Array.isArray(o))o=gx(o);else for(let e=0;e<o.length;e++){const t=o[e];o[e]=gx(t)}return function(e,t){if(!e){const n=typeof t=="string"?t:t.name;console.warn(`@serializable without a target at '${n}'.`);return}typeof t!="string"&&(t=t.name),Object.getOwnPropertyDescriptor(e,"$serializedTypes")||(e.$serializedTypes={});const i=e.$serializedTypes=e.$serializedTypes||{};i[t]=o}};function gx(o){switch(o?.prototype?.constructor?.name){case"Number":case"String":case"Boolean":return null}return o}const xs=x("debughotreload");let Oc=!1;const kc=new Map;function jM(){return Oc}function hf(){return globalThis.NEEDLE_HOT_RELOAD_ENABLED===!0}function fx(o){if(Oc){xs&&console.warn("[Needle Engine] Hot reloading is in progress, not registering instance",o);return}xs&&console.log("[Needle Engine] Registering hot reload instance",o);const e=o.constructor.name;kc.has(e)?kc.get(e)?.push(o):kc.set(e,[o])}function yx(o){if(Oc){xs&&console.warn("[Needle Engine] Hot reloading is in progress, not unregistering instance",o);return}xs&&console.log("[Needle Engine] Unregistering hot reload instance",o);const e=o.constructor.name,t=kc.get(e);if(!t)return;const i=t.indexOf(o);i!==-1&&t.splice(i,1)}let bx=!1;function DM(){if(xs||bx)return;bx=!0;const o=console.error;console.error=(...e)=>{if(e.length){const t=e[0];if(typeof t=="string"&&t.includes("[hmr] Failed to reload ")){console.log("[Needle Engine] Hot reloading failed"),window.location.reload();return}}o.apply(console,e)}}function BM(o){xs&&console.log("[HMR] Apply changes",o,Object.keys(o)),DM();for(const e of Object.keys(o))try{Oc=!0;const t=C.get(e);if(!t){xs&&console.log("[HMR] Type not found: "+e);continue}const i=o[e],n=kc.get(i.name);let s="[Needle Engine] Updating type: "+e;const r=n?.length??-1;r>0?s+=" x"+r:s+=" (No instances registered)",console.log(s);const a=Object.getOwnPropertyNames(t.prototype),l=Object.getOwnPropertyDescriptors(i.prototype);for(const c in l)l[c].writable&&(t.prototype[c]=o[e].prototype[c]);for(const c of a)l[c]||delete t.prototype[c];if(n){const c=new i,h=Object.getOwnPropertyDescriptors(c);for(const d of n){const p=d,m=p.isComponent===!0,f=m?p.activeAndEnabled:!0,g=m?p.context:void 0;try{if(m&&g&&ko(p,g),m&&f&&(p.enabled=!1),d.onBeforeHotReloadFields&&d.onBeforeHotReloadFields()===!1)continue;for(const y in h)if(h[y].writable){if(d[y]===void 0)d[y]=c[y];else if(typeof d[y]=="function"&&!d[y].prototype){const _=d[y],v=_.name,P="bound ";if(v===P)continue;const M=_.name.substring(P.length),O=i.prototype[M];O&&(d[y]=O.bind(d))}}d.onAfterHotReloadFields&&d.onAfterHotReloadFields()}finally{m&&g&&Og(p,g),m&&f&&(p.enabled=!0)}}}}catch(t){if(xs)console.error(t);else return!1}finally{Oc=!1,hr(wi.Log,"Script changes applied (HMR)")}return!0}class w extends k{guid;static isDestroyed(e){return Or(e)}static setActive(e,t,i=!0){e&&(xc(e,t),Qd(e),t&&i&&ev(N.Current,e))}static isActiveSelf(e){return Na(e)}static isActiveInHierarchy(e){return Av(e)}static markAsInstancedRendered(e,t){Iv(e,t)}static isUsingInstancing(e){return ou(e)}static foreachComponent(e,t,i=!0){return kr(e,t,i)}static instantiateSynced(e,t){return e?Ig(e,t):null}static instantiate(e,t=null){return"isAssetReference"in e,Wa(e,t)}static destroySynced(e,t,i=!0){if(!e)return;const n=e;t=t??N.Current,gc(n,t.connection,i)}static destroy(e,t=!0){return Ci(e,t)}static add(e,t,i){if(!(!e||!t)){if(e===t){console.warn("Can not add object to self",e);return}i||(i=N.Current),t.add(e),xc(e,!0),Qd(e),i?w.foreachComponent(e,n=>{Og(n,i),!n.__internalDidAwakeAndStart&&i.new_script_start.includes(n)===!1&&i.new_script_start.push(n)},!0):console.warn("Missing context")}}static remove(e){e&&(e.parent?.remove(e),xc(e,!1),Qd(e),w.foreachComponent(e,t=>{_k(t)},!0))}static invokeOnChildren(e,t,...i){this.invoke(e,t,!0,i)}static invoke(e,t,i=!1,...n){e&&this.foreachComponent(e,s=>{const r=s[t];r&&typeof r=="function"&&r?.call(s,...n)},i)}static addNewComponent(e,t,i,n=!0){return wn(e,t,i,{callAwake:n})}static addComponent(e,t,i,n){return wn(e,t,i,n)}static moveComponent(e,t){return wn(e,t)}static removeComponent(e){return Wg(e.gameObject,e),e}static getOrAddComponent(e,t){return yc(e,t)}static getComponent(e,t){return e===null?null:Cr(e,t)}static getComponents(e,t,i=null){return e===null?i??[]:bc(e,t,i)}static findByGuid(e,t){return $g(e,t)}static findObjectOfType(e,t,i=!0){return Ua(e,t??N.Current,i)}static findObjectsOfType(e,t){const i=[];return Ev(e,i,t),i}static getComponentInChildren(e,t){return _c(e,t)}static getComponentsInChildren(e,t,i=null){return za(e,t,i??void 0)}static getComponentInParent(e,t){return vc(e,t)}static getComponentsInParent(e,t,i=null){return tu(e,t,i)}static getAllComponents(e){const t=e.userData?.components;return t?[...t]:[]}static*iterateComponents(e){const t=e?.userData?.components;if(t&&Array.isArray(t))for(let i=0;i<t.length;i++)yield t[i]}}class R{get isComponent(){return!0}__context;get context(){return this.__context??N.Current}set context(e){this.__context=e}get scene(){return this.context.scene}get layer(){return this.gameObject?.userData?.layer}get name(){return this.gameObject?.name?this.gameObject.name:this.gameObject?.userData.name}__name;set name(e){this.gameObject?(this.gameObject.userData||(this.gameObject.userData={}),this.gameObject.userData.name=e,this.__name=e):this.__name=e}get tag(){return this.gameObject?.userData.tag}set tag(e){this.gameObject&&(this.gameObject.userData||(this.gameObject.userData={}),this.gameObject.userData.tag=e)}get static(){return this.gameObject?.userData.static}set static(e){this.gameObject&&(this.gameObject.userData||(this.gameObject.userData={}),this.gameObject.userData.static=e)}get activeAndEnabled(){return!(this.destroyed||this.__isEnabled===!1||!this.__isActiveInHierarchy)}get __isActive(){return this.gameObject.visible}get __isActiveInHierarchy(){if(!this.gameObject)return!1;const e=this.gameObject[So];return e===void 0?!0:e}set __isActiveInHierarchy(e){this.gameObject&&(this.gameObject[So]=e)}gameObject;guid="invalid";sourceId;awake(){}onEnable(){}onDisable(){}onDestroy(){this.__destroyed=!0}startCoroutine(e,t=xe.Update){return this.context.registerCoroutineUpdate(this,e,t)}stopCoroutine(e,t=xe.Update){this.context.unregisterCoroutineUpdate(e,t)}get destroyed(){return this.__destroyed}destroy(){this.__destroyed||this.__internalDestroy()}__didAwake=!1;__didStart=!1;__didEnable=!1;__isEnabled=void 0;__destroyed=!1;get __internalDidAwakeAndStart(){return this.__didAwake&&this.__didStart}constructor(e){this.__didAwake=!1,this.__didStart=!1,this.__didEnable=!1,this.__isEnabled=void 0,this.__destroyed=!1,this._internalInit(e),hf()&&fx(this)}__internalNewInstanceCreated(e){return this.__didAwake=!1,this.__didStart=!1,this.__didEnable=!1,this.__isEnabled=void 0,this.__destroyed=!1,this._internalInit(e),this}_internalInit(e){if(typeof e=="object")for(const t of Object.keys(e)){const i=e[t];typeof i!="function"&&(this[t]=i)}}__internalAwake(){this.__didAwake||(this.__didAwake=!0,this.awake())}__internalStart(){this.__didStart||(this.__didStart=!0,this.start&&this.start())}__internalEnable(e){return this.__destroyed?(A()&&console.warn("[Needle Engine Dev] Trying to enable destroyed component"),!1):this.__didAwake?this.__didEnable?(e!==!0&&(this.__isEnabled=!0),!1):(this.__didEnable=!0,this.__isEnabled=!0,this.onEnable(),!0):!1}__internalDisable(e){if(this.__didAwake){if(!this.__didEnable){e!==!0&&(this.__isEnabled=!1);return}this.__didEnable=!1,this.__isEnabled=!1,this.onDisable()}}__internalDestroy(){this.__destroyed||(this.__destroyed=!0,this.__didAwake&&(this.onDestroy?.call(this),this.dispatchEvent(new CustomEvent("destroyed",{detail:this}))),Mv(this),hf()&&yx(this))}get enabled(){return typeof this.__isEnabled=="boolean"?this.__isEnabled:!0}set enabled(e){if(this.__destroyed){A()&&console.warn(`[Needle Engine Dev] Trying to ${e?"enable":"disable"} destroyed component`);return}if(typeof e=="number"&&(e>=.5?e=!0:e=!1),!this.__didAwake){this.__isEnabled=e;return}e?this.__internalEnable():this.__internalDisable()}get worldPosition(){return K(this.gameObject)}set worldPosition(e){mt(this.gameObject,e)}setWorldPosition(e,t,i){dr(this.gameObject,e,t,i)}get worldQuaternion(){return be(this.gameObject)}set worldQuaternion(e){fn(this.gameObject,e)}setWorldQuaternion(e,t,i,n){qm(this.gameObject,e,t,i,n)}get worldEuler(){return Xm(this.gameObject)}set worldEuler(e){Qm(this.gameObject,e)}get worldRotation(){return this.gameObject.worldRotation}set worldRotation(e){this.setWorldRotation(e.x,e.y,e.z,!0)}setWorldRotation(e,t,i,n=!0){Jl(this.gameObject,e,t,i,n)}static _forward=new b;get forward(){return R._forward.set(0,0,-1).applyQuaternion(this.worldQuaternion)}static _right=new b;get right(){return R._right.set(1,0,0).applyQuaternion(this.worldQuaternion)}static _up=new b;get up(){return R._up.set(0,1,0).applyQuaternion(this.worldQuaternion)}_eventListeners=new Map;addEventListener(e,t){this._eventListeners[e]=this._eventListeners[e]||[],this._eventListeners[e].push(t)}removeEventListener(e,t){if(!this._eventListeners[e])return;const i=this._eventListeners[e].indexOf(t);i>=0&&this._eventListeners[e].splice(i,1)}dispatchEvent(e){if(!e||!this._eventListeners[e.type])return!1;const t=this._eventListeners[e.type];for(let i=0;i<t.length;i++)t[i](e);return!1}}const FM=Object.freeze(Object.defineProperty({__proto__:null,Behaviour:R,Component:R,GameObject:w},Symbol.toStringTag,{value:"Module"}));var zM=Object.defineProperty,_x=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&zM(e,t,n),n};class Mc extends R{from;to;width=0;centered=!0;_centerPos;awake(){this._centerPos=new b}update(){if(!this.from||!this.to)return;const e=K(this.from).clone(),t=K(this.to).clone(),i=e.distanceTo(t);this._centerPos.copy(e),this._centerPos.add(t),this._centerPos.multiplyScalar(.5),mt(this.gameObject,this.centered?this._centerPos:e),this.gameObject.lookAt(K(this.to).clone()),this.gameObject.scale.set(this.width,this.width,i)}}_x([u(w)],Mc.prototype,"from"),_x([u(w)],Mc.prototype,"to");var UM=Object.defineProperty,NM=Object.getOwnPropertyDescriptor,Tr=(o,e,t,i)=>{for(var n=i>1?void 0:i?NM(e,t):e,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=(i?r(e,t,n):r(n))||n);return i&&n&&UM(e,t,n),n};const ws=x("debuganimation");let vx=class{x;y};class Lt extends R{get isAnimationComponent(){return!0}addClip(e){this.animations||(this.animations=[]),this.animations.includes(e)||this.animations.push(e)}playAutomatically=!0;randomStartTime=!0;minMaxSpeed;minMaxOffsetNormalized;loop=!0;clampWhenFinished=!1;get time(){if(this.actions){for(const e of this.actions)if(e.isRunning())return e.time}return 0}set time(e){if(this.actions)for(const t of this.actions)t.time=e}get duration(){if(this.actions){for(const e of this.actions)if(e.isRunning())return e.getClip().duration}return 0}_tempAnimationClipBeforeGameObjectExisted=null;get clip(){return this.animations?.length?this.animations[0]:null}set clip(e){if(!this.__didAwake){ws&&console.warn("Assign clip during serialization",e),this._tempAnimationClipBeforeGameObjectExisted=e;return}e&&(this.gameObject.animations||(this.gameObject.animations=[]),!this.animations.includes(e)&&(this.animations.length>0?this.animations.splice(0,0,e):this.animations.push(e)))}set clips(e){this.animations=e}_tempAnimationsArray;set animations(e){e==null||!Array.isArray(e)||(this.gameObject?this.gameObject.animations=e:this._tempAnimationsArray=e)}get animations(){return this.gameObject?.animations||this._tempAnimationsArray||[]}mixer=void 0;get actions(){return this._actions}set actions(e){this._actions=e}_actions;_handles;awake(){this.mixer=void 0,ws&&console.log("Animation Awake",this.name,this),this._tempAnimationsArray&&(this.animations=this._tempAnimationsArray,this._tempAnimationsArray=void 0),this._tempAnimationClipBeforeGameObjectExisted&&(this.clip=this._tempAnimationClipBeforeGameObjectExisted,this._tempAnimationClipBeforeGameObjectExisted=null),this.actions=[],this._handles=[]}onEnable(){if(this.playAutomatically&&this.animations?.length>0){const e=Math.floor(Math.random()*this.animations.length),t=this.animations[e];this.play(e,{exclusive:!0,fadeDuration:0,startTime:this.randomStartTime?Math.random()*t.duration:0,loop:this.loop,clampWhenFinished:this.clampWhenFinished})}}update(){this.mixer&&(this.mixer.update(this.context.time.deltaTime),this._handles.forEach(e=>e.update()))}onDisable(){this.mixer&&this.mixer.stopAllAction()}onDestroy(){this.context.animations.unregisterAnimationMixer(this.mixer)}getAction(e){return this.actions?.find(t=>t.getClip().name===e)||null}get isPlaying(){if(this.actions){for(let e=0;e<this.actions.length;e++)if(this.actions[e].isRunning())return!0}return!1}stopAll(e){if(this.actions)for(const t of this.actions)e?.fadeDuration?t.fadeOut(e.fadeDuration):t.stop()}stop(e,t){if(e===void 0){this.stopAll();return}else if(typeof e=="number"){if(e>=this.animations.length){ws&&console.log("No animation at index",e);return}e=this.animations[e]}else typeof e=="string"&&(e=this.animations.find(n=>n.name===e));if(!e){console.error("Could not find clip",e);return}const i=this.actions.find(n=>n.getClip()===e);if(!i){console.error("Could not find action",e);return}t?.fadeDuration?i.fadeOut(t.fadeDuration):i.stop()}pause(e,t=!1){if(e===void 0){for(const n of this.actions)n.paused=!t;return}else if(typeof e=="number"){if(e>=this.animations.length){ws&&console.log("No animation at index",e);return}e=this.animations[e]}else typeof e=="string"&&(e=this.animations.find(n=>n.name===e));if(!e){console.error("Could not find clip",e);return}const i=this.actions.find(n=>n.getClip()===e);if(!i){console.error("Could not find action",e);return}i.paused=!t}resume(){for(const e of this.actions)e.paused=!1}play(e=0,t){if(ws&&console.log("PLAY",e),this.ensureMixer(),!this.mixer){ws&&console.warn("Missing mixer",this);return}e===void 0&&(e=0);let i=e;if(typeof e=="number"){if(e>=this.animations.length){ws&&console.log("No animation at index",e);return}i=this.animations[e]}else typeof e=="string"&&(i=this.animations.find(s=>s.name===e));if(!i){console.error("Could not find clip",e);return}t||(t={});for(const s of this.actions)if(s.getClip()===i)return this.internalOnPlay(s,t);if(!i.tracks){console.warn("Clip is no AnimationClip",i);return}const n=this.mixer.clipAction(i);return this.actions.push(n),this.internalOnPlay(n,t)}internalOnPlay(e,t){var i=this.actions.find(s=>s===e);if(i===e&&i.isRunning()&&i.time<i.getClip().duration){const s=this.tryFindHandle(e);if(i.paused&&(i.paused=!1),s)return s.waitForFinish()}if(t.loop===void 0&&(t.loop=this.loop),t.clampWhenFinished===void 0&&(t.clampWhenFinished=this.clampWhenFinished),t.minMaxOffsetNormalized===void 0&&this.randomStartTime&&(t.minMaxOffsetNormalized=this.minMaxOffsetNormalized),t.minMaxSpeed===void 0&&(t.minMaxSpeed=this.minMaxSpeed),t?.exclusive??!0)for(const s of this.actions)s!=i&&(t.fadeDuration?s.fadeOut(t.fadeDuration):s.stop());if(t?.fadeDuration&&e.fadeIn(t.fadeDuration),e.enabled=!0,t?.startTime!=null)e.time=t.startTime;else if(t?.minMaxOffsetNormalized&&t.minMaxOffsetNormalized.x!=0&&t.minMaxOffsetNormalized.y!=0){const s=e.getClip();e.time=j.lerp(t.minMaxOffsetNormalized.x,t.minMaxOffsetNormalized.y,Math.random())*s.duration}else e.time>=e.getClip().duration&&(e.time=0);t?.minMaxSpeed?e.timeScale=j.lerp(t.minMaxSpeed.x,t.minMaxSpeed.y,Math.random()):e.timeScale=t?.speed??1,t?.loop!=null?e.loop=t.loop?MS:pm:e.loop=pm,t?.clampWhenFinished&&(e.clampWhenFinished=!0),e.paused=!1,e.play(),ws&&console.log("PLAY",e.getClip().name,e);const n=new VM(e,this.mixer,t,s=>{this._handles.splice(this._handles.indexOf(n),1)});return this._handles.push(n),n.waitForFinish()}tryFindHandle(e){for(const t of this._handles)if(t.action===e)return t}ensureMixer(){if(!this.mixer){const e="animationMixer";this.gameObject[e]&&(this.mixer=this.gameObject[e]),(!this.mixer||!this.mixer.clipAction)&&(this.mixer=new mm(this.gameObject),this.gameObject[e]=this.mixer)}this.context.animations.registerAnimationMixer(this.mixer)}}Tr([u()],Lt.prototype,"playAutomatically",2),Tr([u()],Lt.prototype,"randomStartTime",2),Tr([u(vx)],Lt.prototype,"minMaxSpeed",2),Tr([u(vx)],Lt.prototype,"minMaxOffsetNormalized",2),Tr([u()],Lt.prototype,"loop",2),Tr([u()],Lt.prototype,"clampWhenFinished",2),Tr([u(Wi)],Lt.prototype,"clips",1);class VM{mixer;action;promise=null;_options;_resolveCallback=null;_resolvedOrRejectedCallback;constructor(e,t,i,n){this.action=e,this.mixer=t,this._resolvedOrRejectedCallback=n,this._options=i}waitForFinish(){return this.promise?this.promise:(this.promise=new Promise(e=>{this._resolveCallback=e}),this.mixer.addEventListener("finished",this.onFinished),this.promise)}update(){this._options&&this._options.endTime!==void 0&&this.action.time>this._options.endTime&&(this._options.loop===!0?this.action.time=this._options.startTime??0:(this.action.time=this._options.endTime,this.action.timeScale=0,this.onResolve()))}onResolve(){this.dispose(),this._resolvedOrRejectedCallback?.call(this,this),this._resolveCallback?.call(this,this.action)}onFinished=e=>{e.action===this.action&&this.onResolve()};dispose(){this.mixer.removeEventListener("finished",this.onFinished)}}const _u=Symbol("objectIsAnimatedData");function xx(o,e,t){if(!o)return;if(o[_u]===void 0){if(!t)return;o[_u]=new Set}const i=o[_u];t?i.add(e):i.has(e)&&i.delete(e)}function WM(o){if(!o)return!1;const e=o[_u];return e!==void 0&&e.size>0}class $M{_context;get context(){return this._context??N.Current}get isStateMachineBehaviour(){return!0}}class Rc{name;nameHash;normalizedTime;length;speed;action;hasTransitions;constructor(e,t,i,n){this.name=e.name,this.nameHash=e.hash,this.normalizedTime=t,this.length=i,this.speed=n,this.action=e.motion.action||null,this.hasTransitions=e.transitions?.length>0||!1}}function wx(o,e){return{name:"Empty",isLooping:!1,guid:e?.generateUUID()??yo.generateUUID(),index:-1,clip:new Wi(o,0,[])}}var Ss=(o=>(o[o.If=1]="If",o[o.IfNot=2]="IfNot",o[o.Greater=3]="Greater",o[o.Less=4]="Less",o[o.Equals=6]="Equals",o[o.NotEqual=7]="NotEqual",o))(Ss||{}),df=(o=>(o[o.Float=1]="Float",o[o.Int=3]="Int",o[o.Bool=4]="Bool",o[o.Trigger=9]="Trigger",o))(df||{});const st=x("debuganimatorcontroller"),vu=x("debugrootmotion");class hn{static createFromClips(e,t={looping:!1,autoTransition:!0,transitionDuration:0}){const i=[];for(let s=0;s<e.length;s++){const r=e[s],a=[];if(t.autoTransition!==!1){const c=t.transitionDuration??0,h=c/r.duration;let d=s;(t.autoTransition===void 0||t.autoTransition===!0)&&(d=(s+1)%e.length),a.push({exitTime:1-h,offset:0,duration:c,hasExitTime:!0,destinationState:d,conditions:[]})}const l={name:r.name,hash:s,motion:{name:r.name,clip:r,isLooping:t?.looping??!1},transitions:a,behaviours:[]};i.push(l)}const n={name:"AnimatorController",guid:new At(Date.now()).generateUUID(),parameters:[],layers:[{name:"Base Layer",stateMachine:{defaultState:0,states:i}}]};return new hn(n)}play(e,t=-1,i=Number.NEGATIVE_INFINITY,n=0){if(t<0)t=0;else if(t>=this.model.layers.length){console.warn("invalid layer");return}const s=this.model.layers[t].stateMachine;for(const r of s.states)if(r.name===e||r.hash===e){st&&console.log("transition to ",r),this.transitionTo(r,n,i);return}console.warn("Could not find "+e+" to play")}reset(){this.setStartTransition()}setBool(e,t){const i=typeof e=="string"?"name":"hash";return this.model?.parameters?.filter(n=>n[i]===e).forEach(n=>n.value=t)}getBool(e){const t=typeof e=="string"?"name":"hash";return this.model?.parameters?.find(i=>i[t]===e)?.value??!1}setFloat(e,t){const i=typeof e=="string"?"name":"hash",n=this.model?.parameters?.filter(s=>s[i]===e);return n.forEach(s=>s.value=t),n?.length>0}getFloat(e){const t=typeof e=="string"?"name":"hash";return this.model?.parameters?.find(i=>i[t]===e)?.value??0}setInteger(e,t){const i=typeof e=="string"?"name":"hash";return this.model?.parameters?.filter(n=>n[i]===e).forEach(n=>n.value=t)}getInteger(e){const t=typeof e=="string"?"name":"hash";return this.model?.parameters?.find(i=>i[t]===e)?.value??0}setTrigger(e){st&&console.log("SET TRIGGER",e);const t=typeof e=="string"?"name":"hash";return this.model?.parameters?.filter(i=>i[t]===e).forEach(i=>i.value=!0)}resetTrigger(e){const t=typeof e=="string"?"name":"hash";return this.model?.parameters?.filter(i=>i[t]===e).forEach(i=>i.value=!1)}getTrigger(e){const t=typeof e=="string"?"name":"hash";return this.model?.parameters?.find(i=>i[t]===e)?.value??!1}isInTransition(){return this._activeStates.length>1}setSpeed(e){this._speed=e}_speed=1;FindState(e){return this.findState(e)}findState(e){if(!e)return null;if(Array.isArray(this.model.layers)){for(const t of this.model.layers)for(const i of t.stateMachine.states)if(i.name===e||i.hash==e)return i}return null}getCurrentStateInfo(){if(!this._activeState)return null;const e=this._activeState.motion.action;if(!e)return null;const t=this._activeState.motion.clip.duration,i=t<=0?0:Math.abs(e.time/t);return new Rc(this._activeState,i,t,this._speed)}get currentAction(){return this._activeState&&this._activeState.motion.action||null}normalizedStartOffset=0;animator;model;get context(){return this.animator?.context}get mixer(){return this._mixer}dispose(){if(this._mixer.stopAllAction(),this.animator){this._mixer.uncacheRoot(this.animator.gameObject);for(const e of this._activeStates)e.motion.clip&&this.mixer.uncacheAction(e.motion.clip,this.animator.gameObject)}this.context?.animations.unregisterAnimationMixer(this._mixer)}bind(e){e?this.animator!==e&&(this._mixer&&(this._mixer.stopAllAction(),this.context?.animations.unregisterAnimationMixer(this._mixer)),this.animator=e,this._mixer=new mm(this.animator.gameObject),this.context?.animations.registerAnimationMixer(this._mixer),this.createActions(this.animator)):console.error("AnimatorController.bind: animator is null")}clone(){if(typeof this.model=="string")return console.warn("AnimatorController has not been resolved, can not create model from string",this.model),null;st&&console.warn("AnimatorController clone()",this.model);const e=Ql(this.model,(t,i,n)=>n==null?!0:!(n.type==="Object3D"||n.isObject3D===!0||Kb(n)||n.tracks!==void 0||n instanceof hn));return console.assert(e!==this.model),new hn(e)}update(e){if(!this.animator)return;this.evaluateTransitions(),this.updateActiveStates(e);const t=this.animator.context.time.deltaTime;this.animator.applyRootMotion&&this.rootMotionHandler?.onBeforeUpdate(e),this._mixer.update(t),this.animator.applyRootMotion&&this.rootMotionHandler?.onAfterUpdate(e)}_mixer;_activeState;get activeState(){return this._activeState}constructor(e){this.model=e,st&&console.log(this)}_activeStates=[];updateActiveStates(e){for(let t=0;t<this._activeStates.length;t++){const i=this._activeStates[t],n=i.motion;if(!n.action)this._activeStates.splice(t,1),t--;else{const s=n.action;s.weight=e,s.getEffectiveWeight()<=0&&!s.isRunning()&&(st&&console.debug("REMOVE",i.name,s.getEffectiveWeight(),s.isRunning(),s.isScheduled()),this._activeStates.splice(t,1),t--)}}}setStartTransition(){this.model.layers.length>1&&(st||A())&&console.warn("Multiple layers are not supported yet "+this.animator?.name);for(const e of this.model.layers){const t=e.stateMachine;t.defaultState===void 0&&(st&&console.warn("AnimatorController default state is undefined, will assign state 0 as default",e),t.defaultState=0);const i=t.states[t.defaultState];this.transitionTo(i,0,this.normalizedStartOffset);break}}evaluateTransitions(){let e=!1;if(!this._activeState){if(this.setStartTransition(),!this._activeState)return;e=!0}const t=this._activeState,i=t.motion.action;for(const s of t.transitions){if(!s.hasExitTime&&s.conditions.length<=0)continue;let r=!0;for(const a of s.conditions)if(!this.evaluateCondition(a)){r=!1;break}if(r)if(i){const a=t.motion.clip.duration,l=a<=0?1:Math.abs(i.time/a);let c=s.exitTime;i.timeScale<0&&(c=1-c);let h=!1;if(s.hasExitTime?i.timeScale>0?h=l>=s.exitTime:i.timeScale<0&&(h=1-l>=s.exitTime):h=!0,h){for(const d of s.conditions){const p=this.model.parameters.find(m=>m.name===d.parameter);p?.type===df.Trigger&&p.value&&(p.value=!1)}if(i.clampWhenFinished=!0,st){const d=this.getState(s.destinationState,0);console.log(`Transition to ${s.destinationState} / ${d?.name}`,s,`
|
|
880
880
|
Timescale: `+i.timeScale,`
|
|
881
881
|
Normalized time: `+l.toFixed(3),`
|
|
882
882
|
Exit Time: `+c,s.hasExitTime)}this.transitionTo(s.destinationState,s.duration,s.offset);return}}else{this.transitionTo(s.destinationState,s.duration,s.offset);return}}i&&this.setTimescale(i,t);let n=!1;if(t.motion.isLooping&&i&&(i.time>=i.getClip().duration?(n=!0,i.reset(),i.time=0,i.play()):i.time<=0&&i.timeScale<0&&(n=!0,i.reset(),i.time=i.getClip().duration,i.play())),!n&&t&&!e&&i&&this.animator&&t.behaviours){const s=i?.getClip().duration,r=i.time/s,a=new Rc(this._activeState,r,s,this._speed);for(const l of t.behaviours)l.instance&&l.instance.onStateUpdate?.call(l.instance,this.animator,a,0)}}setTimescale(e,t){let i=t.speed??1;t.speedParameter&&(i*=this.getFloat(t.speedParameter)),i!==void 0&&(e.timeScale=i*this._speed)}getState(e,t){return typeof e=="number"&&(e==-1&&(e=this.model.layers[t].stateMachine.defaultState,e===void 0&&(st&&console.warn("AnimatorController default state is undefined: ",this.model,"Layer: "+t),e=0)),e=this.model.layers[t].stateMachine.states[e]),e}_heldActions=[];releaseHeldActions(e){for(const t of this._heldActions)t.fadeOut(e);this._heldActions.length=0}transitionTo(e,t,i){if(!this.animator)return;const n=0;if(e=this.getState(e,n),!e?.motion||!e.motion.clip||!(e.motion.clip instanceof Wi))return;const s=this._activeState===e;if(s){const h=e.motion;if(!h.action_loopback&&h.clip){const d=this.rootMotionHandler?this.animator.gameObject.matrix.clone():null;this._mixer.uncacheAction(h.clip,this.animator.gameObject),d&&d.decompose(this.animator.gameObject.position,this.animator.gameObject.quaternion,this.animator.gameObject.scale),h.action_loopback=this.createAction(h.clip)}}if(this._activeState?.behaviours&&this._activeState.motion.action){const h=this._activeState?.motion.clip.duration,d=this._activeState.motion.action.time/h,p=new Rc(this._activeState,d,h,this._speed);for(const m of this._activeState.behaviours)m.instance?.onStateExit?.call(m.instance,this.animator,p,n)}const r=this._activeState?.motion.action;s&&(e.motion.action=e.motion.action_loopback,e.motion.action_loopback=r);const a=this._activeState;this._activeState=e;const l=e.motion?.action,c=e.motion.clip;if(c?.duration<=0&&c.tracks.length<=0?r&&this._heldActions.push(r):r&&(r.fadeOut(t),this.releaseHeldActions(t)),l){if(i=Math.max(0,Math.min(1,i)),e.cycleOffsetParameter){let d=this.getFloat(e.cycleOffsetParameter);typeof d=="number"?(d<0&&(d+=1),i+=d,i%=1):st&&console.warn("AnimatorController cycle offset parameter is not a number",e.cycleOffsetParameter)}else typeof e.cycleOffset=="number"&&(i+=e.cycleOffset,i%=1);l.isRunning()&&l.stop(),l.reset(),l.enabled=!0,this.setTimescale(l,e);const h=e.motion.clip.duration;if(l.time=s?0:i*h,l.timeScale<0&&(l.time=h-l.time),l.clampWhenFinished=!0,l.setLoop(pm,0),t>0?l.fadeIn(t):l.weight=1,l.play(),this.rootMotionHandler&&this.rootMotionHandler.onStart(l),this._activeStates.includes(e)||this._activeStates.push(e),this._activeState.behaviours){const d=new Rc(e,i,h,this._speed);for(const p of this._activeState.behaviours)p.instance?.onStateEnter?.call(p.instance,this.animator,d,n)}}else st&&(e.__warned_no_motion||(e.__warned_no_motion=!0,console.warn("No action",e.motion,this)));st&&console.log("TRANSITION FROM "+a?.name+" TO "+e.name,t,r,l,l?.getEffectiveTimeScale(),l?.getEffectiveWeight(),l?.isRunning(),l?.isScheduled(),l?.paused)}createAction(e){if(this._mixer.existingAction(e)&&this._mixer.uncacheAction(e,this.animator?.gameObject),this.animator?.applyRootMotion){this.rootMotionHandler||(this.rootMotionHandler=new HM(this));const t=this.animator.gameObject;return this.rootMotionHandler.createClip(this._mixer,t,e)}else return this._mixer.clipAction(e)}evaluateCondition(e){const t=this.model.parameters.find(i=>i.name===e.parameter);if(!t)return!1;switch(e.mode){case Ss.If:return t.value===!0;case Ss.IfNot:return t.value===!1;case Ss.Greater:return t.value>e.threshold;case Ss.Less:return t.value<e.threshold;case Ss.Equals:return t.value===e.threshold;case Ss.NotEqual:return t.value!==e.threshold}return!1}createActions(e){st&&console.log("AnimatorController createActions",this.model);for(const t of this.model.layers){const i=t.stateMachine;for(let n=0;n<i.states.length;n++){const s=i.states[n];s.transitions||(s.transitions=[]);for(const r of s.transitions)r.conditions||(r.conditions=[]);if(s.motion||(st&&console.warn("No motion",s),s.motion=wx(s.name)),this.animator&&s.motion.clips){const r=s.motion.clips?.find(a=>a.node.name===this.animator?.gameObject?.name);r?s.motion.clip=r.clip:(st||A())&&console.warn('Could not find clip for animator "'+this.animator?.gameObject?.name+'"',s.motion.clips.map(a=>a.node.name))}if(!s.motion.clip){st&&console.warn("No clip assigned to state",s);const r=new Wi(void 0,void 0,[]);s.motion.clip=r}if(s.motion?.clip){const r=s.motion.clip;if(r instanceof Wi){const a=this.createAction(r);s.motion.action=a}else(st||A())&&console.warn("No valid animationclip assigned",s)}if(s.behaviours&&Array.isArray(s.behaviours))for(const r of s.behaviours){if(!r?.typeName)continue;const a=C.get(r.typeName);if(a){const l=new a;l.isStateMachineBehaviour&&(l._context=this.context??void 0,Fa(l,r.properties),r.instance=l),st&&console.log("Created animator controller behaviour",s.name,r.typeName,r.properties,l)}else(st||A())&&console.warn("Could not find AnimatorBehaviour type: "+r.typeName)}}}}*enumerateActions(){if(this.model.layers)for(const e of this.model.layers){const t=e.stateMachine;for(let i=0;i<t.states.length;i++){const n=t.states[i];n?.motion&&(n.motion.action&&(yield n.motion.action),n.motion.action_loopback&&(yield n.motion.action_loopback))}}}rootMotionHandler}class Sx{track;createdInterpolant;originalEvaluate;customEvaluate;constructor(e,t){this.track=e;const i=e,n=i.createInterpolant.bind(e);i.createInterpolant=()=>(i.createInterpolant=n,this.createdInterpolant=n(),this.originalEvaluate=this.createdInterpolant.evaluate.bind(this.createdInterpolant),this.customEvaluate=s=>{if(!this.originalEvaluate)return;const r=this.originalEvaluate(s);return t(s,r)},this.createdInterpolant.evaluate=this.customEvaluate,this.createdInterpolant)}dispose(){this.createdInterpolant&&this.originalEvaluate&&(this.createdInterpolant.evaluate=this.originalEvaluate),this.track=void 0,this.createdInterpolant=null,this.originalEvaluate=void 0,this.customEvaluate=void 0}}class dt{static lastObjPosition={};static lastObjRotation={};static firstKeyframeRotation={};static spaceRotation={};static effectiveSpaceRotation={};static clipOffsetRotation={};set action(e){this._action=e}get action(){return this._action}get cacheId(){return this.root.uuid}_action;root;clip;positionWrapper=null;rotationWrapper=null;context;positionChange=new b;rotationChange=new U;constructor(e,t,i,n,s){if(this.context=e,this.root=t,this.clip=i,dt.firstKeyframeRotation[this.cacheId]||(dt.firstKeyframeRotation[this.cacheId]=new U),s){const r=s.values;dt.firstKeyframeRotation[this.cacheId].set(r[0],r[1],r[2],r[3])}dt.spaceRotation[this.cacheId]||(dt.spaceRotation[this.cacheId]=new U),dt.effectiveSpaceRotation[this.cacheId]||(dt.effectiveSpaceRotation[this.cacheId]=new U),dt.clipOffsetRotation[this.cacheId]=new U,s&&dt.clipOffsetRotation[this.cacheId].set(s.values[0],s.values[1],s.values[2],s.values[3]).invert(),this.handlePosition(i,n),this.handleRotation(i,s)}onStart(e){if(e.getClip()!==this.clip)return;dt.lastObjRotation[this.cacheId]||(dt.lastObjRotation[this.cacheId]=this.root.quaternion.clone());const t=dt.lastObjRotation[this.cacheId];if(dt.spaceRotation[this.cacheId].copy(t),vu){const i=new nt().setFromQuaternion(t);console.log("START",this.clip.name,j.toDegrees(i.y),this.root.position.z)}}getClipRotationOffset(){return dt.clipOffsetRotation[this.cacheId]}_prevTime=0;handlePosition(e,t){if(t){const i=this.root;vu&&i.add(new _i),dt.lastObjPosition[this.cacheId]||(dt.lastObjPosition[this.cacheId]=this.root.position.clone());const n=new b,s=new b;this.positionWrapper=new Sx(t,(r,a)=>{const l=this.action.getEffectiveWeight();return vu&&i.position.length()>8&&i.position.set(0,i.position.y,0),r>this._prevTime&&(n.set(a[0],a[1],a[2]),n.sub(s),n.multiplyScalar(l),n.applyQuaternion(this.getClipRotationOffset()),n.applyQuaternion(i.quaternion),this.positionChange.copy(n)),s.fromArray(a),this._prevTime=r,a[0]=0,a[1]=0,a[2]=0,a})}}static identityQuaternion=new U;handleRotation(e,t){if(t){if(vu){const r=t.values,a=new nt().setFromQuaternion(new U(r[0],r[1],r[2],r[3]));console.log(e.name,t.name,"FIRST ROTATION IN TRACK",j.toDegrees(a.y));const l=t.values.length-4,c=new U().set(r[l],r[l+1],r[l+2],r[l+3]),h=new nt().setFromQuaternion(c);console.log(e.name,t.name,"LAST ROTATION IN TRACK",j.toDegrees(h.y))}let i=0;const n=new U,s=new U;this.rotationWrapper=new Sx(t,(r,a)=>(r>i&&(s.set(a[0],a[1],a[2],a[3]),n.invert(),s.multiply(n),this.rotationChange.copy(s)),n.fromArray(a),i=r,a[0]=0,a[1]=0,a[2]=0,a[3]=1,a))}}onBeforeUpdate(e){this.positionChange.set(0,0,0),this.rotationChange.set(0,0,0,1)}onAfterUpdate(e){return!this.action||(e*=this.action.getEffectiveWeight(),e<=0)?!1:(this.positionChange.multiplyScalar(e),this.rotationChange.slerp(dt.identityQuaternion,1-e),!0)}}class HM{controller;handler=[];root;basePosition=new b;baseQuaternion=new U;baseRotation=new nt;constructor(e){this.controller=e}createClip(e,t,i){this.root=t,t&&"name"in t&&t.name;const n=this.findRootTrack(i,".position"),s=this.findRootTrack(i,".quaternion"),r=new dt(this.controller.context,t,i,n,s);this.handler.push(r);const a=e.clipAction(i);return r.action=a,a}onStart(e){for(const t of this.handler)t.onStart(e)}onBeforeUpdate(e){this.basePosition.copy(this.root.position),this.baseQuaternion.copy(this.root.quaternion);for(const t of this.handler)t.onBeforeUpdate(e)}summedPosition=new b;summedRotation=new U;onAfterUpdate(e){if(!(e<=0)){this.root.position.copy(this.basePosition),this.root.quaternion.copy(this.baseQuaternion),this.summedPosition.set(0,0,0),this.summedRotation.set(0,0,0,1);for(const t of this.handler)t.onAfterUpdate(e)&&(this.summedPosition.add(t.positionChange),this.summedRotation.multiply(t.rotationChange));this.root.position.add(this.summedPosition),this.root.quaternion.multiply(this.summedRotation)}}findRootTrack(e,t){const i=e.tracks;if(!i)return null;for(const n of i)if(n.name.endsWith(t))return n;return null}}class GM extends Yi{onSerialize(e,t){}onDeserialize(e,t){if(t.type===hn&&e?.__type==="AnimatorController")return new hn(e)}}new GM(hn);var qM=Object.defineProperty,XM=Object.getOwnPropertyDescriptor,xu=(o,e,t,i)=>{for(var n=i>1?void 0:i?XM(e,t):e,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=(i?r(e,t,n):r(n))||n);return i&&n&&qM(e,t,n),n};const Zi=x("debuganimator");class ft extends R{get isAnimationComponent(){return!0}applyRootMotion=!1;hasRootMotion=!1;keepAnimatorControllerStateOnDisable=!1;set runtimeAnimatorController(e){this._animatorController&&this._animatorController.model===e||(e?e instanceof hn?(e.animator&&e.animator!==this&&(console.warn("AnimatorController can not be bound to multiple animators",e.model?.name),e.model||console.error("AnimatorController has no model"),e=new hn(e.model)),this._animatorController=e,this._animatorController.bind(this)):(Zi&&console.log("Assign animator controller",e,this),this._animatorController=new hn(e),this.__didAwake&&this._animatorController.bind(this)):this._animatorController=null)}get runtimeAnimatorController(){return this._animatorController}getCurrentStateInfo(){return this.runtimeAnimatorController?.getCurrentStateInfo()}get currentAction(){return this.runtimeAnimatorController?.currentAction||null}get parametersAreDirty(){return this._parametersAreDirty}_parametersAreDirty=!1;get isDirty(){return this._isDirty}_isDirty=!1;Play(e,t=-1,i=Number.NEGATIVE_INFINITY,n=0){this.play(e,t,i,n)}play(e,t=-1,i=Number.NEGATIVE_INFINITY,n=0){this.runtimeAnimatorController?.play(e,t,i,n),this._isDirty=!0}Reset(){this.reset()}reset(){this._animatorController?.reset(),this._isDirty=!0}SetBool(e,t){this.setBool(e,t)}setBool(e,t){Zi&&console.log("setBool",e,t),this.runtimeAnimatorController?.getBool(e)!==t&&(this._parametersAreDirty=!0),this.runtimeAnimatorController?.setBool(e,t)}GetBool(e){return this.getBool(e)}getBool(e){const t=this.runtimeAnimatorController?.getBool(e)??!1;return Zi&&console.log("getBool",e,t),t}toggleBool(e){this.setBool(e,!this.getBool(e))}SetFloat(e,t){this.setFloat(e,t)}setFloat(e,t){this.runtimeAnimatorController?.getFloat(e)!==t&&(this._parametersAreDirty=!0),Zi&&console.log("setFloat",e,t),this.runtimeAnimatorController?.setFloat(e,t)}GetFloat(e){return this.getFloat(e)}getFloat(e){const t=this.runtimeAnimatorController?.getFloat(e)??-1;return Zi&&console.log("getFloat",e,t),t}SetInteger(e,t){this.setInteger(e,t)}setInteger(e,t){this.runtimeAnimatorController?.getInteger(e)!==t&&(this._parametersAreDirty=!0),Zi&&console.log("setInteger",e,t),this.runtimeAnimatorController?.setInteger(e,t)}GetInteger(e){return this.getInteger(e)}getInteger(e){const t=this.runtimeAnimatorController?.getInteger(e)??-1;return Zi&&console.log("getInteger",e,t),t}SetTrigger(e){this.setTrigger(e)}setTrigger(e){this._parametersAreDirty=!0,Zi&&console.log("setTrigger",e),this.runtimeAnimatorController?.setTrigger(e)}ResetTrigger(e){this.resetTrigger(e)}resetTrigger(e){this._parametersAreDirty=!0,Zi&&console.log("resetTrigger",e),this.runtimeAnimatorController?.resetTrigger(e)}GetTrigger(e){this.getTrigger(e)}getTrigger(e){const t=this.runtimeAnimatorController?.getTrigger(e);return Zi&&console.log("getTrigger",e,t),t}IsInTransition(){return this.isInTransition()}isInTransition(){return this.runtimeAnimatorController?.isInTransition()??!1}SetSpeed(e){return this.setSpeed(e)}setSpeed(e){e!==this._speed&&(Zi&&console.log("setSpeed",e),this._speed=e,this._animatorController?.animator==this&&this._animatorController.setSpeed(e))}set minMaxSpeed(e){this._speed=j.lerp(e.x,e.y,Math.random()),this._animatorController?.animator==this&&this._animatorController.setSpeed(this._speed)}set minMaxOffsetNormalized(e){this._normalizedStartOffset=j.lerp(e.x,e.y,Math.random()),this.runtimeAnimatorController?.animator==this&&(this.runtimeAnimatorController.normalizedStartOffset=this._normalizedStartOffset)}_speed=1;_normalizedStartOffset=0;_animatorController=null;awake(){Zi&&console.log("ANIMATOR",this.name,this),this.gameObject&&this.initializeRuntimeAnimatorController()}_initializeWithRuntimeAnimatorController;initializeRuntimeAnimatorController(e=!1){const t=e||this.runtimeAnimatorController!==this._initializeWithRuntimeAnimatorController;if(this.runtimeAnimatorController&&t){const i=this.runtimeAnimatorController.clone();this._initializeWithRuntimeAnimatorController=i,i?(console.assert(this.runtimeAnimatorController!==i),this.runtimeAnimatorController=i,console.assert(this.runtimeAnimatorController===i),this.runtimeAnimatorController.bind(this),this.runtimeAnimatorController.setSpeed(this._speed),this.runtimeAnimatorController.normalizedStartOffset=this._normalizedStartOffset):console.warn("Could not clone animator controller",this.runtimeAnimatorController)}}onDisable(){this.keepAnimatorControllerStateOnDisable||this._animatorController?.reset()}onBeforeRender(){this._isDirty=!1,this._parametersAreDirty=!1,!WM(this.gameObject)&&this._animatorController&&this._animatorController.update(1)}}xu([u()],ft.prototype,"applyRootMotion",2),xu([u()],ft.prototype,"hasRootMotion",2),xu([u()],ft.prototype,"keepAnimatorControllerStateOnDisable",2),xu([u()],ft.prototype,"runtimeAnimatorController",1);const Cx=Symbol("previous-visibility");class fo extends zn{render(e,t,i){if("addPass"in i)this._unsupported_effectcomposer_warning||(console.warn("RenderTexture.render() does not yet support EffectComposer"),this._unsupported_effectcomposer_warning=!0);else if(i instanceof rr){this.onBeforeRender();const n=i.getRenderTarget(),s=i.xr.enabled;i.xr.enabled=!1,i.setRenderTarget(this),i.clear(!0,!0,!0),i.render(e,t),i.setRenderTarget(n),i.xr.enabled=s,this.onAfterRender()}}static _userSet=new Set;onBeforeRender(){fo._userSet.clear();const e=Sg(this.texture,!0,null,fo._userSet);for(const t of e)t instanceof H&&(t[Cx]=t.visible,t.visible=!1)}onAfterRender(){for(const e of fo._userSet)e instanceof H&&(e.visible=e[Cx]);fo._userSet.clear()}}var QM=Object.defineProperty,YM=Object.getOwnPropertyDescriptor,Tc=(o,e,t,i)=>{for(var n=i>1?void 0:i?YM(e,t):e,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=(i?r(e,t,n):r(n))||n);return i&&n&&QM(e,t,n),n};const wu=x("debuggroundprojection");class qn extends R{applyOnAwake=!1;autoFit=!0;set radius(e){this._radius=e,this._projection&&this.updateProjection()}get radius(){return this._radius}_radius=50;set height(e){this._height=e,this._projection&&this.updateProjection()}get height(){return this._height}_height=3;set arBlending(e){this._arblending=e,this._needsTextureUpdate=!0}get arBlending(){return this._arblending}_arblending=0;_lastBackground;_lastRadius;_lastHeight;_projection;_watcher;awake(){this.applyOnAwake&&this.updateAndCreate()}onEnable(){this.context.time.frameCount>0&&this.applyOnAwake&&this.updateAndCreate(),this._watcher||(this._watcher=new is(this.context.scene,"background"),this._watcher.subscribeWrite(e=>{wu&&console.log("Background changed",this.context.scene.background),this._needsTextureUpdate=!0}))}onDisable(){this._watcher?.revoke(),this._projection?.removeFromParent()}onEnterXR(){this.activeAndEnabled&&(this._needsTextureUpdate=!0,this.updateProjection())}async onLeaveXR(){this.activeAndEnabled&&(await Yl(1),this.updateProjection())}onBeforeRender(){this._projection&&this.scene.backgroundRotation&&this._projection.rotation.copy(this.scene.backgroundRotation),this.context.scene.backgroundBlurriness!==void 0&&this._lastBlurriness!=this.context.scene.backgroundBlurriness&&this.context.scene.backgroundBlurriness>.001?this.updateProjection():this._needsTextureUpdate&&this.context.scene.background instanceof Re&&this.updateBlurriness(this.context.scene.background,this.context.scene.backgroundBlurriness)}updateAndCreate(){this.updateProjection(),this._watcher?.apply()}_needsTextureUpdate=!1;updateProjection(){if(!this.context.scene.background){this._projection?.removeFromParent();return}const e=this.context.scene.background;if(!(e instanceof Re)){this._projection?.removeFromParent();return}if((this.context.xr?.isPassThrough||this.context.xr?.isAR)&&this.arBlending===0){this._projection?.removeFromParent();return}if(!this.gameObject||this.destroyed)return;let t=!0;const i=0,n=e!==this._lastBackground||this._height!==this._lastHeight||this._radius!==this._lastRadius;if(!this._projection||n){wu&&console.log("Create/Update Ground Projection",e.name),this._projection?.removeFromParent();try{this._projection=new Ca(e,this._height,this._radius,64)}catch(s){console.error("Error creating three GroundProjection",s);return}this._projection.position.y=this._height-i,this._projection.name="GroundProjection",Ym(this._projection,!1)}else t=!1;if(this._projection.parent||this.gameObject.add(this._projection),this.autoFit&&t){this._projection.updateWorldMatrix(!0,!0);const s=$t(this.context.scene.children,[this._projection]),r=s.min.y;if(r<1/0){const a=z();a.x=s.min.x+(s.max.x-s.min.x)*.5;const l=He(this.gameObject).x;a.y=r+this._height*l-i,a.z=s.min.z+(s.max.z-s.min.z)*.5,mt(this._projection,a)}wu&&F.DrawWireBox3(s,65280,5)}this.context.scene.backgroundBlurriness>.001&&this._needsTextureUpdate&&this.updateBlurriness(e,this.context.scene.backgroundBlurriness),this._lastBackground=e,this._lastHeight=this._height,this._lastRadius=this._radius,this._needsTextureUpdate=!1}_blurrynessShader=null;_lastBlurriness=-1;updateBlurriness(e,t){if(this._projection){if(!e)return}else return;this._needsTextureUpdate=!1,wu&&console.log("Update Blurriness",t),this._blurrynessShader??=new Fn({name:"GroundProjectionBlurriness",uniforms:{map:{value:e},blurriness:{value:t},blending:{value:0},alphaFactor:{value:1}},vertexShader:ZM,fragmentShader:KM}),this._blurrynessShader.depthWrite=!1,this._blurrynessShader.uniforms.map.value=e,this._blurrynessShader.uniforms.blurriness.value=t,this._lastBlurriness=t,e.needsUpdate=!0;const i=this._projection.material.transparent;this._projection.material.transparent=(this.context.xr?.isAR===!0&&this.arBlending>1e-6)??!1,this._projection.material.transparent?this._blurrynessShader.uniforms.blending.value=this.arBlending:this._blurrynessShader.uniforms.blending.value=0,this.context.isInPassThrough?this._blurrynessShader.uniforms.alphaFactor.value=.95:this._blurrynessShader.uniforms.alphaFactor.value=1,i!==this._projection.material.transparent&&(this._projection.material.needsUpdate=!0),this._projection.material.map=ir.copyTexture(e,this._blurrynessShader),this._projection.material.depthTest=!0,this._projection.material.depthWrite=!1}}Tc([u()],qn.prototype,"applyOnAwake",2),Tc([u()],qn.prototype,"autoFit",2),Tc([u()],qn.prototype,"radius",1),Tc([u()],qn.prototype,"height",1),Tc([u()],qn.prototype,"arBlending",1);const ZM=`
|
|
@@ -987,7 +987,7 @@ Consider registering a custom loader via the 'onCreateCustomModelLoader' callbac
|
|
|
987
987
|
Content-Type: "${t.headers.get("content-type")}
|
|
988
988
|
"Text: "${s}"
|
|
989
989
|
Binary:`,i)}else console.debug("Could not determine file type from binary data");return"unknown"}var eT=Object.defineProperty,el=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&eT(e,t,n),n};const Ri=x("debugdroplistener");class tT extends CustomEvent{constructor(e){super("object-added",{detail:e})}}const iT="blob";class jo extends R{dropArea;fitIntoVolume=!1;fitVolumeSize=new b(1,1,1);placeAtHitPosition=!0;useNetworking=!1;onDropped=new he;loadFromURL(e,t){return this.addFromUrl(e,{screenposition:new J,point:t?.point,size:t?.size},!1)}forgetObjects(){this.removePreviouslyAddedObjects(!1)}onEnable(){this.context.renderer.domElement.addEventListener("dragover",this.onDrag),this.context.renderer.domElement.addEventListener("drop",this.onDrop),window.addEventListener("paste",this.handlePaste),this.context.connection.beginListen("droplistener",this.onNetworkEvent)}onDisable(){this.context.renderer.domElement.removeEventListener("dragover",this.onDrag),this.context.renderer.domElement.removeEventListener("drop",this.onDrop),window.removeEventListener("paste",this.handlePaste),this.context.connection.stopListen("droplistener",this.onNetworkEvent)}onNetworkEvent=e=>{if(!this.useNetworking){Ri&&console.debug("[DropListener] Ignoring networked event because networking is disabled",e);return}if(e.guid?.startsWith(this.guid)){const t=e.url;if(console.debug("[DropListener] Received networked event",e),t)if(Array.isArray(t))for(const i of t)this.addFromUrl(i,{screenposition:new J,point:e.point,size:e.size},!0);else this.addFromUrl(t,{screenposition:new J,point:e.point,size:e.size},!0)}};handlePaste=e=>{this.context.connection.allowEditing===!1||e.defaultPrevented||navigator.clipboard.readText().then(t=>{if(t&&(t.startsWith("http")||t.startsWith("https")||t.startsWith("blob"))){const i={screenposition:new J(this.context.input.mousePosition.x,this.context.input.mousePosition.y)};this.testIfIsInDropArea(i)&&this.addFromUrl(t,i,!1)}}).catch(console.warn)};onDrag=e=>{this.context.connection.allowEditing!==!1&&e.preventDefault()};onDrop=async e=>{if(this.context.connection.allowEditing===!1||(Ri&&console.log(e),!e?.dataTransfer)||e["droplistener:handled"])return;e.preventDefault();const t={screenposition:new J(e.offsetX,e.offsetY)};if(this.dropArea&&this.testIfIsInDropArea(t)===!1)return;e["droplistener:handled"]=!0;const i=e.dataTransfer.items;if(!i)return;const n=[];for(const s in i){const r=i[s];if(r.kind==="file"){const a=r.getAsFile();if(!a)continue;n.push(a)}else r.kind==="string"&&r.type=="text/plain"&&r.getAsString(a=>{this.addFromUrl(a,t,!1)})}n.length>0&&await this.addFromFiles(n,t)};async addFromUrl(e,t,i){Ri&&console.log("dropped url",e);try{if(e.startsWith("https://github.com/")){const r=e.split("/"),a=r[3],l=r[4],c=r[6],h=r.slice(7).join("/");e=`https://raw.githubusercontent.com/${a}/${l}/${c}/${h}`}else e.startsWith("https://polyhaven.com/a")&&(e=nT(e));if(!e)return null;const n=e.toLowerCase();if(n.endsWith(".hdr")||n.endsWith(".hdri")||n.endsWith(".exr")||n.endsWith(".png")||n.endsWith(".jpg")||n.endsWith(".jpeg"))return console.warn(`Fileformat is not supported: ${n}`),null;this.removePreviouslyAddedObjects();const s=await Bu.loadFileFromURL(new URL(e),{guid:this.guid,context:this.context,parent:this.gameObject,point:t.point,size:t.size});if(s&&this._addedObjects.length<=0)return t.url=e,this.onObjectLoaded(s,t,i)}catch{console.warn("String is not a valid URL",e)}return null}_abort=null;async addFromFiles(e,t){if(Ri&&console.log("Add files",e),!!Array.isArray(e)&&e.length){this.deleteDropEvent(),this.removePreviouslyAddedObjects(),Xl(iT,null),this._abort?.abort("New files dropped"),this._abort=new AbortController;for(const i of e){if(!i)continue;if(i.type.startsWith("image/")){Ri&&console.warn("Ignoring dropped image file",i.name,i.type);continue}else if(i.name.endsWith(".bin")){Ri&&console.warn("Ignoring dropped binary file",i.name,i.type);continue}console.debug("Load file "+i.name+" + "+i.type);const n=await Bu.loadFile(i,this.context,{guid:this.guid});if(n){this.dispatchEvent(new CustomEvent("file-dropped",{detail:i})),t.file=i;const s=this.onObjectLoaded(n,t,!1);s&&this.context.connection.isConnected&&this.useNetworking&&(console.debug("Uploading dropped file to blob storage"),Mr.upload(i,{abort:this._abort?.signal}).then(r=>{r?.download_url&&this._addedObjects.includes(s)&&this.sendDropEvent(r.download_url,s,n.contentMD5)}).catch(console.warn));break}}}}_addedObjects=new Array;_addedModels=new Array;removePreviouslyAddedObjects(e=!0){if(e)for(const t of this._addedObjects)t.parent===this.gameObject&&Ci(t,!0,!0);this._addedObjects.length=0,this._addedModels.length=0}onObjectLoaded(e,t,i){const{model:n,contentMD5:s}=e;if(Ri&&console.log(`Dropped ${this.gameObject.name}`,n),!n?.scene)return console.warn("No object specified to add to scene",n),null;this.removePreviouslyAddedObjects();const r=n.scene;this.gameObject.attach(r),r.position.set(0,0,0),r.quaternion.identity(),this._addedObjects.push(r),this._addedModels.push(n);const a=new bi().setFromCenterAndSize(new b(0,this.fitVolumeSize.y*.5,0).add(this.gameObject.worldPosition),this.fitVolumeSize);if(Ri&&F.DrawWireBox3(a,255,5),this.fitIntoVolume&&t_(r,a,{position:!this.placeAtHitPosition}),this.placeAtHitPosition&&t&&t.screenposition){r.visible=!1;const c=this.context.physics.raycast({screenPoint:this.context.input.convertScreenspaceToRaycastSpace(t.screenposition.clone())});if(r.visible=!0,c&&c.length>0)for(const h of c){const d=h.point.clone();Ri&&console.log("Place object at hit",h),i_(r,d);break}}bs.autoplayAnimations(n);const l=new tT({sender:this,gltf:n,model:n,object:r,contentMD5:s,dropped:t.file||(t.url?new URL(t.url):void 0)});return this.dispatchEvent(l),this.onDropped?.invoke(l.detail),!i&&t.url?.startsWith("http")&&this.context.connection.isConnected&&r&&this.sendDropEvent(t.url,r,s),r}async sendDropEvent(e,t,i){if(!this.useNetworking){Ri&&console.debug("[DropListener] Ignoring networked event because networking is disabled",e);return}if(this.context.connection.isConnected){console.debug('Sending drop event "'+t.name+'"',e);const n=$t([t]),s={name:t.name,guid:this.guid,url:e,point:t.worldPosition.clone(),size:n.getSize(new b),contentMD5:i};this.context.connection.send("droplistener",s)}}deleteDropEvent(){this.context.connection.sendDeleteRemoteState(this.guid)}testIfIsInDropArea(e){if(this.dropArea){const t=this.context.input.convertScreenspaceToRaycastSpace(e.screenposition.clone());if(!this.context.physics.raycast({targets:[this.dropArea],screenPoint:t,recursive:!0,testObject:i=>!this._addedObjects.includes(i)}).length)return A()&&console.log(`Dropped outside of drop area for DropListener "${this.name}".`),!1}return!0}}el([u(k)],jo.prototype,"dropArea"),el([u()],jo.prototype,"fitIntoVolume"),el([u(b)],jo.prototype,"fitVolumeSize"),el([u()],jo.prototype,"placeAtHitPosition"),el([u()],jo.prototype,"useNetworking"),el([u(he)],jo.prototype,"onDropped");function nT(o){if(!o.startsWith("https://polyhaven.com/"))return o;const e="https://dl.polyhaven.org/file/ph-assets/Models/gltf/4k/",t=new URL(o).pathname.split("/").pop(),i=`${e}${t}/${t}_4k.gltf`;return console.log("Resolved polyhaven asset url",o,"\u2192",i),i}var Bu;(o=>{async function e(i,n,s){const r=s.guid,a=new At(r),l=new Blob([i],{type:i.type||Xx(i.name)||void 0}),c=URL.createObjectURL(l),h=await bn().loadSync(n,c,i.name,a).catch(d=>(console.error(`Failed to load file "${i.name}" (${i.type}):`,d),null));return URL.revokeObjectURL(c),h?new Promise((d,p)=>{const m=new FileReader;m.readAsArrayBuffer(i),m.onloadend=async f=>{const g=m.result,y=Mr.hashMD5(g);return d({model:h,contentMD5:y})}}):(console.warn(`Failed to load "${i.name}" (${i.type})`),null)}o.loadFile=e;async function t(i,n){return new Promise(async(s,r)=>{const a=new At(n.guid),l=i.toString();Ri&&F.DrawWireSphere(n.point,.1,16711680,3);const c=Ts.addPreview({guid:n.guid,parent:n.parent,position:n?.point,size:n?.size}),h=await bn().loadSync(n.context,l,l,a,d=>{c.onProgress(d.loaded/d.total)}).catch(console.warn);if(h){const d=await fetch(l).then(m=>m.arrayBuffer()),p=Mr.hashMD5(d);Ri?setTimeout(()=>Ts.removePreview(n.guid),3e3):Ts.removePreview(n.guid),s({model:h,contentMD5:p})}else Ri?setTimeout(()=>Ts.removePreview(n.guid),3e3):Ts.removePreview(n.guid),console.warn("Unsupported file type: "+i.toString())})}o.loadFileFromURL=t})(Bu||(Bu={}));var oT=Object.defineProperty,Df=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&oT(e,t,n),n};const Fu=class oS extends R{parent=null;object=null;limitCount=60;_currentCount=0;_startPosition=null;_startQuaternion=null;start(){if(this._currentCount=0,this._startPosition=null,this._startQuaternion=null,this.object||(this.object=this.gameObject),this.object){if(this.object===this.gameObject){const t=new At(this.guid);this.object=w.instantiate(this.object,{idProvider:t,keepWorldPosition:!1}),w.getComponent(this.object,oS)?.destroy();let i=this.object.getComponentInChildren(zr);i||(i=this.object.addComponent(zr,{dragMode:If.SnapToSurfaces}),i.guid=t.generateUUID());let n=w.getComponent(i.gameObject,Cn);n||(n=i.gameObject.addComponent(Cn),n.guid=t.generateUUID())}this.object.visible=!1;const e=this.gameObject.getComponent(zr);e&&(e.enabled=!1),this._startPosition=this.object.position?.clone()??new b(0,0,0),this._startQuaternion=this.object.quaternion?.clone()??new U(0,0,0,1)}this.gameObject.getComponentInParent(ki)||this.gameObject.addComponent(ki)}onEnable(){this.startCoroutine(this.cloneLimitIntervalFn())}_forwardPointerEvents=new Map;onPointerEnter(e){e.used||this.object&&this.context.connection.allowEditing&&e.button===0&&this.context.input.setCursor("pointer")}onPointerExit(e){e.used||this.object&&this.context.connection.allowEditing&&e.button===0&&this.context.input.unsetCursor("pointer")}onPointerDown(e){if(e.used||!this.object||!this.context.connection.allowEditing||e.button!==0)return;const t=this.handleDuplication();if(t){const i=w.getComponent(t,zr);i?(i.onPointerDown(e),this._forwardPointerEvents.set(e.event.space,i)):A()&&console.warn(`Duplicated object (${t.name}) does not have DragControls`)}else this._currentCount>=this.limitCount?console.warn(`[Duplicatable] Limit of ${this.limitCount} objects created within a few seconds reached. Please wait a moment before creating more objects.`):console.warn("[Duplicatable] Could not duplicate object.")}onPointerUp(e){if(e.used)return;const t=this._forwardPointerEvents.get(e.event.space);t&&(t.onPointerUp(e),this._forwardPointerEvents.delete(e.event.space))}*cloneLimitIntervalFn(){for(;this.activeAndEnabled&&!this.destroyed;)this._currentCount>0?this._currentCount-=1:this._currentCount<0&&(this._currentCount=0),yield Xg(1)}handleDuplication(){if(!this.object||this.limitCount>0&&this._currentCount>=this.limitCount||this.object===this.gameObject)return null;if(w.isDestroyed(this.object))return this.object=null,null;this.object.visible=!0,this._startPosition&&this.object.position.copy(this._startPosition),this._startQuaternion&&this.object.quaternion.copy(this._startQuaternion);const e=new jn;this.parent||(this.parent=this.gameObject.parent),this.parent&&(e.parent=this.parent.guid??this.parent.userData?.guid,e.keepWorldPosition=!0),e.position=this.worldPosition,e.rotation=this.worldQuaternion,e.context=this.context,this._currentCount+=1;const t=w.instantiateSynced(this.object,e);return console.assert(t!==this.object,"Duplicated object is original"),this.object.visible=!1,this._startPosition&&this.object.position.clone().copy(this._startPosition),this._startQuaternion&&this.object.quaternion.clone().copy(this._startQuaternion),t}};Df([u(k)],Fu.prototype,"parent"),Df([u(k)],Fu.prototype,"object"),Df([u()],Fu.prototype,"limitCount");let Bf=Fu;var Do=(o=>(o[o.PointerEnter=0]="PointerEnter",o[o.PointerExit=1]="PointerExit",o[o.PointerDown=2]="PointerDown",o[o.PointerUp=3]="PointerUp",o[o.PointerClick=4]="PointerClick",o[o.Drag=5]="Drag",o[o.Drop=6]="Drop",o[o.Scroll=7]="Scroll",o[o.UpdateSelected=8]="UpdateSelected",o[o.Select=9]="Select",o[o.Deselect=10]="Deselect",o[o.Move=11]="Move",o[o.InitializePotentialDrag=12]="InitializePotentialDrag",o[o.BeginDrag=13]="BeginDrag",o[o.EndDrag=14]="EndDrag",o[o.Submit=15]="Submit",o[o.Cancel=16]="Cancel",o))(Do||{}),sT=Object.defineProperty,Ff=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&sT(e,t,n),n};class zf{eventID;callback=new he}Ff([u()],zf.prototype,"eventID"),Ff([u(he)],zf.prototype,"callback");class zu extends R{triggers=[];invoke(e){if(this.triggers)for(const t of this.triggers)t.eventID===e&&t.callback?.invoke()}hasTrigger(e){return this.triggers?.some(t=>t.eventID===e)??!1}shouldChangeCursor(){return this.hasTrigger(Do.PointerClick)||this.hasTrigger(Do.PointerDown)||this.hasTrigger(Do.PointerUp)}onPointerClick(e){this.invoke(Do.PointerClick)}onPointerEnter(e){this.shouldChangeCursor()&&this.context.input.setCursor("pointer"),this.invoke(Do.PointerEnter)}onPointerExit(e){this.shouldChangeCursor()&&this.context.input.unsetCursor("pointer"),this.invoke(Do.PointerExit)}onPointerDown(e){this.invoke(Do.PointerDown)}onPointerUp(e){this.invoke(Do.PointerUp)}}Ff([u(zf)],zu.prototype,"triggers");class Zx{writer;constructor(e){this.writer=e}writeNode(e){}}class rT extends Zx{beforeWriteNode(e,t){F.isGizmo(e)&&(t.keep=!1)}}class Kx extends Zx{beforeWriteTexture(e,t){e.isRenderTargetTexture&&(t.newTexture=Yg(new oe(1,1,1,0)))}}function Uf(o){const e=Eu.DontExport;return!(o.hideFlags&e)}const Nf=x("debugexr");class aT{get name(){return"EXT_texture_exr"}parser;constructor(e){this.parser=e,Nf&&console.log(e)}loadTexture(e){const t=this.name,i=this.parser,n=i.json.textures[e];if(Nf&&console.log("EXT_texture_exr.loadTexture",e,n),!n.extensions||!n.extensions[t])return null;const s=n.extensions[t],r=new wm(i.options.manager);return Nf&&console.log("EXT_texture_exr.loadTexture",s),i.loadTextureImage(e,s.source,r)}}typeof window<"u"&&window.addEventListener("unhandledrejection",o=>{});const Bo=gt,Uu="$___Export_Components",lT="NEEDLE_components";class cT{[fr]}class hT{node;nodeIndex;nodeDef;constructor(e,t,i){this.node=e,this.nodeIndex=t,this.nodeDef=i}}class Jx{get name(){return lT}parser;nodeToObjectMap={};gltf=null;exportContext;objectToNodeMap={};context;writer;registerExport(e){e.register(t=>{if("serializeUserData"in t){const i=t.serializeUserData.bind(t);this.writer=t,t.serializeUserData=(n,s)=>{try{this.serializeUserData(n,s)&&(t.extensionsUsed[this.name]=!0),i(n,s)}finally{this.afterSerializeUserData(n,s)}}}return this})}beforeParse(){this.exportContext={},this.objectToNodeMap={}}serializeUserData(e,t){const i=e.userData?.components;return!i||i.length<=0?!1:(delete e.userData.components,e[Uu]=i,!0)}afterSerializeUserData(e,t){if(e.type==="Scene"&&Bo&&console.log("DONE",JSON.stringify(t)),e[Uu]===void 0)return;const i=e[Uu];delete e[Uu],i!==null&&(e.userData.components=i)}writeNode(e,t){const i=this.writer.json.nodes.length;Bo&&console.log(e.name,i,e.uuid);const n=new hT(e,i,t);this.exportContext[i]=n,this.objectToNodeMap[e.uuid]=i}afterParse(e){Bo&&console.log("AFTER",e);for(const t in this.exportContext){const i=this.exportContext[t],n=i.node,s=i.nodeDef,r=i.nodeIndex,a=n.userData?.components;if(!a||a.length<=0)continue;const l=new cT;s.extensions=s.extensions||{},s.extensions[this.name]=l,this.context.object=n,this.context.nodeId=r,this.context.objectToNode=this.objectToNodeMap;const c=[];for(const h of a){this.context.target=h;const d=bn().writeBuiltinComponentData(h,this.context);d!==null&&c.push(d)}c.length>0&&(l[fr]=c,Bo&&console.log("DID WRITE",n,"nodeIndex",r,c))}}beforeRoot(){return Bo&&console.log("BEGIN LOAD"),this.nodeToObjectMap={},null}async afterRoot(e){this.gltf=e;const t=e.parser,i=t?.extensions;if(!i)return;const n=i[this.name];Bo&&console.log("After root",e,this.parser,i);const s=[];if(n===!0){const r=t.json.nodes;if(r){for(let a=0;a<r.length;a++){const l=await t.getDependency("node",a);this.nodeToObjectMap[a]=l}for(let a=0;a<r.length;a++){const l=r[a],c=a,h=l.extensions;if(!h)continue;const d=h[this.name];if(!d)continue;Bo&&console.log("NODE",l);const p=this.nodeToObjectMap[c];if(!p){console.error("Could not find object for node index: "+c,l,t);continue}iu(p),s.push(this.createComponents(p,d))}}}await Promise.all(s);for(const r of t.associations.keys()){const a=t.associations.get(r);if(a?.materials!=null){const l="/materials/"+a.materials;Ek(r,l)}}}async createComponents(e,t){if(!t)return;const i=t[fr];if(i){const n=new Array;Bo&&console.log(e.name,i);for(const s in i){const r=i[s];Bo&&console.log("Serialized data",JSON.parse(JSON.stringify(r))),r&&this.parser&&n.push(Bg(this.parser,r).catch(a=>console.error(`Error while resolving references (see console for details)
|
|
990
|
-
`,a,e,r))),e.userData=e.userData||{},e.userData[fr]=e.userData[fr]||[],e.userData[fr].push(r)}await Promise.all(n).catch(s=>{console.error("Error while loading components",s)})}}}const ew="NEEDLE_gameobject_data";class dT{get name(){return ew}parser;constructor(e){this.parser=e}afterRoot(e){const t=[];for(let i=0;i<this.parser.json.nodes?.length;i++){const n=this.parser.json.nodes[i];if(n&&n.extensions){const s=n.extensions[ew];if(s){const r=this.findAndApplyExtensionData(i,s);t.push(r)}}}return Promise.all(t).then(()=>null)}async findAndApplyExtensionData(e,t){const i=await this.parser.getDependency("node",e);i&&this.applyExtensionData(i,t)}applyExtensionData(e,t){t.layers===void 0&&(t.layers=0),e.userData.layer=t.layers,e.layers.disableAll(),e.layers.set(t.layers),e.userData.tag=t.tag??"none",e.hideFlags=0,e.userData.static=t.static??!1,e.visible=t.activeSelf??!0,e.guid=t.guid}}const tw="NEEDLE_lighting_settings",tl=x("debugenvlight");class uT{get name(){return tw}parser;sourceId;context;constructor(e,t,i){this.parser=e,this.sourceId=t,this.context=i}afterRoot(e){const t=this.parser.json.extensions;if(t){const i=t[tw];if(i){tl&&console.log('Loaded "'+this.name+'", src: "'+this.sourceId+'"',i);let n;if(e.scene.children.length===1){const s=e.scene.children[0];n=w.addComponent(s,Nu,{},{callAwake:!1})}else{const s=new k;s.name="LightSettings "+this.sourceId,e.scene.add(s),n=w.addComponent(s,Nu,{},{callAwake:!1})}n.sourceId=this.sourceId,n.ambientIntensity=i.ambientIntensity,n.ambientLight=new ne().fromArray(i.ambientLight),Array.isArray(i.ambientTrilight)&&(n.ambientTrilight=i.ambientTrilight.map(s=>new ne().fromArray(s))),n.ambientMode=i.ambientMode,n.environmentReflectionSource=i.environmentReflectionSource}}return null}}ue.registerCallback(de.ContextCreated,o=>{const e=o.context,t=w.findObjectOfType(Nu,e);t?.sourceId&&(t.enabled=!0)});class Nu extends R{ambientMode=Ha.Skybox;ambientLight;ambientTrilight;ambientIntensity=1;environmentReflectionSource=du.Skybox;_hasReflection=!1;_ambientLightObj;_hemisphereLightObj;awake(){if(this.sourceId){const t=this.environmentReflectionSource===du.Skybox?$n.Skybox:$n.Reflection,i=this.context.lightmaps.tryGet(this.sourceId,t,0);this._hasReflection=i!=null,i&&this.context.sceneLighting.internalRegisterReflection(this.sourceId,i)}this.enabled=!1,this.context.sceneLighting.internalRegisterSceneLightSettings(this),tl&&window.addEventListener("keydown",t=>{if(!this.destroyed)switch(t.key){case"l":this.enabled=!this.enabled;break}});const e=this.gameObject.userData?.components;if(e){const t=e.indexOf(this);e.splice(t,1),e.push(this)}}onDestroy(){this.context.sceneLighting.internalUnregisterSceneLightSettings(this)}calculateIntensityFactor(e){const t=Math.max(e.r,e.g,e.b);return 2.2*j.lerp(0,1.33,t)}onEnable(){if(tl&&console.warn("\u{1F4A1}\u{1F7E1} >>> Enable lighting",this.sourceId,this.enabled,this),this.ambientMode==Ha.Flat){if(this.ambientLight&&!this._ambientLightObj){const e=this.calculateIntensityFactor(this.ambientLight);this._ambientLightObj=new DS(this.ambientLight,this.ambientIntensity*e),tl&&console.log("Created ambient light",this.sourceId,this._ambientLightObj,this.ambientIntensity,e)}this._ambientLightObj&&this.gameObject.add(this._ambientLightObj)}else if(this.ambientMode===Ha.Trilight){if(this.ambientTrilight){const e=this.ambientTrilight[0],t=this.ambientTrilight[this.ambientTrilight.length-1],i=this.calculateIntensityFactor(t);this._hemisphereLightObj=new BS(t,e,this.ambientIntensity*i),this.gameObject.add(this._hemisphereLightObj),tl&&console.log("Created hemisphere ambient light",this.sourceId,this._hemisphereLightObj,this.ambientIntensity,i)}}else this._ambientLightObj&&this._ambientLightObj.removeFromParent(),this._hemisphereLightObj&&this._hemisphereLightObj.removeFromParent();this.sourceId&&(this.context.domElement.getAttribute("environment-image")||this.context.sceneLighting.internalEnableReflection(this.sourceId))}onDisable(){tl&&console.warn("\u{1F4A1}\u26AB <<< Disable lighting:",this.sourceId,this),this._ambientLightObj&&this._ambientLightObj.removeFromParent(),this._hemisphereLightObj&&this._hemisphereLightObj.removeFromParent(),this.sourceId&&this.context.sceneLighting.internalDisableReflection(this.sourceId)}}const Vf=x("debugstencil");function pT(o,e){return(o&1<<e.layer)!=0}const mT=Symbol("stencils");class nr{get name(){return"NEEDLE_render_objects"}static stencils={};static applyStencil(e){if(!e)return;const t=e.sourceId;if(Vf&&console.log(t,nr.stencils),!t)return;const i=nr.stencils[t];if(i)for(let n=i.length-1;n>=0;n--){const s=i[n];if(pT(s.layer,e)){Vf&&console.log(s),setTimeout(()=>{$i()&&ou(e.gameObject)&&(ge("Stencil not supported on instanced objects"),console.warn("Stencil not supported on instanced objects",e))},500);for(let r=0;r<e.sharedMaterials.length;r++){let a=e.sharedMaterials[r];a&&(a=a.clone(),a[mT]=!0,a.stencilWrite=!0,a.stencilWriteMask=255,a.stencilFuncMask=255,a.stencilRef=s.value,a.stencilFunc=s.compareFunc,a.stencilZPass=s.passOp,a.stencilFail=s.failOp,a.stencilZFail=s.zFailOp,e.sharedMaterials[r]=a)}e.gameObject.renderOrder=s.event*1e3+s.index*50;break}}}parser;source;constructor(e,t){this.parser=e,this.source=t}afterRoot(e){const t=this.parser.json.extensions;if(t){const i=t[fT];if(i){Vf&&console.log(i);const n=i.stencil;if(n&&Array.isArray(n))for(const s of n){const r={...s};r.compareFunc=gT(r.compareFunc),r.passOp=Wf(r.passOp),r.failOp=Wf(r.failOp),r.zFailOp=Wf(r.zFailOp),nr.stencils[this.source]||(nr.stencils[this.source]=[]),nr.stencils[this.source].push(r)}}}return null}}function Wf(o){switch(o){case 0:return KS;case 1:return ZS;case 2:return YS;case 3:return QS;case 4:return XS;case 6:return qS;case 7:return GS;case 5:return HS}return 0}function gT(o){switch(o){case 1:return J0;case 2:return $S;case 3:return WS;case 4:return VS;case 5:return NS;case 6:return US;case 7:return zS;case 8:return FS}return J0}const fT="NEEDLE_render_objects";var iw=(o=>(o[o.INT=5124]="INT",o[o.FLOAT=5126]="FLOAT",o[o.FLOAT_VEC2=35664]="FLOAT_VEC2",o[o.FLOAT_VEC3=35665]="FLOAT_VEC3",o[o.FLOAT_VEC4=35666]="FLOAT_VEC4",o[o.INT_VEC2=35667]="INT_VEC2",o[o.INT_VEC3=35668]="INT_VEC3",o[o.INT_VEC4=35669]="INT_VEC4",o[o.BOOL=35670]="BOOL",o[o.BOOL_VEC2=35671]="BOOL_VEC2",o[o.BOOL_VEC3=35672]="BOOL_VEC3",o[o.BOOL_VEC4=35673]="BOOL_VEC4",o[o.FLOAT_MAT2=35674]="FLOAT_MAT2",o[o.FLOAT_MAT3=35675]="FLOAT_MAT3",o[o.FLOAT_MAT4=35676]="FLOAT_MAT4",o[o.SAMPLER_2D=35678]="SAMPLER_2D",o[o.SAMPLER_3D=35680]="SAMPLER_3D",o[o.SAMPLER_CUBE=35681]="SAMPLER_CUBE",o[o.UNKNOWN=0]="UNKNOWN",o))(iw||{});const Jn=x("debugcustomshader"),il="NEEDLE_techniques_webgl";class yT{objectToWorldMatrix=new ee;worldToObjectMatrix=new ee;objectToWorld=new Array;worldToObject=new Array;updateFrom(e){this.objectToWorldMatrix.copy(e.matrixWorld),hu(this.objectToWorldMatrix,this.objectToWorld),this.worldToObjectMatrix.copy(e.matrixWorld).invert(),hu(this.worldToObjectMatrix,this.worldToObject)}}class Me extends eb{identifier;onBeforeRenderSceneCallback=this.onBeforeRenderScene.bind(this);clone(){const e=super.clone();return nw(e),e}constructor(e,...t){super(...t),this.identifier=e,Jn&&console.log(this),this.type="NEEDLE_CUSTOM_SHADER",this.uniforms[this._objToWorldName]||(this.uniforms[this._objToWorldName]={value:[]}),this.uniforms[this._worldToObjectName]||(this.uniforms[this._worldToObjectName]={value:[]}),this.uniforms[this._viewProjectionName]||(this.uniforms[this._viewProjectionName]={value:[]}),this.uniforms[this._sphericalHarmonicsName],(this.depthTextureUniform||this.opaqueTextureUniform)&&N.Current.pre_render_callbacks.push(this.onBeforeRenderSceneCallback)}dispose(){super.dispose();const e=N.Current.pre_render_callbacks.indexOf(this.onBeforeRenderSceneCallback);e>=0&&N.Current.pre_render_callbacks.splice(e,1)}_sphericalHarmonicsName="unity_SpecCube0";_objToWorldName="hlslcc_mtx4x4unity_ObjectToWorld";_worldToObjectName="hlslcc_mtx4x4unity_WorldToObject";static viewProjection=new ee;static _viewProjectionValues=[];_viewProjectionName="hlslcc_mtx4x4unity_MatrixVP";static viewMatrix=new ee;static _viewMatrixValues=[];_viewMatrixName="hlslcc_mtx4x4unity_MatrixV";static _worldSpaceCameraPosName="_WorldSpaceCameraPos";static _worldSpaceCameraPos=new b;static _mainLightColor=new pe;static _mainLightPosition=new b;static _lightData=new pe;_rendererData=new yT;get depthTextureUniform(){if(this.uniforms)return this.uniforms._CameraDepthTexture}get opaqueTextureUniform(){if(this.uniforms)return this.uniforms._CameraOpaqueTexture}onBeforeRenderScene(){this.opaqueTextureUniform&&N.Current.setRequireColor(!0),this.depthTextureUniform&&N.Current.setRequireDepth(!0)}onBeforeRender(e,t,i,n,s,r){n.attributes.tangent||n.computeTangents(),this.onUpdateUniforms(i,s)}onUpdateUniforms(e,t){const i=N.Current;if(e&&(Me.viewProjection&&this.uniforms[this._viewProjectionName]&&(Me.viewProjection.copy(e.projectionMatrix).multiply(e.matrixWorldInverse),hu(Me.viewProjection,Me._viewProjectionValues)),Me.viewMatrix&&this.uniforms[this._viewMatrixName]&&(Me.viewMatrix.copy(e.matrixWorldInverse),hu(Me.viewMatrix,Me._viewMatrixValues)),this.uniforms[Me._worldSpaceCameraPosName]&&Me._worldSpaceCameraPos.setFromMatrixPosition(e.matrixWorld)),this.uniforms._TimeParameters&&(this.uniforms._TimeParameters.value=i.sceneLighting.timeVec4),this.uniforms._Time){const a=this.uniforms._Time.value;a.x=i.sceneLighting.timeVec4.x/20,a.y=i.sceneLighting.timeVec4.x,a.z=i.sceneLighting.timeVec4.x*2,a.w=i.sceneLighting.timeVec4.x*3}if(this.uniforms._SinTime){const a=this.uniforms._SinTime.value;a.x=Math.sin(i.sceneLighting.timeVec4.x/8),a.y=Math.sin(i.sceneLighting.timeVec4.x/4),a.z=Math.sin(i.sceneLighting.timeVec4.x/2),a.w=Math.sin(i.sceneLighting.timeVec4.x)}if(this.uniforms._CosTime){const a=this.uniforms._CosTime.value;a.x=Math.cos(i.sceneLighting.timeVec4.x/8),a.y=Math.cos(i.sceneLighting.timeVec4.x/4),a.z=Math.cos(i.sceneLighting.timeVec4.x/2),a.w=Math.cos(i.sceneLighting.timeVec4.x)}if(this.uniforms.unity_DeltaTime){const a=this.uniforms.unity_DeltaTime.value;a.x=i.time.deltaTime,a.y=1/i.time.deltaTime,a.z=i.time.smoothedDeltaTime,a.w=1/i.time.smoothedDeltaTime}const n=i.mainLight;if(n){const a=K(n.gameObject,Me._mainLightPosition);this.uniforms._MainLightPosition={value:a.normalize()},Me._mainLightColor.set(n.color.r,n.color.g,n.color.b,0),this.uniforms._MainLightColor={value:Me._mainLightColor};const l=n.intensity;Me._lightData.z=l,this.uniforms.unity_LightData={value:Me._lightData}}if(e&&(Me.viewProjection&&this.uniforms[this._viewProjectionName]&&(this.uniforms[this._viewProjectionName].value=Me._viewProjectionValues),Me.viewMatrix&&this.uniforms[this._viewMatrixName]&&(this.uniforms[this._viewMatrixName].value=Me._viewMatrixValues),this.uniforms[Me._worldSpaceCameraPosName]&&(this.uniforms[Me._worldSpaceCameraPosName]={value:Me._worldSpaceCameraPos}),i.mainCameraComponent)){if(this.uniforms._ProjectionParams){const a=this.uniforms._ProjectionParams.value;a.x=1,a.y=i.mainCameraComponent.nearClipPlane,a.z=i.mainCameraComponent.farClipPlane,a.w=1/a.z,this.uniforms._ProjectionParams.value=a}if(this.uniforms._ZBufferParams){const a=this.uniforms._ZBufferParams.value,l=i.mainCameraComponent;a.x=1-l.farClipPlane/l.nearClipPlane,a.y=l.farClipPlane/l.nearClipPlane,a.z=a.x/l.farClipPlane,a.w=a.y/l.farClipPlane,this.uniforms._ZBufferParams.value=a}if(this.uniforms._ScreenParams){const a=this.uniforms._ScreenParams.value;a.x=i.domWidth,a.y=i.domHeight,a.z=1+1/a.x,a.w=1+1/a.y,this.uniforms._ScreenParams.value=a}if(this.uniforms._ScaledScreenParams){const a=this.uniforms._ScaledScreenParams.value;a.x=i.domWidth,a.y=i.domHeight,a.z=1+1/a.x,a.w=1+1/a.y,this.uniforms._ScaledScreenParams.value=a}}const s=this.depthTextureUniform;s&&(s.value=i.depthTexture);const r=this.opaqueTextureUniform;if(r&&(r.value=i.opaqueColorTexture),t){const a=this._rendererData;a.updateFrom(t),this.uniforms[this._worldToObjectName].value=a.worldToObject,this.uniforms[this._objToWorldName].value=a.objectToWorld}this.uniformsNeedUpdate=!0}}class bT{get name(){return il}parser;identifier;constructor(e,t){this.parser=e,this.identifier=t}loadMaterial(e){const t=this.parser.json.materials[e];if(!t)return Jn&&console.log(e,this.parser.json.materials),null;if(!t.extensions||!t.extensions[il])return Jn&&console.log(`Material ${e} does not use NEEDLE_techniques_webgl`),null;Jn&&console.log(`Material ${e} uses NEEDLE_techniques_webgl`,t);const i=t.extensions[il].technique;if(i<0)return console.debug(`Material ${e} does not have a valid technique index`),null;const n=this.parser.json.extensions[il];if(!n)return Jn?console.error("Missing shader data",this.parser.json.extensions):console.debug("Missing custom shader data in parser.json.extensions"),null;Jn&&console.log(n);const s=n.techniques[i];return s?new Promise(async(r,a)=>{const l=await dM(n,s.program),c=l?.fragmentShader,h=l?.vertexShader;if(!c||!h)return a();Jn&&console.log("loadMaterial",t,l);const d={},p=s.uniforms;(h.includes("_Time")||c.includes("_Time"))&&(d._Time={value:new pe(0,0,0,0)}),(h.includes("_SinTime")||c.includes("_SinTime"))&&(d._SinTime={value:new pe(0,0,0,0)}),(h.includes("_CosTime")||c.includes("_CosTime"))&&(d._CosTime={value:new pe(0,0,0,0)}),(h.includes("unity_DeltaTime")||c.includes("unity_DeltaTime"))&&(d.unity_DeltaTime={value:new pe(0,0,0,0)});for(const g in p){const y=g;switch(y){case"_TimeParameters":const _=new pe;d[y]={value:_};break;case"hlslcc_mtx4x4unity_MatrixV":case"hlslcc_mtx4x4unity_MatrixVP":d[y]={value:[]};break;case"_MainLightPosition":case"_MainLightColor":case"_WorldSpaceCameraPos":d[y]={value:[0,0,0,1]};break;case"unity_OrthoParams":break;case"unity_SpecCube0":d[y]={value:null};break;default:case"_ScreenParams":case"_ZBufferParams":case"_ProjectionParams":d[y]={value:[0,0,0,0]};break;case"_CameraOpaqueTexture":case"_CameraDepthTexture":d[y]={value:null};break}}let m=!1;if(t.extensions&&t.extensions[il]){const g=t.extensions[il];if(g.technique===i){Jn&&console.log(t.name,"Material Properties",g);for(const y in g.values){const _=g.values[y];if(typeof _=="string"){if(_.startsWith("/textures/")){const v=_.substring(10),P=Number.parseInt(v);if(P>=0){const M=await this.parser.getDependency("texture",P);M instanceof Re&&(M.colorSpace=bo,M.needsUpdate=!0),d[y]={value:M};continue}}switch(y){case"alphaMode":_==="BLEND"&&(m=!0);continue}}if(Array.isArray(_)&&_.length===4){d[y]={value:new pe(_[0],_[1],_[2],_[3])};continue}d[y]={value:_}}}}const f=new Me(this.identifier,{name:t.name??"",uniforms:d,vertexShader:h,fragmentShader:c,lights:!1});switch(f.glslVersion=JS,f.vertexShader=f.vertexShader.replace("#version 300 es",""),f.fragmentShader=f.fragmentShader.replace("#version 300 es",""),d._Cull?.value){case 0:f.side=vi;break;case 1:f.side=_d;break;case 2:f.side=ds;break;default:f.side=ds;break}switch(d._ZTest?.value){case 3:f.depthTest=!0,f.depthFunc=rC;break;case 6:f.depthTest=!0,f.depthFunc=sC;break;case 2:f.depthTest=!0,f.depthFunc=oC;break;case 4:f.depthTest=!0,f.depthFunc=nC;break;case 5:f.depthTest=!0,f.depthFunc=iC;break;case 7:f.depthTest=!0,f.depthFunc=tC;break;case 8:f.depthTest=!1,f.depthFunc=eC;break}f.transparent=m,m&&(f.depthWrite=!1),cM(d),f.onUpdateUniforms();for(const g in p){const y=g,_=p[g].type;if(d[y]?.value===void 0)switch(_){case iw.SAMPLER_2D:d[y]={value:aM},console.warn("Missing/unassigned texture, fallback to white: "+y);break;default:y==="unity_OrthoParams"||console.warn("TODO: EXPECTED UNIFORM / fallback NOT SET: "+y,p[g]);break}}Jn&&console.log(f.uuid,d),nw(f),r(f)}):null}}function nw(o){if(o.uniforms){Jn&&console.log("Uniforms:",o.uniforms);for(const t in o.uniforms)switch(e(t,t),t){case"_Color":e("color",t);break}}function e(t,i){Object.getOwnPropertyDescriptor(o,t)||Object.defineProperty(o,t,{get:()=>o.uniforms[i].value,set:n=>{o.uniforms[i].value=n,o.needsUpdate=!0}})}}const _T=x("debugextensions");let Vu;const vT=import("./vendor-JyrX4DVM.min.js").then(o=>o.index$2).then(async o=>(Vu=o.GLTFAnimationPointerExtension,Vu)).catch(o=>{console.warn("Failed to import GLTFLoaderAnimationPointer. Please use @needle-tools/three-animationpointer for full KHR_animation support",o)}),Ur=new Array;function xT(o){Ur.includes(o)||Ur.push(o)}function wT(o){const e=Ur.indexOf(o);e>=0&&Ur.splice(e,1)}function $f(o){if(o instanceof xo){const e=new Jx;return o.register(t=>(e.parser=t,e)),e}return null}class ST{resolvePath(e){return e.includes("/extensions/builtin_components/")?e.replace("/extensions/builtin_components/","/userData/components/"):e.includes("extensions/builtin_components/")?e.replace("extensions/builtin_components/","/userData/components/"):e}}async function Wu(o,e,t){const i=t.indexOf("?");i>=0&&(t=t.substring(0,i)),o.register(n=>new dT(n)),o.register(n=>new Ik(n)),o.register(n=>new nM(n,e.lightmaps,t)),o.register(n=>new uT(n,t,e)),o.register(n=>new bT(n,t)),o.register(n=>new nr(n,t)),o.register(n=>new $e(n)),o.register(n=>new aT(n)),q_()&&o.register(n=>new Ul(n)),await vT.catch(n=>{}),o.register(n=>{if(Vu){const s=new Vu(n);return s.setAnimationPointerResolver.bind(s)(new ST),s}else return(_T||A())&&console.error("Missing KHR_animation_pointer extension..."),{name:"KHR_animation_pointer_NOT_AVAILABLE"}});for(const n of Ur)n.onImport&&n.onImport(o,t,e)}function Hf(o,e){for(const t of Ur)t.onExport&&t.onExport(o,e)}function ow(o,e,t){for(const i of Ur)i.onLoaded&&i.onLoaded(o,e,t)}class sw{constructor(e){this.writer=e,this.name="EXT_mesh_gpu_instancing"}writeNode(e,t){if(e.constructor.name!=="InstancedMesh")return;const i=this.writer,n=i.extensionsUsed,s={};t.extensions=t.extensions||{},t.extensions[this.name]=s;let r=new ee;const a=new Array,l=new Array,c=new Array;for(let m=0;m<e.count;m++){e.getMatrixAt(m,r);let f=new b,g=new U,y=new b;r.decompose(f,g,y),a.push(f.x,f.y,f.z),l.push(g.x,g.y,g.z,g.w),c.push(y.x,y.y,y.z)}const h=new Float32Array(a),d=new Float32Array(l),p=new Float32Array(c);s.attributes={TRANSLATION:i.processAccessor(new pt(h,3)),ROTATION:i.processAccessor(new pt(d,4)),SCALE:i.processAccessor(new pt(p,3))},n[this.name]=!0}}var CT=Object.defineProperty,rw=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&CT(e,t,n),n};const Nc=x("debugreflectionprobe"),aw=x("noreflectionprobe"),Gf=Symbol("reflectionProbeKey"),lw=Symbol("original material"),qf=class es extends R{static _probes=new Map;static isUsingReflectionProbe(e){return!!(e[Gf]||e[lw]?.[Gf])}static get(e,t,i,n){if(!e||e.isObject3D!==!0||aw)return null;const s=es._probes.get(t);if(s){for(const r of s)if(r.__didAwake||r.__internalAwake(),r.activeAndEnabled){if(n){if(r.gameObject===n)return r}else if(r.isInBox(e))return Nc&&console.log("Found reflection probe",e.name,r.name),r}}return Nc&&console.debug("Did not find reflection probe",e.name,i,e),null}_texture;set texture(e){if(e&&!(e instanceof Re)){console.error("ReflectionProbe.texture must be a Texture",e);return}this._texture=e,e&&(e.mapping=_o,e.colorSpace=bo,e.needsUpdate=!0)}get texture(){return this._texture}center;size;_boxHelper;isInBox(e){return this._boxHelper?.isInBox(e)}constructor(){super(),es._probes.has(this.context)||es._probes.set(this.context,[]),es._probes.get(this.context)?.push(this)}awake(){this._boxHelper=this.gameObject.addComponent(wt),this._boxHelper.updateBox(!0),Nc&&this._boxHelper.showHelper(5592320,!0),this._texture&&(this._texture.mapping=_o,this._texture.colorSpace=bo,this._texture.needsUpdate=!0)}start(){!this._texture&&A()&&(console.warn(`[ReflectionProbe] Missing texture. Please assign a custom cubemap texture. To use reflection probes assign them to your renderer's "anchor" property.`),ge("ReflectionProbe configuration hint: See browser console for details"))}onDestroy(){const e=es._probes.get(this.context);if(e){const t=e.indexOf(this);t>=0&&e.splice(t,1)}}static _rendererMaterialsCache=new Map;onSet(e){if(aw||!this.enabled||e.sharedMaterials?.length<=0||!this.texture)return;let t=es._rendererMaterialsCache.get(e);t||(t=[],es._rendererMaterialsCache.set(e,t));for(let i=0;i<e.sharedMaterials.length;i++){const n=e.sharedMaterials[i];if(!n||n.envMap===void 0||n instanceof we)continue;let s=t[i];const r=n===s?.copy,a=!s||s.material.uuid!==n.uuid||s.copy.version!==n.version;if(!r&&a){if(Nc){let h="";s?s.material!==n?h="reference changed; cached instance?: "+r:s.copy.version!==n.version&&(h="version changed"):h="not cached",console.warn("Cloning material",n.name,n.version,"Reason:",h,`
|
|
990
|
+
`,a,e,r))),e.userData=e.userData||{},e.userData[fr]=e.userData[fr]||[],e.userData[fr].push(r)}await Promise.all(n).catch(s=>{console.error("Error while loading components",s)})}}}const ew="NEEDLE_gameobject_data";class dT{get name(){return ew}parser;constructor(e){this.parser=e}afterRoot(e){const t=[];for(let i=0;i<this.parser.json.nodes?.length;i++){const n=this.parser.json.nodes[i];if(n&&n.extensions){const s=n.extensions[ew];if(s){const r=this.findAndApplyExtensionData(i,s);t.push(r)}}}return Promise.all(t).then(()=>null)}async findAndApplyExtensionData(e,t){const i=await this.parser.getDependency("node",e);i&&this.applyExtensionData(i,t)}applyExtensionData(e,t){t.layers===void 0&&(t.layers=0),e.userData.layer=t.layers,e.layers.disableAll(),e.layers.set(t.layers),e.userData.tag=t.tag??"none",e.hideFlags=0,e.userData.static=t.static??!1,e.visible=t.activeSelf??!0,e.guid=t.guid}}const tw="NEEDLE_lighting_settings",tl=x("debugenvlight");class uT{get name(){return tw}parser;sourceId;context;constructor(e,t,i){this.parser=e,this.sourceId=t,this.context=i}afterRoot(e){const t=this.parser.json.extensions;if(t){const i=t[tw];if(i){tl&&console.log('Loaded "'+this.name+'", src: "'+this.sourceId+'"',i);let n;if(e.scene.children.length===1){const s=e.scene.children[0];n=w.addComponent(s,Nu,{},{callAwake:!1})}else{const s=new k;s.name="LightSettings "+this.sourceId,e.scene.add(s),n=w.addComponent(s,Nu,{},{callAwake:!1})}n.sourceId=this.sourceId,n.ambientIntensity=i.ambientIntensity,n.ambientLight=new ne().fromArray(i.ambientLight),Array.isArray(i.ambientTrilight)&&(n.ambientTrilight=i.ambientTrilight.map(s=>new ne().fromArray(s))),n.ambientMode=i.ambientMode,n.environmentReflectionSource=i.environmentReflectionSource}}return null}}ue.registerCallback(de.ContextCreated,o=>{const e=o.context,t=w.findObjectOfType(Nu,e);t?.sourceId&&(t.enabled=!0)});class Nu extends R{ambientMode=Ha.Skybox;ambientLight;ambientTrilight;ambientIntensity=1;environmentReflectionSource=du.Skybox;_hasReflection=!1;_ambientLightObj;_hemisphereLightObj;awake(){if(this.sourceId){const t=this.environmentReflectionSource===du.Skybox?$n.Skybox:$n.Reflection,i=this.context.lightmaps.tryGet(this.sourceId,t,0);this._hasReflection=i!=null,i&&this.context.sceneLighting.internalRegisterReflection(this.sourceId,i)}this.enabled=!1,this.context.sceneLighting.internalRegisterSceneLightSettings(this),tl&&window.addEventListener("keydown",t=>{if(!this.destroyed)switch(t.key){case"l":this.enabled=!this.enabled;break}});const e=this.gameObject.userData?.components;if(e){const t=e.indexOf(this);e.splice(t,1),e.push(this)}}onDestroy(){this.context.sceneLighting.internalUnregisterSceneLightSettings(this)}calculateIntensityFactor(e){const t=Math.max(e.r,e.g,e.b);return 2.2*j.lerp(0,1.33,t)}onEnable(){if(tl&&console.warn("\u{1F4A1}\u{1F7E1} >>> Enable lighting",this.sourceId,this.enabled,this),this.ambientMode==Ha.Flat){if(this.ambientLight&&!this._ambientLightObj){const e=this.calculateIntensityFactor(this.ambientLight);this._ambientLightObj=new DS(this.ambientLight,this.ambientIntensity*e),tl&&console.log("Created ambient light",this.sourceId,this._ambientLightObj,this.ambientIntensity,e)}this._ambientLightObj&&this.gameObject.add(this._ambientLightObj)}else if(this.ambientMode===Ha.Trilight){if(this.ambientTrilight){const e=this.ambientTrilight[0],t=this.ambientTrilight[this.ambientTrilight.length-1],i=this.calculateIntensityFactor(t);this._hemisphereLightObj=new BS(t,e,this.ambientIntensity*i),this.gameObject.add(this._hemisphereLightObj),tl&&console.log("Created hemisphere ambient light",this.sourceId,this._hemisphereLightObj,this.ambientIntensity,i)}}else this._ambientLightObj&&this._ambientLightObj.removeFromParent(),this._hemisphereLightObj&&this._hemisphereLightObj.removeFromParent();this.sourceId&&(this.context.domElement.getAttribute("environment-image")||this.context.sceneLighting.internalEnableReflection(this.sourceId))}onDisable(){tl&&console.warn("\u{1F4A1}\u26AB <<< Disable lighting:",this.sourceId,this),this._ambientLightObj&&this._ambientLightObj.removeFromParent(),this._hemisphereLightObj&&this._hemisphereLightObj.removeFromParent(),this.sourceId&&this.context.sceneLighting.internalDisableReflection(this.sourceId)}}const Vf=x("debugstencil");function pT(o,e){return(o&1<<e.layer)!=0}const mT=Symbol("stencils");class nr{get name(){return"NEEDLE_render_objects"}static stencils={};static applyStencil(e){if(!e)return;const t=e.sourceId;if(Vf&&console.log(t,nr.stencils),!t)return;const i=nr.stencils[t];if(i)for(let n=i.length-1;n>=0;n--){const s=i[n];if(pT(s.layer,e)){Vf&&console.log(s),setTimeout(()=>{$i()&&ou(e.gameObject)&&(ge("Stencil not supported on instanced objects"),console.warn("Stencil not supported on instanced objects",e))},500);for(let r=0;r<e.sharedMaterials.length;r++){let a=e.sharedMaterials[r];a&&(a=a.clone(),a[mT]=!0,a.stencilWrite=!0,a.stencilWriteMask=255,a.stencilFuncMask=255,a.stencilRef=s.value,a.stencilFunc=s.compareFunc,a.stencilZPass=s.passOp,a.stencilFail=s.failOp,a.stencilZFail=s.zFailOp,e.sharedMaterials[r]=a)}e.gameObject.renderOrder=s.event*1e3+s.index*50;break}}}parser;source;constructor(e,t){this.parser=e,this.source=t}afterRoot(e){const t=this.parser.json.extensions;if(t){const i=t[fT];if(i){Vf&&console.log(i);const n=i.stencil;if(n&&Array.isArray(n))for(const s of n){const r={...s};r.compareFunc=gT(r.compareFunc),r.passOp=Wf(r.passOp),r.failOp=Wf(r.failOp),r.zFailOp=Wf(r.zFailOp),nr.stencils[this.source]||(nr.stencils[this.source]=[]),nr.stencils[this.source].push(r)}}}return null}}function Wf(o){switch(o){case 0:return KS;case 1:return ZS;case 2:return YS;case 3:return QS;case 4:return XS;case 6:return qS;case 7:return GS;case 5:return HS}return 0}function gT(o){switch(o){case 1:return J0;case 2:return $S;case 3:return WS;case 4:return VS;case 5:return NS;case 6:return US;case 7:return zS;case 8:return FS}return J0}const fT="NEEDLE_render_objects";var iw=(o=>(o[o.INT=5124]="INT",o[o.FLOAT=5126]="FLOAT",o[o.FLOAT_VEC2=35664]="FLOAT_VEC2",o[o.FLOAT_VEC3=35665]="FLOAT_VEC3",o[o.FLOAT_VEC4=35666]="FLOAT_VEC4",o[o.INT_VEC2=35667]="INT_VEC2",o[o.INT_VEC3=35668]="INT_VEC3",o[o.INT_VEC4=35669]="INT_VEC4",o[o.BOOL=35670]="BOOL",o[o.BOOL_VEC2=35671]="BOOL_VEC2",o[o.BOOL_VEC3=35672]="BOOL_VEC3",o[o.BOOL_VEC4=35673]="BOOL_VEC4",o[o.FLOAT_MAT2=35674]="FLOAT_MAT2",o[o.FLOAT_MAT3=35675]="FLOAT_MAT3",o[o.FLOAT_MAT4=35676]="FLOAT_MAT4",o[o.SAMPLER_2D=35678]="SAMPLER_2D",o[o.SAMPLER_3D=35680]="SAMPLER_3D",o[o.SAMPLER_CUBE=35681]="SAMPLER_CUBE",o[o.UNKNOWN=0]="UNKNOWN",o))(iw||{});const Jn=x("debugcustomshader"),il="NEEDLE_techniques_webgl";class yT{objectToWorldMatrix=new ee;worldToObjectMatrix=new ee;objectToWorld=new Array;worldToObject=new Array;updateFrom(e){this.objectToWorldMatrix.copy(e.matrixWorld),hu(this.objectToWorldMatrix,this.objectToWorld),this.worldToObjectMatrix.copy(e.matrixWorld).invert(),hu(this.worldToObjectMatrix,this.worldToObject)}}class Me extends eb{identifier;onBeforeRenderSceneCallback=this.onBeforeRenderScene.bind(this);clone(){const e=super.clone();return nw(e),e}constructor(e,...t){super(...t),this.identifier=e,Jn&&console.log(this),this.type="NEEDLE_CUSTOM_SHADER",this.uniforms[this._objToWorldName]||(this.uniforms[this._objToWorldName]={value:[]}),this.uniforms[this._worldToObjectName]||(this.uniforms[this._worldToObjectName]={value:[]}),this.uniforms[this._viewProjectionName]||(this.uniforms[this._viewProjectionName]={value:[]}),this.uniforms[this._sphericalHarmonicsName],(this.depthTextureUniform||this.opaqueTextureUniform)&&N.Current.pre_render_callbacks.push(this.onBeforeRenderSceneCallback)}dispose(){super.dispose();const e=N.Current.pre_render_callbacks.indexOf(this.onBeforeRenderSceneCallback);e>=0&&N.Current.pre_render_callbacks.splice(e,1)}_sphericalHarmonicsName="unity_SpecCube0";_objToWorldName="hlslcc_mtx4x4unity_ObjectToWorld";_worldToObjectName="hlslcc_mtx4x4unity_WorldToObject";static viewProjection=new ee;static _viewProjectionValues=[];_viewProjectionName="hlslcc_mtx4x4unity_MatrixVP";static viewMatrix=new ee;static _viewMatrixValues=[];_viewMatrixName="hlslcc_mtx4x4unity_MatrixV";static _worldSpaceCameraPosName="_WorldSpaceCameraPos";static _worldSpaceCameraPos=new b;static _mainLightColor=new pe;static _mainLightPosition=new b;static _lightData=new pe;_rendererData=new yT;get depthTextureUniform(){if(this.uniforms)return this.uniforms._CameraDepthTexture}get opaqueTextureUniform(){if(this.uniforms)return this.uniforms._CameraOpaqueTexture}onBeforeRenderScene(){this.opaqueTextureUniform&&N.Current.setRequireColor(!0),this.depthTextureUniform&&N.Current.setRequireDepth(!0)}onBeforeRender(e,t,i,n,s,r){n.attributes.tangent||n.computeTangents(),this.onUpdateUniforms(i,s)}onUpdateUniforms(e,t){const i=N.Current;if(e&&(Me.viewProjection&&this.uniforms[this._viewProjectionName]&&(Me.viewProjection.copy(e.projectionMatrix).multiply(e.matrixWorldInverse),hu(Me.viewProjection,Me._viewProjectionValues)),Me.viewMatrix&&this.uniforms[this._viewMatrixName]&&(Me.viewMatrix.copy(e.matrixWorldInverse),hu(Me.viewMatrix,Me._viewMatrixValues)),this.uniforms[Me._worldSpaceCameraPosName]&&Me._worldSpaceCameraPos.setFromMatrixPosition(e.matrixWorld)),this.uniforms._TimeParameters&&(this.uniforms._TimeParameters.value=i.sceneLighting.timeVec4),this.uniforms._Time){const a=this.uniforms._Time.value;a.x=i.sceneLighting.timeVec4.x/20,a.y=i.sceneLighting.timeVec4.x,a.z=i.sceneLighting.timeVec4.x*2,a.w=i.sceneLighting.timeVec4.x*3}if(this.uniforms._SinTime){const a=this.uniforms._SinTime.value;a.x=Math.sin(i.sceneLighting.timeVec4.x/8),a.y=Math.sin(i.sceneLighting.timeVec4.x/4),a.z=Math.sin(i.sceneLighting.timeVec4.x/2),a.w=Math.sin(i.sceneLighting.timeVec4.x)}if(this.uniforms._CosTime){const a=this.uniforms._CosTime.value;a.x=Math.cos(i.sceneLighting.timeVec4.x/8),a.y=Math.cos(i.sceneLighting.timeVec4.x/4),a.z=Math.cos(i.sceneLighting.timeVec4.x/2),a.w=Math.cos(i.sceneLighting.timeVec4.x)}if(this.uniforms.unity_DeltaTime){const a=this.uniforms.unity_DeltaTime.value;a.x=i.time.deltaTime,a.y=1/i.time.deltaTime,a.z=i.time.smoothedDeltaTime,a.w=1/i.time.smoothedDeltaTime}const n=i.mainLight;if(n){const a=K(n.gameObject,Me._mainLightPosition);this.uniforms._MainLightPosition={value:a.normalize()},Me._mainLightColor.set(n.color.r,n.color.g,n.color.b,0),this.uniforms._MainLightColor={value:Me._mainLightColor};const l=n.intensity;Me._lightData.z=l,this.uniforms.unity_LightData={value:Me._lightData}}if(e&&(Me.viewProjection&&this.uniforms[this._viewProjectionName]&&(this.uniforms[this._viewProjectionName].value=Me._viewProjectionValues),Me.viewMatrix&&this.uniforms[this._viewMatrixName]&&(this.uniforms[this._viewMatrixName].value=Me._viewMatrixValues),this.uniforms[Me._worldSpaceCameraPosName]&&(this.uniforms[Me._worldSpaceCameraPosName]={value:Me._worldSpaceCameraPos}),i.mainCameraComponent)){if(this.uniforms._ProjectionParams){const a=this.uniforms._ProjectionParams.value;a.x=1,a.y=i.mainCameraComponent.nearClipPlane,a.z=i.mainCameraComponent.farClipPlane,a.w=1/a.z,this.uniforms._ProjectionParams.value=a}if(this.uniforms._ZBufferParams){const a=this.uniforms._ZBufferParams.value,l=i.mainCameraComponent;a.x=1-l.farClipPlane/l.nearClipPlane,a.y=l.farClipPlane/l.nearClipPlane,a.z=a.x/l.farClipPlane,a.w=a.y/l.farClipPlane,this.uniforms._ZBufferParams.value=a}if(this.uniforms._ScreenParams){const a=this.uniforms._ScreenParams.value;a.x=i.domWidth,a.y=i.domHeight,a.z=1+1/a.x,a.w=1+1/a.y,this.uniforms._ScreenParams.value=a}if(this.uniforms._ScaledScreenParams){const a=this.uniforms._ScaledScreenParams.value;a.x=i.domWidth,a.y=i.domHeight,a.z=1+1/a.x,a.w=1+1/a.y,this.uniforms._ScaledScreenParams.value=a}}const s=this.depthTextureUniform;s&&(s.value=i.depthTexture);const r=this.opaqueTextureUniform;if(r&&(r.value=i.opaqueColorTexture),t){const a=this._rendererData;a.updateFrom(t),this.uniforms[this._worldToObjectName].value=a.worldToObject,this.uniforms[this._objToWorldName].value=a.objectToWorld}this.uniformsNeedUpdate=!0}}class bT{get name(){return il}parser;identifier;constructor(e,t){this.parser=e,this.identifier=t}loadMaterial(e){const t=this.parser.json.materials[e];if(!t)return Jn&&console.log(e,this.parser.json.materials),null;if(!t.extensions||!t.extensions[il])return Jn&&console.log(`Material ${e} does not use NEEDLE_techniques_webgl`),null;Jn&&console.log(`Material ${e} uses NEEDLE_techniques_webgl`,t);const i=t.extensions[il].technique;if(i<0)return console.debug(`Material ${e} does not have a valid technique index`),null;const n=this.parser.json.extensions[il];if(!n)return Jn?console.error("Missing shader data",this.parser.json.extensions):console.debug("Missing custom shader data in parser.json.extensions"),null;Jn&&console.log(n);const s=n.techniques[i];return s?new Promise(async(r,a)=>{const l=await dM(n,s.program),c=l?.fragmentShader,h=l?.vertexShader;if(!c||!h)return a();Jn&&console.log("loadMaterial",t,l);const d={},p=s.uniforms;(h.includes("_Time")||c.includes("_Time"))&&(d._Time={value:new pe(0,0,0,0)}),(h.includes("_SinTime")||c.includes("_SinTime"))&&(d._SinTime={value:new pe(0,0,0,0)}),(h.includes("_CosTime")||c.includes("_CosTime"))&&(d._CosTime={value:new pe(0,0,0,0)}),(h.includes("unity_DeltaTime")||c.includes("unity_DeltaTime"))&&(d.unity_DeltaTime={value:new pe(0,0,0,0)});for(const g in p){const y=g;switch(y){case"_TimeParameters":const _=new pe;d[y]={value:_};break;case"hlslcc_mtx4x4unity_MatrixV":case"hlslcc_mtx4x4unity_MatrixVP":d[y]={value:[]};break;case"_MainLightPosition":case"_MainLightColor":case"_WorldSpaceCameraPos":d[y]={value:[0,0,0,1]};break;case"unity_OrthoParams":break;case"unity_SpecCube0":d[y]={value:null};break;default:case"_ScreenParams":case"_ZBufferParams":case"_ProjectionParams":d[y]={value:[0,0,0,0]};break;case"_CameraOpaqueTexture":case"_CameraDepthTexture":d[y]={value:null};break}}let m=!1;if(t.extensions&&t.extensions[il]){const g=t.extensions[il];if(g.technique===i){Jn&&console.log(t.name,"Material Properties",g);for(const y in g.values){const _=g.values[y];if(typeof _=="string"){if(_.startsWith("/textures/")){const v=_.substring(10),P=Number.parseInt(v);if(P>=0){const M=await this.parser.getDependency("texture",P);M instanceof Re&&(M.colorSpace=bo,M.needsUpdate=!0),d[y]={value:M};continue}}switch(y){case"alphaMode":_==="BLEND"&&(m=!0);continue}}if(Array.isArray(_)&&_.length===4){d[y]={value:new pe(_[0],_[1],_[2],_[3])};continue}d[y]={value:_}}}}const f=new Me(this.identifier,{name:t.name??"",uniforms:d,vertexShader:h,fragmentShader:c,lights:!1});switch(f.glslVersion=JS,f.vertexShader=f.vertexShader.replace("#version 300 es",""),f.fragmentShader=f.fragmentShader.replace("#version 300 es",""),d._Cull?.value){case 0:f.side=vi;break;case 1:f.side=_d;break;case 2:f.side=ds;break;default:f.side=ds;break}switch(d._ZTest?.value){case 3:f.depthTest=!0,f.depthFunc=rC;break;case 6:f.depthTest=!0,f.depthFunc=sC;break;case 2:f.depthTest=!0,f.depthFunc=oC;break;case 4:f.depthTest=!0,f.depthFunc=nC;break;case 5:f.depthTest=!0,f.depthFunc=iC;break;case 7:f.depthTest=!0,f.depthFunc=tC;break;case 8:f.depthTest=!1,f.depthFunc=eC;break}f.transparent=m,m&&(f.depthWrite=!1),cM(d),f.onUpdateUniforms();for(const g in p){const y=g,_=p[g].type;if(d[y]?.value===void 0)switch(_){case iw.SAMPLER_2D:d[y]={value:aM},console.warn("Missing/unassigned texture, fallback to white: "+y);break;default:y==="unity_OrthoParams"||console.warn("TODO: EXPECTED UNIFORM / fallback NOT SET: "+y,p[g]);break}}Jn&&console.log(f.uuid,d),nw(f),r(f)}):null}}function nw(o){if(o.uniforms){Jn&&console.log("Uniforms:",o.uniforms);for(const t in o.uniforms)switch(e(t,t),t){case"_Color":e("color",t);break}}function e(t,i){Object.getOwnPropertyDescriptor(o,t)||Object.defineProperty(o,t,{get:()=>o.uniforms[i].value,set:n=>{o.uniforms[i].value=n,o.needsUpdate=!0}})}}const _T=x("debugextensions");let Vu;const vT=import("./vendor-DPCU8cUF.min.js").then(o=>o.index$2).then(async o=>(Vu=o.GLTFAnimationPointerExtension,Vu)).catch(o=>{console.warn("Failed to import GLTFLoaderAnimationPointer. Please use @needle-tools/three-animationpointer for full KHR_animation support",o)}),Ur=new Array;function xT(o){Ur.includes(o)||Ur.push(o)}function wT(o){const e=Ur.indexOf(o);e>=0&&Ur.splice(e,1)}function $f(o){if(o instanceof xo){const e=new Jx;return o.register(t=>(e.parser=t,e)),e}return null}class ST{resolvePath(e){return e.includes("/extensions/builtin_components/")?e.replace("/extensions/builtin_components/","/userData/components/"):e.includes("extensions/builtin_components/")?e.replace("extensions/builtin_components/","/userData/components/"):e}}async function Wu(o,e,t){const i=t.indexOf("?");i>=0&&(t=t.substring(0,i)),o.register(n=>new dT(n)),o.register(n=>new Ik(n)),o.register(n=>new nM(n,e.lightmaps,t)),o.register(n=>new uT(n,t,e)),o.register(n=>new bT(n,t)),o.register(n=>new nr(n,t)),o.register(n=>new $e(n)),o.register(n=>new aT(n)),q_()&&o.register(n=>new Ul(n)),await vT.catch(n=>{}),o.register(n=>{if(Vu){const s=new Vu(n);return s.setAnimationPointerResolver.bind(s)(new ST),s}else return(_T||A())&&console.error("Missing KHR_animation_pointer extension..."),{name:"KHR_animation_pointer_NOT_AVAILABLE"}});for(const n of Ur)n.onImport&&n.onImport(o,t,e)}function Hf(o,e){for(const t of Ur)t.onExport&&t.onExport(o,e)}function ow(o,e,t){for(const i of Ur)i.onLoaded&&i.onLoaded(o,e,t)}class sw{constructor(e){this.writer=e,this.name="EXT_mesh_gpu_instancing"}writeNode(e,t){if(e.constructor.name!=="InstancedMesh")return;const i=this.writer,n=i.extensionsUsed,s={};t.extensions=t.extensions||{},t.extensions[this.name]=s;let r=new ee;const a=new Array,l=new Array,c=new Array;for(let m=0;m<e.count;m++){e.getMatrixAt(m,r);let f=new b,g=new U,y=new b;r.decompose(f,g,y),a.push(f.x,f.y,f.z),l.push(g.x,g.y,g.z,g.w),c.push(y.x,y.y,y.z)}const h=new Float32Array(a),d=new Float32Array(l),p=new Float32Array(c);s.attributes={TRANSLATION:i.processAccessor(new pt(h,3)),ROTATION:i.processAccessor(new pt(d,4)),SCALE:i.processAccessor(new pt(p,3))},n[this.name]=!0}}var CT=Object.defineProperty,rw=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&CT(e,t,n),n};const Nc=x("debugreflectionprobe"),aw=x("noreflectionprobe"),Gf=Symbol("reflectionProbeKey"),lw=Symbol("original material"),qf=class es extends R{static _probes=new Map;static isUsingReflectionProbe(e){return!!(e[Gf]||e[lw]?.[Gf])}static get(e,t,i,n){if(!e||e.isObject3D!==!0||aw)return null;const s=es._probes.get(t);if(s){for(const r of s)if(r.__didAwake||r.__internalAwake(),r.activeAndEnabled){if(n){if(r.gameObject===n)return r}else if(r.isInBox(e))return Nc&&console.log("Found reflection probe",e.name,r.name),r}}return Nc&&console.debug("Did not find reflection probe",e.name,i,e),null}_texture;set texture(e){if(e&&!(e instanceof Re)){console.error("ReflectionProbe.texture must be a Texture",e);return}this._texture=e,e&&(e.mapping=_o,e.colorSpace=bo,e.needsUpdate=!0)}get texture(){return this._texture}center;size;_boxHelper;isInBox(e){return this._boxHelper?.isInBox(e)}constructor(){super(),es._probes.has(this.context)||es._probes.set(this.context,[]),es._probes.get(this.context)?.push(this)}awake(){this._boxHelper=this.gameObject.addComponent(wt),this._boxHelper.updateBox(!0),Nc&&this._boxHelper.showHelper(5592320,!0),this._texture&&(this._texture.mapping=_o,this._texture.colorSpace=bo,this._texture.needsUpdate=!0)}start(){!this._texture&&A()&&(console.warn(`[ReflectionProbe] Missing texture. Please assign a custom cubemap texture. To use reflection probes assign them to your renderer's "anchor" property.`),ge("ReflectionProbe configuration hint: See browser console for details"))}onDestroy(){const e=es._probes.get(this.context);if(e){const t=e.indexOf(this);t>=0&&e.splice(t,1)}}static _rendererMaterialsCache=new Map;onSet(e){if(aw||!this.enabled||e.sharedMaterials?.length<=0||!this.texture)return;let t=es._rendererMaterialsCache.get(e);t||(t=[],es._rendererMaterialsCache.set(e,t));for(let i=0;i<e.sharedMaterials.length;i++){const n=e.sharedMaterials[i];if(!n||n.envMap===void 0||n instanceof we)continue;let s=t[i];const r=n===s?.copy,a=!s||s.material.uuid!==n.uuid||s.copy.version!==n.version;if(!r&&a){if(Nc){let h="";s?s.material!==n?h="reference changed; cached instance?: "+r:s.copy.version!==n.version&&(h="version changed"):h="not cached",console.warn("Cloning material",n.name,n.version,"Reason:",h,`
|
|
991
991
|
`,n.uuid,`
|
|
992
992
|
`,s?.copy.uuid,`
|
|
993
993
|
`,e.name)}const c=n.clone();c.version=n.version,s?(s.copy=c,s.material=n):(s={material:n,copy:c},t.push(s)),c[Gf]=this,c[lw]=n,Nc&&console.log("Set reflection",e.name,e.guid)}s&&s.copy&&(s.copy.onBeforeCompile=n.onBeforeCompile);const l=s?.copy;l.envMap=this.texture,e.sharedMaterials[i]=l}}onUnset(e){const t=es._rendererMaterialsCache.get(e);if(t)for(let i=0;i<t.length;i++){const n=t[i];e.sharedMaterials[i]=n.material}}};rw([u(b)],qf.prototype,"center"),rw([u(b)],qf.prototype,"size");let Vc=qf;const li=x("debuginstancing");class ma{static instance=new ma;static getStartInstanceCount=e=>4;objs=[];setup(e,t,i,n,s,r=0){e.applySettings(t);const a=this.tryCreateOrAddInstance(t,i,s);if(a){n===null&&(n=[]),n.push(a),$e.assignTextureLOD(a.renderer.material,0);for(let l=0;l<e.sharedMeshes.length;l++){const c=e.sharedMeshes[l],h=c.geometry;$e.assignMeshLOD(c,0).then(d=>{d&&e.activeAndEnabled&&h!=d&&a.setGeometry(d)})}}else if(r<=0&&t.type!=="Mesh"){const l=r+1;for(const c of t.children)n=this.setup(e,c,i,n,s,l)}return r===0&&s.useMatrixWorldAutoUpdate&&n&&n.length>=0&&this.autoUpdateInstanceMatrix(t),n}tryCreateOrAddInstance(e,t,i){if(e.type==="Mesh"){const n=i.foundMeshes;if(i.foundMeshes+=1,!i.rend.enableInstancing)return null;if(i.rend.enableInstancing!==!0){if(n>=i.rend.enableInstancing.length)return li&&console.error("Something is wrong with instance setup",e,i.rend.enableInstancing,n),null;if(!i.rend.enableInstancing[n])return null}const s=e,r=s.material;for(const h of this.objs)if(!!h.canAdd(s.geometry,r))return h.addInstance(s);let a=ma.getStartInstanceCount(e);(!a||a<0)&&(a=4);let l=e.name;l?.length||(l=Rb());const c=new PT(l,s.geometry,r,a,t);return this.objs.push(c),c.addInstance(s)}return null}autoUpdateInstanceMatrix(e){const t=e.matrixWorld.multiplyMatrices.bind(e.matrixWorld),i=e.matrixWorld.clone(),n=(s,r)=>{const a=t(s,r);return(e[dc]||i.equals(a)===!1)&&(i.copy(a),e[dc]=!0),a};e.matrixWorld.multiplyMatrices=n}}class ba{static all=[];get name(){return this.object.name}get isActive(){return this.__instanceIndex>=0}get vertexCount(){return this.object.geometry.attributes.position.count}get maxVertexCount(){return Math.max(this.meshInformation.vertexCount,this.vertexCount)}get reservedVertexCount(){return this.__reservedVertexRange}get indexCount(){return this.object.geometry.index?this.object.geometry.index.count:0}get maxIndexCount(){return Math.max(this.meshInformation.indexCount,this.indexCount)}get reservedIndexCount(){return this.__reservedIndexRange}object;renderer;__instanceIndex=-1;__reservedVertexRange=0;__reservedIndexRange=0;__geometryIndex=-1;meshInformation;constructor(e,t){this.__instanceIndex=-1,this.object=e,this.renderer=t,e[J_]=t,this.meshInformation=Nr(e.geometry),ba.all.push(this)}updateMeshInformation(){const e=Nr(this.object.geometry),t=this.meshInformation.vertexCount,i=this.meshInformation.indexCount;return Object.assign(this.meshInformation,e),t!==this.meshInformation.vertexCount||i!==this.meshInformation.indexCount}updateInstanceMatrix(e=!1,t=!0){this.__instanceIndex<0||(t&&this.object.updateWorldMatrix(!0,e),this.renderer.updateInstance(this.object.matrixWorld,this.__instanceIndex))}setMatrix(e){this.__instanceIndex<0||this.renderer.updateInstance(e,this.__instanceIndex)}setGeometry(e){if(this.__geometryIndex<0)return!1;const t=this;if(this.vertexCount>this.__reservedVertexRange)return i(`Instancing: Can not update geometry (${this.name}), reserved vertex range is too small: ${this.__reservedVertexRange.toLocaleString()} < ${this.vertexCount.toLocaleString()} vertices for ${this.name}`);if(this.indexCount>this.__reservedIndexRange)return i(`Instancing: Can not update geometry (${this.name}), reserved index range is too small: ${this.__reservedIndexRange.toLocaleString()} < ${this.indexCount.toLocaleString()} indices for ${this.name}`);return this.renderer.updateGeometry(e,this.__geometryIndex);function i(n){return t.updateMeshInformation()&&(t.renderer.remove(t,!0),t.renderer.add(t))?!0:((A()||li)&&console.error(n),!1)}}add(){this.__instanceIndex>=0||(this.renderer.add(this),w.markAsInstancedRendered(this.object,!0))}remove(e){if(!(this.__instanceIndex<0)&&(this.renderer.remove(this,e),w.markAsInstancedRendered(this.object,!1),e)){const t=ba.all.indexOf(this);t>=0&&ba.all.splice(t,1)}}}class PT{get batchedMesh(){return this._batchedMesh}get visible(){return this._batchedMesh.visible}set visible(e){this._batchedMesh.visible=e}get castShadow(){return this._batchedMesh.castShadow}set castShadow(e){this._batchedMesh.castShadow=e}set receiveShadow(e){this._batchedMesh.receiveShadow=e}allowResize=!0;name="";geometry;material;get count(){return this._currentInstanceCount}updateBounds(e=!0,t=!0){if(this._needUpdateBounds=!1,e&&this._batchedMesh.computeBoundingBox(),t&&this._batchedMesh.computeBoundingSphere(),li&&this._batchedMesh.boundingSphere){const i=this._batchedMesh.boundingSphere;F.DrawWireSphere(i.center,i.radius,65280)}}_context;_batchedMesh;_handles=[];_geometryIds=new Map;_maxInstanceCount;_currentInstanceCount=0;_currentVertexCount=0;_currentIndexCount=0;_maxVertexCount;_maxIndexCount;static nullMatrix=new ee;canAdd(e,t){return this._maxVertexCount>1e7||t!==this.material||!this.validateGeometry(e)?!1:!!(!this.mustGrow(e)||this.allowResize)}_needUpdateBounds=!1;_debugMaterial=null;constructor(e,t,i,n,s){this.name=e,this.geometry=t,this.material=i,this._context=s,this._maxInstanceCount=Math.max(2,n),li&&(this._debugMaterial=cw());const r=this.tryEstimateVertexCountSize(this._maxInstanceCount,[t],n);this._maxVertexCount=r.vertexCount,this._maxIndexCount=r.indexCount,this._batchedMesh=new tb(this._maxInstanceCount,this._maxVertexCount,this._maxIndexCount,this._debugMaterial??this.material),this._batchedMesh[uc]=!0,this._batchedMesh.visible=!0,this._context.scene.add(this._batchedMesh),i instanceof eb&&(i.defines.USE_INSTANCING=!0,i.needsUpdate=!0),s.pre_render_callbacks.push(this.onBeforeRender),s.post_render_callbacks.push(this.onAfterRender),li&&console.log(`Instanced renderer created with ${this._maxInstanceCount} instances, ${this._maxVertexCount} max vertices and ${this._maxIndexCount} max indices for "${e}"`)}dispose(){li&&console.warn("Dispose instanced renderer",this.name),this._context.scene.remove(this._batchedMesh),this._batchedMesh.dispose(),this._batchedMesh=null,this._handles=[]}addInstance(e){const t=new ba(e,this);e.castShadow===!0&&this._batchedMesh.castShadow===!1&&(this._batchedMesh.castShadow=!0),e.receiveShadow===!0&&this._batchedMesh.receiveShadow===!1&&(this._batchedMesh.receiveShadow=!0);try{this.add(t)}catch(i){if(console.error(`Failed adding mesh to instancing (object name: "${e.name}", instances: ${this._currentInstanceCount.toLocaleString()}/${this._maxInstanceCount.toLocaleString()}, vertices: ${this._currentVertexCount.toLocaleString()}/${this._maxVertexCount.toLocaleString()}, indices: ${this._currentIndexCount.toLocaleString()}/${this._maxIndexCount.toLocaleString()})
|
|
@@ -1414,7 +1414,7 @@ To allow joining a room without a query parameter you can set "requireRoomParame
|
|
|
1414
1414
|
Please choose one of the following options to fix this:
|
|
1415
1415
|
A) Set a room name in the SyncedRoom component
|
|
1416
1416
|
B) Set a room name in the URL parameter "?`+this.urlParameterName+`=my_room"
|
|
1417
|
-
C) Set "joinRandomRoom" to true`),!1):(g0&&console.log("Join "+this.roomName),this._userWantsToBeInARoom=!0,this.context.connection.joinRoom(this.roomName),!0))}_lastPingTime=0;_lastRoomTime=-1;_userWantsToBeInARoom=!1;update(){this.context.connection.isConnected&&(this.context.time.time-this._lastPingTime>3&&(this._lastPingTime=this.context.time.time,this.context.connection.sendPing()),this.context.connection.isInRoom&&(this._lastRoomTime=this.context.time.time)),this._lastRoomTime>0&&this.context.time.time-this._lastRoomTime>.3&&(this._lastRoomTime=-1,this.autoRejoin?this._userWantsToBeInARoom&&(console.log("Disconnected from networking backend - attempt reconnecting now"),this.tryJoinRoom()):A()&&console.warn("You are not connected to a room anymore (possibly because the tab was inactive for too long and the server kicked you?)"))}getViewOnlyUrl(){if(this.context.connection.isConnected&&this.context.connection.currentRoomViewId){const e=window.location.search,t=new URLSearchParams(e);return t.has(this.urlParameterName)&&t.delete(this.urlParameterName),t.set(m0,this.context.connection.currentRoomViewId),window.location.origin+window.location.pathname+"?"+t.toString()}return null}setRandomRoomUrlParameter(){const e=ql(),t=this.generateRoomName();x(this.urlParameterName)?e.set(this.urlParameterName,t):e.append(this.urlParameterName,t),Em(t,e)}generateRoomName(){let e="";for(let t=0;t<6;t++)e+=Math.floor(Math.random()*10).toFixed(0);return e}_roomButton;_roomButtonIconJoin;_roomButtonIconLeave;createRoomButton(){if(this._roomButton)return this._roomButton;const e=document.createElement("button");return this._roomButton=e,e.classList.add("create-room-button"),e.setAttribute("priority","90"),e.onclick=()=>{if(this.context.connection.isInRoom)this.urlParameterName&&Xl(this.urlParameterName,null),this.context.connection.leaveRoom(),this._userWantsToBeInARoom=!1;else{if(this.urlParameterName){const t=x(this.urlParameterName);(!t||t===!0)&&(this._lastJoinedRoom?Xl(this.urlParameterName,this._lastJoinedRoom):this.setRandomRoomUrlParameter())}this.tryJoinRoom()}},this._roomButtonIconJoin=Ct("group"),this._roomButtonIconLeave=Ct("group_off"),this.updateRoomButtonState(),this.context.connection.beginListen(te.JoinedRoom,this.updateRoomButtonState),this.context.connection.beginListen(te.LeftRoom,this.updateRoomButtonState),e}updateRoomButtonState=()=>{this._roomButton&&(this.context.connection.isInRoom?(this._roomButton.title="Leave the networked room",this._roomButton.textContent="Leave Room",this._roomButtonIconJoin?.remove(),this._roomButton.prepend(this._roomButtonIconLeave)):(this._roomButton.title="Create or join a networked room",this._roomButton.textContent="Join Room",this._roomButtonIconLeave?.remove(),this._roomButton.prepend(this._roomButtonIconJoin)))};destroyRoomButton(){this.context.connection.stopListen(te.JoinedRoom,this.updateRoomButtonState),this.context.connection.stopListen(te.LeftRoom,this.updateRoomButtonState)}_viewOnlyButton;onEnableViewOnlyButton(){this.context.connection.isConnected?this.onCreateViewOnlyButton():(this.context.connection.stopListen(te.JoinedRoom,this.onCreateViewOnlyButton),this.context.connection.beginListen(te.JoinedRoom,this.onCreateViewOnlyButton))}onDisableViewOnlyButton(){this.context.connection.stopListen(te.JoinedRoom,this.onCreateViewOnlyButton),this._viewOnlyButton?.remove()}onCreateViewOnlyButton=()=>{if(!this._viewOnlyButton){const e=document.createElement("button");this._viewOnlyButton=e,e.classList.add("view-only-button"),e.setAttribute("priority","90"),e.onclick=()=>{const t=this.getViewOnlyUrl();t?.length?navigator.canShare({url:t})?navigator.share({url:t})?.catch(i=>{console.warn(i)}):(navigator.clipboard.writeText(t),Te("View only URL copied to clipboard")):ge("Could not create view only URL")},e.title="Copy the view only URL: A page accessed by the view only URL can not be modified by visiting users.",e.textContent="Share View URL",e.prepend(Ct("visibility"))}this.context.menu.appendChild(this._viewOnlyButton)}}Qs([u()],In.prototype,"roomName",2),Qs([u()],In.prototype,"urlParameterName",2),Qs([u()],In.prototype,"joinRandomRoom",2),Qs([u()],In.prototype,"requireRoomParameter",2),Qs([u()],In.prototype,"autoRejoin",2),Qs([u()],In.prototype,"createJoinButton",2),Qs([u()],In.prototype,"createViewOnlyButton",2),Qs([u()],In.prototype,"roomPrefix",1);function B2(){const o=x("testwindowcount")||0;o&&o>0&&F2(o)}function F2(o){if(x("testwindow"))return null;const e=new URL(window.location.href);Tm(e.searchParams,LR,1),Tm(e.searchParams,"testwindow",1);const t=e.toString(),i=[];window.onbeforeunload=()=>{for(const l of i)l.close()};const n=.05,s=128;let r=0,a=0;for(let l=0;l<o;l++){r*s+s*.01>=window.innerWidth&&(a+=1,r=0);const c=r*(s*(1+n))+window.screenLeft,h=a*(s*(1+n))+window.screenTop+90+60*a;r+=1;const d=window.open(t,"test window "+l,`popup=yes width=${s} height=${s} top=${h} left=${c}`);if(!d){console.warn("Failed to open window");continue}i.push(d),d.onload=()=>{d.onbeforeunload=()=>{for(let p=0;p<i.length;p++){const m=i[p];m!==d&&m.close()}i.length=0}}}return i}class f0 extends R{awake(){B2()}}class y0 extends R{transformsPerFrame=10;interval=0;useFlatbuffers=!0;awake(){if(this.useFlatbuffers)this.context.connection.beginListenBinary(Ec,e=>{});else{this.models=[];for(let e=0;e<this.transformsPerFrame;e++)this.models.push(new z2(this.context.connection.connectionId+"_simulatedTransform_"+e,this))}}builder=null;models=null;update(){if(this.context.connection.isConnected){if(this.useFlatbuffers){if(!this.context.connection.connectionId||this.context.time.frameCount%this.interval!==0)return;this.builder===null&&(this.builder=new Cm(1024));const e=this.builder;for(let t=0;t<this.transformsPerFrame;t++){e.clear();const i=kx(this.context.connection.connectionId,this);this.context.connection.sendBinary(i)}}else if(this.models)for(let e=0;e<this.models.length;e++){const t=this.models[e];t.dontSave=!0,t.update(this,null),this.context.connection.send("TestSimulateUserData-"+e,t)}}}}class z2{guid;fast=!1;position;rotation;velocity=void 0;dontSave;isValid(){return this.fast!==void 0||this.position!==void 0||this.rotation!==void 0||this.velocity!==void 0}constructor(e,t){this.guid=e,this.position={x:0,y:0,z:0},this.rotation={x:0,y:0,z:0,w:0},this.update(t,null)}static temp=new b;update(e,t){const i=e.worldPosition;this.position.x=i.x,this.position.y=i.y,this.position.z=i.z;const n=e.worldQuaternion;if(this.rotation.x=n.x,this.rotation.y=n.y,this.rotation.z=n.z,this.rotation.w=n.w,this.fast=!1,t){const s=t.getVelocity();this.velocity===void 0&&(this.velocity={x:0,y:0,z:0}),this.velocity.x=s.x,this.velocity.y=s.y,this.velocity.z=s.z}}}var U2=Object.defineProperty,Bp=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&U2(e,t,n),n};const N2=x("debugsignals");class Fp{guid}Bp([u()],Fp.prototype,"guid");class Th{signal;reaction}Bp([u(Fp)],Th.prototype,"signal"),Bp([u(he)],Th.prototype,"reaction");const S1=class ts extends R{static receivers={};static invoke(e){if(ts.receivers[e]){const t=ts.receivers[e];if(!t)return;for(const i of t)i.invoke(e)}}events;awake(){N2&&console.log("SignalReceiver awake",this)}onEnable(){if(this.events)for(const e of this.events)ts.receivers[e.signal.guid]||(ts.receivers[e.signal.guid]=[]),ts.receivers[e.signal.guid].push(this)}onDisable(){if(this.events){for(const e of this.events)if(ts.receivers[e.signal.guid]){const t=ts.receivers[e.signal.guid].indexOf(this);t>=0&&ts.receivers[e.signal.guid].splice(t,1)}}}invoke(e){if(!this.events||!Array.isArray(this.events))return;const t=typeof e=="object"?e.guid:e;for(const i of this.events)if(i.signal.guid===t)try{if(i.reaction){if(!i.reaction.invoke){console.warn("Missing invoke - possibly a serialization error",i,this);continue}}else{console.warn("Missing reaction for signal",i,this);continue}i.reaction.invoke()}catch(n){console.error(n)}}};Bp([u(Th)],S1.prototype,"events");let Eh=S1;var Bi=(o=>(o.Activation="ActivationTrack",o.Animation="AnimationTrack",o.Audio="AudioTrack",o.Control="ControlTrack",o.Marker="MarkerTrack",o.Signal="SignalTrack",o))(Bi||{}),co=(o=>(o[o.None=0]="None",o[o.Hold=1]="Hold",o[o.Loop=2]="Loop",o[o.PingPong=3]="PingPong",o[o.Continue=4]="Continue",o))(co||{}),b0=(o=>(o.Signal="SignalEmitter",o))(b0||{});const ho=x("debugtimeline");class kl{director;track;get muted(){return this.track.muted}set muted(e){e!==this.track.muted&&(this.track.muted=e,this.onMuteChanged?.call(this))}*forEachClip(e=!1){if(this.track?.clips)if(e)for(let t=this.track.clips.length-1;t>=0;t--)yield this.track.clips[t];else for(const t of this.track.clips)yield t}getClipTime(e,t){return t.clipIn+(e-t.start)*t.timeScale}getClipTimeNormalized(e,t){return(e-t.start)/t.duration}evaluateWeight(e,t,i,n=!0){if(t<0||t>=i.length)return 0;const s=i[t];if(n||e>=s.start&&e<=s.end){let r=1;if(s.easeInDuration>0){const a=Math.min((e-s.start)/s.easeInDuration,1);r*=a}if(s.easeOutDuration>0){const a=Math.min((s.end-e)/s.easeOutDuration,1);r*=a}return r}return 0}}class V2{clip;rootPositionOffset;rootQuaternionOffset;get hasOffsets(){return this.rootPositionOffset!==void 0||this.rootQuaternionOffset!==void 0}rootStartPosition;rootEndPosition;rootStartQuaternion;rootEndQuaternion;constructor(e){const t=e.getClip();this.clip=t;const i=e.getRoot(),n=i.name+".position",s=i.name+".quaternion";ho&&console.log(t.name,t.tracks,n);for(const r of t.tracks)if(!(r.times.length<=0)){if(r.name.endsWith(n))this.rootStartPosition=new b().fromArray(r.values,0),this.rootEndPosition=new b().fromArray(r.values,r.values.length-3),this.rootPositionOffset=this.rootEndPosition.clone().sub(this.rootStartPosition),ho&&console.log(this.rootPositionOffset);else if(r.name.endsWith(s)&&(this.rootStartQuaternion=new U().fromArray(r.values,0),this.rootEndQuaternion=new U().fromArray(r.values,r.values.length-4),this.rootQuaternionOffset=this.rootEndQuaternion.clone().multiply(this.rootStartQuaternion),ho)){const a=new nt().setFromQuaternion(this.rootQuaternionOffset);console.log("ROT",a)}}}}class Ah extends kl{models=[];trackOffset;target;mixer;clips=[];actions=[];weight=1;_actionOffsets=[];_didBind=!1;_animator=null;onDisable(){this.mixer?.stopAllAction()}onDestroy(){this.director.context.animations.unregisterAnimationMixer(this.mixer)}onStateChanged(){this._animator&&xx(this._animator.gameObject,this,this.director.enabled&&this.director.weight>0)}createHooks(e,t){if(t.tracks?.length<=0){console.warn("No tracks in AnimationClip",t);return}let i=!1,n=!1;const s=t.tracks.find(r=>r.name.includes(".position")||r.name.includes(".quaternion"))?.name.split(".");if(s){const r=s[s.length-2],a=r+".position",l=r+".quaternion";for(const c of t.tracks)!i&&c.name.endsWith(a)?(i=!0,this.createPositionInterpolant(t,e,c)):!n&&c.name.endsWith(l)&&(n=!0,this.createRotationInterpolant(t,e,c))}if(!i||!n){const r=this.mixer?.getRoot(),a=t.tracks[0],l=a.name.lastIndexOf("."),c=a.name.substring(0,l),h=c.substring(c.lastIndexOf(".")+1),d=r.getObjectByName(h);if(d)if(i){if(!n){const p=t.tracks[0].name.substring(0,l)+".quaternion";ho&&console.warn("Create quaternion track",h,d);const m=d.quaternion,f=new SC(p,[0,t.duration],[m.x,m.y,m.z,m.w,m.x,m.y,m.z,m.w]);t.tracks.push(f),this.createRotationInterpolant(t,e,f)}}else{const p=c+".position";ho&&console.warn("Create position track",h,d);const m=d.position,f=new wC(p,[0,t.duration],[m.x,m.y,m.z,m.x,m.y,m.z]);t.tracks.push(f),this.createPositionInterpolant(t,e,f)}}}bind(){if(!this._didBind){this._didBind=!0,ho&&console.log(this.models),this.mixer?this.target=this.mixer.getRoot():console.warn("No mixer was assigned to animation track");for(const e of this.actions){const t=new V2(e);this._actionOffsets.push(t)}this.target&&(this._animator=w.getComponent(this.target,ft)??null,this._animator&&xx(this._animator.gameObject,this,!0));for(const e of this.models){const t=e.asset,i=t.position,n=t.rotation;i&&i.x!==void 0&&(i.isVector3||(t.position=new b(i.x,i.y,i.z)),n.isQuaternion||(t.rotation=new U(n.x,n.y,n.z,n.w)))}this.ensureTrackOffsets()}}ensureTrackOffsets(){if(this.trackOffset){const e=this.trackOffset.position;e&&(e.isVector3||(this.trackOffset.position=new b(e.x,e.y,e.z)));const t=this.trackOffset.rotation;t&&(t.isQuaternion||(this.trackOffset.rotation=new U(t.x,t.y,t.z,t.w)))}}_useclipOffsets=!0;_totalOffsetPosition=new b;_totalOffsetRotation=new U;_totalOffsetPosition2=new b;_totalOffsetRotation2=new U;_summedPos=new b;_tempPos=new b;_summedRot=new U;_tempRot=new U;_clipRotQuat=new U;evaluate(e){if(this.track.muted||!this.mixer)return;this.bind(),this._totalOffsetPosition.set(0,0,0),this._totalOffsetRotation.set(0,0,0,1),this._totalOffsetPosition2.set(0,0,0),this._totalOffsetRotation2.set(0,0,0,1);let t=0,i=0,n=!1,s=!1,r=0;for(let a=0;a<this.clips.length;a++){const l=this.models[a],c=this.actions[a],h=l.asset;c.weight=0;const d=e>=l.start&&e<=l.end,p=l.preExtrapolationMode,m=l.postExtrapolationMode,f=a<this.clips.length-1?this.models[a+1]:null;let g=d,y=!1;if(!g&&!n&&l.end<e&&m!==co.None?(!f||f.start>e)&&(g=!0,n=!0):a==0&&!g&&!s&&l.start>e&&p!==co.None&&(!f||f.start<e)&&(g=!0,y=!0,s=!0),g){let _=this.weight;_*=this.evaluateWeight(e,a,this.models,g),_*=this.director.weight;let v=d;if(y)switch(p){case co.Hold:break;case co.Loop:e+=l.start,v=!0;break;default:e+=l.start,v=!0;break}let P=this.getClipTime(e,l),M=0;const O=h.duration;if(y&&p===co.Hold&&(P=0),v){if(h.loop)for(M+=Math.floor(P/(O+1e-6));P>O;)P-=O}else if(!d&&n)switch(m){case co.Hold:P=this.getClipTime(l.end,l);break;case co.Loop:P%=O;break;case co.PingPong:const L=Math.floor(P/O)%2!==0;P%=O,L&&(P=O-P);break}l.reversed===!0?c.time=c.getClip().duration-P:c.time=P,c.timeScale=0;const E=Math.max(0,_);if(c.weight=E,r+=E,c.clampWhenFinished=!1,c.isRunning()||c.play(),this._useclipOffsets){const L=t==0?this._totalOffsetPosition:this._totalOffsetPosition2,$=t==0?this._totalOffsetRotation:this._totalOffsetRotation2;t<1&&(i=1-_),t+=1;const D=this._summedPos.set(0,0,0),q=this._tempPos.set(0,0,0),Z=this._summedRot.identity(),I=this._tempRot.identity(),W=h.rotation;W&&(this._clipRotQuat.identity(),this._clipRotQuat.slerp(W,_));const V=this._actionOffsets[a];if(V.hasOffsets)for(let se=0;se<M;se++)V.rootPositionOffset?q.copy(V.rootPositionOffset):q.set(0,0,0),q.applyQuaternion(Z),this._clipRotQuat&&q.applyQuaternion(this._clipRotQuat),V.rootQuaternionOffset&&(I.copy(V.rootQuaternionOffset),Z.multiply(I)),D.add(q);this._clipRotQuat&&$.multiply(this._clipRotQuat),$.multiply(Z),h.position&&D.add(h.position),L.add(D)}}}if(this._useclipOffsets&&(this._totalOffsetPosition.lerp(this._totalOffsetPosition2,i),this._totalOffsetRotation.slerp(this._totalOffsetRotation2,i)),this.__mixerError===void 0&&(ho||A())&&this._animator?.runtimeAnimatorController?.mixer&&this.mixer!==this._animator?.runtimeAnimatorController?.mixer&&(this.__mixerError=!0,console.error("AnimationTrack mixer is not shared with the animator controller - this might result in the timeline to not animate properly. Please report a bug to the Needle Engine team!",this)),this._animator?.runtimeAnimatorController){const a=Math.max(0,1-r);this._animator?.runtimeAnimatorController?.update(a)}else this.mixer.update(e)}createRotationInterpolant(e,t,i){const n=i.createInterpolant.bind(i),s=new U;this.ensureTrackOffsets();const r=this.trackOffset?.rotation;i.createInterpolant=()=>{const a=n(),l=a.evaluate.bind(a);return a.evaluate=c=>{const h=l(c);if(s.set(h[0],h[1],h[2],h[3]),s.premultiply(this._totalOffsetRotation),r&&s.premultiply(r),this.director.animationCallbackReceivers)for(const d of this.director.animationCallbackReceivers)d?.onTimelineRotation?.call(d,this.director,this.target,c,s);return h[0]=s.x,h[1]=s.y,h[2]=s.z,h[3]=s.w,h},a}}createPositionInterpolant(e,t,i){const n=i.createInterpolant.bind(i),s=new b;this.ensureTrackOffsets();const r=this.trackOffset?.rotation,a=this.trackOffset?.position;let l;i.createInterpolant=()=>{const c=n(),h=c.evaluate.bind(c);return c.evaluate=d=>{const p=h(d);if(s.set(p[0],p[1],p[2]),t.removeStartOffset&&(l===void 0?(l=null,l=this._actionOffsets.find(m=>m.clip===e)?.rootStartPosition?.clone()):l?.isVector3&&s.sub(l)),s.applyQuaternion(this._totalOffsetRotation),s.add(this._totalOffsetPosition),r&&s.applyQuaternion(r),a&&(s.x-=a.x,s.y+=a.y,s.z+=a.z),this.director.animationCallbackReceivers)for(const m of this.director.animationCallbackReceivers)m?.onTimelinePosition?.call(m,this.director,this.target,d,s);return p[0]=s.x,p[1]=s.y,p[2]=s.z,p},c}}}const W2=x("mutetimeline");class ss extends kl{models=[];listener;audio=[];audioContextTimeOffset=[];lastTime=0;audioSource;_audioLoader=null;getAudioFilePath(e){const t=this.director.sourceId;return us(t,e)}onAllowAudioChanged(e){for(let t=0;t<this.models.length;t++){const i=this.models[t];this.audio[t].setVolume(e?i.asset.volume:0)}}addModel(e){const t=new CC(this.listener);this.audio.push(t);const i=e;i._didTriggerPlay=!1,this.models.push(i)}onDisable(){for(const e of this.audio)e.isPlaying&&e.stop();for(const e of this.models)e._didTriggerPlay=!1}onDestroy(){for(const e of this.audio)e.source&&e?.disconnect();this.audio.length=0}onMuteChanged(){if(this.muted)for(let e=0;e<this.audio.length;e++){const t=this.audio[e];t?.isPlaying&&t.stop()}}stop(){for(let e=0;e<this.audio.length;e++){const t=this.audio[e];t?.isPlaying&&t.stop()}for(const e of this.models)e._didTriggerPlay=!1}_playableDirectorResumed=!1;onPauseChanged(){for(let e=0;e<this.audio.length;e++){const t=this.audio[e];t?.isPlaying&&t.stop()}this._playableDirectorResumed=this.director.isPlaying}evaluate(e){if(W2||this.track.muted||this.director.speed<0)return;const t=this.director.context.application.muted,i=this._playableDirectorResumed;this._playableDirectorResumed=!1;const n=t?.1:0;for(let s=0;s<this.models.length;s++){const r=this.models[s],a=this.audio[s],l=r.asset;if((!a||!a.buffer)&&this.isInTimeRange(r,e-1,e+1)&&this.handleAudioLoading(r,a),Mi.userInteractionRegistered!==!1&&!(a===null||!a.buffer))if(a.playbackRate=this.director.context.time.timeScale*this.director.speed,a.loop=l.loop,e>=r.start&&e<=r.end&&e<this.director.duration){if(!a.isPlaying||!this.director.isPlaying)(i||!r._didTriggerPlay&&this.lastTime<e)&&(r.duration*r.timeScale>.3?a.offset=r.clipIn+(e-r.start)*r.timeScale:a.offset=0,ho&&console.log("Timeline Audio ("+this.track.name+") play with offset "+a.offset+" - "+r.asset.clip),a.play(n),r._didTriggerPlay=!0);else{const h=r.clipIn+(e-r.start)*r.timeScale,d=a.context.currentTime-a._startedAt+a.offset;Math.abs(h-d)>.3&&(a.offset=h,a.stop(),a.play(n))}let c=l.volume;if(this.track.volume!==void 0&&(c*=this.track.volume),t&&(c=0),r.easeInDuration>0){const h=Math.min((e-r.start)/r.easeInDuration,1);c*=h}if(r.easeOutDuration>0){const h=Math.min((r.end-e)/r.easeOutDuration,1);c*=h}a.setVolume(c*this.director.weight)}else r._didTriggerPlay=!1,this.director.isPlaying&&a.isPlaying&&a.stop()}this.lastTime=e}loadAudio(e,t=0,i=0){let n=null;const s=e-i,r=e+t;for(const a of this.models)if(this.isInTimeRange(a,s,r)){const l=this.audio[this.models.indexOf(a)],c=this.handleAudioLoading(a,l);c!==null&&(n===null&&(n=[]),n.push(c))}return n!==null?Promise.all(n):null}isInTimeRange(e,t,i){return t<=e.start&&i>=e.end||t>=e.start&&t<=e.end||i>=e.start&&i<=e.end}static _audioBuffers=new Map;static dispose(){ss._audioBuffers.clear()}handleAudioLoading(e,t){this._audioLoader||(this._audioLoader=new gm);const i=this.getAudioFilePath(e.asset.clip);if(ss._audioBuffers.get(i)){const s=ss._audioBuffers.get(i);return s.then(r=>{r&&t.setBuffer(r)}),s}ho&&console.warn("LOAD audio track",i,this.director.sourceId);const n=new Promise((s,r)=>{this._audioLoader.load(i,a=>{t.setBuffer(a),s(a)},void 0,a=>{console.error("Error loading audio",a),s(null)})});return ss._audioBuffers.set(i,n),n}}class zp extends kl{models=[];needsSorting=!0;*foreachMarker(e=null){this.needsSorting&&this.sort();for(const t of this.models)t&&t.type===e&&(yield t)}onEnable(){this.needsSorting=!0}evaluate(e){this.needsSorting&&this.sort()}sort(){this.needsSorting=!1,this.models.sort((e,t)=>e.time-t.time)}}class Ih extends kl{models=[];didTrigger=[];receivers=[];evaluate(e){if(this.track.muted)return;const t=this.director.context.time.deltaTime*1.5;for(let i=0;i<this.models.length;i++){const n=this.models[i],s=this.didTrigger[i],r=n.time-e;let a=!1;if(n.retroActive)a=r<=1e-6;else{const l=Math.abs(r);(l===0||l>=1e-5&&l<t)&&(a=!0)}if(a){if(!s)if(ho&&console.log("Trigger signal",e,n.time,n),this.didTrigger[i]=!0,this.receivers?.length<=0)Eh.invoke(n.asset);else for(const l of this.receivers)l&&l.invoke(n.asset)}else n.emitOnce||(this.didTrigger[i]=!1)}}}class Up extends kl{models=[];timelines=[];resolveSourceObjects(e){for(let t=this.models.length-1;t>=0;t--){const i=this.models[t].asset;if(!i.sourceObject||typeof i.sourceObject!="object"){console.log("no source object, removing model",t,i),this.models.splice(t,1);continue}else{const n=w.getComponent(i.sourceObject,ra);this.timelines.push(n),n&&i.updateDirector&&(n.playOnAwake=!1)}}}_previousActiveModel=null;evaluate(e){this._previousActiveModel=null;for(let t=0;t<this.models.length;t++){const i=this.models[t],n=i.asset;if(e>=i.start&&e<=i.end){this._previousActiveModel=i;const s=this.getClipTime(e,i);if(n.controlActivation){const r=n.sourceObject;r.visible=!0}if(n.updateDirector){const r=this.timelines[t];r&&(r.isPlaying&&r.pause(),r.time=s,r.evaluate())}}else{const s=this._previousActiveModel?.asset;if(n.controlActivation){const r=n.sourceObject;s?.sourceObject!==r&&(r.visible=!1)}}}}}var $2=Object.defineProperty,C1=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&$2(e,t,n),n};const qo=x("debugtimeline"),_0=class $0 extends R{static createTrackFunctions={};static registerCreateTrack(e,t){this.createTrackFunctions[e]=t}playableAsset;playOnAwake;extrapolationMode=1;get isPlaying(){return this._isPlaying}get isPaused(){return this._isPaused}get time(){return this._time}set time(e){typeof e=="number"&&!Number.isNaN(e)?this._time=e:(qo||$i())&&console.error("INVALID TIMELINE.TIME VALUE",e,this.name)}get duration(){return this._duration}set duration(e){this._duration=e}get weight(){return this._weight}set weight(e){this._weight=e}get speed(){return this._speed}set speed(e){this._speed=e}waitForAudio=!0;_visibilityChangeEvt;_clonedPlayableAsset=!1;_speed=1;awake(){qo&&console.log(this,this.playableAsset),this.rebuildGraph(),!this.isValid()&&(qo||A())&&(qo?console.warn("PlayableDirector is not valid","Asset?",this.playableAsset,"Tracks:",this.playableAsset?.tracks,"IsArray?",Array.isArray(this.playableAsset?.tracks),this):this.playableAsset?.tracks?.length?console.warn("PlayableDirector is not valid"):console.warn("PlayableDirector has no tracks"))}onEnable(){for(const e of this._audioTracks)e.onEnable?.();for(const e of this._customTracks)e.onEnable?.();for(const e of this._animationTracks)e.onEnable?.();this.playOnAwake&&this.play(),this._visibilityChangeEvt||(this._visibilityChangeEvt=()=>{switch(document.visibilityState){case"hidden":this.setAudioTracksAllowPlaying(!1);break;case"visible":this.setAudioTracksAllowPlaying(!0);break}}),window.addEventListener("visibilitychange",this._visibilityChangeEvt)}onDisable(){this.stop();for(const e of this._audioTracks)e.onDisable?.();for(const e of this._customTracks)e.onDisable?.();for(const e of this._animationTracks)e.onDisable?.();this._visibilityChangeEvt&&window.removeEventListener("visibilitychange",this._visibilityChangeEvt)}onDestroy(){for(const e of this._allTracks)for(const t of e)t.onDestroy?.()}rebuildGraph(){this.isValid()&&(this.resolveBindings(),this.updateTimelineDuration(),this.setupAndCreateTrackHandlers())}async play(){if(!this.isValid())return;const e=this._isPaused==!0;if(this._isPaused=!1,!this._isPlaying){if(this._isPlaying=!0,e&&this.invokePauseChangedMethodsOnTracks(),this.waitForAudio){const t=[];for(const i of this._audioTracks){const n=i.loadAudio(this._time,1,0);n&&t.push(n)}if(t.length>0&&(await Promise.all(t),!this._isPlaying))return;for(;this._audioTracks.length>0&&this._isPlaying&&!Mi.userInteractionRegistered&&this.waitForAudio;)await Un(200)}this.invokeStateChangedMethodsOnTracks(),this._internalUpdateRoutine=this.startCoroutine(this.internalUpdate(),xe.LateUpdate)}}pause(){this.isValid()&&(this._isPlaying=!1,!this._isPaused&&(this._isPaused=!0,this.internalEvaluate(),this.invokePauseChangedMethodsOnTracks(),this.invokeStateChangedMethodsOnTracks()))}stop(){this._isStopping=!0;for(const i of this._audioTracks)i.stop();const e=this._isPaused==!0,t=this._isPlaying;this._isPlaying&&(this._time=0,this._isPlaying=!1,this._isPaused=!1,this.internalEvaluate(),e&&this.invokePauseChangedMethodsOnTracks()),this._isPlaying=!1,this._isPaused=!1,e&&!t&&this.invokePauseChangedMethodsOnTracks(),t&&this.invokeStateChangedMethodsOnTracks(),this._internalUpdateRoutine&&this.stopCoroutine(this._internalUpdateRoutine),this._internalUpdateRoutine=null,this._isStopping=!1}evaluate(){this.internalEvaluate(!0)}isValid(){return this.playableAsset&&this.playableAsset.tracks&&Array.isArray(this.playableAsset.tracks)}*forEachTrack(){for(const e of this._allTracks)for(const t of e)yield t}get animationTracks(){return this._animationTracks}get audioTracks(){return this._audioTracks}get signalTracks(){return this._signalTracks}get markerTracks(){return this._markerTracks}*foreachMarker(e=null){for(const t of this._markerTracks)for(const i of t.foreachMarker(e))yield i}_guidsMap;resolveGuids(e){this._guidsMap=e}_isPlaying=!1;_internalUpdateRoutine;_isPaused=!1;_isStopping=!1;_time=0;_duration=0;_weight=1;_animationTracks=[];_audioTracks=[];_signalTracks=[];_markerTracks=[];_controlTracks=[];_customTracks=[];_allTracks=[this._animationTracks,this._audioTracks,this._signalTracks,this._markerTracks,this._controlTracks,this._customTracks];invokePauseChangedMethodsOnTracks(){for(const e of this.forEachTrack())e.onPauseChanged?.call(e)}invokeStateChangedMethodsOnTracks(){for(const e of this.forEachTrack())e.onStateChanged?.call(e,this._isPlaying)}*internalUpdate(){for(;this._isPlaying&&this.activeAndEnabled;)!this._isPaused&&this._isPlaying&&(this._time+=this.context.time.deltaTime*this.speed,this.internalEvaluate()),yield}internalEvaluate(e=!1){if(!this.isValid())return;let t=this._time;switch(this.extrapolationMode){case 0:this._speed>0?t=Math.min(t,this._duration):this._speed<0&&(t=Math.max(t,0)),this._time=t;break;case 1:t%=this._duration,this._time=t;break;case 2:if(t>this._duration){this.stop();return}break}const i=this._time;for(const n of this.playableAsset.tracks)if(!n.muted)switch(n.type){case Bi.Activation:if(!e&&!this._isPlaying)continue;for(let s=0;s<n.outputs.length;s++){const r=n.outputs[s];if(typeof r=="object"){let a=!1;if(n.clips)for(const c of n.clips)c.start<=i&&i<=c.end&&(a=!0);const l=r;l.visible!==void 0&&l.visible!==a&&(l.visible=a,qo&&console.warn(this.name,"set ActivationTrack-"+s,l.name,a,i))}}break}for(const n of this._allTracks)for(const s of n)this._isStopping&&s instanceof Ah||s.evaluate(i)}resolveBindings(){if(this._clonedPlayableAsset||(this._clonedPlayableAsset=!0,this.playableAsset=Ql(this.playableAsset)),!this.playableAsset||!this.playableAsset.tracks)return;const e=this.findRoot(this.gameObject);for(const t of this.playableAsset.tracks){for(let i=t.outputs.length-1;i>=0;i--){let n=t.outputs[i];if(typeof n=="string"){this._guidsMap&&this._guidsMap[n]&&(n=this._guidsMap[n]);const s=w.findByGuid(n,e);s===null||typeof s!="object"?(t.outputs.splice(i,1),console.warn("Failed to resolve binding",n,t.name,t.type)):(qo&&console.log("Resolved binding",n,"to",s),t.outputs[i]=s)}else if(n===null){if(t.outputs.splice(i,1),$0.createTrackFunctions[t.type])continue;t.type!==Bi.Audio&&t.type!==Bi.Control&&t.type!==Bi.Marker&&t.type!==Bi.Signal&&console.warn("Missing binding",n,t.name,t.type,this.name,this.playableAsset.name)}}if(t.type===Bi.Control&&t.clips)for(let i=0;i<t.clips.length;i++){const n=t.clips[i];let s=n.asset.sourceObject;if(typeof s=="string"){this._guidsMap&&this._guidsMap[s]&&(s=this._guidsMap[s]);const r=w.findByGuid(s,e);r===null||typeof r!="object"?console.warn("Failed to resolve sourceObject binding",s,t.name,n):(qo&&console.log("Resolved binding",s,"to",r),n.asset.sourceObject=r)}}}}findRoot(e){return e.parent?this.findRoot(e.parent):e}updateTimelineDuration(){if(this._duration=0,!(!this.playableAsset||!this.playableAsset.tracks)){for(const e of this.playableAsset.tracks)if(e.muted!==!0){if(e.clips)for(const t of e.clips)t.end>this._duration&&(this._duration=t.end);if(e.markers)for(const t of e.markers)t.time>this._duration&&(this._duration=t.time+.001)}}}setupAndCreateTrackHandlers(){if(this._animationTracks.length=0,this._audioTracks.length=0,this._signalTracks.length=0,!this.playableAsset)return;let e=w.findObjectOfType(Eo,this.context);for(const t of this.playableAsset.tracks){const i=t.type,n=$0.createTrackFunctions[i];if(n!=null){const s=n(this,t);if(typeof s.evaluate=="function"){s.director=this,s.track=t,this._customTracks.push(s);continue}}if(t.type===Bi.Animation){if(!t.clips||t.clips.length<=0){qo&&console.warn("Animation track has no clips",t);continue}for(let s=t.outputs.length-1;s>=0;s--){let r=t.outputs[s];if(r instanceof k){const l=w.getOrAddComponent(r,ft);l&&(r=l)}const a=r?.gameObject?.animations;if(a){const l=new Ah;l.trackOffset=t.trackOffset,l.director=this,l.track=t;for(let c=0;c<t.clips.length;c++){const h=t.clips[c],d=h.asset;if(!d){console.error(`Timeline ${this.name}: clip #${c} on track "${t.name}" has no animation data`);continue}const p=d.clip;let m=p;if((typeof m=="string"||typeof m=="number")&&(m=a.find(g=>g.name===p)),qo&&console.log(d,p,"\u2192",m),!m){console.warn("Could not find animationClip for model",h,t.name,this.name,this.playableAsset?.name,a,r);continue}r instanceof ft&&r.runtimeAnimatorController&&(r.__internalDidAwakeAndStart||r.initializeRuntimeAnimatorController(),r.runtimeAnimatorController.mixer||r.runtimeAnimatorController.bind(r),l.mixer=r.runtimeAnimatorController.mixer),l.mixer||(l.mixer=new mm(r.gameObject),this.context.animations.registerAnimationMixer(l.mixer)),l.clips.push(m),l.mixer.uncacheAction(m),l.createHooks(h.asset,m);const f=l.mixer.clipAction(m);l.actions.push(f),l.models.push(h)}this._animationTracks.push(l)}}}else if(t.type===Bi.Audio){if(!t.clips||t.clips.length<=0)continue;const s=new ss;s.director=this,s.track=t,s.audioSource=t.outputs.find(r=>r instanceof Mi),this._audioTracks.push(s),e||(e=this.context.mainCameraComponent?.gameObject.addComponent(Eo)),s.listener=e.listener;for(let r=0;r<t.clips.length;r++){const a=t.clips[r];s.addModel(a)}}else if(t.type===Bi.Marker){if(t.markers){const s=new Ih;s.director=this,s.track=t;const r=new zp;r.director=this,r.track=t;for(const a of t.markers)switch(a.type){case b0.Signal:s.models.push(a),s.didTrigger.push(!1);break;default:r.models.push(a);break}if(s!==null&&s.models.length>0){const a=w.getComponent(this.gameObject,Eh);a&&(s.receivers.push(a),this._signalTracks.push(s))}r!==null&&r.models.length>0&&this._markerTracks.push(r)}}else if(t.type===Bi.Signal){const s=new Ih;if(s.director=this,s.track=t,t.markers)for(const r of t.markers)s.models.push(r),s.didTrigger.push(!1);for(const r of t.outputs)s.receivers.push(r);this._signalTracks.push(s)}else if(t.type===Bi.Control){const s=new Up;if(s.director=this,s.track=t,t.clips)for(const r of t.clips)s.models.push(r);s.resolveSourceObjects(this.context),this._controlTracks.push(s)}}}setAudioTracksAllowPlaying(e){for(const t of this._audioTracks)t.onAllowAudioChanged(e)}animationCallbackReceivers=[];registerAnimationCallback(e){this.animationCallbackReceivers.push(e)}unregisterAnimationCallback(e){const t=this.animationCallbackReceivers.indexOf(e);t!==-1&&this.animationCallbackReceivers.splice(t,1)}};C1([u()],_0.prototype,"playOnAwake"),C1([u()],_0.prototype,"extrapolationMode");let ra=_0;var H2=Object.defineProperty,Np=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&H2(e,t,n),n};class aa extends R{isGizmo=!1;translationSnap=1;rotationSnapAngle=15;scaleSnap=.25;get control(){return this._control}_control;orbit;onEnable(){if(!(this.isGizmo&&!fc)&&this.context.mainCamera&&(this._control||(this._control=new GC(this.context.mainCamera,this.context.renderer.domElement),this._control.enabled=!0,this._control.getRaycaster().layers.set(2),this._control.size=1,("_root"in this._control?this._control._root:this._control).traverse(e=>{const t=e;if(t.layers.set(2),t){const i=t.material;i&&(i.opacity=.3)}}),this.orbit=w.getComponentInParent(this.context.mainCamera,fe)??void 0),this._control)){const e=this._control.getHelper();this.context.scene.add(e),this._control.attach(this.gameObject),this._control?.addEventListener("dragging-changed",this.onControlChangedEvent),window.addEventListener("keydown",this.windowKeyDownListener),window.addEventListener("keyup",this.windowKeyUpListener)}}onDisable(){this._control?.getHelper()?.removeFromParent(),this._control?.removeEventListener("dragging-changed",this.onControlChangedEvent),window.removeEventListener("keydown",this.windowKeyDownListener),window.removeEventListener("keyup",this.windowKeyUpListener)}enableSnapping(){this._control&&(this._control.setTranslationSnap(this.translationSnap),this._control.setRotationSnap(yo.degToRad(this.rotationSnapAngle)),this._control.setScaleSnap(this.scaleSnap))}disableSnapping(){this._control&&(this._control.setTranslationSnap(null),this._control.setRotationSnap(null),this._control.setScaleSnap(null))}onControlChangedEvent=e=>{const t=this.orbit;if(t&&(t.enabled=!e.value),e.value){const i=this.gameObject.getComponentInParent(Cn);i&&(i.fastMode=!0,i.requestOwnership())}else{const i=this.gameObject.getComponentInParent(Cn);i&&(i.fastMode=!1)}};windowKeyDownListener=e=>{if(this.enabled&&this._control)switch(e.keyCode){case 81:this._control.setSpace(this._control.space==="local"?"world":"local");break;case 16:this.enableSnapping();break;case 87:this._control.setMode("translate");break;case 69:this._control.setMode("rotate");break;case 82:this._control.setMode("scale");break;case 187:case 107:this._control.setSize(this._control.size+.1);break;case 189:case 109:this._control.setSize(Math.max(this._control.size-.1,.1));break;case 88:this._control.showX=!this._control.showX;break;case 89:this._control.showY=!this._control.showY;break;case 90:this._control.showZ=!this._control.showZ;break;case 32:this._control.enabled=!this._control.enabled;break}};windowKeyUpListener=e=>{if(this.enabled)switch(e.keyCode){case 16:this.disableSnapping();break}}}Np([u()],aa.prototype,"isGizmo"),Np([u()],aa.prototype,"translationSnap"),Np([u()],aa.prototype,"rotationSnapAngle"),Np([u()],aa.prototype,"scaleSnap");var G2=Object.defineProperty,q2=Object.getOwnPropertyDescriptor,Vp=(o,e,t,i)=>{for(var n=i>1?void 0:i?q2(e,t):e,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=(i?r(e,t,n):r(n))||n);return i&&n&&G2(e,t,n),n};class v0{texture=null;rect}Vp([u(Re)],v0.prototype,"texture",2);let Ml=class extends oh{set image(o){this.sprite||(this.sprite=new v0),this.sprite.texture=o,this.onAfterCreated()}get image(){return this.sprite?this.sprite.texture:null}get sprite(){return this._sprite}set sprite(o){this._sprite!==o&&(this._sprite=o,this.onAfterCreated())}_sprite;pixelsPerUnitMultiplier=1;isBuiltinSprite(){const o=this.sprite;switch(o?.texture?.name){case"InputFieldBackground":case"UISprite":case"Background":case"Knob":return!0}return!o?.texture?.name?.length&&o?.texture?.image?.width===32&&o?.texture?.image?.height===32}onBeforeCreate(o){super.onBeforeCreate(o),this.isBuiltinSprite()&&(o.borderRadius=5/this.pixelsPerUnitMultiplier,this.sprite?.texture?.name==="Knob"&&(o.borderRadius=999))}onAfterCreated(){this.__didAwake&&(super.onAfterCreated(),!this.isBuiltinSprite()&&this.setTexture(this.sprite?.texture))}};Vp([u(v0)],Ml.prototype,"sprite",1),Vp([u()],Ml.prototype,"pixelsPerUnitMultiplier",2);class Wp extends oh{get mainTexture(){return this._mainTexture}set mainTexture(e){this._mainTexture!==e&&(this._mainTexture=e,this.onAfterCreated())}_mainTexture;onAfterCreated(){this.__didAwake&&(super.onAfterCreated(),this.setTexture(this.mainTexture))}}Vp([u(Re)],Wp.prototype,"mainTexture",1);var X2=Object.defineProperty,Q2=Object.getOwnPropertyDescriptor,Fi=(o,e,t,i)=>{for(var n=i>1?void 0:i?Q2(e,t):e,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=(i?r(e,t,n):r(n))||n);return i&&n&&X2(e,t,n),n};const la=x("debugbutton");class Ys{colorMultiplier;disabledColor;fadeDuration;highlightedColor;normalColor;pressedColor;selectedColor}Fi([u()],Ys.prototype,"colorMultiplier",2),Fi([u(oe)],Ys.prototype,"disabledColor",2),Fi([u()],Ys.prototype,"fadeDuration",2),Fi([u(oe)],Ys.prototype,"highlightedColor",2),Fi([u(oe)],Ys.prototype,"normalColor",2),Fi([u(oe)],Ys.prototype,"pressedColor",2),Fi([u(oe)],Ys.prototype,"selectedColor",2);class Y2{disabledTrigger;highlightedTrigger;normalTrigger;pressedTrigger;selectedTrigger}class Xo extends R{click(){this.onClick?.invoke()}onClick=new he;_isHovered=0;onPointerEnter(e){const t=e.event.pointerType==="mouse"&&e.button===0;t&&(this._isHovered+=1),la&&console.warn("Button Enter",t,this._isHovered,this.animationTriggers?.highlightedTrigger,this.animator),this.interactable&&(this.transition==3&&this.animationTriggers&&this.animator?this.animator.setTrigger(this.animationTriggers.highlightedTrigger):this.transition===1&&this.colors&&this._image?.setState("hovered"),t&&this.context.input.setCursor("pointer"))}onPointerExit(){this._isHovered-=1,this._isHovered<0&&(this._isHovered=0),la&&console.log("Button Exit",this._isHovered,this.animationTriggers?.highlightedTrigger,this.animator),this.interactable&&(this._isHovered>0||(this._isHovered=0,this.transition==3&&this.animationTriggers&&this.animator?this.animator.setTrigger(this.animationTriggers.normalTrigger):this.transition===1&&this.colors&&this._image?.setState("normal"),this.context.input.unsetCursor("pointer")))}onPointerDown(e){la&&console.log("Button Down",this.animationTriggers?.highlightedTrigger,this.animator),this.interactable&&(this.transition==3&&this.animationTriggers&&this.animator?this.animator.setTrigger(this.animationTriggers.pressedTrigger):this.transition===1&&this.colors&&this._image?.setState("pressed"))}onPointerUp(e){la&&console.warn("Button Up",this.animationTriggers?.highlightedTrigger,this.animator,this._isHovered),this.interactable&&(this.transition==3&&this.animationTriggers&&this.animator?this.animator.setTrigger(this._isHovered?this.animationTriggers.highlightedTrigger:this.animationTriggers.normalTrigger):this.transition===1&&this.colors&&this._image?.setState(this._isHovered?"hovered":"normal"))}onPointerClick(e){if(this.interactable&&!(e.button!==0&&e.event.pointerType===Dd.Mouse)&&(la&&(console.warn("Button Click",this.onClick),Te("CLICKED button "+this.name+" at "+this.context.time.frameCount)),this.onClick&&this.onClick.listenerCount>0&&(this.onClick.invoke(),e.use(),la))){const t=this.gameObject.worldPosition;t.add(this.gameObject.worldUp.multiplyScalar(1+Math.random()*.5)),F.DrawLabel(t,"CLICK:"+Date.now(),.1,1+Math.random()*.5)}}colors;transition;animationTriggers;animator;set interactable(e){this._interactable=e,this._image&&(this._image.setInteractable(e),e?this._image.setState("normal"):this._image.setState("disabled"))}get interactable(){return this._interactable}_interactable=!0;set_interactable(e){this.interactable=e}awake(){super.awake(),la&&console.log(this),this._isInit=!1,this.init()}start(){this._image?.setInteractable(this.interactable),this.gameObject.getComponentInParent(qa)||this.gameObject.addComponent(Mu)}onEnable(){super.onEnable()}onDestroy(){this._isHovered&&this.context.input.unsetCursor("pointer")}_requestedAnimatorTrigger;*setAnimatorTriggerAtEndOfFrame(e){this._requestedAnimatorTrigger=e,yield,yield,this._requestedAnimatorTrigger==e&&this.animator?.setTrigger(e)}_isInit=!1;_image;init(){this._isInit||(this._isInit=!0,this._image=w.getComponent(this.gameObject,Ml),this._image&&(this.stateSetup(this._image),this.interactable?this._image.setState("normal"):this._image.setState("disabled")))}stateSetup(e){e.setInteractable(this.interactable);const t=this.getFinalColor(e.color,this.colors?.normalColor),i={state:"normal",attributes:{backgroundColor:t,backgroundOpacity:t.alpha}};e.setupState(i);const n=this.getFinalColor(e.color,this.colors?.highlightedColor),s={state:"hovered",attributes:{backgroundColor:n,backgroundOpacity:n.alpha}};e.setupState(s);const r=this.getFinalColor(e.color,this.colors?.pressedColor),a={state:"pressed",attributes:{backgroundColor:r,backgroundOpacity:r.alpha}};e.setupState(a);const l=this.getFinalColor(e.color,this.colors?.selectedColor),c={state:"selected",attributes:{backgroundColor:l,backgroundOpacity:l.alpha}};e.setupState(c);const h=this.getFinalColor(e.color,this.colors?.disabledColor),d={state:"disabled",attributes:{backgroundColor:h,backgroundOpacity:h.alpha}};e.setupState(d)}getFinalColor(e,t){return t?e.clone().multiply(t).convertLinearToSRGB():e.clone().convertLinearToSRGB()}}Fi([u(he)],Xo.prototype,"onClick",2),Fi([u(Ys)],Xo.prototype,"colors",2),Fi([u()],Xo.prototype,"transition",2),Fi([u(Y2)],Xo.prototype,"animationTriggers",2),Fi([u(ft)],Xo.prototype,"animator",2),Fi([u()],Xo.prototype,"interactable",1);var Z2=Object.defineProperty,$p=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&Z2(e,t,n),n};const Zs=x("debuginputfield"),Lh=class X extends R{get text(){return this.textComponent?.text??""}set text(e){this.textComponent&&(this.textComponent.text=e,this.placeholder&&(e.length>0?this.placeholder.gameObject.visible=!1:this.placeholder.gameObject.visible=!0))}get isFocused(){return X.active===this}textComponent;placeholder;onValueChanged;onEndEdit;static active=null;static activeTime=-1;static htmlField=null;static htmlFieldFocused=!1;inputEventFn;_iosEventFn;start(){Zs&&console.log(this.name,this)}onEnable(){X.htmlField||(X.htmlField=document.createElement("input"),X.htmlField.style.width="0px",X.htmlField.style.height="0px",X.htmlField.style.padding="0px",X.htmlField.style.border="none",X.htmlField.style.overflow="hidden",X.htmlField.style.caretColor="transparent",X.htmlField.style.outline="none",X.htmlField.classList.add("ar"),X.htmlField.onfocus=()=>X.htmlFieldFocused=!0,X.htmlField.onblur=()=>X.htmlFieldFocused=!1,document.body.append(X.htmlField)),this.inputEventFn||(this.inputEventFn=this.onInput.bind(this)),X.htmlField.addEventListener("keyup",this.inputEventFn),this.placeholder&&this.textComponent?.text.length&&w.setActive(this.placeholder.gameObject,!1),G.isiOS()&&(this._iosEventFn=this.processInputOniOS.bind(this),window.addEventListener("click",this._iosEventFn))}onDisable(){X.htmlField?.removeEventListener("keyup",this.inputEventFn),this.onDeselected(),this._iosEventFn&&window.removeEventListener("click",this._iosEventFn)}clear(){X.active===this&&X.htmlField?(X.htmlField.value="",this.setTextFromInputField()):(this.textComponent&&(this.textComponent.text=""),this.placeholder&&w.setActive(this.placeholder.gameObject,!0))}select(){this.onSelected()}deselect(){this.onDeselected()}onPointerEnter(e){e.event.pointerType==="mouse"&&e.button===0&&this.context.input.setCursor("text")}onPointerExit(e){this.context.input.unsetCursor("text")}onPointerClick(e){Zs&&console.log("CLICK",e,X.active),X.activeTime=this.context.time.time,X.active!==this&&this.startCoroutine(this.activeLoop(),xe.LateUpdate),this.selectInputField()}*activeLoop(){for(this.onSelected();X.active===this&&!(this.context.input.getPointerClicked(0)&&this.context.time.time-X.activeTime>.2);)this.setTextFromInputField(),yield;this.onDeselected()}onSelected(){if(X.active!==this&&(Zs&&console.log("Select",this.name,this,X.htmlField,this.context.isInXR,this.context.arOverlayElement,this.textComponent?.text,X.htmlField?.value),X.active?.onDeselected(),X.active=this,this.placeholder&&w.setActive(this.placeholder.gameObject,!1),X.htmlField)){if(X.htmlField.value=this.textComponent?.text||"",Zs&&console.log("set input field value",X.htmlField.value),this.context.isInXR){const e=this.context.arOverlayElement;e&&e.append(X.htmlField)}this.selectInputField()}}onDeselected(){X.active===this&&(X.active=null,Zs&&console.log("Deselect",this.name,this),X.htmlField&&(X.htmlField.blur(),document.body.append(X.htmlField)),this.placeholder&&(!this.textComponent||this.textComponent.text.length<=0)&&w.setActive(this.placeholder.gameObject,!0),X.htmlField&&this.onEndEdit?.invoke(X.htmlField.value))}update(){X.active===this&&this.textComponent?.markDirty()}onInput(e){if(X.active===this){if(Zs&&console.log(e.code,e,X.htmlField?.value,this.textComponent?.text),e.code==="Escape"||e.code==="Enter"){this.onDeselected();return}X.htmlField&&(this.textComponent&&(this.setTextFromInputField(),this.placeholder&&w.setActive(this.placeholder.gameObject,this.textComponent.text.length<=0)),this.selectInputField())}}setTextFromInputField(){if(this.textComponent&&X.htmlField){const e=this.textComponent.text,t=X.htmlField.value,i=this.textComponent.text!==X.htmlField.value;this.textComponent.text=X.htmlField.value,i&&(Zs&&console.log("[InputField] value changed:",t,e),this.onValueChanged?.invoke(t,e))}}selectInputField(){X.htmlField&&(Zs&&console.log("Focus Inputfield",X.htmlFieldFocused),X.htmlField.setSelectionRange(X.htmlField.value.length,X.htmlField.value.length),G.isiOS()?X.htmlField.focus({preventScroll:!0}):setTimeout(()=>X.htmlField?.focus(),1))}processInputOniOS(){const e=this.context.physics.raycast();if(!e.length)return;const t=e[0].object,i=gf(t);(i?.gameObject===this.gameObject||i?.gameObject.parent===this.gameObject)&&this.selectInputField()}};$p([u(Bt)],Lh.prototype,"textComponent"),$p([u(Bt)],Lh.prototype,"placeholder"),$p([u(he)],Lh.prototype,"onValueChanged"),$p([u(he)],Lh.prototype,"onEndEdit");let x0=Lh;var K2=Object.defineProperty,P1=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&K2(e,t,n),n};class jh extends R{id=null;keepAspect=!1;_object=null;onEnable(){if(this._object){this.gameObject.add(this._object);return}if(!this.id||!this.context.mainCamera)return;const e=document.getElementById(this.id);if(!e){console.warn('Could not find element with id "'+this.id+'"');return}e.style.display="block",e.style.visibility="hidden";const t=new qC;t.listenToPointerEvents(this.context.renderer,this.context.mainCamera),this.gameObject.add(t);const i=new XC(e);t.add(i),i.visible=!1;const n=i.material;n.transparent=!0,setTimeout(()=>{i.visible=!0;const s=Rd(this.gameObject).clone();Jl(this.gameObject,0,0,0),this.gameObject.updateMatrixWorld();const r=new bi;r.setFromObject(t),this.setWorldRotation(s.x,s.y,s.z);const a=r.max.x-r.min.x,l=r.max.y-r.min.y;if(this.keepAspect){const h=a/l;a>l?i.scale.set(1/a,1/l/h,1):i.scale.set(1/a*h,1/l,1)}else i.scale.set(1/a,1/l,1);const c=this.gameObject.scale;i.scale.multiply(c)},1)}onDisable(){this._object?.removeFromParent()}}P1([u()],jh.prototype,"id"),P1([u()],jh.prototype,"keepAspect");/* @license
|
|
1417
|
+
C) Set "joinRandomRoom" to true`),!1):(g0&&console.log("Join "+this.roomName),this._userWantsToBeInARoom=!0,this.context.connection.joinRoom(this.roomName),!0))}_lastPingTime=0;_lastRoomTime=-1;_userWantsToBeInARoom=!1;update(){this.context.connection.isConnected&&(this.context.time.time-this._lastPingTime>3&&(this._lastPingTime=this.context.time.time,this.context.connection.sendPing()),this.context.connection.isInRoom&&(this._lastRoomTime=this.context.time.time)),this._lastRoomTime>0&&this.context.time.time-this._lastRoomTime>.3&&(this._lastRoomTime=-1,this.autoRejoin?this._userWantsToBeInARoom&&(console.log("Disconnected from networking backend - attempt reconnecting now"),this.tryJoinRoom()):A()&&console.warn("You are not connected to a room anymore (possibly because the tab was inactive for too long and the server kicked you?)"))}getViewOnlyUrl(){if(this.context.connection.isConnected&&this.context.connection.currentRoomViewId){const e=window.location.search,t=new URLSearchParams(e);return t.has(this.urlParameterName)&&t.delete(this.urlParameterName),t.set(m0,this.context.connection.currentRoomViewId),window.location.origin+window.location.pathname+"?"+t.toString()}return null}setRandomRoomUrlParameter(){const e=ql(),t=this.generateRoomName();x(this.urlParameterName)?e.set(this.urlParameterName,t):e.append(this.urlParameterName,t),Em(t,e)}generateRoomName(){let e="";for(let t=0;t<6;t++)e+=Math.floor(Math.random()*10).toFixed(0);return e}_roomButton;_roomButtonIconJoin;_roomButtonIconLeave;createRoomButton(){if(this._roomButton)return this._roomButton;const e=document.createElement("button");return this._roomButton=e,e.classList.add("create-room-button"),e.setAttribute("priority","90"),e.onclick=()=>{if(this.context.connection.isInRoom)this.urlParameterName&&Xl(this.urlParameterName,null),this.context.connection.leaveRoom(),this._userWantsToBeInARoom=!1;else{if(this.urlParameterName){const t=x(this.urlParameterName);(!t||t===!0)&&(this._lastJoinedRoom?Xl(this.urlParameterName,this._lastJoinedRoom):this.setRandomRoomUrlParameter())}this.tryJoinRoom()}},this._roomButtonIconJoin=Ct("group"),this._roomButtonIconLeave=Ct("group_off"),this.updateRoomButtonState(),this.context.connection.beginListen(te.JoinedRoom,this.updateRoomButtonState),this.context.connection.beginListen(te.LeftRoom,this.updateRoomButtonState),e}updateRoomButtonState=()=>{this._roomButton&&(this.context.connection.isInRoom?(this._roomButton.title="Leave the networked room",this._roomButton.textContent="Leave Room",this._roomButtonIconJoin?.remove(),this._roomButton.prepend(this._roomButtonIconLeave)):(this._roomButton.title="Create or join a networked room",this._roomButton.textContent="Join Room",this._roomButtonIconLeave?.remove(),this._roomButton.prepend(this._roomButtonIconJoin)))};destroyRoomButton(){this.context.connection.stopListen(te.JoinedRoom,this.updateRoomButtonState),this.context.connection.stopListen(te.LeftRoom,this.updateRoomButtonState)}_viewOnlyButton;onEnableViewOnlyButton(){this.context.connection.isConnected?this.onCreateViewOnlyButton():(this.context.connection.stopListen(te.JoinedRoom,this.onCreateViewOnlyButton),this.context.connection.beginListen(te.JoinedRoom,this.onCreateViewOnlyButton))}onDisableViewOnlyButton(){this.context.connection.stopListen(te.JoinedRoom,this.onCreateViewOnlyButton),this._viewOnlyButton?.remove()}onCreateViewOnlyButton=()=>{if(!this._viewOnlyButton){const e=document.createElement("button");this._viewOnlyButton=e,e.classList.add("view-only-button"),e.setAttribute("priority","90"),e.onclick=()=>{const t=this.getViewOnlyUrl();t?.length?navigator.canShare({url:t})?navigator.share({url:t})?.catch(i=>{console.warn(i)}):(navigator.clipboard.writeText(t),Te("View only URL copied to clipboard")):ge("Could not create view only URL")},e.title="Copy the view only URL: A page accessed by the view only URL can not be modified by visiting users.",e.textContent="Share View URL",e.prepend(Ct("visibility"))}this.context.menu.appendChild(this._viewOnlyButton)}}Qs([u()],In.prototype,"roomName",2),Qs([u()],In.prototype,"urlParameterName",2),Qs([u()],In.prototype,"joinRandomRoom",2),Qs([u()],In.prototype,"requireRoomParameter",2),Qs([u()],In.prototype,"autoRejoin",2),Qs([u()],In.prototype,"createJoinButton",2),Qs([u()],In.prototype,"createViewOnlyButton",2),Qs([u()],In.prototype,"roomPrefix",1);function B2(){const o=x("testwindowcount")||0;o&&o>0&&F2(o)}function F2(o){if(x("testwindow"))return null;const e=new URL(window.location.href);Tm(e.searchParams,LR,1),Tm(e.searchParams,"testwindow",1);const t=e.toString(),i=[];window.onbeforeunload=()=>{for(const l of i)l.close()};const n=.05,s=128;let r=0,a=0;for(let l=0;l<o;l++){r*s+s*.01>=window.innerWidth&&(a+=1,r=0);const c=r*(s*(1+n))+window.screenLeft,h=a*(s*(1+n))+window.screenTop+90+60*a;r+=1;const d=window.open(t,"test window "+l,`popup=yes width=${s} height=${s} top=${h} left=${c}`);if(!d){console.warn("Failed to open window");continue}i.push(d),d.onload=()=>{d.onbeforeunload=()=>{for(let p=0;p<i.length;p++){const m=i[p];m!==d&&m.close()}i.length=0}}}return i}class f0 extends R{awake(){B2()}}class y0 extends R{transformsPerFrame=10;interval=0;useFlatbuffers=!0;awake(){if(this.useFlatbuffers)this.context.connection.beginListenBinary(Ec,e=>{});else{this.models=[];for(let e=0;e<this.transformsPerFrame;e++)this.models.push(new z2(this.context.connection.connectionId+"_simulatedTransform_"+e,this))}}builder=null;models=null;update(){if(this.context.connection.isConnected){if(this.useFlatbuffers){if(!this.context.connection.connectionId||this.context.time.frameCount%this.interval!==0)return;this.builder===null&&(this.builder=new Cm(1024));const e=this.builder;for(let t=0;t<this.transformsPerFrame;t++){e.clear();const i=kx(this.context.connection.connectionId,this);this.context.connection.sendBinary(i)}}else if(this.models)for(let e=0;e<this.models.length;e++){const t=this.models[e];t.dontSave=!0,t.update(this,null),this.context.connection.send("TestSimulateUserData-"+e,t)}}}}class z2{guid;fast=!1;position;rotation;velocity=void 0;dontSave;isValid(){return this.fast!==void 0||this.position!==void 0||this.rotation!==void 0||this.velocity!==void 0}constructor(e,t){this.guid=e,this.position={x:0,y:0,z:0},this.rotation={x:0,y:0,z:0,w:0},this.update(t,null)}static temp=new b;update(e,t){const i=e.worldPosition;this.position.x=i.x,this.position.y=i.y,this.position.z=i.z;const n=e.worldQuaternion;if(this.rotation.x=n.x,this.rotation.y=n.y,this.rotation.z=n.z,this.rotation.w=n.w,this.fast=!1,t){const s=t.getVelocity();this.velocity===void 0&&(this.velocity={x:0,y:0,z:0}),this.velocity.x=s.x,this.velocity.y=s.y,this.velocity.z=s.z}}}var U2=Object.defineProperty,Bp=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&U2(e,t,n),n};const N2=x("debugsignals");class Fp{guid}Bp([u()],Fp.prototype,"guid");class Th{signal;reaction}Bp([u(Fp)],Th.prototype,"signal"),Bp([u(he)],Th.prototype,"reaction");const S1=class ts extends R{static receivers={};static invoke(e){if(ts.receivers[e]){const t=ts.receivers[e];if(!t)return;for(const i of t)i.invoke(e)}}events;awake(){N2&&console.log("SignalReceiver awake",this)}onEnable(){if(this.events)for(const e of this.events)ts.receivers[e.signal.guid]||(ts.receivers[e.signal.guid]=[]),ts.receivers[e.signal.guid].push(this)}onDisable(){if(this.events){for(const e of this.events)if(ts.receivers[e.signal.guid]){const t=ts.receivers[e.signal.guid].indexOf(this);t>=0&&ts.receivers[e.signal.guid].splice(t,1)}}}invoke(e){if(!this.events||!Array.isArray(this.events))return;const t=typeof e=="object"?e.guid:e;for(const i of this.events)if(i.signal.guid===t)try{if(i.reaction){if(!i.reaction.invoke){console.warn("Missing invoke - possibly a serialization error",i,this);continue}}else{console.warn("Missing reaction for signal",i,this);continue}i.reaction.invoke()}catch(n){console.error(n)}}};Bp([u(Th)],S1.prototype,"events");let Eh=S1;var Bi=(o=>(o.Activation="ActivationTrack",o.Animation="AnimationTrack",o.Audio="AudioTrack",o.Control="ControlTrack",o.Marker="MarkerTrack",o.Signal="SignalTrack",o))(Bi||{}),co=(o=>(o[o.None=0]="None",o[o.Hold=1]="Hold",o[o.Loop=2]="Loop",o[o.PingPong=3]="PingPong",o[o.Continue=4]="Continue",o))(co||{}),b0=(o=>(o.Signal="SignalEmitter",o))(b0||{});const ho=x("debugtimeline");class kl{director;track;get muted(){return this.track.muted}set muted(e){e!==this.track.muted&&(this.track.muted=e,this.onMuteChanged?.call(this))}*forEachClip(e=!1){if(this.track?.clips)if(e)for(let t=this.track.clips.length-1;t>=0;t--)yield this.track.clips[t];else for(const t of this.track.clips)yield t}getClipTime(e,t){return t.clipIn+(e-t.start)*t.timeScale}getClipTimeNormalized(e,t){return(e-t.start)/t.duration}evaluateWeight(e,t,i,n=!0){if(t<0||t>=i.length)return 0;const s=i[t];if(n||e>=s.start&&e<=s.end){let r=1;if(s.easeInDuration>0){const a=Math.min((e-s.start)/s.easeInDuration,1);r*=a}if(s.easeOutDuration>0){const a=Math.min((s.end-e)/s.easeOutDuration,1);r*=a}return r}return 0}}class V2{clip;rootPositionOffset;rootQuaternionOffset;get hasOffsets(){return this.rootPositionOffset!==void 0||this.rootQuaternionOffset!==void 0}rootStartPosition;rootEndPosition;rootStartQuaternion;rootEndQuaternion;constructor(e){const t=e.getClip();this.clip=t;const i=e.getRoot(),n=i.name+".position",s=i.name+".quaternion";ho&&console.log(t.name,t.tracks,n);for(const r of t.tracks)if(!(r.times.length<=0)){if(r.name.endsWith(n))this.rootStartPosition=new b().fromArray(r.values,0),this.rootEndPosition=new b().fromArray(r.values,r.values.length-3),this.rootPositionOffset=this.rootEndPosition.clone().sub(this.rootStartPosition),ho&&console.log(this.rootPositionOffset);else if(r.name.endsWith(s)&&(this.rootStartQuaternion=new U().fromArray(r.values,0),this.rootEndQuaternion=new U().fromArray(r.values,r.values.length-4),this.rootQuaternionOffset=this.rootEndQuaternion.clone().multiply(this.rootStartQuaternion),ho)){const a=new nt().setFromQuaternion(this.rootQuaternionOffset);console.log("ROT",a)}}}}class Ah extends kl{models=[];trackOffset;target;mixer;clips=[];actions=[];weight=1;_actionOffsets=[];_didBind=!1;_animator=null;onDisable(){this.mixer?.stopAllAction()}onDestroy(){this.director.context.animations.unregisterAnimationMixer(this.mixer)}onStateChanged(){this._animator&&xx(this._animator.gameObject,this,this.director.enabled&&this.director.weight>0)}createHooks(e,t){if(t.tracks?.length<=0){console.warn("No tracks in AnimationClip",t);return}let i=!1,n=!1;const s=t.tracks.find(r=>r.name.includes(".position")||r.name.includes(".quaternion"))?.name.split(".");if(s){const r=s[s.length-2],a=r+".position",l=r+".quaternion";for(const c of t.tracks)!i&&c.name.endsWith(a)?(i=!0,this.createPositionInterpolant(t,e,c)):!n&&c.name.endsWith(l)&&(n=!0,this.createRotationInterpolant(t,e,c))}if(!i||!n){const r=this.mixer?.getRoot(),a=t.tracks[0],l=a.name.lastIndexOf("."),c=a.name.substring(0,l),h=c.substring(c.lastIndexOf(".")+1),d=r.getObjectByName(h);if(d)if(i){if(!n){const p=t.tracks[0].name.substring(0,l)+".quaternion";ho&&console.warn("Create quaternion track",h,d);const m=new SC(p,[0,t.duration],[0,0,0,1,0,0,0,1]);t.tracks.push(m),this.createRotationInterpolant(t,e,m)}}else{const p=c+".position";ho&&console.warn("Create position track",h,d);const m=new wC(p,[0,t.duration],[0,0,0,0,0,0]);t.tracks.push(m),this.createPositionInterpolant(t,e,m)}}}bind(){if(!this._didBind){this._didBind=!0,ho&&console.log(this.models),this.mixer?this.target=this.mixer.getRoot():console.warn("No mixer was assigned to animation track");for(const e of this.actions){const t=new V2(e);this._actionOffsets.push(t)}this.target&&(this._animator=w.getComponent(this.target,ft)??null,this._animator&&xx(this._animator.gameObject,this,!0));for(const e of this.models){const t=e.asset,i=t.position,n=t.rotation;i&&i.x!==void 0&&(i.isVector3||(t.position=new b(i.x,i.y,i.z)),n.isQuaternion||(t.rotation=new U(n.x,n.y,n.z,n.w)))}this.ensureTrackOffsets()}}ensureTrackOffsets(){if(this.trackOffset){const e=this.trackOffset.position;e&&(e.isVector3||(this.trackOffset.position=new b(e.x,e.y,e.z)));const t=this.trackOffset.rotation;t&&(t.isQuaternion||(this.trackOffset.rotation=new U(t.x,t.y,t.z,t.w)))}}_useclipOffsets=!0;_totalOffsetPosition=new b;_totalOffsetRotation=new U;_totalOffsetPosition2=new b;_totalOffsetRotation2=new U;_summedPos=new b;_tempPos=new b;_summedRot=new U;_tempRot=new U;_clipRotQuat=new U;evaluate(e){if(this.track.muted||!this.mixer)return;this.bind(),this._totalOffsetPosition.set(0,0,0),this._totalOffsetRotation.set(0,0,0,1),this._totalOffsetPosition2.set(0,0,0),this._totalOffsetRotation2.set(0,0,0,1);let t=0,i=0,n=!1,s=!1,r=0;for(let a=0;a<this.clips.length;a++){const l=this.models[a],c=this.actions[a],h=l.asset;c.weight=0;const d=e>=l.start&&e<=l.end,p=l.preExtrapolationMode,m=l.postExtrapolationMode,f=a<this.clips.length-1?this.models[a+1]:null;let g=d,y=!1;if(!g&&!n&&l.end<e&&m!==co.None?(!f||f.start>e)&&(g=!0,n=!0):a==0&&!g&&!s&&l.start>e&&p!==co.None&&(!f||f.start<e)&&(g=!0,y=!0,s=!0),g){let _=this.weight;_*=this.evaluateWeight(e,a,this.models,g),_*=this.director.weight;let v=d;if(y)switch(p){case co.Hold:break;case co.Loop:e+=l.start,v=!0;break;default:e+=l.start,v=!0;break}let P=this.getClipTime(e,l),M=0;const O=h.duration;if(y&&p===co.Hold&&(P=0),v){if(h.loop)for(M+=Math.floor(P/(O+1e-6));P>O;)P-=O}else if(!d&&n)switch(m){case co.Hold:P=this.getClipTime(l.end,l);break;case co.Loop:P%=O;break;case co.PingPong:const L=Math.floor(P/O)%2!==0;P%=O,L&&(P=O-P);break}l.reversed===!0?c.time=c.getClip().duration-P:c.time=P,c.timeScale=0;const E=Math.max(0,_);if(c.weight=E,r+=E,c.clampWhenFinished=!1,c.isRunning()||c.play(),this._useclipOffsets){const L=t==0?this._totalOffsetPosition:this._totalOffsetPosition2,$=t==0?this._totalOffsetRotation:this._totalOffsetRotation2;t<1&&(i=1-_),t+=1;const D=this._summedPos.set(0,0,0),q=this._tempPos.set(0,0,0),Z=this._summedRot.identity(),I=this._tempRot.identity(),W=h.rotation;W&&(this._clipRotQuat.identity(),this._clipRotQuat.slerp(W,_));const V=this._actionOffsets[a];if(V.hasOffsets)for(let se=0;se<M;se++)V.rootPositionOffset?q.copy(V.rootPositionOffset):q.set(0,0,0),q.applyQuaternion(Z),this._clipRotQuat&&q.applyQuaternion(this._clipRotQuat),V.rootQuaternionOffset&&(I.copy(V.rootQuaternionOffset),Z.multiply(I)),D.add(q);this._clipRotQuat&&$.multiply(this._clipRotQuat),$.multiply(Z),h.position&&D.add(h.position),L.add(D)}}}if(this._useclipOffsets&&(this._totalOffsetPosition.lerp(this._totalOffsetPosition2,i),this._totalOffsetRotation.slerp(this._totalOffsetRotation2,i)),this.__mixerError===void 0&&(ho||A())&&this._animator?.runtimeAnimatorController?.mixer&&this.mixer!==this._animator?.runtimeAnimatorController?.mixer&&(this.__mixerError=!0,console.error("AnimationTrack mixer is not shared with the animator controller - this might result in the timeline to not animate properly. Please report a bug to the Needle Engine team!",this)),this._animator?.runtimeAnimatorController){const a=Math.max(0,1-r);this._animator?.runtimeAnimatorController?.update(a)}else this.mixer.update(e)}createRotationInterpolant(e,t,i){const n=i.createInterpolant.bind(i),s=new U;this.ensureTrackOffsets();const r=this.trackOffset?.rotation;i.createInterpolant=()=>{const a=n(),l=a.evaluate.bind(a);return a.evaluate=c=>{const h=l(c);if(s.set(h[0],h[1],h[2],h[3]),s.premultiply(this._totalOffsetRotation),r&&s.premultiply(r),this.director.animationCallbackReceivers)for(const d of this.director.animationCallbackReceivers)d?.onTimelineRotation?.call(d,this.director,this.target,c,s);return h[0]=s.x,h[1]=s.y,h[2]=s.z,h[3]=s.w,h},a}}createPositionInterpolant(e,t,i){const n=i.createInterpolant.bind(i),s=new b;this.ensureTrackOffsets();const r=this.trackOffset?.rotation,a=this.trackOffset?.position;let l;i.createInterpolant=()=>{const c=n(),h=c.evaluate.bind(c);return c.evaluate=d=>{const p=h(d);if(s.set(p[0],p[1],p[2]),t.removeStartOffset&&(l===void 0?(l=null,l=this._actionOffsets.find(m=>m.clip===e)?.rootStartPosition?.clone()):l?.isVector3&&s.sub(l)),s.applyQuaternion(this._totalOffsetRotation),s.add(this._totalOffsetPosition),r&&s.applyQuaternion(r),a&&(s.x-=a.x,s.y+=a.y,s.z+=a.z),this.director.animationCallbackReceivers)for(const m of this.director.animationCallbackReceivers)m?.onTimelinePosition?.call(m,this.director,this.target,d,s);return p[0]=s.x,p[1]=s.y,p[2]=s.z,p},c}}}const W2=x("mutetimeline");class ss extends kl{models=[];listener;audio=[];audioContextTimeOffset=[];lastTime=0;audioSource;_audioLoader=null;getAudioFilePath(e){const t=this.director.sourceId;return us(t,e)}onAllowAudioChanged(e){for(let t=0;t<this.models.length;t++){const i=this.models[t];this.audio[t].setVolume(e?i.asset.volume:0)}}addModel(e){const t=new CC(this.listener);this.audio.push(t);const i=e;i._didTriggerPlay=!1,this.models.push(i)}onDisable(){for(const e of this.audio)e.isPlaying&&e.stop();for(const e of this.models)e._didTriggerPlay=!1}onDestroy(){for(const e of this.audio)e.source&&e?.disconnect();this.audio.length=0}onMuteChanged(){if(this.muted)for(let e=0;e<this.audio.length;e++){const t=this.audio[e];t?.isPlaying&&t.stop()}}stop(){for(let e=0;e<this.audio.length;e++){const t=this.audio[e];t?.isPlaying&&t.stop()}for(const e of this.models)e._didTriggerPlay=!1}_playableDirectorResumed=!1;onPauseChanged(){for(let e=0;e<this.audio.length;e++){const t=this.audio[e];t?.isPlaying&&t.stop()}this._playableDirectorResumed=this.director.isPlaying}evaluate(e){if(W2||this.track.muted||this.director.speed<0)return;const t=this.director.context.application.muted,i=this._playableDirectorResumed;this._playableDirectorResumed=!1;const n=t?.1:0;for(let s=0;s<this.models.length;s++){const r=this.models[s],a=this.audio[s],l=r.asset;if((!a||!a.buffer)&&this.isInTimeRange(r,e-1,e+1)&&this.handleAudioLoading(r,a),Mi.userInteractionRegistered!==!1&&!(a===null||!a.buffer))if(a.playbackRate=this.director.context.time.timeScale*this.director.speed,a.loop=l.loop,e>=r.start&&e<=r.end&&e<this.director.duration){if(!a.isPlaying||!this.director.isPlaying)(i||!r._didTriggerPlay&&this.lastTime<e)&&(r.duration*r.timeScale>.3?a.offset=r.clipIn+(e-r.start)*r.timeScale:a.offset=0,ho&&console.log("Timeline Audio ("+this.track.name+") play with offset "+a.offset+" - "+r.asset.clip),a.play(n),r._didTriggerPlay=!0);else{const h=r.clipIn+(e-r.start)*r.timeScale,d=a.context.currentTime-a._startedAt+a.offset;Math.abs(h-d)>.3&&(a.offset=h,a.stop(),a.play(n))}let c=l.volume;if(this.track.volume!==void 0&&(c*=this.track.volume),t&&(c=0),r.easeInDuration>0){const h=Math.min((e-r.start)/r.easeInDuration,1);c*=h}if(r.easeOutDuration>0){const h=Math.min((r.end-e)/r.easeOutDuration,1);c*=h}a.setVolume(c*this.director.weight)}else r._didTriggerPlay=!1,this.director.isPlaying&&a.isPlaying&&a.stop()}this.lastTime=e}loadAudio(e,t=0,i=0){let n=null;const s=e-i,r=e+t;for(const a of this.models)if(this.isInTimeRange(a,s,r)){const l=this.audio[this.models.indexOf(a)],c=this.handleAudioLoading(a,l);c!==null&&(n===null&&(n=[]),n.push(c))}return n!==null?Promise.all(n):null}isInTimeRange(e,t,i){return t<=e.start&&i>=e.end||t>=e.start&&t<=e.end||i>=e.start&&i<=e.end}static _audioBuffers=new Map;static dispose(){ss._audioBuffers.clear()}handleAudioLoading(e,t){this._audioLoader||(this._audioLoader=new gm);const i=this.getAudioFilePath(e.asset.clip);if(ss._audioBuffers.get(i)){const s=ss._audioBuffers.get(i);return s.then(r=>{r&&t.setBuffer(r)}),s}ho&&console.warn("LOAD audio track",i,this.director.sourceId);const n=new Promise((s,r)=>{this._audioLoader.load(i,a=>{t.setBuffer(a),s(a)},void 0,a=>{console.error("Error loading audio",a),s(null)})});return ss._audioBuffers.set(i,n),n}}class zp extends kl{models=[];needsSorting=!0;*foreachMarker(e=null){this.needsSorting&&this.sort();for(const t of this.models)t&&t.type===e&&(yield t)}onEnable(){this.needsSorting=!0}evaluate(e){this.needsSorting&&this.sort()}sort(){this.needsSorting=!1,this.models.sort((e,t)=>e.time-t.time)}}class Ih extends kl{models=[];didTrigger=[];receivers=[];evaluate(e){if(this.track.muted)return;const t=this.director.context.time.deltaTime*1.5;for(let i=0;i<this.models.length;i++){const n=this.models[i],s=this.didTrigger[i],r=n.time-e;let a=!1;if(n.retroActive)a=r<=1e-6;else{const l=Math.abs(r);(l===0||l>=1e-5&&l<t)&&(a=!0)}if(a){if(!s)if(ho&&console.log("Trigger signal",e,n.time,n),this.didTrigger[i]=!0,this.receivers?.length<=0)Eh.invoke(n.asset);else for(const l of this.receivers)l&&l.invoke(n.asset)}else n.emitOnce||(this.didTrigger[i]=!1)}}}class Up extends kl{models=[];timelines=[];resolveSourceObjects(e){for(let t=this.models.length-1;t>=0;t--){const i=this.models[t].asset;if(!i.sourceObject||typeof i.sourceObject!="object"){console.log("no source object, removing model",t,i),this.models.splice(t,1);continue}else{const n=w.getComponent(i.sourceObject,ra);this.timelines.push(n),n&&i.updateDirector&&(n.playOnAwake=!1)}}}_previousActiveModel=null;evaluate(e){this._previousActiveModel=null;for(let t=0;t<this.models.length;t++){const i=this.models[t],n=i.asset;if(e>=i.start&&e<=i.end){this._previousActiveModel=i;const s=this.getClipTime(e,i);if(n.controlActivation){const r=n.sourceObject;r.visible=!0}if(n.updateDirector){const r=this.timelines[t];r&&(r.isPlaying&&r.pause(),r.time=s,r.evaluate())}}else{const s=this._previousActiveModel?.asset;if(n.controlActivation){const r=n.sourceObject;s?.sourceObject!==r&&(r.visible=!1)}}}}}var $2=Object.defineProperty,C1=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&$2(e,t,n),n};const qo=x("debugtimeline"),_0=class $0 extends R{static createTrackFunctions={};static registerCreateTrack(e,t){this.createTrackFunctions[e]=t}playableAsset;playOnAwake;extrapolationMode=1;get isPlaying(){return this._isPlaying}get isPaused(){return this._isPaused}get time(){return this._time}set time(e){typeof e=="number"&&!Number.isNaN(e)?this._time=e:(qo||$i())&&console.error("INVALID TIMELINE.TIME VALUE",e,this.name)}get duration(){return this._duration}set duration(e){this._duration=e}get weight(){return this._weight}set weight(e){this._weight=e}get speed(){return this._speed}set speed(e){this._speed=e}waitForAudio=!0;_visibilityChangeEvt;_clonedPlayableAsset=!1;_speed=1;awake(){qo&&console.log(this,this.playableAsset),this.rebuildGraph(),!this.isValid()&&(qo||A())&&(qo?console.warn("PlayableDirector is not valid","Asset?",this.playableAsset,"Tracks:",this.playableAsset?.tracks,"IsArray?",Array.isArray(this.playableAsset?.tracks),this):this.playableAsset?.tracks?.length?console.warn("PlayableDirector is not valid"):console.warn("PlayableDirector has no tracks"))}onEnable(){for(const e of this._audioTracks)e.onEnable?.();for(const e of this._customTracks)e.onEnable?.();for(const e of this._animationTracks)e.onEnable?.();this.playOnAwake&&this.play(),this._visibilityChangeEvt||(this._visibilityChangeEvt=()=>{switch(document.visibilityState){case"hidden":this.setAudioTracksAllowPlaying(!1);break;case"visible":this.setAudioTracksAllowPlaying(!0);break}}),window.addEventListener("visibilitychange",this._visibilityChangeEvt)}onDisable(){this.stop();for(const e of this._audioTracks)e.onDisable?.();for(const e of this._customTracks)e.onDisable?.();for(const e of this._animationTracks)e.onDisable?.();this._visibilityChangeEvt&&window.removeEventListener("visibilitychange",this._visibilityChangeEvt)}onDestroy(){for(const e of this._allTracks)for(const t of e)t.onDestroy?.()}rebuildGraph(){this.isValid()&&(this.resolveBindings(),this.updateTimelineDuration(),this.setupAndCreateTrackHandlers())}async play(){if(!this.isValid())return;const e=this._isPaused==!0;if(this._isPaused=!1,!this._isPlaying){if(this._isPlaying=!0,e&&this.invokePauseChangedMethodsOnTracks(),this.waitForAudio){const t=[];for(const i of this._audioTracks){const n=i.loadAudio(this._time,1,0);n&&t.push(n)}if(t.length>0&&(await Promise.all(t),!this._isPlaying))return;for(;this._audioTracks.length>0&&this._isPlaying&&!Mi.userInteractionRegistered&&this.waitForAudio;)await Un(200)}this.invokeStateChangedMethodsOnTracks(),this._internalUpdateRoutine=this.startCoroutine(this.internalUpdate(),xe.LateUpdate)}}pause(){this.isValid()&&(this._isPlaying=!1,!this._isPaused&&(this._isPaused=!0,this.internalEvaluate(),this.invokePauseChangedMethodsOnTracks(),this.invokeStateChangedMethodsOnTracks()))}stop(){this._isStopping=!0;for(const i of this._audioTracks)i.stop();const e=this._isPaused==!0,t=this._isPlaying;this._isPlaying&&(this._time=0,this._isPlaying=!1,this._isPaused=!1,this.internalEvaluate(),e&&this.invokePauseChangedMethodsOnTracks()),this._isPlaying=!1,this._isPaused=!1,e&&!t&&this.invokePauseChangedMethodsOnTracks(),t&&this.invokeStateChangedMethodsOnTracks(),this._internalUpdateRoutine&&this.stopCoroutine(this._internalUpdateRoutine),this._internalUpdateRoutine=null,this._isStopping=!1}evaluate(){this.internalEvaluate(!0)}isValid(){return this.playableAsset&&this.playableAsset.tracks&&Array.isArray(this.playableAsset.tracks)}*forEachTrack(){for(const e of this._allTracks)for(const t of e)yield t}get animationTracks(){return this._animationTracks}get audioTracks(){return this._audioTracks}get signalTracks(){return this._signalTracks}get markerTracks(){return this._markerTracks}*foreachMarker(e=null){for(const t of this._markerTracks)for(const i of t.foreachMarker(e))yield i}_guidsMap;resolveGuids(e){this._guidsMap=e}_isPlaying=!1;_internalUpdateRoutine;_isPaused=!1;_isStopping=!1;_time=0;_duration=0;_weight=1;_animationTracks=[];_audioTracks=[];_signalTracks=[];_markerTracks=[];_controlTracks=[];_customTracks=[];_allTracks=[this._animationTracks,this._audioTracks,this._signalTracks,this._markerTracks,this._controlTracks,this._customTracks];invokePauseChangedMethodsOnTracks(){for(const e of this.forEachTrack())e.onPauseChanged?.call(e)}invokeStateChangedMethodsOnTracks(){for(const e of this.forEachTrack())e.onStateChanged?.call(e,this._isPlaying)}*internalUpdate(){for(;this._isPlaying&&this.activeAndEnabled;)!this._isPaused&&this._isPlaying&&(this._time+=this.context.time.deltaTime*this.speed,this.internalEvaluate()),yield}internalEvaluate(e=!1){if(!this.isValid())return;let t=this._time;switch(this.extrapolationMode){case 0:this._speed>0?t=Math.min(t,this._duration):this._speed<0&&(t=Math.max(t,0)),this._time=t;break;case 1:t%=this._duration,this._time=t;break;case 2:if(t>this._duration){this.stop();return}break}const i=this._time;for(const n of this.playableAsset.tracks)if(!n.muted)switch(n.type){case Bi.Activation:if(!e&&!this._isPlaying)continue;for(let s=0;s<n.outputs.length;s++){const r=n.outputs[s];if(typeof r=="object"){let a=!1;if(n.clips)for(const c of n.clips)c.start<=i&&i<=c.end&&(a=!0);const l=r;l.visible!==void 0&&l.visible!==a&&(l.visible=a,qo&&console.warn(this.name,"set ActivationTrack-"+s,l.name,a,i))}}break}for(const n of this._allTracks)for(const s of n)this._isStopping&&s instanceof Ah||s.evaluate(i)}resolveBindings(){if(this._clonedPlayableAsset||(this._clonedPlayableAsset=!0,this.playableAsset=Ql(this.playableAsset)),!this.playableAsset||!this.playableAsset.tracks)return;const e=this.findRoot(this.gameObject);for(const t of this.playableAsset.tracks){for(let i=t.outputs.length-1;i>=0;i--){let n=t.outputs[i];if(typeof n=="string"){this._guidsMap&&this._guidsMap[n]&&(n=this._guidsMap[n]);const s=w.findByGuid(n,e);s===null||typeof s!="object"?(t.outputs.splice(i,1),console.warn("Failed to resolve binding",n,t.name,t.type)):(qo&&console.log("Resolved binding",n,"to",s),t.outputs[i]=s)}else if(n===null){if(t.outputs.splice(i,1),$0.createTrackFunctions[t.type])continue;t.type!==Bi.Audio&&t.type!==Bi.Control&&t.type!==Bi.Marker&&t.type!==Bi.Signal&&console.warn("Missing binding",n,t.name,t.type,this.name,this.playableAsset.name)}}if(t.type===Bi.Control&&t.clips)for(let i=0;i<t.clips.length;i++){const n=t.clips[i];let s=n.asset.sourceObject;if(typeof s=="string"){this._guidsMap&&this._guidsMap[s]&&(s=this._guidsMap[s]);const r=w.findByGuid(s,e);r===null||typeof r!="object"?console.warn("Failed to resolve sourceObject binding",s,t.name,n):(qo&&console.log("Resolved binding",s,"to",r),n.asset.sourceObject=r)}}}}findRoot(e){return e.parent?this.findRoot(e.parent):e}updateTimelineDuration(){if(this._duration=0,!(!this.playableAsset||!this.playableAsset.tracks)){for(const e of this.playableAsset.tracks)if(e.muted!==!0){if(e.clips)for(const t of e.clips)t.end>this._duration&&(this._duration=t.end);if(e.markers)for(const t of e.markers)t.time>this._duration&&(this._duration=t.time+.001)}}}setupAndCreateTrackHandlers(){if(this._animationTracks.length=0,this._audioTracks.length=0,this._signalTracks.length=0,!this.playableAsset)return;let e=w.findObjectOfType(Eo,this.context);for(const t of this.playableAsset.tracks){const i=t.type,n=$0.createTrackFunctions[i];if(n!=null){const s=n(this,t);if(typeof s.evaluate=="function"){s.director=this,s.track=t,this._customTracks.push(s);continue}}if(t.type===Bi.Animation){if(!t.clips||t.clips.length<=0){qo&&console.warn("Animation track has no clips",t);continue}for(let s=t.outputs.length-1;s>=0;s--){let r=t.outputs[s];if(r instanceof k){const l=w.getOrAddComponent(r,ft);l&&(r=l)}const a=r?.gameObject?.animations;if(a){const l=new Ah;l.trackOffset=t.trackOffset,l.director=this,l.track=t;for(let c=0;c<t.clips.length;c++){const h=t.clips[c],d=h.asset;if(!d){console.error(`Timeline ${this.name}: clip #${c} on track "${t.name}" has no animation data`);continue}const p=d.clip;let m=p;if((typeof m=="string"||typeof m=="number")&&(m=a.find(g=>g.name===p)),qo&&console.log(d,p,"\u2192",m),!m){console.warn("Could not find animationClip for model",h,t.name,this.name,this.playableAsset?.name,a,r);continue}r instanceof ft&&r.runtimeAnimatorController&&(r.__internalDidAwakeAndStart||r.initializeRuntimeAnimatorController(),r.runtimeAnimatorController.mixer||r.runtimeAnimatorController.bind(r),l.mixer=r.runtimeAnimatorController.mixer),l.mixer||(l.mixer=new mm(r.gameObject),this.context.animations.registerAnimationMixer(l.mixer)),l.clips.push(m),l.mixer.uncacheAction(m),l.createHooks(h.asset,m);const f=l.mixer.clipAction(m);l.actions.push(f),l.models.push(h)}this._animationTracks.push(l)}}}else if(t.type===Bi.Audio){if(!t.clips||t.clips.length<=0)continue;const s=new ss;s.director=this,s.track=t,s.audioSource=t.outputs.find(r=>r instanceof Mi),this._audioTracks.push(s),e||(e=this.context.mainCameraComponent?.gameObject.addComponent(Eo)),s.listener=e.listener;for(let r=0;r<t.clips.length;r++){const a=t.clips[r];s.addModel(a)}}else if(t.type===Bi.Marker){if(t.markers){const s=new Ih;s.director=this,s.track=t;const r=new zp;r.director=this,r.track=t;for(const a of t.markers)switch(a.type){case b0.Signal:s.models.push(a),s.didTrigger.push(!1);break;default:r.models.push(a);break}if(s!==null&&s.models.length>0){const a=w.getComponent(this.gameObject,Eh);a&&(s.receivers.push(a),this._signalTracks.push(s))}r!==null&&r.models.length>0&&this._markerTracks.push(r)}}else if(t.type===Bi.Signal){const s=new Ih;if(s.director=this,s.track=t,t.markers)for(const r of t.markers)s.models.push(r),s.didTrigger.push(!1);for(const r of t.outputs)s.receivers.push(r);this._signalTracks.push(s)}else if(t.type===Bi.Control){const s=new Up;if(s.director=this,s.track=t,t.clips)for(const r of t.clips)s.models.push(r);s.resolveSourceObjects(this.context),this._controlTracks.push(s)}}}setAudioTracksAllowPlaying(e){for(const t of this._audioTracks)t.onAllowAudioChanged(e)}animationCallbackReceivers=[];registerAnimationCallback(e){this.animationCallbackReceivers.push(e)}unregisterAnimationCallback(e){const t=this.animationCallbackReceivers.indexOf(e);t!==-1&&this.animationCallbackReceivers.splice(t,1)}};C1([u()],_0.prototype,"playOnAwake"),C1([u()],_0.prototype,"extrapolationMode");let ra=_0;var H2=Object.defineProperty,Np=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&H2(e,t,n),n};class aa extends R{isGizmo=!1;translationSnap=1;rotationSnapAngle=15;scaleSnap=.25;get control(){return this._control}_control;orbit;onEnable(){if(!(this.isGizmo&&!fc)&&this.context.mainCamera&&(this._control||(this._control=new GC(this.context.mainCamera,this.context.renderer.domElement),this._control.enabled=!0,this._control.getRaycaster().layers.set(2),this._control.size=1,("_root"in this._control?this._control._root:this._control).traverse(e=>{const t=e;if(t.layers.set(2),t){const i=t.material;i&&(i.opacity=.3)}}),this.orbit=w.getComponentInParent(this.context.mainCamera,fe)??void 0),this._control)){const e=this._control.getHelper();this.context.scene.add(e),this._control.attach(this.gameObject),this._control?.addEventListener("dragging-changed",this.onControlChangedEvent),window.addEventListener("keydown",this.windowKeyDownListener),window.addEventListener("keyup",this.windowKeyUpListener)}}onDisable(){this._control?.getHelper()?.removeFromParent(),this._control?.removeEventListener("dragging-changed",this.onControlChangedEvent),window.removeEventListener("keydown",this.windowKeyDownListener),window.removeEventListener("keyup",this.windowKeyUpListener)}enableSnapping(){this._control&&(this._control.setTranslationSnap(this.translationSnap),this._control.setRotationSnap(yo.degToRad(this.rotationSnapAngle)),this._control.setScaleSnap(this.scaleSnap))}disableSnapping(){this._control&&(this._control.setTranslationSnap(null),this._control.setRotationSnap(null),this._control.setScaleSnap(null))}onControlChangedEvent=e=>{const t=this.orbit;if(t&&(t.enabled=!e.value),e.value){const i=this.gameObject.getComponentInParent(Cn);i&&(i.fastMode=!0,i.requestOwnership())}else{const i=this.gameObject.getComponentInParent(Cn);i&&(i.fastMode=!1)}};windowKeyDownListener=e=>{if(this.enabled&&this._control)switch(e.keyCode){case 81:this._control.setSpace(this._control.space==="local"?"world":"local");break;case 16:this.enableSnapping();break;case 87:this._control.setMode("translate");break;case 69:this._control.setMode("rotate");break;case 82:this._control.setMode("scale");break;case 187:case 107:this._control.setSize(this._control.size+.1);break;case 189:case 109:this._control.setSize(Math.max(this._control.size-.1,.1));break;case 88:this._control.showX=!this._control.showX;break;case 89:this._control.showY=!this._control.showY;break;case 90:this._control.showZ=!this._control.showZ;break;case 32:this._control.enabled=!this._control.enabled;break}};windowKeyUpListener=e=>{if(this.enabled)switch(e.keyCode){case 16:this.disableSnapping();break}}}Np([u()],aa.prototype,"isGizmo"),Np([u()],aa.prototype,"translationSnap"),Np([u()],aa.prototype,"rotationSnapAngle"),Np([u()],aa.prototype,"scaleSnap");var G2=Object.defineProperty,q2=Object.getOwnPropertyDescriptor,Vp=(o,e,t,i)=>{for(var n=i>1?void 0:i?q2(e,t):e,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=(i?r(e,t,n):r(n))||n);return i&&n&&G2(e,t,n),n};class v0{texture=null;rect}Vp([u(Re)],v0.prototype,"texture",2);let Ml=class extends oh{set image(o){this.sprite||(this.sprite=new v0),this.sprite.texture=o,this.onAfterCreated()}get image(){return this.sprite?this.sprite.texture:null}get sprite(){return this._sprite}set sprite(o){this._sprite!==o&&(this._sprite=o,this.onAfterCreated())}_sprite;pixelsPerUnitMultiplier=1;isBuiltinSprite(){const o=this.sprite;switch(o?.texture?.name){case"InputFieldBackground":case"UISprite":case"Background":case"Knob":return!0}return!o?.texture?.name?.length&&o?.texture?.image?.width===32&&o?.texture?.image?.height===32}onBeforeCreate(o){super.onBeforeCreate(o),this.isBuiltinSprite()&&(o.borderRadius=5/this.pixelsPerUnitMultiplier,this.sprite?.texture?.name==="Knob"&&(o.borderRadius=999))}onAfterCreated(){this.__didAwake&&(super.onAfterCreated(),!this.isBuiltinSprite()&&this.setTexture(this.sprite?.texture))}};Vp([u(v0)],Ml.prototype,"sprite",1),Vp([u()],Ml.prototype,"pixelsPerUnitMultiplier",2);class Wp extends oh{get mainTexture(){return this._mainTexture}set mainTexture(e){this._mainTexture!==e&&(this._mainTexture=e,this.onAfterCreated())}_mainTexture;onAfterCreated(){this.__didAwake&&(super.onAfterCreated(),this.setTexture(this.mainTexture))}}Vp([u(Re)],Wp.prototype,"mainTexture",1);var X2=Object.defineProperty,Q2=Object.getOwnPropertyDescriptor,Fi=(o,e,t,i)=>{for(var n=i>1?void 0:i?Q2(e,t):e,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=(i?r(e,t,n):r(n))||n);return i&&n&&X2(e,t,n),n};const la=x("debugbutton");class Ys{colorMultiplier;disabledColor;fadeDuration;highlightedColor;normalColor;pressedColor;selectedColor}Fi([u()],Ys.prototype,"colorMultiplier",2),Fi([u(oe)],Ys.prototype,"disabledColor",2),Fi([u()],Ys.prototype,"fadeDuration",2),Fi([u(oe)],Ys.prototype,"highlightedColor",2),Fi([u(oe)],Ys.prototype,"normalColor",2),Fi([u(oe)],Ys.prototype,"pressedColor",2),Fi([u(oe)],Ys.prototype,"selectedColor",2);class Y2{disabledTrigger;highlightedTrigger;normalTrigger;pressedTrigger;selectedTrigger}class Xo extends R{click(){this.onClick?.invoke()}onClick=new he;_isHovered=0;onPointerEnter(e){const t=e.event.pointerType==="mouse"&&e.button===0;t&&(this._isHovered+=1),la&&console.warn("Button Enter",t,this._isHovered,this.animationTriggers?.highlightedTrigger,this.animator),this.interactable&&(this.transition==3&&this.animationTriggers&&this.animator?this.animator.setTrigger(this.animationTriggers.highlightedTrigger):this.transition===1&&this.colors&&this._image?.setState("hovered"),t&&this.context.input.setCursor("pointer"))}onPointerExit(){this._isHovered-=1,this._isHovered<0&&(this._isHovered=0),la&&console.log("Button Exit",this._isHovered,this.animationTriggers?.highlightedTrigger,this.animator),this.interactable&&(this._isHovered>0||(this._isHovered=0,this.transition==3&&this.animationTriggers&&this.animator?this.animator.setTrigger(this.animationTriggers.normalTrigger):this.transition===1&&this.colors&&this._image?.setState("normal"),this.context.input.unsetCursor("pointer")))}onPointerDown(e){la&&console.log("Button Down",this.animationTriggers?.highlightedTrigger,this.animator),this.interactable&&(this.transition==3&&this.animationTriggers&&this.animator?this.animator.setTrigger(this.animationTriggers.pressedTrigger):this.transition===1&&this.colors&&this._image?.setState("pressed"))}onPointerUp(e){la&&console.warn("Button Up",this.animationTriggers?.highlightedTrigger,this.animator,this._isHovered),this.interactable&&(this.transition==3&&this.animationTriggers&&this.animator?this.animator.setTrigger(this._isHovered?this.animationTriggers.highlightedTrigger:this.animationTriggers.normalTrigger):this.transition===1&&this.colors&&this._image?.setState(this._isHovered?"hovered":"normal"))}onPointerClick(e){if(this.interactable&&!(e.button!==0&&e.event.pointerType===Dd.Mouse)&&(la&&(console.warn("Button Click",this.onClick),Te("CLICKED button "+this.name+" at "+this.context.time.frameCount)),this.onClick&&this.onClick.listenerCount>0&&(this.onClick.invoke(),e.use(),la))){const t=this.gameObject.worldPosition;t.add(this.gameObject.worldUp.multiplyScalar(1+Math.random()*.5)),F.DrawLabel(t,"CLICK:"+Date.now(),.1,1+Math.random()*.5)}}colors;transition;animationTriggers;animator;set interactable(e){this._interactable=e,this._image&&(this._image.setInteractable(e),e?this._image.setState("normal"):this._image.setState("disabled"))}get interactable(){return this._interactable}_interactable=!0;set_interactable(e){this.interactable=e}awake(){super.awake(),la&&console.log(this),this._isInit=!1,this.init()}start(){this._image?.setInteractable(this.interactable),this.gameObject.getComponentInParent(qa)||this.gameObject.addComponent(Mu)}onEnable(){super.onEnable()}onDestroy(){this._isHovered&&this.context.input.unsetCursor("pointer")}_requestedAnimatorTrigger;*setAnimatorTriggerAtEndOfFrame(e){this._requestedAnimatorTrigger=e,yield,yield,this._requestedAnimatorTrigger==e&&this.animator?.setTrigger(e)}_isInit=!1;_image;init(){this._isInit||(this._isInit=!0,this._image=w.getComponent(this.gameObject,Ml),this._image&&(this.stateSetup(this._image),this.interactable?this._image.setState("normal"):this._image.setState("disabled")))}stateSetup(e){e.setInteractable(this.interactable);const t=this.getFinalColor(e.color,this.colors?.normalColor),i={state:"normal",attributes:{backgroundColor:t,backgroundOpacity:t.alpha}};e.setupState(i);const n=this.getFinalColor(e.color,this.colors?.highlightedColor),s={state:"hovered",attributes:{backgroundColor:n,backgroundOpacity:n.alpha}};e.setupState(s);const r=this.getFinalColor(e.color,this.colors?.pressedColor),a={state:"pressed",attributes:{backgroundColor:r,backgroundOpacity:r.alpha}};e.setupState(a);const l=this.getFinalColor(e.color,this.colors?.selectedColor),c={state:"selected",attributes:{backgroundColor:l,backgroundOpacity:l.alpha}};e.setupState(c);const h=this.getFinalColor(e.color,this.colors?.disabledColor),d={state:"disabled",attributes:{backgroundColor:h,backgroundOpacity:h.alpha}};e.setupState(d)}getFinalColor(e,t){return t?e.clone().multiply(t).convertLinearToSRGB():e.clone().convertLinearToSRGB()}}Fi([u(he)],Xo.prototype,"onClick",2),Fi([u(Ys)],Xo.prototype,"colors",2),Fi([u()],Xo.prototype,"transition",2),Fi([u(Y2)],Xo.prototype,"animationTriggers",2),Fi([u(ft)],Xo.prototype,"animator",2),Fi([u()],Xo.prototype,"interactable",1);var Z2=Object.defineProperty,$p=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&Z2(e,t,n),n};const Zs=x("debuginputfield"),Lh=class X extends R{get text(){return this.textComponent?.text??""}set text(e){this.textComponent&&(this.textComponent.text=e,this.placeholder&&(e.length>0?this.placeholder.gameObject.visible=!1:this.placeholder.gameObject.visible=!0))}get isFocused(){return X.active===this}textComponent;placeholder;onValueChanged;onEndEdit;static active=null;static activeTime=-1;static htmlField=null;static htmlFieldFocused=!1;inputEventFn;_iosEventFn;start(){Zs&&console.log(this.name,this)}onEnable(){X.htmlField||(X.htmlField=document.createElement("input"),X.htmlField.style.width="0px",X.htmlField.style.height="0px",X.htmlField.style.padding="0px",X.htmlField.style.border="none",X.htmlField.style.overflow="hidden",X.htmlField.style.caretColor="transparent",X.htmlField.style.outline="none",X.htmlField.classList.add("ar"),X.htmlField.onfocus=()=>X.htmlFieldFocused=!0,X.htmlField.onblur=()=>X.htmlFieldFocused=!1,document.body.append(X.htmlField)),this.inputEventFn||(this.inputEventFn=this.onInput.bind(this)),X.htmlField.addEventListener("keyup",this.inputEventFn),this.placeholder&&this.textComponent?.text.length&&w.setActive(this.placeholder.gameObject,!1),G.isiOS()&&(this._iosEventFn=this.processInputOniOS.bind(this),window.addEventListener("click",this._iosEventFn))}onDisable(){X.htmlField?.removeEventListener("keyup",this.inputEventFn),this.onDeselected(),this._iosEventFn&&window.removeEventListener("click",this._iosEventFn)}clear(){X.active===this&&X.htmlField?(X.htmlField.value="",this.setTextFromInputField()):(this.textComponent&&(this.textComponent.text=""),this.placeholder&&w.setActive(this.placeholder.gameObject,!0))}select(){this.onSelected()}deselect(){this.onDeselected()}onPointerEnter(e){e.event.pointerType==="mouse"&&e.button===0&&this.context.input.setCursor("text")}onPointerExit(e){this.context.input.unsetCursor("text")}onPointerClick(e){Zs&&console.log("CLICK",e,X.active),X.activeTime=this.context.time.time,X.active!==this&&this.startCoroutine(this.activeLoop(),xe.LateUpdate),this.selectInputField()}*activeLoop(){for(this.onSelected();X.active===this&&!(this.context.input.getPointerClicked(0)&&this.context.time.time-X.activeTime>.2);)this.setTextFromInputField(),yield;this.onDeselected()}onSelected(){if(X.active!==this&&(Zs&&console.log("Select",this.name,this,X.htmlField,this.context.isInXR,this.context.arOverlayElement,this.textComponent?.text,X.htmlField?.value),X.active?.onDeselected(),X.active=this,this.placeholder&&w.setActive(this.placeholder.gameObject,!1),X.htmlField)){if(X.htmlField.value=this.textComponent?.text||"",Zs&&console.log("set input field value",X.htmlField.value),this.context.isInXR){const e=this.context.arOverlayElement;e&&e.append(X.htmlField)}this.selectInputField()}}onDeselected(){X.active===this&&(X.active=null,Zs&&console.log("Deselect",this.name,this),X.htmlField&&(X.htmlField.blur(),document.body.append(X.htmlField)),this.placeholder&&(!this.textComponent||this.textComponent.text.length<=0)&&w.setActive(this.placeholder.gameObject,!0),X.htmlField&&this.onEndEdit?.invoke(X.htmlField.value))}update(){X.active===this&&this.textComponent?.markDirty()}onInput(e){if(X.active===this){if(Zs&&console.log(e.code,e,X.htmlField?.value,this.textComponent?.text),e.code==="Escape"||e.code==="Enter"){this.onDeselected();return}X.htmlField&&(this.textComponent&&(this.setTextFromInputField(),this.placeholder&&w.setActive(this.placeholder.gameObject,this.textComponent.text.length<=0)),this.selectInputField())}}setTextFromInputField(){if(this.textComponent&&X.htmlField){const e=this.textComponent.text,t=X.htmlField.value,i=this.textComponent.text!==X.htmlField.value;this.textComponent.text=X.htmlField.value,i&&(Zs&&console.log("[InputField] value changed:",t,e),this.onValueChanged?.invoke(t,e))}}selectInputField(){X.htmlField&&(Zs&&console.log("Focus Inputfield",X.htmlFieldFocused),X.htmlField.setSelectionRange(X.htmlField.value.length,X.htmlField.value.length),G.isiOS()?X.htmlField.focus({preventScroll:!0}):setTimeout(()=>X.htmlField?.focus(),1))}processInputOniOS(){const e=this.context.physics.raycast();if(!e.length)return;const t=e[0].object,i=gf(t);(i?.gameObject===this.gameObject||i?.gameObject.parent===this.gameObject)&&this.selectInputField()}};$p([u(Bt)],Lh.prototype,"textComponent"),$p([u(Bt)],Lh.prototype,"placeholder"),$p([u(he)],Lh.prototype,"onValueChanged"),$p([u(he)],Lh.prototype,"onEndEdit");let x0=Lh;var K2=Object.defineProperty,P1=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&K2(e,t,n),n};class jh extends R{id=null;keepAspect=!1;_object=null;onEnable(){if(this._object){this.gameObject.add(this._object);return}if(!this.id||!this.context.mainCamera)return;const e=document.getElementById(this.id);if(!e){console.warn('Could not find element with id "'+this.id+'"');return}e.style.display="block",e.style.visibility="hidden";const t=new qC;t.listenToPointerEvents(this.context.renderer,this.context.mainCamera),this.gameObject.add(t);const i=new XC(e);t.add(i),i.visible=!1;const n=i.material;n.transparent=!0,setTimeout(()=>{i.visible=!0;const s=Rd(this.gameObject).clone();Jl(this.gameObject,0,0,0),this.gameObject.updateMatrixWorld();const r=new bi;r.setFromObject(t),this.setWorldRotation(s.x,s.y,s.z);const a=r.max.x-r.min.x,l=r.max.y-r.min.y;if(this.keepAspect){const h=a/l;a>l?i.scale.set(1/a,1/l/h,1):i.scale.set(1/a*h,1/l,1)}else i.scale.set(1/a,1/l,1);const c=this.gameObject.scale;i.scale.multiply(c)},1)}onDisable(){this._object?.removeFromParent()}}P1([u()],jh.prototype,"id"),P1([u()],jh.prototype,"keepAspect");/* @license
|
|
1418
1418
|
* Copyright 2021 Google LLC. All Rights Reserved.
|
|
1419
1419
|
* Licensed under the Apache License, Version 2.0 (the 'License');
|
|
1420
1420
|
* you may not use this file except in compliance with the License.
|
|
@@ -1428,7 +1428,7 @@ C) Set "joinRandomRoom" to true`),!1):(g0&&console.log("Join "+this.roomName),th
|
|
|
1428
1428
|
* See the License for the specific language governing permissions and
|
|
1429
1429
|
* limitations under the License.
|
|
1430
1430
|
*/const J2={topLight:{intensity:500,position:[.418,16.199,.3]},room:{position:[-.757,13.219,.717],scale:[31.713,28.305,28.591]},boxes:[{position:[-10.906,2.009,1.846],rotation:-.195,scale:[2.328,7.905,4.651]},{position:[-5.607,-.754,-.758],rotation:.994,scale:[1.97,1.534,3.955]},{position:[6.167,.857,7.803],rotation:.561,scale:[3.927,6.285,3.687]},{position:[-2.017,.018,6.124],rotation:.333,scale:[2.002,4.566,2.064]},{position:[2.291,-.756,-2.621],rotation:-.286,scale:[1.546,1.552,1.496]},{position:[-2.193,-.369,-5.547],rotation:.516,scale:[3.875,3.487,2.986]}],lights:[{intensity:50,position:[-16.116,14.37,8.208],scale:[.1,2.428,2.739]},{intensity:50,position:[-16.109,18.021,-8.207],scale:[.1,2.425,2.751]},{intensity:17,position:[14.904,12.198,-1.832],scale:[.15,4.265,6.331]},{intensity:43,position:[-.462,8.89,14.52],scale:[4.38,5.441,.088]},{intensity:20,position:[3.235,11.486,-12.541],scale:[2.5,2,.1]},{intensity:100,position:[0,20,0],scale:[1,.1,1]}]},eI={topLight:{intensity:400,position:[.5,14,.5]},room:{position:[0,13.2,0],scale:[31.5,28.5,31.5]},boxes:[{position:[-10.906,-1,1.846],rotation:-.195,scale:[2.328,7.905,4.651]},{position:[-5.607,-.754,-.758],rotation:.994,scale:[1.97,1.534,3.955]},{position:[6.167,-.16,7.803],rotation:.561,scale:[3.927,6.285,3.687]},{position:[-2.017,.018,6.124],rotation:.333,scale:[2.002,4.566,2.064]},{position:[2.291,-.756,-2.621],rotation:-.286,scale:[1.546,1.552,1.496]},{position:[-2.193,-.369,-5.547],rotation:.516,scale:[3.875,3.487,2.986]}],lights:[{intensity:80,position:[-14,10,8],scale:[.1,2.5,2.5]},{intensity:80,position:[-14,14,-4],scale:[.1,2.5,2.5]},{intensity:23,position:[14,12,0],scale:[.1,5,5]},{intensity:16,position:[0,9,14],scale:[5,5,.1]},{intensity:80,position:[7,8,-14],scale:[2.5,2.5,.1]},{intensity:80,position:[-7,16,-14],scale:[2.5,2.5,.1]},{intensity:1,position:[0,20,0],scale:[.1,.1,.1]}]};class Hp extends yi{constructor(e){super(),this.position.y=-3.5;const t=new va;t.deleteAttribute("uv");const i=new ut({metalness:0,side:_d}),n=new ut({metalness:0}),s=e=="legacy"?J2:eI,r=new cm(16777215,s.topLight.intensity,28,2);r.position.set(...s.topLight.position),this.add(r);const a=new H(t,i);a.position.set(...s.room.position),a.scale.set(...s.room.scale),this.add(a);for(const l of s.boxes){const c=new H(t,n);c.position.set(...l.position),c.rotation.set(0,l.rotation,0),c.scale.set(...l.scale),this.add(c)}for(const l of s.lights){const c=new H(t,this.createAreaLightMaterial(l.intensity));c.position.set(...l.position),c.scale.set(...l.scale),this.add(c)}}createAreaLightMaterial(e){const t=new we;return t.color.setScalar(e),t}}var tI=Object.defineProperty,Gp=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&tI(e,t,n),n};const Dh=class dS extends R{target;invertForward=!1;keepUpDirection=!0;copyTargetRotation=!1;static flipYQuat=new U().setFromAxisAngle(new b(0,1,0),Math.PI);onBeforeRender(){let e=this.target;if(e||(e=this.context.mainCamera,A()&&console.warn(`[LookAt] No target set on ${this.name}, using main camera as target.`)),!e)return;let t=this.copyTargetRotation;(this.context.isInVR||this.context.isInPassThrough)&&(t=!1),Kl(this.gameObject,e,this.keepUpDirection,t),this.invertForward&&this.gameObject.quaternion.multiply(dS.flipYQuat)}createBehaviours(e,t,i){if(t.uuid===this.gameObject.uuid){let n=t;if(this.keepUpDirection){const r=it.createEmptyParent(t);n=r;const a=this.invertForward?-1:1;r.setMatrix(r.getMatrix().multiply(new ee().makeRotationZ(Math.PI/2*a))),t.setMatrix(t.getMatrix().multiply(new ee().makeRotationZ(-Math.PI/2*a)))}const s=new Et("lookat "+this.name,Dt.sceneStartTrigger(),me.lookAtCameraAction(n,void 0,this.invertForward?un.back:un.forward,this.keepUpDirection?un.up:un.zero));e.addBehavior(s)}}};Gp([u(k)],Dh.prototype,"target"),Gp([u()],Dh.prototype,"invertForward"),Gp([u()],Dh.prototype,"keepUpDirection"),Gp([u()],Dh.prototype,"copyTargetRotation");let w0=Dh;var iI=Object.defineProperty,S0=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&iI(e,t,n),n};class Rl extends R{url;mode=0;clickable=!0;async open(){if(!this.url){console.warn("OpenURL: URL is not set, can't open.",this);return}this._validateUrl();let e=this.url;switch(!e.startsWith("mailto:")&&e.includes("@")&&(e="mailto:"+e),A()&&Te("Open URL: "+e),this.mode){case 0:G.isSafari(),globalThis.open(e,"_blank");break;case 1:G.isSafari()&&G.isiOS()?globalThis.open(e,"_top"):globalThis.open(e,"_self");break;case 2:G.isSafari()?globalThis.open(e,"_top"):globalThis.open(e,"_new");break}}start(){this.gameObject.getComponentInParent(ki)||this.gameObject.addComponent(ki)}onPointerEnter(e){!e.used&&this.clickable&&this.context.input.setCursor("pointer")}onPointerExit(){this.clickable&&this.context.input.unsetCursor("pointer")}onPointerClick(e){this.clickable&&!e.used&&this.url?.length&&this.open()}_validateUrl(){this.url&&this.url.startsWith("www.")&&(A()&&console.warn("URL is not valid, adding https:// to the start of the URL",this.url),this.url="https://"+this.url)}}S0([u()],Rl.prototype,"url"),S0([u()],Rl.prototype,"mode"),S0([u()],Rl.prototype,"clickable"),bu(o=>{const e=o.domElement.getAttribute("clickthrough");if(t(e)){const i=o.scene.addComponent(qp);Im(o.domElement,"clickthrough",()=>{const n=o.domElement.getAttribute("clickthrough");i.enabled=t(n)})}function t(i){return i!==null&&i!=="0"&&i!=="false"}});class qp extends R{_previousPointerEvents="all";onEnable(){this.context.input.addEventListener("pointerdown",this.onPointerEvent),this.context.input.addEventListener("pointermove",this.onPointerEvent,{queue:100}),window.addEventListener("touchend",this.onTouchEnd,{passive:!0}),this._previousPointerEvents=this.context.domElement.style.pointerEvents}onDisable(){this.context.input.removeEventListener("pointerdown",this.onPointerEvent),this.context.input.removeEventListener("pointermove",this.onPointerEvent),window.removeEventListener("touchend",this.onTouchEnd),this.context.domElement.style.pointerEvents=this._previousPointerEvents}onPointerEnter(){}onPointerEvent=e=>{e.pointerId>0||(e.intersections?.length<=0?this.context.domElement.style.pointerEvents="none":this.context.domElement.style.pointerEvents="all")};onTouchEnd=e=>{setTimeout(()=>{this.context.domElement.style.pointerEvents="all"},100)}}var nI=Object.defineProperty,O1=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&nI(e,t,n),n};class Bh extends R{damping=0;keepDistance=!0;awake(){this._distance=-1}_distance=-1;updateDistance(){this.keepDistance&&this._distance!==-1||(this._distance=this.gameObject.worldPosition.distanceTo(this.context.mainCamera.worldPosition))}update(){this.updateDistance();const e=this.context.input.mousePositionRC,t=this.context.mainCamera,i=t.worldPosition,n=z(e.x,e.y,1).unproject(t);n.sub(i).normalize();const s=n.multiplyScalar(this._distance).add(i);if(this.damping>0){const r=this.gameObject.worldPosition;r.lerp(s,this.context.time.deltaTime/this.damping),this.gameObject.worldPosition=r}else this.gameObject.worldPosition=s}}O1([u()],Bh.prototype,"damping"),O1([u()],Bh.prototype,"keepDistance");var oI=Object.defineProperty,sI=Object.getOwnPropertyDescriptor,Tl=(o,e,t,i)=>{for(var n=i>1?void 0:i?sI(e,t):e,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=(i?r(e,t,n):r(n))||n);return i&&n&&oI(e,t,n),n};let uo=class extends R{type="linear";duration=.1;scaleFactor=1.1;hovered=null;idle=null;animation=null;start(){this.idle||(this.idle=bs.emptyClip()),this.hovered||(this.hovered=bs.createScaleClip({type:"linear",duration:this.duration||.1,scale:this.gameObject.scale,scaleFactor:this.scaleFactor||1.1})),this.animation??=this.gameObject.addComponent(Lt),this.animation.playAutomatically=!1,this.playIdle()}onEnable(){this.animation&&(this.animation.enabled=!0),this.playIdle()}onDisable(){this.animation&&(this.animation.enabled=!1),this.playIdle()}onPointerEnter(){this.playHover()}onPointerExit(){this.playIdle()}playIdle(){this.idle&&this.animation?.play(this.idle,{exclusive:!0,fadeDuration:.1,loop:!0})}playHover(){this.hovered&&this.animation?.play(this.hovered,{exclusive:!0,fadeDuration:.1,loop:!1,clampWhenFinished:!0})}};Tl([u()],uo.prototype,"type",2),Tl([u()],uo.prototype,"duration",2),Tl([u()],uo.prototype,"scaleFactor",2),Tl([u(Wi)],uo.prototype,"hovered",2),Tl([u(Wi)],uo.prototype,"idle",2),uo=Tl([jg],uo);var rI=Object.defineProperty,El=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&rI(e,t,n),n};const Xp=x("debugscroll");class Qo extends R{target=null;damping=0;invert=!1;htmlSelector=null;mode="window";changed=new he;get currentValue(){return this._current_value}_current_value=0;_target_value=0;_appliedValue=-1;_scrollStart=0;_scrollEnd=0;_scrollValue=0;_scrollContainerHeight=0;onEnable(){window.addEventListener("wheel",this.updateCurrentScrollValue,{passive:!0}),this._appliedValue=-1}onDisable(){window.removeEventListener("wheel",this.updateCurrentScrollValue)}lateUpdate(){this.updateCurrentScrollValue(),this._target_value>=0&&(this.damping>0?(this._current_value=j.lerp(this._current_value,this._target_value,this.context.time.deltaTime/this.damping),Math.abs(this._current_value-this._target_value)<.001&&(this._current_value=this._target_value)):this._current_value=this._target_value);{this._appliedValue=this._current_value;let e=!1;if(this.changed.listenerCount>0){const t={type:"change",value:this._current_value,component:this,preventDefault:()=>{t.defaultPrevented=!0},defaultPrevented:!1};this.changed.invoke(t),e=t.defaultPrevented}if(!e){const t=this.invert?1-this._current_value:this._current_value;Array.isArray(this.target)?this.target.forEach(i=>i&&this.applyScroll(i,t)):this.target&&this.applyScroll(this.target,t),Xp&&this.context.time.frame%30===0&&console.debug(`[ScrollFollow] ${this._current_value.toFixed(5)} \u2014 ${(this._target_value*100).toFixed(0)}%, targets [${Array.isArray(this.target)?this.target.length:1}]`)}}}_lastSelectorValue=null;_lastSelectorElement=null;_rangeStartValue=0;_rangeEndValue=0;updateCurrentScrollValue=()=>{switch(this.mode){case"window":if(this.htmlSelector?.length){if(this.htmlSelector!==this._lastSelectorValue&&(this._lastSelectorElement=document.querySelector(this.htmlSelector),this._lastSelectorValue=this.htmlSelector),this._lastSelectorElement){const e=this._lastSelectorElement.getBoundingClientRect();this._scrollStart=e.top+window.scrollY,this._scrollEnd=e.height-window.innerHeight,this._scrollValue=-e.top,this._target_value=-e.top/(e.height-window.innerHeight),this._rangeStartValue=e.top+window.scrollY,this._rangeEndValue=this._rangeStartValue+e.height-window.innerHeight,this._scrollContainerHeight=e.height;break}}else this._scrollStart=0,this._scrollEnd=window.document.body.scrollHeight-window.innerHeight,this._scrollValue=window.scrollY,this._target_value=this._scrollValue/(this._scrollEnd||1),this._rangeStartValue=0,this._rangeEndValue=document.body.scrollHeight,this._scrollContainerHeight=window.innerHeight;break}(isNaN(this._target_value)||!isFinite(this._target_value))&&(this._target_value=-1)};applyScroll(e,t){if(e)if(e instanceof ra)this.handleTimelineTarget(e,t),e.isPlaying&&e.pause(),e.evaluate();else if(e instanceof ft)e.setFloat("scroll",t);else if(e instanceof Lt)e.time=t*e.duration;else if(e instanceof Mi){if(!e.duration)return;e.time=t*e.duration}else if(e instanceof An)e.position01=t;else if(e instanceof di)e.intensity=t;else if(e instanceof k){e["needle:scrollbounds"]===void 0&&(e["needle:scrollbounds"]=$t(e)||null);const i=e["needle:scrollbounds"];i&&(e.position.y=-i.min.y-t*(i.max.y-i.min.y))}else"scroll"in e&&(typeof e.scroll=="number"?e.scroll=t:typeof e.scroll=="function"&&e.scroll(t))}handleTimelineTarget(e,t){const i=e.duration;Al.length=0;let n=0;for(const l of e.foreachMarker("ScrollMarker")){const c=n++;if(l.element===void 0||l.needsUpdate===!0||l.element&&!l.element?.parentNode){l.needsUpdate=!1;try{if(l.element=M1(c,l.name),Xp&&console.debug(`ScrollMarker #${c} "${l.name}" (${l.time.toFixed(2)}) found`,l.element),l.element)l.timeline=new ViewTimeline({subject:l.element,axis:"block"});else{l.timeline=void 0,(Xp||A())&&console.warn(`No HTML element found for ScrollMarker: ${l.name} (index ${c})`);continue}}catch(h){l.element=null,console.error("ScrollMarker selector is not valid: "+l.name+`
|
|
1431
|
-
`,h)}}l.element&&(Al.push(l),l.element.offsetTop,l.element.offsetHeight)}this._scrollValue+this._scrollContainerHeight,po.length=0;let s=0;const r=1/60;let a=0;for(let l=0;l<Al.length;l++){const c=Al[l];if(!c.element)continue;const h=Al[l+1],d=h?h.time-r:i;a+=1;const p=c.timeline;if(p){const m=aI(p),f=1-Math.abs(m-.5)*2,g=c.name||`marker${l}`;if(m>0&&m<=1){const y=c.time+(d-c.time)*m;po.push({name:g,time:y,weight:f}),s+=f}else l===0&&m<=0?(po.push({name:g,time:0,weight:1}),s+=1):l===Al.length-1&&m>=1&&(po.push({name:g,time:i,weight:1}),s+=1)}}if(po.length<=0&&a<=0)e.time=t*i;else if(po.length>0){let l=po[0].time;if(po.length>1)for(const c of po){const h=c.weight/Math.max(1e-5,s),d=Math.abs(c.time-l);l+=d*h}this.damping<=0?e.time=l:e.time=j.lerp(e.time,l,this.context.time.deltaTime/this.damping),Xp&&this.context.time.frame%30===0&&console.log(`[ScrollFollow ] Timeline ${e.name}: ${l.toFixed(3)}`,po.map(c=>`[${c.name} ${(c.weight*100).toFixed(0)}%]`).join(", "))}}}El([u([R,k])],Qo.prototype,"target"),El([u()],Qo.prototype,"damping"),El([u()],Qo.prototype,"invert"),El([u()],Qo.prototype,"htmlSelector"),El([u()],Qo.prototype,"mode"),El([u(he)],Qo.prototype,"changed");const po=[],Al=[],C0=new Map,k1=new Map;let P0=!0;function M1(o,e,t=0){if(!P0){if(e?.length){const n=k1.get(e)||null;if(n)return n}const i=C0.get(o)||null;return i?.getAttribute("data-timeline-marker"),i}return P0=!1,C0.clear(),document.querySelectorAll("[data-timeline-marker]").forEach((i,n)=>{C0.set(n,i);const s=i.getAttribute("data-timeline-marker");s?.length&&k1.set(s,i)}),P0=!1,M1(o,e)}function aI(o){if(!o.source)return 0;const e=o.currentTime,t=o.duration;let i=1;return(t.unit==="seconds"||t.unit==="percent")&&(i=t.value),e.unit==="seconds"?e.value/i:e.value/100}var R1=Object.defineProperty,lI=Object.getOwnPropertyDescriptor,cI=(o,e,t)=>e in o?R1(o,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):o[e]=t,O0=(o,e,t,i)=>{for(var n=i>1?void 0:i?lI(e,t):e,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=(i?r(e,t,n):r(n))||n);return i&&n&&R1(e,t,n),n},hI=(o,e,t)=>cI(o,e+"",t);const ca=x("debugviewbox"),dI=new oe(.5,.5,.5,.5);let zi=class extends R{referenceFieldOfView=void 0;debug=!1;onEnable(){(ca||this.debug||A())&&console.debug("[ViewBox] Using camera fov:",this.referenceFieldOfView),zi.instances.push(this)}onDisable(){(ca||this.debug)&&console.debug("[ViewBox] Disabled");const o=zi.instances.indexOf(this);o!==-1&&zi.instances.splice(o,1),this._projectedBoxElement?.remove()}onBeforeRender(){if(this.context.isInXR||this.destroyed)return;if(zi.instances[zi.instances.length-1]!==this){(ca||this.debug)&&F.DrawWireBox(this.gameObject.worldPosition,this.gameObject.worldScale,dI);return}(ca||this.debug)&&F.DrawWireBox(this.gameObject.worldPosition,this.gameObject.worldScale,14540032,0,!0,this.gameObject.worldQuaternion);const o=this.context.mainCamera;if(!o||!(o instanceof re))return;if(this.referenceFieldOfView===void 0&&(this.referenceFieldOfView=o.fov),this.referenceFieldOfView===void 0||this.referenceFieldOfView<=0){(ca||this.debug)&&console.warn("[ViewBox] No valid referenceFieldOfView set, cannot adjust box size:",this.referenceFieldOfView);return}const e=this.context.domWidth,t=this.context.domHeight;let i=e,n=t,s=1,r=1;const a=this.context.focusRectSize;a&&(a.x,a.y,i=a.width,n=a.height,s=e/i,r=t/n);const l=o.view,c=o.zoom,h=o.aspect,d=o.fov;o.view=null,o.zoom=1,o.fov=this.referenceFieldOfView,o.updateProjectionMatrix();const p=this.gameObject.worldPosition,m=this.gameObject.worldScale,f=o.worldPosition,g=f.distanceTo(p),y=Math.max(m.x,m.y,m.z),_=z(f).sub(p);if(g<y){(this.debug||ca)&&console.warn("[ViewBox] Moving camera out of bounds",g,"<",y);const Z=z(_);Z.y*=1e-8,Z.normalize();const I=
|
|
1431
|
+
`,h)}}l.element&&(Al.push(l),l.element.offsetTop,l.element.offsetHeight)}this._scrollValue+this._scrollContainerHeight,po.length=0;let s=0;const r=1/60;let a=0;for(let l=0;l<Al.length;l++){const c=Al[l];if(!c.element)continue;const h=Al[l+1],d=h?h.time-r:i;a+=1;const p=c.timeline;if(p){const m=aI(p),f=1-Math.abs(m-.5)*2,g=c.name||`marker${l}`;if(m>0&&m<=1){const y=c.time+(d-c.time)*m;po.push({name:g,time:y,weight:f}),s+=f}else l===0&&m<=0?(po.push({name:g,time:0,weight:1}),s+=1):l===Al.length-1&&m>=1&&(po.push({name:g,time:i,weight:1}),s+=1)}}if(po.length<=0&&a<=0)e.time=t*i;else if(po.length>0){let l=po[0].time;if(po.length>1)for(const c of po){const h=c.weight/Math.max(1e-5,s),d=Math.abs(c.time-l);l+=d*h}this.damping<=0?e.time=l:e.time=j.lerp(e.time,l,this.context.time.deltaTime/this.damping),Xp&&this.context.time.frame%30===0&&console.log(`[ScrollFollow ] Timeline ${e.name}: ${l.toFixed(3)}`,po.map(c=>`[${c.name} ${(c.weight*100).toFixed(0)}%]`).join(", "))}}}El([u([R,k])],Qo.prototype,"target"),El([u()],Qo.prototype,"damping"),El([u()],Qo.prototype,"invert"),El([u()],Qo.prototype,"htmlSelector"),El([u()],Qo.prototype,"mode"),El([u(he)],Qo.prototype,"changed");const po=[],Al=[],C0=new Map,k1=new Map;let P0=!0;function M1(o,e,t=0){if(!P0){if(e?.length){const n=k1.get(e)||null;if(n)return n}const i=C0.get(o)||null;return i?.getAttribute("data-timeline-marker"),i}return P0=!1,C0.clear(),document.querySelectorAll("[data-timeline-marker]").forEach((i,n)=>{C0.set(n,i);const s=i.getAttribute("data-timeline-marker");s?.length&&k1.set(s,i)}),P0=!1,M1(o,e)}function aI(o){if(!o.source)return 0;const e=o.currentTime,t=o.duration;let i=1;return(t.unit==="seconds"||t.unit==="percent")&&(i=t.value),e.unit==="seconds"?e.value/i:e.value/100}var R1=Object.defineProperty,lI=Object.getOwnPropertyDescriptor,cI=(o,e,t)=>e in o?R1(o,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):o[e]=t,O0=(o,e,t,i)=>{for(var n=i>1?void 0:i?lI(e,t):e,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=(i?r(e,t,n):r(n))||n);return i&&n&&R1(e,t,n),n},hI=(o,e,t)=>cI(o,e+"",t);const ca=x("debugviewbox"),dI=new oe(.5,.5,.5,.5);let zi=class extends R{referenceFieldOfView=void 0;debug=!1;onEnable(){(ca||this.debug||A())&&console.debug("[ViewBox] Using camera fov:",this.referenceFieldOfView),zi.instances.push(this)}onDisable(){(ca||this.debug)&&console.debug("[ViewBox] Disabled");const o=zi.instances.indexOf(this);o!==-1&&zi.instances.splice(o,1),this._projectedBoxElement?.remove()}onBeforeRender(){if(this.context.isInXR||this.destroyed)return;if(zi.instances[zi.instances.length-1]!==this){(ca||this.debug)&&F.DrawWireBox(this.gameObject.worldPosition,this.gameObject.worldScale,dI);return}(ca||this.debug)&&F.DrawWireBox(this.gameObject.worldPosition,this.gameObject.worldScale,14540032,0,!0,this.gameObject.worldQuaternion);const o=this.context.mainCamera;if(!o||!(o instanceof re))return;if(this.referenceFieldOfView===void 0&&(this.referenceFieldOfView=o.fov),this.referenceFieldOfView===void 0||this.referenceFieldOfView<=0){(ca||this.debug)&&console.warn("[ViewBox] No valid referenceFieldOfView set, cannot adjust box size:",this.referenceFieldOfView);return}const e=this.context.domWidth,t=this.context.domHeight;let i=e,n=t,s=1,r=1;const a=this.context.focusRectSize;a&&(a.x,a.y,i=a.width,n=a.height,s=e/i,r=t/n);const l=o.view,c=o.zoom,h=o.aspect,d=o.fov;o.view=null,o.zoom=1,o.fov=this.referenceFieldOfView,o.updateProjectionMatrix();const p=this.gameObject.worldPosition,m=this.gameObject.worldScale,f=o.worldPosition,g=f.distanceTo(p),y=Math.max(m.x,m.y,m.z),_=z(f).sub(p);if(g<y){(this.debug||ca)&&console.warn("[ViewBox] Moving camera out of bounds",g,"<",y);const Z=z(_);Z.y*=1e-8,Z.normalize();const I=y-g,W=f.add(Z.multiplyScalar(I));o.worldPosition=W.lerp(f,1-this.context.time.deltaTime)}const v=z(p);o.worldToLocal(v),o.lookAt(p),o.updateMatrixWorld();const P=this.referenceFieldOfView*Math.PI/180,M=2*Math.tan(P/2)*g,O=M*o.aspect,E=this.projectBoxIntoCamera(o,1),L=E.maxX-E.minX,$=E.maxY-E.minY,D=this.fit(L*o.aspect,$,O/s,M/r),q=z(p);q.project(o),this.context.focusRectSettings.offsetX=q.x,this.context.focusRectSettings.offsetY=q.y,this.context.focusRectSettings.zoom=D/(M*.5),this.context.focusRect||this.context.setCameraFocusRect(this.context.domElement),o.view=l,o.zoom=c,o.aspect=h,o.fov=d}fit(o,e,t,i){const n=t/o,s=i/e;return Math.min(n,s)}projectBoxIntoCamera(o,e){const t=.5*e,i=[z(-t,-t,-t),z(t,-t,-t),z(-t,t,-t),z(t,t,-t),z(-t,-t,t),z(t,-t,t),z(-t,t,t),z(t,t,t)];let n=Number.POSITIVE_INFINITY,s=Number.NEGATIVE_INFINITY,r=Number.POSITIVE_INFINITY,a=Number.NEGATIVE_INFINITY;for(let l=0;l<i.length;l++){const c=i[l];c.applyMatrix4(this.gameObject.matrixWorld),c.project(o),c.x<n&&(n=c.x),c.x>s&&(s=c.x),c.y<r&&(r=c.y),c.y>a&&(a=c.y)}return ca&&(this._projectedBoxElement||(this._projectedBoxElement=document.createElement("div")),this._projectedBoxElement.parentElement!==this.context.domElement&&this.context.domElement.appendChild(this._projectedBoxElement),this._projectedBoxElement.style.position="fixed",this._projectedBoxElement.style.outline="2px dashed rgba(255,0,0,.5)",this._projectedBoxElement.style.left=(n*.5+.5)*this.context.domWidth+"px",this._projectedBoxElement.style.top=(-a*.5+.5)*this.context.domHeight+"px",this._projectedBoxElement.style.width=(s-n)*.5*this.context.domWidth+"px",this._projectedBoxElement.style.height=(a-r)*.5*this.context.domHeight+"px",this._projectedBoxElement.style.pointerEvents="none",this._projectedBoxElement.style.zIndex="1000"),{minX:n,maxX:s,minY:r,maxY:a}}_projectedBoxElement=null};hI(zi,"instances",[]),O0([u()],zi.prototype,"referenceFieldOfView",2),O0([u()],zi.prototype,"debug",2),zi=O0([jg],zi);var uI=Object.defineProperty,Il=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&uI(e,t,n),n};class Yo extends R{get activeAndEnabled(){return!0}side="none";controller=!0;hands=!1;controlVisibility=!0;useGripSpace=!1;resetTransformAfterXRSession=!0;_startPosition=new b;_startRotation=new U;_startScale=new b;onEnterXR(e){this._startPosition.copy(this.gameObject.position),this._startRotation.copy(this.gameObject.quaternion),this._startScale.copy(this.gameObject.scale)}onUpdateXR(e){if(!this.enabled)return;const t=e.xr.getController(this.side);if(t){if(t.hand&&!this.hands){this.controlVisibility&&(this.gameObject.visible=!1);return}else if(!this.controller){this.controlVisibility&&(this.gameObject.visible=!1);return}this.controlVisibility&&(this.gameObject.visible=!0),this.useGripSpace||t.targetRayMode==="transient-pointer"?(this.gameObject.worldPosition=t.gripWorldPosition,this.gameObject.worldQuaternion=t.gripWorldQuaternion,this.gameObject.worldScale=z(t.xr.rigScale,t.xr.rigScale,t.xr.rigScale).multiply(this._startScale)):(this.gameObject.worldPosition=t.rayWorldPosition,this.gameObject.worldQuaternion=t.rayWorldQuaternion,this.gameObject.worldScale=z(t.xr.rigScale,t.xr.rigScale,t.xr.rigScale).multiply(this._startScale))}}onLeaveXR(e){this.resetTransformAfterXRSession&&(this.gameObject.position.copy(this._startPosition),this.gameObject.quaternion.copy(this._startRotation),this.gameObject.scale.copy(this._startScale))}}Il([u()],Yo.prototype,"side"),Il([u()],Yo.prototype,"controller"),Il([u()],Yo.prototype,"hands"),Il([u()],Yo.prototype,"controlVisibility"),Il([u()],Yo.prototype,"useGripSpace"),Il([u()],Yo.prototype,"resetTransformAfterXRSession");function T1(o,e){const t=o.xr.getFrame();if(!t)return console.warn("No XRFrame available"),!1;const i=t.session.enabledFeatures;if(i&&!i.some(s=>s==="camera-access"))return console.error(`No camera feed available - please request the 'camera-access' feature before starting WebXR or add the ARCameraBackground component to your scene.
|
|
1432
1432
|
|
|
1433
1433
|
Example to request camera-access in global scope:
|
|
1434
1434
|
NeedleXRSession.onSessionRequestStart(evt => {
|
|
@@ -1474,7 +1474,7 @@ void main() {
|
|
|
1474
1474
|
#include <colorspace_fragment>
|
|
1475
1475
|
}
|
|
1476
1476
|
`;var _I=Object.defineProperty,Ks=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&_I(e,t,n),n};const Qp=x("debugimagetracking");class Vl{get url(){return this._trackedImage.image??""}get widthInMeters(){return this._trackedImage.widthInMeters??void 0}get bitmap(){return this._bitmap}get model(){return this._trackedImage}measuredSize;state;getPosition(e){return this.ensureTransformData(),e.copy(this._position),e}getQuaternion(e){return this.ensureTransformData(),e.copy(this._rotation),e}applyToObject(e,t=void 0){this.ensureTransformData();const i=e.position.distanceToSquared(this._position)/.05+e.quaternion.angleTo(this._rotation)/.05;t&&(t*=Math.max(1,i)),t===void 0||t>=1?(e.position.copy(this._position),e.quaternion.copy(this._rotation)):(t=Math.max(0,Math.min(1,t)),e.position.lerp(this._position,t),e.quaternion.slerp(this._rotation,t))}static _positionBuffer=new xi(()=>new b,20);static _rotationBuffer=new xi(()=>new U,20);_position;_rotation;ensureTransformData(){if(!this._position){this._position=Vl._positionBuffer.get(),this._rotation=Vl._rotationBuffer.get();const e=this._pose.transform,t=Y.active.convertSpace(e);this._position.copy(t?.position),this._rotation.copy(t?.quaternion)}}_trackingComponent;_trackedImage;_bitmap;_pose;constructor(e,t,i,n,s,r){this._trackingComponent=e,this._trackedImage=t,this._bitmap=i,this.measuredSize=n,this.state=s,this._pose=r}}class Zo{constructor(e){this.image=e.url,this.widthInMeters=e.widthInMeters,e.object instanceof k?this.object=new ie({asset:e.object}):this.object=e.object,e.createObjectInstance!==void 0&&(this.createObjectInstance=e.createObjectInstance),e.imageDoesNotMove!==void 0&&(this.imageDoesNotMove=e.imageDoesNotMove),e.hideWhenTrackingIsLost!==void 0&&(this.hideWhenTrackingIsLost=e.hideWhenTrackingIsLost)}image;widthInMeters=.25;object;createObjectInstance=!1;imageDoesNotMove=!1;hideWhenTrackingIsLost=!0;getNameFromUrl(){if(this.image){const e=this.image.split("/");return e[e.length-1]}return null}}Ks([u(URL)],Zo.prototype,"image"),Ks([u()],Zo.prototype,"widthInMeters"),Ks([u(ie)],Zo.prototype,"object"),Ks([u()],Zo.prototype,"createObjectInstance"),Ks([u()],Zo.prototype,"imageDoesNotMove"),Ks([u()],Zo.prototype,"hideWhenTrackingIsLost");class vI{constructor(e,t){this.exporter=e,this.component=t,Qp&&console.log(this),this.exporter.anchoringType="image"}isImageTrackingExtension=!0;get extensionName(){return"image-tracking"}shouldExport=!0;filename=null;imageModel=null;onBeforeBuildDocument(e){const t=this.exporter.extensions.filter(i=>{const n=i;return n.isImageTrackingExtension&&n.component.activeAndEnabled&&n.component.trackedImages?.length>0}).indexOf(this);this.shouldExport=t===0,this.shouldExport&&this.component.trackedImages?.length>1&&(Qp||A())&&(ge("USDZ: Only one tracked image is supported."),console.warn("USDZ: Only one tracked image is supported. Will choose the first one in the trackedImages list"))}onAfterHierarchy(e,t){if(!this.shouldExport)return;const i=G.getiOSVersion(),n=(i?parseInt(i.split(".")[0]):18)>=18?1:100;t.beginBlock('def Preliminary_ReferenceImage "AnchoringReferenceImage"'),t.appendLine("uniform asset image = @image_tracking/"+this.filename+"@"),t.appendLine("uniform double physicalWidth = "+(this.imageModel.widthInMeters*n).toFixed(8)),t.closeBlock()}async onAfterSerialize(e){if(!this.shouldExport)return;const t=this.imageModel,i=Vh.get(t.image),n=await(await(await Pw(i)).convertToBlob({type:"image/png"})).arrayBuffer();e.files["image_tracking/"+this.filename]=new Uint8Array(n)}onExportObject(e,t,i){if(!this.shouldExport)return;const n=this.component;if(!n||!n.trackedImages?.length||!n.activeAndEnabled)return;const s=n.trackedImages[0];if(s.object?.asset===e){this.imageModel=s,this.filename=s.getNameFromUrl()||"marker.png";const{scale:r,target:a}=this.exporter.getARScaleAndTarget();let l=e;const c=new ee;if(e!==a)for(;l&&l.parent&&l.parent!==a;)l=l.parent,c.premultiply(l.matrix);const h=c.clone().invert();t.setMatrix(h.scale(new b(r,r,r)))}}}class Nh extends R{setPrimaryImage(e){const t=this.trackedImages.indexOf(e);if(t>=0){const i=this.trackedImages[0];i!==e&&(this.trackedImages[0]=e,this.trackedImages[t]=i)}else console.warn(`[WebXRImageTracking] Can not set primary: image not found in 'trackedImages' array ${e.image}`)}addImage(e,t=!1){this.trackedImages.includes(e)||(this.trackedImages.push(e),L1(e.image)),t&&this.setPrimaryImage(e)}trackedImages=[];smooth=!0;trackedImageIndexMap=new Map;get supported(){return this._supported}_supported=!0;awake(){if(Qp&&console.log(this),!!this.trackedImages)for(const e of this.trackedImages)e.image&&L1(e.image)}onEnable(){oo.beforeExport.addEventListener(this.onBeforeUSDZExport)}onDisable(){oo.beforeExport.removeEventListener(this.onBeforeUSDZExport)}onBeforeUSDZExport=e=>{this.activeAndEnabled&&this.trackedImages?.length&&e.exporter.extensions.push(new vI(e.exporter,this))};onBeforeXR(e,t){if(this.trackedImages){t.optionalFeatures=t.optionalFeatures||[],t.optionalFeatures.includes("image-tracking")||t.optionalFeatures.push("image-tracking"),t.trackedImages=[];for(const i of this.trackedImages)if(i.image?.length&&i.widthInMeters>0){const n=Vh.get(i.image);n&&(this.trackedImageIndexMap.set(t.trackedImages.length,i),t.trackedImages.push({image:n,widthInMeters:i.widthInMeters}))}}}onEnterXR(e){if(this.trackedImages){for(const t of this.trackedImages)if(t.object?.asset){const i=t.object.asset;i.userData||(i.userData={});const n={visible:i.visible,parent:i.parent,matrix:i.matrix.clone()};i.userData["image-tracking"]=n}}for(const t of this.imageToObjectMap.values())t.frames=0}onLeaveXR(e){if(!this.supported&&G.isAndroidDevice()&&ge(this.webXRIncubationsWarning),this.trackedImages){for(const t of this.trackedImages)if(t.object?.asset){const i=t.object.asset;if(i.userData){const n=i.userData["image-tracking"];n&&(i.visible=n.visible,n.parent?.add(i),i.matrix.copy(n.matrix),i.matrix.decompose(i.position,i.quaternion,i.scale)),delete i.userData["image-tracking"]}}}}imageToObjectMap=new Map;currentImages=[];webXRIncubationsWarning=`Image tracking is currently not supported on this device. On Chrome for Android, you can enable the <a target="_blank" href="#" onclick="() => console.log('I')">chrome://flags/#webxr-incubations</a> flag.`;onUpdateXR(e){this.currentImages.length=0;const t=e.xr.frame;if(!t)return;if("getImageTrackingResults"in t){if(e.xr.session.enabledFeatures?.includes("image-tracking")===!1)return;if(t.session&&typeof t.getImageTrackingResults=="function"){const n=t.getImageTrackingResults();if(n.length>0){const s=this.context.renderer.xr.getReferenceSpace();if(s){for(const r of n){const a=r.trackingState,l=r.index,c=this.trackedImageIndexMap.get(l);if(c){const h=t.getPose(r.imageSpace,s),d=new Vl(this,c,r.image,r.measuredSize,a,h);this.currentImages.push(d)}else Qp&&console.warn("No tracked image for index",l)}if(this.currentImages.length>0)try{this.dispatchEvent(new CustomEvent("image-tracking",{detail:this.currentImages})),this.onImageTrackingUpdate(this.currentImages)}catch(r){console.error(r)}}}}}else{this.didPrintWarning||(this.didPrintWarning=!0,console.log(this.webXRIncubationsWarning)),this._supported=!1,ge(this.webXRIncubationsWarning);return}const i=1e3;for(const[n,s]of this.imageToObjectMap){if(!s.object||!n||n.hideWhenTrackingIsLost===!1)continue;let r=!1;for(const a of this.currentImages)if(a.model===n){const l=Date.now()-s.lastTrackingTime;if(n.imageDoesNotMove||a.state==="tracked"||l<=i){r=!0;break}}r||w.setActive(s.object,!1)}}onImageTrackingUpdate=e=>{const t=Y.active;if(t)for(const i of e){const n=i.model,s=i.state==="tracked";if(!n.object)continue;let r=this.imageToObjectMap.get(n);if(r===void 0)r={object:null,frames:0,lastTrackingTime:Date.now()},this.imageToObjectMap.set(n,r),n.object.loadAssetAsync().then(a=>{if(n.createObjectInstance&&a&&(a=w.instantiate(a)),a){r.object=a;for(const l of a.getComponentsInChildren(Ti))l.setInstancingEnabled(!1);t.rig?(t.rig.gameObject.add(a),i.applyToObject(a),a.activeSelf||w.setActive(a,!0)):console.warn("XRImageTracking: missing XRRig")}});else{if(r.frames++,s&&(r.lastTrackingTime=Date.now()),n.imageDoesNotMove&&r.frames>10||!r.object)continue;t.rig&&(t.rig.gameObject.add(r.object),i.applyToObject(r.object,this.smooth?this.context.time.deltaTimeUnscaled*3:void 0),r.object.activeSelf||w.setActive(r.object,!0))}}}}Ks([u(Zo)],Nh.prototype,"trackedImages"),Ks([u()],Nh.prototype,"smooth");const Vh=new Map,Yp=new Map;async function L1(o){if(Vh.has(o))return Yp.has(o)?Yp.get(o):Promise.resolve(!0);const e=new Promise(t=>{Vh.set(o,null);const i=document.createElement("img");i.src=o,i.addEventListener("load",async()=>{const n=await createImageBitmap(i);Vh.set(o,n),t(!0)})});return Yp.set(o,e),e.finally(()=>{Yp.delete(o)}),e}var xI=Object.defineProperty,Ll=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&xI(e,t,n),n};const ha=x("debugplanetracking");class Ko extends R{dataTemplate;occluder=!0;initiateRoomCaptureIfNoData=!0;usePlaneData=!0;useMeshData=!0;runInVR=!0;get trackedPlanes(){return this._allPlanes.values()}get trackedMeshes(){return this._allMeshes.values()}onBeforeXR(e,t){e==="immersive-vr"&&!this.runInVR||(t.optionalFeatures=t.optionalFeatures||[],this.usePlaneData&&!t.optionalFeatures.includes("plane-detection")&&t.optionalFeatures.push("plane-detection"),this.useMeshData&&!t.optionalFeatures.includes("mesh-detection")&&t.optionalFeatures.push("mesh-detection"))}onEnterXR(e){for(const t of this._allPlanes.keys())this.removeData(t,this._allPlanes);for(const t of this._allMeshes.keys())this.removeData(t,this._allMeshes)}onLeaveXR(e){for(const t of this._allPlanes.keys())this.removeData(t,this._allPlanes);for(const t of this._allMeshes.keys())this.removeData(t,this._allMeshes)}onUpdateXR(e){if(!this.runInVR&&e.xr.isVR)return;const t=e.xr.rig;if(!t){console.warn("No XR rig found, cannot parent tracked planes to it");return}const i=e.xr.frame;if(!this.context.renderer.xr.getReferenceSpace())return;const n=i.detectedPlanes,s=i.detectedMeshes,r=n!==void 0&&n.size>0,a=s!==void 0&&s.size>0;if(this.initiateRoomCaptureIfNoData&&(!r&&!a&&this.firstTimeNoPlanesDetected<-10&&(this.firstTimeNoPlanesDetected=Date.now()),(r||a)&&(this.firstTimeNoPlanesDetected=-1),this.firstTimeNoPlanesDetected>0&&Date.now()-this.firstTimeNoPlanesDetected>2500&&"initiateRoomCapture"in i.session&&(i.session.initiateRoomCapture(),this.firstTimeNoPlanesDetected=-1)),n!==void 0&&this.processFrameData(e.xr,t.gameObject,i,n,this._allPlanes),s!==void 0&&this.processFrameData(e.xr,t.gameObject,i,s,this._allMeshes),ha){const l=this.context.mainCameraComponent.gameObject.worldPosition;for(const c of this._allPlanes.values())!c.mesh||!c.mesh.visible||(this.bounds.makeEmpty(),c.mesh.traverse(h=>{h instanceof H&&this.bounds.expandByObject(h)}),this.bounds.getCenter(this.center),this.labelOffset.copy(l).sub(this.center).normalize().multiplyScalar(.1),F.DrawLabel(this.center.add(this.labelOffset),(c.xrData.semanticLabel||"plane").toUpperCase()+`
|
|
1477
|
-
`+c.xrData.lastChangedTime.toFixed(2),.02))}}bounds=new bi;center=new b;labelOffset=new b;removeData(e,t){const i=t.get(e);if(!i)return;t.delete(e),ha&&console.log("Plane no longer tracked, id="+i.id),i.mesh&&(i.mesh.removeFromParent(),i.mesh.traverse(s=>{const r=s.userData.normalsHelper;r?(r.dispose(),r.removeFromParent()):ha&&console.warn("No normals helper found for mesh",i.mesh)}),Ci(i.mesh,!0,!0));const n=new CustomEvent("plane-tracking",{detail:{type:"plane-removed",context:i}});this.dispatchEvent(n)}_dataId=1;_allPlanes=new Map;_allMeshes=new Map;firstTimeNoPlanesDetected=-100;makeOccluder=(e,t,i=!1)=>{if(t){if(t instanceof Array){for(const n of t)this.makeOccluder(e,n,i);return}!i&&!t.name.toLowerCase().includes("occlu")||(t.colorWrite=!1,t.depthTest=!0,t.depthWrite=!0,t.transparent=!1,t.polygonOffset=!0,t.polygonOffsetFactor=1,t.polygonOffsetUnits=.1,e.renderOrder=-1e3)}};processFrameData(e,t,i,n,s){const r=this.context.renderer.xr.getReferenceSpace();if(r){for(const a of s.keys())n.has(a)||this.removeData(a,s);for(const a of n){const l="planeSpace"in a?a.planeSpace:"meshSpace"in a?a.meshSpace:void 0;if(!l)continue;const c=i.getPose(l,r);let h;if(s.has(a)){const d=s.get(a);if(h=d.mesh,d.timestamp<a.lastChangedTime){if(d.timestamp=a.lastChangedTime,d.mesh){const m=this.createGeometry(a);if(d.mesh instanceof H)d.mesh.geometry.dispose(),d.mesh.geometry=m,this.makeOccluder(d.mesh,d.mesh.material);else if(d.mesh instanceof cs)for(const f of d.mesh.children)f instanceof H&&(f.geometry.dispose(),f.geometry=m,this.makeOccluder(f,f.material));if(d.collider){const f=d.mesh;d.collider.sharedMesh=f,d.collider.convex=this.checkIfContextShouldBeConvex(f,d.xrData),d.collider.onDisable(),d.collider.onEnable()}ha&&(console.log("Plane updated, id="+d.id,d),d.mesh.traverse(f=>{if(!(f instanceof H))return;const g=f.userData.normalsHelper;g&&g.update()}))}const p=new CustomEvent("plane-tracking",{detail:{type:"plane-updated",context:d}});this.dispatchEvent(p)}}else{if(!this.dataTemplate){const d=new H;ha?d.material=new PC:this.occluder?(d.material=new we,this.makeOccluder(d,d.material,!0)):d.material=new we({wireframe:!0,opacity:.5,transparent:!0,color:3355443}),this.dataTemplate=new ie("","",d)}if(!this.dataTemplate.asset)this.dataTemplate.loadAssetAsync();else{const d=w.instantiate(this.dataTemplate.asset);if(d.name="xr-tracked-plane",h=d,Ym(d,!1),d instanceof H)Pe(d.geometry),d.geometry=this.createGeometry(a),this.makeOccluder(d,d.material,this.occluder&&!this.dataTemplate);else if(d instanceof cs)for(const f of d.children)f instanceof H&&(Pe(f.geometry),f.geometry=this.createGeometry(a),this.makeOccluder(f,f.material,this.occluder&&!this.dataTemplate));const p=d.getComponent(Ms);if(p){const f=d;p.sharedMesh=f,p.convex=this.checkIfContextShouldBeConvex(f,a),p.onDisable(),p.onEnable()}d.matrixAutoUpdate=!1,d.matrixWorldNeedsUpdate=!0,t.add(d);const m={id:this._dataId++,xrData:a,timestamp:a.lastChangedTime,mesh:d,collider:p};s.set(a,m),ha&&console.log("New plane detected, id="+m.id,m,{hasCollider:!!p,isGroup:d instanceof cs});try{const f=new CustomEvent("plane-tracking",{detail:{type:"plane-added",context:m}});this.dispatchEvent(f)}catch(f){console.error(f)}}}h&&(c?(h.visible=!0,h.matrix.fromArray(c.transform.matrix),h.matrix.premultiply(this._flipForwardMatrix)):h.visible=!1,ha&&h.traverse(d=>{if(d instanceof H)if(d.userData.normalsHelper)d.userData.normalsHelper.update();else{const p=new QC(d,.05,255);p.layers.disableAll(),p.layers.set(2),this.context.scene.add(p),d.userData.normalsHelper=p}}))}}}_flipForwardMatrix=new ee().makeRotationY(Math.PI);checkIfContextShouldBeConvex(e,t){if(!e)return!0;if(e){const i=new bi;i.expandByObject(e);const n=new b;i.getSize(n);let s=!0;return n.x>2&&n.y>2&&n.z>1.5&&(s=!1),s&&"semanticLabel"in t&&t.semanticLabel==="wall"&&(s=!0),s}return!0}createGeometry(e){return"polygon"in e?this.createPlaneGeometry(e.polygon):"vertices"in e&&"indices"in e?this.createMeshGeometry(e.vertices,e.indices):new mn}_verticesCache=new Map;createMeshGeometry(e,t){const i=e.toString()+"_"+t.toString();if(this._verticesCache.has(i))return this._verticesCache.get(i);const n=new mn;n.setIndex(new pt(t,1)),n.setAttribute("position",new pt(e,3));const s=Array();for(let r=0;r<e.length;r+=3)s.push(e[r],e[r+2]);return n.setAttribute("uv",new pt(e,3)),n.computeVertexNormals(),this._verticesCache.set(i,n),n}createPlaneGeometry(e){const t=new mn,i=[],n=[];e.forEach(p=>{i.push(p.x,p.y,p.z),n.push(p.x,p.z)});const s=new b(i[0],i[1],i[2]),r=new b(i[3],i[4],i[5]),a=new b(i[6],i[7],i[8]),l=new b,c=new b;l.subVectors(r,s),c.subVectors(a,s),l.cross(c),l.normalize();const h=[];for(let p=0;p<i.length/3;p++)h.push(l.x,l.y,l.z);const d=[];for(let p=2;p<e.length;++p)d.push(0,p-1,p);return t.setAttribute("position",new pt(new Float32Array(i),3)),t.setAttribute("uv",new pt(new Float32Array(n),2)),t.setAttribute("normal",new pt(new Float32Array(h),3)),t.setIndex(d),t.computeBoundingBox(),t.computeBoundingSphere(),t}}Ll([u(ie)],Ko.prototype,"dataTemplate"),Ll([u()],Ko.prototype,"occluder"),Ll([u()],Ko.prototype,"initiateRoomCaptureIfNoData"),Ll([u()],Ko.prototype,"usePlaneData"),Ll([u()],Ko.prototype,"useMeshData"),Ll([u()],Ko.prototype,"runInVR");var wI=Object.defineProperty,SI=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&wI(e,t,n),n};const j1=x("debugwebxr");class Zp extends R{priority=0;get isActive(){return this.activeAndEnabled&&this.gameObject.visible}setAsActiveXRRig(){Y.active?.setRigActive(this)}setPriority(e){this.priority=e}awake(){if(j1){const e=new k;e.position.y+=.5,this.gameObject.add(e);const t=e.addNewComponent(qr);t&&(t.isGizmo=!1);const i=new _i(.5);this.gameObject.add(i)}}isXRRig(){return!0}supportsXR(e){return!0}_startScale;onEnterXR(e){this._startScale=this.gameObject.scale.clone(),e.xr.addRig(this),j1&&console.log("WebXR: add Rig",this.name,this.priority)}onLeaveXR(e){e.xr.removeRig(this),this._startScale&&this.gameObject&&this.gameObject.scale.copy(this._startScale)}}SI([u()],Zp.prototype,"priority");class CI extends R{toggleKey="KeyP";update(){this.context.input.isKeyDown(this.toggleKey)&&this.context.domElement.classList.toggle("presentation-mode")}}C.add("AlignmentConstraint",Mc),C.add("Animation",Lt),C.add("Animator",ft),C.add("AudioListener",Eo),C.add("AudioSource",Mi),C.add("Avatar_Brain_LookAt",jc),C.add("Avatar_MouthShapes",Dc),C.add("Avatar_MustacheShake",wf),C.add("AvatarBlink_Simple",jr),C.add("AvatarEyeLook_Rotation",Cf),C.add("AxesHelper",Ya),C.add("BasicIKConstraint",Of),C.add("BoxHelperComponent",wt),C.add("Camera",si),C.add("CharacterController",Dr),C.add("CharacterControllerInput",Lo),C.add("Collider",ai),C.add("SphereCollider",Za),C.add("BoxCollider",Lu),C.add("MeshCollider",Ms),C.add("CapsuleCollider",Ao),C.add("ContactShadows",Fc),C.add("LogStats",Rf),C.add("DeleteBox",or),C.add("Deletable",Ef),C.add("DeviceFlag",ju),C.add("DragControls",zr),C.add("DropListener",jo),C.add("Duplicatable",Bf),C.add("EventListEvent",Pu),C.add("EventTrigger",zu),C.add("GltfExportBox",Qf),C.add("GltfExport",Zf),C.add("VariantAction",ay),C.add("ChangeTransformOnClick",Wr),C.add("ChangeMaterialOnClick",cy),C.add("SetActiveOnClick",hy),C.add("HideOnStart",dn),C.add("EmphasizeOnClick",cl),C.add("PlayAudioOnClick",As),C.add("PlayAnimationOnClick",qc),C.add("PreliminaryAction",hl),C.add("PreliminaryTrigger",Xc),C.add("VisibilityAction",Qc),C.add("TapGestureTrigger",uy),C.add("USDZExporter",oo),C.add("Fog",bl),C.add("BoxGizmo",qr),C.add("GridHelper",_l),C.add("GroundProjectedEnv",qn),C.add("UsageMarker",zc),C.add("Interactable",Tf),C.add("FixedJoint",Uy),C.add("HingeJoint",rh),C.add("Light",di),C.add("LODGroup",lh),C.add("LookAtConstraint",Er),C.add("NeedleMenu",io),C.add("NestedGltf",ch),C.add("Networking",$y),C.add("OffsetConstraint",Xr),C.add("CameraTargetReachedEvent",Lc),C.add("OrbitControls",fe),C.add("ParticleSystemRenderer",sn),C.add("ParticleSystem",ph),C.add("Attractor",Sl),C.add("PlayerColor",Nl),C.add("Antialiasing",gh),C.add("BloomEffect",Cp),C.add("ChromaticAberration",fh),C.add("ColorAdjustments",Gs),C.add("DepthOfField",Tn),C.add("EffectWrapper",bh),C.add("PixelationEffect",_h),C.add("ScreenSpaceAmbientOcclusion",Ho),C.add("ScreenSpaceAmbientOcclusionN8",En),C.add("SharpeningEffect",xh),C.add("TiltShiftEffect",ro),C.add("ToneMappingEffect",Hs),C.add("Vignette",ta),C.add("Volume",Pl),C.add("ReflectionProbe",Vc),C.add("Renderer",Ti),C.add("MeshRenderer",Wc),C.add("SkinnedMeshRenderer",Xf),C.add("Rigidbody",Ze),C.add("SceneSwitcher",Xe),C.add("ScreenCapture",Xs),C.add("ShadowCatcher",Ph),C.add("RemoteSkybox",Ep),C.add("SmoothFollow",Ip),C.add("SpatialTriggerReceiver",ao),C.add("SpatialTrigger",Lp),C.add("SpectatorCamera",jp),C.add("SplineContainer",oa),C.add("SplineWalker",An),C.add("SpriteRenderer",ci),C.add("SyncedCamera",p0),C.add("SyncedRoom",In),C.add("SyncedTransform",Cn),C.add("TestRunner",f0),C.add("TestSimulateUserData",y0),C.add("PlayableDirector",ra),C.add("SignalReceiver",Eh),C.add("AnimationTrackHandler",Ah),C.add("AudioTrackHandler",ss),C.add("MarkerTrackHandler",zp),C.add("SignalTrackHandler",Ih),C.add("ControlTrackHandler",Up),C.add("TransformGizmo",aa),C.add("BaseUIComponent",ln),C.add("UIRootComponent",eh),C.add("Button",Xo),C.add("Canvas",yl),C.add("CanvasGroup",zs),C.add("EventSystem",ei),C.add("Graphic",nh),C.add("MaskableGraphic",oh),C.add("Image",Ml),C.add("RawImage",Wp),C.add("InputField",x0),C.add("VerticalLayoutGroup",Ry),C.add("HorizontalLayoutGroup",Ty),C.add("GridLayoutGroup",Ey),C.add("Outline",gl),C.add("ObjectRaycaster",ki),C.add("GraphicRaycaster",Mu),C.add("SpatialGrabRaycaster",ua),C.add("RectTransform",Mn),C.add("SpatialHtml",jh),C.add("Text",Bt),C.add("EnvironmentScene",Hp),C.add("LookAt",w0),C.add("OpenURL",Rl),C.add("VideoPlayer",ht),C.add("Voip",ks),C.add("ClickThrough",qp),C.add("CursorFollow",Bh),C.add("HoverAnimation",uo),C.add("ScrollFollow",Qo),C.add("ResponsiveBox",zi),C.add("Avatar",Ls),C.add("XRControllerFollow",Yo),C.add("XRControllerModel",Uo),C.add("XRControllerMovement",Ei),C.add("TeleportTarget",sp),C.add("WebARCameraBackground",Uh),C.add("WebARSessionRoot",Ui),C.add("WebXR",rp),C.add("AvatarMarker",Le),C.add("WebXRImageTracking",Nh),C.add("WebXRPlaneTracking",Ko),C.add("XRRig",Zp),C.add("XRFlag",Ji),C.add("PlayerSync",by),C.add("PlayerState",On),C.add("PresentationMode",CI);const Wh=gt,PI=x("debugtypestore");PI&&console.log(C);function OI(o,e){const t=bv(o,e);return t!==void 0?t:null}const kI=new jk,M0=Symbol("deserialize-queue");async function MI(o,e,t,i=null,n){if(!t){console.debug("Can not create component instances: gltf is null");return}const s=[];let r=i;typeof r=="number"&&(r=new At(i));const a=e.indexOf("?");e=a===-1?e:e.substring(0,a);const l=new Ug(t.scene);l.gltfId=e,l.context=o,l.gltf=t,l.nodeToObject=n?.nodeToObjectMap,l.implementationInformation=kI;let c=o[M0];if(c||(c=o[M0]=[]),t.scenes)for(const h of t.scenes)await E0(l,h,c,s,0);if(t.children)for(const h of t.children)await E0(l,h,c,s,0);o.new_scripts_pre_setup_callbacks.push(()=>{const h=o[M0];if(h){for(const d of h)RI(d,l);h.length=0}if(r){const d={},p=[];T0(t,r,d,p);for(const m of t.scenes)T0(m,r,d,p);for(const m of p)m.resolveGuids(d)}})}const R0=Symbol("original-component-name"),jl=new Map;function T0(o,e,t,i){if(e===null||!o)return;const n=o.guid,s=o.guid;s?.length&&(jl.has(s)||(Wh&&console.log('Creating InstanceIdProvider with key "'+s+'" for object '+o.name),jl.set(s,new At(s))));const r=s&&jl.get(s)||e;if(o.guid=r.generateUUID(),n&&n!=="invalid"&&(t[n]=o.guid),o&&o.userData&&o.userData.components)for(const a of o.userData.components){if(a===null)continue;const l=a.guid;l?jl.has(l)||(Wh&&console.log('Creating InstanceIdProvider with key "'+l+'" for component '+a[R0]),jl.set(l,new At(l))):Wh&&console.warn("Can not create IdProvider: component "+a[R0]+" has no guid",a.guid);const c=jl.get(l)||e,h=a.guid;a.guid=c.generateUUID(),h&&h!=="invalid"&&(t[h]=a.guid),a.resolveGuids&&i.push(a)}if(o.children)for(const a of o.children)T0(a,e,t,i)}const $h=[];async function E0(o,e,t,i,n){if(!e)return;const s=e.userData;if(s){const r=s.builtin_components;if(r&&r.length>0)for(const a of r)try{if(a===null)continue;const l=C.get(a.name);if(l!=null){const c=new l;c.sourceId=o.gltfId,Fa(c,a,o.implementationInformation),c.context=o.context,"guid"in a&&(c[oc]=a.guid),c[R0]=a.name,Sr(e,c,!1),t.push({instance:c,compData:a,obj:e}),c.isCamera&&o.context&&o.context.mainCamera===null&&c.tag==="MainCamera"&&o.context.setCurrentCamera(c),o.context?.physics?.engine?.isInitialized===!1&&(c.isCollider||c.isRigidbody)&&o.context?.physics.engine?.initialize()}else Wh&&console.debug("unknown component: "+a.name),$h.includes(a.name)||$h.push(a.name)}catch(l){console.error(a.name+" - "+l.message,l)}}if(e.children)for(const r of e.children)await E0(o,r,t,i,n+1);if($h.length>0&&n===0){const r=$h.join(", ");console.warn(`Unknown components in scene: ${r}`),$h.length=0,$i()&&Te(`<strong>Unknown components in scene</strong>:
|
|
1477
|
+
`+c.xrData.lastChangedTime.toFixed(2),.02))}}bounds=new bi;center=new b;labelOffset=new b;removeData(e,t){const i=t.get(e);if(!i)return;t.delete(e),ha&&console.log("Plane no longer tracked, id="+i.id),i.mesh&&(i.mesh.removeFromParent(),i.mesh.traverse(s=>{const r=s.userData.normalsHelper;r?(r.dispose(),r.removeFromParent()):ha&&console.warn("No normals helper found for mesh",i.mesh)}),Ci(i.mesh,!0,!0));const n=new CustomEvent("plane-tracking",{detail:{type:"plane-removed",context:i}});this.dispatchEvent(n)}_dataId=1;_allPlanes=new Map;_allMeshes=new Map;firstTimeNoPlanesDetected=-100;makeOccluder=(e,t,i=!1)=>{if(t){if(t instanceof Array){for(const n of t)this.makeOccluder(e,n,i);return}!i&&!t.name.toLowerCase().includes("occlu")||(t.colorWrite=!1,t.depthTest=!0,t.depthWrite=!0,t.transparent=!1,t.polygonOffset=!0,t.polygonOffsetFactor=1,t.polygonOffsetUnits=.1,e.renderOrder=-1e3)}};processFrameData(e,t,i,n,s){const r=this.context.renderer.xr.getReferenceSpace();if(r){for(const a of s.keys())n.has(a)||this.removeData(a,s);for(const a of n){const l="planeSpace"in a?a.planeSpace:"meshSpace"in a?a.meshSpace:void 0;if(!l)continue;const c=i.getPose(l,r);let h;if(s.has(a)){const d=s.get(a);if(h=d.mesh,d.timestamp<a.lastChangedTime){if(d.timestamp=a.lastChangedTime,d.mesh){const m=this.createGeometry(a);if(d.mesh instanceof H)d.mesh.geometry.dispose(),d.mesh.geometry=m,this.makeOccluder(d.mesh,d.mesh.material);else if(d.mesh instanceof cs)for(const f of d.mesh.children)f instanceof H&&(f.geometry.dispose(),f.geometry=m,this.makeOccluder(f,f.material));if(d.collider){const f=d.mesh;d.collider.sharedMesh=f,d.collider.convex=this.checkIfContextShouldBeConvex(f,d.xrData),d.collider.onDisable(),d.collider.onEnable()}ha&&(console.log("Plane updated, id="+d.id,d),d.mesh.traverse(f=>{if(!(f instanceof H))return;const g=f.userData.normalsHelper;g&&g.update()}))}const p=new CustomEvent("plane-tracking",{detail:{type:"plane-updated",context:d}});this.dispatchEvent(p)}}else{if(!this.dataTemplate){const d=new H;ha?d.material=new PC:this.occluder?(d.material=new we,this.makeOccluder(d,d.material,!0)):d.material=new we({wireframe:!0,opacity:.5,transparent:!0,color:3355443}),this.dataTemplate=new ie("","",d)}if(!this.dataTemplate.asset)this.dataTemplate.loadAssetAsync();else{const d=w.instantiate(this.dataTemplate.asset);if(d.name="xr-tracked-plane",h=d,Ym(d,!1),d instanceof H)Pe(d.geometry),d.geometry=this.createGeometry(a),this.makeOccluder(d,d.material,this.occluder&&!this.dataTemplate);else if(d instanceof cs)for(const f of d.children)f instanceof H&&(Pe(f.geometry),f.geometry=this.createGeometry(a),this.makeOccluder(f,f.material,this.occluder&&!this.dataTemplate));const p=d.getComponent(Ms);if(p){const f=d;p.sharedMesh=f,p.convex=this.checkIfContextShouldBeConvex(f,a),p.onDisable(),p.onEnable()}d.matrixAutoUpdate=!1,d.matrixWorldNeedsUpdate=!0,t.add(d);const m={id:this._dataId++,xrData:a,timestamp:a.lastChangedTime,mesh:d,collider:p};s.set(a,m),ha&&console.log("New plane detected, id="+m.id,m,{hasCollider:!!p,isGroup:d instanceof cs});try{const f=new CustomEvent("plane-tracking",{detail:{type:"plane-added",context:m}});this.dispatchEvent(f)}catch(f){console.error(f)}}}h&&(c?(h.visible=!0,h.matrix.fromArray(c.transform.matrix),h.matrix.premultiply(this._flipForwardMatrix)):h.visible=!1,ha&&h.traverse(d=>{if(d instanceof H)if(d.userData.normalsHelper)d.userData.normalsHelper.update();else{const p=new QC(d,.05,255);p.layers.disableAll(),p.layers.set(2),this.context.scene.add(p),d.userData.normalsHelper=p}}))}}}_flipForwardMatrix=new ee().makeRotationY(Math.PI);checkIfContextShouldBeConvex(e,t){if(!e)return!0;if(e){const i=new bi;i.expandByObject(e);const n=new b;i.getSize(n);let s=!0;return n.x>2&&n.y>2&&n.z>1.5&&(s=!1),s&&"semanticLabel"in t&&t.semanticLabel==="wall"&&(s=!0),s}return!0}createGeometry(e){return"polygon"in e?this.createPlaneGeometry(e.polygon):"vertices"in e&&"indices"in e?this.createMeshGeometry(e.vertices,e.indices):new mn}_verticesCache=new Map;createMeshGeometry(e,t){const i=e.toString()+"_"+t.toString();if(this._verticesCache.has(i))return this._verticesCache.get(i);const n=new mn;n.setIndex(new pt(t,1)),n.setAttribute("position",new pt(e,3));const s=Array();for(let r=0;r<e.length;r+=3)s.push(e[r],e[r+2]);return n.setAttribute("uv",new pt(e,3)),n.computeVertexNormals(),this._verticesCache.set(i,n),n}createPlaneGeometry(e){const t=new mn,i=[],n=[];e.forEach(p=>{i.push(p.x,p.y,p.z),n.push(p.x,p.z)});const s=new b(i[0],i[1],i[2]),r=new b(i[3],i[4],i[5]),a=new b(i[6],i[7],i[8]),l=new b,c=new b;l.subVectors(r,s),c.subVectors(a,s),l.cross(c),l.normalize();const h=[];for(let p=0;p<i.length/3;p++)h.push(l.x,l.y,l.z);const d=[];for(let p=2;p<e.length;++p)d.push(0,p-1,p);return t.setAttribute("position",new pt(new Float32Array(i),3)),t.setAttribute("uv",new pt(new Float32Array(n),2)),t.setAttribute("normal",new pt(new Float32Array(h),3)),t.setIndex(d),t.computeBoundingBox(),t.computeBoundingSphere(),t}}Ll([u(ie)],Ko.prototype,"dataTemplate"),Ll([u()],Ko.prototype,"occluder"),Ll([u()],Ko.prototype,"initiateRoomCaptureIfNoData"),Ll([u()],Ko.prototype,"usePlaneData"),Ll([u()],Ko.prototype,"useMeshData"),Ll([u()],Ko.prototype,"runInVR");var wI=Object.defineProperty,SI=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&wI(e,t,n),n};const j1=x("debugwebxr");class Zp extends R{priority=0;get isActive(){return this.activeAndEnabled&&this.gameObject.visible}setAsActiveXRRig(){Y.active?.setRigActive(this)}setPriority(e){this.priority=e}awake(){if(j1){const e=new k;e.position.y+=.5,this.gameObject.add(e);const t=e.addNewComponent(qr);t&&(t.isGizmo=!1);const i=new _i(.5);this.gameObject.add(i)}}isXRRig(){return!0}supportsXR(e){return!0}_startScale;onEnterXR(e){this._startScale=this.gameObject.scale.clone(),e.xr.addRig(this),j1&&console.log("WebXR: add Rig",this.name,this.priority)}onLeaveXR(e){e.xr.removeRig(this),this._startScale&&this.gameObject&&this.gameObject.scale.copy(this._startScale)}}SI([u()],Zp.prototype,"priority");class CI extends R{toggleKey="KeyP";update(){this.context.input.isKeyDown(this.toggleKey)&&this.context.domElement.classList.toggle("presentation-mode")}}C.add("AlignmentConstraint",Mc),C.add("Animation",Lt),C.add("Animator",ft),C.add("AudioListener",Eo),C.add("AudioSource",Mi),C.add("Avatar_Brain_LookAt",jc),C.add("Avatar_MouthShapes",Dc),C.add("Avatar_MustacheShake",wf),C.add("AvatarBlink_Simple",jr),C.add("AvatarEyeLook_Rotation",Cf),C.add("AxesHelper",Ya),C.add("BasicIKConstraint",Of),C.add("BoxHelperComponent",wt),C.add("Camera",si),C.add("CharacterController",Dr),C.add("CharacterControllerInput",Lo),C.add("Collider",ai),C.add("SphereCollider",Za),C.add("BoxCollider",Lu),C.add("MeshCollider",Ms),C.add("CapsuleCollider",Ao),C.add("ContactShadows",Fc),C.add("LogStats",Rf),C.add("DeleteBox",or),C.add("Deletable",Ef),C.add("DeviceFlag",ju),C.add("DragControls",zr),C.add("DropListener",jo),C.add("Duplicatable",Bf),C.add("EventListEvent",Pu),C.add("EventTrigger",zu),C.add("GltfExportBox",Qf),C.add("GltfExport",Zf),C.add("VariantAction",ay),C.add("ChangeTransformOnClick",Wr),C.add("ChangeMaterialOnClick",cy),C.add("SetActiveOnClick",hy),C.add("HideOnStart",dn),C.add("EmphasizeOnClick",cl),C.add("PlayAudioOnClick",As),C.add("PlayAnimationOnClick",qc),C.add("PreliminaryAction",hl),C.add("PreliminaryTrigger",Xc),C.add("VisibilityAction",Qc),C.add("TapGestureTrigger",uy),C.add("USDZExporter",oo),C.add("Fog",bl),C.add("BoxGizmo",qr),C.add("GridHelper",_l),C.add("GroundProjectedEnv",qn),C.add("UsageMarker",zc),C.add("Interactable",Tf),C.add("FixedJoint",Uy),C.add("HingeJoint",rh),C.add("Light",di),C.add("LODGroup",lh),C.add("LookAtConstraint",Er),C.add("NeedleMenu",io),C.add("NestedGltf",ch),C.add("Networking",$y),C.add("OffsetConstraint",Xr),C.add("CameraTargetReachedEvent",Lc),C.add("OrbitControls",fe),C.add("ParticleSystemRenderer",sn),C.add("ParticleSystem",ph),C.add("Attractor",Sl),C.add("PlayerColor",Nl),C.add("Antialiasing",gh),C.add("BloomEffect",Cp),C.add("ChromaticAberration",fh),C.add("ColorAdjustments",Gs),C.add("DepthOfField",Tn),C.add("EffectWrapper",bh),C.add("PixelationEffect",_h),C.add("ScreenSpaceAmbientOcclusion",Ho),C.add("ScreenSpaceAmbientOcclusionN8",En),C.add("SharpeningEffect",xh),C.add("TiltShiftEffect",ro),C.add("ToneMappingEffect",Hs),C.add("Vignette",ta),C.add("Volume",Pl),C.add("ReflectionProbe",Vc),C.add("Renderer",Ti),C.add("MeshRenderer",Wc),C.add("SkinnedMeshRenderer",Xf),C.add("Rigidbody",Ze),C.add("SceneSwitcher",Xe),C.add("ScreenCapture",Xs),C.add("ShadowCatcher",Ph),C.add("RemoteSkybox",Ep),C.add("SmoothFollow",Ip),C.add("SpatialTriggerReceiver",ao),C.add("SpatialTrigger",Lp),C.add("SpectatorCamera",jp),C.add("SplineContainer",oa),C.add("SplineWalker",An),C.add("SpriteRenderer",ci),C.add("SyncedCamera",p0),C.add("SyncedRoom",In),C.add("SyncedTransform",Cn),C.add("TestRunner",f0),C.add("TestSimulateUserData",y0),C.add("PlayableDirector",ra),C.add("SignalReceiver",Eh),C.add("AnimationTrackHandler",Ah),C.add("AudioTrackHandler",ss),C.add("MarkerTrackHandler",zp),C.add("SignalTrackHandler",Ih),C.add("ControlTrackHandler",Up),C.add("TransformGizmo",aa),C.add("BaseUIComponent",ln),C.add("UIRootComponent",eh),C.add("Button",Xo),C.add("Canvas",yl),C.add("CanvasGroup",zs),C.add("EventSystem",ei),C.add("Graphic",nh),C.add("MaskableGraphic",oh),C.add("Image",Ml),C.add("RawImage",Wp),C.add("InputField",x0),C.add("VerticalLayoutGroup",Ry),C.add("HorizontalLayoutGroup",Ty),C.add("GridLayoutGroup",Ey),C.add("Outline",gl),C.add("ObjectRaycaster",ki),C.add("GraphicRaycaster",Mu),C.add("SpatialGrabRaycaster",ua),C.add("RectTransform",Mn),C.add("SpatialHtml",jh),C.add("Text",Bt),C.add("EnvironmentScene",Hp),C.add("LookAt",w0),C.add("OpenURL",Rl),C.add("VideoPlayer",ht),C.add("Voip",ks),C.add("ClickThrough",qp),C.add("CursorFollow",Bh),C.add("HoverAnimation",uo),C.add("ScrollFollow",Qo),C.add("ViewBox",zi),C.add("Avatar",Ls),C.add("XRControllerFollow",Yo),C.add("XRControllerModel",Uo),C.add("XRControllerMovement",Ei),C.add("TeleportTarget",sp),C.add("WebARCameraBackground",Uh),C.add("WebARSessionRoot",Ui),C.add("WebXR",rp),C.add("AvatarMarker",Le),C.add("WebXRImageTracking",Nh),C.add("WebXRPlaneTracking",Ko),C.add("XRRig",Zp),C.add("XRFlag",Ji),C.add("PlayerSync",by),C.add("PlayerState",On),C.add("PresentationMode",CI);const Wh=gt,PI=x("debugtypestore");PI&&console.log(C);function OI(o,e){const t=bv(o,e);return t!==void 0?t:null}const kI=new jk,M0=Symbol("deserialize-queue");async function MI(o,e,t,i=null,n){if(!t){console.debug("Can not create component instances: gltf is null");return}const s=[];let r=i;typeof r=="number"&&(r=new At(i));const a=e.indexOf("?");e=a===-1?e:e.substring(0,a);const l=new Ug(t.scene);l.gltfId=e,l.context=o,l.gltf=t,l.nodeToObject=n?.nodeToObjectMap,l.implementationInformation=kI;let c=o[M0];if(c||(c=o[M0]=[]),t.scenes)for(const h of t.scenes)await E0(l,h,c,s,0);if(t.children)for(const h of t.children)await E0(l,h,c,s,0);o.new_scripts_pre_setup_callbacks.push(()=>{const h=o[M0];if(h){for(const d of h)RI(d,l);h.length=0}if(r){const d={},p=[];T0(t,r,d,p);for(const m of t.scenes)T0(m,r,d,p);for(const m of p)m.resolveGuids(d)}})}const R0=Symbol("original-component-name"),jl=new Map;function T0(o,e,t,i){if(e===null||!o)return;const n=o.guid,s=o.guid;s?.length&&(jl.has(s)||(Wh&&console.log('Creating InstanceIdProvider with key "'+s+'" for object '+o.name),jl.set(s,new At(s))));const r=s&&jl.get(s)||e;if(o.guid=r.generateUUID(),n&&n!=="invalid"&&(t[n]=o.guid),o&&o.userData&&o.userData.components)for(const a of o.userData.components){if(a===null)continue;const l=a.guid;l?jl.has(l)||(Wh&&console.log('Creating InstanceIdProvider with key "'+l+'" for component '+a[R0]),jl.set(l,new At(l))):Wh&&console.warn("Can not create IdProvider: component "+a[R0]+" has no guid",a.guid);const c=jl.get(l)||e,h=a.guid;a.guid=c.generateUUID(),h&&h!=="invalid"&&(t[h]=a.guid),a.resolveGuids&&i.push(a)}if(o.children)for(const a of o.children)T0(a,e,t,i)}const $h=[];async function E0(o,e,t,i,n){if(!e)return;const s=e.userData;if(s){const r=s.builtin_components;if(r&&r.length>0)for(const a of r)try{if(a===null)continue;const l=C.get(a.name);if(l!=null){const c=new l;c.sourceId=o.gltfId,Fa(c,a,o.implementationInformation),c.context=o.context,"guid"in a&&(c[oc]=a.guid),c[R0]=a.name,Sr(e,c,!1),t.push({instance:c,compData:a,obj:e}),c.isCamera&&o.context&&o.context.mainCamera===null&&c.tag==="MainCamera"&&o.context.setCurrentCamera(c),o.context?.physics?.engine?.isInitialized===!1&&(c.isCollider||c.isRigidbody)&&o.context?.physics.engine?.initialize()}else Wh&&console.debug("unknown component: "+a.name),$h.includes(a.name)||$h.push(a.name)}catch(l){console.error(a.name+" - "+l.message,l)}}if(e.children)for(const r of e.children)await E0(o,r,t,i,n+1);if($h.length>0&&n===0){const r=$h.join(", ");console.warn(`Unknown components in scene: ${r}`),$h.length=0,$i()&&Te(`<strong>Unknown components in scene</strong>:
|
|
1478
1478
|
|
|
1479
1479
|
${r}
|
|
1480
1480
|
|
|
@@ -1649,4 +1649,4 @@ Error:`,r),null}}updateColliderCollisionGroups(e){const t=e[Vt],i=e.membership;l
|
|
|
1649
1649
|
justify-content: center;
|
|
1650
1650
|
gap: .5rem;
|
|
1651
1651
|
}
|
|
1652
|
-
`),this.#n.innerHTML=this.#e.innerHTML,this.#n.style.cssText="display: flex; align-items: center; justify-content: center;",this.#e.innerHTML=this.#n.outerHTML,this.#t.innerHTML=this.#e.outerHTML,this.#t.prepend(this.#o),pu(ef,{element:this.#t}),this.#s?.disconnect(),this.#s??=new MutationObserver(()=>this.#l()),this.#s.observe(this.#e,{attributes:!0}),F0&&console.log("Needle Button updated")}#l(){this.#e&&(this.#e.style.display==="none"?this.style.display="none":this.style.display==="none"&&(this.style.display=""))}#r=e=>{F0&&console.log("Needle Button clicked"),!e.defaultPrevented&&this.#e&&this.#e.click()}}typeof window<"u"&&!window.customElements.get(Q1)&&window.customElements.define(Q1,Y1);const Zh=x("debugavatar");class z0{root;head;leftHand;rigthHand;get isValid(){return this.head!==null&&this.head!==void 0}constructor(e,t,i,n){this.root=e,this.head=t,this.leftHand=i,this.rigthHand=n,this.root?.traverse(s=>s.layers.set(2))}}class Z1{avatarRegistryUrl=null;async getOrCreateNewAvatarInstance(e,t){if(!t)return console.error("Can not create avatar: failed to provide id or root object"),null;let i=null;if(typeof t=="string"){if(i=await this.loadAvatar(e,t),!i){const s=new jn;i=w.instantiate(Pa(t,e.scene),s)}}else i=t;if(!i)return null;const n=this.findAvatar(i);return n.isValid?(Zh&&console.log("[Custom Avatar] valid config",t,Zh?n:""),n):(console.warn("[Custom Avatar] config isn't valid",t,Zh?n:""),null)}async loadAvatar(e,t){if(console.assert(t!=null&&typeof t=="string","Avatar id must not be null"),t.length<=0||!t)return null;if(Zh&&console.log("[Custom Avatar] "+t+", loading..."),t.endsWith(".glb")||(t+=".glb"),this.avatarRegistryUrl===null){const n=await fetch("./"+t);let s=null;if(n.ok){const r=await n.blob();r&&(s=await r.arrayBuffer())}return s?(await bn().parseSync(e,s,null,0))?.scene??null:null}const i=new xo;return cf(i,e),new Promise((n,s)=>{const r=this.avatarRegistryUrl+"/"+t;i.load(r,async a=>{await bn().createBuiltinComponents(e,r,a,null,void 0),n(a.scene)},a=>{Zh&&console.log("[Custom Avatar] "+a.loaded/a.total*100+"% loaded of "+a.total/1024+"kB")},a=>{console.error("[Custom Avatar] Error when loading: "+a),n(null)})})}cacheModel(e,t){}findAvatar(e){const t=e;let i=t;i.children.length==1&&(i=e.children[0]);let n=this.findAvatarPart(i,["head"]);const s=this.findAvatarPart(i,["left","hand"]),r=this.findAvatarPart(i,["right","hand"]);if(!n){n=t;const a=new b;new bi().setFromObject(n).getSize(a);const l=Math.max(a.x,a.y,a.z);console.warn("[Custom Avatar] Normalizing head scale, it's too big: "+l+" meters! Should be < 0.3m"),l>.3&&n.scale.multiplyScalar(1/l*.3)}return new z0(t,n,s,r)}findAvatarPart(e,t){const i=e.name.toLowerCase();let n=!0;for(const s of t){if(!n)break;i.indexOf(s)===-1&&(n=!1)}if(n)return e;if(e.children)for(const s of e.children){const r=this.findAvatarPart(s,t);if(r)return r}return null}handleCustomAvatarErrors(e){if(!e.ok)throw Error(e.statusText);return e}}class K1{get extensionName(){return"DocumentExtension"}onAfterBuildDocument(e){}}class J1{}const KI=Object.freeze(Object.defineProperty({__proto__:null,ActionBuilder:me,ActionCollection:Lw,ActionModel:fi,AlignmentConstraint:Mc,Animation:Lt,AnimationCurve:hh,AnimationExtension:ep,AnimationTrackHandler:Ah,Animator:ft,AnimatorController:hn,Antialiasing:gh,Attractor:Sl,AudioExtension:pa,AudioListener:Eo,AudioSource:Mi,AudioTrackHandler:ss,Avatar:Ls,AvatarBlink_Simple:jr,AvatarEyeLook_Rotation:Cf,AvatarLoader:Z1,AvatarMarker:Le,AvatarModel:z0,Avatar_Brain_LookAt:jc,Avatar_MouthShapes:Dc,Avatar_MustacheShake:wf,Avatar_POI:Lr,AxesHelper:Ya,BaseUIComponent:ln,BasicIKConstraint:Of,BehaviorExtension:wy,BehaviorModel:Et,BloomEffect:Cp,BoxCollider:Lu,BoxGizmo:qr,BoxHelperComponent:wt,Button:Xo,CallInfo:To,Camera:si,CameraTargetReachedEvent:Lc,Canvas:yl,CanvasGroup:zs,CapsuleCollider:Ao,ChangeMaterialOnClick:cy,ChangeTransformOnClick:Wr,CharacterController:Dr,CharacterControllerInput:Lo,ChromaticAberration:fh,ClickThrough:qp,Collider:ai,ColorAdjustments:Gs,ColorBySpeedModule:xl,ColorOverLifetimeModule:yp,ContactShadows:Fc,ControlTrackHandler:Up,CursorFollow:Bh,CustomBranding:Gr,Deletable:Ef,DeleteBox:or,DepthOfField:Tn,DeviceFlag:ju,DocumentExtension:K1,DragControls:zr,DropListener:jo,Duplicatable:Bf,EffectWrapper:bh,EmissionModule:$o,EmphasizeOnClick:cl,EnvironmentScene:Hp,EventList:he,EventListEvent:Pu,EventSystem:ei,EventTrigger:zu,FieldWithDefault:uw,FixedJoint:Uy,Fog:bl,GltfExport:Zf,GltfExportBox:Qf,Gradient:Qr,Graphic:nh,GraphicRaycaster:Mu,GridHelper:_l,GridLayoutGroup:Ey,GroundProjectedEnv:qn,GroupActionModel:Vr,HideOnStart:dn,HingeJoint:rh,HorizontalLayoutGroup:Ty,get HoverAnimation(){return uo},Image:Ml,InheritVelocityModule:qy,InputField:x0,InstanceHandle:ba,InstancingHandler:ma,Interactable:Tf,Keyframe:ui,LODGroup:lh,LODModel:vl,Light:di,LimitVelocityOverLifetimeModule:lt,LogStats:Rf,LookAt:w0,LookAtConstraint:Er,MainModule:Ft,MarkerTrackHandler:zp,MaskableGraphic:oh,MeshCollider:Ms,MeshRenderer:Wc,MinMaxCurve:Q,MinMaxGradient:Yr,NeedleMenu:io,NestedGltf:ch,Networking:$y,NoiseModule:_e,ObjectRaycaster:ki,OffsetConstraint:Xr,OpenURL:Rl,OrbitControls:fe,Outline:gl,Padding:Hr,ParticleBurst:fp,ParticleSubEmitter:Xy,ParticleSystem:ph,ParticleSystemRenderer:sn,PhysicsExtension:Sy,PixelationEffect:_h,PlayAnimationOnClick:qc,PlayAudioOnClick:As,PlayableDirector:ra,PlayerColor:Nl,PointerEventData:rd,PostProcessingHandler:d0,PreliminaryAction:hl,PreliminaryTrigger:Xc,RawImage:Wp,Rect:Nw,RectTransform:Mn,ReflectionProbe:Vc,RegisteredAnimationInfo:sr,RemoteSkybox:Ep,Renderer:Ti,RendererLightmap:$u,get ResponsiveBox(){return zi},Rigidbody:Ze,RotationBySpeedModule:on,RotationOverLifetimeModule:Rn,SceneSwitcher:Xe,ScreenCapture:Xs,ScreenSpaceAmbientOcclusion:Ho,ScreenSpaceAmbientOcclusionN8:En,ScrollFollow:Qo,SetActiveOnClick:hy,ShadowCatcher:Ph,ShapeModule:Gy,SharpeningEffect:xh,SignalAsset:Fp,SignalReceiver:Eh,SignalReceiverEvent:Th,SignalTrackHandler:Ih,Size:Uw,SizeBySpeedModule:pi,SizeOverLifetimeModule:Zr,SkinnedMeshRenderer:Xf,SmoothFollow:Ip,SpatialGrabRaycaster:ua,SpatialHtml:jh,SpatialTrigger:Lp,SpatialTriggerReceiver:ao,SpectatorCamera:jp,SphereCollider:Za,SplineContainer:oa,SplineData:lo,SplineWalker:An,Sprite:zo,SpriteData:ul,SpriteRenderer:ci,SpriteSheet:dl,SubEmitterSystem:xp,SyncedCamera:p0,SyncedRoom:In,SyncedTransform:Cn,TapGestureTrigger:uy,TeleportTarget:sp,TestRunner:f0,TestSimulateUserData:y0,Text:Bt,TextBuilder:My,TextExtension:hp,TextureSheetAnimationModule:zt,TiltShiftEffect:ro,ToneMappingEffect:Hs,TrailModule:Fe,TransformData:Ne,TransformGizmo:aa,TriggerBuilder:Dt,TriggerModel:er,UIRaycastUtils:mf,UIRootComponent:eh,USDZExporter:oo,USDZText:fl,USDZUIExtension:Ly,UsageMarker:zc,VariantAction:ay,VelocityOverLifetimeModule:Ve,VerticalLayoutGroup:Ry,VideoPlayer:ht,Vignette:ta,VisibilityAction:Qc,Voip:ks,Volume:Pl,VolumeParameter:B,VolumeProfile:wp,WebARCameraBackground:Uh,WebARSessionRoot:Ui,WebXR:rp,WebXRImageTracking:Nh,WebXRImageTrackingModel:Zo,WebXRPlaneTracking:Ko,WebXRTrackedImage:Vl,XRControllerFollow:Yo,XRControllerModel:Uo,XRControllerMovement:Ei,XRFlag:Ji,XRRig:Zp,XRState:Jt,__Ignore:J1},Symbol.toStringTag,{value:"Module"})),Kh=x("debugmissingcamera");ue.registerCallback(de.MissingCamera,o=>{Kh&&console.warn("Creating missing camera");const e=o.context.scene,t=new re;t.name="Default Fallback Camera",e.add(t);const i=new si;if(i.sourceId=o.files?.[0]?.src??"unknown",i.fieldOfView=35,o.context.domElement.getAttribute("transparent")!=null)i.clearFlags=Ir.Uninitialized;else if(o.context.domElement.getAttribute("background-image")?.length||o.context.lightmaps.tryGetSkybox(i.sourceId))i.clearFlags=Ir.Skybox;else{if(i.clearFlags=Ir.SolidColor,!o.context.domElement.getAttribute("background-color")){let s="#efefef";typeof window!==void 0&&window.matchMedia("(prefers-color-scheme: dark)").matches&&(s="#1f1f1f"),e.background=new ne(s)}if(!e.environment){const s=new kC(o.context.renderer),r=new Hp("neutral");e.environment=s.fromScene(r,.025).texture}}const n=Sr(t,i,!0);return t.position.x=0,t.position.y=1,t.position.z=2,o.context.domElement?.cameraControls!=!1&&eS(o.context,n),n}),ue.registerCallback(de.ContextCreated,o=>{if(!o.context.mainCamera){Kh&&console.log("Will not auto-fit because a default camera exists");return}if(o.context.domElement?.cameraControls==!0){if(Nb(o.context.mainCamera)?.isCameraController==!0){Kh&&console.log("Will not auto-fit because a camera controller exists");return}eS(o.context)}});function eS(o,e){e=e??o.mainCameraComponent;const t=e?.gameObject;if(Kh&&console.log("Creating default camera controls",e?.name),t){const i=yc(t,fe);i.sourceId=e?.sourceId??"unknown";const n=o.domElement.getAttribute("auto-rotate");i.autoRotate=n!="0"&&n?.toLowerCase()!="false";const s=Number.parseFloat(n||".5");i.autoRotateSpeed=isNaN(s)?.5:s,Kh&&console.log("Auto-rotate",i.autoRotate,"speed:",i.autoRotateSpeed);const r=o.domElement.getAttribute("auto-fit");i.autoFit=r!=="0"&&r?.toLowerCase()!="false",i.autoTarget=!0}else console.warn("Missing camera object, can not add orbit controls")}ue.registerCallback(de.ContextCreated,o=>{const e=o.context.domElement.getAttribute("autoplay");if(e!==void 0&&(e===""||e==="true"||e==="1")&&o.files)for(const t of o.files)w.foreachComponent(t.file.scene,i=>{if(i.enabled!==!1){if(i instanceof Lt&&i.playAutomatically||i instanceof ft||i instanceof ra&&i.playOnAwake===!0)return!0;if(i instanceof Lt)return i.playAutomatically=!0,!0;if(i instanceof ra)return i.playOnAwake=!0,!0}},!0)!==!0&&bs.autoplayAnimations(t.file)});var U0;(o=>{function e(t,i=!1,n=.75){const s=new oa,r=1-j.clamp(n,0,1);return t.forEach((a,l)=>{const c=new b;l<t.length-1?c.subVectors(t[l+1],a).normalize().multiplyScalar(r):i&&t.length>1&&c.subVectors(t[0],a).normalize().multiplyScalar(r);const h=new lo;h.position.copy(a),h.tangentIn.copy(c),h.tangentOut.copy(c),s.addKnot(h)}),s.closed=i,s}o.createFromPoints=e})(U0||(U0={}));class JI extends rP{constructor(){super(new Worker(URL.createObjectURL(new Blob([`import '${new URL("./generateMeshBVH.worker-2qGLkQjg.js",import.meta.url).toString()}';`],{type:"text/javascript"})),{type:"module"})),this.name="GenerateMeshBVHWorker"}runTask(e,t,i={}){return new Promise((n,s)=>{if(t.getAttribute("position").isInterleavedBufferAttribute||t.index&&t.index.isInterleavedBufferAttribute)throw new Error("GenerateMeshBVHWorker: InterleavedBufferAttribute are not supported for the geometry attributes.");e.onerror=c=>{s(new Error(`[GenerateMeshBVHWorker] ${c.message||"Unknown error. Please check the server console. If you're using vite try adding 'three-mesh-bvh' to 'optimizeDeps.exclude' in your vite.config.js"}`))},e.onmessage=c=>{const{data:h}=c;if(h.error)s(new Error(h.error)),e.onmessage=null;else if(h.serialized){const{serialized:d,position:p}=h,m=aP.deserialize(d,t,{setIndex:!1}),f=Object.assign({setBoundingBox:!0},i);if(t.attributes.position.array=p,d.index)if(t.index)t.index.array=d.index;else{const g=new pt(d.index,1,!1);t.setIndex(g)}f.setBoundingBox&&(t.boundingBox=m.getBoundingBox(new bi)),i.onProgress&&i.onProgress(h.progress),n(m),e.onmessage=null}else i.onProgress&&i.onProgress(h.progress)};const r=t.index?t.index.array:null,a=t.attributes.position.array,l=[a];r&&l.push(r),e.postMessage({index:r,position:a,options:{...i,onProgress:null,includedProgressCallback:!!i.onProgress,groups:[...t.groups]}},l.map(c=>c.buffer).filter(c=>typeof SharedArrayBuffer>"u"||!(c instanceof SharedArrayBuffer)))})}}const eL=Object.freeze(Object.defineProperty({__proto__:null,GenerateMeshBVHWorker:JI},Symbol.toStringTag,{value:"Module"}));export{TR as $physicsKey,me as ActionBuilder,Lw as ActionCollection,fi as ActionModel,zv as Addressables,Mc as AlignmentConstraint,Ha as AmbientMode,Lt as Animation,hh as AnimationCurve,ep as AnimationExtension,Ah as AnimationTrackHandler,bs as AnimationUtils,ft as Animator,Ss as AnimatorConditionMode,hn as AnimatorController,df as AnimatorControllerParameterType,Rc as AnimatorStateInfo,gh as Antialiasing,Ln as Application,H_ as AssetDatabase,ie as AssetReference,Sl as Attractor,pa as AudioExtension,Eo as AudioListener,Mi as AudioSource,ss as AudioTrackHandler,Ls as Avatar,jr as AvatarBlink_Simple,Cf as AvatarEyeLook_Rotation,Z1 as AvatarLoader,Le as AvatarMarker,z0 as AvatarModel,jc as Avatar_Brain_LookAt,Dc as Avatar_MouthShapes,wf as Avatar_MustacheShake,Lr as Avatar_POI,Ga as Axes,Ya as AxesHelper,tg as BUILD_TIME,ln as BaseUIComponent,Of as BasicIKConstraint,wy as BehaviorExtension,Et as BehaviorModel,Mr as BlobStorage,Cp as BloomEffect,Lu as BoxCollider,qr as BoxGizmo,wt as BoxHelperComponent,Xo as Button,Dn as ButtonsFactory,zx as CallDirection,To as CallInfo,si as Camera,Lc as CameraTargetReachedEvent,yl as Canvas,zs as CanvasGroup,Ao as CapsuleCollider,cy as ChangeMaterialOnClick,Wr as ChangeTransformOnClick,Dr as CharacterController,Lo as CharacterControllerInput,fh as ChromaticAberration,xi as CircularBuffer,Ir as ClearFlags,qp as ClickThrough,co as ClipExtrapolation,ai as Collider,Dx as Collision,Su as CollisionDetectionMode,Gs as ColorAdjustments,xl as ColorBySpeedModule,yp as ColorOverLifetimeModule,FM as Component,R as Component$1,qd as ComponentLifecycleEvents,KI as Components,T_ as ConnectionEvents,jx as ContactPoint,Fc as ContactShadows,N as Context,SM as ContextArgs,de as ContextEvent,ue as ContextRegistry,Up as ControlTrackHandler,Bh as CursorFollow,Gr as CustomBranding,Me as CustomShader,du as DefaultReflectionMode,Ef as Deletable,or as DeleteBox,Tn as DepthOfField,ju as DeviceFlag,G as DeviceUtilities,K1 as DocumentExtension,zr as DragControls,If as DragMode,jo as DropListener,Bf as Duplicatable,bh as EffectWrapper,$o as EmissionModule,cl as EmphasizeOnClick,ld as EngineLoadingView,Hp as EnvironmentScene,he as EventList,Pu as EventListEvent,ei as EventSystem,zu as EventTrigger,uw as FieldWithDefault,ya as FileReference,Nv as FileReferenceSerializer,JR as FileSpawnModel,qx as File_Event,Uy as FixedJoint,bl as Fog,xe as FrameEvent,Ad as GENERATOR,w as GameObject,F as Gizmos,Zf as GltfExport,Qf as GltfExportBox,Qr as Gradient,nh as Graphic,Mu as GraphicRaycaster,ir as Graphics,_l as GridHelper,Ey as GridLayoutGroup,qn as GroundProjectedEnv,Vr as GroupActionModel,Eu as HideFlags,dn as HideOnStart,rh as HingeJoint,Ty as HorizontalLayoutGroup,Ck as HostData,uo as HoverAnimation,Ml as Image,fa as ImageReference,Uv as ImageReferenceSerializer,qy as InheritVelocityModule,y_ as Input,ii as InputEventQueue,Ee as InputEvents,x0 as InputField,ba as InstanceHandle,ma as InstancingHandler,cn as InstancingUtil,rv as InstantiateEvent,At as InstantiateIdProvider,jn as InstantiateOptions,Tf as Interactable,zh as InternalScreenshotUtils,XO as JoinedRoomResponse,BO as KeyEventArgs,ui as Keyframe,lh as LODGroup,vl as LODModel,QO as LeftRoomResponse,di as Light,Qv as LightData,lt as LimitVelocityOverLifetimeModule,BI as LoadingElementOptions,Rf as LogStats,wi as LogType,w0 as LookAt,Er as LookAtConstraint,T as MODULES,Ft as MainModule,zp as MarkerTrackHandler,b0 as MarkerType,oh as MaskableGraphic,j as Mathf,Ms as MeshCollider,Wc as MeshRenderer,Q as MinMaxCurve,Yr as MinMaxGradient,pc as NEEDLE_ENGINE_FEATURE_FLAGS,sc as NEKeyboardEvent,Co as NEPointerEvent,Y1 as NeedleButtonElement,jf as NeedleEngineModelLoader,L0 as NeedleEngineWebComponent,io as NeedleMenu,Ld as NeedlePatchesKey,rg as NeedleXRController,Y as NeedleXRSession,I_ as NeedleXRSync,z_ as NeedleXRUtils,ch as NestedGltf,A_ as NetworkConnection,Qn as NetworkedStreamEvents,ad as NetworkedStreams,$y as Networking,lv as NewInstanceModel,_e as NoiseModule,ki as ObjectRaycaster,_r as ObjectUtils,Xr as OffsetConstraint,Pd as OneEuroFilter,Nm as OneEuroFilterXYZ,Rl as OpenURL,fe as OrbitControls,gl as Outline,E_ as OwnershipEvent,ug as OwnershipModel,Ma as PUBLIC_KEY,Hr as Padding,fp as ParticleBurst,Xy as ParticleSubEmitter,ph as ParticleSystem,$s as ParticleSystemBaseBehaviour,sn as ParticleSystemRenderer,gp as ParticleSystemShapeType,os as PeerHandle,M_ as PeerNetworking,zl as Physics,Sy as PhysicsExtension,yt as PhysicsMaterialCombine,_h as PixelationEffect,qc as PlayAnimationOnClick,As as PlayAudioOnClick,ra as PlayableDirector,Nl as PlayerColor,On as PlayerState,Fw as PlayerStateEvent,by as PlayerSync,$v as PlayerView,Hv as PlayerViewManager,rd as PointerEventData,Dd as PointerType,tt as PostProcessingEffect,ct as PostProcessingEffectOrder,d0 as PostProcessingHandler,hl as PreliminaryAction,Xc as PreliminaryTrigger,Ts as PreviewHelper,br as PrimitiveType,ae as Progress,Dm as PromiseAllWithErrors,jm as PromiseErrorResult,oe as RGBAColor,Wl as RapierPhysics,Wp as RawImage,fs as RaycastOptions,Nw as Rect,Mn as RectTransform,Vc as ReflectionProbe,sr as RegisteredAnimationInfo,Ep as RemoteSkybox,fo as RenderTexture,Rx as RenderTextureSerializer,Ti as Renderer,Xv as RendererData,$u as RendererLightmap,Ze as Rigidbody,qe as RigidbodyConstraints,te as RoomEvents,on as RotationBySpeedModule,Rn as RotationOverLifetimeModule,Nu as SceneLightSettings,Xe as SceneSwitcher,Xs as ScreenCapture,Ho as ScreenSpaceAmbientOcclusion,En as ScreenSpaceAmbientOcclusionN8,Qo as ScrollFollow,_n as SendQueue,Ug as SerializationContext,hy as SetActiveOnClick,Ph as ShadowCatcher,Gy as ShapeModule,Bx as ShapeOverlapResult,xh as SharpeningEffect,Fp as SignalAsset,Eh as SignalReceiver,Th as SignalReceiverEvent,Ih as SignalTrackHandler,Uw as Size,pi as SizeBySpeedModule,Zr as SizeOverLifetimeModule,Xf as SkinnedMeshRenderer,Ip as SmoothFollow,ua as SpatialGrabRaycaster,jh as SpatialHtml,Lp as SpatialTrigger,ao as SpatialTriggerReceiver,jp as SpectatorCamera,Za as SphereCollider,wg as SphereIntersection,oa as SplineContainer,lo as SplineData,U0 as SplineUtils,An as SplineWalker,zo as Sprite,ul as SpriteData,ci as SpriteRenderer,dl as SpriteSheet,$M as StateMachineBehaviour,vf as StreamEndedEvent,Fx as StreamReceivedEvent,xp as SubEmitterSystem,p0 as SyncedCamera,In as SyncedRoom,Cn as SyncedTransform,uy as TapGestureTrigger,sp as TeleportTarget,f0 as TestRunner,GI as TestSceneUtils,y0 as TestSimulateUserData,Bt as Text,My as TextBuilder,hp as TextExtension,zt as TextureSheetAnimationModule,ro as TiltShiftEffect,Zv as Time,Hs as ToneMappingEffect,kl as TrackHandler,Bi as TrackType,Fe as TrailModule,Ne as TransformData,aa as TransformGizmo,Dt as TriggerBuilder,er as TriggerModel,C as TypeStore,mf as UIRaycastUtils,eh as UIRootComponent,Kf as USDDocument,it as USDObject,bw as USDWriter,oo as USDZExporter,_w as USDZExporter$1,fl as USDZText,Ly as USDZUIExtension,Tx as UriSerializer,zc as UsageMarker,YO as UserJoinedOrLeftRoomModel,yn as VERSION,ay as VariantAction,Ve as VelocityOverLifetimeModule,Ry as VerticalLayoutGroup,ht as VideoPlayer,zi as ViewBox,_s as ViewDevice,ta as Vignette,Qc as VisibilityAction,ks as Voip,Pl as Volume,B as VolumeParameter,wp as VolumeProfile,iM as WaitForFrames,Vv as WaitForPromise,Xg as WaitForSeconds,is as Watch,Uh as WebARCameraBackground,Ui as WebARSessionRoot,rp as WebXR,tr as WebXRButtonFactory,Nh as WebXRImageTracking,Zo as WebXRImageTrackingModel,Ko as WebXRPlaneTracking,Vl as WebXRTrackedImage,Yo as XRControllerFollow,Uo as XRControllerModel,Ei as XRControllerMovement,Ji as XRFlag,Zp as XRRig,Jt as XRState,Zn as XRStateFlag,J1 as __Ignore,pk as __internalNotifyObjectDestroyed,So as activeInHierarchyFieldName,Im as addAttributeChangeCallback,wn as addComponent,xT as addCustomExtensionPlugin,Sr as addNewComponent,Id as addPatch,iu as apply,BM as applyHMRChanges,Cv as applyPrototypeExtensions,av as beginListenDestroy,hv as beginListenInstantiate,cg as binaryIdentifierCasts,wM as build_scene_functions,fr as builtinComponentKeyName,I0 as calculateProgress01,GP as clearMessages,aR as colorSerializer,mv as compareAssociation,Ou as componentSerializer,Jb as copyTexture,wx as createMotion,ni as debugNet,rc as debugOwner,Cw as decompressGpuTexture,Ql as deepClone,Un as delay,Yl as delayForFrames,eu as deserializeObject,Ci as destroy,Mv as destroyComponentInstance,Xx as determineMimeTypeFromExtension,Pe as disposeObjectResources,Yn as disposeStream,oc as editorGuidKeyName,pr as enableSpatialConsole,cR as euler,pR as eventListSerializer,QI as exportAsGLTF,$g as findByGuid,Ua as findObjectOfType,Ev as findObjectsOfType,Sg as findResourceUsers,Px as fitCamera,t_ as fitObjectIntoVolume,kr as foreachComponent,au as foreachComponentEnumerator,hO as forward,Ib as generateQRCode,cv as generateSeed,$t as getBoundingBox,Nb as getCameraController,Cr as getComponent,_c as getComponentInChildren,vc as getComponentInParent,bc as getComponents,za as getComponentsInChildren,tu as getComponentsInParent,mw as getFormattedDate,Ct as getIconElement,Jg as getIconTexture,bn as getLoader,yc as getOrAddComponent,x as getParam,pO as getParentHierarchyPath,SP as getPath,$O as getPeerOptions,O_ as getPeerjsInstance,gk as getResourceUserCount,$b as getTempColor,ti as getTempQuaternion,z as getTempVector,ql as getUrlParams,e_ as getVisibleInCustomShadowRendering,Xb as getWorldDirection,Xm as getWorldEuler,K as getWorldPosition,be as getWorldQuaternion,Rd as getWorldRotation,He as getWorldScale,vs as hasCommercialLicense,Pc as hasIndieLicense,Cu as hasPointerEventComponent,Gn as hasProLicense,r_ as hideDebugConsole,Pw as imageToCanvas,Wa as instantiate,ow as invokeLoadedImportPluginHooks,f_ as invokeXRSessionEnd,g_ as invokeXRSessionStart,Av as isActiveInHierarchy,Na as isActiveSelf,RP as isAndroidDevice,Kb as isAnimationAction,Lx as isComponent,_P as isDebugMode,PP as isDesktop,Or as isDestroyed,A as isDevEnvironment,uk as isDisposed,qI as isExporting,Ix as isGLTFModel,wb as isHostedOnGlitch,hf as isHotReloadEnabled,jM as isHotReloading,kP as isIPad,tx as isIconElement,$i as isLocalNetwork,EP as isMacOS,OP as isMobileDevice,TP as isMozillaXR,LP as isQuest,q_ as isResourceTrackingEnabled,IP as isSafari,ou as isUsingInstancing,AP as isiOS,MP as isiPad,EI as loadAsset,f1 as loadPMREM,A0 as loadSync,Td as logHierarchy,iO as lookAtInverse,Kl as lookAtObject,nO as lookAtScreenPoint,xP as makeId,Rb as makeIdFromRandomWords,en as makeNameSafe,Iv as markAsInstancedRendered,jP as microphonePermissionsGranted,bP as nameof,Pb as nameofFactory,Mx as objectSerializer,DO as offXRSessionEnd,jO as offXRSessionStart,IM as onAfterRender,AM as onBeforeRender,TM as onClear,EM as onDestroy,cx as onInitialized,bu as onStart,hx as onUpdate,sg as onXRSessionEnd,jd as onXRSessionStart,z1 as parseSync,i_ as placeOnSurface,Zm as postprocessFBXMaterials,tR as prefix,Ob as pushState,wP as randomNumber,hg as registerBinaryType,gu as registerComponent,$f as registerComponentExtension,rn as registerCustomEffectType,Hf as registerExportExtensions,Wu as registerExtensions,fx as registerHotReloadType,ig as registerLoader,uv as registerPrefabProvider,Pv as registerPrototypeExtensions,jg as registerType,Eb as relativePathPrefix,Lm as removeAttributeChangeCallback,Wg as removeComponent,wT as removeCustomImportExtensionType,IO as removePatch,us as resolveUrl,Tb as sanitizeString,A1 as saveImage,mI as screenshot,k0 as screenshot2,Ag as sendDestroyed,u as serializable,bv as serializeObject,Ye as serializeable,xc as setActive,Db as setAllowBalloonMessages,VP as setAllowOverlayMessages,kd as setAutoFitEnabled,Vm as setCameraController,jv as setDestroyed,xO as setDevEnvironment,Q_ as setDisposable,Va as setDontDestroy,Tm as setOrAddParamsToUrl,vP as setParam,Xl as setParamWithoutReload,HO as setPeerOptions,dk as setResourceTrackingEnabled,Em as setState,Ym as setVisibleInCustomShadowRendering,Qm as setWorldEuler,mt as setWorldPosition,dr as setWorldPositionXYZ,fn as setWorldQuaternion,qm as setWorldQuaternionXYZW,Zb as setWorldRotation,Jl as setWorldRotationXYZ,ka as setWorldScale,ic as showBalloonError,Te as showBalloonMessage,ge as showBalloonWarning,eg as showDebugConsole,tO as slerp,gc as syncDestroy,yy as syncField,Ig as syncInstantiate,mO as textureToCanvas,Ab as toSourceId,C_ as tryCastBinary,Yx as tryDetermineMimetypeFromBinary,Qx as tryDetermineMimetypeFromURL,Pa as tryFindObject,P_ as tryGetGuid,yx as unregisterHotReloadType,Am as unwatchWrite,Vb as useForAutoFit,Pt as validate,Sd as watchWrite};
|
|
1652
|
+
`),this.#n.innerHTML=this.#e.innerHTML,this.#n.style.cssText="display: flex; align-items: center; justify-content: center;",this.#e.innerHTML=this.#n.outerHTML,this.#t.innerHTML=this.#e.outerHTML,this.#t.prepend(this.#o),pu(ef,{element:this.#t}),this.#s?.disconnect(),this.#s??=new MutationObserver(()=>this.#l()),this.#s.observe(this.#e,{attributes:!0}),F0&&console.log("Needle Button updated")}#l(){this.#e&&(this.#e.style.display==="none"?this.style.display="none":this.style.display==="none"&&(this.style.display=""))}#r=e=>{F0&&console.log("Needle Button clicked"),!e.defaultPrevented&&this.#e&&this.#e.click()}}typeof window<"u"&&!window.customElements.get(Q1)&&window.customElements.define(Q1,Y1);const Zh=x("debugavatar");class z0{root;head;leftHand;rigthHand;get isValid(){return this.head!==null&&this.head!==void 0}constructor(e,t,i,n){this.root=e,this.head=t,this.leftHand=i,this.rigthHand=n,this.root?.traverse(s=>s.layers.set(2))}}class Z1{avatarRegistryUrl=null;async getOrCreateNewAvatarInstance(e,t){if(!t)return console.error("Can not create avatar: failed to provide id or root object"),null;let i=null;if(typeof t=="string"){if(i=await this.loadAvatar(e,t),!i){const s=new jn;i=w.instantiate(Pa(t,e.scene),s)}}else i=t;if(!i)return null;const n=this.findAvatar(i);return n.isValid?(Zh&&console.log("[Custom Avatar] valid config",t,Zh?n:""),n):(console.warn("[Custom Avatar] config isn't valid",t,Zh?n:""),null)}async loadAvatar(e,t){if(console.assert(t!=null&&typeof t=="string","Avatar id must not be null"),t.length<=0||!t)return null;if(Zh&&console.log("[Custom Avatar] "+t+", loading..."),t.endsWith(".glb")||(t+=".glb"),this.avatarRegistryUrl===null){const n=await fetch("./"+t);let s=null;if(n.ok){const r=await n.blob();r&&(s=await r.arrayBuffer())}return s?(await bn().parseSync(e,s,null,0))?.scene??null:null}const i=new xo;return cf(i,e),new Promise((n,s)=>{const r=this.avatarRegistryUrl+"/"+t;i.load(r,async a=>{await bn().createBuiltinComponents(e,r,a,null,void 0),n(a.scene)},a=>{Zh&&console.log("[Custom Avatar] "+a.loaded/a.total*100+"% loaded of "+a.total/1024+"kB")},a=>{console.error("[Custom Avatar] Error when loading: "+a),n(null)})})}cacheModel(e,t){}findAvatar(e){const t=e;let i=t;i.children.length==1&&(i=e.children[0]);let n=this.findAvatarPart(i,["head"]);const s=this.findAvatarPart(i,["left","hand"]),r=this.findAvatarPart(i,["right","hand"]);if(!n){n=t;const a=new b;new bi().setFromObject(n).getSize(a);const l=Math.max(a.x,a.y,a.z);console.warn("[Custom Avatar] Normalizing head scale, it's too big: "+l+" meters! Should be < 0.3m"),l>.3&&n.scale.multiplyScalar(1/l*.3)}return new z0(t,n,s,r)}findAvatarPart(e,t){const i=e.name.toLowerCase();let n=!0;for(const s of t){if(!n)break;i.indexOf(s)===-1&&(n=!1)}if(n)return e;if(e.children)for(const s of e.children){const r=this.findAvatarPart(s,t);if(r)return r}return null}handleCustomAvatarErrors(e){if(!e.ok)throw Error(e.statusText);return e}}class K1{get extensionName(){return"DocumentExtension"}onAfterBuildDocument(e){}}class J1{}const KI=Object.freeze(Object.defineProperty({__proto__:null,ActionBuilder:me,ActionCollection:Lw,ActionModel:fi,AlignmentConstraint:Mc,Animation:Lt,AnimationCurve:hh,AnimationExtension:ep,AnimationTrackHandler:Ah,Animator:ft,AnimatorController:hn,Antialiasing:gh,Attractor:Sl,AudioExtension:pa,AudioListener:Eo,AudioSource:Mi,AudioTrackHandler:ss,Avatar:Ls,AvatarBlink_Simple:jr,AvatarEyeLook_Rotation:Cf,AvatarLoader:Z1,AvatarMarker:Le,AvatarModel:z0,Avatar_Brain_LookAt:jc,Avatar_MouthShapes:Dc,Avatar_MustacheShake:wf,Avatar_POI:Lr,AxesHelper:Ya,BaseUIComponent:ln,BasicIKConstraint:Of,BehaviorExtension:wy,BehaviorModel:Et,BloomEffect:Cp,BoxCollider:Lu,BoxGizmo:qr,BoxHelperComponent:wt,Button:Xo,CallInfo:To,Camera:si,CameraTargetReachedEvent:Lc,Canvas:yl,CanvasGroup:zs,CapsuleCollider:Ao,ChangeMaterialOnClick:cy,ChangeTransformOnClick:Wr,CharacterController:Dr,CharacterControllerInput:Lo,ChromaticAberration:fh,ClickThrough:qp,Collider:ai,ColorAdjustments:Gs,ColorBySpeedModule:xl,ColorOverLifetimeModule:yp,ContactShadows:Fc,ControlTrackHandler:Up,CursorFollow:Bh,CustomBranding:Gr,Deletable:Ef,DeleteBox:or,DepthOfField:Tn,DeviceFlag:ju,DocumentExtension:K1,DragControls:zr,DropListener:jo,Duplicatable:Bf,EffectWrapper:bh,EmissionModule:$o,EmphasizeOnClick:cl,EnvironmentScene:Hp,EventList:he,EventListEvent:Pu,EventSystem:ei,EventTrigger:zu,FieldWithDefault:uw,FixedJoint:Uy,Fog:bl,GltfExport:Zf,GltfExportBox:Qf,Gradient:Qr,Graphic:nh,GraphicRaycaster:Mu,GridHelper:_l,GridLayoutGroup:Ey,GroundProjectedEnv:qn,GroupActionModel:Vr,HideOnStart:dn,HingeJoint:rh,HorizontalLayoutGroup:Ty,get HoverAnimation(){return uo},Image:Ml,InheritVelocityModule:qy,InputField:x0,InstanceHandle:ba,InstancingHandler:ma,Interactable:Tf,Keyframe:ui,LODGroup:lh,LODModel:vl,Light:di,LimitVelocityOverLifetimeModule:lt,LogStats:Rf,LookAt:w0,LookAtConstraint:Er,MainModule:Ft,MarkerTrackHandler:zp,MaskableGraphic:oh,MeshCollider:Ms,MeshRenderer:Wc,MinMaxCurve:Q,MinMaxGradient:Yr,NeedleMenu:io,NestedGltf:ch,Networking:$y,NoiseModule:_e,ObjectRaycaster:ki,OffsetConstraint:Xr,OpenURL:Rl,OrbitControls:fe,Outline:gl,Padding:Hr,ParticleBurst:fp,ParticleSubEmitter:Xy,ParticleSystem:ph,ParticleSystemRenderer:sn,PhysicsExtension:Sy,PixelationEffect:_h,PlayAnimationOnClick:qc,PlayAudioOnClick:As,PlayableDirector:ra,PlayerColor:Nl,PointerEventData:rd,PostProcessingHandler:d0,PreliminaryAction:hl,PreliminaryTrigger:Xc,RawImage:Wp,Rect:Nw,RectTransform:Mn,ReflectionProbe:Vc,RegisteredAnimationInfo:sr,RemoteSkybox:Ep,Renderer:Ti,RendererLightmap:$u,Rigidbody:Ze,RotationBySpeedModule:on,RotationOverLifetimeModule:Rn,SceneSwitcher:Xe,ScreenCapture:Xs,ScreenSpaceAmbientOcclusion:Ho,ScreenSpaceAmbientOcclusionN8:En,ScrollFollow:Qo,SetActiveOnClick:hy,ShadowCatcher:Ph,ShapeModule:Gy,SharpeningEffect:xh,SignalAsset:Fp,SignalReceiver:Eh,SignalReceiverEvent:Th,SignalTrackHandler:Ih,Size:Uw,SizeBySpeedModule:pi,SizeOverLifetimeModule:Zr,SkinnedMeshRenderer:Xf,SmoothFollow:Ip,SpatialGrabRaycaster:ua,SpatialHtml:jh,SpatialTrigger:Lp,SpatialTriggerReceiver:ao,SpectatorCamera:jp,SphereCollider:Za,SplineContainer:oa,SplineData:lo,SplineWalker:An,Sprite:zo,SpriteData:ul,SpriteRenderer:ci,SpriteSheet:dl,SubEmitterSystem:xp,SyncedCamera:p0,SyncedRoom:In,SyncedTransform:Cn,TapGestureTrigger:uy,TeleportTarget:sp,TestRunner:f0,TestSimulateUserData:y0,Text:Bt,TextBuilder:My,TextExtension:hp,TextureSheetAnimationModule:zt,TiltShiftEffect:ro,ToneMappingEffect:Hs,TrailModule:Fe,TransformData:Ne,TransformGizmo:aa,TriggerBuilder:Dt,TriggerModel:er,UIRaycastUtils:mf,UIRootComponent:eh,USDZExporter:oo,USDZText:fl,USDZUIExtension:Ly,UsageMarker:zc,VariantAction:ay,VelocityOverLifetimeModule:Ve,VerticalLayoutGroup:Ry,VideoPlayer:ht,get ViewBox(){return zi},Vignette:ta,VisibilityAction:Qc,Voip:ks,Volume:Pl,VolumeParameter:B,VolumeProfile:wp,WebARCameraBackground:Uh,WebARSessionRoot:Ui,WebXR:rp,WebXRImageTracking:Nh,WebXRImageTrackingModel:Zo,WebXRPlaneTracking:Ko,WebXRTrackedImage:Vl,XRControllerFollow:Yo,XRControllerModel:Uo,XRControllerMovement:Ei,XRFlag:Ji,XRRig:Zp,XRState:Jt,__Ignore:J1},Symbol.toStringTag,{value:"Module"})),Kh=x("debugmissingcamera");ue.registerCallback(de.MissingCamera,o=>{Kh&&console.warn("Creating missing camera");const e=o.context.scene,t=new re;t.name="Default Fallback Camera",e.add(t);const i=new si;if(i.sourceId=o.files?.[0]?.src??"unknown",i.fieldOfView=35,o.context.domElement.getAttribute("transparent")!=null)i.clearFlags=Ir.Uninitialized;else if(o.context.domElement.getAttribute("background-image")?.length||o.context.lightmaps.tryGetSkybox(i.sourceId))i.clearFlags=Ir.Skybox;else{if(i.clearFlags=Ir.SolidColor,!o.context.domElement.getAttribute("background-color")){let s="#efefef";typeof window!==void 0&&window.matchMedia("(prefers-color-scheme: dark)").matches&&(s="#1f1f1f"),e.background=new ne(s)}if(!e.environment){const s=new kC(o.context.renderer),r=new Hp("neutral");e.environment=s.fromScene(r,.025).texture}}const n=Sr(t,i,!0);return t.position.x=0,t.position.y=1,t.position.z=2,o.context.domElement?.cameraControls!=!1&&eS(o.context,n),n}),ue.registerCallback(de.ContextCreated,o=>{if(!o.context.mainCamera){Kh&&console.log("Will not auto-fit because a default camera exists");return}if(o.context.domElement?.cameraControls==!0){if(Nb(o.context.mainCamera)?.isCameraController==!0){Kh&&console.log("Will not auto-fit because a camera controller exists");return}eS(o.context)}});function eS(o,e){e=e??o.mainCameraComponent;const t=e?.gameObject;if(Kh&&console.log("Creating default camera controls",e?.name),t){const i=yc(t,fe);i.sourceId=e?.sourceId??"unknown";const n=o.domElement.getAttribute("auto-rotate");i.autoRotate=n!="0"&&n?.toLowerCase()!="false";const s=Number.parseFloat(n||".5");i.autoRotateSpeed=isNaN(s)?.5:s,Kh&&console.log("Auto-rotate",i.autoRotate,"speed:",i.autoRotateSpeed);const r=o.domElement.getAttribute("auto-fit");i.autoFit=r!=="0"&&r?.toLowerCase()!="false",i.autoTarget=!0}else console.warn("Missing camera object, can not add orbit controls")}ue.registerCallback(de.ContextCreated,o=>{const e=o.context.domElement.getAttribute("autoplay");if(e!==void 0&&(e===""||e==="true"||e==="1")&&o.files)for(const t of o.files)w.foreachComponent(t.file.scene,i=>{if(i.enabled!==!1){if(i instanceof Lt&&i.playAutomatically||i instanceof ft||i instanceof ra&&i.playOnAwake===!0)return!0;if(i instanceof Lt)return i.playAutomatically=!0,!0;if(i instanceof ra)return i.playOnAwake=!0,!0}},!0)!==!0&&bs.autoplayAnimations(t.file)});var U0;(o=>{function e(t,i=!1,n=.75){const s=new oa,r=1-j.clamp(n,0,1);return t.forEach((a,l)=>{const c=new b;l<t.length-1?c.subVectors(t[l+1],a).normalize().multiplyScalar(r):i&&t.length>1&&c.subVectors(t[0],a).normalize().multiplyScalar(r);const h=new lo;h.position.copy(a),h.tangentIn.copy(c),h.tangentOut.copy(c),s.addKnot(h)}),s.closed=i,s}o.createFromPoints=e})(U0||(U0={}));class JI extends rP{constructor(){super(new Worker(URL.createObjectURL(new Blob([`import '${new URL("./generateMeshBVH.worker-2qGLkQjg.js",import.meta.url).toString()}';`],{type:"text/javascript"})),{type:"module"})),this.name="GenerateMeshBVHWorker"}runTask(e,t,i={}){return new Promise((n,s)=>{if(t.getAttribute("position").isInterleavedBufferAttribute||t.index&&t.index.isInterleavedBufferAttribute)throw new Error("GenerateMeshBVHWorker: InterleavedBufferAttribute are not supported for the geometry attributes.");e.onerror=c=>{s(new Error(`[GenerateMeshBVHWorker] ${c.message||"Unknown error. Please check the server console. If you're using vite try adding 'three-mesh-bvh' to 'optimizeDeps.exclude' in your vite.config.js"}`))},e.onmessage=c=>{const{data:h}=c;if(h.error)s(new Error(h.error)),e.onmessage=null;else if(h.serialized){const{serialized:d,position:p}=h,m=aP.deserialize(d,t,{setIndex:!1}),f=Object.assign({setBoundingBox:!0},i);if(t.attributes.position.array=p,d.index)if(t.index)t.index.array=d.index;else{const g=new pt(d.index,1,!1);t.setIndex(g)}f.setBoundingBox&&(t.boundingBox=m.getBoundingBox(new bi)),i.onProgress&&i.onProgress(h.progress),n(m),e.onmessage=null}else i.onProgress&&i.onProgress(h.progress)};const r=t.index?t.index.array:null,a=t.attributes.position.array,l=[a];r&&l.push(r),e.postMessage({index:r,position:a,options:{...i,onProgress:null,includedProgressCallback:!!i.onProgress,groups:[...t.groups]}},l.map(c=>c.buffer).filter(c=>typeof SharedArrayBuffer>"u"||!(c instanceof SharedArrayBuffer)))})}}const eL=Object.freeze(Object.defineProperty({__proto__:null,GenerateMeshBVHWorker:JI},Symbol.toStringTag,{value:"Module"}));export{TR as $physicsKey,me as ActionBuilder,Lw as ActionCollection,fi as ActionModel,zv as Addressables,Mc as AlignmentConstraint,Ha as AmbientMode,Lt as Animation,hh as AnimationCurve,ep as AnimationExtension,Ah as AnimationTrackHandler,bs as AnimationUtils,ft as Animator,Ss as AnimatorConditionMode,hn as AnimatorController,df as AnimatorControllerParameterType,Rc as AnimatorStateInfo,gh as Antialiasing,Ln as Application,H_ as AssetDatabase,ie as AssetReference,Sl as Attractor,pa as AudioExtension,Eo as AudioListener,Mi as AudioSource,ss as AudioTrackHandler,Ls as Avatar,jr as AvatarBlink_Simple,Cf as AvatarEyeLook_Rotation,Z1 as AvatarLoader,Le as AvatarMarker,z0 as AvatarModel,jc as Avatar_Brain_LookAt,Dc as Avatar_MouthShapes,wf as Avatar_MustacheShake,Lr as Avatar_POI,Ga as Axes,Ya as AxesHelper,tg as BUILD_TIME,ln as BaseUIComponent,Of as BasicIKConstraint,wy as BehaviorExtension,Et as BehaviorModel,Mr as BlobStorage,Cp as BloomEffect,Lu as BoxCollider,qr as BoxGizmo,wt as BoxHelperComponent,Xo as Button,Dn as ButtonsFactory,zx as CallDirection,To as CallInfo,si as Camera,Lc as CameraTargetReachedEvent,yl as Canvas,zs as CanvasGroup,Ao as CapsuleCollider,cy as ChangeMaterialOnClick,Wr as ChangeTransformOnClick,Dr as CharacterController,Lo as CharacterControllerInput,fh as ChromaticAberration,xi as CircularBuffer,Ir as ClearFlags,qp as ClickThrough,co as ClipExtrapolation,ai as Collider,Dx as Collision,Su as CollisionDetectionMode,Gs as ColorAdjustments,xl as ColorBySpeedModule,yp as ColorOverLifetimeModule,FM as Component,R as Component$1,qd as ComponentLifecycleEvents,KI as Components,T_ as ConnectionEvents,jx as ContactPoint,Fc as ContactShadows,N as Context,SM as ContextArgs,de as ContextEvent,ue as ContextRegistry,Up as ControlTrackHandler,Bh as CursorFollow,Gr as CustomBranding,Me as CustomShader,du as DefaultReflectionMode,Ef as Deletable,or as DeleteBox,Tn as DepthOfField,ju as DeviceFlag,G as DeviceUtilities,K1 as DocumentExtension,zr as DragControls,If as DragMode,jo as DropListener,Bf as Duplicatable,bh as EffectWrapper,$o as EmissionModule,cl as EmphasizeOnClick,ld as EngineLoadingView,Hp as EnvironmentScene,he as EventList,Pu as EventListEvent,ei as EventSystem,zu as EventTrigger,uw as FieldWithDefault,ya as FileReference,Nv as FileReferenceSerializer,JR as FileSpawnModel,qx as File_Event,Uy as FixedJoint,bl as Fog,xe as FrameEvent,Ad as GENERATOR,w as GameObject,F as Gizmos,Zf as GltfExport,Qf as GltfExportBox,Qr as Gradient,nh as Graphic,Mu as GraphicRaycaster,ir as Graphics,_l as GridHelper,Ey as GridLayoutGroup,qn as GroundProjectedEnv,Vr as GroupActionModel,Eu as HideFlags,dn as HideOnStart,rh as HingeJoint,Ty as HorizontalLayoutGroup,Ck as HostData,uo as HoverAnimation,Ml as Image,fa as ImageReference,Uv as ImageReferenceSerializer,qy as InheritVelocityModule,y_ as Input,ii as InputEventQueue,Ee as InputEvents,x0 as InputField,ba as InstanceHandle,ma as InstancingHandler,cn as InstancingUtil,rv as InstantiateEvent,At as InstantiateIdProvider,jn as InstantiateOptions,Tf as Interactable,zh as InternalScreenshotUtils,XO as JoinedRoomResponse,BO as KeyEventArgs,ui as Keyframe,lh as LODGroup,vl as LODModel,QO as LeftRoomResponse,di as Light,Qv as LightData,lt as LimitVelocityOverLifetimeModule,BI as LoadingElementOptions,Rf as LogStats,wi as LogType,w0 as LookAt,Er as LookAtConstraint,T as MODULES,Ft as MainModule,zp as MarkerTrackHandler,b0 as MarkerType,oh as MaskableGraphic,j as Mathf,Ms as MeshCollider,Wc as MeshRenderer,Q as MinMaxCurve,Yr as MinMaxGradient,pc as NEEDLE_ENGINE_FEATURE_FLAGS,sc as NEKeyboardEvent,Co as NEPointerEvent,Y1 as NeedleButtonElement,jf as NeedleEngineModelLoader,L0 as NeedleEngineWebComponent,io as NeedleMenu,Ld as NeedlePatchesKey,rg as NeedleXRController,Y as NeedleXRSession,I_ as NeedleXRSync,z_ as NeedleXRUtils,ch as NestedGltf,A_ as NetworkConnection,Qn as NetworkedStreamEvents,ad as NetworkedStreams,$y as Networking,lv as NewInstanceModel,_e as NoiseModule,ki as ObjectRaycaster,_r as ObjectUtils,Xr as OffsetConstraint,Pd as OneEuroFilter,Nm as OneEuroFilterXYZ,Rl as OpenURL,fe as OrbitControls,gl as Outline,E_ as OwnershipEvent,ug as OwnershipModel,Ma as PUBLIC_KEY,Hr as Padding,fp as ParticleBurst,Xy as ParticleSubEmitter,ph as ParticleSystem,$s as ParticleSystemBaseBehaviour,sn as ParticleSystemRenderer,gp as ParticleSystemShapeType,os as PeerHandle,M_ as PeerNetworking,zl as Physics,Sy as PhysicsExtension,yt as PhysicsMaterialCombine,_h as PixelationEffect,qc as PlayAnimationOnClick,As as PlayAudioOnClick,ra as PlayableDirector,Nl as PlayerColor,On as PlayerState,Fw as PlayerStateEvent,by as PlayerSync,$v as PlayerView,Hv as PlayerViewManager,rd as PointerEventData,Dd as PointerType,tt as PostProcessingEffect,ct as PostProcessingEffectOrder,d0 as PostProcessingHandler,hl as PreliminaryAction,Xc as PreliminaryTrigger,Ts as PreviewHelper,br as PrimitiveType,ae as Progress,Dm as PromiseAllWithErrors,jm as PromiseErrorResult,oe as RGBAColor,Wl as RapierPhysics,Wp as RawImage,fs as RaycastOptions,Nw as Rect,Mn as RectTransform,Vc as ReflectionProbe,sr as RegisteredAnimationInfo,Ep as RemoteSkybox,fo as RenderTexture,Rx as RenderTextureSerializer,Ti as Renderer,Xv as RendererData,$u as RendererLightmap,Ze as Rigidbody,qe as RigidbodyConstraints,te as RoomEvents,on as RotationBySpeedModule,Rn as RotationOverLifetimeModule,Nu as SceneLightSettings,Xe as SceneSwitcher,Xs as ScreenCapture,Ho as ScreenSpaceAmbientOcclusion,En as ScreenSpaceAmbientOcclusionN8,Qo as ScrollFollow,_n as SendQueue,Ug as SerializationContext,hy as SetActiveOnClick,Ph as ShadowCatcher,Gy as ShapeModule,Bx as ShapeOverlapResult,xh as SharpeningEffect,Fp as SignalAsset,Eh as SignalReceiver,Th as SignalReceiverEvent,Ih as SignalTrackHandler,Uw as Size,pi as SizeBySpeedModule,Zr as SizeOverLifetimeModule,Xf as SkinnedMeshRenderer,Ip as SmoothFollow,ua as SpatialGrabRaycaster,jh as SpatialHtml,Lp as SpatialTrigger,ao as SpatialTriggerReceiver,jp as SpectatorCamera,Za as SphereCollider,wg as SphereIntersection,oa as SplineContainer,lo as SplineData,U0 as SplineUtils,An as SplineWalker,zo as Sprite,ul as SpriteData,ci as SpriteRenderer,dl as SpriteSheet,$M as StateMachineBehaviour,vf as StreamEndedEvent,Fx as StreamReceivedEvent,xp as SubEmitterSystem,p0 as SyncedCamera,In as SyncedRoom,Cn as SyncedTransform,uy as TapGestureTrigger,sp as TeleportTarget,f0 as TestRunner,GI as TestSceneUtils,y0 as TestSimulateUserData,Bt as Text,My as TextBuilder,hp as TextExtension,zt as TextureSheetAnimationModule,ro as TiltShiftEffect,Zv as Time,Hs as ToneMappingEffect,kl as TrackHandler,Bi as TrackType,Fe as TrailModule,Ne as TransformData,aa as TransformGizmo,Dt as TriggerBuilder,er as TriggerModel,C as TypeStore,mf as UIRaycastUtils,eh as UIRootComponent,Kf as USDDocument,it as USDObject,bw as USDWriter,oo as USDZExporter,_w as USDZExporter$1,fl as USDZText,Ly as USDZUIExtension,Tx as UriSerializer,zc as UsageMarker,YO as UserJoinedOrLeftRoomModel,yn as VERSION,ay as VariantAction,Ve as VelocityOverLifetimeModule,Ry as VerticalLayoutGroup,ht as VideoPlayer,zi as ViewBox,_s as ViewDevice,ta as Vignette,Qc as VisibilityAction,ks as Voip,Pl as Volume,B as VolumeParameter,wp as VolumeProfile,iM as WaitForFrames,Vv as WaitForPromise,Xg as WaitForSeconds,is as Watch,Uh as WebARCameraBackground,Ui as WebARSessionRoot,rp as WebXR,tr as WebXRButtonFactory,Nh as WebXRImageTracking,Zo as WebXRImageTrackingModel,Ko as WebXRPlaneTracking,Vl as WebXRTrackedImage,Yo as XRControllerFollow,Uo as XRControllerModel,Ei as XRControllerMovement,Ji as XRFlag,Zp as XRRig,Jt as XRState,Zn as XRStateFlag,J1 as __Ignore,pk as __internalNotifyObjectDestroyed,So as activeInHierarchyFieldName,Im as addAttributeChangeCallback,wn as addComponent,xT as addCustomExtensionPlugin,Sr as addNewComponent,Id as addPatch,iu as apply,BM as applyHMRChanges,Cv as applyPrototypeExtensions,av as beginListenDestroy,hv as beginListenInstantiate,cg as binaryIdentifierCasts,wM as build_scene_functions,fr as builtinComponentKeyName,I0 as calculateProgress01,GP as clearMessages,aR as colorSerializer,mv as compareAssociation,Ou as componentSerializer,Jb as copyTexture,wx as createMotion,ni as debugNet,rc as debugOwner,Cw as decompressGpuTexture,Ql as deepClone,Un as delay,Yl as delayForFrames,eu as deserializeObject,Ci as destroy,Mv as destroyComponentInstance,Xx as determineMimeTypeFromExtension,Pe as disposeObjectResources,Yn as disposeStream,oc as editorGuidKeyName,pr as enableSpatialConsole,cR as euler,pR as eventListSerializer,QI as exportAsGLTF,$g as findByGuid,Ua as findObjectOfType,Ev as findObjectsOfType,Sg as findResourceUsers,Px as fitCamera,t_ as fitObjectIntoVolume,kr as foreachComponent,au as foreachComponentEnumerator,hO as forward,Ib as generateQRCode,cv as generateSeed,$t as getBoundingBox,Nb as getCameraController,Cr as getComponent,_c as getComponentInChildren,vc as getComponentInParent,bc as getComponents,za as getComponentsInChildren,tu as getComponentsInParent,mw as getFormattedDate,Ct as getIconElement,Jg as getIconTexture,bn as getLoader,yc as getOrAddComponent,x as getParam,pO as getParentHierarchyPath,SP as getPath,$O as getPeerOptions,O_ as getPeerjsInstance,gk as getResourceUserCount,$b as getTempColor,ti as getTempQuaternion,z as getTempVector,ql as getUrlParams,e_ as getVisibleInCustomShadowRendering,Xb as getWorldDirection,Xm as getWorldEuler,K as getWorldPosition,be as getWorldQuaternion,Rd as getWorldRotation,He as getWorldScale,vs as hasCommercialLicense,Pc as hasIndieLicense,Cu as hasPointerEventComponent,Gn as hasProLicense,r_ as hideDebugConsole,Pw as imageToCanvas,Wa as instantiate,ow as invokeLoadedImportPluginHooks,f_ as invokeXRSessionEnd,g_ as invokeXRSessionStart,Av as isActiveInHierarchy,Na as isActiveSelf,RP as isAndroidDevice,Kb as isAnimationAction,Lx as isComponent,_P as isDebugMode,PP as isDesktop,Or as isDestroyed,A as isDevEnvironment,uk as isDisposed,qI as isExporting,Ix as isGLTFModel,wb as isHostedOnGlitch,hf as isHotReloadEnabled,jM as isHotReloading,kP as isIPad,tx as isIconElement,$i as isLocalNetwork,EP as isMacOS,OP as isMobileDevice,TP as isMozillaXR,LP as isQuest,q_ as isResourceTrackingEnabled,IP as isSafari,ou as isUsingInstancing,AP as isiOS,MP as isiPad,EI as loadAsset,f1 as loadPMREM,A0 as loadSync,Td as logHierarchy,iO as lookAtInverse,Kl as lookAtObject,nO as lookAtScreenPoint,xP as makeId,Rb as makeIdFromRandomWords,en as makeNameSafe,Iv as markAsInstancedRendered,jP as microphonePermissionsGranted,bP as nameof,Pb as nameofFactory,Mx as objectSerializer,DO as offXRSessionEnd,jO as offXRSessionStart,IM as onAfterRender,AM as onBeforeRender,TM as onClear,EM as onDestroy,cx as onInitialized,bu as onStart,hx as onUpdate,sg as onXRSessionEnd,jd as onXRSessionStart,z1 as parseSync,i_ as placeOnSurface,Zm as postprocessFBXMaterials,tR as prefix,Ob as pushState,wP as randomNumber,hg as registerBinaryType,gu as registerComponent,$f as registerComponentExtension,rn as registerCustomEffectType,Hf as registerExportExtensions,Wu as registerExtensions,fx as registerHotReloadType,ig as registerLoader,uv as registerPrefabProvider,Pv as registerPrototypeExtensions,jg as registerType,Eb as relativePathPrefix,Lm as removeAttributeChangeCallback,Wg as removeComponent,wT as removeCustomImportExtensionType,IO as removePatch,us as resolveUrl,Tb as sanitizeString,A1 as saveImage,mI as screenshot,k0 as screenshot2,Ag as sendDestroyed,u as serializable,bv as serializeObject,Ye as serializeable,xc as setActive,Db as setAllowBalloonMessages,VP as setAllowOverlayMessages,kd as setAutoFitEnabled,Vm as setCameraController,jv as setDestroyed,xO as setDevEnvironment,Q_ as setDisposable,Va as setDontDestroy,Tm as setOrAddParamsToUrl,vP as setParam,Xl as setParamWithoutReload,HO as setPeerOptions,dk as setResourceTrackingEnabled,Em as setState,Ym as setVisibleInCustomShadowRendering,Qm as setWorldEuler,mt as setWorldPosition,dr as setWorldPositionXYZ,fn as setWorldQuaternion,qm as setWorldQuaternionXYZW,Zb as setWorldRotation,Jl as setWorldRotationXYZ,ka as setWorldScale,ic as showBalloonError,Te as showBalloonMessage,ge as showBalloonWarning,eg as showDebugConsole,tO as slerp,gc as syncDestroy,yy as syncField,Ig as syncInstantiate,mO as textureToCanvas,Ab as toSourceId,C_ as tryCastBinary,Yx as tryDetermineMimetypeFromBinary,Qx as tryDetermineMimetypeFromURL,Pa as tryFindObject,P_ as tryGetGuid,yx as unregisterHotReloadType,Am as unwatchWrite,Vb as useForAutoFit,Pt as validate,Sd as watchWrite};
|