@needle-tools/engine 4.1.0-experimental.13 → 4.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +72 -10
- package/README.md +28 -17
- package/components.needle.json +1 -1
- package/dist/gltf-progressive.js +220 -221
- package/dist/gltf-progressive.light.js +220 -221
- package/dist/gltf-progressive.light.min.js +6 -6
- package/dist/gltf-progressive.light.umd.cjs +7 -7
- package/dist/gltf-progressive.min.js +6 -6
- package/dist/gltf-progressive.umd.cjs +7 -7
- package/dist/needle-engine.bundle.js +8237 -7948
- package/dist/needle-engine.bundle.light.js +8190 -7901
- package/dist/needle-engine.bundle.light.min.js +140 -141
- package/dist/needle-engine.bundle.light.umd.cjs +138 -139
- package/dist/needle-engine.bundle.min.js +140 -141
- package/dist/needle-engine.bundle.umd.cjs +134 -135
- package/dist/needle-engine.d.ts +140 -0
- package/dist/needle-engine.js +597 -590
- package/dist/needle-engine.light.d.ts +140 -0
- package/dist/needle-engine.light.js +597 -590
- package/dist/needle-engine.light.min.js +1 -1
- package/dist/needle-engine.light.umd.cjs +1 -1
- package/dist/needle-engine.min.js +1 -1
- package/dist/needle-engine.umd.cjs +1 -1
- package/dist/postprocessing.js +1 -1
- package/dist/postprocessing.light.js +1 -1
- package/dist/postprocessing.light.min.js +1 -1
- package/dist/postprocessing.min.js +1 -1
- package/dist/three-examples.js +2809 -2450
- package/dist/three-examples.light.js +2809 -2450
- package/dist/three-examples.light.min.js +47 -15
- package/dist/three-examples.light.umd.cjs +47 -15
- package/dist/three-examples.min.js +47 -15
- package/dist/three-examples.umd.cjs +47 -15
- package/dist/three-mesh-ui.js +1 -1
- package/dist/three-mesh-ui.light.js +1 -1
- package/dist/three-mesh-ui.light.min.js +1 -1
- package/dist/three-mesh-ui.min.js +1 -1
- package/dist/three.js +577 -572
- package/dist/three.light.js +577 -572
- package/dist/three.light.min.js +170 -170
- package/dist/three.light.umd.cjs +170 -170
- package/dist/three.min.js +170 -170
- package/dist/three.umd.cjs +170 -170
- package/dist/vendor.js +1327 -1331
- package/dist/vendor.light.js +1327 -1331
- package/dist/vendor.light.min.js +33 -33
- package/dist/vendor.light.umd.cjs +33 -33
- package/dist/vendor.min.js +33 -33
- package/dist/vendor.umd.cjs +33 -33
- package/lib/engine/assets/index.js.map +1 -1
- package/lib/engine/engine.d.ts +4 -0
- package/lib/engine/engine.js +12 -0
- package/lib/engine/engine.js.map +1 -0
- package/lib/engine/engine_addressables.d.ts +6 -4
- package/lib/engine/engine_addressables.js +8 -1
- package/lib/engine/engine_addressables.js.map +1 -1
- package/lib/engine/engine_context.d.ts +3 -2
- package/lib/engine/engine_context.js +28 -4
- package/lib/engine/engine_context.js.map +1 -1
- package/lib/engine/engine_gameobject.d.ts +2 -12
- package/lib/engine/engine_gameobject.js +5 -15
- package/lib/engine/engine_gameobject.js.map +1 -1
- package/lib/engine/engine_gltf_builtin_components.js +5 -0
- package/lib/engine/engine_gltf_builtin_components.js.map +1 -1
- package/lib/engine/engine_input.d.ts +19 -6
- package/lib/engine/engine_input.js +0 -10
- package/lib/engine/engine_input.js.map +1 -1
- package/lib/engine/engine_license.js +1 -1
- package/lib/engine/engine_license.js.map +1 -1
- package/lib/engine/engine_modules.d.ts +7 -0
- package/lib/engine/engine_modules.js +7 -0
- package/lib/engine/engine_modules.js.map +1 -1
- package/lib/engine/engine_networking_auto.js +6 -11
- package/lib/engine/engine_networking_auto.js.map +1 -1
- package/lib/engine/engine_networking_instantiate.d.ts +1 -1
- package/lib/engine/engine_physics_rapier.d.ts +6 -4
- package/lib/engine/engine_physics_rapier.js +38 -24
- package/lib/engine/engine_physics_rapier.js.map +1 -1
- package/lib/engine/engine_scenetools.js +6 -2
- package/lib/engine/engine_scenetools.js.map +1 -1
- package/lib/engine/engine_types.d.ts +9 -2
- package/lib/engine/engine_types.js +6 -0
- package/lib/engine/engine_types.js.map +1 -1
- package/lib/engine/engine_web_api.d.ts +12 -0
- package/lib/engine/engine_web_api.js +113 -0
- package/lib/engine/engine_web_api.js.map +1 -0
- package/lib/engine/export/gltf/Writers.js.map +1 -1
- package/lib/engine/export/gltf/index.js +11 -1
- package/lib/engine/export/gltf/index.js.map +1 -1
- package/lib/engine/export/utils.d.ts +2 -0
- package/lib/engine/export/utils.js +8 -0
- package/lib/engine/export/utils.js.map +1 -0
- package/lib/engine/extensions/NEEDLE_gameobject_data.js +1 -1
- package/lib/engine/extensions/NEEDLE_gameobject_data.js.map +1 -1
- package/lib/engine/js-extensions/Object3D.d.ts +5 -1
- package/lib/engine/js-extensions/Object3D.js.map +1 -1
- package/lib/engine/webcomponents/needle menu/needle-menu.js +8 -2
- package/lib/engine/webcomponents/needle menu/needle-menu.js.map +1 -1
- package/lib/engine/xr/NeedleXRSession.js +3 -0
- package/lib/engine/xr/NeedleXRSession.js.map +1 -1
- package/lib/engine-components/AvatarLoader.js.map +1 -1
- package/lib/engine-components/Camera.d.ts +7 -4
- package/lib/engine-components/Camera.js +13 -10
- package/lib/engine-components/Camera.js.map +1 -1
- package/lib/engine-components/Collider.js +4 -5
- package/lib/engine-components/Collider.js.map +1 -1
- package/lib/engine-components/Component.d.ts +4 -3
- package/lib/engine-components/Component.js +6 -7
- package/lib/engine-components/Component.js.map +1 -1
- package/lib/engine-components/ContactShadows.d.ts +1 -1
- package/lib/engine-components/ContactShadows.js +7 -0
- package/lib/engine-components/ContactShadows.js.map +1 -1
- package/lib/engine-components/FlyControls.d.ts +10 -0
- package/lib/engine-components/FlyControls.js +29 -0
- package/lib/engine-components/FlyControls.js.map +1 -0
- package/lib/engine-components/GroundProjection.d.ts +1 -1
- package/lib/engine-components/GroundProjection.js +39 -32
- package/lib/engine-components/GroundProjection.js.map +1 -1
- package/lib/engine-components/OrbitControls.js +9 -1
- package/lib/engine-components/OrbitControls.js.map +1 -1
- package/lib/engine-components/RigidBody.d.ts +1 -0
- package/lib/engine-components/RigidBody.js +11 -4
- package/lib/engine-components/RigidBody.js.map +1 -1
- package/lib/engine-components/SceneSwitcher.d.ts +1 -1
- package/lib/engine-components/SceneSwitcher.js +1 -1
- package/lib/engine-components/SceneSwitcher.js.map +1 -1
- package/lib/engine-components/SpatialTrigger.d.ts +2 -2
- package/lib/engine-components/SpatialTrigger.js +4 -4
- package/lib/engine-components/SpatialTrigger.js.map +1 -1
- package/lib/engine-components/TransformGizmo.d.ts +7 -1
- package/lib/engine-components/TransformGizmo.js +39 -32
- package/lib/engine-components/TransformGizmo.js.map +1 -1
- package/lib/engine-components/VideoPlayer.js +0 -1
- package/lib/engine-components/VideoPlayer.js.map +1 -1
- package/lib/engine-components/export/gltf/GltfExport.js +23 -4
- package/lib/engine-components/export/gltf/GltfExport.js.map +1 -1
- package/lib/engine-components/export/usdz/ThreeUSDZExporter.d.ts +1 -1
- package/lib/engine-components/export/usdz/ThreeUSDZExporter.js +2 -2
- package/lib/engine-components/export/usdz/index.d.ts +1 -1
- package/lib/engine-components/export/usdz/index.js +1 -1
- package/lib/engine-components/export/usdz/index.js.map +1 -1
- package/lib/engine-components/particlesystem/ParticleSystem.d.ts +5 -6
- package/lib/engine-components/particlesystem/ParticleSystem.js +23 -9
- package/lib/engine-components/particlesystem/ParticleSystem.js.map +1 -1
- package/lib/engine-components/particlesystem/ParticleSystemModules.js +8 -2
- package/lib/engine-components/particlesystem/ParticleSystemModules.js.map +1 -1
- package/lib/engine-components/postprocessing/Effects/Antialiasing.js.map +1 -1
- package/lib/engine-components/postprocessing/Effects/BloomEffect.js.map +1 -1
- package/lib/engine-components/postprocessing/Effects/ChromaticAberration.js.map +1 -1
- package/lib/engine-components/postprocessing/Effects/ColorAdjustments.js.map +1 -1
- package/lib/engine-components/postprocessing/Effects/Pixelation.js.map +1 -1
- package/lib/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusion.js.map +1 -1
- package/lib/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusionN8.js.map +1 -1
- package/lib/engine-components/postprocessing/Effects/Sharpening.d.ts +2 -0
- package/lib/engine-components/postprocessing/Effects/Sharpening.js +15 -6
- package/lib/engine-components/postprocessing/Effects/Sharpening.js.map +1 -1
- package/lib/engine-components/postprocessing/Effects/TiltShiftEffect.js.map +1 -1
- package/lib/engine-components/postprocessing/Effects/Tonemapping.js.map +1 -1
- package/lib/engine-components/postprocessing/Effects/Vignette.js.map +1 -1
- package/lib/engine-components/postprocessing/PostProcessingHandler.js +1 -1
- package/lib/engine-components/postprocessing/PostProcessingHandler.js.map +1 -1
- package/lib/engine-components/webxr/Avatar.js +3 -3
- package/lib/engine-components/webxr/Avatar.js.map +1 -1
- package/lib/engine-components/webxr/WebXR.js +22 -13
- package/lib/engine-components/webxr/WebXR.js.map +1 -1
- package/lib/engine-components/webxr/WebXRImageTracking.d.ts +4 -0
- package/lib/engine-components/webxr/WebXRImageTracking.js +14 -4
- package/lib/engine-components/webxr/WebXRImageTracking.js.map +1 -1
- package/lib/engine-components/webxr/WebXRRig.d.ts +11 -1
- package/lib/engine-components/webxr/WebXRRig.js +13 -1
- package/lib/engine-components/webxr/WebXRRig.js.map +1 -1
- package/lib/engine-components-experimental/networking/PlayerSync.d.ts +4 -1
- package/lib/engine-components-experimental/networking/PlayerSync.js +18 -30
- package/lib/engine-components-experimental/networking/PlayerSync.js.map +1 -1
- package/lib/needle-engine.js +5 -5
- package/lib/needle-engine.js.map +1 -1
- package/package.json +14 -8
- package/plugins/common/config.cjs +22 -6
- package/plugins/common/config.js +27 -11
- package/plugins/next/next.js +47 -4
- package/plugins/vite/transform.js +3 -3
- package/src/engine/assets/index.ts +1 -0
- package/src/engine/codegen/register_types.ts +2 -2
- package/src/engine/engine_addressables.ts +19 -12
- package/src/engine/engine_context.ts +33 -8
- package/src/engine/engine_gameobject.ts +12 -16
- package/src/engine/engine_gltf_builtin_components.ts +7 -1
- package/src/engine/engine_input.ts +12 -5
- package/src/engine/engine_license.ts +2 -1
- package/src/engine/engine_modules.ts +7 -0
- package/src/engine/engine_networking_auto.ts +7 -22
- package/src/engine/engine_networking_instantiate.ts +1 -1
- package/src/engine/engine_physics_rapier.ts +48 -26
- package/src/engine/engine_scenetools.ts +6 -2
- package/src/engine/engine_types.ts +10 -2
- package/src/engine/export/gltf/Writers.ts +0 -1
- package/src/engine/export/gltf/index.ts +13 -3
- package/src/engine/export/index.ts +1 -1
- package/src/engine/export/utils.ts +10 -0
- package/src/engine/extensions/NEEDLE_gameobject_data.ts +1 -2
- package/src/engine/js-extensions/Object3D.ts +6 -1
- package/src/engine/webcomponents/needle menu/needle-menu.ts +16 -10
- package/src/engine/xr/NeedleXRSession.ts +4 -1
- package/src/engine-components/AvatarLoader.ts +1 -1
- package/src/engine-components/Camera.ts +14 -11
- package/src/engine-components/Collider.ts +4 -4
- package/src/engine-components/Component.ts +13 -7
- package/src/engine-components/ContactShadows.ts +11 -2
- package/src/engine-components/GroundProjection.ts +46 -38
- package/src/engine-components/OrbitControls.ts +9 -1
- package/src/engine-components/RigidBody.ts +13 -5
- package/src/engine-components/SceneSwitcher.ts +1 -1
- package/src/engine-components/SpatialTrigger.ts +6 -6
- package/src/engine-components/TransformGizmo.ts +41 -33
- package/src/engine-components/VideoPlayer.ts +0 -1
- package/src/engine-components/export/gltf/GltfExport.ts +26 -6
- package/src/engine-components/export/usdz/ThreeUSDZExporter.ts +2 -2
- package/src/engine-components/export/usdz/index.ts +1 -1
- package/src/engine-components/particlesystem/ParticleSystem.ts +26 -10
- package/src/engine-components/particlesystem/ParticleSystemModules.ts +10 -3
- package/src/engine-components/postprocessing/Effects/Antialiasing.ts +0 -1
- package/src/engine-components/postprocessing/Effects/BloomEffect.ts +1 -1
- package/src/engine-components/postprocessing/Effects/ChromaticAberration.ts +1 -1
- package/src/engine-components/postprocessing/Effects/ColorAdjustments.ts +1 -1
- package/src/engine-components/postprocessing/Effects/Pixelation.ts +1 -1
- package/src/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusion.ts +1 -1
- package/src/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusionN8.ts +1 -1
- package/src/engine-components/postprocessing/Effects/Sharpening.ts +17 -7
- package/src/engine-components/postprocessing/Effects/TiltShiftEffect.ts +0 -1
- package/src/engine-components/postprocessing/Effects/Tonemapping.ts +1 -1
- package/src/engine-components/postprocessing/Effects/Vignette.ts +1 -1
- package/src/engine-components/postprocessing/PostProcessingHandler.ts +2 -3
- package/src/engine-components/webxr/Avatar.ts +3 -3
- package/src/engine-components/webxr/WebXR.ts +23 -14
- package/src/engine-components/webxr/WebXRImageTracking.ts +23 -8
- package/src/engine-components/webxr/WebXRRig.ts +15 -2
- package/src/engine-components-experimental/networking/PlayerSync.ts +18 -37
- package/src/needle-engine.ts +5 -5
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import{B as le,M as z,a as Ge,T as Z,b as Ne,V as R,c as Oe,S as $e,d as be,e as Ue,C as Fe}from"./three.light.min.js";import{D as ze,K as Ve,G as ge,M as qe}from"./three-examples.light.min.js";const Se="";globalThis.GLTF_PROGRESSIVE_VERSION=Se,console.debug(`[gltf-progressive] version ${Se}`);let K="https://www.gstatic.com/draco/versioned/decoders/1.5.7/",ee="https://www.gstatic.com/basis-universal/versioned/2021-04-15-ba1c3e4/";const He=K,Xe=ee,Ke=new URL(K+"draco_decoder.js");fetch(Ke,{method:"GET",headers:{Range:"bytes=0-1"}}).catch(t=>{K===He&&(K="./include/draco/"),ee===Xe&&(ee="./include/ktx2/")}).finally(()=>{Te()});function Ye(t){K=t}function Je(t){ee=t}let V,ae,q;function Te(){V||(V=new ze,V.setDecoderPath(K),V.setDecoderConfig({type:"js"}),V.preload()),q||(q=new Ve,q.setTranscoderPath(ee),q.init()),ae||(ae=qe)}function me(t){return Te(),t?q.detectSupport(t):t!==null&&console.warn("No renderer provided to detect ktx2 support - loading KTX2 textures might fail"),{dracoLoader:V,ktx2Loader:q,meshoptDecoder:ae}}function pe(t){t.dracoLoader||t.setDRACOLoader(V),t.ktx2Loader||t.setKTX2Loader(q),t.meshoptDecoder||t.setMeshoptDecoder(ae)}const ve=new WeakMap;function ye(t,e){let r=ve.get(t);r?r=Object.assign(r,e):r=e,ve.set(t,r)}const Ee=ge.prototype.load;function Qe(...t){const e=ve.get(this);let r=t[0];const n=new URL(r,window.location.href);if(n.hostname.endsWith("needle.tools")){const s=e?.progressive!==void 0?e.progressive:!0,o=e!=null&&e.usecase?e.usecase:"default";s?this.requestHeader.Accept=`*/*;progressive=allowed;usecase=${o}`:this.requestHeader.Accept=`*/*;usecase=${o}`,r=n.toString()}return t[0]=r,Ee?.call(this,...t)}ge.prototype.load=Qe,te("debugprogressive");function te(t){if(typeof window>"u")return!1;const e=new URL(window.location.href).searchParams.get(t);return e==null||e==="0"||e==="false"?!1:e===""?!0:e}function Ze(t,e){if(e===void 0||e.startsWith("./")||e.startsWith("http")||t===void 0)return e;const r=t.lastIndexOf("/");if(r>=0){const n=t.substring(0,r+1);for(;n.endsWith("/")&&e.startsWith("/");)e=e.substring(1);return n+e}return e}let ue;function et(){return ue!==void 0||(ue=/iPhone|iPad|iPod|Android|IEMobile/i.test(navigator.userAgent),te("debugprogressive")&&console.log("[glTF Progressive]: isMobileDevice",ue)),ue}const tt=typeof window>"u"&&typeof document>"u",xe=Symbol("needle:raycast-mesh");function Y(t){return t?.[xe]instanceof le?t[xe]:null}function rt(t,e){if((t.type==="Mesh"||t.type==="SkinnedMesh")&&!Y(t)){const r=ot(e);r.userData={isRaycastMesh:!0},t[xe]=r}}function st(t=!0){if(t){if(re)return;const e=re=z.prototype.raycast;z.prototype.raycast=function(r,n){const s=this,o=Y(s);let i;o&&s.isMesh&&(i=s.geometry,s.geometry=o),e.call(this,r,n),i&&(s.geometry=i)}}else{if(!re)return;z.prototype.raycast=re,re=null}}let re=null;function ot(t){const e=new le;for(const r in t.attributes)e.setAttribute(r,t.getAttribute(r));return e.setIndex(t.getIndex()),e}const N=new Array,j="NEEDLE_progressive",v=te("debugprogressive"),Le=Symbol("needle-progressive-texture"),se=new Map,Me=new Set;if(v){let t=function(){e+=1,console.log("Toggle LOD level",e,se),se.forEach((s,o)=>{for(const i of s.keys){const a=o[i];if(a!=null){if(a.isBufferGeometry===!0){const u=b.getMeshLODInformation(a),l=u?Math.min(e,u.lods.length):0;o["DEBUG:LOD"]=e,b.assignMeshLOD(o,l),u&&(r=Math.max(r,u.lods.length-1))}else if(o.isMaterial===!0){o["DEBUG:LOD"]=e,b.assignTextureLOD(o,e);break}}}}),e>=r&&(e=-1)},e=-1,r=2,n=!1;window.addEventListener("keyup",s=>{s.key==="p"&&t(),s.key==="w"&&(n=!n,Me&&Me.forEach(o=>{o.name!="BackgroundCubeMaterial"&&o.glyphMap==null&&"wireframe"in o&&(o.wireframe=n)}))})}function Ae(t,e,r){var n;if(!v)return;se.has(t)||se.set(t,{keys:[],sourceId:r});const s=se.get(t);((n=s?.keys)==null?void 0:n.includes(e))==!1&&s.keys.push(e)}const w=class{constructor(t,e){this.loadMesh=r=>{var n,s;if(this._isLoadingMesh)return null;const o=(s=(n=this.parser.json.meshes[r])==null?void 0:n.extensions)==null?void 0:s[j];return o?(this._isLoadingMesh=!0,this.parser.getDependency("mesh",r).then(i=>{var a;return this._isLoadingMesh=!1,i&&w.registerMesh(this.url,o.guid,i,(a=o.lods)==null?void 0:a.length,void 0,o),i})):null},v&&console.log("Progressive extension registered for",e),this.parser=t,this.url=e}get name(){return j}static getMeshLODInformation(t){const e=this.getAssignedLODInformation(t);return e!=null&&e.key?this.lodInfos.get(e.key):null}static getMaterialMinMaxLODsCount(t,e){const r=this,n="LODS:minmax",s=t[n];if(s!=null)return s;if(e||(e={min_count:1/0,max_count:0,lods:[]}),Array.isArray(t)){for(const i of t)this.getMaterialMinMaxLODsCount(i,e);return t[n]=e,e}if(v==="verbose"&&console.log("getMaterialMinMaxLODsCount",t),t.type==="ShaderMaterial"||t.type==="RawShaderMaterial"){const i=t;for(const a of Object.keys(i.uniforms)){const u=i.uniforms[a].value;u?.isTexture===!0&&o(u,e)}}else if(t.isMaterial)for(const i of Object.keys(t)){const a=t[i];a?.isTexture===!0&&o(a,e)}return t[n]=e,e;function o(i,a){const u=r.getAssignedLODInformation(i);if(u){const l=r.lodInfos.get(u.key);if(l&&l.lods){a.min_count=Math.min(a.min_count,l.lods.length),a.max_count=Math.max(a.max_count,l.lods.length);for(let h=0;h<l.lods.length;h++){const f=l.lods[h];f.width&&(a.lods[h]=a.lods[h]||{min_height:1/0,max_height:0},a.lods[h].min_height=Math.min(a.lods[h].min_height,f.height),a.lods[h].max_height=Math.max(a.lods[h].max_height,f.height))}}}}}static hasLODLevelAvailable(t,e){var r;if(Array.isArray(t)){for(const o of t)if(this.hasLODLevelAvailable(o,e))return!0;return!1}if(t.isMaterial===!0){for(const o of Object.keys(t)){const i=t[o];if(i&&i.isTexture&&this.hasLODLevelAvailable(i,e))return!0}return!1}else if(t.isGroup===!0){for(const o of t.children)if(o.isMesh===!0&&this.hasLODLevelAvailable(o,e))return!0}let n,s;if(t.isMesh?n=t.geometry:(t.isBufferGeometry||t.isTexture)&&(n=t),n&&(r=n?.userData)!=null&&r.LODS){const o=n.userData.LODS;if(s=this.lodInfos.get(o.key),e===void 0)return s!=null;if(s)return Array.isArray(s.lods)?e<s.lods.length:e===0}return!1}static assignMeshLOD(t,e){var r;if(!t)return Promise.resolve(null);if(t instanceof z||t.isMesh===!0){const n=t.geometry,s=this.getAssignedLODInformation(n);if(!s)return Promise.resolve(null);for(const o of N)(r=o.onBeforeGetLODMesh)==null||r.call(o,t,e);return t["LOD:requested level"]=e,w.getOrLoadLOD(n,e).then(o=>{if(Array.isArray(o)){const i=s.index||0;o=o[i]}return t["LOD:requested level"]===e&&(delete t["LOD:requested level"],o&&n!=o&&(o?.isBufferGeometry?(t.geometry=o,v&&Ae(t,"geometry",s.url)):v&&console.error("Invalid LOD geometry",o))),o}).catch(o=>(console.error("Error loading mesh LOD",t,o),null))}else v&&console.error("Invalid call to assignMeshLOD: Request mesh LOD but the object is not a mesh",t);return Promise.resolve(null)}static assignTextureLOD(t,e=0){if(!t)return Promise.resolve(null);if(t.isMesh===!0){const r=t;if(Array.isArray(r.material)){const n=new Array;for(const s of r.material){const o=this.assignTextureLOD(s,e);n.push(o)}return Promise.all(n).then(s=>{const o=new Array;for(const i of s)Array.isArray(i)&&o.push(...i);return o})}else return this.assignTextureLOD(r.material,e)}if(t instanceof Ge||t.isMaterial===!0){const r=t,n=[],s=new Array;if(v&&Me.add(r),r.uniforms&&(r.isRawShaderMaterial||r.isShaderMaterial===!0)){const o=r;for(const i of Object.keys(o.uniforms)){const a=o.uniforms[i].value;if(a?.isTexture===!0){const u=this.assignTextureLODForSlot(a,e,r,i).then(l=>(l&&o.uniforms[i].value!=l&&(o.uniforms[i].value=l,o.uniformsNeedUpdate=!0),l));n.push(u),s.push(i)}}}else for(const o of Object.keys(r)){const i=r[o];if(i?.isTexture===!0){const a=this.assignTextureLODForSlot(i,e,r,o);n.push(a),s.push(o)}}return Promise.all(n).then(o=>{const i=new Array;for(let a=0;a<o.length;a++){const u=o[a],l=s[a];u&&u.isTexture===!0?i.push({material:r,slot:l,texture:u,level:e}):i.push({material:r,slot:l,texture:null,level:e})}return i})}if(t instanceof Z||t.isTexture===!0){const r=t;return this.assignTextureLODForSlot(r,e,null,null)}return Promise.resolve(null)}static assignTextureLODForSlot(t,e,r,n){return t?.isTexture!==!0?Promise.resolve(null):n==="glyphMap"?Promise.resolve(t):w.getOrLoadLOD(t,e).then(s=>{if(Array.isArray(s))return null;if(s?.isTexture===!0){if(s!=t){if(r&&n){const o=r[n];if(o){const i=this.getAssignedLODInformation(o);if(i&&i?.level<e)return v==="verbose"&&console.warn("Assigned texture level is already higher: ",i.level,e,r,o,s),null}r[n]=s}if(v&&n&&r){const o=this.getAssignedLODInformation(t);o&&Ae(r,n,o.url)}}return s}else v=="verbose"&&console.warn("No LOD found for",t,e);return null}).catch(s=>(console.error("Error loading LOD",t,s),null))}afterRoot(t){var e,r;return v&&console.log("AFTER",this.url,t),(e=this.parser.json.textures)==null||e.forEach((n,s)=>{var o;if(n!=null&&n.extensions){const i=n?.extensions[j];if(i){if(!i.lods){v&&console.warn("Texture has no LODs",i);return}let a=!1;for(const u of this.parser.associations.keys())if(u.isTexture===!0){const l=this.parser.associations.get(u);l?.textures===s&&(a=!0,w.registerTexture(this.url,u,(o=i.lods)==null?void 0:o.length,s,i))}a||this.parser.getDependency("texture",s).then(u=>{var l;u&&w.registerTexture(this.url,u,(l=i.lods)==null?void 0:l.length,s,i)})}}}),(r=this.parser.json.meshes)==null||r.forEach((n,s)=>{if(n!=null&&n.extensions){const o=n?.extensions[j];if(o&&o.lods){for(const i of this.parser.associations.keys())if(i.isMesh){const a=this.parser.associations.get(i);a?.meshes===s&&w.registerMesh(this.url,o.guid,i,o.lods.length,a.primitives,o)}}}}),null}static async getOrLoadLOD(t,e){var r,n,s,o;const i=v=="verbose",a=t.userData.LODS;if(!a)return null;const u=a?.key;let l;if(t.isTexture===!0){const h=t;h.source&&h.source[Le]&&(l=h.source[Le])}if(l||(l=w.lodInfos.get(u)),l){if(e>0){let m=!1;const E=Array.isArray(l.lods);if(E&&e>=l.lods.length?m=!0:E||(m=!0),m)return this.lowresCache.get(u)}const h=Array.isArray(l.lods)?(r=l.lods[e])==null?void 0:r.path:l.lods;if(!h)return v&&!l["missing:uri"]&&(l["missing:uri"]=!0,console.warn("Missing uri for progressive asset for LOD "+e,l)),null;const f=Ze(a.url,h);if(f.endsWith(".glb")||f.endsWith(".gltf")){if(!l.guid)return console.warn("missing pointer for glb/gltf texture",l),null;const m=f+"_"+l.guid,E=this.previouslyLoaded.get(m);if(E!==void 0){i&&console.log(`LOD ${e} was already loading/loaded: ${m}`);let c=await E.catch(_=>(console.error(`Error loading LOD ${e} from ${f}
|
|
2
|
-
`,_),null)),D=!1;if(c==null||(c instanceof Z&&t instanceof Z?(n=c.image)!=null&&n.data||(s=c.source)!=null&&s.data?c=this.copySettings(t,c):(D=!0,this.previouslyLoaded.delete(
|
|
3
|
-
`,
|
|
1
|
+
import{B as le,M as V,T as Z,a as We,V as j,b as Oe,S as Ne,c as be,d as $e,C as Ue}from"./three.light.min.js";import{D as Fe,K as ze,G as ge,M as Ve}from"./three-examples.light.min.js";const Se="";globalThis.GLTF_PROGRESSIVE_VERSION=Se,console.debug(`[gltf-progressive] version ${Se}`);let Y="https://www.gstatic.com/draco/versioned/decoders/1.5.7/",ee="https://www.gstatic.com/basis-universal/versioned/2021-04-15-ba1c3e4/";const qe=Y,He=ee,Xe=new URL(Y+"draco_decoder.js");fetch(Xe,{method:"GET",headers:{Range:"bytes=0-1"}}).catch(t=>{Y===qe&&(Y="./include/draco/"),ee===He&&(ee="./include/ktx2/")}).finally(()=>{Te()});function Ke(t){Y=t}function Ye(t){ee=t}let q,ae,H;function Te(){q||(q=new Fe,q.setDecoderPath(Y),q.setDecoderConfig({type:"js"}),q.preload()),H||(H=new ze,H.setTranscoderPath(ee),H.init()),ae||(ae=Ve)}function me(t){return Te(),t?H.detectSupport(t):t!==null&&console.warn("No renderer provided to detect ktx2 support - loading KTX2 textures might fail"),{dracoLoader:q,ktx2Loader:H,meshoptDecoder:ae}}function pe(t){t.dracoLoader||t.setDRACOLoader(q),t.ktx2Loader||t.setKTX2Loader(H),t.meshoptDecoder||t.setMeshoptDecoder(ae)}const ve=new WeakMap;function xe(t,e){let r=ve.get(t);r?r=Object.assign(r,e):r=e,ve.set(t,r)}const Ee=ge.prototype.load;function Je(...t){const e=ve.get(this);let r=t[0];const n=new URL(r,window.location.href);if(n.hostname.endsWith("needle.tools")){const s=e?.progressive!==void 0?e.progressive:!0,o=e!=null&&e.usecase?e.usecase:"default";s?this.requestHeader.Accept=`*/*;progressive=allowed;usecase=${o}`:this.requestHeader.Accept=`*/*;usecase=${o}`,r=n.toString()}return t[0]=r,Ee?.call(this,...t)}ge.prototype.load=Je,te("debugprogressive");function te(t){if(typeof window>"u")return!1;const e=new URL(window.location.href).searchParams.get(t);return e==null||e==="0"||e==="false"?!1:e===""?!0:e}function Qe(t,e){if(e===void 0||e.startsWith("./")||e.startsWith("http")||t===void 0)return e;const r=t.lastIndexOf("/");if(r>=0){const n=t.substring(0,r+1);for(;n.endsWith("/")&&e.startsWith("/");)e=e.substring(1);return n+e}return e}let ue;function Ze(){return ue!==void 0||(ue=/iPhone|iPad|iPod|Android|IEMobile/i.test(navigator.userAgent),te("debugprogressive")&&console.log("[glTF Progressive]: isMobileDevice",ue)),ue}const et=typeof window>"u"&&typeof document>"u",ye=Symbol("needle:raycast-mesh");function J(t){return t?.[ye]instanceof le?t[ye]:null}function tt(t,e){if((t.type==="Mesh"||t.type==="SkinnedMesh")&&!J(t)){const r=st(e);r.userData={isRaycastMesh:!0},t[ye]=r}}function rt(t=!0){if(t){if(re)return;const e=re=V.prototype.raycast;V.prototype.raycast=function(r,n){const s=this,o=J(s);let i;o&&s.isMesh&&(i=s.geometry,s.geometry=o),e.call(this,r,n),i&&(s.geometry=i)}}else{if(!re)return;V.prototype.raycast=re,re=null}}let re=null;function st(t){const e=new le;for(const r in t.attributes)e.setAttribute(r,t.getAttribute(r));return e.setIndex(t.getIndex()),e}const N=new Array,G="NEEDLE_progressive",v=te("debugprogressive"),Le=Symbol("needle-progressive-texture"),se=new Map,Me=new Set;if(v){let t=function(){e+=1,console.log("Toggle LOD level",e,se),se.forEach((s,o)=>{for(const i of s.keys){const a=o[i];if(a!=null)if(a.isBufferGeometry===!0){const u=S.getMeshLODInformation(a),l=u?Math.min(e,u.lods.length):0;o["DEBUG:LOD"]=l,u&&(r=Math.max(r,u.lods.length-1))}else o.isMaterial===!0&&(o["DEBUG:LOD"]=e)}}),e>=r&&(e=-1)},e=-1,r=2,n=!1;window.addEventListener("keyup",s=>{s.key==="p"&&t(),s.key==="w"&&(n=!n,Me&&Me.forEach(o=>{o.name!="BackgroundCubeMaterial"&&o.glyphMap==null&&"wireframe"in o&&(o.wireframe=n)}))})}function Ae(t,e,r){var n;if(!v)return;se.has(t)||se.set(t,{keys:[],sourceId:r});const s=se.get(t);((n=s?.keys)==null?void 0:n.includes(e))==!1&&s.keys.push(e)}const w=class{constructor(t,e){this.loadMesh=r=>{var n,s;if(this._isLoadingMesh)return null;const o=(s=(n=this.parser.json.meshes[r])==null?void 0:n.extensions)==null?void 0:s[G];return o?(this._isLoadingMesh=!0,this.parser.getDependency("mesh",r).then(i=>{var a;return this._isLoadingMesh=!1,i&&w.registerMesh(this.url,o.guid,i,(a=o.lods)==null?void 0:a.length,void 0,o),i})):null},v&&console.log("Progressive extension registered for",e),this.parser=t,this.url=e}get name(){return G}static getMeshLODInformation(t){const e=this.getAssignedLODInformation(t);return e!=null&&e.key?this.lodInfos.get(e.key):null}static getMaterialMinMaxLODsCount(t,e){const r=this,n="LODS:minmax",s=t[n];if(s!=null)return s;if(e||(e={min_count:1/0,max_count:0,lods:[]}),Array.isArray(t)){for(const i of t)this.getMaterialMinMaxLODsCount(i,e);return t[n]=e,e}if(v==="verbose"&&console.log("getMaterialMinMaxLODsCount",t),t.type==="ShaderMaterial"||t.type==="RawShaderMaterial"){const i=t;for(const a of Object.keys(i.uniforms)){const u=i.uniforms[a].value;u?.isTexture===!0&&o(u,e)}}else if(t.isMaterial)for(const i of Object.keys(t)){const a=t[i];a?.isTexture===!0&&o(a,e)}return t[n]=e,e;function o(i,a){const u=r.getAssignedLODInformation(i);if(u){const l=r.lodInfos.get(u.key);if(l&&l.lods){a.min_count=Math.min(a.min_count,l.lods.length),a.max_count=Math.max(a.max_count,l.lods.length);for(let h=0;h<l.lods.length;h++){const f=l.lods[h];f.width&&(a.lods[h]=a.lods[h]||{min_height:1/0,max_height:0},a.lods[h].min_height=Math.min(a.lods[h].min_height,f.height),a.lods[h].max_height=Math.max(a.lods[h].max_height,f.height))}}}}}static hasLODLevelAvailable(t,e){var r;if(Array.isArray(t)){for(const o of t)if(this.hasLODLevelAvailable(o,e))return!0;return!1}if(t.isMaterial===!0){for(const o of Object.keys(t)){const i=t[o];if(i&&i.isTexture&&this.hasLODLevelAvailable(i,e))return!0}return!1}else if(t.isGroup===!0){for(const o of t.children)if(o.isMesh===!0&&this.hasLODLevelAvailable(o,e))return!0}let n,s;if(t.isMesh?n=t.geometry:(t.isBufferGeometry||t.isTexture)&&(n=t),n&&(r=n?.userData)!=null&&r.LODS){const o=n.userData.LODS;if(s=this.lodInfos.get(o.key),e===void 0)return s!=null;if(s)return Array.isArray(s.lods)?e<s.lods.length:e===0}return!1}static assignMeshLOD(t,e){var r;if(!t)return Promise.resolve(null);if(t instanceof V||t.isMesh===!0){const n=t.geometry,s=this.getAssignedLODInformation(n);if(!s)return Promise.resolve(null);for(const o of N)(r=o.onBeforeGetLODMesh)==null||r.call(o,t,e);return t["LOD:requested level"]=e,w.getOrLoadLOD(n,e).then(o=>{if(Array.isArray(o)){const i=s.index||0;o=o[i]}return t["LOD:requested level"]===e&&(delete t["LOD:requested level"],o&&n!=o&&(o?.isBufferGeometry?(t.geometry=o,v&&Ae(t,"geometry",s.url)):v&&console.error("Invalid LOD geometry",o))),o}).catch(o=>(console.error("Error loading mesh LOD",t,o),null))}else v&&console.error("Invalid call to assignMeshLOD: Request mesh LOD but the object is not a mesh",t);return Promise.resolve(null)}static assignTextureLOD(t,e=0){if(!t)return Promise.resolve(null);if(t.isMesh===!0){const r=t;if(Array.isArray(r.material)){const n=new Array;for(const s of r.material){const o=this.assignTextureLOD(s,e);n.push(o)}return Promise.all(n).then(s=>{const o=new Array;for(const i of s)Array.isArray(i)&&o.push(...i);return o})}else return this.assignTextureLOD(r.material,e)}if(t.isMaterial===!0){const r=t,n=[],s=new Array;if(v&&Me.add(r),r.uniforms&&(r.isRawShaderMaterial||r.isShaderMaterial===!0)){const o=r;for(const i of Object.keys(o.uniforms)){const a=o.uniforms[i].value;if(a?.isTexture===!0){const u=this.assignTextureLODForSlot(a,e,r,i).then(l=>(l&&o.uniforms[i].value!=l&&(o.uniforms[i].value=l,o.uniformsNeedUpdate=!0),l));n.push(u),s.push(i)}}}else for(const o of Object.keys(r)){const i=r[o];if(i?.isTexture===!0){const a=this.assignTextureLODForSlot(i,e,r,o);n.push(a),s.push(o)}}return Promise.all(n).then(o=>{const i=new Array;for(let a=0;a<o.length;a++){const u=o[a],l=s[a];u&&u.isTexture===!0?i.push({material:r,slot:l,texture:u,level:e}):i.push({material:r,slot:l,texture:null,level:e})}return i})}if(t instanceof Z||t.isTexture===!0){const r=t;return this.assignTextureLODForSlot(r,e,null,null)}return Promise.resolve(null)}static assignTextureLODForSlot(t,e,r,n){return t?.isTexture!==!0?Promise.resolve(null):n==="glyphMap"?Promise.resolve(t):w.getOrLoadLOD(t,e).then(s=>{if(Array.isArray(s))return null;if(s?.isTexture===!0){if(s!=t){if(r&&n){const o=r[n];if(o&&!v){const i=this.getAssignedLODInformation(o);if(i&&i?.level<e)return v==="verbose"&&console.warn("Assigned texture level is already higher: ",i.level,e,r,o,s),null}r[n]=s}if(v&&n&&r){const o=this.getAssignedLODInformation(t);o?Ae(r,n,o.url):console.warn("No LOD info for texture",t)}}return s}else v=="verbose"&&console.warn("No LOD found for",t,e);return null}).catch(s=>(console.error("Error loading LOD",t,s),null))}afterRoot(t){var e,r;return v&&console.log("AFTER",this.url,t),(e=this.parser.json.textures)==null||e.forEach((n,s)=>{var o;if(n!=null&&n.extensions){const i=n?.extensions[G];if(i){if(!i.lods){v&&console.warn("Texture has no LODs",i);return}let a=!1;for(const u of this.parser.associations.keys())if(u.isTexture===!0){const l=this.parser.associations.get(u);l?.textures===s&&(a=!0,w.registerTexture(this.url,u,(o=i.lods)==null?void 0:o.length,s,i))}a||this.parser.getDependency("texture",s).then(u=>{var l;u&&w.registerTexture(this.url,u,(l=i.lods)==null?void 0:l.length,s,i)})}}}),(r=this.parser.json.meshes)==null||r.forEach((n,s)=>{if(n!=null&&n.extensions){const o=n?.extensions[G];if(o&&o.lods){for(const i of this.parser.associations.keys())if(i.isMesh){const a=this.parser.associations.get(i);a?.meshes===s&&w.registerMesh(this.url,o.guid,i,o.lods.length,a.primitives,o)}}}}),null}static async getOrLoadLOD(t,e){var r,n,s,o;const i=v=="verbose",a=t.userData.LODS;if(!a)return null;const u=a?.key;let l;if(t.isTexture===!0){const h=t;h.source&&h.source[Le]&&(l=h.source[Le])}if(l||(l=w.lodInfos.get(u)),l){if(e>0){let p=!1;const E=Array.isArray(l.lods);if(E&&e>=l.lods.length?p=!0:E||(p=!0),p)return this.lowresCache.get(u)}const h=Array.isArray(l.lods)?(r=l.lods[e])==null?void 0:r.path:l.lods;if(!h)return v&&!l["missing:uri"]&&(l["missing:uri"]=!0,console.warn("Missing uri for progressive asset for LOD "+e,l)),null;const f=Qe(a.url,h);if(f.endsWith(".glb")||f.endsWith(".gltf")){if(!l.guid)return console.warn("missing pointer for glb/gltf texture",l),null;const p=f+"_"+l.guid,E=this.previouslyLoaded.get(p);if(E!==void 0){i&&console.log(`LOD ${e} was already loading/loaded: ${p}`);let c=await E.catch(_=>(console.error(`Error loading LOD ${e} from ${f}
|
|
2
|
+
`,_),null)),D=!1;if(c==null||(c instanceof Z&&t instanceof Z?(n=c.image)!=null&&n.data||(s=c.source)!=null&&s.data?c=this.copySettings(t,c):(D=!0,this.previouslyLoaded.delete(p)):c instanceof le&&t instanceof le&&((o=c.attributes.position)!=null&&o.array||(D=!0,this.previouslyLoaded.delete(p)))),!D)return c}const M=l,x=new Promise(async(c,D)=>{const _=new ge;pe(_),v&&(await new Promise(m=>setTimeout(m,1e3)),i&&console.warn("Start loading (delayed) "+f,M.guid));let P=f;if(M&&Array.isArray(M.lods)){const m=M.lods[e];m.hash&&(P+="?v="+m.hash)}const O=await _.loadAsync(P).catch(m=>(console.error(`Error loading LOD ${e} from ${f}
|
|
3
|
+
`,m),null));if(!O)return null;const I=O.parser;i&&console.log("Loading finished "+f,M.guid);let g=0;if(O.parser.json.textures){let m=!1;for(const d of O.parser.json.textures){if(d!=null&&d.extensions){const L=d?.extensions[G];if(L!=null&&L.guid&&L.guid===M.guid){m=!0;break}}g++}if(m){let d=await I.getDependency("texture",g);return d&&w.assignLODInformation(a.url,d,u,e,void 0,void 0),i&&console.log('change "'+t.name+'" \u2192 "'+d.name+'"',f,g,d,p),t instanceof Z&&(d=this.copySettings(t,d)),d&&(d.guid=M.guid),c(d)}else v&&console.warn("Could not find texture with guid",M.guid,O.parser.json)}if(g=0,O.parser.json.meshes){let m=!1;for(const d of O.parser.json.meshes){if(d!=null&&d.extensions){const L=d?.extensions[G];if(L!=null&&L.guid&&L.guid===M.guid){m=!0;break}}g++}if(m){const d=await I.getDependency("mesh",g),L=M;if(i&&console.log(`Loaded Mesh "${d.name}"`,f,g,d,p),d.isMesh===!0){const b=d.geometry;return w.assignLODInformation(a.url,b,u,e,void 0,L.density),c(b)}else{const b=new Array;for(let k=0;k<d.children.length;k++){const z=d.children[k];if(z.isMesh===!0){const K=z.geometry;w.assignLODInformation(a.url,K,u,e,k,L.density),b.push(K)}}return c(b)}}else v&&console.warn("Could not find mesh with guid",M.guid,O.parser.json)}return c(null)});return this.previouslyLoaded.set(p,x),await x}else if(t instanceof Z){i&&console.log("Load texture from uri: "+f);const p=await new We().loadAsync(f);return p?(p.guid=l.guid,p.flipY=!1,p.needsUpdate=!0,p.colorSpace=t.colorSpace,i&&console.log(l,p)):v&&console.warn("failed loading",f),p}}else v&&console.warn(`Can not load LOD ${e}: no LOD info found for "${u}" ${t.name}`,t.type);return null}static assignLODInformation(t,e,r,n,s,o){if(!e)return;e.userData||(e.userData={});const i=new ot(t,r,n,s,o);e.userData.LODS=i}static getAssignedLODInformation(t){var e;return((e=t?.userData)==null?void 0:e.LODS)||null}static copySettings(t,e){return v&&console.warn(`Copy texture settings
|
|
4
4
|
`,t.uuid,`
|
|
5
|
-
`,e.uuid),e.offset=t.offset,e.repeat=t.repeat,e.colorSpace=t.colorSpace,e.magFilter=t.magFilter,e.minFilter=t.minFilter,e.wrapS=t.wrapS,e.wrapT=t.wrapT,e.flipY=t.flipY,e.anisotropy=t.anisotropy,e.mipmaps||(e.generateMipmaps=t.generateMipmaps),e}};let b=w;b.registerTexture=(t,e,r,n,s)=>{if(v&&console.log("> Progressive: register texture",n,e.name,e.uuid,e,s),!e){v&&console.error("gltf-progressive: Register texture without texture");return}e.source&&(e.source[Le]=s);const o=s.guid;w.assignLODInformation(t,e,o,r,n,void 0),w.lodInfos.set(o,s),w.lowresCache.set(o,e)},b.registerMesh=(t,e,r,n,s,o)=>{var i;v&&console.log("> Progressive: register mesh",s,r.name,o,r.uuid,r);const a=r.geometry;if(!a){v&&console.warn("gltf-progressive: Register mesh without geometry");return}a.userData||(a.userData={}),w.assignLODInformation(t,a,e,n,s,o.density),w.lodInfos.set(e,o);let u=w.lowresCache.get(e);u?u.push(r.geometry):u=[r.geometry],w.lowresCache.set(e,u),n>0&&!Y(r)&&rt(r,a);for(const l of N)(i=l.onRegisteredNewMesh)==null||i.call(l,r,o)},b.lodInfos=new Map,b.previouslyLoaded=new Map,b.lowresCache=new Map;class nt{constructor(e,r,n,s,o){this.url=e,this.key=r,this.level=n,s!=null&&(this.index=s),o!=null&&(this.density=o)}}var Pe=(t,e,r)=>{if(!e.has(t))throw TypeError("Cannot "+r)},y=(t,e,r)=>(Pe(t,e,"read from private field"),r?r.call(t):e.get(t)),H=(t,e,r)=>{if(e.has(t))throw TypeError("Cannot add the same private member more than once");e instanceof WeakSet?e.add(t):e.set(t,r)},W=(t,e,r,n)=>(Pe(t,e,"write to private field"),n?n.call(t,r):e.set(t,r),r),T,$,we,J,oe,ce,U;const I=te("debugprogressive"),it=te("noprogressive"),De=Symbol("Needle:LODSManager"),_e=Symbol("Needle:LODState"),Q=Symbol("Needle:CurrentLOD"),B={mesh_lod:-1,texture_lod:-1},P=class{constructor(t,e){this.projectionScreenMatrix=new Oe,this.targetTriangleDensity=2e5,this.updateInterval="auto",H(this,T,1),this.pause=!1,this.manual=!1,this._lodchangedlisteners=[],H(this,$,void 0),H(this,we,new Fe),H(this,J,0),H(this,oe,0),H(this,ce,0),H(this,U,0),this._fpsBuffer=[60,60,60,60,60],this._sphere=new $e,this._tempBox=new be,this._tempBox2=new be,this.tempMatrix=new Oe,this._tempWorldPosition=new R,this._tempBoxSize=new R,this._tempBox2Size=new R,this.renderer=t,this.context={...e}}static getObjectLODState(t){return t[_e]}static addPlugin(t){N.push(t)}static removePlugin(t){const e=N.indexOf(t);e>=0&&N.splice(e,1)}static get(t,e){if(t[De])return console.debug("[gltf-progressive] LODsManager already exists for this renderer"),t[De];const r=new P(t,{engine:"unknown",...e});return t[De]=r,r}get plugins(){return N}addEventListener(t,e){t==="changed"&&this._lodchangedlisteners.push(e)}removeEventListener(t,e){if(t==="changed"){const r=this._lodchangedlisteners.indexOf(e);r>=0&&this._lodchangedlisteners.splice(r,1)}}enable(){if(y(this,$))return;console.debug("[gltf-progressive] Enabling LODsManager for renderer");let t=0;W(this,$,this.renderer.render);const e=this;me(this.renderer),this.renderer.render=function(r,n){const s=e.renderer.getRenderTarget();(s==null||"isXRRenderTarget"in s&&s.isXRRenderTarget)&&(t=0,W(e,J,y(e,J)+1),W(e,oe,y(e,we).getDelta()),W(e,ce,y(e,ce)+y(e,oe)),e._fpsBuffer.shift(),e._fpsBuffer.push(1/y(e,oe)),W(e,U,e._fpsBuffer.reduce((i,a)=>i+a)/e._fpsBuffer.length),I&&y(e,J)%200===0&&console.log("FPS",Math.round(y(e,U)),"Interval:",y(e,T)));const o=t++;y(e,$).call(this,r,n),e.onAfterRender(r,n,o)}}disable(){y(this,$)&&(console.debug("[gltf-progressive] Disabling LODsManager for renderer"),this.renderer.render=y(this,$),W(this,$,void 0))}update(t,e){this.internalUpdate(t,e)}onAfterRender(t,e,r){if(this.pause)return;const n=this.renderer.renderLists.get(t,0).opaque;let s=!0;if(n.length===1){const o=n[0].material;(o.name==="EffectMaterial"||o.name==="CopyShader")&&(s=!1)}if((e.parent&&e.parent.type==="CubeCamera"||r>=1&&e.type==="OrthographicCamera")&&(s=!1),s){if(it||(this.updateInterval==="auto"?y(this,U)<40&&y(this,T)<10?(W(this,T,y(this,T)+1),I&&console.warn("\u2193 Reducing LOD updates",y(this,T),y(this,U).toFixed(0))):y(this,U)>=60&&y(this,T)>1&&(W(this,T,y(this,T)-1),I&&console.warn("\u2191 Increasing LOD updates",y(this,T),y(this,U).toFixed(0))):W(this,T,this.updateInterval),y(this,T)>0&&y(this,J)%y(this,T)!=0))return;this.internalUpdate(t,e)}}internalUpdate(t,e){var r,n;const s=this.renderer.renderLists.get(t,0),o=s.opaque;this.projectionScreenMatrix.multiplyMatrices(e.projectionMatrix,e.matrixWorldInverse);const i=this.targetTriangleDensity;for(const l of o){if(l.material&&(((r=l.geometry)==null?void 0:r.type)==="BoxGeometry"||((n=l.geometry)==null?void 0:n.type)==="BufferGeometry")&&(l.material.name==="SphericalGaussianBlur"||l.material.name=="BackgroundCubeMaterial"||l.material.name==="CubemapFromEquirect"||l.material.name==="EquirectangularToCubeUV")){I&&(l.material["NEEDLE_PROGRESSIVE:IGNORE-WARNING"]||(l.material["NEEDLE_PROGRESSIVE:IGNORE-WARNING"]=!0,console.warn("Ignoring skybox or BLIT object",l,l.material.name,l.material.type)));continue}switch(l.material.type){case"LineBasicMaterial":case"LineDashedMaterial":case"PointsMaterial":case"ShadowMaterial":case"MeshDistanceMaterial":case"MeshDepthMaterial":continue}if(I==="color"&&l.material&&!l.object.progressive_debug_color){l.object.progressive_debug_color=!0;const f=Math.random()*16777215,m=new Ue({color:f});l.object.material=m}const h=l.object;(h instanceof z||h.isMesh)&&this.updateLODs(t,e,h,i)}const a=s.transparent;for(const l of a){const h=l.object;(h instanceof z||h.isMesh)&&this.updateLODs(t,e,h,i)}const u=s.transmissive;for(const l of u){const h=l.object;(h instanceof z||h.isMesh)&&this.updateLODs(t,e,h,i)}}updateLODs(t,e,r,n){var s,o;r.userData||(r.userData={});let i=r[_e];if(i||(i=new lt,r[_e]=i),i.frames++<2)return;for(const u of N)(s=u.onBeforeUpdateLOD)==null||s.call(u,this.renderer,t,e,r);this.calculateLodLevel(e,r,i,n,B),B.mesh_lod=Math.round(B.mesh_lod),B.texture_lod=Math.round(B.texture_lod),B.mesh_lod>=0&&this.loadProgressiveMeshes(r,B.mesh_lod);let a=B.texture_lod;if(r.material&&a>=0){const u=r["DEBUG:LOD"];u!=null&&(a=u),this.loadProgressiveTextures(r.material,a)}for(const u of N)(o=u.onAfterUpdatedLOD)==null||o.call(u,this.renderer,t,e,r,B);i.lastLodLevel_Mesh=B.mesh_lod,i.lastLodLevel_Texture=B.texture_lod}loadProgressiveTextures(t,e){if(!t)return;if(Array.isArray(t)){for(const n of t)this.loadProgressiveTextures(n,e);return}let r=!1;(t[Q]===void 0||e<t[Q])&&(r=!0),r&&(t[Q]=e,b.assignTextureLOD(t,e).then(n=>{this._lodchangedlisteners.forEach(s=>s({type:"texture",level:e,object:t}))}))}loadProgressiveMeshes(t,e){if(!t)return Promise.resolve(null);if(t[Q]!==e){t[Q]=e;const r=t.geometry;return b.assignMeshLOD(t,e).then(n=>(n&&t[Q]==e&&r!=t.geometry&&this._lodchangedlisteners.forEach(s=>s({type:"mesh",level:e,object:t})),n))}return Promise.resolve(null)}static isInside(t,e){const r=t.min,n=t.max,s=(r.x+n.x)*.5,o=(r.y+n.y)*.5;return this._tempPtInside.set(s,o,r.z).applyMatrix4(e).z<0}calculateLodLevel(t,e,r,n,s){var o;if(!e){s.mesh_lod=-1,s.texture_lod=-1;return}if(!t){s.mesh_lod=-1,s.texture_lod=-1;return}let i=10+1,a=!1;if(I&&e["DEBUG:LOD"]!=null)return e["DEBUG:LOD"];const u=b.getMeshLODInformation(e.geometry),l=u?.lods,h=l&&l.length>0,f=b.getMaterialMinMaxLODsCount(e.material),m=f?.min_count!=1/0&&f.min_count>0&&f.max_count>0;if(!h&&!m){s.mesh_lod=0,s.texture_lod=0;return}h||(a=!0,i=0);const E=this.renderer.domElement.clientHeight||this.renderer.domElement.height;let M=e.geometry.boundingBox;if(e.type==="SkinnedMesh"){const x=e;if(!x.boundingBox)x.computeBoundingBox();else if(r.frames%30===0){const c=Y(x),D=x.geometry;c&&(x.geometry=c),x.computeBoundingBox(),x.geometry=D}M=x.boundingBox}if(M&&t.isPerspectiveCamera){const x=t;if(e.geometry.attributes.color&&e.geometry.attributes.color.count<100&&e.geometry.boundingSphere){this._sphere.copy(e.geometry.boundingSphere),this._sphere.applyMatrix4(e.matrixWorld);const p=t.getWorldPosition(this._tempWorldPosition);if(this._sphere.containsPoint(p)){s.mesh_lod=0,s.texture_lod=0;return}}if(this._tempBox.copy(M),this._tempBox.applyMatrix4(e.matrixWorld),P.isInside(this._tempBox,this.projectionScreenMatrix)){s.mesh_lod=0,s.texture_lod=0;return}if(this._tempBox.applyMatrix4(this.projectionScreenMatrix),this.renderer.xr.enabled&&x.fov>70){const p=this._tempBox.min,g=this._tempBox.max;let d=p.x,L=p.y,O=g.x,k=g.y;const F=2,X=1.5,ne=(p.x+g.x)*.5,ie=(p.y+g.y)*.5;d=(d-ne)*F+ne,L=(L-ie)*F+ie,O=(O-ne)*F+ne,k=(k-ie)*F+ie;const je=d<0&&O>0?0:Math.min(Math.abs(p.x),Math.abs(g.x)),We=L<0&&k>0?0:Math.min(Math.abs(p.y),Math.abs(g.y)),fe=Math.max(je,We);r.lastCentrality=(X-fe)*(X-fe)*(X-fe)}else r.lastCentrality=1;const c=this._tempBox.getSize(this._tempBoxSize);c.multiplyScalar(.5),screen.availHeight>0&&E>0&&c.multiplyScalar(E/screen.availHeight),c.x*=x.aspect;const D=t.matrixWorldInverse,_=this._tempBox2;_.copy(M),_.applyMatrix4(e.matrixWorld),_.applyMatrix4(D);const A=_.getSize(this._tempBox2Size),S=Math.max(A.x,A.y);if(Math.max(c.x,c.y)!=0&&S!=0&&(c.z=A.z/Math.max(A.x,A.y)*Math.max(c.x,c.y)),r.lastScreenCoverage=Math.max(c.x,c.y,c.z),r.lastScreenspaceVolume.copy(c),r.lastScreenCoverage*=r.lastCentrality,I&&P.debugDrawLine){const p=this.tempMatrix.copy(this.projectionScreenMatrix);p.invert();const g=P.corner0,d=P.corner1,L=P.corner2,O=P.corner3;g.copy(this._tempBox.min),d.copy(this._tempBox.max),d.x=g.x,L.copy(this._tempBox.max),L.y=g.y,O.copy(this._tempBox.max);const k=(g.z+O.z)*.5;g.z=d.z=L.z=O.z=k,g.applyMatrix4(p),d.applyMatrix4(p),L.applyMatrix4(p),O.applyMatrix4(p),P.debugDrawLine(g,d,255),P.debugDrawLine(g,L,255),P.debugDrawLine(d,O,255),P.debugDrawLine(L,O,255)}let G=999;if(l&&r.lastScreenCoverage>0){for(let p=0;p<l.length;p++)if(l[p].density/r.lastScreenCoverage<n){G=p;break}}G<i&&(i=G,a=!0)}if(a?s.mesh_lod=i:s.mesh_lod=r.lastLodLevel_Mesh,I&&s.mesh_lod!=r.lastLodLevel_Mesh){const x=l?.[s.mesh_lod];x&&console.log(`Mesh LOD changed: ${r.lastLodLevel_Mesh} \u2192 ${s.mesh_lod} (${x.density.toFixed(0)}) - ${e.name}`)}if(m){const x="saveData"in globalThis.navigator&&globalThis.navigator.saveData===!0;if(r.lastLodLevel_Texture<0){if(s.texture_lod=f.max_count-1,I){const c=f.lods[f.max_count-1];I&&console.log(`First Texture LOD ${s.texture_lod} (${c.max_height}px) - ${e.name}`)}}else{const c=r.lastScreenspaceVolume.x+r.lastScreenspaceVolume.y+r.lastScreenspaceVolume.z;let D=r.lastScreenCoverage*4;((o=this.context)==null?void 0:o.engine)==="model-viewer"&&(D*=1.5);const _=E/window.devicePixelRatio*D;for(let A=f.lods.length-1;A>=0;A--){let S=f.lods[A];if(!(x&&S.max_height>=2048)&&!(et()&&S.max_height>4096)&&S.max_height>_){if(s.texture_lod=A,s.texture_lod<r.lastLodLevel_Texture){const G=S.max_height;I&&console.log(`Texture LOD changed: ${r.lastLodLevel_Texture} \u2192 ${s.texture_lod} = ${G}px
|
|
5
|
+
`,e.uuid),e=e.clone(),e.offset=t.offset,e.repeat=t.repeat,e.colorSpace=t.colorSpace,e.magFilter=t.magFilter,e.minFilter=t.minFilter,e.wrapS=t.wrapS,e.wrapT=t.wrapT,e.flipY=t.flipY,e.anisotropy=t.anisotropy,e.mipmaps||(e.generateMipmaps=t.generateMipmaps),e}};let S=w;S.registerTexture=(t,e,r,n,s)=>{if(v&&console.log("> Progressive: register texture",n,e.name,e.uuid,e,s),!e){v&&console.error("gltf-progressive: Register texture without texture");return}e.source&&(e.source[Le]=s);const o=s.guid;w.assignLODInformation(t,e,o,r,n,void 0),w.lodInfos.set(o,s),w.lowresCache.set(o,e)},S.registerMesh=(t,e,r,n,s,o)=>{var i;v&&console.log("> Progressive: register mesh",s,r.name,o,r.uuid,r);const a=r.geometry;if(!a){v&&console.warn("gltf-progressive: Register mesh without geometry");return}a.userData||(a.userData={}),w.assignLODInformation(t,a,e,n,s,o.density),w.lodInfos.set(e,o);let u=w.lowresCache.get(e);u?u.push(r.geometry):u=[r.geometry],w.lowresCache.set(e,u),n>0&&!J(r)&&tt(r,a);for(const l of N)(i=l.onRegisteredNewMesh)==null||i.call(l,r,o)},S.lodInfos=new Map,S.previouslyLoaded=new Map,S.lowresCache=new Map;class ot{constructor(e,r,n,s,o){this.url=e,this.key=r,this.level=n,s!=null&&(this.index=s),o!=null&&(this.density=o)}}var Pe=(t,e,r)=>{if(!e.has(t))throw TypeError("Cannot "+r)},y=(t,e,r)=>(Pe(t,e,"read from private field"),r?r.call(t):e.get(t)),X=(t,e,r)=>{if(e.has(t))throw TypeError("Cannot add the same private member more than once");e instanceof WeakSet?e.add(t):e.set(t,r)},W=(t,e,r,n)=>(Pe(t,e,"write to private field"),n?n.call(t,r):e.set(t,r),r),T,$,we,Q,oe,ce,U;const B=te("debugprogressive"),nt=te("noprogressive"),De=Symbol("Needle:LODSManager"),_e=Symbol("Needle:LODState"),F=Symbol("Needle:CurrentLOD"),C={mesh_lod:-1,texture_lod:-1},A=class{constructor(t,e){this.projectionScreenMatrix=new Oe,this.targetTriangleDensity=2e5,this.updateInterval="auto",X(this,T,1),this.pause=!1,this.manual=!1,this._lodchangedlisteners=[],X(this,$,void 0),X(this,we,new Ue),X(this,Q,0),X(this,oe,0),X(this,ce,0),X(this,U,0),this._fpsBuffer=[60,60,60,60,60],this._sphere=new Ne,this._tempBox=new be,this._tempBox2=new be,this.tempMatrix=new Oe,this._tempWorldPosition=new j,this._tempBoxSize=new j,this._tempBox2Size=new j,this.renderer=t,this.context={...e}}static getObjectLODState(t){return t[_e]}static addPlugin(t){N.push(t)}static removePlugin(t){const e=N.indexOf(t);e>=0&&N.splice(e,1)}static get(t,e){if(t[De])return console.debug("[gltf-progressive] LODsManager already exists for this renderer"),t[De];const r=new A(t,{engine:"unknown",...e});return t[De]=r,r}get plugins(){return N}addEventListener(t,e){t==="changed"&&this._lodchangedlisteners.push(e)}removeEventListener(t,e){if(t==="changed"){const r=this._lodchangedlisteners.indexOf(e);r>=0&&this._lodchangedlisteners.splice(r,1)}}enable(){if(y(this,$))return;console.debug("[gltf-progressive] Enabling LODsManager for renderer");let t=0;W(this,$,this.renderer.render);const e=this;me(this.renderer),this.renderer.render=function(r,n){const s=e.renderer.getRenderTarget();(s==null||"isXRRenderTarget"in s&&s.isXRRenderTarget)&&(t=0,W(e,Q,y(e,Q)+1),W(e,oe,y(e,we).getDelta()),W(e,ce,y(e,ce)+y(e,oe)),e._fpsBuffer.shift(),e._fpsBuffer.push(1/y(e,oe)),W(e,U,e._fpsBuffer.reduce((i,a)=>i+a)/e._fpsBuffer.length),B&&y(e,Q)%200===0&&console.log("FPS",Math.round(y(e,U)),"Interval:",y(e,T)));const o=t++;y(e,$).call(this,r,n),e.onAfterRender(r,n,o)}}disable(){y(this,$)&&(console.debug("[gltf-progressive] Disabling LODsManager for renderer"),this.renderer.render=y(this,$),W(this,$,void 0))}update(t,e){this.internalUpdate(t,e)}onAfterRender(t,e,r){if(this.pause)return;const n=this.renderer.renderLists.get(t,0).opaque;let s=!0;if(n.length===1){const o=n[0].material;(o.name==="EffectMaterial"||o.name==="CopyShader")&&(s=!1)}if((e.parent&&e.parent.type==="CubeCamera"||r>=1&&e.type==="OrthographicCamera")&&(s=!1),s){if(nt||(this.updateInterval==="auto"?y(this,U)<40&&y(this,T)<10?(W(this,T,y(this,T)+1),B&&console.warn("\u2193 Reducing LOD updates",y(this,T),y(this,U).toFixed(0))):y(this,U)>=60&&y(this,T)>1&&(W(this,T,y(this,T)-1),B&&console.warn("\u2191 Increasing LOD updates",y(this,T),y(this,U).toFixed(0))):W(this,T,this.updateInterval),y(this,T)>0&&y(this,Q)%y(this,T)!=0))return;this.internalUpdate(t,e)}}internalUpdate(t,e){var r,n;const s=this.renderer.renderLists.get(t,0),o=s.opaque;this.projectionScreenMatrix.multiplyMatrices(e.projectionMatrix,e.matrixWorldInverse);const i=this.targetTriangleDensity;for(const l of o){if(l.material&&(((r=l.geometry)==null?void 0:r.type)==="BoxGeometry"||((n=l.geometry)==null?void 0:n.type)==="BufferGeometry")&&(l.material.name==="SphericalGaussianBlur"||l.material.name=="BackgroundCubeMaterial"||l.material.name==="CubemapFromEquirect"||l.material.name==="EquirectangularToCubeUV")){B&&(l.material["NEEDLE_PROGRESSIVE:IGNORE-WARNING"]||(l.material["NEEDLE_PROGRESSIVE:IGNORE-WARNING"]=!0,console.warn("Ignoring skybox or BLIT object",l,l.material.name,l.material.type)));continue}switch(l.material.type){case"LineBasicMaterial":case"LineDashedMaterial":case"PointsMaterial":case"ShadowMaterial":case"MeshDistanceMaterial":case"MeshDepthMaterial":continue}if(B==="color"&&l.material&&!l.object.progressive_debug_color){l.object.progressive_debug_color=!0;const f=Math.random()*16777215,p=new $e({color:f});l.object.material=p}const h=l.object;(h instanceof V||h.isMesh)&&this.updateLODs(t,e,h,i)}const a=s.transparent;for(const l of a){const h=l.object;(h instanceof V||h.isMesh)&&this.updateLODs(t,e,h,i)}const u=s.transmissive;for(const l of u){const h=l.object;(h instanceof V||h.isMesh)&&this.updateLODs(t,e,h,i)}}updateLODs(t,e,r,n){var s,o;r.userData||(r.userData={});let i=r[_e];if(i||(i=new it,r[_e]=i),i.frames++<2)return;for(const u of N)(s=u.onBeforeUpdateLOD)==null||s.call(u,this.renderer,t,e,r);this.calculateLodLevel(e,r,i,n,C),C.mesh_lod=Math.round(C.mesh_lod),C.texture_lod=Math.round(C.texture_lod),C.mesh_lod>=0&&this.loadProgressiveMeshes(r,C.mesh_lod);let a=C.texture_lod;r.material&&a>=0&&this.loadProgressiveTextures(r.material,a);for(const u of N)(o=u.onAfterUpdatedLOD)==null||o.call(u,this.renderer,t,e,r,C);i.lastLodLevel_Mesh=C.mesh_lod,i.lastLodLevel_Texture=C.texture_lod}loadProgressiveTextures(t,e){if(!t)return;if(Array.isArray(t)){for(const s of t)this.loadProgressiveTextures(s,e);return}let r=!1;(t[F]===void 0||e<t[F])&&(r=!0);const n=t["DEBUG:LOD"];n!=null&&(r=t[F]!=n,e=n),r&&(t[F]=e,S.assignTextureLOD(t,e).then(s=>{this._lodchangedlisteners.forEach(o=>o({type:"texture",level:e,object:t}))}))}loadProgressiveMeshes(t,e){if(!t)return Promise.resolve(null);let r=t[F]!==e;const n=t["DEBUG:LOD"];if(n!=null&&(r=t[F]!=n,e=n),r){t[F]=e;const s=t.geometry;return S.assignMeshLOD(t,e).then(o=>(o&&t[F]==e&&s!=t.geometry&&this._lodchangedlisteners.forEach(i=>i({type:"mesh",level:e,object:t})),o))}return Promise.resolve(null)}static isInside(t,e){const r=t.min,n=t.max,s=(r.x+n.x)*.5,o=(r.y+n.y)*.5;return this._tempPtInside.set(s,o,r.z).applyMatrix4(e).z<0}calculateLodLevel(t,e,r,n,s){var o;if(!e){s.mesh_lod=-1,s.texture_lod=-1;return}if(!t){s.mesh_lod=-1,s.texture_lod=-1;return}let i=10+1,a=!1;if(B&&e["DEBUG:LOD"]!=null)return e["DEBUG:LOD"];const u=S.getMeshLODInformation(e.geometry),l=u?.lods,h=l&&l.length>0,f=S.getMaterialMinMaxLODsCount(e.material),p=f?.min_count!=1/0&&f.min_count>0&&f.max_count>0;if(!h&&!p){s.mesh_lod=0,s.texture_lod=0;return}h||(a=!0,i=0);const E=this.renderer.domElement.clientHeight||this.renderer.domElement.height;let M=e.geometry.boundingBox;if(e.type==="SkinnedMesh"){const x=e;if(!x.boundingBox)x.computeBoundingBox();else if(r.frames%30===0){const c=J(x),D=x.geometry;c&&(x.geometry=c),x.computeBoundingBox(),x.geometry=D}M=x.boundingBox}if(M){const x=t;if(e.geometry.attributes.color&&e.geometry.attributes.color.count<100&&e.geometry.boundingSphere){this._sphere.copy(e.geometry.boundingSphere),this._sphere.applyMatrix4(e.matrixWorld);const g=t.getWorldPosition(this._tempWorldPosition);if(this._sphere.containsPoint(g)){s.mesh_lod=0,s.texture_lod=0;return}}if(this._tempBox.copy(M),this._tempBox.applyMatrix4(e.matrixWorld),x.isPerspectiveCamera&&A.isInside(this._tempBox,this.projectionScreenMatrix)){s.mesh_lod=0,s.texture_lod=0;return}if(this._tempBox.applyMatrix4(this.projectionScreenMatrix),this.renderer.xr.enabled&&x.isPerspectiveCamera&&x.fov>70){const g=this._tempBox.min,m=this._tempBox.max;let d=g.x,L=g.y,b=m.x,k=m.y;const z=2,K=1.5,ne=(g.x+m.x)*.5,ie=(g.y+m.y)*.5;d=(d-ne)*z+ne,L=(L-ie)*z+ie,b=(b-ne)*z+ne,k=(k-ie)*z+ie;const je=d<0&&b>0?0:Math.min(Math.abs(g.x),Math.abs(m.x)),Ge=L<0&&k>0?0:Math.min(Math.abs(g.y),Math.abs(m.y)),fe=Math.max(je,Ge);r.lastCentrality=(K-fe)*(K-fe)*(K-fe)}else r.lastCentrality=1;const c=this._tempBox.getSize(this._tempBoxSize);c.multiplyScalar(.5),screen.availHeight>0&&E>0&&c.multiplyScalar(E/screen.availHeight),t.isPerspectiveCamera?c.x*=t.aspect:t.isOrthographicCamera;const D=t.matrixWorldInverse,_=this._tempBox2;_.copy(M),_.applyMatrix4(e.matrixWorld),_.applyMatrix4(D);const P=_.getSize(this._tempBox2Size),O=Math.max(P.x,P.y);if(Math.max(c.x,c.y)!=0&&O!=0&&(c.z=P.z/Math.max(P.x,P.y)*Math.max(c.x,c.y)),r.lastScreenCoverage=Math.max(c.x,c.y,c.z),r.lastScreenspaceVolume.copy(c),r.lastScreenCoverage*=r.lastCentrality,B&&A.debugDrawLine){const g=this.tempMatrix.copy(this.projectionScreenMatrix);g.invert();const m=A.corner0,d=A.corner1,L=A.corner2,b=A.corner3;m.copy(this._tempBox.min),d.copy(this._tempBox.max),d.x=m.x,L.copy(this._tempBox.max),L.y=m.y,b.copy(this._tempBox.max);const k=(m.z+b.z)*.5;m.z=d.z=L.z=b.z=k,m.applyMatrix4(g),d.applyMatrix4(g),L.applyMatrix4(g),b.applyMatrix4(g),A.debugDrawLine(m,d,255),A.debugDrawLine(m,L,255),A.debugDrawLine(d,b,255),A.debugDrawLine(L,b,255)}let I=999;if(l&&r.lastScreenCoverage>0){for(let g=0;g<l.length;g++)if(l[g].density/r.lastScreenCoverage<n){I=g;break}}I<i&&(i=I,a=!0)}if(a?s.mesh_lod=i:s.mesh_lod=r.lastLodLevel_Mesh,B&&s.mesh_lod!=r.lastLodLevel_Mesh){const x=l?.[s.mesh_lod];x&&console.log(`Mesh LOD changed: ${r.lastLodLevel_Mesh} \u2192 ${s.mesh_lod} (${x.density.toFixed(0)}) - ${e.name}`)}if(p){const x="saveData"in globalThis.navigator&&globalThis.navigator.saveData===!0;if(r.lastLodLevel_Texture<0){if(s.texture_lod=f.max_count-1,B){const c=f.lods[f.max_count-1];B&&console.log(`First Texture LOD ${s.texture_lod} (${c.max_height}px) - ${e.name}`)}}else{const c=r.lastScreenspaceVolume.x+r.lastScreenspaceVolume.y+r.lastScreenspaceVolume.z;let D=r.lastScreenCoverage*4;((o=this.context)==null?void 0:o.engine)==="model-viewer"&&(D*=1.5);const _=E/window.devicePixelRatio*D;let P=!1;for(let O=f.lods.length-1;O>=0;O--){let I=f.lods[O];if(!(x&&I.max_height>=2048)&&!(Ze()&&I.max_height>4096)&&(I.max_height>_||!P&&O===0)){if(P=!0,s.texture_lod=O,s.texture_lod<r.lastLodLevel_Texture){const g=I.max_height;B&&console.log(`Texture LOD changed: ${r.lastLodLevel_Texture} \u2192 ${s.texture_lod} = ${g}px
|
|
6
6
|
Screensize: ${_.toFixed(0)}px, Coverage: ${(100*r.lastScreenCoverage).toFixed(2)}%, Volume ${c.toFixed(1)}
|
|
7
|
-
${e.name}`)}break}}}}else s.texture_lod=0}};let
|
|
8
|
-
`,t.getAttribute("src"));let e=null,r=null,n=null;for(let s=t;s!=null;s=Object.getPrototypeOf(s)){const o=Object.getOwnPropertySymbols(s),i=o.find(l=>l.toString()=="Symbol(renderer)"),a=o.find(l=>l.toString()=="Symbol(scene)"),u=o.find(l=>l.toString()=="Symbol(needsRender)");!e&&i!=null&&(e=t[i].threeRenderer),!r&&a!=null&&(r=t[a]),!n&&u!=null&&(n=t[u])}if(e&&r){let s=function(){if(n){let i=0,a=setInterval(()=>{if(i++>5){clearInterval(a);return}n?.call(t)},300)}};console.debug("[gltf-progressive] setup model-viewer");const o=
|
|
7
|
+
${e.name}`)}break}}}}else s.texture_lod=0}};let R=A;T=new WeakMap,$=new WeakMap,we=new WeakMap,Q=new WeakMap,oe=new WeakMap,ce=new WeakMap,U=new WeakMap,R.corner0=new j,R.corner1=new j,R.corner2=new j,R.corner3=new j,R._tempPtInside=new j;class it{constructor(){this.frames=0,this.lastLodLevel_Mesh=-1,this.lastLodLevel_Texture=-1,this.lastScreenCoverage=0,this.lastScreenspaceVolume=new j,this.lastCentrality=0}}const Ie=Symbol("NEEDLE_mesh_lod"),de=Symbol("NEEDLE_texture_lod");let he=null;function Be(){const t=lt();t&&(t.mapURLs(function(e){return Ce(),e}),Ce(),he?.disconnect(),he=new MutationObserver(e=>{e.forEach(r=>{r.addedNodes.forEach(n=>{n instanceof HTMLElement&&n.tagName.toLowerCase()==="model-viewer"&&Re(n)})})}),he.observe(document,{childList:!0,subtree:!0}))}function lt(){return typeof customElements>"u"?null:customElements.get("model-viewer")||(customElements.whenDefined("model-viewer").then(()=>{console.debug("[gltf-progressive] model-viewer defined"),Be()}),null)}function Ce(){typeof document>"u"||document.querySelectorAll("model-viewer").forEach(t=>{Re(t)})}const ke=new WeakSet;let at=0;function Re(t){if(!t||ke.has(t))return null;ke.add(t),console.debug("[gltf-progressive] found new model-viewer..."+ ++at+`
|
|
8
|
+
`,t.getAttribute("src"));let e=null,r=null,n=null;for(let s=t;s!=null;s=Object.getPrototypeOf(s)){const o=Object.getOwnPropertySymbols(s),i=o.find(l=>l.toString()=="Symbol(renderer)"),a=o.find(l=>l.toString()=="Symbol(scene)"),u=o.find(l=>l.toString()=="Symbol(needsRender)");!e&&i!=null&&(e=t[i].threeRenderer),!r&&a!=null&&(r=t[a]),!n&&u!=null&&(n=t[u])}if(e&&r){let s=function(){if(n){let i=0,a=setInterval(()=>{if(i++>5){clearInterval(a);return}n?.call(t)},300)}};console.debug("[gltf-progressive] setup model-viewer");const o=R.get(e,{engine:"model-viewer"});return R.addPlugin(new ut),o.enable(),o.addEventListener("changed",()=>{n?.call(t)}),t.addEventListener("model-visibility",i=>{i.detail.visible&&n?.call(t)}),t.addEventListener("load",()=>{s()}),()=>{o.disable()}}return null}class ut{constructor(){this._didWarnAboutMissingUrl=!1}onBeforeUpdateLOD(e,r,n,s){this.tryParseMeshLOD(r,s),this.tryParseTextureLOD(r,s)}getUrl(e){if(!e)return null;let r=e.getAttribute("src");return r||(r=e.src),r||(this._didWarnAboutMissingUrl||console.warn("No url found in modelviewer",e),this._didWarnAboutMissingUrl=!0),r}tryGetCurrentGLTF(e){return e._currentGLTF}tryGetCurrentModelViewer(e){return e.element}tryParseTextureLOD(e,r){if(r[de]==!0)return;r[de]=!0;const n=this.tryGetCurrentGLTF(e),s=this.tryGetCurrentModelViewer(e),o=this.getUrl(s);if(o&&n&&r.material){let i=function(u){var l,h,f;if(u[de]==!0)return;u[de]=!0,u.userData&&(u.userData.LOD=-1);const p=Object.keys(u);for(let E=0;E<p.length;E++){const M=p[E],x=u[M];if(x?.isTexture===!0){const c=(h=(l=x.userData)==null?void 0:l.associations)==null?void 0:h.textures;if(c==null)continue;const D=n.parser.json.textures[c];if(!D){console.warn("Texture data not found for texture index "+c);continue}if((f=D?.extensions)!=null&&f[G]){const _=D.extensions[G];_&&o&&S.registerTexture(o,x,_.lods.length,c,_)}}}};const a=r.material;if(Array.isArray(a))for(const u of a)i(u);else i(a)}}tryParseMeshLOD(e,r){var n,s;if(r[Ie]==!0)return;r[Ie]=!0;const o=this.tryGetCurrentModelViewer(e),i=this.getUrl(o);if(!i)return;const a=(s=(n=r.userData)==null?void 0:n.gltfExtensions)==null?void 0:s[G];if(a&&i){const u=r.uuid;S.registerMesh(i,u,r,0,a.lods.length,a)}}}function ct(t,e,r,n){me(e),pe(r),xe(r,{progressive:!0,...n?.hints}),r.register(o=>new S(o,t));const s=R.get(e);return n?.enableLODsManager!==!1&&s.enable(),s}if(Be(),!et){const t={gltfProgressive:{useNeedleProgressive:ct,LODsManager:R,configureLoader:xe,getRaycastMesh:J,useRaycastMeshes:rt}};if(!globalThis.Needle)globalThis.Needle=t;else for(const e in t)globalThis.Needle[e]=t[e]}export{R as L,S as N,pe as a,xe as b,me as c,Ye as d,J as g,Ke as s};
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
"use strict";const h=require("./three.light.umd.cjs"),Q=require("./three-examples.light.umd.cjs"),Ae="";globalThis.GLTF_PROGRESSIVE_VERSION=Ae;console.debug(`[gltf-progressive] version ${Ae}`);let Z="https://www.gstatic.com/draco/versioned/decoders/1.5.7/",ne="https://www.gstatic.com/basis-universal/versioned/2021-04-15-ba1c3e4/";const Ie=Z,Ne=ne,$e=new URL(Z+"draco_decoder.js");fetch($e,{method:"GET",headers:{Range:"bytes=0-1"}}).catch(t=>{Z===Ie&&(Z="./include/draco/"),ne===Ne&&(ne="./include/ktx2/")}).finally(()=>{Ce()});function Fe(t){Z=t}function Ve(t){ne=t}let K,de,Y;function Ce(){K||(K=new Q.DRACOLoader,K.setDecoderPath(Z),K.setDecoderConfig({type:"js"}),K.preload()),Y||(Y=new Q.KTX2Loader,Y.setTranscoderPath(ne),Y.init()),de||(de=Q.MeshoptDecoder)}function ve(t){return Ce(),t?Y.detectSupport(t):t!==null&&console.warn("No renderer provided to detect ktx2 support - loading KTX2 textures might fail"),{dracoLoader:K,ktx2Loader:Y,meshoptDecoder:de}}function we(t){t.dracoLoader||t.setDRACOLoader(K),t.ktx2Loader||t.setKTX2Loader(Y),t.meshoptDecoder||t.setMeshoptDecoder(de)}const me=new WeakMap;function Oe(t,e){let s=me.get(t);s?s=Object.assign(s,e):s=e,me.set(t,s)}const pe=Q.GLTFLoader.prototype.load;function Ue(...t){const e=me.get(this);let s=t[0];const n=new URL(s,window.location.href);if(n.hostname.endsWith("needle.tools")){const r=(e==null?void 0:e.progressive)!==void 0?e.progressive:!0,o=e!=null&&e.usecase?e.usecase:"default";r?this.requestHeader.Accept=`*/*;progressive=allowed;usecase=${o}`:this.requestHeader.Accept=`*/*;usecase=${o}`,s=n.toString()}return t[0]=s,pe==null?void 0:pe.call(this,...t)}Q.GLTFLoader.prototype.load=Ue;oe("debugprogressive");function oe(t){if(typeof window>"u")return!1;const s=new URL(window.location.href).searchParams.get(t);return s==null||s==="0"||s==="false"?!1:s===""?!0:s}function We(t,e){if(e===void 0||e.startsWith("./")||e.startsWith("http")||t===void 0)return e;const s=t.lastIndexOf("/");if(s>=0){const n=t.substring(0,s+1);for(;n.endsWith("/")&&e.startsWith("/");)e=e.substring(1);return n+e}return e}let ee;function ze(){return ee!==void 0||(ee=/iPhone|iPad|iPod|Android|IEMobile/i.test(navigator.userAgent),oe("debugprogressive")&&console.log("[glTF Progressive]: isMobileDevice",ee)),ee}const qe=typeof window>"u"&&typeof document>"u",xe=Symbol("needle:raycast-mesh");function j(t){return(t==null?void 0:t[xe])instanceof h.BufferGeometry?t[xe]:null}function Xe(t,e){if((t.type==="Mesh"||t.type==="SkinnedMesh")&&!j(t)){const n=Ye(e);n.userData={isRaycastMesh:!0},t[xe]=n}}function Ke(t=!0){if(t){if(te)return;const e=te=h.Mesh.prototype.raycast;h.Mesh.prototype.raycast=function(s,n){const i=this,r=j(i);let o;r&&i.isMesh&&(o=i.geometry,i.geometry=r),e.call(this,s,n),o&&(i.geometry=o)}}else{if(!te)return;h.Mesh.prototype.raycast=te,te=null}}let te=null;function Ye(t){const e=new h.BufferGeometry;for(const s in t.attributes)e.setAttribute(s,t.getAttribute(s));return e.setIndex(t.getIndex()),e}const q=new Array,F="NEEDLE_progressive",L=oe("debugprogressive"),Me=Symbol("needle-progressive-texture"),ie=new Map,De=new Set;if(L){let t=function(){e+=1,console.log("Toggle LOD level",e,ie),ie.forEach((i,r)=>{for(const o of i.keys){const a=r[o];if(a!=null){if(a.isBufferGeometry===!0){const c=w.getMeshLODInformation(a),l=c?Math.min(e,c.lods.length):0;r["DEBUG:LOD"]=e,w.assignMeshLOD(r,l),c&&(s=Math.max(s,c.lods.length-1))}else if(r.isMaterial===!0){r["DEBUG:LOD"]=e,w.assignTextureLOD(r,e);break}}}}),e>=s&&(e=-1)},e=-1,s=2,n=!1;window.addEventListener("keyup",i=>{i.key==="p"&&t(),i.key==="w"&&(n=!n,De&&De.forEach(r=>{r.name!="BackgroundCubeMaterial"&&r.glyphMap==null&&"wireframe"in r&&(r.wireframe=n)}))})}function Se(t,e,s){var i;if(!L)return;ie.has(t)||ie.set(t,{keys:[],sourceId:s});const n=ie.get(t);((i=n==null?void 0:n.keys)==null?void 0:i.includes(e))==!1&&n.keys.push(e)}const _=class{constructor(t,e){this.loadMesh=s=>{var i,r;if(this._isLoadingMesh)return null;const n=(r=(i=this.parser.json.meshes[s])==null?void 0:i.extensions)==null?void 0:r[F];return n?(this._isLoadingMesh=!0,this.parser.getDependency("mesh",s).then(o=>{var a;return this._isLoadingMesh=!1,o&&_.registerMesh(this.url,n.guid,o,(a=n.lods)==null?void 0:a.length,void 0,n),o})):null},L&&console.log("Progressive extension registered for",e),this.parser=t,this.url=e}get name(){return F}static getMeshLODInformation(t){const e=this.getAssignedLODInformation(t);return e!=null&&e.key?this.lodInfos.get(e.key):null}static getMaterialMinMaxLODsCount(t,e){const s=this,n="LODS:minmax",i=t[n];if(i!=null)return i;if(e||(e={min_count:1/0,max_count:0,lods:[]}),Array.isArray(t)){for(const o of t)this.getMaterialMinMaxLODsCount(o,e);return t[n]=e,e}if(L==="verbose"&&console.log("getMaterialMinMaxLODsCount",t),t.type==="ShaderMaterial"||t.type==="RawShaderMaterial"){const o=t;for(const a of Object.keys(o.uniforms)){const c=o.uniforms[a].value;(c==null?void 0:c.isTexture)===!0&&r(c,e)}}else if(t.isMaterial)for(const o of Object.keys(t)){const a=t[o];(a==null?void 0:a.isTexture)===!0&&r(a,e)}return t[n]=e,e;function r(o,a){const c=s.getAssignedLODInformation(o);if(c){const l=s.lodInfos.get(c.key);if(l&&l.lods){a.min_count=Math.min(a.min_count,l.lods.length),a.max_count=Math.max(a.max_count,l.lods.length);for(let d=0;d<l.lods.length;d++){const g=l.lods[d];g.width&&(a.lods[d]=a.lods[d]||{min_height:1/0,max_height:0},a.lods[d].min_height=Math.min(a.lods[d].min_height,g.height),a.lods[d].max_height=Math.max(a.lods[d].max_height,g.height))}}}}}static hasLODLevelAvailable(t,e){var i;if(Array.isArray(t)){for(const r of t)if(this.hasLODLevelAvailable(r,e))return!0;return!1}if(t.isMaterial===!0){for(const r of Object.keys(t)){const o=t[r];if(o&&o.isTexture&&this.hasLODLevelAvailable(o,e))return!0}return!1}else if(t.isGroup===!0){for(const r of t.children)if(r.isMesh===!0&&this.hasLODLevelAvailable(r,e))return!0}let s,n;if(t.isMesh?s=t.geometry:(t.isBufferGeometry||t.isTexture)&&(s=t),s&&(i=s==null?void 0:s.userData)!=null&&i.LODS){const r=s.userData.LODS;if(n=this.lodInfos.get(r.key),e===void 0)return n!=null;if(n)return Array.isArray(n.lods)?e<n.lods.length:e===0}return!1}static assignMeshLOD(t,e){var s;if(!t)return Promise.resolve(null);if(t instanceof h.Mesh||t.isMesh===!0){const n=t.geometry,i=this.getAssignedLODInformation(n);if(!i)return Promise.resolve(null);for(const r of q)(s=r.onBeforeGetLODMesh)==null||s.call(r,t,e);return t["LOD:requested level"]=e,_.getOrLoadLOD(n,e).then(r=>{if(Array.isArray(r)){const o=i.index||0;r=r[o]}return t["LOD:requested level"]===e&&(delete t["LOD:requested level"],r&&n!=r&&((r==null?void 0:r.isBufferGeometry)?(t.geometry=r,L&&Se(t,"geometry",i.url)):L&&console.error("Invalid LOD geometry",r))),r}).catch(r=>(console.error("Error loading mesh LOD",t,r),null))}else L&&console.error("Invalid call to assignMeshLOD: Request mesh LOD but the object is not a mesh",t);return Promise.resolve(null)}static assignTextureLOD(t,e=0){if(!t)return Promise.resolve(null);if(t.isMesh===!0){const s=t;if(Array.isArray(s.material)){const n=new Array;for(const i of s.material){const r=this.assignTextureLOD(i,e);n.push(r)}return Promise.all(n).then(i=>{const r=new Array;for(const o of i)Array.isArray(o)&&r.push(...o);return r})}else return this.assignTextureLOD(s.material,e)}if(t instanceof h.Material||t.isMaterial===!0){const s=t,n=[],i=new Array;if(L&&De.add(s),s.uniforms&&(s.isRawShaderMaterial||s.isShaderMaterial===!0)){const r=s;for(const o of Object.keys(r.uniforms)){const a=r.uniforms[o].value;if((a==null?void 0:a.isTexture)===!0){const c=this.assignTextureLODForSlot(a,e,s,o).then(l=>(l&&r.uniforms[o].value!=l&&(r.uniforms[o].value=l,r.uniformsNeedUpdate=!0),l));n.push(c),i.push(o)}}}else for(const r of Object.keys(s)){const o=s[r];if((o==null?void 0:o.isTexture)===!0){const a=this.assignTextureLODForSlot(o,e,s,r);n.push(a),i.push(r)}}return Promise.all(n).then(r=>{const o=new Array;for(let a=0;a<r.length;a++){const c=r[a],l=i[a];c&&c.isTexture===!0?o.push({material:s,slot:l,texture:c,level:e}):o.push({material:s,slot:l,texture:null,level:e})}return o})}if(t instanceof h.Texture||t.isTexture===!0){const s=t;return this.assignTextureLODForSlot(s,e,null,null)}return Promise.resolve(null)}static assignTextureLODForSlot(t,e,s,n){return(t==null?void 0:t.isTexture)!==!0?Promise.resolve(null):n==="glyphMap"?Promise.resolve(t):_.getOrLoadLOD(t,e).then(i=>{if(Array.isArray(i))return null;if((i==null?void 0:i.isTexture)===!0){if(i!=t){if(s&&n){const r=s[n];if(r){const o=this.getAssignedLODInformation(r);if(o&&(o==null?void 0:o.level)<e)return L==="verbose"&&console.warn("Assigned texture level is already higher: ",o.level,e,s,r,i),null}s[n]=i}if(L&&n&&s){const r=this.getAssignedLODInformation(t);r&&Se(s,n,r.url)}}return i}else L=="verbose"&&console.warn("No LOD found for",t,e);return null}).catch(i=>(console.error("Error loading LOD",t,i),null))}afterRoot(t){var e,s;return L&&console.log("AFTER",this.url,t),(e=this.parser.json.textures)==null||e.forEach((n,i)=>{var r;if(n!=null&&n.extensions){const o=n==null?void 0:n.extensions[F];if(o){if(!o.lods){L&&console.warn("Texture has no LODs",o);return}let a=!1;for(const c of this.parser.associations.keys())if(c.isTexture===!0){const l=this.parser.associations.get(c);(l==null?void 0:l.textures)===i&&(a=!0,_.registerTexture(this.url,c,(r=o.lods)==null?void 0:r.length,i,o))}a||this.parser.getDependency("texture",i).then(c=>{var l;c&&_.registerTexture(this.url,c,(l=o.lods)==null?void 0:l.length,i,o)})}}}),(s=this.parser.json.meshes)==null||s.forEach((n,i)=>{if(n!=null&&n.extensions){const r=n==null?void 0:n.extensions[F];if(r&&r.lods){for(const o of this.parser.associations.keys())if(o.isMesh){const a=this.parser.associations.get(o);(a==null?void 0:a.meshes)===i&&_.registerMesh(this.url,r.guid,o,r.lods.length,a.primitives,r)}}}}),null}static async getOrLoadLOD(t,e){var o,a,c,l;const s=L=="verbose",n=t.userData.LODS;if(!n)return null;const i=n==null?void 0:n.key;let r;if(t.isTexture===!0){const d=t;d.source&&d.source[Me]&&(r=d.source[Me])}if(r||(r=_.lodInfos.get(i)),r){if(e>0){let x=!1;const m=Array.isArray(r.lods);if(m&&e>=r.lods.length?x=!0:m||(x=!0),x)return this.lowresCache.get(i)}const d=Array.isArray(r.lods)?(o=r.lods[e])==null?void 0:o.path:r.lods;if(!d)return L&&!r["missing:uri"]&&(r["missing:uri"]=!0,console.warn("Missing uri for progressive asset for LOD "+e,r)),null;const g=We(n.url,d);if(g.endsWith(".glb")||g.endsWith(".gltf")){if(!r.guid)return console.warn("missing pointer for glb/gltf texture",r),null;const x=g+"_"+r.guid,m=this.previouslyLoaded.get(x);if(m!==void 0){s&&console.log(`LOD ${e} was already loading/loaded: ${x}`);let f=await m.catch(I=>(console.error(`Error loading LOD ${e} from ${g}
|
|
2
|
-
`,I),null)),O=!1;if(f==null||(f instanceof
|
|
3
|
-
`,
|
|
1
|
+
"use strict";const g=require("./three.light.umd.cjs"),Q=require("./three-examples.light.umd.cjs"),Ae="";globalThis.GLTF_PROGRESSIVE_VERSION=Ae;console.debug(`[gltf-progressive] version ${Ae}`);let Z="https://www.gstatic.com/draco/versioned/decoders/1.5.7/",oe="https://www.gstatic.com/basis-universal/versioned/2021-04-15-ba1c3e4/";const Ie=Z,Ne=oe,$e=new URL(Z+"draco_decoder.js");fetch($e,{method:"GET",headers:{Range:"bytes=0-1"}}).catch(t=>{Z===Ie&&(Z="./include/draco/"),oe===Ne&&(oe="./include/ktx2/")}).finally(()=>{Ce()});function Fe(t){Z=t}function Ve(t){oe=t}let Y,de,H;function Ce(){Y||(Y=new Q.DRACOLoader,Y.setDecoderPath(Z),Y.setDecoderConfig({type:"js"}),Y.preload()),H||(H=new Q.KTX2Loader,H.setTranscoderPath(oe),H.init()),de||(de=Q.MeshoptDecoder)}function ve(t){return Ce(),t?H.detectSupport(t):t!==null&&console.warn("No renderer provided to detect ktx2 support - loading KTX2 textures might fail"),{dracoLoader:Y,ktx2Loader:H,meshoptDecoder:de}}function we(t){t.dracoLoader||t.setDRACOLoader(Y),t.ktx2Loader||t.setKTX2Loader(H),t.meshoptDecoder||t.setMeshoptDecoder(de)}const me=new WeakMap;function Oe(t,e){let s=me.get(t);s?s=Object.assign(s,e):s=e,me.set(t,s)}const pe=Q.GLTFLoader.prototype.load;function Ue(...t){const e=me.get(this);let s=t[0];const o=new URL(s,window.location.href);if(o.hostname.endsWith("needle.tools")){const r=(e==null?void 0:e.progressive)!==void 0?e.progressive:!0,n=e!=null&&e.usecase?e.usecase:"default";r?this.requestHeader.Accept=`*/*;progressive=allowed;usecase=${n}`:this.requestHeader.Accept=`*/*;usecase=${n}`,s=o.toString()}return t[0]=s,pe==null?void 0:pe.call(this,...t)}Q.GLTFLoader.prototype.load=Ue;ne("debugprogressive");function ne(t){if(typeof window>"u")return!1;const s=new URL(window.location.href).searchParams.get(t);return s==null||s==="0"||s==="false"?!1:s===""?!0:s}function We(t,e){if(e===void 0||e.startsWith("./")||e.startsWith("http")||t===void 0)return e;const s=t.lastIndexOf("/");if(s>=0){const o=t.substring(0,s+1);for(;o.endsWith("/")&&e.startsWith("/");)e=e.substring(1);return o+e}return e}let ee;function ze(){return ee!==void 0||(ee=/iPhone|iPad|iPod|Android|IEMobile/i.test(navigator.userAgent),ne("debugprogressive")&&console.log("[glTF Progressive]: isMobileDevice",ee)),ee}const qe=typeof window>"u"&&typeof document>"u",xe=Symbol("needle:raycast-mesh");function j(t){return(t==null?void 0:t[xe])instanceof g.BufferGeometry?t[xe]:null}function Xe(t,e){if((t.type==="Mesh"||t.type==="SkinnedMesh")&&!j(t)){const o=Ye(e);o.userData={isRaycastMesh:!0},t[xe]=o}}function Ke(t=!0){if(t){if(te)return;const e=te=g.Mesh.prototype.raycast;g.Mesh.prototype.raycast=function(s,o){const i=this,r=j(i);let n;r&&i.isMesh&&(n=i.geometry,i.geometry=r),e.call(this,s,o),n&&(i.geometry=n)}}else{if(!te)return;g.Mesh.prototype.raycast=te,te=null}}let te=null;function Ye(t){const e=new g.BufferGeometry;for(const s in t.attributes)e.setAttribute(s,t.getAttribute(s));return e.setIndex(t.getIndex()),e}const X=new Array,V="NEEDLE_progressive",y=ne("debugprogressive"),Me=Symbol("needle-progressive-texture"),ie=new Map,De=new Set;if(y){let t=function(){e+=1,console.log("Toggle LOD level",e,ie),ie.forEach((i,r)=>{for(const n of i.keys){const a=r[n];if(a!=null)if(a.isBufferGeometry===!0){const c=E.getMeshLODInformation(a),l=c?Math.min(e,c.lods.length):0;r["DEBUG:LOD"]=l,c&&(s=Math.max(s,c.lods.length-1))}else r.isMaterial===!0&&(r["DEBUG:LOD"]=e)}}),e>=s&&(e=-1)},e=-1,s=2,o=!1;window.addEventListener("keyup",i=>{i.key==="p"&&t(),i.key==="w"&&(o=!o,De&&De.forEach(r=>{r.name!="BackgroundCubeMaterial"&&r.glyphMap==null&&"wireframe"in r&&(r.wireframe=o)}))})}function Se(t,e,s){var i;if(!y)return;ie.has(t)||ie.set(t,{keys:[],sourceId:s});const o=ie.get(t);((i=o==null?void 0:o.keys)==null?void 0:i.includes(e))==!1&&o.keys.push(e)}const _=class{constructor(t,e){this.loadMesh=s=>{var i,r;if(this._isLoadingMesh)return null;const o=(r=(i=this.parser.json.meshes[s])==null?void 0:i.extensions)==null?void 0:r[V];return o?(this._isLoadingMesh=!0,this.parser.getDependency("mesh",s).then(n=>{var a;return this._isLoadingMesh=!1,n&&_.registerMesh(this.url,o.guid,n,(a=o.lods)==null?void 0:a.length,void 0,o),n})):null},y&&console.log("Progressive extension registered for",e),this.parser=t,this.url=e}get name(){return V}static getMeshLODInformation(t){const e=this.getAssignedLODInformation(t);return e!=null&&e.key?this.lodInfos.get(e.key):null}static getMaterialMinMaxLODsCount(t,e){const s=this,o="LODS:minmax",i=t[o];if(i!=null)return i;if(e||(e={min_count:1/0,max_count:0,lods:[]}),Array.isArray(t)){for(const n of t)this.getMaterialMinMaxLODsCount(n,e);return t[o]=e,e}if(y==="verbose"&&console.log("getMaterialMinMaxLODsCount",t),t.type==="ShaderMaterial"||t.type==="RawShaderMaterial"){const n=t;for(const a of Object.keys(n.uniforms)){const c=n.uniforms[a].value;(c==null?void 0:c.isTexture)===!0&&r(c,e)}}else if(t.isMaterial)for(const n of Object.keys(t)){const a=t[n];(a==null?void 0:a.isTexture)===!0&&r(a,e)}return t[o]=e,e;function r(n,a){const c=s.getAssignedLODInformation(n);if(c){const l=s.lodInfos.get(c.key);if(l&&l.lods){a.min_count=Math.min(a.min_count,l.lods.length),a.max_count=Math.max(a.max_count,l.lods.length);for(let d=0;d<l.lods.length;d++){const h=l.lods[d];h.width&&(a.lods[d]=a.lods[d]||{min_height:1/0,max_height:0},a.lods[d].min_height=Math.min(a.lods[d].min_height,h.height),a.lods[d].max_height=Math.max(a.lods[d].max_height,h.height))}}}}}static hasLODLevelAvailable(t,e){var i;if(Array.isArray(t)){for(const r of t)if(this.hasLODLevelAvailable(r,e))return!0;return!1}if(t.isMaterial===!0){for(const r of Object.keys(t)){const n=t[r];if(n&&n.isTexture&&this.hasLODLevelAvailable(n,e))return!0}return!1}else if(t.isGroup===!0){for(const r of t.children)if(r.isMesh===!0&&this.hasLODLevelAvailable(r,e))return!0}let s,o;if(t.isMesh?s=t.geometry:(t.isBufferGeometry||t.isTexture)&&(s=t),s&&(i=s==null?void 0:s.userData)!=null&&i.LODS){const r=s.userData.LODS;if(o=this.lodInfos.get(r.key),e===void 0)return o!=null;if(o)return Array.isArray(o.lods)?e<o.lods.length:e===0}return!1}static assignMeshLOD(t,e){var s;if(!t)return Promise.resolve(null);if(t instanceof g.Mesh||t.isMesh===!0){const o=t.geometry,i=this.getAssignedLODInformation(o);if(!i)return Promise.resolve(null);for(const r of X)(s=r.onBeforeGetLODMesh)==null||s.call(r,t,e);return t["LOD:requested level"]=e,_.getOrLoadLOD(o,e).then(r=>{if(Array.isArray(r)){const n=i.index||0;r=r[n]}return t["LOD:requested level"]===e&&(delete t["LOD:requested level"],r&&o!=r&&((r==null?void 0:r.isBufferGeometry)?(t.geometry=r,y&&Se(t,"geometry",i.url)):y&&console.error("Invalid LOD geometry",r))),r}).catch(r=>(console.error("Error loading mesh LOD",t,r),null))}else y&&console.error("Invalid call to assignMeshLOD: Request mesh LOD but the object is not a mesh",t);return Promise.resolve(null)}static assignTextureLOD(t,e=0){if(!t)return Promise.resolve(null);if(t.isMesh===!0){const s=t;if(Array.isArray(s.material)){const o=new Array;for(const i of s.material){const r=this.assignTextureLOD(i,e);o.push(r)}return Promise.all(o).then(i=>{const r=new Array;for(const n of i)Array.isArray(n)&&r.push(...n);return r})}else return this.assignTextureLOD(s.material,e)}if(t.isMaterial===!0){const s=t,o=[],i=new Array;if(y&&De.add(s),s.uniforms&&(s.isRawShaderMaterial||s.isShaderMaterial===!0)){const r=s;for(const n of Object.keys(r.uniforms)){const a=r.uniforms[n].value;if((a==null?void 0:a.isTexture)===!0){const c=this.assignTextureLODForSlot(a,e,s,n).then(l=>(l&&r.uniforms[n].value!=l&&(r.uniforms[n].value=l,r.uniformsNeedUpdate=!0),l));o.push(c),i.push(n)}}}else for(const r of Object.keys(s)){const n=s[r];if((n==null?void 0:n.isTexture)===!0){const a=this.assignTextureLODForSlot(n,e,s,r);o.push(a),i.push(r)}}return Promise.all(o).then(r=>{const n=new Array;for(let a=0;a<r.length;a++){const c=r[a],l=i[a];c&&c.isTexture===!0?n.push({material:s,slot:l,texture:c,level:e}):n.push({material:s,slot:l,texture:null,level:e})}return n})}if(t instanceof g.Texture||t.isTexture===!0){const s=t;return this.assignTextureLODForSlot(s,e,null,null)}return Promise.resolve(null)}static assignTextureLODForSlot(t,e,s,o){return(t==null?void 0:t.isTexture)!==!0?Promise.resolve(null):o==="glyphMap"?Promise.resolve(t):_.getOrLoadLOD(t,e).then(i=>{if(Array.isArray(i))return null;if((i==null?void 0:i.isTexture)===!0){if(i!=t){if(s&&o){const r=s[o];if(r&&!y){const n=this.getAssignedLODInformation(r);if(n&&(n==null?void 0:n.level)<e)return y==="verbose"&&console.warn("Assigned texture level is already higher: ",n.level,e,s,r,i),null}s[o]=i}if(y&&o&&s){const r=this.getAssignedLODInformation(t);r?Se(s,o,r.url):console.warn("No LOD info for texture",t)}}return i}else y=="verbose"&&console.warn("No LOD found for",t,e);return null}).catch(i=>(console.error("Error loading LOD",t,i),null))}afterRoot(t){var e,s;return y&&console.log("AFTER",this.url,t),(e=this.parser.json.textures)==null||e.forEach((o,i)=>{var r;if(o!=null&&o.extensions){const n=o==null?void 0:o.extensions[V];if(n){if(!n.lods){y&&console.warn("Texture has no LODs",n);return}let a=!1;for(const c of this.parser.associations.keys())if(c.isTexture===!0){const l=this.parser.associations.get(c);(l==null?void 0:l.textures)===i&&(a=!0,_.registerTexture(this.url,c,(r=n.lods)==null?void 0:r.length,i,n))}a||this.parser.getDependency("texture",i).then(c=>{var l;c&&_.registerTexture(this.url,c,(l=n.lods)==null?void 0:l.length,i,n)})}}}),(s=this.parser.json.meshes)==null||s.forEach((o,i)=>{if(o!=null&&o.extensions){const r=o==null?void 0:o.extensions[V];if(r&&r.lods){for(const n of this.parser.associations.keys())if(n.isMesh){const a=this.parser.associations.get(n);(a==null?void 0:a.meshes)===i&&_.registerMesh(this.url,r.guid,n,r.lods.length,a.primitives,r)}}}}),null}static async getOrLoadLOD(t,e){var n,a,c,l;const s=y=="verbose",o=t.userData.LODS;if(!o)return null;const i=o==null?void 0:o.key;let r;if(t.isTexture===!0){const d=t;d.source&&d.source[Me]&&(r=d.source[Me])}if(r||(r=_.lodInfos.get(i)),r){if(e>0){let M=!1;const m=Array.isArray(r.lods);if(m&&e>=r.lods.length?M=!0:m||(M=!0),M)return this.lowresCache.get(i)}const d=Array.isArray(r.lods)?(n=r.lods[e])==null?void 0:n.path:r.lods;if(!d)return y&&!r["missing:uri"]&&(r["missing:uri"]=!0,console.warn("Missing uri for progressive asset for LOD "+e,r)),null;const h=We(o.url,d);if(h.endsWith(".glb")||h.endsWith(".gltf")){if(!r.guid)return console.warn("missing pointer for glb/gltf texture",r),null;const M=h+"_"+r.guid,m=this.previouslyLoaded.get(M);if(m!==void 0){s&&console.log(`LOD ${e} was already loading/loaded: ${M}`);let f=await m.catch(I=>(console.error(`Error loading LOD ${e} from ${h}
|
|
2
|
+
`,I),null)),O=!1;if(f==null||(f instanceof g.Texture&&t instanceof g.Texture?(a=f.image)!=null&&a.data||(c=f.source)!=null&&c.data?f=this.copySettings(t,f):(O=!0,this.previouslyLoaded.delete(M)):f instanceof g.BufferGeometry&&t instanceof g.BufferGeometry&&((l=f.attributes.position)!=null&&l.array||(O=!0,this.previouslyLoaded.delete(M)))),!O)return f}const D=r,B=new Promise(async(f,O)=>{const I=new Q.GLTFLoader;we(I),y&&(await new Promise(S=>setTimeout(S,1e3)),s&&console.warn("Start loading (delayed) "+h,D.guid));let k=h;if(D&&Array.isArray(D.lods)){const S=D.lods[e];S.hash&&(k+="?v="+S.hash)}const A=await I.loadAsync(k).catch(S=>(console.error(`Error loading LOD ${e} from ${h}
|
|
3
|
+
`,S),null));if(!A)return null;const $=A.parser;s&&console.log("Loading finished "+h,D.guid);let w=0;if(A.parser.json.textures){let S=!1;for(const u of A.parser.json.textures){if(u!=null&&u.extensions){const p=u==null?void 0:u.extensions[V];if(p!=null&&p.guid&&p.guid===D.guid){S=!0;break}}w++}if(S){let u=await $.getDependency("texture",w);return u&&_.assignLODInformation(o.url,u,i,e,void 0,void 0),s&&console.log('change "'+t.name+'" → "'+u.name+'"',h,w,u,M),t instanceof g.Texture&&(u=this.copySettings(t,u)),u&&(u.guid=D.guid),f(u)}else y&&console.warn("Could not find texture with guid",D.guid,A.parser.json)}if(w=0,A.parser.json.meshes){let S=!1;for(const u of A.parser.json.meshes){if(u!=null&&u.extensions){const p=u==null?void 0:u.extensions[V];if(p!=null&&p.guid&&p.guid===D.guid){S=!0;break}}w++}if(S){const u=await $.getDependency("mesh",w),p=D;if(s&&console.log(`Loaded Mesh "${u.name}"`,h,w,u,M),u.isMesh===!0){const v=u.geometry;return _.assignLODInformation(o.url,v,i,e,void 0,p.density),f(v)}else{const v=new Array;for(let T=0;T<u.children.length;T++){const C=u.children[T];if(C.isMesh===!0){const U=C.geometry;_.assignLODInformation(o.url,U,i,e,T,p.density),v.push(U)}}return f(v)}}else y&&console.warn("Could not find mesh with guid",D.guid,A.parser.json)}return f(null)});return this.previouslyLoaded.set(M,B),await B}else if(t instanceof g.Texture){s&&console.log("Load texture from uri: "+h);const m=await new g.TextureLoader().loadAsync(h);return m?(m.guid=r.guid,m.flipY=!1,m.needsUpdate=!0,m.colorSpace=t.colorSpace,s&&console.log(r,m)):y&&console.warn("failed loading",h),m}}else y&&console.warn(`Can not load LOD ${e}: no LOD info found for "${i}" ${t.name}`,t.type);return null}static assignLODInformation(t,e,s,o,i,r){if(!e)return;e.userData||(e.userData={});const n=new He(t,s,o,i,r);e.userData.LODS=n}static getAssignedLODInformation(t){var e;return((e=t==null?void 0:t.userData)==null?void 0:e.LODS)||null}static copySettings(t,e){return y&&console.warn(`Copy texture settings
|
|
4
4
|
`,t.uuid,`
|
|
5
|
-
`,e.uuid),e.offset=t.offset,e.repeat=t.repeat,e.colorSpace=t.colorSpace,e.magFilter=t.magFilter,e.minFilter=t.minFilter,e.wrapS=t.wrapS,e.wrapT=t.wrapT,e.flipY=t.flipY,e.anisotropy=t.anisotropy,e.mipmaps||(e.generateMipmaps=t.generateMipmaps),e}};let w=_;w.registerTexture=(t,e,s,n,i)=>{if(L&&console.log("> Progressive: register texture",n,e.name,e.uuid,e,i),!e){L&&console.error("gltf-progressive: Register texture without texture");return}e.source&&(e.source[Me]=i);const r=i.guid;_.assignLODInformation(t,e,r,s,n,void 0),_.lodInfos.set(r,i),_.lowresCache.set(r,e)};w.registerMesh=(t,e,s,n,i,r)=>{var c;L&&console.log("> Progressive: register mesh",i,s.name,r,s.uuid,s);const o=s.geometry;if(!o){L&&console.warn("gltf-progressive: Register mesh without geometry");return}o.userData||(o.userData={}),_.assignLODInformation(t,o,e,n,i,r.density),_.lodInfos.set(e,r);let a=_.lowresCache.get(e);a?a.push(s.geometry):a=[s.geometry],_.lowresCache.set(e,a),n>0&&!j(s)&&Xe(s,o);for(const l of q)(c=l.onRegisteredNewMesh)==null||c.call(l,s,r)};w.lodInfos=new Map;w.previouslyLoaded=new Map;w.lowresCache=new Map;class He{constructor(e,s,n,i,r){this.url=e,this.key=s,this.level=n,i!=null&&(this.index=i),r!=null&&(this.density=r)}}var Pe=(t,e,s)=>{if(!e.has(t))throw TypeError("Cannot "+s)},y=(t,e,s)=>(Pe(t,e,"read from private field"),s?s.call(t):e.get(t)),X=(t,e,s)=>{if(e.has(t))throw TypeError("Cannot add the same private member more than once");e instanceof WeakSet?e.add(t):e.set(t,s)},$=(t,e,s,n)=>(Pe(t,e,"write to private field"),n?n.call(t,s):e.set(t,s),s),E,W,_e,J,re,fe,z;const R=oe("debugprogressive"),Je=oe("noprogressive"),ye=Symbol("Needle:LODSManager"),Le=Symbol("Needle:LODState"),H=Symbol("Needle:CurrentLOD"),G={mesh_lod:-1,texture_lod:-1},P=class{constructor(t,e){this.projectionScreenMatrix=new h.Matrix4,this.targetTriangleDensity=2e5,this.updateInterval="auto",X(this,E,1),this.pause=!1,this.manual=!1,this._lodchangedlisteners=[],X(this,W,void 0),X(this,_e,new h.Clock),X(this,J,0),X(this,re,0),X(this,fe,0),X(this,z,0),this._fpsBuffer=[60,60,60,60,60],this._sphere=new h.Sphere,this._tempBox=new h.Box3,this._tempBox2=new h.Box3,this.tempMatrix=new h.Matrix4,this._tempWorldPosition=new h.Vector3,this._tempBoxSize=new h.Vector3,this._tempBox2Size=new h.Vector3,this.renderer=t,this.context={...e}}static getObjectLODState(t){return t[Le]}static addPlugin(t){q.push(t)}static removePlugin(t){const e=q.indexOf(t);e>=0&&q.splice(e,1)}static get(t,e){if(t[ye])return console.debug("[gltf-progressive] LODsManager already exists for this renderer"),t[ye];const s=new P(t,{engine:"unknown",...e});return t[ye]=s,s}get plugins(){return q}addEventListener(t,e){t==="changed"&&this._lodchangedlisteners.push(e)}removeEventListener(t,e){if(t==="changed"){const s=this._lodchangedlisteners.indexOf(e);s>=0&&this._lodchangedlisteners.splice(s,1)}}enable(){if(y(this,W))return;console.debug("[gltf-progressive] Enabling LODsManager for renderer");let t=0;$(this,W,this.renderer.render);const e=this;ve(this.renderer),this.renderer.render=function(s,n){const i=e.renderer.getRenderTarget();(i==null||"isXRRenderTarget"in i&&i.isXRRenderTarget)&&(t=0,$(e,J,y(e,J)+1),$(e,re,y(e,_e).getDelta()),$(e,fe,y(e,fe)+y(e,re)),e._fpsBuffer.shift(),e._fpsBuffer.push(1/y(e,re)),$(e,z,e._fpsBuffer.reduce((o,a)=>o+a)/e._fpsBuffer.length),R&&y(e,J)%200===0&&console.log("FPS",Math.round(y(e,z)),"Interval:",y(e,E)));const r=t++;y(e,W).call(this,s,n),e.onAfterRender(s,n,r)}}disable(){y(this,W)&&(console.debug("[gltf-progressive] Disabling LODsManager for renderer"),this.renderer.render=y(this,W),$(this,W,void 0))}update(t,e){this.internalUpdate(t,e)}onAfterRender(t,e,s){if(this.pause)return;const i=this.renderer.renderLists.get(t,0).opaque;let r=!0;if(i.length===1){const o=i[0].material;(o.name==="EffectMaterial"||o.name==="CopyShader")&&(r=!1)}if((e.parent&&e.parent.type==="CubeCamera"||s>=1&&e.type==="OrthographicCamera")&&(r=!1),r){if(Je||(this.updateInterval==="auto"?y(this,z)<40&&y(this,E)<10?($(this,E,y(this,E)+1),R&&console.warn("↓ Reducing LOD updates",y(this,E),y(this,z).toFixed(0))):y(this,z)>=60&&y(this,E)>1&&($(this,E,y(this,E)-1),R&&console.warn("↑ Increasing LOD updates",y(this,E),y(this,z).toFixed(0))):$(this,E,this.updateInterval),y(this,E)>0&&y(this,J)%y(this,E)!=0))return;this.internalUpdate(t,e)}}internalUpdate(t,e){var a,c;const s=this.renderer.renderLists.get(t,0),n=s.opaque;this.projectionScreenMatrix.multiplyMatrices(e.projectionMatrix,e.matrixWorldInverse);const i=this.targetTriangleDensity;for(const l of n){if(l.material&&(((a=l.geometry)==null?void 0:a.type)==="BoxGeometry"||((c=l.geometry)==null?void 0:c.type)==="BufferGeometry")&&(l.material.name==="SphericalGaussianBlur"||l.material.name=="BackgroundCubeMaterial"||l.material.name==="CubemapFromEquirect"||l.material.name==="EquirectangularToCubeUV")){R&&(l.material["NEEDLE_PROGRESSIVE:IGNORE-WARNING"]||(l.material["NEEDLE_PROGRESSIVE:IGNORE-WARNING"]=!0,console.warn("Ignoring skybox or BLIT object",l,l.material.name,l.material.type)));continue}switch(l.material.type){case"LineBasicMaterial":case"LineDashedMaterial":case"PointsMaterial":case"ShadowMaterial":case"MeshDistanceMaterial":case"MeshDepthMaterial":continue}if(R==="color"&&l.material&&!l.object.progressive_debug_color){l.object.progressive_debug_color=!0;const g=Math.random()*16777215,x=new h.MeshStandardMaterial({color:g});l.object.material=x}const d=l.object;(d instanceof h.Mesh||d.isMesh)&&this.updateLODs(t,e,d,i)}const r=s.transparent;for(const l of r){const d=l.object;(d instanceof h.Mesh||d.isMesh)&&this.updateLODs(t,e,d,i)}const o=s.transmissive;for(const l of o){const d=l.object;(d instanceof h.Mesh||d.isMesh)&&this.updateLODs(t,e,d,i)}}updateLODs(t,e,s,n){var o,a;s.userData||(s.userData={});let i=s[Le];if(i||(i=new Qe,s[Le]=i),i.frames++<2)return;for(const c of q)(o=c.onBeforeUpdateLOD)==null||o.call(c,this.renderer,t,e,s);this.calculateLodLevel(e,s,i,n,G),G.mesh_lod=Math.round(G.mesh_lod),G.texture_lod=Math.round(G.texture_lod),G.mesh_lod>=0&&this.loadProgressiveMeshes(s,G.mesh_lod);let r=G.texture_lod;if(s.material&&r>=0){const c=s["DEBUG:LOD"];c!=null&&(r=c),this.loadProgressiveTextures(s.material,r)}for(const c of q)(a=c.onAfterUpdatedLOD)==null||a.call(c,this.renderer,t,e,s,G);i.lastLodLevel_Mesh=G.mesh_lod,i.lastLodLevel_Texture=G.texture_lod}loadProgressiveTextures(t,e){if(!t)return;if(Array.isArray(t)){for(const n of t)this.loadProgressiveTextures(n,e);return}let s=!1;(t[H]===void 0||e<t[H])&&(s=!0),s&&(t[H]=e,w.assignTextureLOD(t,e).then(n=>{this._lodchangedlisteners.forEach(i=>i({type:"texture",level:e,object:t}))}))}loadProgressiveMeshes(t,e){if(!t)return Promise.resolve(null);if(t[H]!==e){t[H]=e;const s=t.geometry;return w.assignMeshLOD(t,e).then(n=>(n&&t[H]==e&&s!=t.geometry&&this._lodchangedlisteners.forEach(i=>i({type:"mesh",level:e,object:t})),n))}return Promise.resolve(null)}static isInside(t,e){const s=t.min,n=t.max,i=(s.x+n.x)*.5,r=(s.y+n.y)*.5;return this._tempPtInside.set(i,r,s.z).applyMatrix4(e).z<0}calculateLodLevel(t,e,s,n,i){var k;if(!e){i.mesh_lod=-1,i.texture_lod=-1;return}if(!t){i.mesh_lod=-1,i.texture_lod=-1;return}let o=10+1,a=!1;if(R&&e["DEBUG:LOD"]!=null)return e["DEBUG:LOD"];const c=w.getMeshLODInformation(e.geometry),l=c==null?void 0:c.lods,d=l&&l.length>0,g=w.getMaterialMinMaxLODsCount(e.material),x=(g==null?void 0:g.min_count)!=1/0&&g.min_count>0&&g.max_count>0;if(!d&&!x){i.mesh_lod=0,i.texture_lod=0;return}d||(a=!0,o=0);const m=this.renderer.domElement.clientHeight||this.renderer.domElement.height;let D=e.geometry.boundingBox;if(e.type==="SkinnedMesh"){const M=e;if(!M.boundingBox)M.computeBoundingBox();else if(s.frames%30===0){const f=j(M),O=M.geometry;f&&(M.geometry=f),M.computeBoundingBox(),M.geometry=O}D=M.boundingBox}if(D&&t.isPerspectiveCamera){const M=t;if(e.geometry.attributes.color&&e.geometry.attributes.color.count<100&&e.geometry.boundingSphere){this._sphere.copy(e.geometry.boundingSphere),this._sphere.applyMatrix4(e.matrixWorld);const u=t.getWorldPosition(this._tempWorldPosition);if(this._sphere.containsPoint(u)){i.mesh_lod=0,i.texture_lod=0;return}}if(this._tempBox.copy(D),this._tempBox.applyMatrix4(e.matrixWorld),P.isInside(this._tempBox,this.projectionScreenMatrix)){i.mesh_lod=0,i.texture_lod=0;return}if(this._tempBox.applyMatrix4(this.projectionScreenMatrix),this.renderer.xr.enabled&&M.fov>70){const u=this._tempBox.min,p=this._tempBox.max;let v=u.x,T=u.y,C=p.x,U=p.y;const ae=2,he=1.5,le=(u.x+p.x)*.5,ce=(u.y+p.y)*.5;v=(v-le)*ae+le,T=(T-ce)*ae+ce,C=(C-le)*ae+le,U=(U-ce)*ae+ce;const Re=v<0&&C>0?0:Math.min(Math.abs(u.x),Math.abs(p.x)),Ge=T<0&&U>0?0:Math.min(Math.abs(u.y),Math.abs(p.y)),ge=Math.max(Re,Ge);s.lastCentrality=(he-ge)*(he-ge)*(he-ge)}else s.lastCentrality=1;const f=this._tempBox.getSize(this._tempBoxSize);f.multiplyScalar(.5),screen.availHeight>0&&m>0&&f.multiplyScalar(m/screen.availHeight),f.x*=M.aspect;const O=t.matrixWorldInverse,I=this._tempBox2;I.copy(D),I.applyMatrix4(e.matrixWorld),I.applyMatrix4(O);const B=I.getSize(this._tempBox2Size),S=Math.max(B.x,B.y);if(Math.max(f.x,f.y)!=0&&S!=0&&(f.z=B.z/Math.max(B.x,B.y)*Math.max(f.x,f.y)),s.lastScreenCoverage=Math.max(f.x,f.y,f.z),s.lastScreenspaceVolume.copy(f),s.lastScreenCoverage*=s.lastCentrality,R&&P.debugDrawLine){const u=this.tempMatrix.copy(this.projectionScreenMatrix);u.invert();const p=P.corner0,v=P.corner1,T=P.corner2,C=P.corner3;p.copy(this._tempBox.min),v.copy(this._tempBox.max),v.x=p.x,T.copy(this._tempBox.max),T.y=p.y,C.copy(this._tempBox.max);const U=(p.z+C.z)*.5;p.z=v.z=T.z=C.z=U,p.applyMatrix4(u),v.applyMatrix4(u),T.applyMatrix4(u),C.applyMatrix4(u),P.debugDrawLine(p,v,255),P.debugDrawLine(p,T,255),P.debugDrawLine(v,C,255),P.debugDrawLine(T,C,255)}let b=999;if(l&&s.lastScreenCoverage>0){for(let u=0;u<l.length;u++)if(l[u].density/s.lastScreenCoverage<n){b=u;break}}b<o&&(o=b,a=!0)}if(a?i.mesh_lod=o:i.mesh_lod=s.lastLodLevel_Mesh,R&&i.mesh_lod!=s.lastLodLevel_Mesh){const f=l==null?void 0:l[i.mesh_lod];f&&console.log(`Mesh LOD changed: ${s.lastLodLevel_Mesh} → ${i.mesh_lod} (${f.density.toFixed(0)}) - ${e.name}`)}if(x){const M="saveData"in globalThis.navigator&&globalThis.navigator.saveData===!0;if(s.lastLodLevel_Texture<0){if(i.texture_lod=g.max_count-1,R){const f=g.lods[g.max_count-1];R&&console.log(`First Texture LOD ${i.texture_lod} (${f.max_height}px) - ${e.name}`)}}else{const f=s.lastScreenspaceVolume.x+s.lastScreenspaceVolume.y+s.lastScreenspaceVolume.z;let O=s.lastScreenCoverage*4;((k=this.context)==null?void 0:k.engine)==="model-viewer"&&(O*=1.5);const B=m/window.devicePixelRatio*O;for(let S=g.lods.length-1;S>=0;S--){let V=g.lods[S];if(!(M&&V.max_height>=2048)&&!(ze()&&V.max_height>4096)&&V.max_height>B){if(i.texture_lod=S,i.texture_lod<s.lastLodLevel_Texture){const b=V.max_height;R&&console.log(`Texture LOD changed: ${s.lastLodLevel_Texture} → ${i.texture_lod} = ${b}px
|
|
6
|
-
Screensize: ${
|
|
7
|
-
${e.name}`)}break}}}}else i.texture_lod=0}};let N=P;
|
|
8
|
-
`,t.getAttribute("src"));let e=null,s=null,
|
|
5
|
+
`,e.uuid),e=e.clone(),e.offset=t.offset,e.repeat=t.repeat,e.colorSpace=t.colorSpace,e.magFilter=t.magFilter,e.minFilter=t.minFilter,e.wrapS=t.wrapS,e.wrapT=t.wrapT,e.flipY=t.flipY,e.anisotropy=t.anisotropy,e.mipmaps||(e.generateMipmaps=t.generateMipmaps),e}};let E=_;E.registerTexture=(t,e,s,o,i)=>{if(y&&console.log("> Progressive: register texture",o,e.name,e.uuid,e,i),!e){y&&console.error("gltf-progressive: Register texture without texture");return}e.source&&(e.source[Me]=i);const r=i.guid;_.assignLODInformation(t,e,r,s,o,void 0),_.lodInfos.set(r,i),_.lowresCache.set(r,e)};E.registerMesh=(t,e,s,o,i,r)=>{var c;y&&console.log("> Progressive: register mesh",i,s.name,r,s.uuid,s);const n=s.geometry;if(!n){y&&console.warn("gltf-progressive: Register mesh without geometry");return}n.userData||(n.userData={}),_.assignLODInformation(t,n,e,o,i,r.density),_.lodInfos.set(e,r);let a=_.lowresCache.get(e);a?a.push(s.geometry):a=[s.geometry],_.lowresCache.set(e,a),o>0&&!j(s)&&Xe(s,n);for(const l of X)(c=l.onRegisteredNewMesh)==null||c.call(l,s,r)};E.lodInfos=new Map;E.previouslyLoaded=new Map;E.lowresCache=new Map;class He{constructor(e,s,o,i,r){this.url=e,this.key=s,this.level=o,i!=null&&(this.index=i),r!=null&&(this.density=r)}}var Pe=(t,e,s)=>{if(!e.has(t))throw TypeError("Cannot "+s)},L=(t,e,s)=>(Pe(t,e,"read from private field"),s?s.call(t):e.get(t)),K=(t,e,s)=>{if(e.has(t))throw TypeError("Cannot add the same private member more than once");e instanceof WeakSet?e.add(t):e.set(t,s)},F=(t,e,s,o)=>(Pe(t,e,"write to private field"),o?o.call(t,s):e.set(t,s),s),b,z,_e,J,re,fe,q;const R=ne("debugprogressive"),Je=ne("noprogressive"),ye=Symbol("Needle:LODSManager"),Le=Symbol("Needle:LODState"),W=Symbol("Needle:CurrentLOD"),G={mesh_lod:-1,texture_lod:-1},P=class{constructor(t,e){this.projectionScreenMatrix=new g.Matrix4,this.targetTriangleDensity=2e5,this.updateInterval="auto",K(this,b,1),this.pause=!1,this.manual=!1,this._lodchangedlisteners=[],K(this,z,void 0),K(this,_e,new g.Clock),K(this,J,0),K(this,re,0),K(this,fe,0),K(this,q,0),this._fpsBuffer=[60,60,60,60,60],this._sphere=new g.Sphere,this._tempBox=new g.Box3,this._tempBox2=new g.Box3,this.tempMatrix=new g.Matrix4,this._tempWorldPosition=new g.Vector3,this._tempBoxSize=new g.Vector3,this._tempBox2Size=new g.Vector3,this.renderer=t,this.context={...e}}static getObjectLODState(t){return t[Le]}static addPlugin(t){X.push(t)}static removePlugin(t){const e=X.indexOf(t);e>=0&&X.splice(e,1)}static get(t,e){if(t[ye])return console.debug("[gltf-progressive] LODsManager already exists for this renderer"),t[ye];const s=new P(t,{engine:"unknown",...e});return t[ye]=s,s}get plugins(){return X}addEventListener(t,e){t==="changed"&&this._lodchangedlisteners.push(e)}removeEventListener(t,e){if(t==="changed"){const s=this._lodchangedlisteners.indexOf(e);s>=0&&this._lodchangedlisteners.splice(s,1)}}enable(){if(L(this,z))return;console.debug("[gltf-progressive] Enabling LODsManager for renderer");let t=0;F(this,z,this.renderer.render);const e=this;ve(this.renderer),this.renderer.render=function(s,o){const i=e.renderer.getRenderTarget();(i==null||"isXRRenderTarget"in i&&i.isXRRenderTarget)&&(t=0,F(e,J,L(e,J)+1),F(e,re,L(e,_e).getDelta()),F(e,fe,L(e,fe)+L(e,re)),e._fpsBuffer.shift(),e._fpsBuffer.push(1/L(e,re)),F(e,q,e._fpsBuffer.reduce((n,a)=>n+a)/e._fpsBuffer.length),R&&L(e,J)%200===0&&console.log("FPS",Math.round(L(e,q)),"Interval:",L(e,b)));const r=t++;L(e,z).call(this,s,o),e.onAfterRender(s,o,r)}}disable(){L(this,z)&&(console.debug("[gltf-progressive] Disabling LODsManager for renderer"),this.renderer.render=L(this,z),F(this,z,void 0))}update(t,e){this.internalUpdate(t,e)}onAfterRender(t,e,s){if(this.pause)return;const i=this.renderer.renderLists.get(t,0).opaque;let r=!0;if(i.length===1){const n=i[0].material;(n.name==="EffectMaterial"||n.name==="CopyShader")&&(r=!1)}if((e.parent&&e.parent.type==="CubeCamera"||s>=1&&e.type==="OrthographicCamera")&&(r=!1),r){if(Je||(this.updateInterval==="auto"?L(this,q)<40&&L(this,b)<10?(F(this,b,L(this,b)+1),R&&console.warn("↓ Reducing LOD updates",L(this,b),L(this,q).toFixed(0))):L(this,q)>=60&&L(this,b)>1&&(F(this,b,L(this,b)-1),R&&console.warn("↑ Increasing LOD updates",L(this,b),L(this,q).toFixed(0))):F(this,b,this.updateInterval),L(this,b)>0&&L(this,J)%L(this,b)!=0))return;this.internalUpdate(t,e)}}internalUpdate(t,e){var a,c;const s=this.renderer.renderLists.get(t,0),o=s.opaque;this.projectionScreenMatrix.multiplyMatrices(e.projectionMatrix,e.matrixWorldInverse);const i=this.targetTriangleDensity;for(const l of o){if(l.material&&(((a=l.geometry)==null?void 0:a.type)==="BoxGeometry"||((c=l.geometry)==null?void 0:c.type)==="BufferGeometry")&&(l.material.name==="SphericalGaussianBlur"||l.material.name=="BackgroundCubeMaterial"||l.material.name==="CubemapFromEquirect"||l.material.name==="EquirectangularToCubeUV")){R&&(l.material["NEEDLE_PROGRESSIVE:IGNORE-WARNING"]||(l.material["NEEDLE_PROGRESSIVE:IGNORE-WARNING"]=!0,console.warn("Ignoring skybox or BLIT object",l,l.material.name,l.material.type)));continue}switch(l.material.type){case"LineBasicMaterial":case"LineDashedMaterial":case"PointsMaterial":case"ShadowMaterial":case"MeshDistanceMaterial":case"MeshDepthMaterial":continue}if(R==="color"&&l.material&&!l.object.progressive_debug_color){l.object.progressive_debug_color=!0;const h=Math.random()*16777215,M=new g.MeshStandardMaterial({color:h});l.object.material=M}const d=l.object;(d instanceof g.Mesh||d.isMesh)&&this.updateLODs(t,e,d,i)}const r=s.transparent;for(const l of r){const d=l.object;(d instanceof g.Mesh||d.isMesh)&&this.updateLODs(t,e,d,i)}const n=s.transmissive;for(const l of n){const d=l.object;(d instanceof g.Mesh||d.isMesh)&&this.updateLODs(t,e,d,i)}}updateLODs(t,e,s,o){var n,a;s.userData||(s.userData={});let i=s[Le];if(i||(i=new Qe,s[Le]=i),i.frames++<2)return;for(const c of X)(n=c.onBeforeUpdateLOD)==null||n.call(c,this.renderer,t,e,s);this.calculateLodLevel(e,s,i,o,G),G.mesh_lod=Math.round(G.mesh_lod),G.texture_lod=Math.round(G.texture_lod),G.mesh_lod>=0&&this.loadProgressiveMeshes(s,G.mesh_lod);let r=G.texture_lod;s.material&&r>=0&&this.loadProgressiveTextures(s.material,r);for(const c of X)(a=c.onAfterUpdatedLOD)==null||a.call(c,this.renderer,t,e,s,G);i.lastLodLevel_Mesh=G.mesh_lod,i.lastLodLevel_Texture=G.texture_lod}loadProgressiveTextures(t,e){if(!t)return;if(Array.isArray(t)){for(const i of t)this.loadProgressiveTextures(i,e);return}let s=!1;(t[W]===void 0||e<t[W])&&(s=!0);const o=t["DEBUG:LOD"];o!=null&&(s=t[W]!=o,e=o),s&&(t[W]=e,E.assignTextureLOD(t,e).then(i=>{this._lodchangedlisteners.forEach(r=>r({type:"texture",level:e,object:t}))}))}loadProgressiveMeshes(t,e){if(!t)return Promise.resolve(null);let s=t[W]!==e;const o=t["DEBUG:LOD"];if(o!=null&&(s=t[W]!=o,e=o),s){t[W]=e;const i=t.geometry;return E.assignMeshLOD(t,e).then(r=>(r&&t[W]==e&&i!=t.geometry&&this._lodchangedlisteners.forEach(n=>n({type:"mesh",level:e,object:t})),r))}return Promise.resolve(null)}static isInside(t,e){const s=t.min,o=t.max,i=(s.x+o.x)*.5,r=(s.y+o.y)*.5;return this._tempPtInside.set(i,r,s.z).applyMatrix4(e).z<0}calculateLodLevel(t,e,s,o,i){var B;if(!e){i.mesh_lod=-1,i.texture_lod=-1;return}if(!t){i.mesh_lod=-1,i.texture_lod=-1;return}let n=10+1,a=!1;if(R&&e["DEBUG:LOD"]!=null)return e["DEBUG:LOD"];const c=E.getMeshLODInformation(e.geometry),l=c==null?void 0:c.lods,d=l&&l.length>0,h=E.getMaterialMinMaxLODsCount(e.material),M=(h==null?void 0:h.min_count)!=1/0&&h.min_count>0&&h.max_count>0;if(!d&&!M){i.mesh_lod=0,i.texture_lod=0;return}d||(a=!0,n=0);const m=this.renderer.domElement.clientHeight||this.renderer.domElement.height;let D=e.geometry.boundingBox;if(e.type==="SkinnedMesh"){const x=e;if(!x.boundingBox)x.computeBoundingBox();else if(s.frames%30===0){const f=j(x),O=x.geometry;f&&(x.geometry=f),x.computeBoundingBox(),x.geometry=O}D=x.boundingBox}if(D){const x=t;if(e.geometry.attributes.color&&e.geometry.attributes.color.count<100&&e.geometry.boundingSphere){this._sphere.copy(e.geometry.boundingSphere),this._sphere.applyMatrix4(e.matrixWorld);const u=t.getWorldPosition(this._tempWorldPosition);if(this._sphere.containsPoint(u)){i.mesh_lod=0,i.texture_lod=0;return}}if(this._tempBox.copy(D),this._tempBox.applyMatrix4(e.matrixWorld),x.isPerspectiveCamera&&P.isInside(this._tempBox,this.projectionScreenMatrix)){i.mesh_lod=0,i.texture_lod=0;return}if(this._tempBox.applyMatrix4(this.projectionScreenMatrix),this.renderer.xr.enabled&&x.isPerspectiveCamera&&x.fov>70){const u=this._tempBox.min,p=this._tempBox.max;let v=u.x,T=u.y,C=p.x,U=p.y;const ae=2,he=1.5,le=(u.x+p.x)*.5,ce=(u.y+p.y)*.5;v=(v-le)*ae+le,T=(T-ce)*ae+ce,C=(C-le)*ae+le,U=(U-ce)*ae+ce;const Re=v<0&&C>0?0:Math.min(Math.abs(u.x),Math.abs(p.x)),Ge=T<0&&U>0?0:Math.min(Math.abs(u.y),Math.abs(p.y)),ge=Math.max(Re,Ge);s.lastCentrality=(he-ge)*(he-ge)*(he-ge)}else s.lastCentrality=1;const f=this._tempBox.getSize(this._tempBoxSize);f.multiplyScalar(.5),screen.availHeight>0&&m>0&&f.multiplyScalar(m/screen.availHeight),t.isPerspectiveCamera?f.x*=t.aspect:t.isOrthographicCamera;const O=t.matrixWorldInverse,I=this._tempBox2;I.copy(D),I.applyMatrix4(e.matrixWorld),I.applyMatrix4(O);const k=I.getSize(this._tempBox2Size),A=Math.max(k.x,k.y);if(Math.max(f.x,f.y)!=0&&A!=0&&(f.z=k.z/Math.max(k.x,k.y)*Math.max(f.x,f.y)),s.lastScreenCoverage=Math.max(f.x,f.y,f.z),s.lastScreenspaceVolume.copy(f),s.lastScreenCoverage*=s.lastCentrality,R&&P.debugDrawLine){const u=this.tempMatrix.copy(this.projectionScreenMatrix);u.invert();const p=P.corner0,v=P.corner1,T=P.corner2,C=P.corner3;p.copy(this._tempBox.min),v.copy(this._tempBox.max),v.x=p.x,T.copy(this._tempBox.max),T.y=p.y,C.copy(this._tempBox.max);const U=(p.z+C.z)*.5;p.z=v.z=T.z=C.z=U,p.applyMatrix4(u),v.applyMatrix4(u),T.applyMatrix4(u),C.applyMatrix4(u),P.debugDrawLine(p,v,255),P.debugDrawLine(p,T,255),P.debugDrawLine(v,C,255),P.debugDrawLine(T,C,255)}let w=999;if(l&&s.lastScreenCoverage>0){for(let u=0;u<l.length;u++)if(l[u].density/s.lastScreenCoverage<o){w=u;break}}w<n&&(n=w,a=!0)}if(a?i.mesh_lod=n:i.mesh_lod=s.lastLodLevel_Mesh,R&&i.mesh_lod!=s.lastLodLevel_Mesh){const f=l==null?void 0:l[i.mesh_lod];f&&console.log(`Mesh LOD changed: ${s.lastLodLevel_Mesh} → ${i.mesh_lod} (${f.density.toFixed(0)}) - ${e.name}`)}if(M){const x="saveData"in globalThis.navigator&&globalThis.navigator.saveData===!0;if(s.lastLodLevel_Texture<0){if(i.texture_lod=h.max_count-1,R){const f=h.lods[h.max_count-1];R&&console.log(`First Texture LOD ${i.texture_lod} (${f.max_height}px) - ${e.name}`)}}else{const f=s.lastScreenspaceVolume.x+s.lastScreenspaceVolume.y+s.lastScreenspaceVolume.z;let O=s.lastScreenCoverage*4;((B=this.context)==null?void 0:B.engine)==="model-viewer"&&(O*=1.5);const k=m/window.devicePixelRatio*O;let A=!1;for(let $=h.lods.length-1;$>=0;$--){let w=h.lods[$];if(!(x&&w.max_height>=2048)&&!(ze()&&w.max_height>4096)&&(w.max_height>k||!A&&$===0)){if(A=!0,i.texture_lod=$,i.texture_lod<s.lastLodLevel_Texture){const S=w.max_height;R&&console.log(`Texture LOD changed: ${s.lastLodLevel_Texture} → ${i.texture_lod} = ${S}px
|
|
6
|
+
Screensize: ${k.toFixed(0)}px, Coverage: ${(100*s.lastScreenCoverage).toFixed(2)}%, Volume ${f.toFixed(1)}
|
|
7
|
+
${e.name}`)}break}}}}else i.texture_lod=0}};let N=P;b=new WeakMap;z=new WeakMap;_e=new WeakMap;J=new WeakMap;re=new WeakMap;fe=new WeakMap;q=new WeakMap;N.corner0=new g.Vector3;N.corner1=new g.Vector3;N.corner2=new g.Vector3;N.corner3=new g.Vector3;N._tempPtInside=new g.Vector3;class Qe{constructor(){this.frames=0,this.lastLodLevel_Mesh=-1,this.lastLodLevel_Texture=-1,this.lastScreenCoverage=0,this.lastScreenspaceVolume=new g.Vector3,this.lastCentrality=0}}const Te=Symbol("NEEDLE_mesh_lod"),ue=Symbol("NEEDLE_texture_lod");let se=null;function Be(){const t=Ze();t&&(t.mapURLs(function(e){return be(),e}),be(),se==null||se.disconnect(),se=new MutationObserver(e=>{e.forEach(s=>{s.addedNodes.forEach(o=>{o instanceof HTMLElement&&o.tagName.toLowerCase()==="model-viewer"&&ke(o)})})}),se.observe(document,{childList:!0,subtree:!0}))}function Ze(){if(typeof customElements>"u")return null;const t=customElements.get("model-viewer");return t||(customElements.whenDefined("model-viewer").then(()=>{console.debug("[gltf-progressive] model-viewer defined"),Be()}),null)}function be(){if(typeof document>"u")return;document.querySelectorAll("model-viewer").forEach(e=>{ke(e)})}const Ee=new WeakSet;let je=0;function ke(t){if(!t||Ee.has(t))return null;Ee.add(t),console.debug("[gltf-progressive] found new model-viewer..."+ ++je+`
|
|
8
|
+
`,t.getAttribute("src"));let e=null,s=null,o=null;for(let i=t;i!=null;i=Object.getPrototypeOf(i)){const r=Object.getOwnPropertySymbols(i),n=r.find(l=>l.toString()=="Symbol(renderer)"),a=r.find(l=>l.toString()=="Symbol(scene)"),c=r.find(l=>l.toString()=="Symbol(needsRender)");!e&&n!=null&&(e=t[n].threeRenderer),!s&&a!=null&&(s=t[a]),!o&&c!=null&&(o=t[c])}if(e&&s){let i=function(){if(o){let n=0,a=setInterval(()=>{if(n++>5){clearInterval(a);return}o==null||o.call(t)},300)}};console.debug("[gltf-progressive] setup model-viewer");const r=N.get(e,{engine:"model-viewer"});return N.addPlugin(new et),r.enable(),r.addEventListener("changed",()=>{o==null||o.call(t)}),t.addEventListener("model-visibility",n=>{n.detail.visible&&(o==null||o.call(t))}),t.addEventListener("load",()=>{i()}),()=>{r.disable()}}return null}class et{constructor(){this._didWarnAboutMissingUrl=!1}onBeforeUpdateLOD(e,s,o,i){this.tryParseMeshLOD(s,i),this.tryParseTextureLOD(s,i)}getUrl(e){if(!e)return null;let s=e.getAttribute("src");return s||(s=e.src),s||(this._didWarnAboutMissingUrl||console.warn("No url found in modelviewer",e),this._didWarnAboutMissingUrl=!0),s}tryGetCurrentGLTF(e){return e._currentGLTF}tryGetCurrentModelViewer(e){return e.element}tryParseTextureLOD(e,s){if(s[ue]==!0)return;s[ue]=!0;const o=this.tryGetCurrentGLTF(e),i=this.tryGetCurrentModelViewer(e),r=this.getUrl(i);if(r&&o&&s.material){let n=function(c){var d,h,M;if(c[ue]==!0)return;c[ue]=!0,c.userData&&(c.userData.LOD=-1);const l=Object.keys(c);for(let m=0;m<l.length;m++){const D=l[m],B=c[D];if((B==null?void 0:B.isTexture)===!0){const x=(h=(d=B.userData)==null?void 0:d.associations)==null?void 0:h.textures;if(x==null)continue;const f=o.parser.json.textures[x];if(!f){console.warn("Texture data not found for texture index "+x);continue}if((M=f==null?void 0:f.extensions)!=null&&M[V]){const O=f.extensions[V];O&&r&&E.registerTexture(r,B,O.lods.length,x,O)}}}};const a=s.material;if(Array.isArray(a))for(const c of a)n(c);else n(a)}}tryParseMeshLOD(e,s){var n,a;if(s[Te]==!0)return;s[Te]=!0;const o=this.tryGetCurrentModelViewer(e),i=this.getUrl(o);if(!i)return;const r=(a=(n=s.userData)==null?void 0:n.gltfExtensions)==null?void 0:a[V];if(r&&i){const c=s.uuid;E.registerMesh(i,c,s,0,r.lods.length,r)}}}function tt(t,e,s,o){ve(e),we(s),Oe(s,{progressive:!0,...o==null?void 0:o.hints}),s.register(r=>new E(r,t));const i=N.get(e);return(o==null?void 0:o.enableLODsManager)!==!1&&i.enable(),i}Be();if(!qe){const t={gltfProgressive:{useNeedleProgressive:tt,LODsManager:N,configureLoader:Oe,getRaycastMesh:j,useRaycastMeshes:Ke}};if(!globalThis.Needle)globalThis.Needle=t;else for(const e in t)globalThis.Needle[e]=t[e]}exports.LODsManager=N;exports.NEEDLE_progressive=E;exports.addDracoAndKTX2Loaders=we;exports.configureLoader=Oe;exports.createLoaders=ve;exports.getRaycastMesh=j;exports.setDracoDecoderLocation=Fe;exports.setKTX2TranscoderLocation=Ve;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import{B as le,M as z,a as Ge,T as Z,b as Ne,V as R,c as Oe,S as $e,d as be,e as Ue,C as Fe}from"./three.min.js";import{D as ze,K as Ve,G as ge,M as qe}from"./three-examples.min.js";const Se="";globalThis.GLTF_PROGRESSIVE_VERSION=Se,console.debug(`[gltf-progressive] version ${Se}`);let K="https://www.gstatic.com/draco/versioned/decoders/1.5.7/",ee="https://www.gstatic.com/basis-universal/versioned/2021-04-15-ba1c3e4/";const He=K,Xe=ee,Ke=new URL(K+"draco_decoder.js");fetch(Ke,{method:"GET",headers:{Range:"bytes=0-1"}}).catch(t=>{K===He&&(K="./include/draco/"),ee===Xe&&(ee="./include/ktx2/")}).finally(()=>{Te()});function Ye(t){K=t}function Je(t){ee=t}let V,ae,q;function Te(){V||(V=new ze,V.setDecoderPath(K),V.setDecoderConfig({type:"js"}),V.preload()),q||(q=new Ve,q.setTranscoderPath(ee),q.init()),ae||(ae=qe)}function me(t){return Te(),t?q.detectSupport(t):t!==null&&console.warn("No renderer provided to detect ktx2 support - loading KTX2 textures might fail"),{dracoLoader:V,ktx2Loader:q,meshoptDecoder:ae}}function pe(t){t.dracoLoader||t.setDRACOLoader(V),t.ktx2Loader||t.setKTX2Loader(q),t.meshoptDecoder||t.setMeshoptDecoder(ae)}const ve=new WeakMap;function ye(t,e){let r=ve.get(t);r?r=Object.assign(r,e):r=e,ve.set(t,r)}const Ee=ge.prototype.load;function Qe(...t){const e=ve.get(this);let r=t[0];const n=new URL(r,window.location.href);if(n.hostname.endsWith("needle.tools")){const s=e?.progressive!==void 0?e.progressive:!0,o=e!=null&&e.usecase?e.usecase:"default";s?this.requestHeader.Accept=`*/*;progressive=allowed;usecase=${o}`:this.requestHeader.Accept=`*/*;usecase=${o}`,r=n.toString()}return t[0]=r,Ee?.call(this,...t)}ge.prototype.load=Qe,te("debugprogressive");function te(t){if(typeof window>"u")return!1;const e=new URL(window.location.href).searchParams.get(t);return e==null||e==="0"||e==="false"?!1:e===""?!0:e}function Ze(t,e){if(e===void 0||e.startsWith("./")||e.startsWith("http")||t===void 0)return e;const r=t.lastIndexOf("/");if(r>=0){const n=t.substring(0,r+1);for(;n.endsWith("/")&&e.startsWith("/");)e=e.substring(1);return n+e}return e}let ue;function et(){return ue!==void 0||(ue=/iPhone|iPad|iPod|Android|IEMobile/i.test(navigator.userAgent),te("debugprogressive")&&console.log("[glTF Progressive]: isMobileDevice",ue)),ue}const tt=typeof window>"u"&&typeof document>"u",xe=Symbol("needle:raycast-mesh");function Y(t){return t?.[xe]instanceof le?t[xe]:null}function rt(t,e){if((t.type==="Mesh"||t.type==="SkinnedMesh")&&!Y(t)){const r=ot(e);r.userData={isRaycastMesh:!0},t[xe]=r}}function st(t=!0){if(t){if(re)return;const e=re=z.prototype.raycast;z.prototype.raycast=function(r,n){const s=this,o=Y(s);let i;o&&s.isMesh&&(i=s.geometry,s.geometry=o),e.call(this,r,n),i&&(s.geometry=i)}}else{if(!re)return;z.prototype.raycast=re,re=null}}let re=null;function ot(t){const e=new le;for(const r in t.attributes)e.setAttribute(r,t.getAttribute(r));return e.setIndex(t.getIndex()),e}const N=new Array,j="NEEDLE_progressive",v=te("debugprogressive"),Le=Symbol("needle-progressive-texture"),se=new Map,Me=new Set;if(v){let t=function(){e+=1,console.log("Toggle LOD level",e,se),se.forEach((s,o)=>{for(const i of s.keys){const a=o[i];if(a!=null){if(a.isBufferGeometry===!0){const u=b.getMeshLODInformation(a),l=u?Math.min(e,u.lods.length):0;o["DEBUG:LOD"]=e,b.assignMeshLOD(o,l),u&&(r=Math.max(r,u.lods.length-1))}else if(o.isMaterial===!0){o["DEBUG:LOD"]=e,b.assignTextureLOD(o,e);break}}}}),e>=r&&(e=-1)},e=-1,r=2,n=!1;window.addEventListener("keyup",s=>{s.key==="p"&&t(),s.key==="w"&&(n=!n,Me&&Me.forEach(o=>{o.name!="BackgroundCubeMaterial"&&o.glyphMap==null&&"wireframe"in o&&(o.wireframe=n)}))})}function Ae(t,e,r){var n;if(!v)return;se.has(t)||se.set(t,{keys:[],sourceId:r});const s=se.get(t);((n=s?.keys)==null?void 0:n.includes(e))==!1&&s.keys.push(e)}const w=class{constructor(t,e){this.loadMesh=r=>{var n,s;if(this._isLoadingMesh)return null;const o=(s=(n=this.parser.json.meshes[r])==null?void 0:n.extensions)==null?void 0:s[j];return o?(this._isLoadingMesh=!0,this.parser.getDependency("mesh",r).then(i=>{var a;return this._isLoadingMesh=!1,i&&w.registerMesh(this.url,o.guid,i,(a=o.lods)==null?void 0:a.length,void 0,o),i})):null},v&&console.log("Progressive extension registered for",e),this.parser=t,this.url=e}get name(){return j}static getMeshLODInformation(t){const e=this.getAssignedLODInformation(t);return e!=null&&e.key?this.lodInfos.get(e.key):null}static getMaterialMinMaxLODsCount(t,e){const r=this,n="LODS:minmax",s=t[n];if(s!=null)return s;if(e||(e={min_count:1/0,max_count:0,lods:[]}),Array.isArray(t)){for(const i of t)this.getMaterialMinMaxLODsCount(i,e);return t[n]=e,e}if(v==="verbose"&&console.log("getMaterialMinMaxLODsCount",t),t.type==="ShaderMaterial"||t.type==="RawShaderMaterial"){const i=t;for(const a of Object.keys(i.uniforms)){const u=i.uniforms[a].value;u?.isTexture===!0&&o(u,e)}}else if(t.isMaterial)for(const i of Object.keys(t)){const a=t[i];a?.isTexture===!0&&o(a,e)}return t[n]=e,e;function o(i,a){const u=r.getAssignedLODInformation(i);if(u){const l=r.lodInfos.get(u.key);if(l&&l.lods){a.min_count=Math.min(a.min_count,l.lods.length),a.max_count=Math.max(a.max_count,l.lods.length);for(let h=0;h<l.lods.length;h++){const f=l.lods[h];f.width&&(a.lods[h]=a.lods[h]||{min_height:1/0,max_height:0},a.lods[h].min_height=Math.min(a.lods[h].min_height,f.height),a.lods[h].max_height=Math.max(a.lods[h].max_height,f.height))}}}}}static hasLODLevelAvailable(t,e){var r;if(Array.isArray(t)){for(const o of t)if(this.hasLODLevelAvailable(o,e))return!0;return!1}if(t.isMaterial===!0){for(const o of Object.keys(t)){const i=t[o];if(i&&i.isTexture&&this.hasLODLevelAvailable(i,e))return!0}return!1}else if(t.isGroup===!0){for(const o of t.children)if(o.isMesh===!0&&this.hasLODLevelAvailable(o,e))return!0}let n,s;if(t.isMesh?n=t.geometry:(t.isBufferGeometry||t.isTexture)&&(n=t),n&&(r=n?.userData)!=null&&r.LODS){const o=n.userData.LODS;if(s=this.lodInfos.get(o.key),e===void 0)return s!=null;if(s)return Array.isArray(s.lods)?e<s.lods.length:e===0}return!1}static assignMeshLOD(t,e){var r;if(!t)return Promise.resolve(null);if(t instanceof z||t.isMesh===!0){const n=t.geometry,s=this.getAssignedLODInformation(n);if(!s)return Promise.resolve(null);for(const o of N)(r=o.onBeforeGetLODMesh)==null||r.call(o,t,e);return t["LOD:requested level"]=e,w.getOrLoadLOD(n,e).then(o=>{if(Array.isArray(o)){const i=s.index||0;o=o[i]}return t["LOD:requested level"]===e&&(delete t["LOD:requested level"],o&&n!=o&&(o?.isBufferGeometry?(t.geometry=o,v&&Ae(t,"geometry",s.url)):v&&console.error("Invalid LOD geometry",o))),o}).catch(o=>(console.error("Error loading mesh LOD",t,o),null))}else v&&console.error("Invalid call to assignMeshLOD: Request mesh LOD but the object is not a mesh",t);return Promise.resolve(null)}static assignTextureLOD(t,e=0){if(!t)return Promise.resolve(null);if(t.isMesh===!0){const r=t;if(Array.isArray(r.material)){const n=new Array;for(const s of r.material){const o=this.assignTextureLOD(s,e);n.push(o)}return Promise.all(n).then(s=>{const o=new Array;for(const i of s)Array.isArray(i)&&o.push(...i);return o})}else return this.assignTextureLOD(r.material,e)}if(t instanceof Ge||t.isMaterial===!0){const r=t,n=[],s=new Array;if(v&&Me.add(r),r.uniforms&&(r.isRawShaderMaterial||r.isShaderMaterial===!0)){const o=r;for(const i of Object.keys(o.uniforms)){const a=o.uniforms[i].value;if(a?.isTexture===!0){const u=this.assignTextureLODForSlot(a,e,r,i).then(l=>(l&&o.uniforms[i].value!=l&&(o.uniforms[i].value=l,o.uniformsNeedUpdate=!0),l));n.push(u),s.push(i)}}}else for(const o of Object.keys(r)){const i=r[o];if(i?.isTexture===!0){const a=this.assignTextureLODForSlot(i,e,r,o);n.push(a),s.push(o)}}return Promise.all(n).then(o=>{const i=new Array;for(let a=0;a<o.length;a++){const u=o[a],l=s[a];u&&u.isTexture===!0?i.push({material:r,slot:l,texture:u,level:e}):i.push({material:r,slot:l,texture:null,level:e})}return i})}if(t instanceof Z||t.isTexture===!0){const r=t;return this.assignTextureLODForSlot(r,e,null,null)}return Promise.resolve(null)}static assignTextureLODForSlot(t,e,r,n){return t?.isTexture!==!0?Promise.resolve(null):n==="glyphMap"?Promise.resolve(t):w.getOrLoadLOD(t,e).then(s=>{if(Array.isArray(s))return null;if(s?.isTexture===!0){if(s!=t){if(r&&n){const o=r[n];if(o){const i=this.getAssignedLODInformation(o);if(i&&i?.level<e)return v==="verbose"&&console.warn("Assigned texture level is already higher: ",i.level,e,r,o,s),null}r[n]=s}if(v&&n&&r){const o=this.getAssignedLODInformation(t);o&&Ae(r,n,o.url)}}return s}else v=="verbose"&&console.warn("No LOD found for",t,e);return null}).catch(s=>(console.error("Error loading LOD",t,s),null))}afterRoot(t){var e,r;return v&&console.log("AFTER",this.url,t),(e=this.parser.json.textures)==null||e.forEach((n,s)=>{var o;if(n!=null&&n.extensions){const i=n?.extensions[j];if(i){if(!i.lods){v&&console.warn("Texture has no LODs",i);return}let a=!1;for(const u of this.parser.associations.keys())if(u.isTexture===!0){const l=this.parser.associations.get(u);l?.textures===s&&(a=!0,w.registerTexture(this.url,u,(o=i.lods)==null?void 0:o.length,s,i))}a||this.parser.getDependency("texture",s).then(u=>{var l;u&&w.registerTexture(this.url,u,(l=i.lods)==null?void 0:l.length,s,i)})}}}),(r=this.parser.json.meshes)==null||r.forEach((n,s)=>{if(n!=null&&n.extensions){const o=n?.extensions[j];if(o&&o.lods){for(const i of this.parser.associations.keys())if(i.isMesh){const a=this.parser.associations.get(i);a?.meshes===s&&w.registerMesh(this.url,o.guid,i,o.lods.length,a.primitives,o)}}}}),null}static async getOrLoadLOD(t,e){var r,n,s,o;const i=v=="verbose",a=t.userData.LODS;if(!a)return null;const u=a?.key;let l;if(t.isTexture===!0){const h=t;h.source&&h.source[Le]&&(l=h.source[Le])}if(l||(l=w.lodInfos.get(u)),l){if(e>0){let m=!1;const E=Array.isArray(l.lods);if(E&&e>=l.lods.length?m=!0:E||(m=!0),m)return this.lowresCache.get(u)}const h=Array.isArray(l.lods)?(r=l.lods[e])==null?void 0:r.path:l.lods;if(!h)return v&&!l["missing:uri"]&&(l["missing:uri"]=!0,console.warn("Missing uri for progressive asset for LOD "+e,l)),null;const f=Ze(a.url,h);if(f.endsWith(".glb")||f.endsWith(".gltf")){if(!l.guid)return console.warn("missing pointer for glb/gltf texture",l),null;const m=f+"_"+l.guid,E=this.previouslyLoaded.get(m);if(E!==void 0){i&&console.log(`LOD ${e} was already loading/loaded: ${m}`);let c=await E.catch(_=>(console.error(`Error loading LOD ${e} from ${f}
|
|
2
|
-
`,_),null)),D=!1;if(c==null||(c instanceof Z&&t instanceof Z?(n=c.image)!=null&&n.data||(s=c.source)!=null&&s.data?c=this.copySettings(t,c):(D=!0,this.previouslyLoaded.delete(
|
|
3
|
-
`,
|
|
1
|
+
import{B as le,M as V,T as Z,a as We,V as j,b as Oe,S as Ne,c as be,d as $e,C as Ue}from"./three.min.js";import{D as Fe,K as ze,G as ge,M as Ve}from"./three-examples.min.js";const Se="";globalThis.GLTF_PROGRESSIVE_VERSION=Se,console.debug(`[gltf-progressive] version ${Se}`);let Y="https://www.gstatic.com/draco/versioned/decoders/1.5.7/",ee="https://www.gstatic.com/basis-universal/versioned/2021-04-15-ba1c3e4/";const qe=Y,He=ee,Xe=new URL(Y+"draco_decoder.js");fetch(Xe,{method:"GET",headers:{Range:"bytes=0-1"}}).catch(t=>{Y===qe&&(Y="./include/draco/"),ee===He&&(ee="./include/ktx2/")}).finally(()=>{Te()});function Ke(t){Y=t}function Ye(t){ee=t}let q,ae,H;function Te(){q||(q=new Fe,q.setDecoderPath(Y),q.setDecoderConfig({type:"js"}),q.preload()),H||(H=new ze,H.setTranscoderPath(ee),H.init()),ae||(ae=Ve)}function me(t){return Te(),t?H.detectSupport(t):t!==null&&console.warn("No renderer provided to detect ktx2 support - loading KTX2 textures might fail"),{dracoLoader:q,ktx2Loader:H,meshoptDecoder:ae}}function pe(t){t.dracoLoader||t.setDRACOLoader(q),t.ktx2Loader||t.setKTX2Loader(H),t.meshoptDecoder||t.setMeshoptDecoder(ae)}const ve=new WeakMap;function xe(t,e){let r=ve.get(t);r?r=Object.assign(r,e):r=e,ve.set(t,r)}const Ee=ge.prototype.load;function Je(...t){const e=ve.get(this);let r=t[0];const n=new URL(r,window.location.href);if(n.hostname.endsWith("needle.tools")){const s=e?.progressive!==void 0?e.progressive:!0,o=e!=null&&e.usecase?e.usecase:"default";s?this.requestHeader.Accept=`*/*;progressive=allowed;usecase=${o}`:this.requestHeader.Accept=`*/*;usecase=${o}`,r=n.toString()}return t[0]=r,Ee?.call(this,...t)}ge.prototype.load=Je,te("debugprogressive");function te(t){if(typeof window>"u")return!1;const e=new URL(window.location.href).searchParams.get(t);return e==null||e==="0"||e==="false"?!1:e===""?!0:e}function Qe(t,e){if(e===void 0||e.startsWith("./")||e.startsWith("http")||t===void 0)return e;const r=t.lastIndexOf("/");if(r>=0){const n=t.substring(0,r+1);for(;n.endsWith("/")&&e.startsWith("/");)e=e.substring(1);return n+e}return e}let ue;function Ze(){return ue!==void 0||(ue=/iPhone|iPad|iPod|Android|IEMobile/i.test(navigator.userAgent),te("debugprogressive")&&console.log("[glTF Progressive]: isMobileDevice",ue)),ue}const et=typeof window>"u"&&typeof document>"u",ye=Symbol("needle:raycast-mesh");function J(t){return t?.[ye]instanceof le?t[ye]:null}function tt(t,e){if((t.type==="Mesh"||t.type==="SkinnedMesh")&&!J(t)){const r=st(e);r.userData={isRaycastMesh:!0},t[ye]=r}}function rt(t=!0){if(t){if(re)return;const e=re=V.prototype.raycast;V.prototype.raycast=function(r,n){const s=this,o=J(s);let i;o&&s.isMesh&&(i=s.geometry,s.geometry=o),e.call(this,r,n),i&&(s.geometry=i)}}else{if(!re)return;V.prototype.raycast=re,re=null}}let re=null;function st(t){const e=new le;for(const r in t.attributes)e.setAttribute(r,t.getAttribute(r));return e.setIndex(t.getIndex()),e}const N=new Array,G="NEEDLE_progressive",v=te("debugprogressive"),Le=Symbol("needle-progressive-texture"),se=new Map,Me=new Set;if(v){let t=function(){e+=1,console.log("Toggle LOD level",e,se),se.forEach((s,o)=>{for(const i of s.keys){const a=o[i];if(a!=null)if(a.isBufferGeometry===!0){const u=S.getMeshLODInformation(a),l=u?Math.min(e,u.lods.length):0;o["DEBUG:LOD"]=l,u&&(r=Math.max(r,u.lods.length-1))}else o.isMaterial===!0&&(o["DEBUG:LOD"]=e)}}),e>=r&&(e=-1)},e=-1,r=2,n=!1;window.addEventListener("keyup",s=>{s.key==="p"&&t(),s.key==="w"&&(n=!n,Me&&Me.forEach(o=>{o.name!="BackgroundCubeMaterial"&&o.glyphMap==null&&"wireframe"in o&&(o.wireframe=n)}))})}function Ae(t,e,r){var n;if(!v)return;se.has(t)||se.set(t,{keys:[],sourceId:r});const s=se.get(t);((n=s?.keys)==null?void 0:n.includes(e))==!1&&s.keys.push(e)}const w=class{constructor(t,e){this.loadMesh=r=>{var n,s;if(this._isLoadingMesh)return null;const o=(s=(n=this.parser.json.meshes[r])==null?void 0:n.extensions)==null?void 0:s[G];return o?(this._isLoadingMesh=!0,this.parser.getDependency("mesh",r).then(i=>{var a;return this._isLoadingMesh=!1,i&&w.registerMesh(this.url,o.guid,i,(a=o.lods)==null?void 0:a.length,void 0,o),i})):null},v&&console.log("Progressive extension registered for",e),this.parser=t,this.url=e}get name(){return G}static getMeshLODInformation(t){const e=this.getAssignedLODInformation(t);return e!=null&&e.key?this.lodInfos.get(e.key):null}static getMaterialMinMaxLODsCount(t,e){const r=this,n="LODS:minmax",s=t[n];if(s!=null)return s;if(e||(e={min_count:1/0,max_count:0,lods:[]}),Array.isArray(t)){for(const i of t)this.getMaterialMinMaxLODsCount(i,e);return t[n]=e,e}if(v==="verbose"&&console.log("getMaterialMinMaxLODsCount",t),t.type==="ShaderMaterial"||t.type==="RawShaderMaterial"){const i=t;for(const a of Object.keys(i.uniforms)){const u=i.uniforms[a].value;u?.isTexture===!0&&o(u,e)}}else if(t.isMaterial)for(const i of Object.keys(t)){const a=t[i];a?.isTexture===!0&&o(a,e)}return t[n]=e,e;function o(i,a){const u=r.getAssignedLODInformation(i);if(u){const l=r.lodInfos.get(u.key);if(l&&l.lods){a.min_count=Math.min(a.min_count,l.lods.length),a.max_count=Math.max(a.max_count,l.lods.length);for(let h=0;h<l.lods.length;h++){const f=l.lods[h];f.width&&(a.lods[h]=a.lods[h]||{min_height:1/0,max_height:0},a.lods[h].min_height=Math.min(a.lods[h].min_height,f.height),a.lods[h].max_height=Math.max(a.lods[h].max_height,f.height))}}}}}static hasLODLevelAvailable(t,e){var r;if(Array.isArray(t)){for(const o of t)if(this.hasLODLevelAvailable(o,e))return!0;return!1}if(t.isMaterial===!0){for(const o of Object.keys(t)){const i=t[o];if(i&&i.isTexture&&this.hasLODLevelAvailable(i,e))return!0}return!1}else if(t.isGroup===!0){for(const o of t.children)if(o.isMesh===!0&&this.hasLODLevelAvailable(o,e))return!0}let n,s;if(t.isMesh?n=t.geometry:(t.isBufferGeometry||t.isTexture)&&(n=t),n&&(r=n?.userData)!=null&&r.LODS){const o=n.userData.LODS;if(s=this.lodInfos.get(o.key),e===void 0)return s!=null;if(s)return Array.isArray(s.lods)?e<s.lods.length:e===0}return!1}static assignMeshLOD(t,e){var r;if(!t)return Promise.resolve(null);if(t instanceof V||t.isMesh===!0){const n=t.geometry,s=this.getAssignedLODInformation(n);if(!s)return Promise.resolve(null);for(const o of N)(r=o.onBeforeGetLODMesh)==null||r.call(o,t,e);return t["LOD:requested level"]=e,w.getOrLoadLOD(n,e).then(o=>{if(Array.isArray(o)){const i=s.index||0;o=o[i]}return t["LOD:requested level"]===e&&(delete t["LOD:requested level"],o&&n!=o&&(o?.isBufferGeometry?(t.geometry=o,v&&Ae(t,"geometry",s.url)):v&&console.error("Invalid LOD geometry",o))),o}).catch(o=>(console.error("Error loading mesh LOD",t,o),null))}else v&&console.error("Invalid call to assignMeshLOD: Request mesh LOD but the object is not a mesh",t);return Promise.resolve(null)}static assignTextureLOD(t,e=0){if(!t)return Promise.resolve(null);if(t.isMesh===!0){const r=t;if(Array.isArray(r.material)){const n=new Array;for(const s of r.material){const o=this.assignTextureLOD(s,e);n.push(o)}return Promise.all(n).then(s=>{const o=new Array;for(const i of s)Array.isArray(i)&&o.push(...i);return o})}else return this.assignTextureLOD(r.material,e)}if(t.isMaterial===!0){const r=t,n=[],s=new Array;if(v&&Me.add(r),r.uniforms&&(r.isRawShaderMaterial||r.isShaderMaterial===!0)){const o=r;for(const i of Object.keys(o.uniforms)){const a=o.uniforms[i].value;if(a?.isTexture===!0){const u=this.assignTextureLODForSlot(a,e,r,i).then(l=>(l&&o.uniforms[i].value!=l&&(o.uniforms[i].value=l,o.uniformsNeedUpdate=!0),l));n.push(u),s.push(i)}}}else for(const o of Object.keys(r)){const i=r[o];if(i?.isTexture===!0){const a=this.assignTextureLODForSlot(i,e,r,o);n.push(a),s.push(o)}}return Promise.all(n).then(o=>{const i=new Array;for(let a=0;a<o.length;a++){const u=o[a],l=s[a];u&&u.isTexture===!0?i.push({material:r,slot:l,texture:u,level:e}):i.push({material:r,slot:l,texture:null,level:e})}return i})}if(t instanceof Z||t.isTexture===!0){const r=t;return this.assignTextureLODForSlot(r,e,null,null)}return Promise.resolve(null)}static assignTextureLODForSlot(t,e,r,n){return t?.isTexture!==!0?Promise.resolve(null):n==="glyphMap"?Promise.resolve(t):w.getOrLoadLOD(t,e).then(s=>{if(Array.isArray(s))return null;if(s?.isTexture===!0){if(s!=t){if(r&&n){const o=r[n];if(o&&!v){const i=this.getAssignedLODInformation(o);if(i&&i?.level<e)return v==="verbose"&&console.warn("Assigned texture level is already higher: ",i.level,e,r,o,s),null}r[n]=s}if(v&&n&&r){const o=this.getAssignedLODInformation(t);o?Ae(r,n,o.url):console.warn("No LOD info for texture",t)}}return s}else v=="verbose"&&console.warn("No LOD found for",t,e);return null}).catch(s=>(console.error("Error loading LOD",t,s),null))}afterRoot(t){var e,r;return v&&console.log("AFTER",this.url,t),(e=this.parser.json.textures)==null||e.forEach((n,s)=>{var o;if(n!=null&&n.extensions){const i=n?.extensions[G];if(i){if(!i.lods){v&&console.warn("Texture has no LODs",i);return}let a=!1;for(const u of this.parser.associations.keys())if(u.isTexture===!0){const l=this.parser.associations.get(u);l?.textures===s&&(a=!0,w.registerTexture(this.url,u,(o=i.lods)==null?void 0:o.length,s,i))}a||this.parser.getDependency("texture",s).then(u=>{var l;u&&w.registerTexture(this.url,u,(l=i.lods)==null?void 0:l.length,s,i)})}}}),(r=this.parser.json.meshes)==null||r.forEach((n,s)=>{if(n!=null&&n.extensions){const o=n?.extensions[G];if(o&&o.lods){for(const i of this.parser.associations.keys())if(i.isMesh){const a=this.parser.associations.get(i);a?.meshes===s&&w.registerMesh(this.url,o.guid,i,o.lods.length,a.primitives,o)}}}}),null}static async getOrLoadLOD(t,e){var r,n,s,o;const i=v=="verbose",a=t.userData.LODS;if(!a)return null;const u=a?.key;let l;if(t.isTexture===!0){const h=t;h.source&&h.source[Le]&&(l=h.source[Le])}if(l||(l=w.lodInfos.get(u)),l){if(e>0){let p=!1;const E=Array.isArray(l.lods);if(E&&e>=l.lods.length?p=!0:E||(p=!0),p)return this.lowresCache.get(u)}const h=Array.isArray(l.lods)?(r=l.lods[e])==null?void 0:r.path:l.lods;if(!h)return v&&!l["missing:uri"]&&(l["missing:uri"]=!0,console.warn("Missing uri for progressive asset for LOD "+e,l)),null;const f=Qe(a.url,h);if(f.endsWith(".glb")||f.endsWith(".gltf")){if(!l.guid)return console.warn("missing pointer for glb/gltf texture",l),null;const p=f+"_"+l.guid,E=this.previouslyLoaded.get(p);if(E!==void 0){i&&console.log(`LOD ${e} was already loading/loaded: ${p}`);let c=await E.catch(_=>(console.error(`Error loading LOD ${e} from ${f}
|
|
2
|
+
`,_),null)),D=!1;if(c==null||(c instanceof Z&&t instanceof Z?(n=c.image)!=null&&n.data||(s=c.source)!=null&&s.data?c=this.copySettings(t,c):(D=!0,this.previouslyLoaded.delete(p)):c instanceof le&&t instanceof le&&((o=c.attributes.position)!=null&&o.array||(D=!0,this.previouslyLoaded.delete(p)))),!D)return c}const M=l,x=new Promise(async(c,D)=>{const _=new ge;pe(_),v&&(await new Promise(m=>setTimeout(m,1e3)),i&&console.warn("Start loading (delayed) "+f,M.guid));let P=f;if(M&&Array.isArray(M.lods)){const m=M.lods[e];m.hash&&(P+="?v="+m.hash)}const O=await _.loadAsync(P).catch(m=>(console.error(`Error loading LOD ${e} from ${f}
|
|
3
|
+
`,m),null));if(!O)return null;const I=O.parser;i&&console.log("Loading finished "+f,M.guid);let g=0;if(O.parser.json.textures){let m=!1;for(const d of O.parser.json.textures){if(d!=null&&d.extensions){const L=d?.extensions[G];if(L!=null&&L.guid&&L.guid===M.guid){m=!0;break}}g++}if(m){let d=await I.getDependency("texture",g);return d&&w.assignLODInformation(a.url,d,u,e,void 0,void 0),i&&console.log('change "'+t.name+'" \u2192 "'+d.name+'"',f,g,d,p),t instanceof Z&&(d=this.copySettings(t,d)),d&&(d.guid=M.guid),c(d)}else v&&console.warn("Could not find texture with guid",M.guid,O.parser.json)}if(g=0,O.parser.json.meshes){let m=!1;for(const d of O.parser.json.meshes){if(d!=null&&d.extensions){const L=d?.extensions[G];if(L!=null&&L.guid&&L.guid===M.guid){m=!0;break}}g++}if(m){const d=await I.getDependency("mesh",g),L=M;if(i&&console.log(`Loaded Mesh "${d.name}"`,f,g,d,p),d.isMesh===!0){const b=d.geometry;return w.assignLODInformation(a.url,b,u,e,void 0,L.density),c(b)}else{const b=new Array;for(let k=0;k<d.children.length;k++){const z=d.children[k];if(z.isMesh===!0){const K=z.geometry;w.assignLODInformation(a.url,K,u,e,k,L.density),b.push(K)}}return c(b)}}else v&&console.warn("Could not find mesh with guid",M.guid,O.parser.json)}return c(null)});return this.previouslyLoaded.set(p,x),await x}else if(t instanceof Z){i&&console.log("Load texture from uri: "+f);const p=await new We().loadAsync(f);return p?(p.guid=l.guid,p.flipY=!1,p.needsUpdate=!0,p.colorSpace=t.colorSpace,i&&console.log(l,p)):v&&console.warn("failed loading",f),p}}else v&&console.warn(`Can not load LOD ${e}: no LOD info found for "${u}" ${t.name}`,t.type);return null}static assignLODInformation(t,e,r,n,s,o){if(!e)return;e.userData||(e.userData={});const i=new ot(t,r,n,s,o);e.userData.LODS=i}static getAssignedLODInformation(t){var e;return((e=t?.userData)==null?void 0:e.LODS)||null}static copySettings(t,e){return v&&console.warn(`Copy texture settings
|
|
4
4
|
`,t.uuid,`
|
|
5
|
-
`,e.uuid),e.offset=t.offset,e.repeat=t.repeat,e.colorSpace=t.colorSpace,e.magFilter=t.magFilter,e.minFilter=t.minFilter,e.wrapS=t.wrapS,e.wrapT=t.wrapT,e.flipY=t.flipY,e.anisotropy=t.anisotropy,e.mipmaps||(e.generateMipmaps=t.generateMipmaps),e}};let b=w;b.registerTexture=(t,e,r,n,s)=>{if(v&&console.log("> Progressive: register texture",n,e.name,e.uuid,e,s),!e){v&&console.error("gltf-progressive: Register texture without texture");return}e.source&&(e.source[Le]=s);const o=s.guid;w.assignLODInformation(t,e,o,r,n,void 0),w.lodInfos.set(o,s),w.lowresCache.set(o,e)},b.registerMesh=(t,e,r,n,s,o)=>{var i;v&&console.log("> Progressive: register mesh",s,r.name,o,r.uuid,r);const a=r.geometry;if(!a){v&&console.warn("gltf-progressive: Register mesh without geometry");return}a.userData||(a.userData={}),w.assignLODInformation(t,a,e,n,s,o.density),w.lodInfos.set(e,o);let u=w.lowresCache.get(e);u?u.push(r.geometry):u=[r.geometry],w.lowresCache.set(e,u),n>0&&!Y(r)&&rt(r,a);for(const l of N)(i=l.onRegisteredNewMesh)==null||i.call(l,r,o)},b.lodInfos=new Map,b.previouslyLoaded=new Map,b.lowresCache=new Map;class nt{constructor(e,r,n,s,o){this.url=e,this.key=r,this.level=n,s!=null&&(this.index=s),o!=null&&(this.density=o)}}var Pe=(t,e,r)=>{if(!e.has(t))throw TypeError("Cannot "+r)},y=(t,e,r)=>(Pe(t,e,"read from private field"),r?r.call(t):e.get(t)),H=(t,e,r)=>{if(e.has(t))throw TypeError("Cannot add the same private member more than once");e instanceof WeakSet?e.add(t):e.set(t,r)},W=(t,e,r,n)=>(Pe(t,e,"write to private field"),n?n.call(t,r):e.set(t,r),r),T,$,we,J,oe,ce,U;const I=te("debugprogressive"),it=te("noprogressive"),De=Symbol("Needle:LODSManager"),_e=Symbol("Needle:LODState"),Q=Symbol("Needle:CurrentLOD"),B={mesh_lod:-1,texture_lod:-1},P=class{constructor(t,e){this.projectionScreenMatrix=new Oe,this.targetTriangleDensity=2e5,this.updateInterval="auto",H(this,T,1),this.pause=!1,this.manual=!1,this._lodchangedlisteners=[],H(this,$,void 0),H(this,we,new Fe),H(this,J,0),H(this,oe,0),H(this,ce,0),H(this,U,0),this._fpsBuffer=[60,60,60,60,60],this._sphere=new $e,this._tempBox=new be,this._tempBox2=new be,this.tempMatrix=new Oe,this._tempWorldPosition=new R,this._tempBoxSize=new R,this._tempBox2Size=new R,this.renderer=t,this.context={...e}}static getObjectLODState(t){return t[_e]}static addPlugin(t){N.push(t)}static removePlugin(t){const e=N.indexOf(t);e>=0&&N.splice(e,1)}static get(t,e){if(t[De])return console.debug("[gltf-progressive] LODsManager already exists for this renderer"),t[De];const r=new P(t,{engine:"unknown",...e});return t[De]=r,r}get plugins(){return N}addEventListener(t,e){t==="changed"&&this._lodchangedlisteners.push(e)}removeEventListener(t,e){if(t==="changed"){const r=this._lodchangedlisteners.indexOf(e);r>=0&&this._lodchangedlisteners.splice(r,1)}}enable(){if(y(this,$))return;console.debug("[gltf-progressive] Enabling LODsManager for renderer");let t=0;W(this,$,this.renderer.render);const e=this;me(this.renderer),this.renderer.render=function(r,n){const s=e.renderer.getRenderTarget();(s==null||"isXRRenderTarget"in s&&s.isXRRenderTarget)&&(t=0,W(e,J,y(e,J)+1),W(e,oe,y(e,we).getDelta()),W(e,ce,y(e,ce)+y(e,oe)),e._fpsBuffer.shift(),e._fpsBuffer.push(1/y(e,oe)),W(e,U,e._fpsBuffer.reduce((i,a)=>i+a)/e._fpsBuffer.length),I&&y(e,J)%200===0&&console.log("FPS",Math.round(y(e,U)),"Interval:",y(e,T)));const o=t++;y(e,$).call(this,r,n),e.onAfterRender(r,n,o)}}disable(){y(this,$)&&(console.debug("[gltf-progressive] Disabling LODsManager for renderer"),this.renderer.render=y(this,$),W(this,$,void 0))}update(t,e){this.internalUpdate(t,e)}onAfterRender(t,e,r){if(this.pause)return;const n=this.renderer.renderLists.get(t,0).opaque;let s=!0;if(n.length===1){const o=n[0].material;(o.name==="EffectMaterial"||o.name==="CopyShader")&&(s=!1)}if((e.parent&&e.parent.type==="CubeCamera"||r>=1&&e.type==="OrthographicCamera")&&(s=!1),s){if(it||(this.updateInterval==="auto"?y(this,U)<40&&y(this,T)<10?(W(this,T,y(this,T)+1),I&&console.warn("\u2193 Reducing LOD updates",y(this,T),y(this,U).toFixed(0))):y(this,U)>=60&&y(this,T)>1&&(W(this,T,y(this,T)-1),I&&console.warn("\u2191 Increasing LOD updates",y(this,T),y(this,U).toFixed(0))):W(this,T,this.updateInterval),y(this,T)>0&&y(this,J)%y(this,T)!=0))return;this.internalUpdate(t,e)}}internalUpdate(t,e){var r,n;const s=this.renderer.renderLists.get(t,0),o=s.opaque;this.projectionScreenMatrix.multiplyMatrices(e.projectionMatrix,e.matrixWorldInverse);const i=this.targetTriangleDensity;for(const l of o){if(l.material&&(((r=l.geometry)==null?void 0:r.type)==="BoxGeometry"||((n=l.geometry)==null?void 0:n.type)==="BufferGeometry")&&(l.material.name==="SphericalGaussianBlur"||l.material.name=="BackgroundCubeMaterial"||l.material.name==="CubemapFromEquirect"||l.material.name==="EquirectangularToCubeUV")){I&&(l.material["NEEDLE_PROGRESSIVE:IGNORE-WARNING"]||(l.material["NEEDLE_PROGRESSIVE:IGNORE-WARNING"]=!0,console.warn("Ignoring skybox or BLIT object",l,l.material.name,l.material.type)));continue}switch(l.material.type){case"LineBasicMaterial":case"LineDashedMaterial":case"PointsMaterial":case"ShadowMaterial":case"MeshDistanceMaterial":case"MeshDepthMaterial":continue}if(I==="color"&&l.material&&!l.object.progressive_debug_color){l.object.progressive_debug_color=!0;const f=Math.random()*16777215,m=new Ue({color:f});l.object.material=m}const h=l.object;(h instanceof z||h.isMesh)&&this.updateLODs(t,e,h,i)}const a=s.transparent;for(const l of a){const h=l.object;(h instanceof z||h.isMesh)&&this.updateLODs(t,e,h,i)}const u=s.transmissive;for(const l of u){const h=l.object;(h instanceof z||h.isMesh)&&this.updateLODs(t,e,h,i)}}updateLODs(t,e,r,n){var s,o;r.userData||(r.userData={});let i=r[_e];if(i||(i=new lt,r[_e]=i),i.frames++<2)return;for(const u of N)(s=u.onBeforeUpdateLOD)==null||s.call(u,this.renderer,t,e,r);this.calculateLodLevel(e,r,i,n,B),B.mesh_lod=Math.round(B.mesh_lod),B.texture_lod=Math.round(B.texture_lod),B.mesh_lod>=0&&this.loadProgressiveMeshes(r,B.mesh_lod);let a=B.texture_lod;if(r.material&&a>=0){const u=r["DEBUG:LOD"];u!=null&&(a=u),this.loadProgressiveTextures(r.material,a)}for(const u of N)(o=u.onAfterUpdatedLOD)==null||o.call(u,this.renderer,t,e,r,B);i.lastLodLevel_Mesh=B.mesh_lod,i.lastLodLevel_Texture=B.texture_lod}loadProgressiveTextures(t,e){if(!t)return;if(Array.isArray(t)){for(const n of t)this.loadProgressiveTextures(n,e);return}let r=!1;(t[Q]===void 0||e<t[Q])&&(r=!0),r&&(t[Q]=e,b.assignTextureLOD(t,e).then(n=>{this._lodchangedlisteners.forEach(s=>s({type:"texture",level:e,object:t}))}))}loadProgressiveMeshes(t,e){if(!t)return Promise.resolve(null);if(t[Q]!==e){t[Q]=e;const r=t.geometry;return b.assignMeshLOD(t,e).then(n=>(n&&t[Q]==e&&r!=t.geometry&&this._lodchangedlisteners.forEach(s=>s({type:"mesh",level:e,object:t})),n))}return Promise.resolve(null)}static isInside(t,e){const r=t.min,n=t.max,s=(r.x+n.x)*.5,o=(r.y+n.y)*.5;return this._tempPtInside.set(s,o,r.z).applyMatrix4(e).z<0}calculateLodLevel(t,e,r,n,s){var o;if(!e){s.mesh_lod=-1,s.texture_lod=-1;return}if(!t){s.mesh_lod=-1,s.texture_lod=-1;return}let i=10+1,a=!1;if(I&&e["DEBUG:LOD"]!=null)return e["DEBUG:LOD"];const u=b.getMeshLODInformation(e.geometry),l=u?.lods,h=l&&l.length>0,f=b.getMaterialMinMaxLODsCount(e.material),m=f?.min_count!=1/0&&f.min_count>0&&f.max_count>0;if(!h&&!m){s.mesh_lod=0,s.texture_lod=0;return}h||(a=!0,i=0);const E=this.renderer.domElement.clientHeight||this.renderer.domElement.height;let M=e.geometry.boundingBox;if(e.type==="SkinnedMesh"){const x=e;if(!x.boundingBox)x.computeBoundingBox();else if(r.frames%30===0){const c=Y(x),D=x.geometry;c&&(x.geometry=c),x.computeBoundingBox(),x.geometry=D}M=x.boundingBox}if(M&&t.isPerspectiveCamera){const x=t;if(e.geometry.attributes.color&&e.geometry.attributes.color.count<100&&e.geometry.boundingSphere){this._sphere.copy(e.geometry.boundingSphere),this._sphere.applyMatrix4(e.matrixWorld);const p=t.getWorldPosition(this._tempWorldPosition);if(this._sphere.containsPoint(p)){s.mesh_lod=0,s.texture_lod=0;return}}if(this._tempBox.copy(M),this._tempBox.applyMatrix4(e.matrixWorld),P.isInside(this._tempBox,this.projectionScreenMatrix)){s.mesh_lod=0,s.texture_lod=0;return}if(this._tempBox.applyMatrix4(this.projectionScreenMatrix),this.renderer.xr.enabled&&x.fov>70){const p=this._tempBox.min,g=this._tempBox.max;let d=p.x,L=p.y,O=g.x,k=g.y;const F=2,X=1.5,ne=(p.x+g.x)*.5,ie=(p.y+g.y)*.5;d=(d-ne)*F+ne,L=(L-ie)*F+ie,O=(O-ne)*F+ne,k=(k-ie)*F+ie;const je=d<0&&O>0?0:Math.min(Math.abs(p.x),Math.abs(g.x)),We=L<0&&k>0?0:Math.min(Math.abs(p.y),Math.abs(g.y)),fe=Math.max(je,We);r.lastCentrality=(X-fe)*(X-fe)*(X-fe)}else r.lastCentrality=1;const c=this._tempBox.getSize(this._tempBoxSize);c.multiplyScalar(.5),screen.availHeight>0&&E>0&&c.multiplyScalar(E/screen.availHeight),c.x*=x.aspect;const D=t.matrixWorldInverse,_=this._tempBox2;_.copy(M),_.applyMatrix4(e.matrixWorld),_.applyMatrix4(D);const A=_.getSize(this._tempBox2Size),S=Math.max(A.x,A.y);if(Math.max(c.x,c.y)!=0&&S!=0&&(c.z=A.z/Math.max(A.x,A.y)*Math.max(c.x,c.y)),r.lastScreenCoverage=Math.max(c.x,c.y,c.z),r.lastScreenspaceVolume.copy(c),r.lastScreenCoverage*=r.lastCentrality,I&&P.debugDrawLine){const p=this.tempMatrix.copy(this.projectionScreenMatrix);p.invert();const g=P.corner0,d=P.corner1,L=P.corner2,O=P.corner3;g.copy(this._tempBox.min),d.copy(this._tempBox.max),d.x=g.x,L.copy(this._tempBox.max),L.y=g.y,O.copy(this._tempBox.max);const k=(g.z+O.z)*.5;g.z=d.z=L.z=O.z=k,g.applyMatrix4(p),d.applyMatrix4(p),L.applyMatrix4(p),O.applyMatrix4(p),P.debugDrawLine(g,d,255),P.debugDrawLine(g,L,255),P.debugDrawLine(d,O,255),P.debugDrawLine(L,O,255)}let G=999;if(l&&r.lastScreenCoverage>0){for(let p=0;p<l.length;p++)if(l[p].density/r.lastScreenCoverage<n){G=p;break}}G<i&&(i=G,a=!0)}if(a?s.mesh_lod=i:s.mesh_lod=r.lastLodLevel_Mesh,I&&s.mesh_lod!=r.lastLodLevel_Mesh){const x=l?.[s.mesh_lod];x&&console.log(`Mesh LOD changed: ${r.lastLodLevel_Mesh} \u2192 ${s.mesh_lod} (${x.density.toFixed(0)}) - ${e.name}`)}if(m){const x="saveData"in globalThis.navigator&&globalThis.navigator.saveData===!0;if(r.lastLodLevel_Texture<0){if(s.texture_lod=f.max_count-1,I){const c=f.lods[f.max_count-1];I&&console.log(`First Texture LOD ${s.texture_lod} (${c.max_height}px) - ${e.name}`)}}else{const c=r.lastScreenspaceVolume.x+r.lastScreenspaceVolume.y+r.lastScreenspaceVolume.z;let D=r.lastScreenCoverage*4;((o=this.context)==null?void 0:o.engine)==="model-viewer"&&(D*=1.5);const _=E/window.devicePixelRatio*D;for(let A=f.lods.length-1;A>=0;A--){let S=f.lods[A];if(!(x&&S.max_height>=2048)&&!(et()&&S.max_height>4096)&&S.max_height>_){if(s.texture_lod=A,s.texture_lod<r.lastLodLevel_Texture){const G=S.max_height;I&&console.log(`Texture LOD changed: ${r.lastLodLevel_Texture} \u2192 ${s.texture_lod} = ${G}px
|
|
5
|
+
`,e.uuid),e=e.clone(),e.offset=t.offset,e.repeat=t.repeat,e.colorSpace=t.colorSpace,e.magFilter=t.magFilter,e.minFilter=t.minFilter,e.wrapS=t.wrapS,e.wrapT=t.wrapT,e.flipY=t.flipY,e.anisotropy=t.anisotropy,e.mipmaps||(e.generateMipmaps=t.generateMipmaps),e}};let S=w;S.registerTexture=(t,e,r,n,s)=>{if(v&&console.log("> Progressive: register texture",n,e.name,e.uuid,e,s),!e){v&&console.error("gltf-progressive: Register texture without texture");return}e.source&&(e.source[Le]=s);const o=s.guid;w.assignLODInformation(t,e,o,r,n,void 0),w.lodInfos.set(o,s),w.lowresCache.set(o,e)},S.registerMesh=(t,e,r,n,s,o)=>{var i;v&&console.log("> Progressive: register mesh",s,r.name,o,r.uuid,r);const a=r.geometry;if(!a){v&&console.warn("gltf-progressive: Register mesh without geometry");return}a.userData||(a.userData={}),w.assignLODInformation(t,a,e,n,s,o.density),w.lodInfos.set(e,o);let u=w.lowresCache.get(e);u?u.push(r.geometry):u=[r.geometry],w.lowresCache.set(e,u),n>0&&!J(r)&&tt(r,a);for(const l of N)(i=l.onRegisteredNewMesh)==null||i.call(l,r,o)},S.lodInfos=new Map,S.previouslyLoaded=new Map,S.lowresCache=new Map;class ot{constructor(e,r,n,s,o){this.url=e,this.key=r,this.level=n,s!=null&&(this.index=s),o!=null&&(this.density=o)}}var Pe=(t,e,r)=>{if(!e.has(t))throw TypeError("Cannot "+r)},y=(t,e,r)=>(Pe(t,e,"read from private field"),r?r.call(t):e.get(t)),X=(t,e,r)=>{if(e.has(t))throw TypeError("Cannot add the same private member more than once");e instanceof WeakSet?e.add(t):e.set(t,r)},W=(t,e,r,n)=>(Pe(t,e,"write to private field"),n?n.call(t,r):e.set(t,r),r),T,$,we,Q,oe,ce,U;const B=te("debugprogressive"),nt=te("noprogressive"),De=Symbol("Needle:LODSManager"),_e=Symbol("Needle:LODState"),F=Symbol("Needle:CurrentLOD"),C={mesh_lod:-1,texture_lod:-1},A=class{constructor(t,e){this.projectionScreenMatrix=new Oe,this.targetTriangleDensity=2e5,this.updateInterval="auto",X(this,T,1),this.pause=!1,this.manual=!1,this._lodchangedlisteners=[],X(this,$,void 0),X(this,we,new Ue),X(this,Q,0),X(this,oe,0),X(this,ce,0),X(this,U,0),this._fpsBuffer=[60,60,60,60,60],this._sphere=new Ne,this._tempBox=new be,this._tempBox2=new be,this.tempMatrix=new Oe,this._tempWorldPosition=new j,this._tempBoxSize=new j,this._tempBox2Size=new j,this.renderer=t,this.context={...e}}static getObjectLODState(t){return t[_e]}static addPlugin(t){N.push(t)}static removePlugin(t){const e=N.indexOf(t);e>=0&&N.splice(e,1)}static get(t,e){if(t[De])return console.debug("[gltf-progressive] LODsManager already exists for this renderer"),t[De];const r=new A(t,{engine:"unknown",...e});return t[De]=r,r}get plugins(){return N}addEventListener(t,e){t==="changed"&&this._lodchangedlisteners.push(e)}removeEventListener(t,e){if(t==="changed"){const r=this._lodchangedlisteners.indexOf(e);r>=0&&this._lodchangedlisteners.splice(r,1)}}enable(){if(y(this,$))return;console.debug("[gltf-progressive] Enabling LODsManager for renderer");let t=0;W(this,$,this.renderer.render);const e=this;me(this.renderer),this.renderer.render=function(r,n){const s=e.renderer.getRenderTarget();(s==null||"isXRRenderTarget"in s&&s.isXRRenderTarget)&&(t=0,W(e,Q,y(e,Q)+1),W(e,oe,y(e,we).getDelta()),W(e,ce,y(e,ce)+y(e,oe)),e._fpsBuffer.shift(),e._fpsBuffer.push(1/y(e,oe)),W(e,U,e._fpsBuffer.reduce((i,a)=>i+a)/e._fpsBuffer.length),B&&y(e,Q)%200===0&&console.log("FPS",Math.round(y(e,U)),"Interval:",y(e,T)));const o=t++;y(e,$).call(this,r,n),e.onAfterRender(r,n,o)}}disable(){y(this,$)&&(console.debug("[gltf-progressive] Disabling LODsManager for renderer"),this.renderer.render=y(this,$),W(this,$,void 0))}update(t,e){this.internalUpdate(t,e)}onAfterRender(t,e,r){if(this.pause)return;const n=this.renderer.renderLists.get(t,0).opaque;let s=!0;if(n.length===1){const o=n[0].material;(o.name==="EffectMaterial"||o.name==="CopyShader")&&(s=!1)}if((e.parent&&e.parent.type==="CubeCamera"||r>=1&&e.type==="OrthographicCamera")&&(s=!1),s){if(nt||(this.updateInterval==="auto"?y(this,U)<40&&y(this,T)<10?(W(this,T,y(this,T)+1),B&&console.warn("\u2193 Reducing LOD updates",y(this,T),y(this,U).toFixed(0))):y(this,U)>=60&&y(this,T)>1&&(W(this,T,y(this,T)-1),B&&console.warn("\u2191 Increasing LOD updates",y(this,T),y(this,U).toFixed(0))):W(this,T,this.updateInterval),y(this,T)>0&&y(this,Q)%y(this,T)!=0))return;this.internalUpdate(t,e)}}internalUpdate(t,e){var r,n;const s=this.renderer.renderLists.get(t,0),o=s.opaque;this.projectionScreenMatrix.multiplyMatrices(e.projectionMatrix,e.matrixWorldInverse);const i=this.targetTriangleDensity;for(const l of o){if(l.material&&(((r=l.geometry)==null?void 0:r.type)==="BoxGeometry"||((n=l.geometry)==null?void 0:n.type)==="BufferGeometry")&&(l.material.name==="SphericalGaussianBlur"||l.material.name=="BackgroundCubeMaterial"||l.material.name==="CubemapFromEquirect"||l.material.name==="EquirectangularToCubeUV")){B&&(l.material["NEEDLE_PROGRESSIVE:IGNORE-WARNING"]||(l.material["NEEDLE_PROGRESSIVE:IGNORE-WARNING"]=!0,console.warn("Ignoring skybox or BLIT object",l,l.material.name,l.material.type)));continue}switch(l.material.type){case"LineBasicMaterial":case"LineDashedMaterial":case"PointsMaterial":case"ShadowMaterial":case"MeshDistanceMaterial":case"MeshDepthMaterial":continue}if(B==="color"&&l.material&&!l.object.progressive_debug_color){l.object.progressive_debug_color=!0;const f=Math.random()*16777215,p=new $e({color:f});l.object.material=p}const h=l.object;(h instanceof V||h.isMesh)&&this.updateLODs(t,e,h,i)}const a=s.transparent;for(const l of a){const h=l.object;(h instanceof V||h.isMesh)&&this.updateLODs(t,e,h,i)}const u=s.transmissive;for(const l of u){const h=l.object;(h instanceof V||h.isMesh)&&this.updateLODs(t,e,h,i)}}updateLODs(t,e,r,n){var s,o;r.userData||(r.userData={});let i=r[_e];if(i||(i=new it,r[_e]=i),i.frames++<2)return;for(const u of N)(s=u.onBeforeUpdateLOD)==null||s.call(u,this.renderer,t,e,r);this.calculateLodLevel(e,r,i,n,C),C.mesh_lod=Math.round(C.mesh_lod),C.texture_lod=Math.round(C.texture_lod),C.mesh_lod>=0&&this.loadProgressiveMeshes(r,C.mesh_lod);let a=C.texture_lod;r.material&&a>=0&&this.loadProgressiveTextures(r.material,a);for(const u of N)(o=u.onAfterUpdatedLOD)==null||o.call(u,this.renderer,t,e,r,C);i.lastLodLevel_Mesh=C.mesh_lod,i.lastLodLevel_Texture=C.texture_lod}loadProgressiveTextures(t,e){if(!t)return;if(Array.isArray(t)){for(const s of t)this.loadProgressiveTextures(s,e);return}let r=!1;(t[F]===void 0||e<t[F])&&(r=!0);const n=t["DEBUG:LOD"];n!=null&&(r=t[F]!=n,e=n),r&&(t[F]=e,S.assignTextureLOD(t,e).then(s=>{this._lodchangedlisteners.forEach(o=>o({type:"texture",level:e,object:t}))}))}loadProgressiveMeshes(t,e){if(!t)return Promise.resolve(null);let r=t[F]!==e;const n=t["DEBUG:LOD"];if(n!=null&&(r=t[F]!=n,e=n),r){t[F]=e;const s=t.geometry;return S.assignMeshLOD(t,e).then(o=>(o&&t[F]==e&&s!=t.geometry&&this._lodchangedlisteners.forEach(i=>i({type:"mesh",level:e,object:t})),o))}return Promise.resolve(null)}static isInside(t,e){const r=t.min,n=t.max,s=(r.x+n.x)*.5,o=(r.y+n.y)*.5;return this._tempPtInside.set(s,o,r.z).applyMatrix4(e).z<0}calculateLodLevel(t,e,r,n,s){var o;if(!e){s.mesh_lod=-1,s.texture_lod=-1;return}if(!t){s.mesh_lod=-1,s.texture_lod=-1;return}let i=10+1,a=!1;if(B&&e["DEBUG:LOD"]!=null)return e["DEBUG:LOD"];const u=S.getMeshLODInformation(e.geometry),l=u?.lods,h=l&&l.length>0,f=S.getMaterialMinMaxLODsCount(e.material),p=f?.min_count!=1/0&&f.min_count>0&&f.max_count>0;if(!h&&!p){s.mesh_lod=0,s.texture_lod=0;return}h||(a=!0,i=0);const E=this.renderer.domElement.clientHeight||this.renderer.domElement.height;let M=e.geometry.boundingBox;if(e.type==="SkinnedMesh"){const x=e;if(!x.boundingBox)x.computeBoundingBox();else if(r.frames%30===0){const c=J(x),D=x.geometry;c&&(x.geometry=c),x.computeBoundingBox(),x.geometry=D}M=x.boundingBox}if(M){const x=t;if(e.geometry.attributes.color&&e.geometry.attributes.color.count<100&&e.geometry.boundingSphere){this._sphere.copy(e.geometry.boundingSphere),this._sphere.applyMatrix4(e.matrixWorld);const g=t.getWorldPosition(this._tempWorldPosition);if(this._sphere.containsPoint(g)){s.mesh_lod=0,s.texture_lod=0;return}}if(this._tempBox.copy(M),this._tempBox.applyMatrix4(e.matrixWorld),x.isPerspectiveCamera&&A.isInside(this._tempBox,this.projectionScreenMatrix)){s.mesh_lod=0,s.texture_lod=0;return}if(this._tempBox.applyMatrix4(this.projectionScreenMatrix),this.renderer.xr.enabled&&x.isPerspectiveCamera&&x.fov>70){const g=this._tempBox.min,m=this._tempBox.max;let d=g.x,L=g.y,b=m.x,k=m.y;const z=2,K=1.5,ne=(g.x+m.x)*.5,ie=(g.y+m.y)*.5;d=(d-ne)*z+ne,L=(L-ie)*z+ie,b=(b-ne)*z+ne,k=(k-ie)*z+ie;const je=d<0&&b>0?0:Math.min(Math.abs(g.x),Math.abs(m.x)),Ge=L<0&&k>0?0:Math.min(Math.abs(g.y),Math.abs(m.y)),fe=Math.max(je,Ge);r.lastCentrality=(K-fe)*(K-fe)*(K-fe)}else r.lastCentrality=1;const c=this._tempBox.getSize(this._tempBoxSize);c.multiplyScalar(.5),screen.availHeight>0&&E>0&&c.multiplyScalar(E/screen.availHeight),t.isPerspectiveCamera?c.x*=t.aspect:t.isOrthographicCamera;const D=t.matrixWorldInverse,_=this._tempBox2;_.copy(M),_.applyMatrix4(e.matrixWorld),_.applyMatrix4(D);const P=_.getSize(this._tempBox2Size),O=Math.max(P.x,P.y);if(Math.max(c.x,c.y)!=0&&O!=0&&(c.z=P.z/Math.max(P.x,P.y)*Math.max(c.x,c.y)),r.lastScreenCoverage=Math.max(c.x,c.y,c.z),r.lastScreenspaceVolume.copy(c),r.lastScreenCoverage*=r.lastCentrality,B&&A.debugDrawLine){const g=this.tempMatrix.copy(this.projectionScreenMatrix);g.invert();const m=A.corner0,d=A.corner1,L=A.corner2,b=A.corner3;m.copy(this._tempBox.min),d.copy(this._tempBox.max),d.x=m.x,L.copy(this._tempBox.max),L.y=m.y,b.copy(this._tempBox.max);const k=(m.z+b.z)*.5;m.z=d.z=L.z=b.z=k,m.applyMatrix4(g),d.applyMatrix4(g),L.applyMatrix4(g),b.applyMatrix4(g),A.debugDrawLine(m,d,255),A.debugDrawLine(m,L,255),A.debugDrawLine(d,b,255),A.debugDrawLine(L,b,255)}let I=999;if(l&&r.lastScreenCoverage>0){for(let g=0;g<l.length;g++)if(l[g].density/r.lastScreenCoverage<n){I=g;break}}I<i&&(i=I,a=!0)}if(a?s.mesh_lod=i:s.mesh_lod=r.lastLodLevel_Mesh,B&&s.mesh_lod!=r.lastLodLevel_Mesh){const x=l?.[s.mesh_lod];x&&console.log(`Mesh LOD changed: ${r.lastLodLevel_Mesh} \u2192 ${s.mesh_lod} (${x.density.toFixed(0)}) - ${e.name}`)}if(p){const x="saveData"in globalThis.navigator&&globalThis.navigator.saveData===!0;if(r.lastLodLevel_Texture<0){if(s.texture_lod=f.max_count-1,B){const c=f.lods[f.max_count-1];B&&console.log(`First Texture LOD ${s.texture_lod} (${c.max_height}px) - ${e.name}`)}}else{const c=r.lastScreenspaceVolume.x+r.lastScreenspaceVolume.y+r.lastScreenspaceVolume.z;let D=r.lastScreenCoverage*4;((o=this.context)==null?void 0:o.engine)==="model-viewer"&&(D*=1.5);const _=E/window.devicePixelRatio*D;let P=!1;for(let O=f.lods.length-1;O>=0;O--){let I=f.lods[O];if(!(x&&I.max_height>=2048)&&!(Ze()&&I.max_height>4096)&&(I.max_height>_||!P&&O===0)){if(P=!0,s.texture_lod=O,s.texture_lod<r.lastLodLevel_Texture){const g=I.max_height;B&&console.log(`Texture LOD changed: ${r.lastLodLevel_Texture} \u2192 ${s.texture_lod} = ${g}px
|
|
6
6
|
Screensize: ${_.toFixed(0)}px, Coverage: ${(100*r.lastScreenCoverage).toFixed(2)}%, Volume ${c.toFixed(1)}
|
|
7
|
-
${e.name}`)}break}}}}else s.texture_lod=0}};let
|
|
8
|
-
`,t.getAttribute("src"));let e=null,r=null,n=null;for(let s=t;s!=null;s=Object.getPrototypeOf(s)){const o=Object.getOwnPropertySymbols(s),i=o.find(l=>l.toString()=="Symbol(renderer)"),a=o.find(l=>l.toString()=="Symbol(scene)"),u=o.find(l=>l.toString()=="Symbol(needsRender)");!e&&i!=null&&(e=t[i].threeRenderer),!r&&a!=null&&(r=t[a]),!n&&u!=null&&(n=t[u])}if(e&&r){let s=function(){if(n){let i=0,a=setInterval(()=>{if(i++>5){clearInterval(a);return}n?.call(t)},300)}};console.debug("[gltf-progressive] setup model-viewer");const o=
|
|
7
|
+
${e.name}`)}break}}}}else s.texture_lod=0}};let R=A;T=new WeakMap,$=new WeakMap,we=new WeakMap,Q=new WeakMap,oe=new WeakMap,ce=new WeakMap,U=new WeakMap,R.corner0=new j,R.corner1=new j,R.corner2=new j,R.corner3=new j,R._tempPtInside=new j;class it{constructor(){this.frames=0,this.lastLodLevel_Mesh=-1,this.lastLodLevel_Texture=-1,this.lastScreenCoverage=0,this.lastScreenspaceVolume=new j,this.lastCentrality=0}}const Ie=Symbol("NEEDLE_mesh_lod"),de=Symbol("NEEDLE_texture_lod");let he=null;function Be(){const t=lt();t&&(t.mapURLs(function(e){return Ce(),e}),Ce(),he?.disconnect(),he=new MutationObserver(e=>{e.forEach(r=>{r.addedNodes.forEach(n=>{n instanceof HTMLElement&&n.tagName.toLowerCase()==="model-viewer"&&Re(n)})})}),he.observe(document,{childList:!0,subtree:!0}))}function lt(){return typeof customElements>"u"?null:customElements.get("model-viewer")||(customElements.whenDefined("model-viewer").then(()=>{console.debug("[gltf-progressive] model-viewer defined"),Be()}),null)}function Ce(){typeof document>"u"||document.querySelectorAll("model-viewer").forEach(t=>{Re(t)})}const ke=new WeakSet;let at=0;function Re(t){if(!t||ke.has(t))return null;ke.add(t),console.debug("[gltf-progressive] found new model-viewer..."+ ++at+`
|
|
8
|
+
`,t.getAttribute("src"));let e=null,r=null,n=null;for(let s=t;s!=null;s=Object.getPrototypeOf(s)){const o=Object.getOwnPropertySymbols(s),i=o.find(l=>l.toString()=="Symbol(renderer)"),a=o.find(l=>l.toString()=="Symbol(scene)"),u=o.find(l=>l.toString()=="Symbol(needsRender)");!e&&i!=null&&(e=t[i].threeRenderer),!r&&a!=null&&(r=t[a]),!n&&u!=null&&(n=t[u])}if(e&&r){let s=function(){if(n){let i=0,a=setInterval(()=>{if(i++>5){clearInterval(a);return}n?.call(t)},300)}};console.debug("[gltf-progressive] setup model-viewer");const o=R.get(e,{engine:"model-viewer"});return R.addPlugin(new ut),o.enable(),o.addEventListener("changed",()=>{n?.call(t)}),t.addEventListener("model-visibility",i=>{i.detail.visible&&n?.call(t)}),t.addEventListener("load",()=>{s()}),()=>{o.disable()}}return null}class ut{constructor(){this._didWarnAboutMissingUrl=!1}onBeforeUpdateLOD(e,r,n,s){this.tryParseMeshLOD(r,s),this.tryParseTextureLOD(r,s)}getUrl(e){if(!e)return null;let r=e.getAttribute("src");return r||(r=e.src),r||(this._didWarnAboutMissingUrl||console.warn("No url found in modelviewer",e),this._didWarnAboutMissingUrl=!0),r}tryGetCurrentGLTF(e){return e._currentGLTF}tryGetCurrentModelViewer(e){return e.element}tryParseTextureLOD(e,r){if(r[de]==!0)return;r[de]=!0;const n=this.tryGetCurrentGLTF(e),s=this.tryGetCurrentModelViewer(e),o=this.getUrl(s);if(o&&n&&r.material){let i=function(u){var l,h,f;if(u[de]==!0)return;u[de]=!0,u.userData&&(u.userData.LOD=-1);const p=Object.keys(u);for(let E=0;E<p.length;E++){const M=p[E],x=u[M];if(x?.isTexture===!0){const c=(h=(l=x.userData)==null?void 0:l.associations)==null?void 0:h.textures;if(c==null)continue;const D=n.parser.json.textures[c];if(!D){console.warn("Texture data not found for texture index "+c);continue}if((f=D?.extensions)!=null&&f[G]){const _=D.extensions[G];_&&o&&S.registerTexture(o,x,_.lods.length,c,_)}}}};const a=r.material;if(Array.isArray(a))for(const u of a)i(u);else i(a)}}tryParseMeshLOD(e,r){var n,s;if(r[Ie]==!0)return;r[Ie]=!0;const o=this.tryGetCurrentModelViewer(e),i=this.getUrl(o);if(!i)return;const a=(s=(n=r.userData)==null?void 0:n.gltfExtensions)==null?void 0:s[G];if(a&&i){const u=r.uuid;S.registerMesh(i,u,r,0,a.lods.length,a)}}}function ct(t,e,r,n){me(e),pe(r),xe(r,{progressive:!0,...n?.hints}),r.register(o=>new S(o,t));const s=R.get(e);return n?.enableLODsManager!==!1&&s.enable(),s}if(Be(),!et){const t={gltfProgressive:{useNeedleProgressive:ct,LODsManager:R,configureLoader:xe,getRaycastMesh:J,useRaycastMeshes:rt}};if(!globalThis.Needle)globalThis.Needle=t;else for(const e in t)globalThis.Needle[e]=t[e]}export{R as L,S as N,pe as a,xe as b,me as c,Ye as d,J as g,Ke as s};
|