@luma.gl/gltf 9.3.0-alpha.2 → 9.3.0-alpha.4

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/dist/dist.dev.js CHANGED
@@ -774,6 +774,8 @@ var __exports__ = (() => {
774
774
  parsedMaterial.defines["HAS_TANGENTS"] = true;
775
775
  if (attributes["TEXCOORD_0"])
776
776
  parsedMaterial.defines["HAS_UV"] = true;
777
+ if (attributes["COLOR_0"])
778
+ parsedMaterial.defines["HAS_COLORS"] = true;
777
779
  if (options?.imageBasedLightingEnvironment)
778
780
  parsedMaterial.defines["USE_IBL"] = true;
779
781
  if (options?.lights)
@@ -882,6 +884,10 @@ var __exports__ = (() => {
882
884
  // default REPEAT S (U) wrapping mode.
883
885
  wrapT: 10497,
884
886
  // default REPEAT T (V) wrapping mode.
887
+ minFilter: 9729,
888
+ // default LINEAR filtering
889
+ magFilter: 9729,
890
+ // default LINEAR filtering
885
891
  ...gltfTexture?.texture?.sampler
886
892
  };
887
893
  const texture = device.createTexture({
package/dist/dist.min.js CHANGED
@@ -4,7 +4,7 @@
4
4
  else if (typeof define === 'function' && define.amd) define([], factory);
5
5
  else if (typeof exports === 'object') exports['luma'] = factory();
6
6
  else root['luma'] = factory();})(globalThis, function () {
7
- "use strict";var __exports__=(()=>{var be=Object.create;var st=Object.defineProperty;var ze=Object.getOwnPropertyDescriptor;var Fe=Object.getOwnPropertyNames;var qe=Object.getPrototypeOf,Be=Object.prototype.hasOwnProperty;var it=(n,t)=>()=>(t||n((t={exports:{}}).exports,t),t.exports),Ce=(n,t)=>{for(var e in t)st(n,e,{get:t[e],enumerable:!0})},rt=(n,t,e,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of Fe(t))!Be.call(n,s)&&s!==e&&st(n,s,{get:()=>t[s],enumerable:!(r=ze(t,s))||r.enumerable});return n},ot=(n,t,e)=>(rt(n,t,"default"),e&&rt(e,t,"default")),b=(n,t,e)=>(e=n!=null?be(qe(n)):{},rt(t||!n||!n.__esModule?st(e,"default",{value:n,enumerable:!0}):e,n)),Ve=n=>rt(st({},"__esModule",{value:!0}),n);var D=it((fs,Qt)=>{Qt.exports=globalThis.luma});var ct=it((hs,Kt)=>{Kt.exports=globalThis.luma});var zt=it((pi,Mn)=>{Mn.exports=globalThis.luma});var Ee=it((Lo,Ae)=>{Ae.exports=globalThis.luma});var et={};Ce(et,{GLTFAnimator:()=>H,createScenegraphsFromGLTF:()=>ke,loadPBREnvironment:()=>xn,parseGLTFLights:()=>wt,parsePBRMaterial:()=>xt});ot(et,b(D(),1));var bt=b(ct(),1);function V(n,t){if(!n)throw new Error(t||"loader assertion failed.")}var F={self:typeof self<"u"&&self,window:typeof window<"u"&&window,global:typeof global<"u"&&global,document:typeof document<"u"&&document},Ue=F.self||F.window||F.global||{},De=F.window||F.self||F.global||{},Ye=F.global||F.self||F.window||{},$e=F.document||{};var Ot=Boolean(typeof process!="object"||String(process)!=="[object process]"||process.browser);var Zt=typeof process<"u"&&process.version&&/v([0-9]*)/.exec(process.version),Ge=Zt&&parseFloat(Zt[1])||0;var We="",Jt={};function Rt(n){for(let t in Jt)if(n.startsWith(t)){let e=Jt[t];n=n.replace(t,e)}return!n.startsWith("http://")&&!n.startsWith("https://")&&(n=`${We}${n}`),n}var tn="4.3.2";var He=globalThis.loaders?.parseImageNode,Nt=typeof Image<"u",ut=typeof ImageBitmap<"u",Xe=Boolean(He),_t=Ot?!0:Xe;function nn(n){switch(n){case"auto":return ut||Nt||_t;case"imagebitmap":return ut;case"image":return Nt;case"data":return _t;default:throw new Error(`@loaders.gl/images: image ${n} not supported in this environment`)}}function en(){if(ut)return"imagebitmap";if(Nt)return"image";if(_t)return"data";throw new Error("Install '@loaders.gl/polyfills' to parse images under Node.js")}function rn(n){let t=je(n);if(!t)throw new Error("Not an image");return t}function Pt(n){return at(n)}function at(n){switch(rn(n)){case"data":return n;case"image":case"imagebitmap":let t=document.createElement("canvas"),e=t.getContext("2d");if(!e)throw new Error("getImageData");return t.width=n.width,t.height=n.height,e.drawImage(n,0,0),e.getImageData(0,0,n.width,n.height);default:throw new Error("getImageData")}}function je(n){return typeof ImageBitmap<"u"&&n instanceof ImageBitmap?"imagebitmap":typeof Image<"u"&&n instanceof Image?"image":n&&typeof n=="object"&&n.data&&n.width&&n.height?"data":null}var Qe=/^data:image\/svg\+xml/,Ke=/\.svg((\?|#).*)?$/;function ft(n){return n&&(Qe.test(n)||Ke.test(n))}function sn(n,t){if(ft(t)){let r=new TextDecoder().decode(n);try{typeof unescape=="function"&&typeof encodeURIComponent=="function"&&(r=unescape(encodeURIComponent(r)))}catch(i){throw new Error(i.message)}return`data:image/svg+xml;base64,${btoa(r)}`}return It(n,t)}function It(n,t){if(ft(t))throw new Error("SVG cannot be parsed directly to imagebitmap");return new Blob([new Uint8Array(n)])}async function ht(n,t,e){let r=sn(n,e),s=self.URL||self.webkitURL,i=typeof r!="string"&&s.createObjectURL(r);try{return await Ze(i||r,t)}finally{i&&s.revokeObjectURL(i)}}async function Ze(n,t){let e=new Image;return e.src=n,t.image&&t.image.decode&&e.decode?(await e.decode(),e):await new Promise((r,s)=>{try{e.onload=()=>r(e),e.onerror=i=>{let o=i instanceof Error?i.message:"error";s(new Error(o))}}catch(i){s(i)}})}var Je={},on=!0;async function cn(n,t,e){let r;ft(e)?r=await ht(n,t,e):r=It(n,e);let s=t&&t.imagebitmap;return await tr(r,s)}async function tr(n,t=null){if((nr(t)||!on)&&(t=null),t)try{return await createImageBitmap(n,t)}catch(e){console.warn(e),on=!1}return await createImageBitmap(n)}function nr(n){for(let t in n||Je)return!1;return!0}function an(n){return!ir(n,"ftyp",4)||!(n[8]&96)?null:er(n)}function er(n){switch(rr(n,8,12).replace("\0"," ").trim()){case"avif":case"avis":return{extension:"avif",mimeType:"image/avif"};default:return null}}function rr(n,t,e){return String.fromCharCode(...n.slice(t,e))}function sr(n){return[...n].map(t=>t.charCodeAt(0))}function ir(n,t,e=0){let r=sr(t);for(let s=0;s<r.length;++s)if(r[s]!==n[s+e])return!1;return!0}var q=!1,j=!0;function lt(n){let t=Q(n);return cr(t)||hr(t)||ar(t)||fr(t)||or(t)}function or(n){let t=new Uint8Array(n instanceof DataView?n.buffer:n),e=an(t);return e?{mimeType:e.mimeType,width:0,height:0}:null}function cr(n){let t=Q(n);return t.byteLength>=24&&t.getUint32(0,q)===2303741511?{mimeType:"image/png",width:t.getUint32(16,q),height:t.getUint32(20,q)}:null}function ar(n){let t=Q(n);return t.byteLength>=10&&t.getUint32(0,q)===1195984440?{mimeType:"image/gif",width:t.getUint16(6,j),height:t.getUint16(8,j)}:null}function fr(n){let t=Q(n);return t.byteLength>=14&&t.getUint16(0,q)===16973&&t.getUint32(2,j)===t.byteLength?{mimeType:"image/bmp",width:t.getUint32(18,j),height:t.getUint32(22,j)}:null}function hr(n){let t=Q(n);if(!(t.byteLength>=3&&t.getUint16(0,q)===65496&&t.getUint8(2)===255))return null;let{tableMarkers:r,sofMarkers:s}=lr(),i=2;for(;i+9<t.byteLength;){let o=t.getUint16(i,q);if(s.has(o))return{mimeType:"image/jpeg",height:t.getUint16(i+5,q),width:t.getUint16(i+7,q)};if(!r.has(o))return null;i+=2,i+=t.getUint16(i,q)}return null}function lr(){let n=new Set([65499,65476,65484,65501,65534]);for(let e=65504;e<65520;++e)n.add(e);return{tableMarkers:n,sofMarkers:new Set([65472,65473,65474,65475,65477,65478,65479,65481,65482,65483,65485,65486,65487,65502])}}function Q(n){if(n instanceof DataView)return n;if(ArrayBuffer.isView(n))return new DataView(n.buffer);if(n instanceof ArrayBuffer)return new DataView(n);throw new Error("toDataView")}async function fn(n,t){let{mimeType:e}=lt(n)||{},r=globalThis.loaders?.parseImageNode;return V(r),await r(n,e)}async function hn(n,t,e){t=t||{};let s=(t.image||{}).type||"auto",{url:i}=e||{},o=pr(s),c;switch(o){case"imagebitmap":c=await cn(n,t,i);break;case"image":c=await ht(n,t,i);break;case"data":c=await fn(n,t);break;default:V(!1)}return s==="data"&&(c=at(c)),c}function pr(n){switch(n){case"auto":case"data":return en();default:return nn(n),n}}var mr=["png","jpg","jpeg","gif","webp","bmp","ico","svg","avif"],xr=["image/png","image/jpeg","image/gif","image/webp","image/avif","image/bmp","image/vnd.microsoft.icon","image/svg+xml"],Mr={image:{type:"auto",decode:!0}},pt={dataType:null,batchType:null,id:"image",module:"images",name:"Images",version:tn,mimeTypes:xr,extensions:mr,parse:hn,tests:[n=>Boolean(lt(new DataView(n)))],options:Mr};function mt(n,t,e){let r=typeof n=="function"?n({...t,...e}):n,s=t.baseUrl;return s&&(r=s[s.length-1]==="/"?`${s}${r}`:`${s}/${r}`),Rt(r)}var dr=n=>n&&typeof n=="object";async function ln(n,t,e={}){return await vt(n,t,e)}async function vt(n,t,e){return Array.isArray(n)?await yr(n,t,e):dr(n)?await gr(n,t,e):await t(n,e)}async function gr(n,t,e){let r=[],s={};for(let i in n){let o=n[i],c=vt(o,t,e).then(a=>{s[i]=a});r.push(c)}return await Promise.all(r),s}async function yr(n,t,e={}){let r=n.map(s=>vt(s,t,e));return await Promise.all(r)}async function pn(n,t,e){return await ln(n,r=>kt(r,t,e))}async function kt(n,t,e){let s=await(await fetch(n,e.fetch)).arrayBuffer();return await t(s,e)}async function K(n,t={}){let e=await Tr(n,t);return await pn(e,pt.parse,t)}async function Tr(n,t,e={}){let r=t&&t.image&&t.image.mipLevels||0;return r!==0?await Ar(n,r,t,e):mt(n,t,e)}async function Ar(n,t,e,r){let s=[];if(t==="auto"){let i=mt(n,e,{...r,lod:0}),o=await kt(i,pt.parse,e),{width:c,height:a}=Pt(o);t=Er({width:c,height:a}),s.push(i)}V(t>0);for(let i=s.length;i<t;++i){let o=mt(n,e,{...r,lod:i});s.push(o)}return s}function Er(n){return 1+Math.floor(Math.log2(Math.max(n.width,n.height)))}function xn(n,t){let e=new bt.DynamicTexture(n,{id:"brdfLUT",sampler:{addressModeU:"clamp-to-edge",addressModeV:"clamp-to-edge",minFilter:"linear",magFilter:"linear"},data:K(t.brdfLutUrl)}),r=mn(n,{id:"DiffuseEnvSampler",getTextureForFace:i=>K(t.getTexUrl("diffuse",i,0)),sampler:{addressModeU:"clamp-to-edge",addressModeV:"clamp-to-edge",minFilter:"linear",magFilter:"linear"}}),s=mn(n,{id:"SpecularEnvSampler",getTextureForFace:i=>{let o=[];for(let c=0;c<=t.specularMipLevels-1;c++)o.push(K(t.getTexUrl("specular",i,c)));return o},sampler:{addressModeU:"clamp-to-edge",addressModeV:"clamp-to-edge",minFilter:"linear",magFilter:"linear"}});return{brdfLutTexture:e,diffuseEnvSampler:r,specularEnvSampler:s}}var wr=[0,1,2,3,4,5];function mn(n,{id:t,getTextureForFace:e,sampler:r}){let s={};return wr.forEach(i=>{s[String(i)]=e(i)}),new bt.DynamicTexture(n,{id:t,dimension:"cube",mipmaps:!1,sampler:r,data:s})}var di=b(zt(),1),yn=b(D(),1);var mi=b(zt(),1);function gn(n){return{addressModeU:dn(n.wrapS),addressModeV:dn(n.wrapT),magFilter:Sr(n.magFilter),...Lr(n.minFilter)}}function dn(n){switch(n){case 33071:return"clamp-to-edge";case 10497:return"repeat";case 33648:return"mirror-repeat";default:return}}function Sr(n){switch(n){case 9728:return"nearest";case 9729:return"linear";default:return}}function Lr(n){switch(n){case 9728:return{minFilter:"nearest"};case 9729:return{minFilter:"linear"};case 9984:return{minFilter:"nearest",mipmapFilter:"nearest"};case 9985:return{minFilter:"linear",mipmapFilter:"nearest"};case 9986:return{minFilter:"nearest",mipmapFilter:"linear"};case 9987:return{minFilter:"linear",mipmapFilter:"linear"};default:return{}}}function xt(n,t,e,r){let s={defines:{MANUAL_SRGB:!0,SRGB_FAST_APPROXIMATION:!0},bindings:{},uniforms:{camera:[0,0,0],metallicRoughnessValues:[1,1]},parameters:{},glParameters:{},generatedTextures:[]};s.defines.USE_TEX_LOD=!0;let{imageBasedLightingEnvironment:i}=r;return i&&(s.bindings.pbr_diffuseEnvSampler=i.diffuseEnvSampler.texture,s.bindings.pbr_specularEnvSampler=i.specularEnvSampler.texture,s.bindings.pbr_BrdfLUT=i.brdfLutTexture.texture,s.uniforms.scaleIBLAmbient=[1,1]),r?.pbrDebug&&(s.defines.PBR_DEBUG=!0,s.uniforms.scaleDiffBaseMR=[0,0,0,0],s.uniforms.scaleFGDSpec=[0,0,0,0]),e.NORMAL&&(s.defines.HAS_NORMALS=!0),e.TANGENT&&r?.useTangents&&(s.defines.HAS_TANGENTS=!0),e.TEXCOORD_0&&(s.defines.HAS_UV=!0),r?.imageBasedLightingEnvironment&&(s.defines.USE_IBL=!0),r?.lights&&(s.defines.USE_LIGHTS=!0),t&&Or(n,t,s),s}function Or(n,t,e){if(e.uniforms.unlit=Boolean(t.unlit),t.pbrMetallicRoughness&&Rr(n,t.pbrMetallicRoughness,e),t.normalTexture){Z(n,t.normalTexture,"pbr_normalSampler","HAS_NORMALMAP",e);let{scale:r=1}=t.normalTexture;e.uniforms.normalScale=r}if(t.occlusionTexture){Z(n,t.occlusionTexture,"pbr_occlusionSampler","HAS_OCCLUSIONMAP",e);let{strength:r=1}=t.occlusionTexture;e.uniforms.occlusionStrength=r}switch(t.emissiveTexture&&(Z(n,t.emissiveTexture,"pbr_emissiveSampler","HAS_EMISSIVEMAP",e),e.uniforms.emissiveFactor=t.emissiveFactor||[0,0,0]),t.alphaMode||"MASK"){case"MASK":let{alphaCutoff:r=.5}=t;e.defines.ALPHA_CUTOFF=!0,e.uniforms.alphaCutoff=r;break;case"BLEND":yn.log.warn("glTF BLEND alphaMode might not work well because it requires mesh sorting")(),e.parameters.blend=!0,e.parameters.blendColorOperation="add",e.parameters.blendColorSrcFactor="src-alpha",e.parameters.blendColorDstFactor="one-minus-src-alpha",e.parameters.blendAlphaOperation="add",e.parameters.blendAlphaSrcFactor="one",e.parameters.blendAlphaDstFactor="one-minus-src-alpha",e.glParameters.blend=!0,e.glParameters.blendEquation=32774,e.glParameters.blendFunc=[770,771,1,771];break}}function Rr(n,t,e){t.baseColorTexture&&Z(n,t.baseColorTexture,"pbr_baseColorSampler","HAS_BASECOLORMAP",e),e.uniforms.baseColorFactor=t.baseColorFactor||[1,1,1,1],t.metallicRoughnessTexture&&Z(n,t.metallicRoughnessTexture,"pbr_metallicRoughnessSampler","HAS_METALROUGHNESSMAP",e);let{metallicFactor:r=1,roughnessFactor:s=1}=t;e.uniforms.metallicRoughnessValues=[r,s]}function Z(n,t,e,r,s){let i=t.texture.source.image,o;i.compressed?o=i:o={data:i};let c={wrapS:10497,wrapT:10497,...t?.texture?.sampler},a=n.createTexture({id:t.uniformName||t.id,sampler:gn(c),...o});s.bindings[e]=a,r&&(s.defines[r]=!0),s.generatedTextures.push(a)}var Ai=1/Math.PI*180,Ei=1/180*Math.PI,Nr={EPSILON:1e-12,debug:!1,precision:4,printTypes:!1,printDegrees:!1,printRowMajor:!0,_cartographicRadians:!1};globalThis.mathgl=globalThis.mathgl||{config:{...Nr}};var O=globalThis.mathgl.config;function Tn(n,{precision:t=O.precision}={}){return n=ur(n),`${parseFloat(n.toPrecision(t))}`}function Y(n){return Array.isArray(n)||ArrayBuffer.isView(n)&&!(n instanceof DataView)}function Ft(n,t,e){let r=O.EPSILON;e&&(O.EPSILON=e);try{if(n===t)return!0;if(Y(n)&&Y(t)){if(n.length!==t.length)return!1;for(let s=0;s<n.length;++s)if(!Ft(n[s],t[s]))return!1;return!0}return n&&n.equals?n.equals(t):t&&t.equals?t.equals(n):typeof n=="number"&&typeof t=="number"?Math.abs(n-t)<=O.EPSILON*Math.max(1,Math.abs(n),Math.abs(t)):!1}finally{O.EPSILON=r}}function ur(n){return Math.round(n/O.EPSILON)*O.EPSILON}var C=class extends Array{clone(){return new this.constructor().copy(this)}fromArray(t,e=0){for(let r=0;r<this.ELEMENTS;++r)this[r]=t[r+e];return this.check()}toArray(t=[],e=0){for(let r=0;r<this.ELEMENTS;++r)t[e+r]=this[r];return t}toObject(t){return t}from(t){return Array.isArray(t)?this.copy(t):this.fromObject(t)}to(t){return t===this?this:Y(t)?this.toArray(t):this.toObject(t)}toTarget(t){return t?this.to(t):this}toFloat32Array(){return new Float32Array(this)}toString(){return this.formatString(O)}formatString(t){let e="";for(let r=0;r<this.ELEMENTS;++r)e+=(r>0?", ":"")+Tn(this[r],t);return`${t.printTypes?this.constructor.name:""}[${e}]`}equals(t){if(!t||this.length!==t.length)return!1;for(let e=0;e<this.ELEMENTS;++e)if(!Ft(this[e],t[e]))return!1;return!0}exactEquals(t){if(!t||this.length!==t.length)return!1;for(let e=0;e<this.ELEMENTS;++e)if(this[e]!==t[e])return!1;return!0}negate(){for(let t=0;t<this.ELEMENTS;++t)this[t]=-this[t];return this.check()}lerp(t,e,r){if(r===void 0)return this.lerp(this,t,e);for(let s=0;s<this.ELEMENTS;++s){let i=t[s],o=typeof e=="number"?e:e[s];this[s]=i+r*(o-i)}return this.check()}min(t){for(let e=0;e<this.ELEMENTS;++e)this[e]=Math.min(t[e],this[e]);return this.check()}max(t){for(let e=0;e<this.ELEMENTS;++e)this[e]=Math.max(t[e],this[e]);return this.check()}clamp(t,e){for(let r=0;r<this.ELEMENTS;++r)this[r]=Math.min(Math.max(this[r],t[r]),e[r]);return this.check()}add(...t){for(let e of t)for(let r=0;r<this.ELEMENTS;++r)this[r]+=e[r];return this.check()}subtract(...t){for(let e of t)for(let r=0;r<this.ELEMENTS;++r)this[r]-=e[r];return this.check()}scale(t){if(typeof t=="number")for(let e=0;e<this.ELEMENTS;++e)this[e]*=t;else for(let e=0;e<this.ELEMENTS&&e<t.length;++e)this[e]*=t[e];return this.check()}multiplyByScalar(t){for(let e=0;e<this.ELEMENTS;++e)this[e]*=t;return this.check()}check(){if(O.debug&&!this.validate())throw new Error(`math.gl: ${this.constructor.name} some fields set to invalid numbers'`);return this}validate(){let t=this.length===this.ELEMENTS;for(let e=0;e<this.ELEMENTS;++e)t=t&&Number.isFinite(this[e]);return t}sub(t){return this.subtract(t)}setScalar(t){for(let e=0;e<this.ELEMENTS;++e)this[e]=t;return this.check()}addScalar(t){for(let e=0;e<this.ELEMENTS;++e)this[e]+=t;return this.check()}subScalar(t){return this.addScalar(-t)}multiplyScalar(t){for(let e=0;e<this.ELEMENTS;++e)this[e]*=t;return this.check()}divideScalar(t){return this.multiplyByScalar(1/t)}clampScalar(t,e){for(let r=0;r<this.ELEMENTS;++r)this[r]=Math.min(Math.max(this[r],t),e);return this.check()}get elements(){return this}};function _r(n,t){if(n.length!==t)return!1;for(let e=0;e<n.length;++e)if(!Number.isFinite(n[e]))return!1;return!0}function S(n){if(!Number.isFinite(n))throw new Error(`Invalid number ${JSON.stringify(n)}`);return n}function $(n,t,e=""){if(O.debug&&!_r(n,t))throw new Error(`math.gl: ${e} some fields set to invalid numbers'`);return n}function qt(n,t){if(!n)throw new Error(`math.gl assertion ${t}`)}var Mt=class extends C{get x(){return this[0]}set x(t){this[0]=S(t)}get y(){return this[1]}set y(t){this[1]=S(t)}len(){return Math.sqrt(this.lengthSquared())}magnitude(){return this.len()}lengthSquared(){let t=0;for(let e=0;e<this.ELEMENTS;++e)t+=this[e]*this[e];return t}magnitudeSquared(){return this.lengthSquared()}distance(t){return Math.sqrt(this.distanceSquared(t))}distanceSquared(t){let e=0;for(let r=0;r<this.ELEMENTS;++r){let s=this[r]-t[r];e+=s*s}return S(e)}dot(t){let e=0;for(let r=0;r<this.ELEMENTS;++r)e+=this[r]*t[r];return S(e)}normalize(){let t=this.magnitude();if(t!==0)for(let e=0;e<this.ELEMENTS;++e)this[e]/=t;return this.check()}multiply(...t){for(let e of t)for(let r=0;r<this.ELEMENTS;++r)this[r]*=e[r];return this.check()}divide(...t){for(let e of t)for(let r=0;r<this.ELEMENTS;++r)this[r]/=e[r];return this.check()}lengthSq(){return this.lengthSquared()}distanceTo(t){return this.distance(t)}distanceToSquared(t){return this.distanceSquared(t)}getComponent(t){return qt(t>=0&&t<this.ELEMENTS,"index is out of range"),S(this[t])}setComponent(t,e){return qt(t>=0&&t<this.ELEMENTS,"index is out of range"),this[t]=e,this.check()}addVectors(t,e){return this.copy(t).add(e)}subVectors(t,e){return this.copy(t).subtract(e)}multiplyVectors(t,e){return this.copy(t).multiply(e)}addScaledVector(t,e){return this.add(new this.constructor(t).multiplyScalar(e))}};var R=typeof Float32Array<"u"?Float32Array:Array;var vi=Math.PI/180;function Pr(){let n=new R(2);return R!=Float32Array&&(n[0]=0,n[1]=0),n}function wn(n,t,e){let r=t[0],s=t[1];return n[0]=e[0]*r+e[4]*s+e[12],n[1]=e[1]*r+e[5]*s+e[13],n}var ki=function(){let n=Pr();return function(t,e,r,s,i,o){let c,a;for(e||(e=2),r||(r=0),s?a=Math.min(s*e+r,t.length):a=t.length,c=r;c<a;c+=e)n[0]=t[c],n[1]=t[c+1],i(n,n,o),t[c]=n[0],t[c+1]=n[1];return t}}();function Sn(n,t,e){let r=t[0],s=t[1],i=e[3]*r+e[7]*s||1;return n[0]=(e[0]*r+e[4]*s)/i,n[1]=(e[1]*r+e[5]*s)/i,n}function Ln(n,t,e){let r=t[0],s=t[1],i=t[2],o=e[3]*r+e[7]*s+e[11]*i||1;return n[0]=(e[0]*r+e[4]*s+e[8]*i)/o,n[1]=(e[1]*r+e[5]*s+e[9]*i)/o,n[2]=(e[2]*r+e[6]*s+e[10]*i)/o,n}function On(n,t,e){let r=t[0],s=t[1];return n[0]=e[0]*r+e[2]*s,n[1]=e[1]*r+e[3]*s,n[2]=t[2],n[3]=t[3],n}function Rn(n,t,e){let r=t[0],s=t[1],i=t[2];return n[0]=e[0]*r+e[3]*s+e[6]*i,n[1]=e[1]*r+e[4]*s+e[7]*i,n[2]=e[2]*r+e[5]*s+e[8]*i,n[3]=t[3],n}function Bt(){let n=new R(3);return R!=Float32Array&&(n[0]=0,n[1]=0,n[2]=0),n}function Ir(n){let t=n[0],e=n[1],r=n[2];return Math.sqrt(t*t+e*e+r*r)}function Ct(n,t,e){let r=new R(3);return r[0]=n,r[1]=t,r[2]=e,r}function Nn(n,t){let e=t[0],r=t[1],s=t[2],i=e*e+r*r+s*s;return i>0&&(i=1/Math.sqrt(i)),n[0]=t[0]*i,n[1]=t[1]*i,n[2]=t[2]*i,n}function un(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]}function dt(n,t,e){let r=t[0],s=t[1],i=t[2],o=e[0],c=e[1],a=e[2];return n[0]=s*a-i*c,n[1]=i*o-r*a,n[2]=r*c-s*o,n}function gt(n,t,e){let r=t[0],s=t[1],i=t[2],o=e[3]*r+e[7]*s+e[11]*i+e[15];return o=o||1,n[0]=(e[0]*r+e[4]*s+e[8]*i+e[12])/o,n[1]=(e[1]*r+e[5]*s+e[9]*i+e[13])/o,n[2]=(e[2]*r+e[6]*s+e[10]*i+e[14])/o,n}function _n(n,t,e){let r=e[0],s=e[1],i=e[2],o=e[3],c=t[0],a=t[1],f=t[2],h=s*f-i*a,l=i*c-r*f,p=r*a-s*c,m=s*p-i*l,x=i*h-r*p,M=r*l-s*h,d=o*2;return h*=d,l*=d,p*=d,m*=2,x*=2,M*=2,n[0]=c+h+m,n[1]=a+l+x,n[2]=f+p+M,n}var Pn=Ir;var Fi=function(){let n=Bt();return function(t,e,r,s,i,o){let c,a;for(e||(e=3),r||(r=0),s?a=Math.min(s*e+r,t.length):a=t.length,c=r;c<a;c+=e)n[0]=t[c],n[1]=t[c+1],n[2]=t[c+2],i(n,n,o),t[c]=n[0],t[c+1]=n[1],t[c+2]=n[2];return t}}();var yt,G=class extends Mt{static get ZERO(){return yt||(yt=new G(0,0,0,0),Object.freeze(yt)),yt}constructor(t=0,e=0,r=0,s=0){super(-0,-0,-0,-0),Y(t)&&arguments.length===1?this.copy(t):(O.debug&&(S(t),S(e),S(r),S(s)),this[0]=t,this[1]=e,this[2]=r,this[3]=s)}set(t,e,r,s){return this[0]=t,this[1]=e,this[2]=r,this[3]=s,this.check()}copy(t){return this[0]=t[0],this[1]=t[1],this[2]=t[2],this[3]=t[3],this.check()}fromObject(t){return O.debug&&(S(t.x),S(t.y),S(t.z),S(t.w)),this[0]=t.x,this[1]=t.y,this[2]=t.z,this[3]=t.w,this}toObject(t){return t.x=this[0],t.y=this[1],t.z=this[2],t.w=this[3],t}get ELEMENTS(){return 4}get z(){return this[2]}set z(t){this[2]=S(t)}get w(){return this[3]}set w(t){this[3]=S(t)}transform(t){return gt(this,this,t),this.check()}transformByMatrix3(t){return Rn(this,this,t),this.check()}transformByMatrix2(t){return On(this,this,t),this.check()}transformByQuaternion(t){return _n(this,this,t),this.check()}applyMatrix4(t){return t.transform(this,this),this}};var Tt=class extends C{toString(){let t="[";if(O.printRowMajor){t+="row-major:";for(let e=0;e<this.RANK;++e)for(let r=0;r<this.RANK;++r)t+=` ${this[r*this.RANK+e]}`}else{t+="column-major:";for(let e=0;e<this.ELEMENTS;++e)t+=` ${this[e]}`}return t+="]",t}getElementIndex(t,e){return e*this.RANK+t}getElement(t,e){return this[e*this.RANK+t]}setElement(t,e,r){return this[e*this.RANK+t]=S(r),this}getColumn(t,e=new Array(this.RANK).fill(-0)){let r=t*this.RANK;for(let s=0;s<this.RANK;++s)e[s]=this[r+s];return e}setColumn(t,e){let r=t*this.RANK;for(let s=0;s<this.RANK;++s)this[r+s]=e[s];return this}};function In(){let n=new R(9);return R!=Float32Array&&(n[1]=0,n[2]=0,n[3]=0,n[5]=0,n[6]=0,n[7]=0),n[0]=1,n[4]=1,n[8]=1,n}function br(n){return n[0]=1,n[1]=0,n[2]=0,n[3]=0,n[4]=0,n[5]=1,n[6]=0,n[7]=0,n[8]=0,n[9]=0,n[10]=1,n[11]=0,n[12]=0,n[13]=0,n[14]=0,n[15]=1,n}function vn(n,t){if(n===t){let e=t[1],r=t[2],s=t[3],i=t[6],o=t[7],c=t[11];n[1]=t[4],n[2]=t[8],n[3]=t[12],n[4]=e,n[6]=t[9],n[7]=t[13],n[8]=r,n[9]=i,n[11]=t[14],n[12]=s,n[13]=o,n[14]=c}else n[0]=t[0],n[1]=t[4],n[2]=t[8],n[3]=t[12],n[4]=t[1],n[5]=t[5],n[6]=t[9],n[7]=t[13],n[8]=t[2],n[9]=t[6],n[10]=t[10],n[11]=t[14],n[12]=t[3],n[13]=t[7],n[14]=t[11],n[15]=t[15];return n}function kn(n,t){let e=t[0],r=t[1],s=t[2],i=t[3],o=t[4],c=t[5],a=t[6],f=t[7],h=t[8],l=t[9],p=t[10],m=t[11],x=t[12],M=t[13],d=t[14],E=t[15],L=e*c-r*o,g=e*a-s*o,y=e*f-i*o,T=r*a-s*c,A=r*f-i*c,N=s*f-i*a,u=h*M-l*x,_=h*d-p*x,P=h*E-m*x,I=l*d-p*M,v=l*E-m*M,k=p*E-m*d,w=L*k-g*v+y*I+T*P-A*_+N*u;return w?(w=1/w,n[0]=(c*k-a*v+f*I)*w,n[1]=(s*v-r*k-i*I)*w,n[2]=(M*N-d*A+E*T)*w,n[3]=(p*A-l*N-m*T)*w,n[4]=(a*P-o*k-f*_)*w,n[5]=(e*k-s*P+i*_)*w,n[6]=(d*y-x*N-E*g)*w,n[7]=(h*N-p*y+m*g)*w,n[8]=(o*v-c*P+f*u)*w,n[9]=(r*P-e*v-i*u)*w,n[10]=(x*A-M*y+E*L)*w,n[11]=(l*y-h*A-m*L)*w,n[12]=(c*_-o*I-a*u)*w,n[13]=(e*I-r*_+s*u)*w,n[14]=(M*g-x*T-d*L)*w,n[15]=(h*T-l*g+p*L)*w,n):null}function bn(n){let t=n[0],e=n[1],r=n[2],s=n[3],i=n[4],o=n[5],c=n[6],a=n[7],f=n[8],h=n[9],l=n[10],p=n[11],m=n[12],x=n[13],M=n[14],d=n[15],E=t*o-e*i,L=t*c-r*i,g=e*c-r*o,y=f*x-h*m,T=f*M-l*m,A=h*M-l*x,N=t*A-e*T+r*y,u=i*A-o*T+c*y,_=f*g-h*L+l*E,P=m*g-x*L+M*E;return a*N-s*u+d*_-p*P}function Vt(n,t,e){let r=t[0],s=t[1],i=t[2],o=t[3],c=t[4],a=t[5],f=t[6],h=t[7],l=t[8],p=t[9],m=t[10],x=t[11],M=t[12],d=t[13],E=t[14],L=t[15],g=e[0],y=e[1],T=e[2],A=e[3];return n[0]=g*r+y*c+T*l+A*M,n[1]=g*s+y*a+T*p+A*d,n[2]=g*i+y*f+T*m+A*E,n[3]=g*o+y*h+T*x+A*L,g=e[4],y=e[5],T=e[6],A=e[7],n[4]=g*r+y*c+T*l+A*M,n[5]=g*s+y*a+T*p+A*d,n[6]=g*i+y*f+T*m+A*E,n[7]=g*o+y*h+T*x+A*L,g=e[8],y=e[9],T=e[10],A=e[11],n[8]=g*r+y*c+T*l+A*M,n[9]=g*s+y*a+T*p+A*d,n[10]=g*i+y*f+T*m+A*E,n[11]=g*o+y*h+T*x+A*L,g=e[12],y=e[13],T=e[14],A=e[15],n[12]=g*r+y*c+T*l+A*M,n[13]=g*s+y*a+T*p+A*d,n[14]=g*i+y*f+T*m+A*E,n[15]=g*o+y*h+T*x+A*L,n}function zn(n,t,e){let r=e[0],s=e[1],i=e[2],o,c,a,f,h,l,p,m,x,M,d,E;return t===n?(n[12]=t[0]*r+t[4]*s+t[8]*i+t[12],n[13]=t[1]*r+t[5]*s+t[9]*i+t[13],n[14]=t[2]*r+t[6]*s+t[10]*i+t[14],n[15]=t[3]*r+t[7]*s+t[11]*i+t[15]):(o=t[0],c=t[1],a=t[2],f=t[3],h=t[4],l=t[5],p=t[6],m=t[7],x=t[8],M=t[9],d=t[10],E=t[11],n[0]=o,n[1]=c,n[2]=a,n[3]=f,n[4]=h,n[5]=l,n[6]=p,n[7]=m,n[8]=x,n[9]=M,n[10]=d,n[11]=E,n[12]=o*r+h*s+x*i+t[12],n[13]=c*r+l*s+M*i+t[13],n[14]=a*r+p*s+d*i+t[14],n[15]=f*r+m*s+E*i+t[15]),n}function Fn(n,t,e){let r=e[0],s=e[1],i=e[2];return n[0]=t[0]*r,n[1]=t[1]*r,n[2]=t[2]*r,n[3]=t[3]*r,n[4]=t[4]*s,n[5]=t[5]*s,n[6]=t[6]*s,n[7]=t[7]*s,n[8]=t[8]*i,n[9]=t[9]*i,n[10]=t[10]*i,n[11]=t[11]*i,n[12]=t[12],n[13]=t[13],n[14]=t[14],n[15]=t[15],n}function qn(n,t,e,r){let s=r[0],i=r[1],o=r[2],c=Math.sqrt(s*s+i*i+o*o),a,f,h,l,p,m,x,M,d,E,L,g,y,T,A,N,u,_,P,I,v,k,w,X;return c<1e-6?null:(c=1/c,s*=c,i*=c,o*=c,f=Math.sin(e),a=Math.cos(e),h=1-a,l=t[0],p=t[1],m=t[2],x=t[3],M=t[4],d=t[5],E=t[6],L=t[7],g=t[8],y=t[9],T=t[10],A=t[11],N=s*s*h+a,u=i*s*h+o*f,_=o*s*h-i*f,P=s*i*h-o*f,I=i*i*h+a,v=o*i*h+s*f,k=s*o*h+i*f,w=i*o*h-s*f,X=o*o*h+a,n[0]=l*N+M*u+g*_,n[1]=p*N+d*u+y*_,n[2]=m*N+E*u+T*_,n[3]=x*N+L*u+A*_,n[4]=l*P+M*I+g*v,n[5]=p*P+d*I+y*v,n[6]=m*P+E*I+T*v,n[7]=x*P+L*I+A*v,n[8]=l*k+M*w+g*X,n[9]=p*k+d*w+y*X,n[10]=m*k+E*w+T*X,n[11]=x*k+L*w+A*X,t!==n&&(n[12]=t[12],n[13]=t[13],n[14]=t[14],n[15]=t[15]),n)}function Bn(n,t,e){let r=Math.sin(e),s=Math.cos(e),i=t[4],o=t[5],c=t[6],a=t[7],f=t[8],h=t[9],l=t[10],p=t[11];return t!==n&&(n[0]=t[0],n[1]=t[1],n[2]=t[2],n[3]=t[3],n[12]=t[12],n[13]=t[13],n[14]=t[14],n[15]=t[15]),n[4]=i*s+f*r,n[5]=o*s+h*r,n[6]=c*s+l*r,n[7]=a*s+p*r,n[8]=f*s-i*r,n[9]=h*s-o*r,n[10]=l*s-c*r,n[11]=p*s-a*r,n}function Cn(n,t,e){let r=Math.sin(e),s=Math.cos(e),i=t[0],o=t[1],c=t[2],a=t[3],f=t[8],h=t[9],l=t[10],p=t[11];return t!==n&&(n[4]=t[4],n[5]=t[5],n[6]=t[6],n[7]=t[7],n[12]=t[12],n[13]=t[13],n[14]=t[14],n[15]=t[15]),n[0]=i*s-f*r,n[1]=o*s-h*r,n[2]=c*s-l*r,n[3]=a*s-p*r,n[8]=i*r+f*s,n[9]=o*r+h*s,n[10]=c*r+l*s,n[11]=a*r+p*s,n}function Vn(n,t,e){let r=Math.sin(e),s=Math.cos(e),i=t[0],o=t[1],c=t[2],a=t[3],f=t[4],h=t[5],l=t[6],p=t[7];return t!==n&&(n[8]=t[8],n[9]=t[9],n[10]=t[10],n[11]=t[11],n[12]=t[12],n[13]=t[13],n[14]=t[14],n[15]=t[15]),n[0]=i*s+f*r,n[1]=o*s+h*r,n[2]=c*s+l*r,n[3]=a*s+p*r,n[4]=f*s-i*r,n[5]=h*s-o*r,n[6]=l*s-c*r,n[7]=p*s-a*r,n}function Un(n,t){let e=t[0],r=t[1],s=t[2],i=t[3],o=e+e,c=r+r,a=s+s,f=e*o,h=r*o,l=r*c,p=s*o,m=s*c,x=s*a,M=i*o,d=i*c,E=i*a;return n[0]=1-l-x,n[1]=h+E,n[2]=p-d,n[3]=0,n[4]=h-E,n[5]=1-f-x,n[6]=m+M,n[7]=0,n[8]=p+d,n[9]=m-M,n[10]=1-f-l,n[11]=0,n[12]=0,n[13]=0,n[14]=0,n[15]=1,n}function Dn(n,t,e,r,s,i,o){let c=1/(e-t),a=1/(s-r),f=1/(i-o);return n[0]=i*2*c,n[1]=0,n[2]=0,n[3]=0,n[4]=0,n[5]=i*2*a,n[6]=0,n[7]=0,n[8]=(e+t)*c,n[9]=(s+r)*a,n[10]=(o+i)*f,n[11]=-1,n[12]=0,n[13]=0,n[14]=o*i*2*f,n[15]=0,n}function zr(n,t,e,r,s){let i=1/Math.tan(t/2);if(n[0]=i/e,n[1]=0,n[2]=0,n[3]=0,n[4]=0,n[5]=i,n[6]=0,n[7]=0,n[8]=0,n[9]=0,n[11]=-1,n[12]=0,n[13]=0,n[15]=0,s!=null&&s!==1/0){let o=1/(r-s);n[10]=(s+r)*o,n[14]=2*s*r*o}else n[10]=-1,n[14]=-2*r;return n}var Yn=zr;function Fr(n,t,e,r,s,i,o){let c=1/(t-e),a=1/(r-s),f=1/(i-o);return n[0]=-2*c,n[1]=0,n[2]=0,n[3]=0,n[4]=0,n[5]=-2*a,n[6]=0,n[7]=0,n[8]=0,n[9]=0,n[10]=2*f,n[11]=0,n[12]=(t+e)*c,n[13]=(s+r)*a,n[14]=(o+i)*f,n[15]=1,n}var $n=Fr;function Gn(n,t,e,r){let s,i,o,c,a,f,h,l,p,m,x=t[0],M=t[1],d=t[2],E=r[0],L=r[1],g=r[2],y=e[0],T=e[1],A=e[2];return Math.abs(x-y)<1e-6&&Math.abs(M-T)<1e-6&&Math.abs(d-A)<1e-6?br(n):(l=x-y,p=M-T,m=d-A,s=1/Math.sqrt(l*l+p*p+m*m),l*=s,p*=s,m*=s,i=L*m-g*p,o=g*l-E*m,c=E*p-L*l,s=Math.sqrt(i*i+o*o+c*c),s?(s=1/s,i*=s,o*=s,c*=s):(i=0,o=0,c=0),a=p*c-m*o,f=m*i-l*c,h=l*o-p*i,s=Math.sqrt(a*a+f*f+h*h),s?(s=1/s,a*=s,f*=s,h*=s):(a=0,f=0,h=0),n[0]=i,n[1]=a,n[2]=l,n[3]=0,n[4]=o,n[5]=f,n[6]=p,n[7]=0,n[8]=c,n[9]=h,n[10]=m,n[11]=0,n[12]=-(i*x+o*M+c*d),n[13]=-(a*x+f*M+h*d),n[14]=-(l*x+p*M+m*d),n[15]=1,n)}function qr(){let n=new R(4);return R!=Float32Array&&(n[0]=0,n[1]=0,n[2]=0,n[3]=0),n}function Wn(n,t,e){return n[0]=t[0]+e[0],n[1]=t[1]+e[1],n[2]=t[2]+e[2],n[3]=t[3]+e[3],n}function Hn(n,t,e){return n[0]=t[0]*e,n[1]=t[1]*e,n[2]=t[2]*e,n[3]=t[3]*e,n}function Xn(n){let t=n[0],e=n[1],r=n[2],s=n[3];return Math.sqrt(t*t+e*e+r*r+s*s)}function jn(n){let t=n[0],e=n[1],r=n[2],s=n[3];return t*t+e*e+r*r+s*s}function Qn(n,t){let e=t[0],r=t[1],s=t[2],i=t[3],o=e*e+r*r+s*s+i*i;return o>0&&(o=1/Math.sqrt(o)),n[0]=e*o,n[1]=r*o,n[2]=s*o,n[3]=i*o,n}function Kn(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]+n[3]*t[3]}function Zn(n,t,e,r){let s=t[0],i=t[1],o=t[2],c=t[3];return n[0]=s+r*(e[0]-s),n[1]=i+r*(e[1]-i),n[2]=o+r*(e[2]-o),n[3]=c+r*(e[3]-c),n}function Jn(n,t,e){let r=t[0],s=t[1],i=t[2],o=t[3];return n[0]=e[0]*r+e[4]*s+e[8]*i+e[12]*o,n[1]=e[1]*r+e[5]*s+e[9]*i+e[13]*o,n[2]=e[2]*r+e[6]*s+e[10]*i+e[14]*o,n[3]=e[3]*r+e[7]*s+e[11]*i+e[15]*o,n}function te(n,t,e){let r=t[0],s=t[1],i=t[2],o=e[0],c=e[1],a=e[2],f=e[3],h=f*r+c*i-a*s,l=f*s+a*r-o*i,p=f*i+o*s-c*r,m=-o*r-c*s-a*i;return n[0]=h*f+m*-o+l*-a-p*-c,n[1]=l*f+m*-c+p*-o-h*-a,n[2]=p*f+m*-a+h*-c-l*-o,n[3]=t[3],n}var Xi=function(){let n=qr();return function(t,e,r,s,i,o){let c,a;for(e||(e=4),r||(r=0),s?a=Math.min(s*e+r,t.length):a=t.length,c=r;c<a;c+=e)n[0]=t[c],n[1]=t[c+1],n[2]=t[c+2],n[3]=t[c+3],i(n,n,o),t[c]=n[0],t[c+1]=n[1],t[c+2]=n[2],t[c+3]=n[3];return t}}();var Yt;(function(n){n[n.COL0ROW0=0]="COL0ROW0",n[n.COL0ROW1=1]="COL0ROW1",n[n.COL0ROW2=2]="COL0ROW2",n[n.COL0ROW3=3]="COL0ROW3",n[n.COL1ROW0=4]="COL1ROW0",n[n.COL1ROW1=5]="COL1ROW1",n[n.COL1ROW2=6]="COL1ROW2",n[n.COL1ROW3=7]="COL1ROW3",n[n.COL2ROW0=8]="COL2ROW0",n[n.COL2ROW1=9]="COL2ROW1",n[n.COL2ROW2=10]="COL2ROW2",n[n.COL2ROW3=11]="COL2ROW3",n[n.COL3ROW0=12]="COL3ROW0",n[n.COL3ROW1=13]="COL3ROW1",n[n.COL3ROW2=14]="COL3ROW2",n[n.COL3ROW3=15]="COL3ROW3"})(Yt||(Yt={}));var Cr=45*Math.PI/180,Vr=1,Ut=.1,Dt=500,Ur=Object.freeze([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]),z=class extends Tt{static get IDENTITY(){return Yr()}static get ZERO(){return Dr()}get ELEMENTS(){return 16}get RANK(){return 4}get INDICES(){return Yt}constructor(t){super(-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0),arguments.length===1&&Array.isArray(t)?this.copy(t):this.identity()}copy(t){return this[0]=t[0],this[1]=t[1],this[2]=t[2],this[3]=t[3],this[4]=t[4],this[5]=t[5],this[6]=t[6],this[7]=t[7],this[8]=t[8],this[9]=t[9],this[10]=t[10],this[11]=t[11],this[12]=t[12],this[13]=t[13],this[14]=t[14],this[15]=t[15],this.check()}set(t,e,r,s,i,o,c,a,f,h,l,p,m,x,M,d){return this[0]=t,this[1]=e,this[2]=r,this[3]=s,this[4]=i,this[5]=o,this[6]=c,this[7]=a,this[8]=f,this[9]=h,this[10]=l,this[11]=p,this[12]=m,this[13]=x,this[14]=M,this[15]=d,this.check()}setRowMajor(t,e,r,s,i,o,c,a,f,h,l,p,m,x,M,d){return this[0]=t,this[1]=i,this[2]=f,this[3]=m,this[4]=e,this[5]=o,this[6]=h,this[7]=x,this[8]=r,this[9]=c,this[10]=l,this[11]=M,this[12]=s,this[13]=a,this[14]=p,this[15]=d,this.check()}toRowMajor(t){return t[0]=this[0],t[1]=this[4],t[2]=this[8],t[3]=this[12],t[4]=this[1],t[5]=this[5],t[6]=this[9],t[7]=this[13],t[8]=this[2],t[9]=this[6],t[10]=this[10],t[11]=this[14],t[12]=this[3],t[13]=this[7],t[14]=this[11],t[15]=this[15],t}identity(){return this.copy(Ur)}fromObject(t){return this.check()}fromQuaternion(t){return Un(this,t),this.check()}frustum(t){let{left:e,right:r,bottom:s,top:i,near:o=Ut,far:c=Dt}=t;return c===1/0?$r(this,e,r,s,i,o):Dn(this,e,r,s,i,o,c),this.check()}lookAt(t){let{eye:e,center:r=[0,0,0],up:s=[0,1,0]}=t;return Gn(this,e,r,s),this.check()}ortho(t){let{left:e,right:r,bottom:s,top:i,near:o=Ut,far:c=Dt}=t;return $n(this,e,r,s,i,o,c),this.check()}orthographic(t){let{fovy:e=Cr,aspect:r=Vr,focalDistance:s=1,near:i=Ut,far:o=Dt}=t;ne(e);let c=e/2,a=s*Math.tan(c),f=a*r;return this.ortho({left:-f,right:f,bottom:-a,top:a,near:i,far:o})}perspective(t){let{fovy:e=45*Math.PI/180,aspect:r=1,near:s=.1,far:i=500}=t;return ne(e),Yn(this,e,r,s,i),this.check()}determinant(){return bn(this)}getScale(t=[-0,-0,-0]){return t[0]=Math.sqrt(this[0]*this[0]+this[1]*this[1]+this[2]*this[2]),t[1]=Math.sqrt(this[4]*this[4]+this[5]*this[5]+this[6]*this[6]),t[2]=Math.sqrt(this[8]*this[8]+this[9]*this[9]+this[10]*this[10]),t}getTranslation(t=[-0,-0,-0]){return t[0]=this[12],t[1]=this[13],t[2]=this[14],t}getRotation(t,e){t=t||[-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0],e=e||[-0,-0,-0];let r=this.getScale(e),s=1/r[0],i=1/r[1],o=1/r[2];return t[0]=this[0]*s,t[1]=this[1]*i,t[2]=this[2]*o,t[3]=0,t[4]=this[4]*s,t[5]=this[5]*i,t[6]=this[6]*o,t[7]=0,t[8]=this[8]*s,t[9]=this[9]*i,t[10]=this[10]*o,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t}getRotationMatrix3(t,e){t=t||[-0,-0,-0,-0,-0,-0,-0,-0,-0],e=e||[-0,-0,-0];let r=this.getScale(e),s=1/r[0],i=1/r[1],o=1/r[2];return t[0]=this[0]*s,t[1]=this[1]*i,t[2]=this[2]*o,t[3]=this[4]*s,t[4]=this[5]*i,t[5]=this[6]*o,t[6]=this[8]*s,t[7]=this[9]*i,t[8]=this[10]*o,t}transpose(){return vn(this,this),this.check()}invert(){return kn(this,this),this.check()}multiplyLeft(t){return Vt(this,t,this),this.check()}multiplyRight(t){return Vt(this,this,t),this.check()}rotateX(t){return Bn(this,this,t),this.check()}rotateY(t){return Cn(this,this,t),this.check()}rotateZ(t){return Vn(this,this,t),this.check()}rotateXYZ(t){return this.rotateX(t[0]).rotateY(t[1]).rotateZ(t[2])}rotateAxis(t,e){return qn(this,this,t,e),this.check()}scale(t){return Fn(this,this,Array.isArray(t)?t:[t,t,t]),this.check()}translate(t){return zn(this,this,t),this.check()}transform(t,e){return t.length===4?(e=Jn(e||[-0,-0,-0,-0],t,this),$(e,4),e):this.transformAsPoint(t,e)}transformAsPoint(t,e){let{length:r}=t,s;switch(r){case 2:s=wn(e||[-0,-0],t,this);break;case 3:s=gt(e||[-0,-0,-0],t,this);break;default:throw new Error("Illegal vector")}return $(s,t.length),s}transformAsVector(t,e){let r;switch(t.length){case 2:r=Sn(e||[-0,-0],t,this);break;case 3:r=Ln(e||[-0,-0,-0],t,this);break;default:throw new Error("Illegal vector")}return $(r,t.length),r}transformPoint(t,e){return this.transformAsPoint(t,e)}transformVector(t,e){return this.transformAsPoint(t,e)}transformDirection(t,e){return this.transformAsVector(t,e)}makeRotationX(t){return this.identity().rotateX(t)}makeTranslation(t,e,r){return this.identity().translate([t,e,r])}},At,Et;function Dr(){return At||(At=new z([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]),Object.freeze(At)),At}function Yr(){return Et||(Et=new z,Object.freeze(Et)),Et}function ne(n){if(n>Math.PI*2)throw Error("expected radians")}function $r(n,t,e,r,s,i){let o=2*i/(e-t),c=2*i/(s-r),a=(e+t)/(e-t),f=(s+r)/(s-r),h=-1,l=-1,p=-2*i;return n[0]=o,n[1]=0,n[2]=0,n[3]=0,n[4]=0,n[5]=c,n[6]=0,n[7]=0,n[8]=a,n[9]=f,n[10]=h,n[11]=l,n[12]=0,n[13]=0,n[14]=p,n[15]=0,n}function ee(){let n=new R(4);return R!=Float32Array&&(n[0]=0,n[1]=0,n[2]=0),n[3]=1,n}function re(n){return n[0]=0,n[1]=0,n[2]=0,n[3]=1,n}function $t(n,t,e){e=e*.5;let r=Math.sin(e);return n[0]=r*t[0],n[1]=r*t[1],n[2]=r*t[2],n[3]=Math.cos(e),n}function Gt(n,t,e){let r=t[0],s=t[1],i=t[2],o=t[3],c=e[0],a=e[1],f=e[2],h=e[3];return n[0]=r*h+o*c+s*f-i*a,n[1]=s*h+o*a+i*c-r*f,n[2]=i*h+o*f+r*a-s*c,n[3]=o*h-r*c-s*a-i*f,n}function se(n,t,e){e*=.5;let r=t[0],s=t[1],i=t[2],o=t[3],c=Math.sin(e),a=Math.cos(e);return n[0]=r*a+o*c,n[1]=s*a+i*c,n[2]=i*a-s*c,n[3]=o*a-r*c,n}function ie(n,t,e){e*=.5;let r=t[0],s=t[1],i=t[2],o=t[3],c=Math.sin(e),a=Math.cos(e);return n[0]=r*a-i*c,n[1]=s*a+o*c,n[2]=i*a+r*c,n[3]=o*a-s*c,n}function oe(n,t,e){e*=.5;let r=t[0],s=t[1],i=t[2],o=t[3],c=Math.sin(e),a=Math.cos(e);return n[0]=r*a+s*c,n[1]=s*a-r*c,n[2]=i*a+o*c,n[3]=o*a-i*c,n}function ce(n,t){let e=t[0],r=t[1],s=t[2];return n[0]=e,n[1]=r,n[2]=s,n[3]=Math.sqrt(Math.abs(1-e*e-r*r-s*s)),n}function tt(n,t,e,r){let s=t[0],i=t[1],o=t[2],c=t[3],a=e[0],f=e[1],h=e[2],l=e[3],p,m,x,M,d;return p=s*a+i*f+o*h+c*l,p<0&&(p=-p,a=-a,f=-f,h=-h,l=-l),1-p>1e-6?(m=Math.acos(p),d=Math.sin(m),x=Math.sin((1-r)*m)/d,M=Math.sin(r*m)/d):(x=1-r,M=r),n[0]=x*s+M*a,n[1]=x*i+M*f,n[2]=x*o+M*h,n[3]=x*c+M*l,n}function ae(n,t){let e=t[0],r=t[1],s=t[2],i=t[3],o=e*e+r*r+s*s+i*i,c=o?1/o:0;return n[0]=-e*c,n[1]=-r*c,n[2]=-s*c,n[3]=i*c,n}function fe(n,t){return n[0]=-t[0],n[1]=-t[1],n[2]=-t[2],n[3]=t[3],n}function Wt(n,t){let e=t[0]+t[4]+t[8],r;if(e>0)r=Math.sqrt(e+1),n[3]=.5*r,r=.5/r,n[0]=(t[5]-t[7])*r,n[1]=(t[6]-t[2])*r,n[2]=(t[1]-t[3])*r;else{let s=0;t[4]>t[0]&&(s=1),t[8]>t[s*3+s]&&(s=2);let i=(s+1)%3,o=(s+2)%3;r=Math.sqrt(t[s*3+s]-t[i*3+i]-t[o*3+o]+1),n[s]=.5*r,r=.5/r,n[3]=(t[i*3+o]-t[o*3+i])*r,n[i]=(t[i*3+s]+t[s*3+i])*r,n[o]=(t[o*3+s]+t[s*3+o])*r}return n}var he=Wn;var le=Hn,pe=Kn,me=Zn,xe=Xn;var Me=jn;var de=Qn;var ge=function(){let n=Bt(),t=Ct(1,0,0),e=Ct(0,1,0);return function(r,s,i){let o=un(s,i);return o<-.999999?(dt(n,t,s),Pn(n)<1e-6&&dt(n,e,s),Nn(n,n),$t(r,n,Math.PI),r):o>.999999?(r[0]=0,r[1]=0,r[2]=0,r[3]=1,r):(dt(n,s,i),r[0]=n[0],r[1]=n[1],r[2]=n[2],r[3]=1+o,de(r,r))}}(),ao=function(){let n=ee(),t=ee();return function(e,r,s,i,o,c){return tt(n,r,o,c),tt(t,s,i,c),tt(e,n,t,2*c*(1-c)),e}}(),fo=function(){let n=In();return function(t,e,r,s){return n[0]=r[0],n[3]=r[1],n[6]=r[2],n[1]=s[0],n[4]=s[1],n[7]=s[2],n[2]=-e[0],n[5]=-e[1],n[8]=-e[2],de(t,Wt(t,n))}}();var Gr=[0,0,0,1],nt=class extends C{constructor(t=0,e=0,r=0,s=1){super(-0,-0,-0,-0),Array.isArray(t)&&arguments.length===1?this.copy(t):this.set(t,e,r,s)}copy(t){return this[0]=t[0],this[1]=t[1],this[2]=t[2],this[3]=t[3],this.check()}set(t,e,r,s){return this[0]=t,this[1]=e,this[2]=r,this[3]=s,this.check()}fromObject(t){return this[0]=t.x,this[1]=t.y,this[2]=t.z,this[3]=t.w,this.check()}fromMatrix3(t){return Wt(this,t),this.check()}fromAxisRotation(t,e){return $t(this,t,e),this.check()}identity(){return re(this),this.check()}setAxisAngle(t,e){return this.fromAxisRotation(t,e)}get ELEMENTS(){return 4}get x(){return this[0]}set x(t){this[0]=S(t)}get y(){return this[1]}set y(t){this[1]=S(t)}get z(){return this[2]}set z(t){this[2]=S(t)}get w(){return this[3]}set w(t){this[3]=S(t)}len(){return xe(this)}lengthSquared(){return Me(this)}dot(t){return pe(this,t)}rotationTo(t,e){return ge(this,t,e),this.check()}add(t){return he(this,this,t),this.check()}calculateW(){return ce(this,this),this.check()}conjugate(){return fe(this,this),this.check()}invert(){return ae(this,this),this.check()}lerp(t,e,r){return r===void 0?this.lerp(this,t,e):(me(this,t,e,r),this.check())}multiplyRight(t){return Gt(this,this,t),this.check()}multiplyLeft(t){return Gt(this,t,this),this.check()}normalize(){let t=this.len(),e=t>0?1/t:0;return this[0]=this[0]*e,this[1]=this[1]*e,this[2]=this[2]*e,this[3]=this[3]*e,t===0&&(this[3]=1),this.check()}rotateX(t){return se(this,this,t),this.check()}rotateY(t){return ie(this,this,t),this.check()}rotateZ(t){return oe(this,this,t),this.check()}scale(t){return le(this,this,t),this.check()}slerp(t,e,r){let s,i,o;switch(arguments.length){case 1:({start:s=Gr,target:i,ratio:o}=t);break;case 2:s=this,i=t,o=e;break;default:s=t,i=e,o=r}return tt(this,s,i,o),this.check()}transformVector4(t,e=new G){return te(e,t,this),$(e,4)}lengthSq(){return this.lengthSquared()}setFromAxisAngle(t,e){return this.setAxisAngle(t,e)}premultiply(t){return this.multiplyLeft(t)}multiply(t){return this.multiplyRight(t)}};function wt(n){let t=n.extensions?.KHR_lights_punctual?.lights;if(!t||!Array.isArray(t)||t.length===0)return[];let e=[];for(let r of n.nodes||[]){let s=r.extensions?.KHR_lights_punctual;if(!s||typeof s.light!="number")continue;let i=t[s.light];if(!i)continue;let o=i.color||[1,1,1],c=i.intensity??1,a=i.range;switch(i.type){case"directional":e.push(Wr(r,o,c));break;case"point":e.push(ye(r,o,c,a));break;case"spot":e.push(ye(r,o,c,a));break;default:break}}return e}function ye(n,t,e,r){let s=n.translation?[...n.translation]:[0,0,0],i=[1,0,0];return r!==void 0&&r>0&&(i=[1,0,1/(r*r)]),{type:"point",position:s,color:t,intensity:e,attenuation:i}}function Wr(n,t,e){let r=[0,0,-1];return n.rotation&&(r=new z().fromQuaternion(n.rotation).transformDirection([0,0,-1])),{type:"directional",direction:r,color:t,intensity:e}}var W=b(ct(),1);var U;(function(n){n[n.POINTS=0]="POINTS",n[n.LINES=1]="LINES",n[n.LINE_LOOP=2]="LINE_LOOP",n[n.LINE_STRIP=3]="LINE_STRIP",n[n.TRIANGLES=4]="TRIANGLES",n[n.TRIANGLE_STRIP=5]="TRIANGLE_STRIP",n[n.TRIANGLE_FAN=6]="TRIANGLE_FAN"})(U||(U={}));function Te(n){switch(n){case U.POINTS:return"point-list";case U.LINES:return"line-list";case U.LINE_STRIP:return"line-strip";case U.TRIANGLES:return"triangle-list";case U.TRIANGLE_STRIP:return"triangle-strip";default:throw new Error(String(n))}}var we=b(D(),1),Se=b(Ee(),1),St=b(ct(),1),Hr=`
7
+ "use strict";var __exports__=(()=>{var be=Object.create;var st=Object.defineProperty;var ze=Object.getOwnPropertyDescriptor;var Fe=Object.getOwnPropertyNames;var qe=Object.getPrototypeOf,Be=Object.prototype.hasOwnProperty;var it=(n,t)=>()=>(t||n((t={exports:{}}).exports,t),t.exports),Ce=(n,t)=>{for(var e in t)st(n,e,{get:t[e],enumerable:!0})},rt=(n,t,e,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of Fe(t))!Be.call(n,s)&&s!==e&&st(n,s,{get:()=>t[s],enumerable:!(r=ze(t,s))||r.enumerable});return n},ot=(n,t,e)=>(rt(n,t,"default"),e&&rt(e,t,"default")),b=(n,t,e)=>(e=n!=null?be(qe(n)):{},rt(t||!n||!n.__esModule?st(e,"default",{value:n,enumerable:!0}):e,n)),Ve=n=>rt(st({},"__esModule",{value:!0}),n);var D=it((fs,Qt)=>{Qt.exports=globalThis.luma});var ct=it((hs,Kt)=>{Kt.exports=globalThis.luma});var zt=it((pi,Mn)=>{Mn.exports=globalThis.luma});var Ee=it((Lo,Ae)=>{Ae.exports=globalThis.luma});var et={};Ce(et,{GLTFAnimator:()=>H,createScenegraphsFromGLTF:()=>ke,loadPBREnvironment:()=>xn,parseGLTFLights:()=>wt,parsePBRMaterial:()=>xt});ot(et,b(D(),1));var bt=b(ct(),1);function V(n,t){if(!n)throw new Error(t||"loader assertion failed.")}var F={self:typeof self<"u"&&self,window:typeof window<"u"&&window,global:typeof global<"u"&&global,document:typeof document<"u"&&document},Ue=F.self||F.window||F.global||{},De=F.window||F.self||F.global||{},Ye=F.global||F.self||F.window||{},$e=F.document||{};var Ot=Boolean(typeof process!="object"||String(process)!=="[object process]"||process.browser);var Zt=typeof process<"u"&&process.version&&/v([0-9]*)/.exec(process.version),Ge=Zt&&parseFloat(Zt[1])||0;var We="",Jt={};function Rt(n){for(let t in Jt)if(n.startsWith(t)){let e=Jt[t];n=n.replace(t,e)}return!n.startsWith("http://")&&!n.startsWith("https://")&&(n=`${We}${n}`),n}var tn="4.3.2";var He=globalThis.loaders?.parseImageNode,Nt=typeof Image<"u",ut=typeof ImageBitmap<"u",Xe=Boolean(He),_t=Ot?!0:Xe;function nn(n){switch(n){case"auto":return ut||Nt||_t;case"imagebitmap":return ut;case"image":return Nt;case"data":return _t;default:throw new Error(`@loaders.gl/images: image ${n} not supported in this environment`)}}function en(){if(ut)return"imagebitmap";if(Nt)return"image";if(_t)return"data";throw new Error("Install '@loaders.gl/polyfills' to parse images under Node.js")}function rn(n){let t=je(n);if(!t)throw new Error("Not an image");return t}function Pt(n){return at(n)}function at(n){switch(rn(n)){case"data":return n;case"image":case"imagebitmap":let t=document.createElement("canvas"),e=t.getContext("2d");if(!e)throw new Error("getImageData");return t.width=n.width,t.height=n.height,e.drawImage(n,0,0),e.getImageData(0,0,n.width,n.height);default:throw new Error("getImageData")}}function je(n){return typeof ImageBitmap<"u"&&n instanceof ImageBitmap?"imagebitmap":typeof Image<"u"&&n instanceof Image?"image":n&&typeof n=="object"&&n.data&&n.width&&n.height?"data":null}var Qe=/^data:image\/svg\+xml/,Ke=/\.svg((\?|#).*)?$/;function ft(n){return n&&(Qe.test(n)||Ke.test(n))}function sn(n,t){if(ft(t)){let r=new TextDecoder().decode(n);try{typeof unescape=="function"&&typeof encodeURIComponent=="function"&&(r=unescape(encodeURIComponent(r)))}catch(i){throw new Error(i.message)}return`data:image/svg+xml;base64,${btoa(r)}`}return It(n,t)}function It(n,t){if(ft(t))throw new Error("SVG cannot be parsed directly to imagebitmap");return new Blob([new Uint8Array(n)])}async function ht(n,t,e){let r=sn(n,e),s=self.URL||self.webkitURL,i=typeof r!="string"&&s.createObjectURL(r);try{return await Ze(i||r,t)}finally{i&&s.revokeObjectURL(i)}}async function Ze(n,t){let e=new Image;return e.src=n,t.image&&t.image.decode&&e.decode?(await e.decode(),e):await new Promise((r,s)=>{try{e.onload=()=>r(e),e.onerror=i=>{let o=i instanceof Error?i.message:"error";s(new Error(o))}}catch(i){s(i)}})}var Je={},on=!0;async function cn(n,t,e){let r;ft(e)?r=await ht(n,t,e):r=It(n,e);let s=t&&t.imagebitmap;return await tr(r,s)}async function tr(n,t=null){if((nr(t)||!on)&&(t=null),t)try{return await createImageBitmap(n,t)}catch(e){console.warn(e),on=!1}return await createImageBitmap(n)}function nr(n){for(let t in n||Je)return!1;return!0}function an(n){return!ir(n,"ftyp",4)||!(n[8]&96)?null:er(n)}function er(n){switch(rr(n,8,12).replace("\0"," ").trim()){case"avif":case"avis":return{extension:"avif",mimeType:"image/avif"};default:return null}}function rr(n,t,e){return String.fromCharCode(...n.slice(t,e))}function sr(n){return[...n].map(t=>t.charCodeAt(0))}function ir(n,t,e=0){let r=sr(t);for(let s=0;s<r.length;++s)if(r[s]!==n[s+e])return!1;return!0}var q=!1,j=!0;function lt(n){let t=Q(n);return cr(t)||hr(t)||ar(t)||fr(t)||or(t)}function or(n){let t=new Uint8Array(n instanceof DataView?n.buffer:n),e=an(t);return e?{mimeType:e.mimeType,width:0,height:0}:null}function cr(n){let t=Q(n);return t.byteLength>=24&&t.getUint32(0,q)===2303741511?{mimeType:"image/png",width:t.getUint32(16,q),height:t.getUint32(20,q)}:null}function ar(n){let t=Q(n);return t.byteLength>=10&&t.getUint32(0,q)===1195984440?{mimeType:"image/gif",width:t.getUint16(6,j),height:t.getUint16(8,j)}:null}function fr(n){let t=Q(n);return t.byteLength>=14&&t.getUint16(0,q)===16973&&t.getUint32(2,j)===t.byteLength?{mimeType:"image/bmp",width:t.getUint32(18,j),height:t.getUint32(22,j)}:null}function hr(n){let t=Q(n);if(!(t.byteLength>=3&&t.getUint16(0,q)===65496&&t.getUint8(2)===255))return null;let{tableMarkers:r,sofMarkers:s}=lr(),i=2;for(;i+9<t.byteLength;){let o=t.getUint16(i,q);if(s.has(o))return{mimeType:"image/jpeg",height:t.getUint16(i+5,q),width:t.getUint16(i+7,q)};if(!r.has(o))return null;i+=2,i+=t.getUint16(i,q)}return null}function lr(){let n=new Set([65499,65476,65484,65501,65534]);for(let e=65504;e<65520;++e)n.add(e);return{tableMarkers:n,sofMarkers:new Set([65472,65473,65474,65475,65477,65478,65479,65481,65482,65483,65485,65486,65487,65502])}}function Q(n){if(n instanceof DataView)return n;if(ArrayBuffer.isView(n))return new DataView(n.buffer);if(n instanceof ArrayBuffer)return new DataView(n);throw new Error("toDataView")}async function fn(n,t){let{mimeType:e}=lt(n)||{},r=globalThis.loaders?.parseImageNode;return V(r),await r(n,e)}async function hn(n,t,e){t=t||{};let s=(t.image||{}).type||"auto",{url:i}=e||{},o=pr(s),c;switch(o){case"imagebitmap":c=await cn(n,t,i);break;case"image":c=await ht(n,t,i);break;case"data":c=await fn(n,t);break;default:V(!1)}return s==="data"&&(c=at(c)),c}function pr(n){switch(n){case"auto":case"data":return en();default:return nn(n),n}}var mr=["png","jpg","jpeg","gif","webp","bmp","ico","svg","avif"],xr=["image/png","image/jpeg","image/gif","image/webp","image/avif","image/bmp","image/vnd.microsoft.icon","image/svg+xml"],Mr={image:{type:"auto",decode:!0}},pt={dataType:null,batchType:null,id:"image",module:"images",name:"Images",version:tn,mimeTypes:xr,extensions:mr,parse:hn,tests:[n=>Boolean(lt(new DataView(n)))],options:Mr};function mt(n,t,e){let r=typeof n=="function"?n({...t,...e}):n,s=t.baseUrl;return s&&(r=s[s.length-1]==="/"?`${s}${r}`:`${s}/${r}`),Rt(r)}var dr=n=>n&&typeof n=="object";async function ln(n,t,e={}){return await vt(n,t,e)}async function vt(n,t,e){return Array.isArray(n)?await yr(n,t,e):dr(n)?await gr(n,t,e):await t(n,e)}async function gr(n,t,e){let r=[],s={};for(let i in n){let o=n[i],c=vt(o,t,e).then(a=>{s[i]=a});r.push(c)}return await Promise.all(r),s}async function yr(n,t,e={}){let r=n.map(s=>vt(s,t,e));return await Promise.all(r)}async function pn(n,t,e){return await ln(n,r=>kt(r,t,e))}async function kt(n,t,e){let s=await(await fetch(n,e.fetch)).arrayBuffer();return await t(s,e)}async function K(n,t={}){let e=await Tr(n,t);return await pn(e,pt.parse,t)}async function Tr(n,t,e={}){let r=t&&t.image&&t.image.mipLevels||0;return r!==0?await Ar(n,r,t,e):mt(n,t,e)}async function Ar(n,t,e,r){let s=[];if(t==="auto"){let i=mt(n,e,{...r,lod:0}),o=await kt(i,pt.parse,e),{width:c,height:a}=Pt(o);t=Er({width:c,height:a}),s.push(i)}V(t>0);for(let i=s.length;i<t;++i){let o=mt(n,e,{...r,lod:i});s.push(o)}return s}function Er(n){return 1+Math.floor(Math.log2(Math.max(n.width,n.height)))}function xn(n,t){let e=new bt.DynamicTexture(n,{id:"brdfLUT",sampler:{addressModeU:"clamp-to-edge",addressModeV:"clamp-to-edge",minFilter:"linear",magFilter:"linear"},data:K(t.brdfLutUrl)}),r=mn(n,{id:"DiffuseEnvSampler",getTextureForFace:i=>K(t.getTexUrl("diffuse",i,0)),sampler:{addressModeU:"clamp-to-edge",addressModeV:"clamp-to-edge",minFilter:"linear",magFilter:"linear"}}),s=mn(n,{id:"SpecularEnvSampler",getTextureForFace:i=>{let o=[];for(let c=0;c<=t.specularMipLevels-1;c++)o.push(K(t.getTexUrl("specular",i,c)));return o},sampler:{addressModeU:"clamp-to-edge",addressModeV:"clamp-to-edge",minFilter:"linear",magFilter:"linear"}});return{brdfLutTexture:e,diffuseEnvSampler:r,specularEnvSampler:s}}var wr=[0,1,2,3,4,5];function mn(n,{id:t,getTextureForFace:e,sampler:r}){let s={};return wr.forEach(i=>{s[String(i)]=e(i)}),new bt.DynamicTexture(n,{id:t,dimension:"cube",mipmaps:!1,sampler:r,data:s})}var di=b(zt(),1),yn=b(D(),1);var mi=b(zt(),1);function gn(n){return{addressModeU:dn(n.wrapS),addressModeV:dn(n.wrapT),magFilter:Sr(n.magFilter),...Lr(n.minFilter)}}function dn(n){switch(n){case 33071:return"clamp-to-edge";case 10497:return"repeat";case 33648:return"mirror-repeat";default:return}}function Sr(n){switch(n){case 9728:return"nearest";case 9729:return"linear";default:return}}function Lr(n){switch(n){case 9728:return{minFilter:"nearest"};case 9729:return{minFilter:"linear"};case 9984:return{minFilter:"nearest",mipmapFilter:"nearest"};case 9985:return{minFilter:"linear",mipmapFilter:"nearest"};case 9986:return{minFilter:"nearest",mipmapFilter:"linear"};case 9987:return{minFilter:"linear",mipmapFilter:"linear"};default:return{}}}function xt(n,t,e,r){let s={defines:{MANUAL_SRGB:!0,SRGB_FAST_APPROXIMATION:!0},bindings:{},uniforms:{camera:[0,0,0],metallicRoughnessValues:[1,1]},parameters:{},glParameters:{},generatedTextures:[]};s.defines.USE_TEX_LOD=!0;let{imageBasedLightingEnvironment:i}=r;return i&&(s.bindings.pbr_diffuseEnvSampler=i.diffuseEnvSampler.texture,s.bindings.pbr_specularEnvSampler=i.specularEnvSampler.texture,s.bindings.pbr_BrdfLUT=i.brdfLutTexture.texture,s.uniforms.scaleIBLAmbient=[1,1]),r?.pbrDebug&&(s.defines.PBR_DEBUG=!0,s.uniforms.scaleDiffBaseMR=[0,0,0,0],s.uniforms.scaleFGDSpec=[0,0,0,0]),e.NORMAL&&(s.defines.HAS_NORMALS=!0),e.TANGENT&&r?.useTangents&&(s.defines.HAS_TANGENTS=!0),e.TEXCOORD_0&&(s.defines.HAS_UV=!0),e.COLOR_0&&(s.defines.HAS_COLORS=!0),r?.imageBasedLightingEnvironment&&(s.defines.USE_IBL=!0),r?.lights&&(s.defines.USE_LIGHTS=!0),t&&Or(n,t,s),s}function Or(n,t,e){if(e.uniforms.unlit=Boolean(t.unlit),t.pbrMetallicRoughness&&Rr(n,t.pbrMetallicRoughness,e),t.normalTexture){Z(n,t.normalTexture,"pbr_normalSampler","HAS_NORMALMAP",e);let{scale:r=1}=t.normalTexture;e.uniforms.normalScale=r}if(t.occlusionTexture){Z(n,t.occlusionTexture,"pbr_occlusionSampler","HAS_OCCLUSIONMAP",e);let{strength:r=1}=t.occlusionTexture;e.uniforms.occlusionStrength=r}switch(t.emissiveTexture&&(Z(n,t.emissiveTexture,"pbr_emissiveSampler","HAS_EMISSIVEMAP",e),e.uniforms.emissiveFactor=t.emissiveFactor||[0,0,0]),t.alphaMode||"MASK"){case"MASK":let{alphaCutoff:r=.5}=t;e.defines.ALPHA_CUTOFF=!0,e.uniforms.alphaCutoff=r;break;case"BLEND":yn.log.warn("glTF BLEND alphaMode might not work well because it requires mesh sorting")(),e.parameters.blend=!0,e.parameters.blendColorOperation="add",e.parameters.blendColorSrcFactor="src-alpha",e.parameters.blendColorDstFactor="one-minus-src-alpha",e.parameters.blendAlphaOperation="add",e.parameters.blendAlphaSrcFactor="one",e.parameters.blendAlphaDstFactor="one-minus-src-alpha",e.glParameters.blend=!0,e.glParameters.blendEquation=32774,e.glParameters.blendFunc=[770,771,1,771];break}}function Rr(n,t,e){t.baseColorTexture&&Z(n,t.baseColorTexture,"pbr_baseColorSampler","HAS_BASECOLORMAP",e),e.uniforms.baseColorFactor=t.baseColorFactor||[1,1,1,1],t.metallicRoughnessTexture&&Z(n,t.metallicRoughnessTexture,"pbr_metallicRoughnessSampler","HAS_METALROUGHNESSMAP",e);let{metallicFactor:r=1,roughnessFactor:s=1}=t;e.uniforms.metallicRoughnessValues=[r,s]}function Z(n,t,e,r,s){let i=t.texture.source.image,o;i.compressed?o=i:o={data:i};let c={wrapS:10497,wrapT:10497,minFilter:9729,magFilter:9729,...t?.texture?.sampler},a=n.createTexture({id:t.uniformName||t.id,sampler:gn(c),...o});s.bindings[e]=a,r&&(s.defines[r]=!0),s.generatedTextures.push(a)}var Ai=1/Math.PI*180,Ei=1/180*Math.PI,Nr={EPSILON:1e-12,debug:!1,precision:4,printTypes:!1,printDegrees:!1,printRowMajor:!0,_cartographicRadians:!1};globalThis.mathgl=globalThis.mathgl||{config:{...Nr}};var O=globalThis.mathgl.config;function Tn(n,{precision:t=O.precision}={}){return n=ur(n),`${parseFloat(n.toPrecision(t))}`}function Y(n){return Array.isArray(n)||ArrayBuffer.isView(n)&&!(n instanceof DataView)}function Ft(n,t,e){let r=O.EPSILON;e&&(O.EPSILON=e);try{if(n===t)return!0;if(Y(n)&&Y(t)){if(n.length!==t.length)return!1;for(let s=0;s<n.length;++s)if(!Ft(n[s],t[s]))return!1;return!0}return n&&n.equals?n.equals(t):t&&t.equals?t.equals(n):typeof n=="number"&&typeof t=="number"?Math.abs(n-t)<=O.EPSILON*Math.max(1,Math.abs(n),Math.abs(t)):!1}finally{O.EPSILON=r}}function ur(n){return Math.round(n/O.EPSILON)*O.EPSILON}var C=class extends Array{clone(){return new this.constructor().copy(this)}fromArray(t,e=0){for(let r=0;r<this.ELEMENTS;++r)this[r]=t[r+e];return this.check()}toArray(t=[],e=0){for(let r=0;r<this.ELEMENTS;++r)t[e+r]=this[r];return t}toObject(t){return t}from(t){return Array.isArray(t)?this.copy(t):this.fromObject(t)}to(t){return t===this?this:Y(t)?this.toArray(t):this.toObject(t)}toTarget(t){return t?this.to(t):this}toFloat32Array(){return new Float32Array(this)}toString(){return this.formatString(O)}formatString(t){let e="";for(let r=0;r<this.ELEMENTS;++r)e+=(r>0?", ":"")+Tn(this[r],t);return`${t.printTypes?this.constructor.name:""}[${e}]`}equals(t){if(!t||this.length!==t.length)return!1;for(let e=0;e<this.ELEMENTS;++e)if(!Ft(this[e],t[e]))return!1;return!0}exactEquals(t){if(!t||this.length!==t.length)return!1;for(let e=0;e<this.ELEMENTS;++e)if(this[e]!==t[e])return!1;return!0}negate(){for(let t=0;t<this.ELEMENTS;++t)this[t]=-this[t];return this.check()}lerp(t,e,r){if(r===void 0)return this.lerp(this,t,e);for(let s=0;s<this.ELEMENTS;++s){let i=t[s],o=typeof e=="number"?e:e[s];this[s]=i+r*(o-i)}return this.check()}min(t){for(let e=0;e<this.ELEMENTS;++e)this[e]=Math.min(t[e],this[e]);return this.check()}max(t){for(let e=0;e<this.ELEMENTS;++e)this[e]=Math.max(t[e],this[e]);return this.check()}clamp(t,e){for(let r=0;r<this.ELEMENTS;++r)this[r]=Math.min(Math.max(this[r],t[r]),e[r]);return this.check()}add(...t){for(let e of t)for(let r=0;r<this.ELEMENTS;++r)this[r]+=e[r];return this.check()}subtract(...t){for(let e of t)for(let r=0;r<this.ELEMENTS;++r)this[r]-=e[r];return this.check()}scale(t){if(typeof t=="number")for(let e=0;e<this.ELEMENTS;++e)this[e]*=t;else for(let e=0;e<this.ELEMENTS&&e<t.length;++e)this[e]*=t[e];return this.check()}multiplyByScalar(t){for(let e=0;e<this.ELEMENTS;++e)this[e]*=t;return this.check()}check(){if(O.debug&&!this.validate())throw new Error(`math.gl: ${this.constructor.name} some fields set to invalid numbers'`);return this}validate(){let t=this.length===this.ELEMENTS;for(let e=0;e<this.ELEMENTS;++e)t=t&&Number.isFinite(this[e]);return t}sub(t){return this.subtract(t)}setScalar(t){for(let e=0;e<this.ELEMENTS;++e)this[e]=t;return this.check()}addScalar(t){for(let e=0;e<this.ELEMENTS;++e)this[e]+=t;return this.check()}subScalar(t){return this.addScalar(-t)}multiplyScalar(t){for(let e=0;e<this.ELEMENTS;++e)this[e]*=t;return this.check()}divideScalar(t){return this.multiplyByScalar(1/t)}clampScalar(t,e){for(let r=0;r<this.ELEMENTS;++r)this[r]=Math.min(Math.max(this[r],t),e);return this.check()}get elements(){return this}};function _r(n,t){if(n.length!==t)return!1;for(let e=0;e<n.length;++e)if(!Number.isFinite(n[e]))return!1;return!0}function S(n){if(!Number.isFinite(n))throw new Error(`Invalid number ${JSON.stringify(n)}`);return n}function $(n,t,e=""){if(O.debug&&!_r(n,t))throw new Error(`math.gl: ${e} some fields set to invalid numbers'`);return n}function qt(n,t){if(!n)throw new Error(`math.gl assertion ${t}`)}var Mt=class extends C{get x(){return this[0]}set x(t){this[0]=S(t)}get y(){return this[1]}set y(t){this[1]=S(t)}len(){return Math.sqrt(this.lengthSquared())}magnitude(){return this.len()}lengthSquared(){let t=0;for(let e=0;e<this.ELEMENTS;++e)t+=this[e]*this[e];return t}magnitudeSquared(){return this.lengthSquared()}distance(t){return Math.sqrt(this.distanceSquared(t))}distanceSquared(t){let e=0;for(let r=0;r<this.ELEMENTS;++r){let s=this[r]-t[r];e+=s*s}return S(e)}dot(t){let e=0;for(let r=0;r<this.ELEMENTS;++r)e+=this[r]*t[r];return S(e)}normalize(){let t=this.magnitude();if(t!==0)for(let e=0;e<this.ELEMENTS;++e)this[e]/=t;return this.check()}multiply(...t){for(let e of t)for(let r=0;r<this.ELEMENTS;++r)this[r]*=e[r];return this.check()}divide(...t){for(let e of t)for(let r=0;r<this.ELEMENTS;++r)this[r]/=e[r];return this.check()}lengthSq(){return this.lengthSquared()}distanceTo(t){return this.distance(t)}distanceToSquared(t){return this.distanceSquared(t)}getComponent(t){return qt(t>=0&&t<this.ELEMENTS,"index is out of range"),S(this[t])}setComponent(t,e){return qt(t>=0&&t<this.ELEMENTS,"index is out of range"),this[t]=e,this.check()}addVectors(t,e){return this.copy(t).add(e)}subVectors(t,e){return this.copy(t).subtract(e)}multiplyVectors(t,e){return this.copy(t).multiply(e)}addScaledVector(t,e){return this.add(new this.constructor(t).multiplyScalar(e))}};var R=typeof Float32Array<"u"?Float32Array:Array;var vi=Math.PI/180;function Pr(){let n=new R(2);return R!=Float32Array&&(n[0]=0,n[1]=0),n}function wn(n,t,e){let r=t[0],s=t[1];return n[0]=e[0]*r+e[4]*s+e[12],n[1]=e[1]*r+e[5]*s+e[13],n}var ki=function(){let n=Pr();return function(t,e,r,s,i,o){let c,a;for(e||(e=2),r||(r=0),s?a=Math.min(s*e+r,t.length):a=t.length,c=r;c<a;c+=e)n[0]=t[c],n[1]=t[c+1],i(n,n,o),t[c]=n[0],t[c+1]=n[1];return t}}();function Sn(n,t,e){let r=t[0],s=t[1],i=e[3]*r+e[7]*s||1;return n[0]=(e[0]*r+e[4]*s)/i,n[1]=(e[1]*r+e[5]*s)/i,n}function Ln(n,t,e){let r=t[0],s=t[1],i=t[2],o=e[3]*r+e[7]*s+e[11]*i||1;return n[0]=(e[0]*r+e[4]*s+e[8]*i)/o,n[1]=(e[1]*r+e[5]*s+e[9]*i)/o,n[2]=(e[2]*r+e[6]*s+e[10]*i)/o,n}function On(n,t,e){let r=t[0],s=t[1];return n[0]=e[0]*r+e[2]*s,n[1]=e[1]*r+e[3]*s,n[2]=t[2],n[3]=t[3],n}function Rn(n,t,e){let r=t[0],s=t[1],i=t[2];return n[0]=e[0]*r+e[3]*s+e[6]*i,n[1]=e[1]*r+e[4]*s+e[7]*i,n[2]=e[2]*r+e[5]*s+e[8]*i,n[3]=t[3],n}function Bt(){let n=new R(3);return R!=Float32Array&&(n[0]=0,n[1]=0,n[2]=0),n}function Ir(n){let t=n[0],e=n[1],r=n[2];return Math.sqrt(t*t+e*e+r*r)}function Ct(n,t,e){let r=new R(3);return r[0]=n,r[1]=t,r[2]=e,r}function Nn(n,t){let e=t[0],r=t[1],s=t[2],i=e*e+r*r+s*s;return i>0&&(i=1/Math.sqrt(i)),n[0]=t[0]*i,n[1]=t[1]*i,n[2]=t[2]*i,n}function un(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]}function dt(n,t,e){let r=t[0],s=t[1],i=t[2],o=e[0],c=e[1],a=e[2];return n[0]=s*a-i*c,n[1]=i*o-r*a,n[2]=r*c-s*o,n}function gt(n,t,e){let r=t[0],s=t[1],i=t[2],o=e[3]*r+e[7]*s+e[11]*i+e[15];return o=o||1,n[0]=(e[0]*r+e[4]*s+e[8]*i+e[12])/o,n[1]=(e[1]*r+e[5]*s+e[9]*i+e[13])/o,n[2]=(e[2]*r+e[6]*s+e[10]*i+e[14])/o,n}function _n(n,t,e){let r=e[0],s=e[1],i=e[2],o=e[3],c=t[0],a=t[1],f=t[2],h=s*f-i*a,l=i*c-r*f,p=r*a-s*c,m=s*p-i*l,x=i*h-r*p,M=r*l-s*h,d=o*2;return h*=d,l*=d,p*=d,m*=2,x*=2,M*=2,n[0]=c+h+m,n[1]=a+l+x,n[2]=f+p+M,n}var Pn=Ir;var Fi=function(){let n=Bt();return function(t,e,r,s,i,o){let c,a;for(e||(e=3),r||(r=0),s?a=Math.min(s*e+r,t.length):a=t.length,c=r;c<a;c+=e)n[0]=t[c],n[1]=t[c+1],n[2]=t[c+2],i(n,n,o),t[c]=n[0],t[c+1]=n[1],t[c+2]=n[2];return t}}();var yt,G=class extends Mt{static get ZERO(){return yt||(yt=new G(0,0,0,0),Object.freeze(yt)),yt}constructor(t=0,e=0,r=0,s=0){super(-0,-0,-0,-0),Y(t)&&arguments.length===1?this.copy(t):(O.debug&&(S(t),S(e),S(r),S(s)),this[0]=t,this[1]=e,this[2]=r,this[3]=s)}set(t,e,r,s){return this[0]=t,this[1]=e,this[2]=r,this[3]=s,this.check()}copy(t){return this[0]=t[0],this[1]=t[1],this[2]=t[2],this[3]=t[3],this.check()}fromObject(t){return O.debug&&(S(t.x),S(t.y),S(t.z),S(t.w)),this[0]=t.x,this[1]=t.y,this[2]=t.z,this[3]=t.w,this}toObject(t){return t.x=this[0],t.y=this[1],t.z=this[2],t.w=this[3],t}get ELEMENTS(){return 4}get z(){return this[2]}set z(t){this[2]=S(t)}get w(){return this[3]}set w(t){this[3]=S(t)}transform(t){return gt(this,this,t),this.check()}transformByMatrix3(t){return Rn(this,this,t),this.check()}transformByMatrix2(t){return On(this,this,t),this.check()}transformByQuaternion(t){return _n(this,this,t),this.check()}applyMatrix4(t){return t.transform(this,this),this}};var Tt=class extends C{toString(){let t="[";if(O.printRowMajor){t+="row-major:";for(let e=0;e<this.RANK;++e)for(let r=0;r<this.RANK;++r)t+=` ${this[r*this.RANK+e]}`}else{t+="column-major:";for(let e=0;e<this.ELEMENTS;++e)t+=` ${this[e]}`}return t+="]",t}getElementIndex(t,e){return e*this.RANK+t}getElement(t,e){return this[e*this.RANK+t]}setElement(t,e,r){return this[e*this.RANK+t]=S(r),this}getColumn(t,e=new Array(this.RANK).fill(-0)){let r=t*this.RANK;for(let s=0;s<this.RANK;++s)e[s]=this[r+s];return e}setColumn(t,e){let r=t*this.RANK;for(let s=0;s<this.RANK;++s)this[r+s]=e[s];return this}};function In(){let n=new R(9);return R!=Float32Array&&(n[1]=0,n[2]=0,n[3]=0,n[5]=0,n[6]=0,n[7]=0),n[0]=1,n[4]=1,n[8]=1,n}function br(n){return n[0]=1,n[1]=0,n[2]=0,n[3]=0,n[4]=0,n[5]=1,n[6]=0,n[7]=0,n[8]=0,n[9]=0,n[10]=1,n[11]=0,n[12]=0,n[13]=0,n[14]=0,n[15]=1,n}function vn(n,t){if(n===t){let e=t[1],r=t[2],s=t[3],i=t[6],o=t[7],c=t[11];n[1]=t[4],n[2]=t[8],n[3]=t[12],n[4]=e,n[6]=t[9],n[7]=t[13],n[8]=r,n[9]=i,n[11]=t[14],n[12]=s,n[13]=o,n[14]=c}else n[0]=t[0],n[1]=t[4],n[2]=t[8],n[3]=t[12],n[4]=t[1],n[5]=t[5],n[6]=t[9],n[7]=t[13],n[8]=t[2],n[9]=t[6],n[10]=t[10],n[11]=t[14],n[12]=t[3],n[13]=t[7],n[14]=t[11],n[15]=t[15];return n}function kn(n,t){let e=t[0],r=t[1],s=t[2],i=t[3],o=t[4],c=t[5],a=t[6],f=t[7],h=t[8],l=t[9],p=t[10],m=t[11],x=t[12],M=t[13],d=t[14],E=t[15],L=e*c-r*o,g=e*a-s*o,y=e*f-i*o,T=r*a-s*c,A=r*f-i*c,N=s*f-i*a,u=h*M-l*x,_=h*d-p*x,P=h*E-m*x,I=l*d-p*M,v=l*E-m*M,k=p*E-m*d,w=L*k-g*v+y*I+T*P-A*_+N*u;return w?(w=1/w,n[0]=(c*k-a*v+f*I)*w,n[1]=(s*v-r*k-i*I)*w,n[2]=(M*N-d*A+E*T)*w,n[3]=(p*A-l*N-m*T)*w,n[4]=(a*P-o*k-f*_)*w,n[5]=(e*k-s*P+i*_)*w,n[6]=(d*y-x*N-E*g)*w,n[7]=(h*N-p*y+m*g)*w,n[8]=(o*v-c*P+f*u)*w,n[9]=(r*P-e*v-i*u)*w,n[10]=(x*A-M*y+E*L)*w,n[11]=(l*y-h*A-m*L)*w,n[12]=(c*_-o*I-a*u)*w,n[13]=(e*I-r*_+s*u)*w,n[14]=(M*g-x*T-d*L)*w,n[15]=(h*T-l*g+p*L)*w,n):null}function bn(n){let t=n[0],e=n[1],r=n[2],s=n[3],i=n[4],o=n[5],c=n[6],a=n[7],f=n[8],h=n[9],l=n[10],p=n[11],m=n[12],x=n[13],M=n[14],d=n[15],E=t*o-e*i,L=t*c-r*i,g=e*c-r*o,y=f*x-h*m,T=f*M-l*m,A=h*M-l*x,N=t*A-e*T+r*y,u=i*A-o*T+c*y,_=f*g-h*L+l*E,P=m*g-x*L+M*E;return a*N-s*u+d*_-p*P}function Vt(n,t,e){let r=t[0],s=t[1],i=t[2],o=t[3],c=t[4],a=t[5],f=t[6],h=t[7],l=t[8],p=t[9],m=t[10],x=t[11],M=t[12],d=t[13],E=t[14],L=t[15],g=e[0],y=e[1],T=e[2],A=e[3];return n[0]=g*r+y*c+T*l+A*M,n[1]=g*s+y*a+T*p+A*d,n[2]=g*i+y*f+T*m+A*E,n[3]=g*o+y*h+T*x+A*L,g=e[4],y=e[5],T=e[6],A=e[7],n[4]=g*r+y*c+T*l+A*M,n[5]=g*s+y*a+T*p+A*d,n[6]=g*i+y*f+T*m+A*E,n[7]=g*o+y*h+T*x+A*L,g=e[8],y=e[9],T=e[10],A=e[11],n[8]=g*r+y*c+T*l+A*M,n[9]=g*s+y*a+T*p+A*d,n[10]=g*i+y*f+T*m+A*E,n[11]=g*o+y*h+T*x+A*L,g=e[12],y=e[13],T=e[14],A=e[15],n[12]=g*r+y*c+T*l+A*M,n[13]=g*s+y*a+T*p+A*d,n[14]=g*i+y*f+T*m+A*E,n[15]=g*o+y*h+T*x+A*L,n}function zn(n,t,e){let r=e[0],s=e[1],i=e[2],o,c,a,f,h,l,p,m,x,M,d,E;return t===n?(n[12]=t[0]*r+t[4]*s+t[8]*i+t[12],n[13]=t[1]*r+t[5]*s+t[9]*i+t[13],n[14]=t[2]*r+t[6]*s+t[10]*i+t[14],n[15]=t[3]*r+t[7]*s+t[11]*i+t[15]):(o=t[0],c=t[1],a=t[2],f=t[3],h=t[4],l=t[5],p=t[6],m=t[7],x=t[8],M=t[9],d=t[10],E=t[11],n[0]=o,n[1]=c,n[2]=a,n[3]=f,n[4]=h,n[5]=l,n[6]=p,n[7]=m,n[8]=x,n[9]=M,n[10]=d,n[11]=E,n[12]=o*r+h*s+x*i+t[12],n[13]=c*r+l*s+M*i+t[13],n[14]=a*r+p*s+d*i+t[14],n[15]=f*r+m*s+E*i+t[15]),n}function Fn(n,t,e){let r=e[0],s=e[1],i=e[2];return n[0]=t[0]*r,n[1]=t[1]*r,n[2]=t[2]*r,n[3]=t[3]*r,n[4]=t[4]*s,n[5]=t[5]*s,n[6]=t[6]*s,n[7]=t[7]*s,n[8]=t[8]*i,n[9]=t[9]*i,n[10]=t[10]*i,n[11]=t[11]*i,n[12]=t[12],n[13]=t[13],n[14]=t[14],n[15]=t[15],n}function qn(n,t,e,r){let s=r[0],i=r[1],o=r[2],c=Math.sqrt(s*s+i*i+o*o),a,f,h,l,p,m,x,M,d,E,L,g,y,T,A,N,u,_,P,I,v,k,w,X;return c<1e-6?null:(c=1/c,s*=c,i*=c,o*=c,f=Math.sin(e),a=Math.cos(e),h=1-a,l=t[0],p=t[1],m=t[2],x=t[3],M=t[4],d=t[5],E=t[6],L=t[7],g=t[8],y=t[9],T=t[10],A=t[11],N=s*s*h+a,u=i*s*h+o*f,_=o*s*h-i*f,P=s*i*h-o*f,I=i*i*h+a,v=o*i*h+s*f,k=s*o*h+i*f,w=i*o*h-s*f,X=o*o*h+a,n[0]=l*N+M*u+g*_,n[1]=p*N+d*u+y*_,n[2]=m*N+E*u+T*_,n[3]=x*N+L*u+A*_,n[4]=l*P+M*I+g*v,n[5]=p*P+d*I+y*v,n[6]=m*P+E*I+T*v,n[7]=x*P+L*I+A*v,n[8]=l*k+M*w+g*X,n[9]=p*k+d*w+y*X,n[10]=m*k+E*w+T*X,n[11]=x*k+L*w+A*X,t!==n&&(n[12]=t[12],n[13]=t[13],n[14]=t[14],n[15]=t[15]),n)}function Bn(n,t,e){let r=Math.sin(e),s=Math.cos(e),i=t[4],o=t[5],c=t[6],a=t[7],f=t[8],h=t[9],l=t[10],p=t[11];return t!==n&&(n[0]=t[0],n[1]=t[1],n[2]=t[2],n[3]=t[3],n[12]=t[12],n[13]=t[13],n[14]=t[14],n[15]=t[15]),n[4]=i*s+f*r,n[5]=o*s+h*r,n[6]=c*s+l*r,n[7]=a*s+p*r,n[8]=f*s-i*r,n[9]=h*s-o*r,n[10]=l*s-c*r,n[11]=p*s-a*r,n}function Cn(n,t,e){let r=Math.sin(e),s=Math.cos(e),i=t[0],o=t[1],c=t[2],a=t[3],f=t[8],h=t[9],l=t[10],p=t[11];return t!==n&&(n[4]=t[4],n[5]=t[5],n[6]=t[6],n[7]=t[7],n[12]=t[12],n[13]=t[13],n[14]=t[14],n[15]=t[15]),n[0]=i*s-f*r,n[1]=o*s-h*r,n[2]=c*s-l*r,n[3]=a*s-p*r,n[8]=i*r+f*s,n[9]=o*r+h*s,n[10]=c*r+l*s,n[11]=a*r+p*s,n}function Vn(n,t,e){let r=Math.sin(e),s=Math.cos(e),i=t[0],o=t[1],c=t[2],a=t[3],f=t[4],h=t[5],l=t[6],p=t[7];return t!==n&&(n[8]=t[8],n[9]=t[9],n[10]=t[10],n[11]=t[11],n[12]=t[12],n[13]=t[13],n[14]=t[14],n[15]=t[15]),n[0]=i*s+f*r,n[1]=o*s+h*r,n[2]=c*s+l*r,n[3]=a*s+p*r,n[4]=f*s-i*r,n[5]=h*s-o*r,n[6]=l*s-c*r,n[7]=p*s-a*r,n}function Un(n,t){let e=t[0],r=t[1],s=t[2],i=t[3],o=e+e,c=r+r,a=s+s,f=e*o,h=r*o,l=r*c,p=s*o,m=s*c,x=s*a,M=i*o,d=i*c,E=i*a;return n[0]=1-l-x,n[1]=h+E,n[2]=p-d,n[3]=0,n[4]=h-E,n[5]=1-f-x,n[6]=m+M,n[7]=0,n[8]=p+d,n[9]=m-M,n[10]=1-f-l,n[11]=0,n[12]=0,n[13]=0,n[14]=0,n[15]=1,n}function Dn(n,t,e,r,s,i,o){let c=1/(e-t),a=1/(s-r),f=1/(i-o);return n[0]=i*2*c,n[1]=0,n[2]=0,n[3]=0,n[4]=0,n[5]=i*2*a,n[6]=0,n[7]=0,n[8]=(e+t)*c,n[9]=(s+r)*a,n[10]=(o+i)*f,n[11]=-1,n[12]=0,n[13]=0,n[14]=o*i*2*f,n[15]=0,n}function zr(n,t,e,r,s){let i=1/Math.tan(t/2);if(n[0]=i/e,n[1]=0,n[2]=0,n[3]=0,n[4]=0,n[5]=i,n[6]=0,n[7]=0,n[8]=0,n[9]=0,n[11]=-1,n[12]=0,n[13]=0,n[15]=0,s!=null&&s!==1/0){let o=1/(r-s);n[10]=(s+r)*o,n[14]=2*s*r*o}else n[10]=-1,n[14]=-2*r;return n}var Yn=zr;function Fr(n,t,e,r,s,i,o){let c=1/(t-e),a=1/(r-s),f=1/(i-o);return n[0]=-2*c,n[1]=0,n[2]=0,n[3]=0,n[4]=0,n[5]=-2*a,n[6]=0,n[7]=0,n[8]=0,n[9]=0,n[10]=2*f,n[11]=0,n[12]=(t+e)*c,n[13]=(s+r)*a,n[14]=(o+i)*f,n[15]=1,n}var $n=Fr;function Gn(n,t,e,r){let s,i,o,c,a,f,h,l,p,m,x=t[0],M=t[1],d=t[2],E=r[0],L=r[1],g=r[2],y=e[0],T=e[1],A=e[2];return Math.abs(x-y)<1e-6&&Math.abs(M-T)<1e-6&&Math.abs(d-A)<1e-6?br(n):(l=x-y,p=M-T,m=d-A,s=1/Math.sqrt(l*l+p*p+m*m),l*=s,p*=s,m*=s,i=L*m-g*p,o=g*l-E*m,c=E*p-L*l,s=Math.sqrt(i*i+o*o+c*c),s?(s=1/s,i*=s,o*=s,c*=s):(i=0,o=0,c=0),a=p*c-m*o,f=m*i-l*c,h=l*o-p*i,s=Math.sqrt(a*a+f*f+h*h),s?(s=1/s,a*=s,f*=s,h*=s):(a=0,f=0,h=0),n[0]=i,n[1]=a,n[2]=l,n[3]=0,n[4]=o,n[5]=f,n[6]=p,n[7]=0,n[8]=c,n[9]=h,n[10]=m,n[11]=0,n[12]=-(i*x+o*M+c*d),n[13]=-(a*x+f*M+h*d),n[14]=-(l*x+p*M+m*d),n[15]=1,n)}function qr(){let n=new R(4);return R!=Float32Array&&(n[0]=0,n[1]=0,n[2]=0,n[3]=0),n}function Wn(n,t,e){return n[0]=t[0]+e[0],n[1]=t[1]+e[1],n[2]=t[2]+e[2],n[3]=t[3]+e[3],n}function Hn(n,t,e){return n[0]=t[0]*e,n[1]=t[1]*e,n[2]=t[2]*e,n[3]=t[3]*e,n}function Xn(n){let t=n[0],e=n[1],r=n[2],s=n[3];return Math.sqrt(t*t+e*e+r*r+s*s)}function jn(n){let t=n[0],e=n[1],r=n[2],s=n[3];return t*t+e*e+r*r+s*s}function Qn(n,t){let e=t[0],r=t[1],s=t[2],i=t[3],o=e*e+r*r+s*s+i*i;return o>0&&(o=1/Math.sqrt(o)),n[0]=e*o,n[1]=r*o,n[2]=s*o,n[3]=i*o,n}function Kn(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]+n[3]*t[3]}function Zn(n,t,e,r){let s=t[0],i=t[1],o=t[2],c=t[3];return n[0]=s+r*(e[0]-s),n[1]=i+r*(e[1]-i),n[2]=o+r*(e[2]-o),n[3]=c+r*(e[3]-c),n}function Jn(n,t,e){let r=t[0],s=t[1],i=t[2],o=t[3];return n[0]=e[0]*r+e[4]*s+e[8]*i+e[12]*o,n[1]=e[1]*r+e[5]*s+e[9]*i+e[13]*o,n[2]=e[2]*r+e[6]*s+e[10]*i+e[14]*o,n[3]=e[3]*r+e[7]*s+e[11]*i+e[15]*o,n}function te(n,t,e){let r=t[0],s=t[1],i=t[2],o=e[0],c=e[1],a=e[2],f=e[3],h=f*r+c*i-a*s,l=f*s+a*r-o*i,p=f*i+o*s-c*r,m=-o*r-c*s-a*i;return n[0]=h*f+m*-o+l*-a-p*-c,n[1]=l*f+m*-c+p*-o-h*-a,n[2]=p*f+m*-a+h*-c-l*-o,n[3]=t[3],n}var Xi=function(){let n=qr();return function(t,e,r,s,i,o){let c,a;for(e||(e=4),r||(r=0),s?a=Math.min(s*e+r,t.length):a=t.length,c=r;c<a;c+=e)n[0]=t[c],n[1]=t[c+1],n[2]=t[c+2],n[3]=t[c+3],i(n,n,o),t[c]=n[0],t[c+1]=n[1],t[c+2]=n[2],t[c+3]=n[3];return t}}();var Yt;(function(n){n[n.COL0ROW0=0]="COL0ROW0",n[n.COL0ROW1=1]="COL0ROW1",n[n.COL0ROW2=2]="COL0ROW2",n[n.COL0ROW3=3]="COL0ROW3",n[n.COL1ROW0=4]="COL1ROW0",n[n.COL1ROW1=5]="COL1ROW1",n[n.COL1ROW2=6]="COL1ROW2",n[n.COL1ROW3=7]="COL1ROW3",n[n.COL2ROW0=8]="COL2ROW0",n[n.COL2ROW1=9]="COL2ROW1",n[n.COL2ROW2=10]="COL2ROW2",n[n.COL2ROW3=11]="COL2ROW3",n[n.COL3ROW0=12]="COL3ROW0",n[n.COL3ROW1=13]="COL3ROW1",n[n.COL3ROW2=14]="COL3ROW2",n[n.COL3ROW3=15]="COL3ROW3"})(Yt||(Yt={}));var Cr=45*Math.PI/180,Vr=1,Ut=.1,Dt=500,Ur=Object.freeze([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]),z=class extends Tt{static get IDENTITY(){return Yr()}static get ZERO(){return Dr()}get ELEMENTS(){return 16}get RANK(){return 4}get INDICES(){return Yt}constructor(t){super(-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0),arguments.length===1&&Array.isArray(t)?this.copy(t):this.identity()}copy(t){return this[0]=t[0],this[1]=t[1],this[2]=t[2],this[3]=t[3],this[4]=t[4],this[5]=t[5],this[6]=t[6],this[7]=t[7],this[8]=t[8],this[9]=t[9],this[10]=t[10],this[11]=t[11],this[12]=t[12],this[13]=t[13],this[14]=t[14],this[15]=t[15],this.check()}set(t,e,r,s,i,o,c,a,f,h,l,p,m,x,M,d){return this[0]=t,this[1]=e,this[2]=r,this[3]=s,this[4]=i,this[5]=o,this[6]=c,this[7]=a,this[8]=f,this[9]=h,this[10]=l,this[11]=p,this[12]=m,this[13]=x,this[14]=M,this[15]=d,this.check()}setRowMajor(t,e,r,s,i,o,c,a,f,h,l,p,m,x,M,d){return this[0]=t,this[1]=i,this[2]=f,this[3]=m,this[4]=e,this[5]=o,this[6]=h,this[7]=x,this[8]=r,this[9]=c,this[10]=l,this[11]=M,this[12]=s,this[13]=a,this[14]=p,this[15]=d,this.check()}toRowMajor(t){return t[0]=this[0],t[1]=this[4],t[2]=this[8],t[3]=this[12],t[4]=this[1],t[5]=this[5],t[6]=this[9],t[7]=this[13],t[8]=this[2],t[9]=this[6],t[10]=this[10],t[11]=this[14],t[12]=this[3],t[13]=this[7],t[14]=this[11],t[15]=this[15],t}identity(){return this.copy(Ur)}fromObject(t){return this.check()}fromQuaternion(t){return Un(this,t),this.check()}frustum(t){let{left:e,right:r,bottom:s,top:i,near:o=Ut,far:c=Dt}=t;return c===1/0?$r(this,e,r,s,i,o):Dn(this,e,r,s,i,o,c),this.check()}lookAt(t){let{eye:e,center:r=[0,0,0],up:s=[0,1,0]}=t;return Gn(this,e,r,s),this.check()}ortho(t){let{left:e,right:r,bottom:s,top:i,near:o=Ut,far:c=Dt}=t;return $n(this,e,r,s,i,o,c),this.check()}orthographic(t){let{fovy:e=Cr,aspect:r=Vr,focalDistance:s=1,near:i=Ut,far:o=Dt}=t;ne(e);let c=e/2,a=s*Math.tan(c),f=a*r;return this.ortho({left:-f,right:f,bottom:-a,top:a,near:i,far:o})}perspective(t){let{fovy:e=45*Math.PI/180,aspect:r=1,near:s=.1,far:i=500}=t;return ne(e),Yn(this,e,r,s,i),this.check()}determinant(){return bn(this)}getScale(t=[-0,-0,-0]){return t[0]=Math.sqrt(this[0]*this[0]+this[1]*this[1]+this[2]*this[2]),t[1]=Math.sqrt(this[4]*this[4]+this[5]*this[5]+this[6]*this[6]),t[2]=Math.sqrt(this[8]*this[8]+this[9]*this[9]+this[10]*this[10]),t}getTranslation(t=[-0,-0,-0]){return t[0]=this[12],t[1]=this[13],t[2]=this[14],t}getRotation(t,e){t=t||[-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0],e=e||[-0,-0,-0];let r=this.getScale(e),s=1/r[0],i=1/r[1],o=1/r[2];return t[0]=this[0]*s,t[1]=this[1]*i,t[2]=this[2]*o,t[3]=0,t[4]=this[4]*s,t[5]=this[5]*i,t[6]=this[6]*o,t[7]=0,t[8]=this[8]*s,t[9]=this[9]*i,t[10]=this[10]*o,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t}getRotationMatrix3(t,e){t=t||[-0,-0,-0,-0,-0,-0,-0,-0,-0],e=e||[-0,-0,-0];let r=this.getScale(e),s=1/r[0],i=1/r[1],o=1/r[2];return t[0]=this[0]*s,t[1]=this[1]*i,t[2]=this[2]*o,t[3]=this[4]*s,t[4]=this[5]*i,t[5]=this[6]*o,t[6]=this[8]*s,t[7]=this[9]*i,t[8]=this[10]*o,t}transpose(){return vn(this,this),this.check()}invert(){return kn(this,this),this.check()}multiplyLeft(t){return Vt(this,t,this),this.check()}multiplyRight(t){return Vt(this,this,t),this.check()}rotateX(t){return Bn(this,this,t),this.check()}rotateY(t){return Cn(this,this,t),this.check()}rotateZ(t){return Vn(this,this,t),this.check()}rotateXYZ(t){return this.rotateX(t[0]).rotateY(t[1]).rotateZ(t[2])}rotateAxis(t,e){return qn(this,this,t,e),this.check()}scale(t){return Fn(this,this,Array.isArray(t)?t:[t,t,t]),this.check()}translate(t){return zn(this,this,t),this.check()}transform(t,e){return t.length===4?(e=Jn(e||[-0,-0,-0,-0],t,this),$(e,4),e):this.transformAsPoint(t,e)}transformAsPoint(t,e){let{length:r}=t,s;switch(r){case 2:s=wn(e||[-0,-0],t,this);break;case 3:s=gt(e||[-0,-0,-0],t,this);break;default:throw new Error("Illegal vector")}return $(s,t.length),s}transformAsVector(t,e){let r;switch(t.length){case 2:r=Sn(e||[-0,-0],t,this);break;case 3:r=Ln(e||[-0,-0,-0],t,this);break;default:throw new Error("Illegal vector")}return $(r,t.length),r}transformPoint(t,e){return this.transformAsPoint(t,e)}transformVector(t,e){return this.transformAsPoint(t,e)}transformDirection(t,e){return this.transformAsVector(t,e)}makeRotationX(t){return this.identity().rotateX(t)}makeTranslation(t,e,r){return this.identity().translate([t,e,r])}},At,Et;function Dr(){return At||(At=new z([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]),Object.freeze(At)),At}function Yr(){return Et||(Et=new z,Object.freeze(Et)),Et}function ne(n){if(n>Math.PI*2)throw Error("expected radians")}function $r(n,t,e,r,s,i){let o=2*i/(e-t),c=2*i/(s-r),a=(e+t)/(e-t),f=(s+r)/(s-r),h=-1,l=-1,p=-2*i;return n[0]=o,n[1]=0,n[2]=0,n[3]=0,n[4]=0,n[5]=c,n[6]=0,n[7]=0,n[8]=a,n[9]=f,n[10]=h,n[11]=l,n[12]=0,n[13]=0,n[14]=p,n[15]=0,n}function ee(){let n=new R(4);return R!=Float32Array&&(n[0]=0,n[1]=0,n[2]=0),n[3]=1,n}function re(n){return n[0]=0,n[1]=0,n[2]=0,n[3]=1,n}function $t(n,t,e){e=e*.5;let r=Math.sin(e);return n[0]=r*t[0],n[1]=r*t[1],n[2]=r*t[2],n[3]=Math.cos(e),n}function Gt(n,t,e){let r=t[0],s=t[1],i=t[2],o=t[3],c=e[0],a=e[1],f=e[2],h=e[3];return n[0]=r*h+o*c+s*f-i*a,n[1]=s*h+o*a+i*c-r*f,n[2]=i*h+o*f+r*a-s*c,n[3]=o*h-r*c-s*a-i*f,n}function se(n,t,e){e*=.5;let r=t[0],s=t[1],i=t[2],o=t[3],c=Math.sin(e),a=Math.cos(e);return n[0]=r*a+o*c,n[1]=s*a+i*c,n[2]=i*a-s*c,n[3]=o*a-r*c,n}function ie(n,t,e){e*=.5;let r=t[0],s=t[1],i=t[2],o=t[3],c=Math.sin(e),a=Math.cos(e);return n[0]=r*a-i*c,n[1]=s*a+o*c,n[2]=i*a+r*c,n[3]=o*a-s*c,n}function oe(n,t,e){e*=.5;let r=t[0],s=t[1],i=t[2],o=t[3],c=Math.sin(e),a=Math.cos(e);return n[0]=r*a+s*c,n[1]=s*a-r*c,n[2]=i*a+o*c,n[3]=o*a-i*c,n}function ce(n,t){let e=t[0],r=t[1],s=t[2];return n[0]=e,n[1]=r,n[2]=s,n[3]=Math.sqrt(Math.abs(1-e*e-r*r-s*s)),n}function tt(n,t,e,r){let s=t[0],i=t[1],o=t[2],c=t[3],a=e[0],f=e[1],h=e[2],l=e[3],p,m,x,M,d;return p=s*a+i*f+o*h+c*l,p<0&&(p=-p,a=-a,f=-f,h=-h,l=-l),1-p>1e-6?(m=Math.acos(p),d=Math.sin(m),x=Math.sin((1-r)*m)/d,M=Math.sin(r*m)/d):(x=1-r,M=r),n[0]=x*s+M*a,n[1]=x*i+M*f,n[2]=x*o+M*h,n[3]=x*c+M*l,n}function ae(n,t){let e=t[0],r=t[1],s=t[2],i=t[3],o=e*e+r*r+s*s+i*i,c=o?1/o:0;return n[0]=-e*c,n[1]=-r*c,n[2]=-s*c,n[3]=i*c,n}function fe(n,t){return n[0]=-t[0],n[1]=-t[1],n[2]=-t[2],n[3]=t[3],n}function Wt(n,t){let e=t[0]+t[4]+t[8],r;if(e>0)r=Math.sqrt(e+1),n[3]=.5*r,r=.5/r,n[0]=(t[5]-t[7])*r,n[1]=(t[6]-t[2])*r,n[2]=(t[1]-t[3])*r;else{let s=0;t[4]>t[0]&&(s=1),t[8]>t[s*3+s]&&(s=2);let i=(s+1)%3,o=(s+2)%3;r=Math.sqrt(t[s*3+s]-t[i*3+i]-t[o*3+o]+1),n[s]=.5*r,r=.5/r,n[3]=(t[i*3+o]-t[o*3+i])*r,n[i]=(t[i*3+s]+t[s*3+i])*r,n[o]=(t[o*3+s]+t[s*3+o])*r}return n}var he=Wn;var le=Hn,pe=Kn,me=Zn,xe=Xn;var Me=jn;var de=Qn;var ge=function(){let n=Bt(),t=Ct(1,0,0),e=Ct(0,1,0);return function(r,s,i){let o=un(s,i);return o<-.999999?(dt(n,t,s),Pn(n)<1e-6&&dt(n,e,s),Nn(n,n),$t(r,n,Math.PI),r):o>.999999?(r[0]=0,r[1]=0,r[2]=0,r[3]=1,r):(dt(n,s,i),r[0]=n[0],r[1]=n[1],r[2]=n[2],r[3]=1+o,de(r,r))}}(),ao=function(){let n=ee(),t=ee();return function(e,r,s,i,o,c){return tt(n,r,o,c),tt(t,s,i,c),tt(e,n,t,2*c*(1-c)),e}}(),fo=function(){let n=In();return function(t,e,r,s){return n[0]=r[0],n[3]=r[1],n[6]=r[2],n[1]=s[0],n[4]=s[1],n[7]=s[2],n[2]=-e[0],n[5]=-e[1],n[8]=-e[2],de(t,Wt(t,n))}}();var Gr=[0,0,0,1],nt=class extends C{constructor(t=0,e=0,r=0,s=1){super(-0,-0,-0,-0),Array.isArray(t)&&arguments.length===1?this.copy(t):this.set(t,e,r,s)}copy(t){return this[0]=t[0],this[1]=t[1],this[2]=t[2],this[3]=t[3],this.check()}set(t,e,r,s){return this[0]=t,this[1]=e,this[2]=r,this[3]=s,this.check()}fromObject(t){return this[0]=t.x,this[1]=t.y,this[2]=t.z,this[3]=t.w,this.check()}fromMatrix3(t){return Wt(this,t),this.check()}fromAxisRotation(t,e){return $t(this,t,e),this.check()}identity(){return re(this),this.check()}setAxisAngle(t,e){return this.fromAxisRotation(t,e)}get ELEMENTS(){return 4}get x(){return this[0]}set x(t){this[0]=S(t)}get y(){return this[1]}set y(t){this[1]=S(t)}get z(){return this[2]}set z(t){this[2]=S(t)}get w(){return this[3]}set w(t){this[3]=S(t)}len(){return xe(this)}lengthSquared(){return Me(this)}dot(t){return pe(this,t)}rotationTo(t,e){return ge(this,t,e),this.check()}add(t){return he(this,this,t),this.check()}calculateW(){return ce(this,this),this.check()}conjugate(){return fe(this,this),this.check()}invert(){return ae(this,this),this.check()}lerp(t,e,r){return r===void 0?this.lerp(this,t,e):(me(this,t,e,r),this.check())}multiplyRight(t){return Gt(this,this,t),this.check()}multiplyLeft(t){return Gt(this,t,this),this.check()}normalize(){let t=this.len(),e=t>0?1/t:0;return this[0]=this[0]*e,this[1]=this[1]*e,this[2]=this[2]*e,this[3]=this[3]*e,t===0&&(this[3]=1),this.check()}rotateX(t){return se(this,this,t),this.check()}rotateY(t){return ie(this,this,t),this.check()}rotateZ(t){return oe(this,this,t),this.check()}scale(t){return le(this,this,t),this.check()}slerp(t,e,r){let s,i,o;switch(arguments.length){case 1:({start:s=Gr,target:i,ratio:o}=t);break;case 2:s=this,i=t,o=e;break;default:s=t,i=e,o=r}return tt(this,s,i,o),this.check()}transformVector4(t,e=new G){return te(e,t,this),$(e,4)}lengthSq(){return this.lengthSquared()}setFromAxisAngle(t,e){return this.setAxisAngle(t,e)}premultiply(t){return this.multiplyLeft(t)}multiply(t){return this.multiplyRight(t)}};function wt(n){let t=n.extensions?.KHR_lights_punctual?.lights;if(!t||!Array.isArray(t)||t.length===0)return[];let e=[];for(let r of n.nodes||[]){let s=r.extensions?.KHR_lights_punctual;if(!s||typeof s.light!="number")continue;let i=t[s.light];if(!i)continue;let o=i.color||[1,1,1],c=i.intensity??1,a=i.range;switch(i.type){case"directional":e.push(Wr(r,o,c));break;case"point":e.push(ye(r,o,c,a));break;case"spot":e.push(ye(r,o,c,a));break;default:break}}return e}function ye(n,t,e,r){let s=n.translation?[...n.translation]:[0,0,0],i=[1,0,0];return r!==void 0&&r>0&&(i=[1,0,1/(r*r)]),{type:"point",position:s,color:t,intensity:e,attenuation:i}}function Wr(n,t,e){let r=[0,0,-1];return n.rotation&&(r=new z().fromQuaternion(n.rotation).transformDirection([0,0,-1])),{type:"directional",direction:r,color:t,intensity:e}}var W=b(ct(),1);var U;(function(n){n[n.POINTS=0]="POINTS",n[n.LINES=1]="LINES",n[n.LINE_LOOP=2]="LINE_LOOP",n[n.LINE_STRIP=3]="LINE_STRIP",n[n.TRIANGLES=4]="TRIANGLES",n[n.TRIANGLE_STRIP=5]="TRIANGLE_STRIP",n[n.TRIANGLE_FAN=6]="TRIANGLE_FAN"})(U||(U={}));function Te(n){switch(n){case U.POINTS:return"point-list";case U.LINES:return"line-list";case U.LINE_STRIP:return"line-strip";case U.TRIANGLES:return"triangle-list";case U.TRIANGLE_STRIP:return"triangle-strip";default:throw new Error(String(n))}}var we=b(D(),1),Se=b(Ee(),1),St=b(ct(),1),Hr=`
8
8
  layout(0) positions: vec4; // in vec4 POSITION;
9
9
 
10
10
  #ifdef HAS_NORMALS
package/dist/index.cjs CHANGED
@@ -186,6 +186,8 @@ function parsePBRMaterial(device, material, attributes, options) {
186
186
  parsedMaterial.defines["HAS_TANGENTS"] = true;
187
187
  if (attributes["TEXCOORD_0"])
188
188
  parsedMaterial.defines["HAS_UV"] = true;
189
+ if (attributes["COLOR_0"])
190
+ parsedMaterial.defines["HAS_COLORS"] = true;
189
191
  if (options == null ? void 0 : options.imageBasedLightingEnvironment)
190
192
  parsedMaterial.defines["USE_IBL"] = true;
191
193
  if (options == null ? void 0 : options.lights)
@@ -265,6 +267,10 @@ function addTexture(device, gltfTexture, uniformName, define, parsedMaterial) {
265
267
  // default REPEAT S (U) wrapping mode.
266
268
  wrapT: 10497,
267
269
  // default REPEAT T (V) wrapping mode.
270
+ minFilter: 9729,
271
+ // default LINEAR filtering
272
+ magFilter: 9729,
273
+ // default LINEAR filtering
268
274
  ...(_a = gltfTexture == null ? void 0 : gltfTexture.texture) == null ? void 0 : _a.sampler
269
275
  };
270
276
  const texture = device.createTexture({
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts", "../src/pbr/pbr-environment.ts", "../src/parsers/parse-pbr-material.ts", "../src/webgl-to-webgpu/convert-webgl-sampler.ts", "../src/parsers/parse-gltf-lights.ts", "../src/parsers/parse-gltf.ts", "../src/webgl-to-webgpu/convert-webgl-topology.ts", "../src/gltf/create-gltf-model.ts", "../src/gltf/gltf-animator.ts", "../src/gltf/animations/interpolate.ts", "../src/webgl-to-webgpu/convert-webgl-attribute.ts", "../src/parsers/parse-gltf-animations.ts", "../src/utils/deep-copy.ts", "../src/gltf/create-scenegraph-from-gltf.ts"],
4
- "sourcesContent": ["// luma.gl, MIT license\n\nexport {loadPBREnvironment, type PBREnvironment} from './pbr/pbr-environment';\nexport {type ParsedPBRMaterial} from './pbr/pbr-material';\nexport {parsePBRMaterial, type ParsePBRMaterialOptions} from './parsers/parse-pbr-material';\nexport {} from './pbr/pbr-environment';\nexport {parseGLTFLights} from './parsers/parse-gltf-lights';\n\n// glTF Scenegraph Instantiator\nexport {createScenegraphsFromGLTF} from './gltf/create-scenegraph-from-gltf';\nexport {GLTFAnimator} from './gltf/gltf-animator';\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {Device, SamplerProps} from '@luma.gl/core';\nimport {DynamicTexture} from '@luma.gl/engine';\nimport {loadImageTexture} from '@loaders.gl/textures';\n\n/** Environment textures for PBR module */\nexport type PBREnvironment = {\n /** Bi-directional Reflectance Distribution Function (BRDF) lookup table */\n brdfLutTexture: DynamicTexture;\n diffuseEnvSampler: DynamicTexture;\n specularEnvSampler: DynamicTexture;\n};\n\nexport type PBREnvironmentProps = {\n brdfLutUrl: string;\n getTexUrl: (name: string, dir: number, level: number) => string;\n specularMipLevels?: number;\n};\n\n/** Loads textures for PBR environment */\nexport function loadPBREnvironment(device: Device, props: PBREnvironmentProps): PBREnvironment {\n const brdfLutTexture = new DynamicTexture(device, {\n id: 'brdfLUT',\n sampler: {\n addressModeU: 'clamp-to-edge',\n addressModeV: 'clamp-to-edge',\n minFilter: 'linear',\n magFilter: 'linear'\n } as const satisfies SamplerProps,\n // Texture accepts a promise that returns an image as data (Async Textures)\n data: loadImageTexture(props.brdfLutUrl)\n });\n\n const diffuseEnvSampler = makeCube(device, {\n id: 'DiffuseEnvSampler',\n getTextureForFace: dir => loadImageTexture(props.getTexUrl('diffuse', dir, 0)),\n sampler: {\n addressModeU: 'clamp-to-edge',\n addressModeV: 'clamp-to-edge',\n minFilter: 'linear',\n magFilter: 'linear'\n } as const satisfies SamplerProps\n });\n\n const specularEnvSampler = makeCube(device, {\n id: 'SpecularEnvSampler',\n getTextureForFace: (dir: number) => {\n const imageArray: Promise<any>[] = [];\n // @ts-ignore\n for (let lod = 0; lod <= props.specularMipLevels - 1; lod++) {\n imageArray.push(loadImageTexture(props.getTexUrl('specular', dir, lod)));\n }\n return imageArray;\n },\n sampler: {\n addressModeU: 'clamp-to-edge',\n addressModeV: 'clamp-to-edge',\n minFilter: 'linear', // [GL.TEXTURE_MIN_FILTER]: GL.LINEAR_MIPMAP_LINEAR,\n magFilter: 'linear'\n } as const satisfies SamplerProps\n });\n\n return {\n brdfLutTexture,\n diffuseEnvSampler,\n specularEnvSampler\n };\n}\n\n// TODO put somewhere common\nconst FACES = [0, 1, 2, 3, 4, 5];\n\nfunction makeCube(\n device: Device,\n {\n id,\n getTextureForFace,\n sampler\n }: {\n id: string;\n getTextureForFace: (dir: number) => Promise<any> | Promise<any>[];\n sampler: SamplerProps;\n }\n): DynamicTexture {\n const data = {};\n FACES.forEach(face => {\n // @ts-ignore TODO\n data[String(face)] = getTextureForFace(face);\n });\n return new DynamicTexture(device, {\n id,\n dimension: 'cube',\n mipmaps: false,\n sampler,\n // @ts-expect-error\n data\n });\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {Device, Texture} from '@luma.gl/core';\nimport {GL} from '@luma.gl/constants';\n\nimport {log} from '@luma.gl/core';\nimport {type ParsedPBRMaterial} from '../pbr/pbr-material';\nimport {type PBREnvironment} from '../pbr/pbr-environment';\nimport {type PBRMaterialBindings} from '@luma.gl/shadertools';\nimport {convertSampler} from '../webgl-to-webgpu/convert-webgl-sampler';\n\n// TODO - synchronize the GLTF... types with loaders.gl\n// TODO - remove the glParameters, use only parameters\n\n/* eslint-disable camelcase */\n\ntype GLTFTexture = {\n id: string;\n texture: {source: {image: any}; sampler: {parameters: any}};\n uniformName?: string;\n // is this on all textures?\n scale?: number;\n // is this on all textures?\n strength?: number;\n};\n\ntype GLTFPBRMetallicRoughness = {\n baseColorTexture?: GLTFTexture;\n baseColorFactor?: [number, number, number, number];\n metallicRoughnessTexture?: GLTFTexture;\n metallicFactor?: number;\n roughnessFactor?: number;\n};\n\ntype GLTFPBRMaterial = {\n unlit?: boolean;\n pbrMetallicRoughness?: GLTFPBRMetallicRoughness;\n normalTexture?: GLTFTexture;\n occlusionTexture?: GLTFTexture;\n emissiveTexture?: GLTFTexture;\n emissiveFactor?: [number, number, number];\n alphaMode?: 'MASK' | 'BLEND';\n alphaCutoff?: number;\n};\n\nexport type ParsePBRMaterialOptions = {\n /** Debug PBR shader */\n pbrDebug?: boolean;\n /** Enable lights */\n lights?: any;\n /** Use tangents */\n useTangents?: boolean;\n /** provide an image based (texture cube) lighting environment */\n imageBasedLightingEnvironment?: PBREnvironment;\n};\n\n/**\n * Parses a GLTF material definition into uniforms and parameters for the PBR shader module\n */\nexport function parsePBRMaterial(\n device: Device,\n material: GLTFPBRMaterial,\n attributes: Record<string, any>,\n options: ParsePBRMaterialOptions\n): ParsedPBRMaterial {\n const parsedMaterial: ParsedPBRMaterial = {\n defines: {\n // TODO: Use EXT_sRGB if available (Standard in WebGL 2.0)\n MANUAL_SRGB: true,\n SRGB_FAST_APPROXIMATION: true\n },\n bindings: {},\n uniforms: {\n // TODO: find better values?\n camera: [0, 0, 0], // Model should override\n\n metallicRoughnessValues: [1, 1] // Default is 1 and 1\n },\n parameters: {},\n glParameters: {},\n generatedTextures: []\n };\n\n // TODO - always available\n parsedMaterial.defines['USE_TEX_LOD'] = true;\n\n const {imageBasedLightingEnvironment} = options;\n if (imageBasedLightingEnvironment) {\n parsedMaterial.bindings.pbr_diffuseEnvSampler =\n imageBasedLightingEnvironment.diffuseEnvSampler.texture;\n parsedMaterial.bindings.pbr_specularEnvSampler =\n imageBasedLightingEnvironment.specularEnvSampler.texture;\n parsedMaterial.bindings.pbr_BrdfLUT = imageBasedLightingEnvironment.brdfLutTexture.texture;\n parsedMaterial.uniforms.scaleIBLAmbient = [1, 1];\n }\n\n if (options?.pbrDebug) {\n parsedMaterial.defines['PBR_DEBUG'] = true;\n // Override final color for reference app visualization of various parameters in the lighting equation.\n parsedMaterial.uniforms.scaleDiffBaseMR = [0, 0, 0, 0];\n parsedMaterial.uniforms.scaleFGDSpec = [0, 0, 0, 0];\n }\n\n if (attributes['NORMAL']) parsedMaterial.defines['HAS_NORMALS'] = true;\n if (attributes['TANGENT'] && options?.useTangents) parsedMaterial.defines['HAS_TANGENTS'] = true;\n if (attributes['TEXCOORD_0']) parsedMaterial.defines['HAS_UV'] = true;\n\n if (options?.imageBasedLightingEnvironment) parsedMaterial.defines['USE_IBL'] = true;\n if (options?.lights) parsedMaterial.defines['USE_LIGHTS'] = true;\n\n if (material) {\n parseMaterial(device, material, parsedMaterial);\n }\n\n return parsedMaterial;\n}\n\n/** Parse GLTF material record */\nfunction parseMaterial(\n device: Device,\n material: GLTFPBRMaterial,\n parsedMaterial: ParsedPBRMaterial\n): void {\n parsedMaterial.uniforms.unlit = Boolean(material.unlit);\n\n if (material.pbrMetallicRoughness) {\n parsePbrMetallicRoughness(device, material.pbrMetallicRoughness, parsedMaterial);\n }\n if (material.normalTexture) {\n addTexture(\n device,\n material.normalTexture,\n 'pbr_normalSampler',\n 'HAS_NORMALMAP',\n parsedMaterial\n );\n\n const {scale = 1} = material.normalTexture;\n parsedMaterial.uniforms.normalScale = scale;\n }\n if (material.occlusionTexture) {\n addTexture(\n device,\n material.occlusionTexture,\n 'pbr_occlusionSampler',\n 'HAS_OCCLUSIONMAP',\n parsedMaterial\n );\n\n const {strength = 1} = material.occlusionTexture;\n parsedMaterial.uniforms.occlusionStrength = strength;\n }\n if (material.emissiveTexture) {\n addTexture(\n device,\n material.emissiveTexture,\n 'pbr_emissiveSampler',\n 'HAS_EMISSIVEMAP',\n parsedMaterial\n );\n parsedMaterial.uniforms.emissiveFactor = material.emissiveFactor || [0, 0, 0];\n }\n\n switch (material.alphaMode || 'MASK') {\n case 'MASK':\n const {alphaCutoff = 0.5} = material;\n parsedMaterial.defines['ALPHA_CUTOFF'] = true;\n parsedMaterial.uniforms.alphaCutoff = alphaCutoff;\n break;\n case 'BLEND':\n log.warn('glTF BLEND alphaMode might not work well because it requires mesh sorting')();\n\n // WebGPU style parameters\n parsedMaterial.parameters.blend = true;\n\n parsedMaterial.parameters.blendColorOperation = 'add';\n parsedMaterial.parameters.blendColorSrcFactor = 'src-alpha';\n parsedMaterial.parameters.blendColorDstFactor = 'one-minus-src-alpha';\n\n parsedMaterial.parameters.blendAlphaOperation = 'add';\n parsedMaterial.parameters.blendAlphaSrcFactor = 'one';\n parsedMaterial.parameters.blendAlphaDstFactor = 'one-minus-src-alpha';\n\n // GL parameters\n // TODO - remove in favor of parameters\n parsedMaterial.glParameters['blend'] = true;\n parsedMaterial.glParameters['blendEquation'] = GL.FUNC_ADD;\n parsedMaterial.glParameters['blendFunc'] = [\n GL.SRC_ALPHA,\n GL.ONE_MINUS_SRC_ALPHA,\n GL.ONE,\n GL.ONE_MINUS_SRC_ALPHA\n ];\n\n break;\n }\n}\n\n/** Parse GLTF material sub record */\nfunction parsePbrMetallicRoughness(\n device: Device,\n pbrMetallicRoughness: GLTFPBRMetallicRoughness,\n parsedMaterial: ParsedPBRMaterial\n): void {\n if (pbrMetallicRoughness.baseColorTexture) {\n addTexture(\n device,\n pbrMetallicRoughness.baseColorTexture,\n 'pbr_baseColorSampler',\n 'HAS_BASECOLORMAP',\n parsedMaterial\n );\n }\n parsedMaterial.uniforms.baseColorFactor = pbrMetallicRoughness.baseColorFactor || [1, 1, 1, 1];\n\n if (pbrMetallicRoughness.metallicRoughnessTexture) {\n addTexture(\n device,\n pbrMetallicRoughness.metallicRoughnessTexture,\n 'pbr_metallicRoughnessSampler',\n 'HAS_METALROUGHNESSMAP',\n parsedMaterial\n );\n }\n const {metallicFactor = 1, roughnessFactor = 1} = pbrMetallicRoughness;\n parsedMaterial.uniforms.metallicRoughnessValues = [metallicFactor, roughnessFactor];\n}\n\n/** Create a texture from a glTF texture/sampler/image combo and add it to bindings */\nfunction addTexture(\n device: Device,\n gltfTexture: GLTFTexture,\n uniformName: keyof PBRMaterialBindings,\n define: string,\n parsedMaterial: ParsedPBRMaterial\n): void {\n const image = gltfTexture.texture.source.image;\n let textureOptions;\n\n if (image.compressed) {\n textureOptions = image;\n } else {\n // Texture2D accepts a promise that returns an image as data (Async Textures)\n textureOptions = {data: image};\n }\n\n const gltfSampler = {\n wrapS: 10497, // default REPEAT S (U) wrapping mode.\n wrapT: 10497, // default REPEAT T (V) wrapping mode.\n ...gltfTexture?.texture?.sampler\n } as any;\n\n const texture: Texture = device.createTexture({\n id: gltfTexture.uniformName || gltfTexture.id,\n sampler: convertSampler(gltfSampler),\n ...textureOptions\n });\n\n parsedMaterial.bindings[uniformName] = texture;\n if (define) parsedMaterial.defines[define] = true;\n parsedMaterial.generatedTextures.push(texture);\n}\n\n/*\n/**\n * Parses a GLTF material definition into uniforms and parameters for the PBR shader module\n *\nexport class PBRMaterialParser {\n readonly device: Device;\n\n readonly defines: Record<string, boolean>;\n readonly bindings: Record<string, Binding>;\n readonly uniforms: Record<string, any>;\n readonly parameters: Record<string, any>;\n\n /** Hold on to generated textures, we destroy them in the destroy method *\n readonly generatedTextures: Texture[];\n\n constructor(device: Device, props: PBRMaterialParserProps) {\n const {attributes, material, pbrDebug, imageBasedLightingEnvironment, lights, useTangents} =\n props;\n this.device = device;\n\n this.defines = {\n // TODO: Use EXT_sRGB if available (Standard in WebGL 2.0)\n MANUAL_SRGB: true,\n SRGB_FAST_APPROXIMATION: true\n };\n\n if (this.device.features.has('glsl-texture-lod')) {\n this.defines.USE_TEX_LOD = true;\n }\n\n this.uniforms = {\n // TODO: find better values?\n camera: [0, 0, 0], // Model should override\n\n metallicRoughnessValues: [1, 1] // Default is 1 and 1\n };\n\n this.bindings = {};\n\n this.parameters = {};\n this.generatedTextures = [];\n\n if (imageBasedLightingEnvironment) {\n this.bindings.pbr_diffuseEnvSampler = imageBasedLightingEnvironment.getDiffuseEnvSampler();\n this.bindings.pbr_specularEnvSampler = imageBasedLightingEnvironment.getSpecularEnvSampler();\n this.bindings.pbr_BrdfLUT = imageBasedLightingEnvironment.getBrdfTexture();\n this.uniforms.scaleIBLAmbient = [1, 1];\n }\n\n if (pbrDebug) {\n // Override final color for reference app visualization\n // of various parameters in the lighting equation.\n this.uniforms.scaleDiffBaseMR = [0, 0, 0, 0];\n this.uniforms.scaleFGDSpec = [0, 0, 0, 0];\n }\n\n this.defineIfPresent(attributes.NORMAL, 'HAS_NORMALS');\n this.defineIfPresent(attributes.TANGENT && useTangents, 'HAS_TANGENTS');\n this.defineIfPresent(attributes.TEXCOORD_0, 'HAS_UV');\n\n this.defineIfPresent(imageBasedLightingEnvironment, 'USE_IBL');\n this.defineIfPresent(lights, 'USE_LIGHTS');\n this.defineIfPresent(pbrDebug, 'PBR_DEBUG');\n\n if (material) {\n this.parseMaterial(material);\n }\n }\n\n /**\n * Destroy all generated resources to release memory.\n *\n destroy(): void {\n this.generatedTextures.forEach(texture => texture.destroy());\n }\n\n /** Add a define if the the value is non-nullish *\n defineIfPresent(value: unknown, name: string): void {\n if (value) {\n this.defines[name] = 1;\n }\n }\n\n /** Parse GLTF material record *\n parseMaterial(material) {\n this.uniforms.unlit = Boolean(material.unlit);\n\n if (material.pbrMetallicRoughness) {\n this.parsePbrMetallicRoughness(material.pbrMetallicRoughness);\n }\n if (material.normalTexture) {\n this.addTexture(material.normalTexture, 'pbr_normalSampler', 'HAS_NORMALMAP');\n\n const {scale = 1} = material.normalTexture;\n this.uniforms.normalScale = scale;\n }\n if (material.occlusionTexture) {\n this.addTexture(material.occlusionTexture, 'pbr_occlusionSampler', 'HAS_OCCLUSIONMAP');\n\n const {strength = 1} = material.occlusionTexture;\n this.uniforms.occlusionStrength = strength;\n }\n if (material.emissiveTexture) {\n this.addTexture(material.emissiveTexture, 'pbr_emissiveSampler', 'HAS_EMISSIVEMAP');\n this.uniforms.emissiveFactor = material.emissiveFactor || [0, 0, 0];\n }\n if (material.alphaMode === 'MASK') {\n const {alphaCutoff = 0.5} = material;\n this.defines.ALPHA_CUTOFF = true;\n this.uniforms.u_AlphaCutoff = alphaCutoff;\n } else if (material.alphaMode === 'BLEND') {\n log.warn('BLEND alphaMode might not work well because it requires mesh sorting')();\n Object.assign(this.parameters, {\n blend: true,\n blendEquation: GL.FUNC_ADD,\n blendFunc: [GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA]\n });\n }\n }\n\n /** Parse GLTF material sub record *\n parsePbrMetallicRoughness(pbrMetallicRoughness) {\n if (pbrMetallicRoughness.baseColorTexture) {\n this.addTexture(\n pbrMetallicRoughness.baseColorTexture,\n 'pbr_baseColorSampler',\n 'HAS_BASECOLORMAP'\n );\n }\n this.uniforms.baseColorFactor = pbrMetallicRoughness.baseColorFactor || [1, 1, 1, 1];\n\n if (pbrMetallicRoughness.metallicRoughnessTexture) {\n this.addTexture(\n pbrMetallicRoughness.metallicRoughnessTexture,\n 'pbr_metallicRoughnessSampler',\n 'HAS_METALROUGHNESSMAP'\n );\n }\n const {metallicFactor = 1, roughnessFactor = 1} = pbrMetallicRoughness;\n this.uniforms.metallicRoughnessValues = [metallicFactor, roughnessFactor];\n }\n\n /** Create a texture from a glTF texture/sampler/image combo and add it to bindings *\n addTexture(gltfTexture, name, define = null) {\n const parameters = gltfTexture?.texture?.sampler?.parameters || {};\n\n const image = gltfTexture.texture.source.image;\n let textureOptions;\n let specialTextureParameters = {};\n if (image.compressed) {\n textureOptions = image;\n specialTextureParameters = {\n [GL.TEXTURE_MIN_FILTER]: image.data.length > 1 ? GL.LINEAR_MIPMAP_NEAREST : GL.LINEAR\n };\n } else {\n // Texture2D accepts a promise that returns an image as data (Async Textures)\n textureOptions = {data: image};\n }\n\n const texture: Texture = this.device.createTexture({\n id: gltfTexture.name || gltfTexture.id,\n parameters: {\n ...parameters,\n ...specialTextureParameters\n },\n pixelStore: {\n [GL.UNPACK_FLIP_Y_WEBGL]: false\n },\n ...textureOptions\n });\n this.bindings[name] = texture;\n this.defineIfPresent(define, define);\n this.generatedTextures.push(texture);\n }\n}\n*/\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// TODO: convert in loaders.gl?\n\nimport type {SamplerProps} from '@luma.gl/core';\nimport {GL} from '@luma.gl/constants';\n\ntype GLTFSampler = {\n wrapS?: GL.CLAMP_TO_EDGE | GL.REPEAT | GL.MIRRORED_REPEAT;\n wrapT?: GL.CLAMP_TO_EDGE | GL.REPEAT | GL.MIRRORED_REPEAT;\n magFilter?: GL.NEAREST | GL.LINEAR;\n minFilter?:\n | GL.NEAREST\n | GL.LINEAR\n | GL.NEAREST_MIPMAP_NEAREST\n | GL.LINEAR_MIPMAP_NEAREST\n | GL.NEAREST_MIPMAP_LINEAR\n | GL.LINEAR_MIPMAP_LINEAR;\n};\n\nexport function convertSampler(gltfSampler: GLTFSampler): SamplerProps {\n return {\n addressModeU: convertSamplerWrapMode(gltfSampler.wrapS),\n addressModeV: convertSamplerWrapMode(gltfSampler.wrapT),\n magFilter: convertSamplerMagFilter(gltfSampler.magFilter),\n ...convertSamplerMinFilter(gltfSampler.minFilter)\n };\n}\n\nfunction convertSamplerWrapMode(\n mode: GL.CLAMP_TO_EDGE | GL.REPEAT | GL.MIRRORED_REPEAT | undefined\n): 'clamp-to-edge' | 'repeat' | 'mirror-repeat' | undefined {\n switch (mode) {\n case GL.CLAMP_TO_EDGE:\n return 'clamp-to-edge';\n case GL.REPEAT:\n return 'repeat';\n case GL.MIRRORED_REPEAT:\n return 'mirror-repeat';\n default:\n return undefined;\n }\n}\n\nfunction convertSamplerMagFilter(\n mode: GL.NEAREST | GL.LINEAR | undefined\n): 'nearest' | 'linear' | undefined {\n switch (mode) {\n case GL.NEAREST:\n return 'nearest';\n case GL.LINEAR:\n return 'linear';\n default:\n return undefined;\n }\n}\n\nfunction convertSamplerMinFilter(\n mode:\n | GL.NEAREST\n | GL.LINEAR\n | GL.NEAREST_MIPMAP_NEAREST\n | GL.LINEAR_MIPMAP_NEAREST\n | GL.NEAREST_MIPMAP_LINEAR\n | GL.LINEAR_MIPMAP_LINEAR\n | undefined\n): {minFilter?: 'nearest' | 'linear'; mipmapFilter?: 'nearest' | 'linear'} {\n switch (mode) {\n case GL.NEAREST:\n return {minFilter: 'nearest'};\n case GL.LINEAR:\n return {minFilter: 'linear'};\n case GL.NEAREST_MIPMAP_NEAREST:\n return {minFilter: 'nearest', mipmapFilter: 'nearest'};\n case GL.LINEAR_MIPMAP_NEAREST:\n return {minFilter: 'linear', mipmapFilter: 'nearest'};\n case GL.NEAREST_MIPMAP_LINEAR:\n return {minFilter: 'nearest', mipmapFilter: 'linear'};\n case GL.LINEAR_MIPMAP_LINEAR:\n return {minFilter: 'linear', mipmapFilter: 'linear'};\n default:\n return {};\n }\n}\n", "import {Matrix4} from '@math.gl/core';\nimport type {GLTFNodePostprocessed, GLTFPostprocessed} from '@loaders.gl/gltf';\nimport type {DirectionalLight, Light, PointLight} from '@luma.gl/shadertools';\n\n/** Parse KHR_lights_punctual extension into luma.gl light definitions */\nexport function parseGLTFLights(gltf: GLTFPostprocessed): Light[] {\n const lightDefs = gltf.extensions?.['KHR_lights_punctual']?.['lights'];\n if (!lightDefs || !Array.isArray(lightDefs) || lightDefs.length === 0) {\n return [];\n }\n\n const lights: Light[] = [];\n\n for (const node of gltf.nodes || []) {\n const nodeLight = node.extensions?.KHR_lights_punctual;\n if (!nodeLight || typeof nodeLight.light !== 'number') {\n // eslint-disable-next-line no-continue\n continue;\n }\n const gltfLight = lightDefs[nodeLight.light];\n if (!gltfLight) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n const color = (gltfLight.color || [1, 1, 1]) as [number, number, number];\n const intensity = gltfLight.intensity ?? 1;\n const range = gltfLight.range;\n\n switch (gltfLight.type) {\n case 'directional':\n lights.push(parseDirectionalLight(node, color, intensity));\n break;\n case 'point':\n lights.push(parsePointLight(node, color, intensity, range));\n break;\n case 'spot':\n lights.push(parsePointLight(node, color, intensity, range));\n break;\n default:\n // Unsupported light type\n break;\n }\n }\n\n return lights;\n}\n\nfunction parsePointLight(\n node: GLTFNodePostprocessed,\n color: [number, number, number],\n intensity: number,\n range?: number\n): PointLight {\n const position: Readonly<[number, number, number]> = node.translation\n ? ([...node.translation] as [number, number, number])\n : ([0, 0, 0] as [number, number, number]);\n\n let attenuation: Readonly<[number, number, number]> = [1, 0, 0];\n if (range !== undefined && range > 0) {\n attenuation = [1, 0, 1 / (range * range)] as [number, number, number];\n }\n\n return {\n type: 'point',\n position,\n color,\n intensity,\n attenuation\n };\n}\n\nfunction parseDirectionalLight(\n node: GLTFNodePostprocessed,\n color: [number, number, number],\n intensity: number\n): DirectionalLight {\n let direction: [number, number, number] = [0, 0, -1];\n\n if (node.rotation) {\n const orientation = new Matrix4().fromQuaternion(node.rotation);\n direction = orientation.transformDirection([0, 0, -1]) as [number, number, number];\n }\n\n return {\n type: 'directional',\n direction,\n color,\n intensity\n };\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {Device, type PrimitiveTopology} from '@luma.gl/core';\nimport {Geometry, GeometryAttribute, GroupNode, ModelNode, type ModelProps} from '@luma.gl/engine';\nimport {Matrix4} from '@math.gl/core';\nimport {\n type GLTFMeshPostprocessed,\n type GLTFNodePostprocessed,\n type GLTFPostprocessed\n} from '@loaders.gl/gltf';\nimport {type GLTFScenePostprocessed} from '@loaders.gl/gltf/dist/lib/types/gltf-postprocessed-schema';\n\nimport {type PBREnvironment} from '../pbr/pbr-environment';\nimport {convertGLDrawModeToTopology} from '../webgl-to-webgpu/convert-webgl-topology';\nimport {createGLTFModel} from '../gltf/create-gltf-model';\n\nimport {parsePBRMaterial} from './parse-pbr-material';\n\nexport type ParseGLTFOptions = {\n modelOptions?: Partial<ModelProps>;\n pbrDebug?: boolean;\n imageBasedLightingEnvironment?: PBREnvironment;\n lights?: boolean;\n useTangents?: boolean;\n};\n\nconst defaultOptions: Required<ParseGLTFOptions> = {\n modelOptions: {},\n pbrDebug: false,\n imageBasedLightingEnvironment: undefined!,\n lights: true,\n useTangents: false\n};\n\n/**\n * GLTF instantiator for luma.gl\n * Walks the parsed and resolved glTF structure and builds a luma.gl scenegraph\n */\nexport function parseGLTF(\n device: Device,\n gltf: GLTFPostprocessed,\n options_: ParseGLTFOptions = {}\n): GroupNode[] {\n const options = {...defaultOptions, ...options_};\n const sceneNodes = gltf.scenes.map(gltfScene =>\n createScene(device, gltfScene, gltf.nodes, options)\n );\n return sceneNodes;\n}\n\nfunction createScene(\n device: Device,\n gltfScene: GLTFScenePostprocessed,\n gltfNodes: GLTFNodePostprocessed[],\n options: Required<ParseGLTFOptions>\n): GroupNode {\n const gltfSceneNodes = gltfScene.nodes || [];\n const nodes = gltfSceneNodes.map(node => createNode(device, node, gltfNodes, options));\n const sceneNode = new GroupNode({\n id: gltfScene.name || gltfScene.id,\n children: nodes\n });\n return sceneNode;\n}\n\nfunction createNode(\n device: Device,\n gltfNode: GLTFNodePostprocessed & {_node?: GroupNode},\n gltfNodes: GLTFNodePostprocessed[],\n options: Required<ParseGLTFOptions>\n): GroupNode {\n if (!gltfNode._node) {\n const gltfChildren = gltfNode.children || [];\n const children = gltfChildren.map(child => createNode(device, child, gltfNodes, options));\n\n // Node can have children nodes and meshes at the same time\n if (gltfNode.mesh) {\n children.push(createMesh(device, gltfNode.mesh, options));\n }\n\n const node = new GroupNode({\n id: gltfNode.name || gltfNode.id,\n children\n });\n\n if (gltfNode.matrix) {\n node.setMatrix(gltfNode.matrix);\n } else {\n node.matrix.identity();\n\n if (gltfNode.translation) {\n node.matrix.translate(gltfNode.translation);\n }\n\n if (gltfNode.rotation) {\n const rotationMatrix = new Matrix4().fromQuaternion(gltfNode.rotation);\n node.matrix.multiplyRight(rotationMatrix);\n }\n\n if (gltfNode.scale) {\n node.matrix.scale(gltfNode.scale);\n }\n }\n gltfNode._node = node;\n }\n\n // Copy _node so that gltf-animator can access\n const topLevelNode = gltfNodes.find(node => node.id === gltfNode.id) as any;\n topLevelNode._node = gltfNode._node;\n\n return gltfNode._node;\n}\n\nfunction createMesh(\n device: Device,\n gltfMesh: GLTFMeshPostprocessed & {_mesh?: GroupNode},\n options: Required<ParseGLTFOptions>\n): GroupNode {\n // TODO: avoid changing the gltf\n if (!gltfMesh._mesh) {\n const gltfPrimitives = gltfMesh.primitives || [];\n const primitives = gltfPrimitives.map((gltfPrimitive, i) =>\n createPrimitive(device, gltfPrimitive, i, gltfMesh, options)\n );\n const mesh = new GroupNode({\n id: gltfMesh.name || gltfMesh.id,\n children: primitives\n });\n gltfMesh._mesh = mesh;\n }\n\n return gltfMesh._mesh;\n}\n\nfunction createPrimitive(\n device: Device,\n gltfPrimitive: any,\n i: number,\n gltfMesh: GLTFMeshPostprocessed,\n options: Required<ParseGLTFOptions>\n): ModelNode {\n const id = gltfPrimitive.name || `${gltfMesh.name || gltfMesh.id}-primitive-${i}`;\n const topology = convertGLDrawModeToTopology(gltfPrimitive.mode || 4);\n const vertexCount = gltfPrimitive.indices\n ? gltfPrimitive.indices.count\n : getVertexCount(gltfPrimitive.attributes);\n\n const geometry = createGeometry(id, gltfPrimitive, topology);\n\n const parsedPPBRMaterial = parsePBRMaterial(\n device,\n gltfPrimitive.material,\n geometry.attributes,\n options\n );\n\n const modelNode = createGLTFModel(device, {\n id,\n geometry: createGeometry(id, gltfPrimitive, topology),\n parsedPPBRMaterial,\n modelOptions: options.modelOptions,\n vertexCount\n });\n\n modelNode.bounds = [gltfPrimitive.attributes.POSITION.min, gltfPrimitive.attributes.POSITION.max];\n // TODO this holds on to all the CPU side texture and attribute data\n // modelNode.material = gltfPrimitive.material;\n\n return modelNode;\n}\n\nfunction getVertexCount(attributes: any) {\n throw new Error('getVertexCount not implemented');\n}\n\nfunction createGeometry(id: string, gltfPrimitive: any, topology: PrimitiveTopology): Geometry {\n const attributes: Record<string, GeometryAttribute> = {};\n for (const [attributeName, attribute] of Object.entries(gltfPrimitive.attributes)) {\n const {components, size, value} = attribute as GeometryAttribute;\n\n attributes[attributeName] = {size: size ?? components, value};\n }\n\n return new Geometry({\n id,\n topology,\n indices: gltfPrimitive.indices.value,\n attributes\n });\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {PrimitiveTopology} from '@luma.gl/core';\n\n// NOTE: Modules other than `@luma.gl/webgl` should not import `GL` from\n// `@luma.gl/constants`. Locally we use `GLEnum` instead of `GL` to avoid\n// conflicts with the `babel-plugin-inline-webgl-constants` plugin.\n// eslint-disable-next-line no-shadow\nexport enum GLEnum {\n POINTS = 0x0,\n LINES = 0x1,\n LINE_LOOP = 0x2,\n LINE_STRIP = 0x3,\n TRIANGLES = 0x4,\n TRIANGLE_STRIP = 0x5,\n TRIANGLE_FAN = 0x6\n}\n\nexport function convertGLDrawModeToTopology(\n drawMode:\n | GLEnum.POINTS\n | GLEnum.LINES\n | GLEnum.LINE_STRIP\n | GLEnum.LINE_LOOP\n | GLEnum.TRIANGLES\n | GLEnum.TRIANGLE_STRIP\n | GLEnum.TRIANGLE_FAN\n): PrimitiveTopology {\n // prettier-ignore\n switch (drawMode) {\n case GLEnum.POINTS: return 'point-list';\n case GLEnum.LINES: return 'line-list';\n case GLEnum.LINE_STRIP: return 'line-strip';\n case GLEnum.TRIANGLES: return 'triangle-list';\n case GLEnum.TRIANGLE_STRIP: return 'triangle-strip';\n default: throw new Error(String(drawMode));\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {Device, type RenderPipelineParameters, log} from '@luma.gl/core';\nimport {pbrMaterial, ShaderModule} from '@luma.gl/shadertools';\nimport {Geometry, Model, ModelNode, type ModelProps} from '@luma.gl/engine';\nimport {type ParsedPBRMaterial} from '../pbr/pbr-material';\n\nconst SHADER = /* WGSL */ `\nlayout(0) positions: vec4; // in vec4 POSITION;\n\n #ifdef HAS_NORMALS\n in vec4 normals; // in vec4 NORMAL;\n #endif\n\n #ifdef HAS_TANGENTS\n in vec4 TANGENT;\n #endif\n\n #ifdef HAS_UV\n // in vec2 TEXCOORD_0;\n in vec2 texCoords;\n #endif\n\n@vertex\n void main(void) {\n vec4 _NORMAL = vec4(0.);\n vec4 _TANGENT = vec4(0.);\n vec2 _TEXCOORD_0 = vec2(0.);\n\n #ifdef HAS_NORMALS\n _NORMAL = normals;\n #endif\n\n #ifdef HAS_TANGENTS\n _TANGENT = TANGENT;\n #endif\n\n #ifdef HAS_UV\n _TEXCOORD_0 = texCoords;\n #endif\n\n pbr_setPositionNormalTangentUV(positions, _NORMAL, _TANGENT, _TEXCOORD_0);\n gl_Position = u_MVPMatrix * positions;\n }\n\n@fragment\n out vec4 fragmentColor;\n\n void main(void) {\n vec3 pos = pbr_vPosition;\n fragmentColor = pbr_filterColor(vec4(1.0));\n }\n`;\n\n// TODO rename attributes to POSITION/NORMAL etc\n// See gpu-geometry.ts: getAttributeBuffersFromGeometry()\nconst vs = /* glsl */ `\\\n#version 300 es\n\n // in vec4 POSITION;\n in vec4 positions;\n\n #ifdef HAS_NORMALS\n // in vec4 NORMAL;\n in vec4 normals;\n #endif\n\n #ifdef HAS_TANGENTS\n in vec4 TANGENT;\n #endif\n\n #ifdef HAS_UV\n // in vec2 TEXCOORD_0;\n in vec2 texCoords;\n #endif\n\n void main(void) {\n vec4 _NORMAL = vec4(0.);\n vec4 _TANGENT = vec4(0.);\n vec2 _TEXCOORD_0 = vec2(0.);\n\n #ifdef HAS_NORMALS\n _NORMAL = normals;\n #endif\n\n #ifdef HAS_TANGENTS\n _TANGENT = TANGENT;\n #endif\n\n #ifdef HAS_UV\n _TEXCOORD_0 = texCoords;\n #endif\n\n pbr_setPositionNormalTangentUV(positions, _NORMAL, _TANGENT, _TEXCOORD_0);\n gl_Position = pbrProjection.modelViewProjectionMatrix * positions;\n }\n`;\n\nconst fs = /* glsl */ `\\\n#version 300 es\n out vec4 fragmentColor;\n\n void main(void) {\n vec3 pos = pbr_vPosition;\n fragmentColor = pbr_filterColor(vec4(1.0));\n }\n`;\n\nexport type CreateGLTFModelOptions = {\n id?: string;\n vertexCount?: number;\n geometry: Geometry;\n parsedPPBRMaterial: ParsedPBRMaterial;\n modelOptions?: Partial<ModelProps>;\n};\n\n/** Creates a luma.gl Model from GLTF data*/\nexport function createGLTFModel(device: Device, options: CreateGLTFModelOptions): ModelNode {\n const {id, geometry, parsedPPBRMaterial, vertexCount, modelOptions = {}} = options;\n\n log.info(4, 'createGLTFModel defines: ', parsedPPBRMaterial.defines)();\n\n // Calculate managedResources\n // TODO: Implement resource management logic that will\n // not deallocate resources/textures/buffers that are shared\n const managedResources: any[] = [];\n // managedResources.push(...parsedMaterial.generatedTextures);\n // managedResources.push(...Object.values(attributes).map((attribute) => attribute.buffer));\n\n const parameters: RenderPipelineParameters = {\n depthWriteEnabled: true,\n depthCompare: 'less',\n depthFormat: 'depth24plus',\n cullMode: 'back'\n };\n\n const modelProps: ModelProps = {\n id,\n source: SHADER,\n vs,\n fs,\n geometry,\n topology: geometry.topology,\n vertexCount,\n modules: [pbrMaterial as unknown as ShaderModule],\n ...modelOptions,\n\n defines: {...parsedPPBRMaterial.defines, ...modelOptions.defines},\n parameters: {...parameters, ...parsedPPBRMaterial.parameters, ...modelOptions.parameters}\n };\n\n const model = new Model(device, modelProps);\n\n const {camera, ...pbrMaterialProps} = {\n ...parsedPPBRMaterial.uniforms,\n ...modelOptions.uniforms,\n ...parsedPPBRMaterial.bindings,\n ...modelOptions.bindings\n };\n\n model.shaderInputs.setProps({pbrMaterial: pbrMaterialProps, pbrProjection: {camera}});\n return new ModelNode({managedResources, model});\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {GLTFNodePostprocessed} from '@loaders.gl/gltf';\nimport {log} from '@luma.gl/core';\nimport {GroupNode} from '@luma.gl/engine';\nimport {Matrix4} from '@math.gl/core';\nimport {GLTFAnimation} from './animations/animations';\nimport {interpolate} from './animations/interpolate';\n\ntype GLTFSingleAnimatorProps = {\n animation: GLTFAnimation;\n startTime?: number;\n playing?: boolean;\n speed?: number;\n};\n\nclass GLTFSingleAnimator {\n animation: GLTFAnimation;\n startTime: number = 0;\n playing: boolean = true;\n speed: number = 1;\n\n constructor(props: GLTFSingleAnimatorProps) {\n this.animation = props.animation;\n this.animation.name ||= 'unnamed';\n Object.assign(this, props);\n }\n\n setTime(timeMs: number) {\n if (!this.playing) {\n return;\n }\n\n const absTime = timeMs / 1000;\n const time = (absTime - this.startTime) * this.speed;\n\n this.animation.channels.forEach(({sampler, target, path}) => {\n interpolate(time, sampler, target, path);\n applyTranslationRotationScale(target, (target as any)._node as GroupNode);\n });\n }\n}\n\nexport type GLTFAnimatorProps = {\n animations: GLTFAnimation[];\n};\n\nexport class GLTFAnimator {\n animations: GLTFSingleAnimator[];\n\n constructor(props: GLTFAnimatorProps) {\n this.animations = props.animations.map((animation, index) => {\n const name = animation.name || `Animation-${index}`;\n return new GLTFSingleAnimator({\n animation: {name, channels: animation.channels}\n });\n });\n }\n\n /** @deprecated Use .setTime(). Will be removed (deck.gl is using this) */\n animate(time: number): void {\n log.warn('GLTFAnimator#animate is deprecated. Use GLTFAnimator#setTime instead')();\n this.setTime(time);\n }\n\n setTime(time: number): void {\n this.animations.forEach(animation => animation.setTime(time));\n }\n\n getAnimations() {\n return this.animations;\n }\n}\n\n// TODO: share with GLTFInstantiator\nconst scratchMatrix = new Matrix4();\n\nfunction applyTranslationRotationScale(gltfNode: GLTFNodePostprocessed, node: GroupNode) {\n node.matrix.identity();\n\n if (gltfNode.translation) {\n node.matrix.translate(gltfNode.translation);\n }\n\n if (gltfNode.rotation) {\n const rotationMatrix = scratchMatrix.fromQuaternion(gltfNode.rotation);\n node.matrix.multiplyRight(rotationMatrix);\n }\n\n if (gltfNode.scale) {\n node.matrix.scale(gltfNode.scale);\n }\n}\n", "import {GLTFNodePostprocessed} from '@loaders.gl/gltf';\nimport {log} from '@luma.gl/core';\nimport {Quaternion} from '@math.gl/core';\nimport {GLTFAnimationChannel, GLTFAnimationSampler} from './animations';\n\nconst scratchQuaternion = new Quaternion();\n\nexport function interpolate(\n time: number,\n {input, interpolation, output}: GLTFAnimationSampler,\n target: GLTFNodePostprocessed,\n path: GLTFAnimationChannel['path']\n) {\n const maxTime = input[input.length - 1];\n const animationTime = time % maxTime;\n\n const nextIndex = input.findIndex(t => t >= animationTime);\n const previousIndex = Math.max(0, nextIndex - 1);\n\n if (!Array.isArray(target[path])) {\n switch (path) {\n case 'translation':\n target[path] = [0, 0, 0];\n break;\n\n case 'rotation':\n target[path] = [0, 0, 0, 1];\n break;\n\n case 'scale':\n target[path] = [1, 1, 1];\n break;\n\n default:\n log.warn(`Bad animation path ${path}`)();\n }\n }\n\n // assert(target[path].length === output[previousIndex].length);\n const previousTime = input[previousIndex];\n const nextTime = input[nextIndex];\n\n switch (interpolation) {\n case 'STEP':\n stepInterpolate(target, path, output[previousIndex] as number[]);\n break;\n\n case 'LINEAR':\n if (nextTime > previousTime) {\n const ratio = (animationTime - previousTime) / (nextTime - previousTime);\n linearInterpolate(\n target,\n path,\n output[previousIndex] as number[],\n output[nextIndex] as number[],\n ratio\n );\n }\n break;\n\n case 'CUBICSPLINE':\n if (nextTime > previousTime) {\n const ratio = (animationTime - previousTime) / (nextTime - previousTime);\n const tDiff = nextTime - previousTime;\n\n const p0 = output[3 * previousIndex + 1] as number[];\n const outTangent0 = output[3 * previousIndex + 2] as number[];\n const inTangent1 = output[3 * nextIndex + 0] as number[];\n const p1 = output[3 * nextIndex + 1] as number[];\n\n cubicsplineInterpolate(target, path, {p0, outTangent0, inTangent1, p1, tDiff, ratio});\n }\n break;\n\n default:\n log.warn(`Interpolation ${interpolation} not supported`)();\n break;\n }\n}\n\nfunction linearInterpolate(\n target: GLTFNodePostprocessed,\n path: GLTFAnimationChannel['path'],\n start: number[],\n stop: number[],\n ratio: number\n) {\n if (!target[path]) {\n throw new Error();\n }\n\n if (path === 'rotation') {\n // SLERP when path is rotation\n scratchQuaternion.slerp({start, target: stop, ratio});\n for (let i = 0; i < scratchQuaternion.length; i++) {\n target[path][i] = scratchQuaternion[i];\n }\n } else {\n // regular interpolation\n for (let i = 0; i < start.length; i++) {\n target[path][i] = ratio * stop[i] + (1 - ratio) * start[i];\n }\n }\n}\n\nfunction cubicsplineInterpolate(\n target: GLTFNodePostprocessed,\n path: GLTFAnimationChannel['path'],\n {\n p0,\n outTangent0,\n inTangent1,\n p1,\n tDiff,\n ratio: t\n }: {\n p0: number[];\n outTangent0: number[];\n inTangent1: number[];\n p1: number[];\n tDiff: number;\n ratio: number;\n }\n) {\n if (!target[path]) {\n throw new Error();\n }\n\n // TODO: Quaternion might need normalization\n for (let i = 0; i < target[path].length; i++) {\n const m0 = outTangent0[i] * tDiff;\n const m1 = inTangent1[i] * tDiff;\n target[path][i] =\n (2 * Math.pow(t, 3) - 3 * Math.pow(t, 2) + 1) * p0[i] +\n (Math.pow(t, 3) - 2 * Math.pow(t, 2) + t) * m0 +\n (-2 * Math.pow(t, 3) + 3 * Math.pow(t, 2)) * p1[i] +\n (Math.pow(t, 3) - Math.pow(t, 2)) * m1;\n }\n}\n\nfunction stepInterpolate(\n target: GLTFNodePostprocessed,\n path: GLTFAnimationChannel['path'],\n value: number[]\n) {\n if (!target[path]) {\n throw new Error();\n }\n\n for (let i = 0; i < value.length; i++) {\n target[path][i] = value[i];\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// TODO: convert in loaders.gl?\nimport type {TypedArray} from '@math.gl/types';\n\nexport const ATTRIBUTE_TYPE_TO_COMPONENTS: Record<string, number> = {\n SCALAR: 1,\n VEC2: 2,\n VEC3: 3,\n VEC4: 4,\n MAT2: 4,\n MAT3: 9,\n MAT4: 16\n};\n\nexport const ATTRIBUTE_COMPONENT_TYPE_TO_ARRAY: Record<number, any> = {\n 5120: Int8Array,\n 5121: Uint8Array,\n 5122: Int16Array,\n 5123: Uint16Array,\n 5125: Uint32Array,\n 5126: Float32Array\n};\n\ntype GLTFAccessor = {\n componentType: number;\n type: string;\n count: number;\n bufferView?: {data: {buffer: ArrayBuffer; byteOffset?: number}};\n byteOffset?: number;\n};\n\nexport function accessorToTypedArray(accessor: GLTFAccessor): {\n typedArray: TypedArray;\n components: number;\n} {\n const ArrayType = ATTRIBUTE_COMPONENT_TYPE_TO_ARRAY[accessor.componentType];\n const components = ATTRIBUTE_TYPE_TO_COMPONENTS[accessor.type];\n const length = components * accessor.count;\n const {buffer, byteOffset = 0} = accessor.bufferView?.data ?? {};\n\n const typedArray = new ArrayType(buffer, byteOffset + (accessor.byteOffset || 0), length);\n\n return {typedArray, components};\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {type GLTFAccessorPostprocessed, type GLTFPostprocessed} from '@loaders.gl/gltf';\nimport {\n type GLTFAnimation,\n type GLTFAnimationChannel,\n type GLTFAnimationSampler\n} from '../gltf/animations/animations';\n\nimport {accessorToTypedArray} from '..//webgl-to-webgpu/convert-webgl-attribute';\n\nexport function parseGLTFAnimations(gltf: GLTFPostprocessed): GLTFAnimation[] {\n const gltfAnimations = gltf.animations || [];\n return gltfAnimations.map((animation, index) => {\n const name = animation.name || `Animation-${index}`;\n const samplers: GLTFAnimationSampler[] = animation.samplers.map(\n ({input, interpolation = 'LINEAR', output}) => ({\n input: accessorToJsArray(gltf.accessors[input]) as number[],\n interpolation,\n output: accessorToJsArray(gltf.accessors[output])\n })\n );\n const channels: GLTFAnimationChannel[] = animation.channels.map(({sampler, target}) => ({\n sampler: samplers[sampler],\n target: gltf.nodes[target.node ?? 0],\n path: target.path as GLTFAnimationChannel['path']\n }));\n return {name, channels};\n });\n}\n\n//\n\nfunction accessorToJsArray(\n accessor: GLTFAccessorPostprocessed & {_animation?: number[] | number[][]}\n): number[] | number[][] {\n if (!accessor._animation) {\n const {typedArray: array, components} = accessorToTypedArray(accessor);\n\n if (components === 1) {\n accessor._animation = Array.from(array);\n } else {\n // Slice array\n const slicedArray: number[][] = [];\n for (let i = 0; i < array.length; i += components) {\n slicedArray.push(Array.from(array.slice(i, i + components)));\n }\n accessor._animation = slicedArray;\n }\n }\n\n return accessor._animation;\n}\n", "/** Deeply copies a JS data structure */\nexport function deepCopy(object: any): any {\n // don't copy binary data\n if (\n ArrayBuffer.isView(object) ||\n object instanceof ArrayBuffer ||\n object instanceof ImageBitmap\n ) {\n return object;\n }\n if (Array.isArray(object)) {\n return object.map(deepCopy);\n }\n if (object && typeof object === 'object') {\n const result: typeof object = {};\n for (const key in object) {\n result[key] = deepCopy(object[key]);\n }\n return result;\n }\n return object;\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {Device} from '@luma.gl/core';\nimport {GroupNode} from '@luma.gl/engine';\nimport {GLTFPostprocessed} from '@loaders.gl/gltf';\nimport {Light} from '@luma.gl/shadertools';\nimport {parseGLTF, type ParseGLTFOptions} from '../parsers/parse-gltf';\nimport {parseGLTFLights} from '../parsers/parse-gltf-lights';\nimport {GLTFAnimator} from './gltf-animator';\nimport {parseGLTFAnimations} from '../parsers/parse-gltf-animations';\nimport {deepCopy} from '../utils/deep-copy';\n\nexport function createScenegraphsFromGLTF(\n device: Device,\n gltf: GLTFPostprocessed,\n options?: ParseGLTFOptions\n): {\n scenes: GroupNode[];\n animator: GLTFAnimator;\n lights: Light[];\n} {\n gltf = deepCopy(gltf);\n const scenes = parseGLTF(device, gltf, options);\n // Note: There is a nasty dependency on injected nodes in the glTF\n const animations = parseGLTFAnimations(gltf);\n const animator = new GLTFAnimator({animations});\n const lights = parseGLTFLights(gltf);\n return {scenes, animator, lights};\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["// luma.gl, MIT license\n\nexport {loadPBREnvironment, type PBREnvironment} from './pbr/pbr-environment';\nexport {type ParsedPBRMaterial} from './pbr/pbr-material';\nexport {parsePBRMaterial, type ParsePBRMaterialOptions} from './parsers/parse-pbr-material';\nexport {} from './pbr/pbr-environment';\nexport {parseGLTFLights} from './parsers/parse-gltf-lights';\n\n// glTF Scenegraph Instantiator\nexport {createScenegraphsFromGLTF} from './gltf/create-scenegraph-from-gltf';\nexport {GLTFAnimator} from './gltf/gltf-animator';\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {Device, SamplerProps} from '@luma.gl/core';\nimport {DynamicTexture} from '@luma.gl/engine';\nimport {loadImageTexture} from '@loaders.gl/textures';\n\n/** Environment textures for PBR module */\nexport type PBREnvironment = {\n /** Bi-directional Reflectance Distribution Function (BRDF) lookup table */\n brdfLutTexture: DynamicTexture;\n diffuseEnvSampler: DynamicTexture;\n specularEnvSampler: DynamicTexture;\n};\n\nexport type PBREnvironmentProps = {\n brdfLutUrl: string;\n getTexUrl: (name: string, dir: number, level: number) => string;\n specularMipLevels?: number;\n};\n\n/** Loads textures for PBR environment */\nexport function loadPBREnvironment(device: Device, props: PBREnvironmentProps): PBREnvironment {\n const brdfLutTexture = new DynamicTexture(device, {\n id: 'brdfLUT',\n sampler: {\n addressModeU: 'clamp-to-edge',\n addressModeV: 'clamp-to-edge',\n minFilter: 'linear',\n magFilter: 'linear'\n } as const satisfies SamplerProps,\n // Texture accepts a promise that returns an image as data (Async Textures)\n data: loadImageTexture(props.brdfLutUrl)\n });\n\n const diffuseEnvSampler = makeCube(device, {\n id: 'DiffuseEnvSampler',\n getTextureForFace: dir => loadImageTexture(props.getTexUrl('diffuse', dir, 0)),\n sampler: {\n addressModeU: 'clamp-to-edge',\n addressModeV: 'clamp-to-edge',\n minFilter: 'linear',\n magFilter: 'linear'\n } as const satisfies SamplerProps\n });\n\n const specularEnvSampler = makeCube(device, {\n id: 'SpecularEnvSampler',\n getTextureForFace: (dir: number) => {\n const imageArray: Promise<any>[] = [];\n // @ts-ignore\n for (let lod = 0; lod <= props.specularMipLevels - 1; lod++) {\n imageArray.push(loadImageTexture(props.getTexUrl('specular', dir, lod)));\n }\n return imageArray;\n },\n sampler: {\n addressModeU: 'clamp-to-edge',\n addressModeV: 'clamp-to-edge',\n minFilter: 'linear', // [GL.TEXTURE_MIN_FILTER]: GL.LINEAR_MIPMAP_LINEAR,\n magFilter: 'linear'\n } as const satisfies SamplerProps\n });\n\n return {\n brdfLutTexture,\n diffuseEnvSampler,\n specularEnvSampler\n };\n}\n\n// TODO put somewhere common\nconst FACES = [0, 1, 2, 3, 4, 5];\n\nfunction makeCube(\n device: Device,\n {\n id,\n getTextureForFace,\n sampler\n }: {\n id: string;\n getTextureForFace: (dir: number) => Promise<any> | Promise<any>[];\n sampler: SamplerProps;\n }\n): DynamicTexture {\n const data = {};\n FACES.forEach(face => {\n // @ts-ignore TODO\n data[String(face)] = getTextureForFace(face);\n });\n return new DynamicTexture(device, {\n id,\n dimension: 'cube',\n mipmaps: false,\n sampler,\n // @ts-expect-error\n data\n });\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {Device, Texture} from '@luma.gl/core';\nimport type {GLTFSampler} from '@loaders.gl/gltf';\nimport {GL} from '@luma.gl/constants';\n\nimport {log} from '@luma.gl/core';\nimport {type ParsedPBRMaterial} from '../pbr/pbr-material';\nimport {type PBREnvironment} from '../pbr/pbr-environment';\nimport {type PBRMaterialBindings} from '@luma.gl/shadertools';\nimport {convertSampler} from '../webgl-to-webgpu/convert-webgl-sampler';\n\n// TODO - synchronize the GLTF... types with loaders.gl\n// TODO - remove the glParameters, use only parameters\n\n/* eslint-disable camelcase */\n\ntype GLTFTexture = {\n id: string;\n texture: {source: {image: any}; sampler: {parameters: any}};\n uniformName?: string;\n // is this on all textures?\n scale?: number;\n // is this on all textures?\n strength?: number;\n};\n\ntype GLTFPBRMetallicRoughness = {\n baseColorTexture?: GLTFTexture;\n baseColorFactor?: [number, number, number, number];\n metallicRoughnessTexture?: GLTFTexture;\n metallicFactor?: number;\n roughnessFactor?: number;\n};\n\ntype GLTFPBRMaterial = {\n unlit?: boolean;\n pbrMetallicRoughness?: GLTFPBRMetallicRoughness;\n normalTexture?: GLTFTexture;\n occlusionTexture?: GLTFTexture;\n emissiveTexture?: GLTFTexture;\n emissiveFactor?: [number, number, number];\n alphaMode?: 'MASK' | 'BLEND';\n alphaCutoff?: number;\n};\n\nexport type ParsePBRMaterialOptions = {\n /** Debug PBR shader */\n pbrDebug?: boolean;\n /** Enable lights */\n lights?: any;\n /** Use tangents */\n useTangents?: boolean;\n /** provide an image based (texture cube) lighting environment */\n imageBasedLightingEnvironment?: PBREnvironment;\n};\n\n/**\n * Parses a GLTF material definition into uniforms and parameters for the PBR shader module\n */\nexport function parsePBRMaterial(\n device: Device,\n material: GLTFPBRMaterial,\n attributes: Record<string, any>,\n options: ParsePBRMaterialOptions\n): ParsedPBRMaterial {\n const parsedMaterial: ParsedPBRMaterial = {\n defines: {\n // TODO: Use EXT_sRGB if available (Standard in WebGL 2.0)\n MANUAL_SRGB: true,\n SRGB_FAST_APPROXIMATION: true\n },\n bindings: {},\n uniforms: {\n // TODO: find better values?\n camera: [0, 0, 0], // Model should override\n\n metallicRoughnessValues: [1, 1] // Default is 1 and 1\n },\n parameters: {},\n glParameters: {},\n generatedTextures: []\n };\n\n // TODO - always available\n parsedMaterial.defines['USE_TEX_LOD'] = true;\n\n const {imageBasedLightingEnvironment} = options;\n if (imageBasedLightingEnvironment) {\n parsedMaterial.bindings.pbr_diffuseEnvSampler =\n imageBasedLightingEnvironment.diffuseEnvSampler.texture;\n parsedMaterial.bindings.pbr_specularEnvSampler =\n imageBasedLightingEnvironment.specularEnvSampler.texture;\n parsedMaterial.bindings.pbr_BrdfLUT = imageBasedLightingEnvironment.brdfLutTexture.texture;\n parsedMaterial.uniforms.scaleIBLAmbient = [1, 1];\n }\n\n if (options?.pbrDebug) {\n parsedMaterial.defines['PBR_DEBUG'] = true;\n // Override final color for reference app visualization of various parameters in the lighting equation.\n parsedMaterial.uniforms.scaleDiffBaseMR = [0, 0, 0, 0];\n parsedMaterial.uniforms.scaleFGDSpec = [0, 0, 0, 0];\n }\n\n if (attributes['NORMAL']) parsedMaterial.defines['HAS_NORMALS'] = true;\n if (attributes['TANGENT'] && options?.useTangents) parsedMaterial.defines['HAS_TANGENTS'] = true;\n if (attributes['TEXCOORD_0']) parsedMaterial.defines['HAS_UV'] = true;\n if (attributes['COLOR_0']) parsedMaterial.defines['HAS_COLORS'] = true;\n\n if (options?.imageBasedLightingEnvironment) parsedMaterial.defines['USE_IBL'] = true;\n if (options?.lights) parsedMaterial.defines['USE_LIGHTS'] = true;\n\n if (material) {\n parseMaterial(device, material, parsedMaterial);\n }\n\n return parsedMaterial;\n}\n\n/** Parse GLTF material record */\nfunction parseMaterial(\n device: Device,\n material: GLTFPBRMaterial,\n parsedMaterial: ParsedPBRMaterial\n): void {\n parsedMaterial.uniforms.unlit = Boolean(material.unlit);\n\n if (material.pbrMetallicRoughness) {\n parsePbrMetallicRoughness(device, material.pbrMetallicRoughness, parsedMaterial);\n }\n if (material.normalTexture) {\n addTexture(\n device,\n material.normalTexture,\n 'pbr_normalSampler',\n 'HAS_NORMALMAP',\n parsedMaterial\n );\n\n const {scale = 1} = material.normalTexture;\n parsedMaterial.uniforms.normalScale = scale;\n }\n if (material.occlusionTexture) {\n addTexture(\n device,\n material.occlusionTexture,\n 'pbr_occlusionSampler',\n 'HAS_OCCLUSIONMAP',\n parsedMaterial\n );\n\n const {strength = 1} = material.occlusionTexture;\n parsedMaterial.uniforms.occlusionStrength = strength;\n }\n if (material.emissiveTexture) {\n addTexture(\n device,\n material.emissiveTexture,\n 'pbr_emissiveSampler',\n 'HAS_EMISSIVEMAP',\n parsedMaterial\n );\n parsedMaterial.uniforms.emissiveFactor = material.emissiveFactor || [0, 0, 0];\n }\n\n switch (material.alphaMode || 'MASK') {\n case 'MASK':\n const {alphaCutoff = 0.5} = material;\n parsedMaterial.defines['ALPHA_CUTOFF'] = true;\n parsedMaterial.uniforms.alphaCutoff = alphaCutoff;\n break;\n case 'BLEND':\n log.warn('glTF BLEND alphaMode might not work well because it requires mesh sorting')();\n\n // WebGPU style parameters\n parsedMaterial.parameters.blend = true;\n\n parsedMaterial.parameters.blendColorOperation = 'add';\n parsedMaterial.parameters.blendColorSrcFactor = 'src-alpha';\n parsedMaterial.parameters.blendColorDstFactor = 'one-minus-src-alpha';\n\n parsedMaterial.parameters.blendAlphaOperation = 'add';\n parsedMaterial.parameters.blendAlphaSrcFactor = 'one';\n parsedMaterial.parameters.blendAlphaDstFactor = 'one-minus-src-alpha';\n\n // GL parameters\n // TODO - remove in favor of parameters\n parsedMaterial.glParameters['blend'] = true;\n parsedMaterial.glParameters['blendEquation'] = GL.FUNC_ADD;\n parsedMaterial.glParameters['blendFunc'] = [\n GL.SRC_ALPHA,\n GL.ONE_MINUS_SRC_ALPHA,\n GL.ONE,\n GL.ONE_MINUS_SRC_ALPHA\n ];\n\n break;\n }\n}\n\n/** Parse GLTF material sub record */\nfunction parsePbrMetallicRoughness(\n device: Device,\n pbrMetallicRoughness: GLTFPBRMetallicRoughness,\n parsedMaterial: ParsedPBRMaterial\n): void {\n if (pbrMetallicRoughness.baseColorTexture) {\n addTexture(\n device,\n pbrMetallicRoughness.baseColorTexture,\n 'pbr_baseColorSampler',\n 'HAS_BASECOLORMAP',\n parsedMaterial\n );\n }\n parsedMaterial.uniforms.baseColorFactor = pbrMetallicRoughness.baseColorFactor || [1, 1, 1, 1];\n\n if (pbrMetallicRoughness.metallicRoughnessTexture) {\n addTexture(\n device,\n pbrMetallicRoughness.metallicRoughnessTexture,\n 'pbr_metallicRoughnessSampler',\n 'HAS_METALROUGHNESSMAP',\n parsedMaterial\n );\n }\n const {metallicFactor = 1, roughnessFactor = 1} = pbrMetallicRoughness;\n parsedMaterial.uniforms.metallicRoughnessValues = [metallicFactor, roughnessFactor];\n}\n\n/** Create a texture from a glTF texture/sampler/image combo and add it to bindings */\nfunction addTexture(\n device: Device,\n gltfTexture: GLTFTexture,\n uniformName: keyof PBRMaterialBindings,\n define: string,\n parsedMaterial: ParsedPBRMaterial\n): void {\n const image = gltfTexture.texture.source.image;\n let textureOptions;\n\n if (image.compressed) {\n textureOptions = image;\n } else {\n // Texture2D accepts a promise that returns an image as data (Async Textures)\n textureOptions = {data: image};\n }\n\n const gltfSampler = {\n wrapS: 10497, // default REPEAT S (U) wrapping mode.\n wrapT: 10497, // default REPEAT T (V) wrapping mode.\n minFilter: 9729, // default LINEAR filtering\n magFilter: 9729, // default LINEAR filtering\n ...gltfTexture?.texture?.sampler\n } as GLTFSampler;\n\n const texture: Texture = device.createTexture({\n id: gltfTexture.uniformName || gltfTexture.id,\n sampler: convertSampler(gltfSampler),\n ...textureOptions\n });\n\n parsedMaterial.bindings[uniformName] = texture;\n if (define) parsedMaterial.defines[define] = true;\n parsedMaterial.generatedTextures.push(texture);\n}\n\n/*\n/**\n * Parses a GLTF material definition into uniforms and parameters for the PBR shader module\n *\nexport class PBRMaterialParser {\n readonly device: Device;\n\n readonly defines: Record<string, boolean>;\n readonly bindings: Record<string, Binding>;\n readonly uniforms: Record<string, any>;\n readonly parameters: Record<string, any>;\n\n /** Hold on to generated textures, we destroy them in the destroy method *\n readonly generatedTextures: Texture[];\n\n constructor(device: Device, props: PBRMaterialParserProps) {\n const {attributes, material, pbrDebug, imageBasedLightingEnvironment, lights, useTangents} =\n props;\n this.device = device;\n\n this.defines = {\n // TODO: Use EXT_sRGB if available (Standard in WebGL 2.0)\n MANUAL_SRGB: true,\n SRGB_FAST_APPROXIMATION: true\n };\n\n if (this.device.features.has('glsl-texture-lod')) {\n this.defines.USE_TEX_LOD = true;\n }\n\n this.uniforms = {\n // TODO: find better values?\n camera: [0, 0, 0], // Model should override\n\n metallicRoughnessValues: [1, 1] // Default is 1 and 1\n };\n\n this.bindings = {};\n\n this.parameters = {};\n this.generatedTextures = [];\n\n if (imageBasedLightingEnvironment) {\n this.bindings.pbr_diffuseEnvSampler = imageBasedLightingEnvironment.getDiffuseEnvSampler();\n this.bindings.pbr_specularEnvSampler = imageBasedLightingEnvironment.getSpecularEnvSampler();\n this.bindings.pbr_BrdfLUT = imageBasedLightingEnvironment.getBrdfTexture();\n this.uniforms.scaleIBLAmbient = [1, 1];\n }\n\n if (pbrDebug) {\n // Override final color for reference app visualization\n // of various parameters in the lighting equation.\n this.uniforms.scaleDiffBaseMR = [0, 0, 0, 0];\n this.uniforms.scaleFGDSpec = [0, 0, 0, 0];\n }\n\n this.defineIfPresent(attributes.NORMAL, 'HAS_NORMALS');\n this.defineIfPresent(attributes.TANGENT && useTangents, 'HAS_TANGENTS');\n this.defineIfPresent(attributes.TEXCOORD_0, 'HAS_UV');\n this.defineIfPresent(attributes.COLOR_0, 'HAS_COLORS');\n\n this.defineIfPresent(imageBasedLightingEnvironment, 'USE_IBL');\n this.defineIfPresent(lights, 'USE_LIGHTS');\n this.defineIfPresent(pbrDebug, 'PBR_DEBUG');\n\n if (material) {\n this.parseMaterial(material);\n }\n }\n\n /**\n * Destroy all generated resources to release memory.\n *\n destroy(): void {\n this.generatedTextures.forEach(texture => texture.destroy());\n }\n\n /** Add a define if the the value is non-nullish *\n defineIfPresent(value: unknown, name: string): void {\n if (value) {\n this.defines[name] = 1;\n }\n }\n\n /** Parse GLTF material record *\n parseMaterial(material) {\n this.uniforms.unlit = Boolean(material.unlit);\n\n if (material.pbrMetallicRoughness) {\n this.parsePbrMetallicRoughness(material.pbrMetallicRoughness);\n }\n if (material.normalTexture) {\n this.addTexture(material.normalTexture, 'pbr_normalSampler', 'HAS_NORMALMAP');\n\n const {scale = 1} = material.normalTexture;\n this.uniforms.normalScale = scale;\n }\n if (material.occlusionTexture) {\n this.addTexture(material.occlusionTexture, 'pbr_occlusionSampler', 'HAS_OCCLUSIONMAP');\n\n const {strength = 1} = material.occlusionTexture;\n this.uniforms.occlusionStrength = strength;\n }\n if (material.emissiveTexture) {\n this.addTexture(material.emissiveTexture, 'pbr_emissiveSampler', 'HAS_EMISSIVEMAP');\n this.uniforms.emissiveFactor = material.emissiveFactor || [0, 0, 0];\n }\n if (material.alphaMode === 'MASK') {\n const {alphaCutoff = 0.5} = material;\n this.defines.ALPHA_CUTOFF = true;\n this.uniforms.u_AlphaCutoff = alphaCutoff;\n } else if (material.alphaMode === 'BLEND') {\n log.warn('BLEND alphaMode might not work well because it requires mesh sorting')();\n Object.assign(this.parameters, {\n blend: true,\n blendEquation: GL.FUNC_ADD,\n blendFunc: [GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA]\n });\n }\n }\n\n /** Parse GLTF material sub record *\n parsePbrMetallicRoughness(pbrMetallicRoughness) {\n if (pbrMetallicRoughness.baseColorTexture) {\n this.addTexture(\n pbrMetallicRoughness.baseColorTexture,\n 'pbr_baseColorSampler',\n 'HAS_BASECOLORMAP'\n );\n }\n this.uniforms.baseColorFactor = pbrMetallicRoughness.baseColorFactor || [1, 1, 1, 1];\n\n if (pbrMetallicRoughness.metallicRoughnessTexture) {\n this.addTexture(\n pbrMetallicRoughness.metallicRoughnessTexture,\n 'pbr_metallicRoughnessSampler',\n 'HAS_METALROUGHNESSMAP'\n );\n }\n const {metallicFactor = 1, roughnessFactor = 1} = pbrMetallicRoughness;\n this.uniforms.metallicRoughnessValues = [metallicFactor, roughnessFactor];\n }\n\n /** Create a texture from a glTF texture/sampler/image combo and add it to bindings *\n addTexture(gltfTexture, name, define = null) {\n const parameters = gltfTexture?.texture?.sampler?.parameters || {};\n\n const image = gltfTexture.texture.source.image;\n let textureOptions;\n let specialTextureParameters = {};\n if (image.compressed) {\n textureOptions = image;\n specialTextureParameters = {\n [GL.TEXTURE_MIN_FILTER]: image.data.length > 1 ? GL.LINEAR_MIPMAP_NEAREST : GL.LINEAR\n };\n } else {\n // Texture2D accepts a promise that returns an image as data (Async Textures)\n textureOptions = {data: image};\n }\n\n const texture: Texture = this.device.createTexture({\n id: gltfTexture.name || gltfTexture.id,\n parameters: {\n ...parameters,\n ...specialTextureParameters\n },\n pixelStore: {\n [GL.UNPACK_FLIP_Y_WEBGL]: false\n },\n ...textureOptions\n });\n this.bindings[name] = texture;\n this.defineIfPresent(define, define);\n this.generatedTextures.push(texture);\n }\n}\n*/\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// TODO: convert in loaders.gl?\n\nimport type {SamplerProps} from '@luma.gl/core';\nimport {GL} from '@luma.gl/constants';\n\ntype GLTFSampler = {\n wrapS?: GL.CLAMP_TO_EDGE | GL.REPEAT | GL.MIRRORED_REPEAT;\n wrapT?: GL.CLAMP_TO_EDGE | GL.REPEAT | GL.MIRRORED_REPEAT;\n magFilter?: GL.NEAREST | GL.LINEAR;\n minFilter?:\n | GL.NEAREST\n | GL.LINEAR\n | GL.NEAREST_MIPMAP_NEAREST\n | GL.LINEAR_MIPMAP_NEAREST\n | GL.NEAREST_MIPMAP_LINEAR\n | GL.LINEAR_MIPMAP_LINEAR;\n};\n\nexport function convertSampler(gltfSampler: GLTFSampler): SamplerProps {\n return {\n addressModeU: convertSamplerWrapMode(gltfSampler.wrapS),\n addressModeV: convertSamplerWrapMode(gltfSampler.wrapT),\n magFilter: convertSamplerMagFilter(gltfSampler.magFilter),\n ...convertSamplerMinFilter(gltfSampler.minFilter)\n };\n}\n\nfunction convertSamplerWrapMode(\n mode: GL.CLAMP_TO_EDGE | GL.REPEAT | GL.MIRRORED_REPEAT | undefined\n): 'clamp-to-edge' | 'repeat' | 'mirror-repeat' | undefined {\n switch (mode) {\n case GL.CLAMP_TO_EDGE:\n return 'clamp-to-edge';\n case GL.REPEAT:\n return 'repeat';\n case GL.MIRRORED_REPEAT:\n return 'mirror-repeat';\n default:\n return undefined;\n }\n}\n\nfunction convertSamplerMagFilter(\n mode: GL.NEAREST | GL.LINEAR | undefined\n): 'nearest' | 'linear' | undefined {\n switch (mode) {\n case GL.NEAREST:\n return 'nearest';\n case GL.LINEAR:\n return 'linear';\n default:\n return undefined;\n }\n}\n\nfunction convertSamplerMinFilter(\n mode:\n | GL.NEAREST\n | GL.LINEAR\n | GL.NEAREST_MIPMAP_NEAREST\n | GL.LINEAR_MIPMAP_NEAREST\n | GL.NEAREST_MIPMAP_LINEAR\n | GL.LINEAR_MIPMAP_LINEAR\n | undefined\n): {minFilter?: 'nearest' | 'linear'; mipmapFilter?: 'nearest' | 'linear'} {\n switch (mode) {\n case GL.NEAREST:\n return {minFilter: 'nearest'};\n case GL.LINEAR:\n return {minFilter: 'linear'};\n case GL.NEAREST_MIPMAP_NEAREST:\n return {minFilter: 'nearest', mipmapFilter: 'nearest'};\n case GL.LINEAR_MIPMAP_NEAREST:\n return {minFilter: 'linear', mipmapFilter: 'nearest'};\n case GL.NEAREST_MIPMAP_LINEAR:\n return {minFilter: 'nearest', mipmapFilter: 'linear'};\n case GL.LINEAR_MIPMAP_LINEAR:\n return {minFilter: 'linear', mipmapFilter: 'linear'};\n default:\n return {};\n }\n}\n", "import {Matrix4} from '@math.gl/core';\nimport type {GLTFNodePostprocessed, GLTFPostprocessed} from '@loaders.gl/gltf';\nimport type {DirectionalLight, Light, PointLight} from '@luma.gl/shadertools';\n\n/** Parse KHR_lights_punctual extension into luma.gl light definitions */\nexport function parseGLTFLights(gltf: GLTFPostprocessed): Light[] {\n const lightDefs = gltf.extensions?.['KHR_lights_punctual']?.['lights'];\n if (!lightDefs || !Array.isArray(lightDefs) || lightDefs.length === 0) {\n return [];\n }\n\n const lights: Light[] = [];\n\n for (const node of gltf.nodes || []) {\n const nodeLight = node.extensions?.KHR_lights_punctual;\n if (!nodeLight || typeof nodeLight.light !== 'number') {\n // eslint-disable-next-line no-continue\n continue;\n }\n const gltfLight = lightDefs[nodeLight.light];\n if (!gltfLight) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n const color = (gltfLight.color || [1, 1, 1]) as [number, number, number];\n const intensity = gltfLight.intensity ?? 1;\n const range = gltfLight.range;\n\n switch (gltfLight.type) {\n case 'directional':\n lights.push(parseDirectionalLight(node, color, intensity));\n break;\n case 'point':\n lights.push(parsePointLight(node, color, intensity, range));\n break;\n case 'spot':\n lights.push(parsePointLight(node, color, intensity, range));\n break;\n default:\n // Unsupported light type\n break;\n }\n }\n\n return lights;\n}\n\nfunction parsePointLight(\n node: GLTFNodePostprocessed,\n color: [number, number, number],\n intensity: number,\n range?: number\n): PointLight {\n const position: Readonly<[number, number, number]> = node.translation\n ? ([...node.translation] as [number, number, number])\n : ([0, 0, 0] as [number, number, number]);\n\n let attenuation: Readonly<[number, number, number]> = [1, 0, 0];\n if (range !== undefined && range > 0) {\n attenuation = [1, 0, 1 / (range * range)] as [number, number, number];\n }\n\n return {\n type: 'point',\n position,\n color,\n intensity,\n attenuation\n };\n}\n\nfunction parseDirectionalLight(\n node: GLTFNodePostprocessed,\n color: [number, number, number],\n intensity: number\n): DirectionalLight {\n let direction: [number, number, number] = [0, 0, -1];\n\n if (node.rotation) {\n const orientation = new Matrix4().fromQuaternion(node.rotation);\n direction = orientation.transformDirection([0, 0, -1]) as [number, number, number];\n }\n\n return {\n type: 'directional',\n direction,\n color,\n intensity\n };\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {Device, type PrimitiveTopology} from '@luma.gl/core';\nimport {Geometry, GeometryAttribute, GroupNode, ModelNode, type ModelProps} from '@luma.gl/engine';\nimport {Matrix4} from '@math.gl/core';\nimport {\n type GLTFMeshPostprocessed,\n type GLTFNodePostprocessed,\n type GLTFPostprocessed\n} from '@loaders.gl/gltf';\nimport {type GLTFScenePostprocessed} from '@loaders.gl/gltf/dist/lib/types/gltf-postprocessed-schema';\n\nimport {type PBREnvironment} from '../pbr/pbr-environment';\nimport {convertGLDrawModeToTopology} from '../webgl-to-webgpu/convert-webgl-topology';\nimport {createGLTFModel} from '../gltf/create-gltf-model';\n\nimport {parsePBRMaterial} from './parse-pbr-material';\n\nexport type ParseGLTFOptions = {\n modelOptions?: Partial<ModelProps>;\n pbrDebug?: boolean;\n imageBasedLightingEnvironment?: PBREnvironment;\n lights?: boolean;\n useTangents?: boolean;\n};\n\nconst defaultOptions: Required<ParseGLTFOptions> = {\n modelOptions: {},\n pbrDebug: false,\n imageBasedLightingEnvironment: undefined!,\n lights: true,\n useTangents: false\n};\n\n/**\n * GLTF instantiator for luma.gl\n * Walks the parsed and resolved glTF structure and builds a luma.gl scenegraph\n */\nexport function parseGLTF(\n device: Device,\n gltf: GLTFPostprocessed,\n options_: ParseGLTFOptions = {}\n): GroupNode[] {\n const options = {...defaultOptions, ...options_};\n const sceneNodes = gltf.scenes.map(gltfScene =>\n createScene(device, gltfScene, gltf.nodes, options)\n );\n return sceneNodes;\n}\n\nfunction createScene(\n device: Device,\n gltfScene: GLTFScenePostprocessed,\n gltfNodes: GLTFNodePostprocessed[],\n options: Required<ParseGLTFOptions>\n): GroupNode {\n const gltfSceneNodes = gltfScene.nodes || [];\n const nodes = gltfSceneNodes.map(node => createNode(device, node, gltfNodes, options));\n const sceneNode = new GroupNode({\n id: gltfScene.name || gltfScene.id,\n children: nodes\n });\n return sceneNode;\n}\n\nfunction createNode(\n device: Device,\n gltfNode: GLTFNodePostprocessed & {_node?: GroupNode},\n gltfNodes: GLTFNodePostprocessed[],\n options: Required<ParseGLTFOptions>\n): GroupNode {\n if (!gltfNode._node) {\n const gltfChildren = gltfNode.children || [];\n const children = gltfChildren.map(child => createNode(device, child, gltfNodes, options));\n\n // Node can have children nodes and meshes at the same time\n if (gltfNode.mesh) {\n children.push(createMesh(device, gltfNode.mesh, options));\n }\n\n const node = new GroupNode({\n id: gltfNode.name || gltfNode.id,\n children\n });\n\n if (gltfNode.matrix) {\n node.setMatrix(gltfNode.matrix);\n } else {\n node.matrix.identity();\n\n if (gltfNode.translation) {\n node.matrix.translate(gltfNode.translation);\n }\n\n if (gltfNode.rotation) {\n const rotationMatrix = new Matrix4().fromQuaternion(gltfNode.rotation);\n node.matrix.multiplyRight(rotationMatrix);\n }\n\n if (gltfNode.scale) {\n node.matrix.scale(gltfNode.scale);\n }\n }\n gltfNode._node = node;\n }\n\n // Copy _node so that gltf-animator can access\n const topLevelNode = gltfNodes.find(node => node.id === gltfNode.id) as any;\n topLevelNode._node = gltfNode._node;\n\n return gltfNode._node;\n}\n\nfunction createMesh(\n device: Device,\n gltfMesh: GLTFMeshPostprocessed & {_mesh?: GroupNode},\n options: Required<ParseGLTFOptions>\n): GroupNode {\n // TODO: avoid changing the gltf\n if (!gltfMesh._mesh) {\n const gltfPrimitives = gltfMesh.primitives || [];\n const primitives = gltfPrimitives.map((gltfPrimitive, i) =>\n createPrimitive(device, gltfPrimitive, i, gltfMesh, options)\n );\n const mesh = new GroupNode({\n id: gltfMesh.name || gltfMesh.id,\n children: primitives\n });\n gltfMesh._mesh = mesh;\n }\n\n return gltfMesh._mesh;\n}\n\nfunction createPrimitive(\n device: Device,\n gltfPrimitive: any,\n i: number,\n gltfMesh: GLTFMeshPostprocessed,\n options: Required<ParseGLTFOptions>\n): ModelNode {\n const id = gltfPrimitive.name || `${gltfMesh.name || gltfMesh.id}-primitive-${i}`;\n const topology = convertGLDrawModeToTopology(gltfPrimitive.mode || 4);\n const vertexCount = gltfPrimitive.indices\n ? gltfPrimitive.indices.count\n : getVertexCount(gltfPrimitive.attributes);\n\n const geometry = createGeometry(id, gltfPrimitive, topology);\n\n const parsedPPBRMaterial = parsePBRMaterial(\n device,\n gltfPrimitive.material,\n geometry.attributes,\n options\n );\n\n const modelNode = createGLTFModel(device, {\n id,\n geometry: createGeometry(id, gltfPrimitive, topology),\n parsedPPBRMaterial,\n modelOptions: options.modelOptions,\n vertexCount\n });\n\n modelNode.bounds = [gltfPrimitive.attributes.POSITION.min, gltfPrimitive.attributes.POSITION.max];\n // TODO this holds on to all the CPU side texture and attribute data\n // modelNode.material = gltfPrimitive.material;\n\n return modelNode;\n}\n\nfunction getVertexCount(attributes: any) {\n throw new Error('getVertexCount not implemented');\n}\n\nfunction createGeometry(id: string, gltfPrimitive: any, topology: PrimitiveTopology): Geometry {\n const attributes: Record<string, GeometryAttribute> = {};\n for (const [attributeName, attribute] of Object.entries(gltfPrimitive.attributes)) {\n const {components, size, value} = attribute as GeometryAttribute;\n\n attributes[attributeName] = {size: size ?? components, value};\n }\n\n return new Geometry({\n id,\n topology,\n indices: gltfPrimitive.indices.value,\n attributes\n });\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {PrimitiveTopology} from '@luma.gl/core';\n\n// NOTE: Modules other than `@luma.gl/webgl` should not import `GL` from\n// `@luma.gl/constants`. Locally we use `GLEnum` instead of `GL` to avoid\n// conflicts with the `babel-plugin-inline-webgl-constants` plugin.\n// eslint-disable-next-line no-shadow\nexport enum GLEnum {\n POINTS = 0x0,\n LINES = 0x1,\n LINE_LOOP = 0x2,\n LINE_STRIP = 0x3,\n TRIANGLES = 0x4,\n TRIANGLE_STRIP = 0x5,\n TRIANGLE_FAN = 0x6\n}\n\nexport function convertGLDrawModeToTopology(\n drawMode:\n | GLEnum.POINTS\n | GLEnum.LINES\n | GLEnum.LINE_STRIP\n | GLEnum.LINE_LOOP\n | GLEnum.TRIANGLES\n | GLEnum.TRIANGLE_STRIP\n | GLEnum.TRIANGLE_FAN\n): PrimitiveTopology {\n // prettier-ignore\n switch (drawMode) {\n case GLEnum.POINTS: return 'point-list';\n case GLEnum.LINES: return 'line-list';\n case GLEnum.LINE_STRIP: return 'line-strip';\n case GLEnum.TRIANGLES: return 'triangle-list';\n case GLEnum.TRIANGLE_STRIP: return 'triangle-strip';\n default: throw new Error(String(drawMode));\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {Device, type RenderPipelineParameters, log} from '@luma.gl/core';\nimport {pbrMaterial, ShaderModule} from '@luma.gl/shadertools';\nimport {Geometry, Model, ModelNode, type ModelProps} from '@luma.gl/engine';\nimport {type ParsedPBRMaterial} from '../pbr/pbr-material';\n\nconst SHADER = /* WGSL */ `\nlayout(0) positions: vec4; // in vec4 POSITION;\n\n #ifdef HAS_NORMALS\n in vec4 normals; // in vec4 NORMAL;\n #endif\n\n #ifdef HAS_TANGENTS\n in vec4 TANGENT;\n #endif\n\n #ifdef HAS_UV\n // in vec2 TEXCOORD_0;\n in vec2 texCoords;\n #endif\n\n@vertex\n void main(void) {\n vec4 _NORMAL = vec4(0.);\n vec4 _TANGENT = vec4(0.);\n vec2 _TEXCOORD_0 = vec2(0.);\n\n #ifdef HAS_NORMALS\n _NORMAL = normals;\n #endif\n\n #ifdef HAS_TANGENTS\n _TANGENT = TANGENT;\n #endif\n\n #ifdef HAS_UV\n _TEXCOORD_0 = texCoords;\n #endif\n\n pbr_setPositionNormalTangentUV(positions, _NORMAL, _TANGENT, _TEXCOORD_0);\n gl_Position = u_MVPMatrix * positions;\n }\n\n@fragment\n out vec4 fragmentColor;\n\n void main(void) {\n vec3 pos = pbr_vPosition;\n fragmentColor = pbr_filterColor(vec4(1.0));\n }\n`;\n\n// TODO rename attributes to POSITION/NORMAL etc\n// See gpu-geometry.ts: getAttributeBuffersFromGeometry()\nconst vs = /* glsl */ `\\\n#version 300 es\n\n // in vec4 POSITION;\n in vec4 positions;\n\n #ifdef HAS_NORMALS\n // in vec4 NORMAL;\n in vec4 normals;\n #endif\n\n #ifdef HAS_TANGENTS\n in vec4 TANGENT;\n #endif\n\n #ifdef HAS_UV\n // in vec2 TEXCOORD_0;\n in vec2 texCoords;\n #endif\n\n void main(void) {\n vec4 _NORMAL = vec4(0.);\n vec4 _TANGENT = vec4(0.);\n vec2 _TEXCOORD_0 = vec2(0.);\n\n #ifdef HAS_NORMALS\n _NORMAL = normals;\n #endif\n\n #ifdef HAS_TANGENTS\n _TANGENT = TANGENT;\n #endif\n\n #ifdef HAS_UV\n _TEXCOORD_0 = texCoords;\n #endif\n\n pbr_setPositionNormalTangentUV(positions, _NORMAL, _TANGENT, _TEXCOORD_0);\n gl_Position = pbrProjection.modelViewProjectionMatrix * positions;\n }\n`;\n\nconst fs = /* glsl */ `\\\n#version 300 es\n out vec4 fragmentColor;\n\n void main(void) {\n vec3 pos = pbr_vPosition;\n fragmentColor = pbr_filterColor(vec4(1.0));\n }\n`;\n\nexport type CreateGLTFModelOptions = {\n id?: string;\n vertexCount?: number;\n geometry: Geometry;\n parsedPPBRMaterial: ParsedPBRMaterial;\n modelOptions?: Partial<ModelProps>;\n};\n\n/** Creates a luma.gl Model from GLTF data*/\nexport function createGLTFModel(device: Device, options: CreateGLTFModelOptions): ModelNode {\n const {id, geometry, parsedPPBRMaterial, vertexCount, modelOptions = {}} = options;\n\n log.info(4, 'createGLTFModel defines: ', parsedPPBRMaterial.defines)();\n\n // Calculate managedResources\n // TODO: Implement resource management logic that will\n // not deallocate resources/textures/buffers that are shared\n const managedResources: any[] = [];\n // managedResources.push(...parsedMaterial.generatedTextures);\n // managedResources.push(...Object.values(attributes).map((attribute) => attribute.buffer));\n\n const parameters: RenderPipelineParameters = {\n depthWriteEnabled: true,\n depthCompare: 'less',\n depthFormat: 'depth24plus',\n cullMode: 'back'\n };\n\n const modelProps: ModelProps = {\n id,\n source: SHADER,\n vs,\n fs,\n geometry,\n topology: geometry.topology,\n vertexCount,\n modules: [pbrMaterial as unknown as ShaderModule],\n ...modelOptions,\n\n defines: {...parsedPPBRMaterial.defines, ...modelOptions.defines},\n parameters: {...parameters, ...parsedPPBRMaterial.parameters, ...modelOptions.parameters}\n };\n\n const model = new Model(device, modelProps);\n\n const {camera, ...pbrMaterialProps} = {\n ...parsedPPBRMaterial.uniforms,\n ...modelOptions.uniforms,\n ...parsedPPBRMaterial.bindings,\n ...modelOptions.bindings\n };\n\n model.shaderInputs.setProps({pbrMaterial: pbrMaterialProps, pbrProjection: {camera}});\n return new ModelNode({managedResources, model});\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {GLTFNodePostprocessed} from '@loaders.gl/gltf';\nimport {log} from '@luma.gl/core';\nimport {GroupNode} from '@luma.gl/engine';\nimport {Matrix4} from '@math.gl/core';\nimport {GLTFAnimation} from './animations/animations';\nimport {interpolate} from './animations/interpolate';\n\ntype GLTFSingleAnimatorProps = {\n animation: GLTFAnimation;\n startTime?: number;\n playing?: boolean;\n speed?: number;\n};\n\nclass GLTFSingleAnimator {\n animation: GLTFAnimation;\n startTime: number = 0;\n playing: boolean = true;\n speed: number = 1;\n\n constructor(props: GLTFSingleAnimatorProps) {\n this.animation = props.animation;\n this.animation.name ||= 'unnamed';\n Object.assign(this, props);\n }\n\n setTime(timeMs: number) {\n if (!this.playing) {\n return;\n }\n\n const absTime = timeMs / 1000;\n const time = (absTime - this.startTime) * this.speed;\n\n this.animation.channels.forEach(({sampler, target, path}) => {\n interpolate(time, sampler, target, path);\n applyTranslationRotationScale(target, (target as any)._node as GroupNode);\n });\n }\n}\n\nexport type GLTFAnimatorProps = {\n animations: GLTFAnimation[];\n};\n\nexport class GLTFAnimator {\n animations: GLTFSingleAnimator[];\n\n constructor(props: GLTFAnimatorProps) {\n this.animations = props.animations.map((animation, index) => {\n const name = animation.name || `Animation-${index}`;\n return new GLTFSingleAnimator({\n animation: {name, channels: animation.channels}\n });\n });\n }\n\n /** @deprecated Use .setTime(). Will be removed (deck.gl is using this) */\n animate(time: number): void {\n log.warn('GLTFAnimator#animate is deprecated. Use GLTFAnimator#setTime instead')();\n this.setTime(time);\n }\n\n setTime(time: number): void {\n this.animations.forEach(animation => animation.setTime(time));\n }\n\n getAnimations() {\n return this.animations;\n }\n}\n\n// TODO: share with GLTFInstantiator\nconst scratchMatrix = new Matrix4();\n\nfunction applyTranslationRotationScale(gltfNode: GLTFNodePostprocessed, node: GroupNode) {\n node.matrix.identity();\n\n if (gltfNode.translation) {\n node.matrix.translate(gltfNode.translation);\n }\n\n if (gltfNode.rotation) {\n const rotationMatrix = scratchMatrix.fromQuaternion(gltfNode.rotation);\n node.matrix.multiplyRight(rotationMatrix);\n }\n\n if (gltfNode.scale) {\n node.matrix.scale(gltfNode.scale);\n }\n}\n", "import {GLTFNodePostprocessed} from '@loaders.gl/gltf';\nimport {log} from '@luma.gl/core';\nimport {Quaternion} from '@math.gl/core';\nimport {GLTFAnimationChannel, GLTFAnimationSampler} from './animations';\n\nconst scratchQuaternion = new Quaternion();\n\nexport function interpolate(\n time: number,\n {input, interpolation, output}: GLTFAnimationSampler,\n target: GLTFNodePostprocessed,\n path: GLTFAnimationChannel['path']\n) {\n const maxTime = input[input.length - 1];\n const animationTime = time % maxTime;\n\n const nextIndex = input.findIndex(t => t >= animationTime);\n const previousIndex = Math.max(0, nextIndex - 1);\n\n if (!Array.isArray(target[path])) {\n switch (path) {\n case 'translation':\n target[path] = [0, 0, 0];\n break;\n\n case 'rotation':\n target[path] = [0, 0, 0, 1];\n break;\n\n case 'scale':\n target[path] = [1, 1, 1];\n break;\n\n default:\n log.warn(`Bad animation path ${path}`)();\n }\n }\n\n // assert(target[path].length === output[previousIndex].length);\n const previousTime = input[previousIndex];\n const nextTime = input[nextIndex];\n\n switch (interpolation) {\n case 'STEP':\n stepInterpolate(target, path, output[previousIndex] as number[]);\n break;\n\n case 'LINEAR':\n if (nextTime > previousTime) {\n const ratio = (animationTime - previousTime) / (nextTime - previousTime);\n linearInterpolate(\n target,\n path,\n output[previousIndex] as number[],\n output[nextIndex] as number[],\n ratio\n );\n }\n break;\n\n case 'CUBICSPLINE':\n if (nextTime > previousTime) {\n const ratio = (animationTime - previousTime) / (nextTime - previousTime);\n const tDiff = nextTime - previousTime;\n\n const p0 = output[3 * previousIndex + 1] as number[];\n const outTangent0 = output[3 * previousIndex + 2] as number[];\n const inTangent1 = output[3 * nextIndex + 0] as number[];\n const p1 = output[3 * nextIndex + 1] as number[];\n\n cubicsplineInterpolate(target, path, {p0, outTangent0, inTangent1, p1, tDiff, ratio});\n }\n break;\n\n default:\n log.warn(`Interpolation ${interpolation} not supported`)();\n break;\n }\n}\n\nfunction linearInterpolate(\n target: GLTFNodePostprocessed,\n path: GLTFAnimationChannel['path'],\n start: number[],\n stop: number[],\n ratio: number\n) {\n if (!target[path]) {\n throw new Error();\n }\n\n if (path === 'rotation') {\n // SLERP when path is rotation\n scratchQuaternion.slerp({start, target: stop, ratio});\n for (let i = 0; i < scratchQuaternion.length; i++) {\n target[path][i] = scratchQuaternion[i];\n }\n } else {\n // regular interpolation\n for (let i = 0; i < start.length; i++) {\n target[path][i] = ratio * stop[i] + (1 - ratio) * start[i];\n }\n }\n}\n\nfunction cubicsplineInterpolate(\n target: GLTFNodePostprocessed,\n path: GLTFAnimationChannel['path'],\n {\n p0,\n outTangent0,\n inTangent1,\n p1,\n tDiff,\n ratio: t\n }: {\n p0: number[];\n outTangent0: number[];\n inTangent1: number[];\n p1: number[];\n tDiff: number;\n ratio: number;\n }\n) {\n if (!target[path]) {\n throw new Error();\n }\n\n // TODO: Quaternion might need normalization\n for (let i = 0; i < target[path].length; i++) {\n const m0 = outTangent0[i] * tDiff;\n const m1 = inTangent1[i] * tDiff;\n target[path][i] =\n (2 * Math.pow(t, 3) - 3 * Math.pow(t, 2) + 1) * p0[i] +\n (Math.pow(t, 3) - 2 * Math.pow(t, 2) + t) * m0 +\n (-2 * Math.pow(t, 3) + 3 * Math.pow(t, 2)) * p1[i] +\n (Math.pow(t, 3) - Math.pow(t, 2)) * m1;\n }\n}\n\nfunction stepInterpolate(\n target: GLTFNodePostprocessed,\n path: GLTFAnimationChannel['path'],\n value: number[]\n) {\n if (!target[path]) {\n throw new Error();\n }\n\n for (let i = 0; i < value.length; i++) {\n target[path][i] = value[i];\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// TODO: convert in loaders.gl?\nimport type {TypedArray} from '@math.gl/types';\n\nexport const ATTRIBUTE_TYPE_TO_COMPONENTS: Record<string, number> = {\n SCALAR: 1,\n VEC2: 2,\n VEC3: 3,\n VEC4: 4,\n MAT2: 4,\n MAT3: 9,\n MAT4: 16\n};\n\nexport const ATTRIBUTE_COMPONENT_TYPE_TO_ARRAY: Record<number, any> = {\n 5120: Int8Array,\n 5121: Uint8Array,\n 5122: Int16Array,\n 5123: Uint16Array,\n 5125: Uint32Array,\n 5126: Float32Array\n};\n\ntype GLTFAccessor = {\n componentType: number;\n type: string;\n count: number;\n bufferView?: {data: {buffer: ArrayBuffer; byteOffset?: number}};\n byteOffset?: number;\n};\n\nexport function accessorToTypedArray(accessor: GLTFAccessor): {\n typedArray: TypedArray;\n components: number;\n} {\n const ArrayType = ATTRIBUTE_COMPONENT_TYPE_TO_ARRAY[accessor.componentType];\n const components = ATTRIBUTE_TYPE_TO_COMPONENTS[accessor.type];\n const length = components * accessor.count;\n const {buffer, byteOffset = 0} = accessor.bufferView?.data ?? {};\n\n const typedArray = new ArrayType(buffer, byteOffset + (accessor.byteOffset || 0), length);\n\n return {typedArray, components};\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {type GLTFAccessorPostprocessed, type GLTFPostprocessed} from '@loaders.gl/gltf';\nimport {\n type GLTFAnimation,\n type GLTFAnimationChannel,\n type GLTFAnimationSampler\n} from '../gltf/animations/animations';\n\nimport {accessorToTypedArray} from '..//webgl-to-webgpu/convert-webgl-attribute';\n\nexport function parseGLTFAnimations(gltf: GLTFPostprocessed): GLTFAnimation[] {\n const gltfAnimations = gltf.animations || [];\n return gltfAnimations.map((animation, index) => {\n const name = animation.name || `Animation-${index}`;\n const samplers: GLTFAnimationSampler[] = animation.samplers.map(\n ({input, interpolation = 'LINEAR', output}) => ({\n input: accessorToJsArray(gltf.accessors[input]) as number[],\n interpolation,\n output: accessorToJsArray(gltf.accessors[output])\n })\n );\n const channels: GLTFAnimationChannel[] = animation.channels.map(({sampler, target}) => ({\n sampler: samplers[sampler],\n target: gltf.nodes[target.node ?? 0],\n path: target.path as GLTFAnimationChannel['path']\n }));\n return {name, channels};\n });\n}\n\n//\n\nfunction accessorToJsArray(\n accessor: GLTFAccessorPostprocessed & {_animation?: number[] | number[][]}\n): number[] | number[][] {\n if (!accessor._animation) {\n const {typedArray: array, components} = accessorToTypedArray(accessor);\n\n if (components === 1) {\n accessor._animation = Array.from(array);\n } else {\n // Slice array\n const slicedArray: number[][] = [];\n for (let i = 0; i < array.length; i += components) {\n slicedArray.push(Array.from(array.slice(i, i + components)));\n }\n accessor._animation = slicedArray;\n }\n }\n\n return accessor._animation;\n}\n", "/** Deeply copies a JS data structure */\nexport function deepCopy(object: any): any {\n // don't copy binary data\n if (\n ArrayBuffer.isView(object) ||\n object instanceof ArrayBuffer ||\n object instanceof ImageBitmap\n ) {\n return object;\n }\n if (Array.isArray(object)) {\n return object.map(deepCopy);\n }\n if (object && typeof object === 'object') {\n const result: typeof object = {};\n for (const key in object) {\n result[key] = deepCopy(object[key]);\n }\n return result;\n }\n return object;\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {Device} from '@luma.gl/core';\nimport {GroupNode} from '@luma.gl/engine';\nimport {GLTFPostprocessed} from '@loaders.gl/gltf';\nimport {Light} from '@luma.gl/shadertools';\nimport {parseGLTF, type ParseGLTFOptions} from '../parsers/parse-gltf';\nimport {parseGLTFLights} from '../parsers/parse-gltf-lights';\nimport {GLTFAnimator} from './gltf-animator';\nimport {parseGLTFAnimations} from '../parsers/parse-gltf-animations';\nimport {deepCopy} from '../utils/deep-copy';\n\nexport function createScenegraphsFromGLTF(\n device: Device,\n gltf: GLTFPostprocessed,\n options?: ParseGLTFOptions\n): {\n scenes: GroupNode[];\n animator: GLTFAnimator;\n lights: Light[];\n} {\n gltf = deepCopy(gltf);\n const scenes = parseGLTF(device, gltf, options);\n // Note: There is a nasty dependency on injected nodes in the glTF\n const animations = parseGLTFAnimations(gltf);\n const animator = new GLTFAnimator({animations});\n const lights = parseGLTFLights(gltf);\n return {scenes, animator, lights};\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["import_constants", "import_core", "import_engine", "import_core", "GLEnum", "import_core", "import_engine", "import_core", "import_core"]
7
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"parse-pbr-material.d.ts","sourceRoot":"","sources":["../../src/parsers/parse-pbr-material.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAC,MAAM,EAAU,MAAM,eAAe,CAAC;AAInD,OAAO,EAAC,KAAK,iBAAiB,EAAC,+BAA4B;AAC3D,OAAO,EAAC,KAAK,cAAc,EAAC,kCAA+B;AAS3D,KAAK,WAAW,GAAG;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE;QAAC,MAAM,EAAE;YAAC,KAAK,EAAE,GAAG,CAAA;SAAC,CAAC;QAAC,OAAO,EAAE;YAAC,UAAU,EAAE,GAAG,CAAA;SAAC,CAAA;KAAC,CAAC;IAC5D,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,KAAK,wBAAwB,GAAG;IAC9B,gBAAgB,CAAC,EAAE,WAAW,CAAC;IAC/B,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACnD,wBAAwB,CAAC,EAAE,WAAW,CAAC;IACvC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,KAAK,eAAe,GAAG;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,oBAAoB,CAAC,EAAE,wBAAwB,CAAC;IAChD,aAAa,CAAC,EAAE,WAAW,CAAC;IAC5B,gBAAgB,CAAC,EAAE,WAAW,CAAC;IAC/B,eAAe,CAAC,EAAE,WAAW,CAAC;IAC9B,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,uBAAuB;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,oBAAoB;IACpB,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,mBAAmB;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,iEAAiE;IACjE,6BAA6B,CAAC,EAAE,cAAc,CAAC;CAChD,CAAC;AAEF;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,eAAe,EACzB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC/B,OAAO,EAAE,uBAAuB,GAC/B,iBAAiB,CAmDnB"}
1
+ {"version":3,"file":"parse-pbr-material.d.ts","sourceRoot":"","sources":["../../src/parsers/parse-pbr-material.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAC,MAAM,EAAU,MAAM,eAAe,CAAC;AAKnD,OAAO,EAAC,KAAK,iBAAiB,EAAC,+BAA4B;AAC3D,OAAO,EAAC,KAAK,cAAc,EAAC,kCAA+B;AAS3D,KAAK,WAAW,GAAG;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE;QAAC,MAAM,EAAE;YAAC,KAAK,EAAE,GAAG,CAAA;SAAC,CAAC;QAAC,OAAO,EAAE;YAAC,UAAU,EAAE,GAAG,CAAA;SAAC,CAAA;KAAC,CAAC;IAC5D,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,KAAK,wBAAwB,GAAG;IAC9B,gBAAgB,CAAC,EAAE,WAAW,CAAC;IAC/B,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACnD,wBAAwB,CAAC,EAAE,WAAW,CAAC;IACvC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,KAAK,eAAe,GAAG;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,oBAAoB,CAAC,EAAE,wBAAwB,CAAC;IAChD,aAAa,CAAC,EAAE,WAAW,CAAC;IAC5B,gBAAgB,CAAC,EAAE,WAAW,CAAC;IAC/B,eAAe,CAAC,EAAE,WAAW,CAAC;IAC9B,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,uBAAuB;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,oBAAoB;IACpB,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,mBAAmB;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,iEAAiE;IACjE,6BAA6B,CAAC,EAAE,cAAc,CAAC;CAChD,CAAC;AAEF;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,eAAe,EACzB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC/B,OAAO,EAAE,uBAAuB,GAC/B,iBAAiB,CAoDnB"}
@@ -47,6 +47,8 @@ export function parsePBRMaterial(device, material, attributes, options) {
47
47
  parsedMaterial.defines['HAS_TANGENTS'] = true;
48
48
  if (attributes['TEXCOORD_0'])
49
49
  parsedMaterial.defines['HAS_UV'] = true;
50
+ if (attributes['COLOR_0'])
51
+ parsedMaterial.defines['HAS_COLORS'] = true;
50
52
  if (options?.imageBasedLightingEnvironment)
51
53
  parsedMaterial.defines['USE_IBL'] = true;
52
54
  if (options?.lights)
@@ -131,6 +133,8 @@ function addTexture(device, gltfTexture, uniformName, define, parsedMaterial) {
131
133
  const gltfSampler = {
132
134
  wrapS: 10497, // default REPEAT S (U) wrapping mode.
133
135
  wrapT: 10497, // default REPEAT T (V) wrapping mode.
136
+ minFilter: 9729, // default LINEAR filtering
137
+ magFilter: 9729, // default LINEAR filtering
134
138
  ...gltfTexture?.texture?.sampler
135
139
  };
136
140
  const texture = device.createTexture({
@@ -202,6 +206,7 @@ export class PBRMaterialParser {
202
206
  this.defineIfPresent(attributes.NORMAL, 'HAS_NORMALS');
203
207
  this.defineIfPresent(attributes.TANGENT && useTangents, 'HAS_TANGENTS');
204
208
  this.defineIfPresent(attributes.TEXCOORD_0, 'HAS_UV');
209
+ this.defineIfPresent(attributes.COLOR_0, 'HAS_COLORS');
205
210
 
206
211
  this.defineIfPresent(imageBasedLightingEnvironment, 'USE_IBL');
207
212
  this.defineIfPresent(lights, 'USE_LIGHTS');
@@ -1 +1 @@
1
- {"version":3,"file":"parse-pbr-material.js","sourceRoot":"","sources":["../../src/parsers/parse-pbr-material.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"parse-pbr-material.js","sourceRoot":"","sources":["../../src/parsers/parse-pbr-material.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@luma.gl/gltf",
3
- "version": "9.3.0-alpha.2",
3
+ "version": "9.3.0-alpha.4",
4
4
  "description": "glTF support for luma.gl",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -51,5 +51,5 @@
51
51
  "@loaders.gl/textures": "^4.2.0",
52
52
  "@math.gl/core": "^4.1.0"
53
53
  },
54
- "gitHead": "7fedf8d8902f58490a4ffca9a873daee3c732f24"
54
+ "gitHead": "7486e7b0377fb6ab961b4499828681bede60f3b1"
55
55
  }
@@ -3,6 +3,7 @@
3
3
  // Copyright (c) vis.gl contributors
4
4
 
5
5
  import type {Device, Texture} from '@luma.gl/core';
6
+ import type {GLTFSampler} from '@loaders.gl/gltf';
6
7
  import {GL} from '@luma.gl/constants';
7
8
 
8
9
  import {log} from '@luma.gl/core';
@@ -106,6 +107,7 @@ export function parsePBRMaterial(
106
107
  if (attributes['NORMAL']) parsedMaterial.defines['HAS_NORMALS'] = true;
107
108
  if (attributes['TANGENT'] && options?.useTangents) parsedMaterial.defines['HAS_TANGENTS'] = true;
108
109
  if (attributes['TEXCOORD_0']) parsedMaterial.defines['HAS_UV'] = true;
110
+ if (attributes['COLOR_0']) parsedMaterial.defines['HAS_COLORS'] = true;
109
111
 
110
112
  if (options?.imageBasedLightingEnvironment) parsedMaterial.defines['USE_IBL'] = true;
111
113
  if (options?.lights) parsedMaterial.defines['USE_LIGHTS'] = true;
@@ -249,8 +251,10 @@ function addTexture(
249
251
  const gltfSampler = {
250
252
  wrapS: 10497, // default REPEAT S (U) wrapping mode.
251
253
  wrapT: 10497, // default REPEAT T (V) wrapping mode.
254
+ minFilter: 9729, // default LINEAR filtering
255
+ magFilter: 9729, // default LINEAR filtering
252
256
  ...gltfTexture?.texture?.sampler
253
- } as any;
257
+ } as GLTFSampler;
254
258
 
255
259
  const texture: Texture = device.createTexture({
256
260
  id: gltfTexture.uniformName || gltfTexture.id,
@@ -322,6 +326,7 @@ export class PBRMaterialParser {
322
326
  this.defineIfPresent(attributes.NORMAL, 'HAS_NORMALS');
323
327
  this.defineIfPresent(attributes.TANGENT && useTangents, 'HAS_TANGENTS');
324
328
  this.defineIfPresent(attributes.TEXCOORD_0, 'HAS_UV');
329
+ this.defineIfPresent(attributes.COLOR_0, 'HAS_COLORS');
325
330
 
326
331
  this.defineIfPresent(imageBasedLightingEnvironment, 'USE_IBL');
327
332
  this.defineIfPresent(lights, 'USE_LIGHTS');