@fps-games/editor-deployment 0.2.3-beta.5 → 0.2.3-beta.6

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.
@@ -1,18 +1,18 @@
1
1
  #!/usr/bin/env node
2
- import cr from"node:fs/promises";import B from"node:path";import{pathToFileURL as Jc}from"node:url";var St=class extends Error{path;reason;code="runtime.lighting.invalid";constructor(t,n){super(`Invalid Runtime Lighting data at ${t}: ${n}`),this.path=t,this.reason=n,this.name="FpsRuntimeLightingDataError"}},fr=1e-6,jo=1e-4,Lo=new Set(["schemaVersion","type","intensity","direction","diffuseColor"]),Fo=new Set(["schemaVersion","type","intensity","diffuseColor","groundColor"]),Uo=new Set(["x","y","z"]),zo=new Set(["r","g","b"]);function Je(e,t="$.direction"){let n=mr(e,t),r=Math.hypot(n.x,n.y,n.z);return r<=fr&&X(t,"expected a non-zero direction vector"),Object.freeze({x:n.x/r,y:n.y/r,z:n.z/r})}function ve(e,t="$.light"){let n=rn(e,t);n.schemaVersion!==1&&X(`${t}.schemaVersion`,"expected 1");let r=Bo(n.intensity,`${t}.intensity`);if(n.type==="directional"){Et(n,Lo,t);let i=mr(n.direction,`${t}.direction`),o=Math.hypot(i.x,i.y,i.z);return o<=fr&&X(`${t}.direction`,"expected a non-zero direction vector"),Math.abs(o-1)>jo&&X(`${t}.direction`,"expected a normalized direction vector"),Object.freeze({schemaVersion:1,type:"directional",intensity:r,direction:i,diffuseColor:tn(n.diffuseColor,`${t}.diffuseColor`)})}if(n.type==="hemispheric")return Et(n,Fo,t),Object.freeze({schemaVersion:1,type:"hemispheric",intensity:r,diffuseColor:tn(n.diffuseColor,`${t}.diffuseColor`),groundColor:tn(n.groundColor,`${t}.groundColor`)});X(`${t}.type`,"expected directional or hemispheric")}function mr(e,t){let n=rn(e,t);return Et(n,Uo,t),Object.freeze({x:qe(n.x,`${t}.x`),y:qe(n.y,`${t}.y`),z:qe(n.z,`${t}.z`)})}function tn(e,t){let n=rn(e,t);return Et(n,zo,t),Object.freeze({r:nn(n.r,`${t}.r`),g:nn(n.g,`${t}.g`),b:nn(n.b,`${t}.b`)})}function rn(e,t){(!e||typeof e!="object"||Array.isArray(e))&&X(t,"expected a plain object");let n=Object.getPrototypeOf(e);return n!==Object.prototype&&n!==null&&X(t,"expected a plain object"),e}function Et(e,t,n){for(let r of Object.keys(e))t.has(r)||X(`${n}.${r}`,"unknown field")}function qe(e,t){return(typeof e!="number"||!Number.isFinite(e))&&X(t,"expected a finite number"),e}function Bo(e,t){let n=qe(e,t);return n<0&&X(t,"expected a non-negative number"),n}function nn(e,t){let n=qe(e,t);return(n<0||n>1)&&X(t,"expected a number between 0 and 1"),n}function X(e,t){throw new St(e,t)}var Xe="medium",on={low:{opacity:.32,softness:.25,bias:.0015,normalBias:.02,maxDistance:24,resolution:512,cascadeCount:1,bakeSamples:8,blurKernel:2},medium:{opacity:.42,softness:.4,bias:.001,normalBias:.01,maxDistance:48,resolution:1024,cascadeCount:2,bakeSamples:24,blurKernel:4},high:{opacity:.5,softness:.58,bias:8e-4,normalBias:.006,maxDistance:80,resolution:2048,cascadeCount:4,bakeSamples:64,blurKernel:8},ultra:{opacity:.56,softness:.72,bias:6e-4,normalBias:.004,maxDistance:120,resolution:4096,cascadeCount:4,bakeSamples:128,blurKernel:12}};function xt(e=Xe,t={}){let n=on[e]??on[Xe];return{opacity:Ye(t.opacity,n.opacity),softness:Ye(t.softness,n.softness),bias:Ye(t.bias,n.bias),normalBias:Ye(t.normalBias,n.normalBias),maxDistance:Ye(t.maxDistance,n.maxDistance),resolution:Ho(t.resolution,n.resolution),cascadeCount:Wo(t.cascadeCount,n.cascadeCount),bakeSamples:Vo(t.bakeSamples,n.bakeSamples),blurKernel:Ko(t.blurKernel,n.blurKernel)}}function Ye(e,t){return typeof e=="number"&&Number.isFinite(e)?e:t}function Vo(e,t){return typeof e=="number"&&Number.isFinite(e)&&e>0?Math.round(e):t}function Ko(e,t){return typeof e=="number"&&Number.isFinite(e)&&e>=0?Math.round(e):t}function Ho(e,t){return e===512||e===1024||e===2048||e===4096?e:t}function Wo(e,t){return e===1||e===2||e===4?e:t}function Pt(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function It(e){return e==="inherit"||e==="none"||e==="enabled"||e==="auto"}function At(e){return e==="inherit"||e==="none"||e==="enabled"||e==="auto"}function wt(e){return e==="inherit"||e==="none"||e==="dynamic"||e==="static"||e==="blob"||e==="projected"||e==="auto"}function Tt(e){return e==="inherit"||e==="low"||e==="medium"||e==="high"||e==="ultra"}function Dt(e){return e==="inherit"||e==="scene-main"||e==="nearest"||e==="explicit"}function gr(e){let t=Pt(e);if(!t)return;let n={};It(t.cast)&&(n.cast=t.cast),At(t.receive)&&(n.receive=t.receive),wt(t.mode)&&(n.mode=t.mode),Tt(t.quality)&&(n.quality=t.quality);let r=Pt(t.light);if(r){let o={};Dt(r.mode)&&(o.mode=r.mode),typeof r.lightId=="string"&&r.lightId.trim()&&(o.lightId=r.lightId.trim()),Object.keys(o).length>0&&(n.light=o)}let i=qo(t.params);return i&&(n.params=i),Object.keys(n).length>0?n:void 0}function re(e){let t=gr(e);return t?{shadow:t,diagnostics:[]}:{diagnostics:[]}}function an(e,t="none"){let n=e?.mode;return!n||n==="inherit"||n==="auto"?t:n}function sn(e,t=Xe){let n=e?.quality;return n&&n!=="inherit"?n:t}function ce(...e){let t={};for(let n of e)if(n){if((n.cast==="enabled"||n.cast==="none")&&(t.cast=n.cast),(n.receive==="enabled"||n.receive==="none")&&(t.receive=n.receive),n.mode!==void 0&&n.mode!=="inherit"&&(t.mode=n.mode),n.quality!==void 0&&n.quality!=="inherit"&&(t.quality=n.quality),n.light){let r={...t.light??{}};n.light.mode!==void 0&&n.light.mode!=="inherit"&&(r.mode=n.light.mode),n.light.lightId!==void 0&&(r.lightId=n.light.lightId),Object.keys(r).length>0&&(t.light=r)}n.params&&(t.params={...t.params??{},...n.params})}return Object.keys(t).length>0?t:void 0}function qo(e){let t=Pt(e);if(!t)return;let n={};return typeof t.opacity=="number"&&Number.isFinite(t.opacity)&&(n.opacity=t.opacity),typeof t.softness=="number"&&Number.isFinite(t.softness)&&(n.softness=t.softness),typeof t.bias=="number"&&Number.isFinite(t.bias)&&(n.bias=t.bias),typeof t.normalBias=="number"&&Number.isFinite(t.normalBias)&&(n.normalBias=t.normalBias),typeof t.maxDistance=="number"&&Number.isFinite(t.maxDistance)&&(n.maxDistance=t.maxDistance),(t.resolution===512||t.resolution===1024||t.resolution===2048||t.resolution===4096)&&(n.resolution=t.resolution),(t.cascadeCount===1||t.cascadeCount===2||t.cascadeCount===4)&&(n.cascadeCount=t.cascadeCount),typeof t.bakeSamples=="number"&&Number.isFinite(t.bakeSamples)&&(n.bakeSamples=t.bakeSamples),typeof t.blurKernel=="number"&&Number.isFinite(t.blurKernel)&&(n.blurKernel=t.blurKernel),Object.keys(n).length>0?n:void 0}var Jo=new Set(["cast","receive","mode","quality","light","params"]),Yo=new Set(["mode","lightId"]),Xo=new Set(["opacity","softness","bias","normalBias","maxDistance","resolution","cascadeCount","bakeSamples","blurKernel"]);function Ze(e,t="$.shadow"){let n=ln(e);if(!n)throw V("schema.invalidType",t);if(dn(n,Jo,t),"cast"in n&&!It(n.cast))throw V("schema.invalidValue",`${t}.cast`);if("receive"in n&&!At(n.receive))throw V("schema.invalidValue",`${t}.receive`);if("mode"in n&&!wt(n.mode))throw V("schema.invalidValue",`${t}.mode`);if("quality"in n&&!Tt(n.quality))throw V("schema.invalidValue",`${t}.quality`);"light"in n&&Zo(n.light,`${t}.light`),"params"in n&&Qo(n.params,`${t}.params`)}function Zo(e,t){let n=ln(e);if(!n)throw V("schema.invalidType",t);if(dn(n,Yo,t),"mode"in n&&!Dt(n.mode))throw V("schema.invalidValue",`${t}.mode`);if("lightId"in n&&(typeof n.lightId!="string"||!n.lightId.trim()))throw V("schema.invalidValue",`${t}.lightId`);if(n.mode==="explicit"&&(typeof n.lightId!="string"||!n.lightId.trim()))throw V("schema.invalidValue",`${t}.lightId`)}function Qo(e,t){let n=ln(e);if(!n)throw V("schema.invalidType",t);if(dn(n,Xo,t),Ae(n,"opacity",t,r=>r>=0&&r<=1),Ae(n,"softness",t,r=>r>=0),Ae(n,"bias",t,()=>!0),Ae(n,"normalBias",t,()=>!0),Ae(n,"maxDistance",t,r=>r>0),Ae(n,"bakeSamples",t,r=>r>0),Ae(n,"blurKernel",t,r=>r>=0),"resolution"in n&&![512,1024,2048,4096].includes(n.resolution))throw V("schema.invalidValue",`${t}.resolution`);if("cascadeCount"in n&&![1,2,4].includes(n.cascadeCount))throw V("schema.invalidValue",`${t}.cascadeCount`)}function Ae(e,t,n,r){if(!(t in e))return;let i=e[t];if(typeof i!="number"||!Number.isFinite(i)||!r(i))throw V("schema.invalidValue",`${n}.${t}`)}function dn(e,t,n){for(let r of Object.keys(e))if(!t.has(r))throw V("schema.deprecatedField",`${n}.${r}`)}function V(e,t){let n=new Error(`${e}: ${t}`);return Object.assign(n,{code:e,path:t}),n}function ln(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:null}var mn="fps.shadow-map-experiment";function gn(e,t="$.scene.shadowMapExperiment"){let n=Z(e,t);oe(n,["qualityProfile","behaviorProfile"],t),n.qualityProfile!==void 0&&ie(n.qualityProfile,`${t}.qualityProfile`),n.behaviorProfile!==void 0&&ie(n.behaviorProfile,`${t}.behaviorProfile`)}function tt(e,t="$.shadowMapExperiment"){let n=Z(e,t);oe(n,["behaviorProfile"],t),ie(n.behaviorProfile,`${t}.behaviorProfile`)}function ea(e,t="$"){let n=Z(e,t);oe(n,["schemaVersion","enabled","lightRef","defaultQualityProfile","defaultBehaviorProfile","qualityProfiles","behaviorProfiles"],t),n.schemaVersion!==1&&k(`${t}.schemaVersion`,"expected 1"),typeof n.enabled!="boolean"&&k(`${t}.enabled`,"expected boolean"),ie(n.lightRef,`${t}.lightRef`);let r=ie(n.defaultQualityProfile,`${t}.defaultQualityProfile`),i=ie(n.defaultBehaviorProfile,`${t}.defaultBehaviorProfile`),o=br(n.qualityProfiles,`${t}.qualityProfiles`),a=br(n.behaviorProfiles,`${t}.behaviorProfiles`);for(let[s,l]of Object.entries(o))na(l,`${t}.qualityProfiles.${s}`);for(let[s,l]of Object.entries(a))ra(l,`${t}.behaviorProfiles.${s}`);Object.prototype.hasOwnProperty.call(o,r)||k(`${t}.defaultQualityProfile`,`unknown quality profile: ${r}`),Object.prototype.hasOwnProperty.call(a,i)||k(`${t}.defaultBehaviorProfile`,`unknown behavior profile: ${i}`)}function yr(e){ea(e.config),e.settings!==void 0&&gn(e.settings),(!Number.isInteger(e.revision)||e.revision<0)&&k("$.revision","expected a non-negative integer");let t=e.settings?.qualityProfile??e.config.defaultQualityProfile,n=e.settings?.behaviorProfile??e.config.defaultBehaviorProfile,r=un(e.config.qualityProfiles,t,"$.settings.qualityProfile","quality");un(e.config.behaviorProfiles,n,"$.settings.behaviorProfile","behavior");let i=e.objects.map((s,l)=>{let d=`$.objects[${l}]`;s.override!==void 0&&tt(s.override,`${d}.override`);let u=s.override?.behaviorProfile??n,c=un(e.config.behaviorProfiles,u,`${d}.override.behaviorProfile`,"behavior");return Object.freeze({entityId:ie(s.entityId,`${d}.entityId`),renderableIds:Object.freeze(ua(s.renderableIds,`${d}.renderableIds`)),cast:pr(s.cast,`${d}.cast`)??c.cast==="enabled",receive:pr(s.receive,`${d}.receive`)??c.receive==="enabled",updateClass:c.updateClass!=="auto"?c.updateClass:s.inferredUpdateClass??"static",behaviorProfileId:u})}).sort((s,l)=>s.entityId.localeCompare(l.entityId)),o=e.config.enabled?i:[];la(o);let a=Object.fromEntries(Object.entries(e.config.behaviorProfiles).sort(([s],[l])=>s.localeCompare(l)).map(([s,l])=>[s,Object.freeze({cast:l.cast==="enabled",receive:l.receive==="enabled",updateClass:l.updateClass})]));return hr({schemaVersion:3,revision:e.revision,enabled:e.config.enabled,scopeId:ie(e.scopeId,"$.scopeId"),light:{entityId:e.config.lightRef,direction:et(e.lightDirection,"$.lightDirection")},qualityProfileId:t,generator:{maps:{...r.maps},...r.cascadeCount===void 0?{}:{cascadeCount:r.cascadeCount},filter:r.receiverFilter,bias:r.bias,normalBias:r.normalBias,darkness:r.darkness,...r.softness===void 0?{}:{softness:r.softness},bounds:ca(r.bounds),backend:{...r.backend}},culling:{...r.culling},diagnosticThresholds:{...r.diagnostics},behaviorProfiles:a,objects:o,diagnostics:[]})}function pr(e,t){if(e!==void 0)return typeof e!="boolean"&&k(t,"expected a boolean"),e}function ta(e,t){let n=Z(e,t);oe(n,["mode","center","extent","near","far"],t),n.mode!=="fixed"&&k(`${t}.mode`,"expected fixed"),et(n.center,`${t}.center`),et(n.extent,`${t}.extent`).some(a=>a<=0)&&k(`${t}.extent`,"expected positive values");let i=Mt(n.near,`${t}.near`),o=Mt(n.far,`${t}.far`);(i<0||o<=i)&&k(t,"expected 0 <= near < far")}function na(e,t){let n=Z(e,t);oe(n,["maps","cascadeCount","receiverFilter","bias","normalBias","darkness","softness","bounds","backend","culling","diagnostics"],t),ia(n.maps,`${t}.maps`),n.cascadeCount!==void 0&&oa(n.cascadeCount,`${t}.cascadeCount`),n.receiverFilter!=="hard"&&n.receiverFilter!=="low-pcf"&&k(`${t}.receiverFilter`,"expected hard or low-pcf"),Qe(n.bias,`${t}.bias`,0,.1),Qe(n.normalBias,`${t}.normalBias`,0,1),Qe(n.darkness,`${t}.darkness`,0,1),n.softness!==void 0&&Qe(n.softness,`${t}.softness`,0,1),ta(n.bounds,`${t}.bounds`),aa(n.backend,`${t}.backend`),sa(n.culling,`${t}.culling`),da(n.diagnostics,`${t}.diagnostics`)}function ra(e,t){let n=Z(e,t);oe(n,["cast","receive","updateClass"],t),n.cast!=="enabled"&&n.cast!=="disabled"&&k(`${t}.cast`,"expected enabled or disabled"),n.receive!=="enabled"&&n.receive!=="disabled"&&k(`${t}.receive`,"expected enabled or disabled"),["auto","static","dynamic","skinned"].includes(String(n.updateClass))||k(`${t}.updateClass`,"expected auto, static, dynamic, or skinned")}function ia(e,t){let n=Z(e,t);oe(n,["staticResolution","dynamicResolution","compositeResolution"],t),cn(n.staticResolution,`${t}.staticResolution`),cn(n.dynamicResolution,`${t}.dynamicResolution`),cn(n.compositeResolution,`${t}.compositeResolution`)}function cn(e,t){e!==512&&e!==1024&&e!==2048&&e!==4096&&k(t,"expected 512, 1024, 2048, or 4096")}function oa(e,t){e!==1&&e!==2&&e!==4&&k(t,"expected 1, 2, or 4")}function aa(e,t){let n=Z(e,t);oe(n,["mode","fallback"],t),["auto","split","single"].includes(String(n.mode))||k(`${t}.mode`,"expected auto, split, or single"),n.fallback!=="single-map"&&n.fallback!=="disable"&&k(`${t}.fallback`,"expected single-map or disable")}function sa(e,t){let n=Z(e,t);oe(n,["enabled","guardBandRatio"],t),typeof n.enabled!="boolean"&&k(`${t}.enabled`,"expected boolean"),Qe(n.guardBandRatio,`${t}.guardBandRatio`,0,4)}function da(e,t){let n=Z(e,t);oe(n,["staticCasterCountWarning","dynamicCasterCountWarning","renderableCountWarning"],t),fn(n.staticCasterCountWarning,`${t}.staticCasterCountWarning`),fn(n.dynamicCasterCountWarning,`${t}.dynamicCasterCountWarning`),fn(n.renderableCountWarning,`${t}.renderableCountWarning`)}function la(e){let t=new Set,n=new Set;for(let r of e){t.has(r.entityId)&&k("$.objects",`duplicate entity id: ${r.entityId}`),t.add(r.entityId);for(let i of r.renderableIds)n.has(i)&&k("$.objects",`duplicate renderable id: ${i}`),n.add(i)}}function br(e,t){let n=Z(e,t);Object.keys(n).length===0&&k(t,"expected at least one profile");for(let r of Object.keys(n))ie(r,`${t} key`);return n}function un(e,t,n,r){return Object.prototype.hasOwnProperty.call(e,t)||k(n,`unknown ${r} profile: ${t}`),e[t]}function ca(e){return Object.freeze({mode:"fixed",center:et(e.center,"$.bounds.center"),extent:et(e.extent,"$.bounds.extent"),near:e.near,far:e.far})}function et(e,t){let n=fa(e,t);return n.length!==3&&k(t,"expected exactly three numbers"),Object.freeze(n.map((r,i)=>Mt(r,`${t}[${i}]`)))}function ua(e,t){let n=e.map((r,i)=>ie(r,`${t}[${i}]`));return new Set(n).size!==n.length&&k(t,"expected unique strings"),n}function Mt(e,t){return(typeof e!="number"||!Number.isFinite(e))&&k(t,"expected a finite number"),e}function Qe(e,t,n,r){let i=Mt(e,t);return(i<n||i>r)&&k(t,`expected ${n}..${r}`),i}function fn(e,t){return(!Number.isInteger(e)||e<0)&&k(t,"expected a non-negative integer"),e}function ie(e,t){return(typeof e!="string"||!e.trim()||e!==e.trim())&&k(t,"expected a trimmed non-empty string"),e}function Z(e,t){(!e||typeof e!="object"||Array.isArray(e))&&k(t,"expected an object");let n=Object.getPrototypeOf(e);return n!==Object.prototype&&n!==null&&k(t,"expected a plain object"),e}function fa(e,t){return Array.isArray(e)||k(t,"expected an array"),e}function oe(e,t,n){let r=new Set(t);for(let i of Object.keys(e))r.has(i)||k(`${n}.${i}`,"unknown field")}function hr(e){if(!e||typeof e!="object"||Object.isFrozen(e))return e;for(let t of Object.values(e))hr(t);return Object.freeze(e)}function k(e,t){throw new Error(`shadow_map_experiment_invalid:${e}:${t}`)}var ma=new Set([".glb",".gltf",".png",".jpg",".jpeg",".webp",".env",".hdr",".dds",".ktx",".ktx2",".mp3",".wav",".ogg",".flac",".aac",".m4a"]);function pn(e){let t=String(e??"").trim().toLowerCase();if(/^\.[a-z0-9]+$/.test(t))return t;let n=t.split(/[?#]/,1)[0]??"",r=n.slice(n.lastIndexOf("/")+1),i=r.lastIndexOf(".");return i<=0||i===r.length-1?null:r.slice(i)}function bn(e){return ma.has(e)}function hn(e){return e==="fps.builtin.pbr"||e==="fps.builtin.standard"?e:void 0}function yn(e){if(!e||typeof e!="object")return;let t={};(e.lightingModel==="lit"||e.lightingModel==="unlit")&&(t.lightingModel=e.lightingModel);let n={},r=Sr(e.baseColor?.color);r&&(n.color=r);let i=we(e.baseColor?.texture);i!==void 0&&(n.texture=i),ue(e.baseColor,n,"brightness"),ue(e.baseColor,n,"saturation"),ue(e.baseColor,n,"contrast"),ue(e.baseColor,n,"hue"),Object.keys(n).length>0&&(t.baseColor=n);let o={},a=we(e.normal?.texture);a!==void 0&&(o.texture=a),ue(e.normal,o,"strength"),Object.keys(o).length>0&&(t.normal=o),_e(e.metallic)&&(t.metallic=e.metallic),_e(e.roughness)&&(t.roughness=e.roughness);let s={},l=we(e.metallicRoughness?.texture);l!==void 0&&(s.texture=l),Object.keys(s).length>0&&(t.metallicRoughness=s);let d={},u=we(e.occlusion?.texture);u!==void 0&&(d.texture=u),ue(e.occlusion,d,"strength"),Object.keys(d).length>0&&(t.occlusion=d);let c={},m=Sr(e.emission?.color);m&&(c.color=m),ue(e.emission,c,"intensity");let p=we(e.emission?.texture);p!==void 0&&(c.texture=p);let g=we(e.emission?.maskTexture);g!==void 0&&(c.maskTexture=g),Object.keys(c).length>0&&(t.emission=c);let b={};(e.alpha?.mode==="opaque"||e.alpha?.mode==="mask"||e.alpha?.mode==="blend")&&(b.mode=e.alpha.mode),ue(e.alpha,b,"opacity"),ue(e.alpha,b,"cutoff");let S=we(e.alpha?.texture);return S!==void 0&&(b.texture=S),Object.keys(b).length>0&&(t.alpha=b),Object.keys(t).length>0?t:void 0}function kt(...e){let t={};for(let n of e){let r=yn(n);r&&(r.lightingModel&&(t.lightingModel=r.lightingModel),Ge(t,r,"baseColor"),Ge(t,r,"normal"),r.metallic!==void 0&&(t.metallic=r.metallic),r.roughness!==void 0&&(t.roughness=r.roughness),Ge(t,r,"metallicRoughness"),Ge(t,r,"occlusion"),Ge(t,r,"emission"),Ge(t,r,"alpha"))}return yn(t)??{}}function Ge(e,t,n){let r=t[n];r&&Object.assign(e,{[n]:{...e[n]??{},...r}})}function Sr(e){return e&&_e(e.r)&&_e(e.g)&&_e(e.b)?{r:e.r,g:e.g,b:e.b}:void 0}function we(e){if(e===null)return null;if(!e||typeof e!="object")return;let t=typeof e.url=="string"?e.url.trim():"",n=typeof e.textureAssetId=="string"?e.textureAssetId.trim():"";if(!(!t&&!n))return{...t?{url:t}:{},...n?{textureAssetId:n}:{}}}function ue(e,t,n){_e(e?.[n])&&(t[n]=e[n])}function _e(e){return typeof e=="number"&&Number.isFinite(e)}function Er(e){let t=me(e);if(!t)return null;let n=L(t.sourceHash),r=L(t.lightHash),i=L(t.profileHash);if(!n||!r||!i)return null;let o={sourceHash:n,lightHash:r,profileHash:i,...typeof t.generatedAt=="string"&&t.generatedAt.trim()?{generatedAt:t.generatedAt.trim()}:{},...(()=>{let u=xa(t.stats);return u?{stats:u}:{}})()};if(t.version!==2||t.format!=="sdf-atlas"||!Array.isArray(t.pages)||!Array.isArray(t.chunks))return null;let a=[],s=new Map;for(let u of t.pages){let c=ga(u);if(!c||s.has(c.id))return null;a.push(c),s.set(c.id,c)}let l=[],d=new Set;for(let u of t.chunks){let c=pa(u,s);if(!c||d.has(c.id))return null;l.push(c),d.add(c.id)}return{version:2,format:"sdf-atlas",pages:a,chunks:l,...o}}function nt(e,t="$.staticShadows"){let n=Er(e);if(n)return n;let r=new Error(`schema.unsupportedVersion: ${t}`);throw Object.assign(r,{code:"schema.unsupportedVersion",path:t}),r}function ga(e){let t=me(e);if(!t)return null;let n=L(t.id),r=Ot(t.width),i=Ot(t.height),o=Pa(t.sdfTextureDataUrl);return!n||r==null||i==null||!o?null:{id:n,width:r,height:i,sdfTextureDataUrl:o}}function pa(e,t){let n=me(e);if(!n)return null;let r=L(n.id),i=Sa(n.bounds),o=Ea(n.plane),a=L(n.pageId),s=ya(n.atlasRect),l=ha(n.atlasUv),d=Ia(n.sourceNodeIds),u=L(n.sourceHash),c=L(n.lightHash),m=L(n.profileHash);if(!r||!i||!o||!a||!s||!l||!d||!u||!c||!m)return null;let p=t.get(a);return!p||s.x+s.width>p.width||s.y+s.height>p.height?null:{id:r,bounds:i,plane:o,pageId:a,atlasRect:s,atlasUv:l,sourceNodeIds:d,sourceHash:u,lightHash:c,profileHash:m,...(()=>{let g=ba(n.binding);return g?{binding:g}:{}})()}}function ba(e){let t=me(e);if(!t)return null;let n=L(t.id),r=L(t.ownerCasterId),i=L(t.receiverId),o=L(t.generatedAt),a=L(t.sourceHash);if(!n||!r||!i||!o||!a||t.visibleWhenOwnerVisible!==!0||t.staleWhenOwnerTransformChanges!==!0||t.staleWhenLightChanges!==!0)return null;let s=L(t.lightId),l=L(t.textureAssetId),d=L(t.projectionNodeId);return{id:n,ownerCasterId:r,receiverId:i,...s?{lightId:s}:{},...l?{textureAssetId:l}:{},...d?{projectionNodeId:d}:{},visibleWhenOwnerVisible:!0,staleWhenOwnerTransformChanges:!0,staleWhenLightChanges:!0,generatedAt:o,sourceHash:a}}function ya(e){let t=me(e);if(!t)return null;let n=ye(t.x),r=ye(t.y),i=Ot(t.width),o=Ot(t.height);return n==null||r==null||i==null||o==null?null:{x:n,y:r,width:i,height:o}}function ha(e){let t=me(e);if(!t)return null;let n=Ct(t.u0),r=Ct(t.v0),i=Ct(t.u1),o=Ct(t.v1);return n==null||r==null||i==null||o==null||i<=n||o<=r?null:{u0:n,v0:r,u1:i,v1:o}}function Sa(e){let t=me(e);if(!t)return null;let n=ae(t.minX),r=ae(t.maxX),i=ae(t.minZ),o=ae(t.maxZ),a=ae(t.y);return n==null||r==null||i==null||o==null||a==null||r<=n||o<=i?null:{minX:n,maxX:r,minZ:i,maxZ:o,y:a}}function Ea(e){let t=me(e);if(!t)return null;let n=ae(t.height),r=ae(t.yOffset);return n==null||r==null||r<0?null:{height:n,yOffset:r}}function xa(e){let t=me(e);if(!t)return null;let n=ye(t.sourceRootCount),r=ye(t.sourceMeshCount),i=ye(t.attemptedChunkCount),o=ye(t.chunkCount),a=ye(t.textureCount);return n==null||r==null||i==null||o==null||a==null?null:{sourceRootCount:n,sourceMeshCount:r,attemptedChunkCount:i,chunkCount:o,textureCount:a,...Rt(t.skippedChunkCount,"skippedChunkCount"),...Rt(t.pageCount,"pageCount"),...fe(t.resolution,"resolution"),...fe(t.chunkSize,"chunkSize"),...fe(t.atlasSize,"atlasSize"),...Nt(t.atlasUsedPixels,"atlasUsedPixels"),...Nt(t.atlasAllocatedPixels,"atlasAllocatedPixels"),...Aa(t.atlasOccupancy,"atlasOccupancy"),...fe(t.texelsPerMeter,"texelsPerMeter"),...fe(t.effectiveTexelsPerMeter,"effectiveTexelsPerMeter"),...fe(t.maxAtlasPages,"maxAtlasPages"),...Nt(t.sdfRadiusPx,"sdfRadiusPx"),...fe(t.spatialChunkSize,"spatialChunkSize"),...fe(t.effectiveSpatialChunkSize,"effectiveSpatialChunkSize"),...fe(t.targetChunkCount,"targetChunkCount"),...Rt(t.bakedChunkCount,"bakedChunkCount"),...Rt(t.reusedChunkCount,"reusedChunkCount"),...Nt(t.durationMs,"durationMs")}}function Pa(e){let t=L(e);return t&&/^data:image\/png[;,]/i.test(t)?t:null}function Ia(e){if(!Array.isArray(e)||e.length===0)return null;let t=[],n=new Set;for(let r of e){let i=L(r);if(!i)return null;n.has(i)||t.push(i),n.add(i)}return t}function L(e){return typeof e=="string"&&e.trim()?e.trim():null}function ae(e){return typeof e=="number"&&Number.isFinite(e)?e:null}function ye(e){return typeof e=="number"&&Number.isInteger(e)&&e>=0?e:null}function Ot(e){return typeof e=="number"&&Number.isInteger(e)&&e>0?e:null}function Ct(e){return typeof e=="number"&&Number.isFinite(e)&&e>=0&&e<=1?e:null}function Rt(e,t){let n=ye(e);return n==null?{}:{[t]:n}}function fe(e,t){let n=ae(e);return n==null||n<=0?{}:{[t]:n}}function Nt(e,t){let n=ae(e);return n==null||n<0?{}:{[t]:n}}function Aa(e,t){let n=ae(e);return n==null||n<0||n>1?{}:{[t]:n}}function me(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:null}var wa="@fps-games/editor.playable-sdk.scene-compiler",Ta="2",Da=1e-4,H={nodeKinds:["group","instance","transform","primitive","image"],primitiveShapes:["cube","sphere","plane","capsule"],transformTypes:["plain","light","camera","groundDecal"],assetTypes:["glb","texture"],materialScopes:["sharedAsset","nodeMaterial"],materialModes:["shared","instance"],materialShaderIds:["fps.builtin.pbr","fps.builtin.standard"],materialAssetSystemPresets:["default-pbr","default-standard"],runtimeV3:{assetFields:["id","guid","type","url","external","warmupCount","singleton","materialMode","defaults","materialSlots"],materialSlotFields:["slotId","label","sourceSurfaces"],materialSlotSourceSurfaceFields:["ownerNodePath","nodeIndex","nodeIndexPath","meshIndex","primitiveIndex","sourceMaterialIndex","sourceMeshName"]},hierarchy:{parentTargets:["root","sceneNode"]},runtimeOnlyTokens:["/@fs","assetUrl","sourceAssetUrl","sourceAssetPath"]},Ma=new Set(H.nodeKinds),ka=new Set(H.primitiveShapes),Ca=new Set(H.assetTypes),Ra=new Set(H.materialModes),Na=new Set(H.materialScopes),Oa=new Set(H.materialAssetSystemPresets),$a=new Set(H.transformTypes),rt=new Set(H.hierarchy.parentTargets),va=H.runtimeOnlyTokens,Ga=new Set(H.runtimeV3.assetFields),_a=new Set(H.runtimeV3.materialSlotFields),ja=new Set(H.runtimeV3.materialSlotSourceSurfaceFields);function La(e,t={}){let{allowOrphanSharedMaterials:n=!0,allowOrphanNodeMaterials:r=!0,strictAssetIds:i=[],strictNodeIds:o=[],maxErrors:a=50}=t,s=Number.isInteger(a)&&a>0?a:50,l=[],d=new Set(i),u=new Set(o),c=(f,v)=>{l.length<s&&l.push({path:f,message:v})};if(!E(e))return c("$","scene json must be an object"),l;let m=e.schemaVersion;m!==2&&m!==3&&c("$.schemaVersion","schemaVersion must be 2 or 3"),Ja(e.meta?.generatedFrom,"$.meta.generatedFrom",c);let p=is(e),g=e.scene;if(!E(g))return c("$.scene","scene must be an object"),l;if(P(g.rootId)||c("$.scene.rootId","rootId must be a non-empty string"),Array.isArray(g.assets)||c("$.scene.assets","assets must be an array"),Array.isArray(g.nodes)||c("$.scene.nodes","nodes must be an array"),Array.isArray(g.materialAssets)||c("$.scene.materialAssets","materialAssets must be an array"),Array.isArray(g.materials)||c("$.scene.materials","materials must be an array"),Array.isArray(g.textures)||c("$.scene.textures","textures must be an array"),l.length>0)return l;e.staticShadows!=null&&xr(()=>nt(e.staticShadows,"$.staticShadows"),"$.staticShadows",c);let b=new Set,S=new Map,x=new Map,D=new Set,w=new Set([g.rootId]),M=new Map,O=new Map,z=new Set;return g.assets.forEach((f,v)=>{let y=`$.scene.assets[${v}]`;if(!E(f)){c(y,"asset must be an object");return}if(P(f.id)?b.has(f.id)?c(`${y}.id`,`duplicate asset id: ${f.id}`):(b.add(f.id),S.set(f.id,f.type)):c(`${y}.id`,"asset.id must be a non-empty string"),Ca.has(f.type)||c(`${y}.type`,"asset.type must be glb or texture"),f.guid!=null&&!P(f.guid)&&c(`${y}.guid`,"asset.guid must be a non-empty string when present"),f.url!=null&&!P(f.url)&&c(`${y}.url`,"url must be a non-empty string when present"),f.external!=null&&!E(f.external)&&c(`${y}.external`,"external must be an object when present"),f.warmupCount!=null&&(!Number.isInteger(f.warmupCount)||f.warmupCount<0)&&c(`${y}.warmupCount`,"warmupCount must be a non-negative integer when present"),f.singleton!=null&&typeof f.singleton!="boolean"&&c(`${y}.singleton`,"singleton must be a boolean when present"),f.materialMode!=null&&!Ra.has(f.materialMode)&&c(`${y}.materialMode`,"materialMode must be shared or instance"),qa(f.defaults,`${y}.defaults`,c),m===3)for(let j of Object.keys(f))Ga.has(j)||c(`${y}.${j}`,`runtime schema v3 asset field is not allowed: ${j}`);else f.displayName!=null&&!P(f.displayName)&&c(`${y}.displayName`,"displayName must be a non-empty string when present"),f.category!=null&&!P(f.category)&&c(`${y}.category`,"category must be a non-empty string when present"),f.metadata!=null&&!E(f.metadata)&&c(`${y}.metadata`,"metadata must be an object when present");let G=m===3?f.materialSlots:E(f.metadata)?f.metadata.materialSlots:void 0,J=m===3?`${y}.materialSlots`:`${y}.metadata.materialSlots`,Y=new Set;G!=null&&(Array.isArray(G)?G.forEach((j,$e)=>{let Ie=`${J}[${$e}]`;if(!E(j)||!P(j.slotId)){c(Ie,m===3?"material slot must contain a stable slotId":"material slot must contain stable slotId and ownerNodePath");return}if(m!==3&&!P(j.ownerNodePath)){c(Ie,"material slot must contain stable slotId and ownerNodePath");return}Y.has(j.slotId)?c(`${Ie}.slotId`,`duplicate material slot id: ${j.slotId}`):Y.add(j.slotId),m===3&&Wa(j,Ie,c)}):c(J,"materialSlots must be an array when present")),P(f.id)&&x.set(f.id,Y),d.has(f.id)&&Ar(f,y,c)}),g.nodes.forEach((f,v)=>{let y=`$.scene.nodes[${v}]`;if(!E(f)){c(y,"node must be an object");return}P(f.id)&&M.set(f.id,f),P(f.id)?w.has(f.id)?c(`${y}.id`,`duplicate node id: ${f.id}`):(w.add(f.id),typeof f.kind=="string"&&O.set(f.id,f.kind),f.kind==="transform"&&Object.prototype.hasOwnProperty.call(f,"marker")&&z.add(f.id)):c(`${y}.id`,"node.id must be a non-empty string"),Ma.has(f.kind)||c(`${y}.kind`,"node.kind must be group, instance, transform, primitive, or image")}),g.materialAssets.forEach((f,v)=>{let y=`$.scene.materialAssets[${v}]`;if(!E(f)){c(y,"material asset must be an object");return}P(f.id)?D.has(f.id)?c(`${y}.id`,`duplicate material asset id: ${f.id}`):D.add(f.id):c(`${y}.id`,"material asset id must be a non-empty string"),f.name!=null&&!P(f.name)&&c(`${y}.name`,"material asset name must be a non-empty string when present"),f.guid!=null&&!P(f.guid)&&c(`${y}.guid`,"material asset guid must be a non-empty string when present"),Object.prototype.hasOwnProperty.call(f,"materialKind")&&c(`${y}.materialKind`,"materialKind is not supported; use shaderId"),Object.prototype.hasOwnProperty.call(f,"profile")&&c(`${y}.profile`,"profile is not supported; use properties"),hn(f.shaderId)||c(`${y}.shaderId`,"shaderId must be fps.builtin.pbr or fps.builtin.standard"),Dr(f.properties,`${y}.properties`,c);for(let G of Object.keys(f))["id","guid","name","shaderId","properties","system","origin"].includes(G)||c(`${y}.${G}`,`material asset field is not allowed: ${G}`);za(f.system,`${y}.system`,c),Ba(f.origin,`${y}.origin`,c),Va(f,y,c)}),g.nodes.forEach((f,v)=>{if(!E(f))return;let y=`$.scene.nodes[${v}]`,G=Object.prototype.hasOwnProperty.call(f,"parentId");G&&!P(f.parentId)&&c(`${y}.parentId`,"parentId must be a non-empty string when present");let J=G?f.parentId:g.rootId;P(J)&&Ka(J,g.rootId,w,`${y}.parentId`,c),P(f.id)&&Ha(f.id,g.rootId,M,`${y}.parentId`,c),Ya(f.source,`${y}.source`,c),kr(f.transform,`${y}.transform`,c),ps(f.rendering,`${y}.rendering`,c),f.shadow!=null&&xr(()=>Ze(f.shadow,`${y}.shadow`),`${y}.shadow`,c),Object.prototype.hasOwnProperty.call(f,"shadowMode")&&c(`${y}.shadowMode`,"deprecated field; use shadow.mode");let Y=null;f.kind==="instance"&&(E(f.instance)?b.has(f.instance.assetId)?S.get(f.instance.assetId)!=="glb"?c(`${y}.instance.assetId`,"instance.assetId must reference a glb asset"):Y=P(f.instance.assetId)?f.instance.assetId:null:c(`${y}.instance.assetId`,`assetId must reference scene.assets: ${f.instance.assetId}`):c(`${y}.instance`,"instance node must contain instance object")),f.kind==="primitive"&&(E(f.primitive)?ka.has(f.primitive.shape)||c(`${y}.primitive.shape`,"primitive.shape must be cube, sphere, plane, or capsule"):c(`${y}.primitive`,"primitive node must contain primitive object")),f.kind==="image"&&(E(f.image)?(b.has(f.image.assetId)?S.get(f.image.assetId)!=="texture"&&c(`${y}.image.assetId`,"image.assetId must reference a texture asset"):c(`${y}.image.assetId`,`assetId must reference scene.assets: ${f.image.assetId}`),E(f.image.size)?(Ir(f.image.size.width)||c(`${y}.image.size.width`,"image.size.width must be positive"),Ir(f.image.size.height)||c(`${y}.image.size.height`,"image.size.height must be positive")):c(`${y}.image.size`,"image.size must be an object")):c(`${y}.image`,"image node must contain image object")),f.kind==="transform"&&f.transformType!=null&&!$a.has(f.transformType)&&c(`${y}.transformType`,"transformType must be plain, light, camera, or groundDecal"),f.kind==="transform"&&f.transformType==="groundDecal"?ss(f.groundDecal,`${y}.groundDecal`,c):Object.prototype.hasOwnProperty.call(f,"groundDecal")&&c(`${y}.groundDecal`,"groundDecal is only allowed on transform nodes with transformType groundDecal"),f.kind==="transform"&&(rs(f.camera,`${y}.camera`,c),os(f.light,`${y}.light`,c,p)),Object.prototype.hasOwnProperty.call(f,"marker")&&(f.kind!=="transform"?c(`${y}.marker`,"marker is only allowed on transform nodes"):(Xa(f.marker,`${y}.marker`,c),Za(f.marker,f.id,w,z,`${y}.marker`,c))),(f.kind==="instance"||f.kind==="transform"||f.kind==="primitive"||f.kind==="image")&&Fa(f.overrides,`${y}.overrides`,D,Y?x.get(Y):void 0,m===3?"materialSlots":"metadata.materialSlots",c),u.has(f.id)&&Ar(f,y,c)}),g.materials.forEach((f,v)=>{let y=`$.scene.materials[${v}]`;if(!E(f)){c(y,"material must be an object");return}if(P(f.id)||c(`${y}.id`,"material.id must be a non-empty string"),f.scope!=null&&!Na.has(f.scope)&&c(`${y}.scope`,"material scope must be sharedAsset or nodeMaterial"),f.scope==="sharedAsset"&&(!P(f.assetId)||!b.has(f.assetId))&&!n&&c(`${y}.assetId`,`shared material assetId must reference scene.assets: ${f.assetId}`),f.scope==="nodeMaterial"){if((!P(f.nodeId)||!w.has(f.nodeId))&&!r)c(`${y}.nodeId`,`node material nodeId must reference scene.nodes: ${f.nodeId}`);else if(P(f.nodeId)&&w.has(f.nodeId)){let G=O.get(f.nodeId);G!=="instance"&&G!=="transform"&&G!=="primitive"&&c(`${y}.nodeId`,`node material nodeId must reference an instance, transform, or primitive node: ${f.nodeId}`)}}P(f.materialName)||c(`${y}.materialName`,"materialName must be a non-empty string"),E(f.properties)?Rr(f.properties,`${y}.properties`,c):c(`${y}.properties`,"properties must be an object")}),l}function wr(e,t={}){let n=La(e,t);return{ok:n.length===0,errors:n}}function xr(e,t,n){try{e()}catch(r){let i=typeof r?.path=="string"?r.path:t,o=typeof r?.code=="string"?r.code:"schema.invalidValue";n(i,o)}}function Fa(e,t,n,r,i,o){if(e!=null){if(!E(e)){o(t,"overrides must be an object when present");return}Tr(e.materialBinding,`${t}.materialBinding`,n,o),Ua(e.materialSlotBindings,`${t}.materialSlotBindings`,"slotId",n,r,i,o),Object.prototype.hasOwnProperty.call(e,"childMaterialBindings")&&o(`${t}.childMaterialBindings`,"deprecated field; use materialSlotBindings keyed by slotId"),Object.prototype.hasOwnProperty.call(e,"childMaterials")&&o(`${t}.childMaterials`,"deprecated field; use materialSlotBindings keyed by slotId")}}function Ua(e,t,n,r,i,o,a){if(e!=null){if(!E(e)){a(t,"material binding map must be an object when present");return}for(let[s,l]of Object.entries(e)){let d=`${t}.${s}`;P(s)||a(d,`${n} must be a non-empty string`),i?i.has(s)||a(d,`${n} must reference asset ${o}`):a(d,`${n} requires an instance asset with ${o}`),l==null?a(d,"material binding must be an object"):Tr(l,d,r,a)}}}function Tr(e,t,n,r){if(e!=null){if(!E(e)){r(t,"material binding must be an object when present");return}e.materialAssetId!=null&&(P(e.materialAssetId)?n.has(e.materialAssetId)||r(`${t}.materialAssetId`,`materialAssetId must reference scene.materialAssets: ${e.materialAssetId}`):r(`${t}.materialAssetId`,"materialAssetId must be non-empty when present")),e.override!=null&&Dr(e.override,`${t}.override`,r)}}function Dr(e,t,n){if(!E(e)){n(t,"material asset profile must be an object");return}if(e.lightingModel!=null&&e.lightingModel!=="lit"&&e.lightingModel!=="unlit"&&n(`${t}.lightingModel`,"lightingModel must be lit or unlit"),e.baseColor!=null)if(!E(e.baseColor))n(`${t}.baseColor`,"baseColor must be an object");else{$t(e.baseColor.color,`${t}.baseColor.color`,n),Te(e.baseColor.texture,`${t}.baseColor.texture`,n);for(let r of["brightness","saturation","contrast","hue"])e.baseColor[r]!=null&&!K(e.baseColor[r])&&n(`${t}.baseColor.${r}`,`${r} must be a finite number`)}for(let r of["metallic","roughness"])e[r]!=null&&!K(e[r])&&n(`${t}.${r}`,`${r} must be a finite number`);e.normal!=null&&(E(e.normal)?(Te(e.normal.texture,`${t}.normal.texture`,n),e.normal.strength!=null&&!K(e.normal.strength)&&n(`${t}.normal.strength`,"normal strength must be a finite number")):n(`${t}.normal`,"normal must be an object")),e.metallicRoughness!=null&&(E(e.metallicRoughness)?Te(e.metallicRoughness.texture,`${t}.metallicRoughness.texture`,n):n(`${t}.metallicRoughness`,"metallicRoughness must be an object")),e.occlusion!=null&&(E(e.occlusion)?(Te(e.occlusion.texture,`${t}.occlusion.texture`,n),e.occlusion.strength!=null&&!K(e.occlusion.strength)&&n(`${t}.occlusion.strength`,"occlusion strength must be a finite number")):n(`${t}.occlusion`,"occlusion must be an object")),e.emission!=null&&(E(e.emission)?($t(e.emission.color,`${t}.emission.color`,n),e.emission.intensity!=null&&!K(e.emission.intensity)&&n(`${t}.emission.intensity`,"emission intensity must be a finite number"),Te(e.emission.texture,`${t}.emission.texture`,n),Te(e.emission.maskTexture,`${t}.emission.maskTexture`,n)):n(`${t}.emission`,"emission must be an object")),e.alpha!=null&&(E(e.alpha)?(e.alpha.mode!=null&&e.alpha.mode!=="opaque"&&e.alpha.mode!=="mask"&&e.alpha.mode!=="blend"&&n(`${t}.alpha.mode`,"alpha mode must be opaque, mask, or blend"),e.alpha.opacity!=null&&!K(e.alpha.opacity)&&n(`${t}.alpha.opacity`,"alpha opacity must be a finite number"),e.alpha.cutoff!=null&&!K(e.alpha.cutoff)&&n(`${t}.alpha.cutoff`,"alpha cutoff must be a finite number"),Te(e.alpha.texture,`${t}.alpha.texture`,n)):n(`${t}.alpha`,"alpha must be an object"))}function Te(e,t,n){if(e!=null){if(!E(e)){n(t,"texture ref must be an object");return}e.url!=null&&!P(e.url)&&n(`${t}.url`,"texture url must be non-empty when present"),e.textureAssetId!=null&&!P(e.textureAssetId)&&n(`${t}.textureAssetId`,"textureAssetId must be non-empty when present")}}function za(e,t,n){if(e!=null){if(!E(e)){n(t,"material asset system must be an object");return}e.readonly!=null&&typeof e.readonly!="boolean"&&n(`${t}.readonly`,"readonly must be boolean"),e.preset!=null&&!Oa.has(e.preset)&&n(`${t}.preset`,"preset must be default-pbr or default-standard")}}function Ba(e,t,n){if(e!=null){if(!E(e)){n(t,"material asset origin must be an object");return}e.type!=="imported"&&e.type!=="created"&&e.type!=="duplicated"&&e.type!=="preset"&&n(`${t}.type`,"origin type must be imported, created, duplicated, or preset"),e.sourceAssetGuid!=null&&!P(e.sourceAssetGuid)&&n(`${t}.sourceAssetGuid`,"sourceAssetGuid must be non-empty when present"),e.sourceAssetId!=null&&!P(e.sourceAssetId)&&n(`${t}.sourceAssetId`,"sourceAssetId must be non-empty when present"),e.sourceSlotId!=null&&!P(e.sourceSlotId)&&n(`${t}.sourceSlotId`,"sourceSlotId must be non-empty when present"),e.sourceMaterialIndex!=null&&!Number.isInteger(e.sourceMaterialIndex)&&n(`${t}.sourceMaterialIndex`,"sourceMaterialIndex must be an integer when present"),e.sourceMaterialName!=null&&!P(e.sourceMaterialName)&&n(`${t}.sourceMaterialName`,"sourceMaterialName must be non-empty when present"),e.sourceMaterialAssetId!=null&&!P(e.sourceMaterialAssetId)&&n(`${t}.sourceMaterialAssetId`,"sourceMaterialAssetId must be non-empty when present")}}function Va(e,t,n){let r=E(e.system)?e.system.preset:void 0;r==="default-pbr"&&e.shaderId!=="fps.builtin.pbr"&&n(`${t}.shaderId`,"default-pbr material assets must use shaderId fps.builtin.pbr"),r==="default-standard"&&e.shaderId!=="fps.builtin.standard"&&n(`${t}.shaderId`,"default-standard material assets must use shaderId fps.builtin.standard")}function Ka(e,t,n,r,i){if(e===t){rt.has("root")||i(r,`parentId must point to scene node: ${e}`);return}if(rt.has("sceneNode")&&n.has(e))return;let o=rt.has("root")&&rt.has("sceneNode")?"root or scene node":rt.has("sceneNode")?"scene node":"root";i(r,`parentId must point to ${o}: ${e}`)}function Ha(e,t,n,r,i){if(!P(t))return;let o=new Set([e]),a=P(n.get(e)?.parentId)?n.get(e)?.parentId:t;for(;P(a)&&a!==t;){if(o.has(a)){i(r,`parentId creates a node cycle involving ${e}`);return}o.add(a);let s=n.get(a);if(!s)return;a=P(s.parentId)?s.parentId:t}}function Wa(e,t,n){for(let r of Object.keys(e))_a.has(r)||n(`${t}.${r}`,`runtime schema v3 material slot field is not allowed: ${r}`);if(e.label!=null&&!P(e.label)&&n(`${t}.label`,"label must be a non-empty string when present"),!Array.isArray(e.sourceSurfaces)||e.sourceSurfaces.length===0){n(`${t}.sourceSurfaces`,"sourceSurfaces must be a non-empty array");return}for(let r=0;r<e.sourceSurfaces.length;r+=1){let i=`${t}.sourceSurfaces[${r}]`,o=e.sourceSurfaces[r];if(!E(o)){n(i,"source surface must be an object");continue}for(let a of Object.keys(o))ja.has(a)||n(`${i}.${a}`,`runtime schema v3 material slot source surface field is not allowed: ${a}`);P(o.ownerNodePath)||n(`${i}.ownerNodePath`,"ownerNodePath must be a non-empty string");for(let a of["meshIndex","primitiveIndex"])(!Number.isInteger(o[a])||o[a]<0)&&n(`${i}.${a}`,`${a} must be a non-negative integer`);for(let a of["nodeIndex","sourceMaterialIndex"])o[a]!=null&&(!Number.isInteger(o[a])||o[a]<0)&&n(`${i}.${a}`,`${a} must be a non-negative integer when present`);o.nodeIndexPath!=null&&(!Array.isArray(o.nodeIndexPath)||o.nodeIndexPath.some(a=>!Number.isInteger(a)||a<0))&&n(`${i}.nodeIndexPath`,"nodeIndexPath must contain non-negative integers"),P(o.sourceMeshName)||n(`${i}.sourceMeshName`,"sourceMeshName is required")}}function qa(e,t,n){if(e!=null){if(!E(e)){n(t,"defaults must be an object");return}if(kr(e.transform,`${t}.transform`,n),Pr(e.outline,`${t}.outline`,n),e.childOutlines!=null)if(!E(e.childOutlines))n(`${t}.childOutlines`,"childOutlines must be an object");else for(let[r,i]of Object.entries(e.childOutlines))Pr(i,`${t}.childOutlines.${r}`,n)}}function Ja(e,t,n){if(e!=null){if(!E(e)){n(t,"generatedFrom must be an object when present");return}Mr(e,t,n),P(e.compilerId)||n(`${t}.compilerId`,"compilerId must be a non-empty string"),P(e.compilerVersion)||n(`${t}.compilerVersion`,"compilerVersion must be a non-empty string"),P(e.compiledAt)||n(`${t}.compiledAt`,"compiledAt must be a non-empty string")}}function Ya(e,t,n){if(e!=null){if(!E(e)){n(t,"source must be an object when present");return}Mr(e,t,n),e.objectGuid!=null&&!P(e.objectGuid)&&n(`${t}.objectGuid`,"objectGuid must be a non-empty string when present"),e.objectId!=null&&!P(e.objectId)&&n(`${t}.objectId`,"objectId must be a non-empty string when present"),e.component!=null&&!P(e.component)&&n(`${t}.component`,"component must be a non-empty string when present"),e.propertyPath!=null&&!P(e.propertyPath)&&n(`${t}.propertyPath`,"propertyPath must be a non-empty string when present")}}function Mr(e,t,n){P(e.sourceId)||n(`${t}.sourceId`,"sourceId must be a non-empty string"),P(e.sourceType)||n(`${t}.sourceType`,"sourceType must be a non-empty string"),e.revision!=null&&(typeof e.revision!="number"||!Number.isFinite(e.revision))&&n(`${t}.revision`,"revision must be a finite number when present")}function En(e,t){let n=wr(e,t);if(n.ok)return;let r=new Error(`scene_json_schema_failed:
3
- ${JSON.stringify(n.errors,null,2)}`);throw Object.assign(r,{code:"scene_json_schema_failed",diagnostics:n.errors}),r}function E(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}function P(e){return typeof e=="string"&&e.trim().length>0}function kr(e,t,n){if(e!=null){if(!E(e)){n(t,"transform must be an object");return}se(e.position,`${t}.position`,n),se(e.rotation,`${t}.rotation`,n),se(e.rotationDeg,`${t}.rotationDeg`,n),typeof e.scale=="number"?Number.isFinite(e.scale)||n(`${t}.scale`,"scale number must be finite"):se(e.scale,`${t}.scale`,n)}}function Xa(e,t,n){if(!E(e)){n(t,"marker must be an object");return}he(e,["schemaVersion","label","type","kind","tags","note","color","target","semanticFrame","geometry","metadata"],t,n),e.schemaVersion!==1&&n(`${t}.schemaVersion`,"marker.schemaVersion must be 1"),P(e.label)||n(`${t}.label`,"marker.label must be a non-empty string"),P(e.type)||n(`${t}.type`,"marker.type must be a non-empty string"),e.kind!=null&&!P(e.kind)&&n(`${t}.kind`,"marker.kind must be a non-empty string when present"),e.tags!=null&&(Array.isArray(e.tags)?e.tags.forEach((r,i)=>{typeof r!="string"&&n(`${t}.tags[${i}]`,"marker tag must be a string")}):n(`${t}.tags`,"marker.tags must be an array when present")),e.note!=null&&typeof e.note!="string"&&n(`${t}.note`,"marker.note must be a string when present"),e.color!=null&&ts(e.color,`${t}.color`,n),e.target!=null&&Sn(e.target,`${t}.target`,n),e.semanticFrame!=null&&Qa(e.semanticFrame,`${t}.semanticFrame`,n),es(e.geometry,`${t}.geometry`,n),e.metadata!=null&&!E(e.metadata)&&n(`${t}.metadata`,"marker.metadata must be an object when present")}function Za(e,t,n,r,i,o){if(!E(e))return;let a=[];e.target!=null&&a.push({value:e.target,path:`${i}.target`}),E(e.geometry)&&e.geometry.target!=null&&a.push({value:e.geometry.target,path:`${i}.geometry.target`});for(let s of a)E(s.value)&&(s.value.kind!=="scene-object"&&s.value.kind!=="marker"&&o(`${s.path}.kind`,"runtime marker target kind must be scene-object or marker"),P(s.value.id)&&(s.value.id===t?o(`${s.path}.id`,"runtime marker target must not reference its marker node"):n.has(s.value.id)?s.value.kind==="marker"&&!r.has(s.value.id)?o(`${s.path}.id`,`runtime marker target must reference a marker node: ${s.value.id}`):s.value.kind==="scene-object"&&r.has(s.value.id)&&o(`${s.path}.id`,`runtime scene-object target must not reference a marker node: ${s.value.id}`):o(`${s.path}.id`,`runtime marker target must reference scene.nodes: ${s.value.id}`)))}function Sn(e,t,n){if(!E(e)){n(t,"marker target must be an object");return}he(e,["kind","id","label","path","metadata"],t,n),P(e.kind)||n(`${t}.kind`,"marker target kind must be a non-empty string"),P(e.id)||n(`${t}.id`,"marker target id must be a non-empty string");for(let r of["label","path"])e[r]!=null&&typeof e[r]!="string"&&n(`${t}.${r}`,`marker target ${r} must be a string when present`);e.metadata!=null&&!E(e.metadata)&&n(`${t}.metadata`,"marker target metadata must be an object when present")}function Qa(e,t,n){if(!E(e)){n(t,"marker semanticFrame must be an object");return}he(e,["origin","forward","right","up","label","description"],t,n),E(e.origin)?se(e.origin,`${t}.origin`,n):n(`${t}.origin`,"marker semanticFrame.origin must be a vector object");for(let r of["forward","right","up"])e[r]!=null&&se(e[r],`${t}.${r}`,n);for(let r of["label","description"])e[r]!=null&&typeof e[r]!="string"&&n(`${t}.${r}`,`marker semanticFrame ${r} must be a string when present`)}function es(e,t,n){if(!E(e)){n(t,"marker.geometry must be an object");return}if(e.kind==="box"){he(e,["kind"],t,n);return}if(e.kind==="point"){he(e,["kind","coordinateSpace","position","offset","target"],t,n),e.coordinateSpace!=null&&e.coordinateSpace!=="world"&&e.coordinateSpace!=="local"&&n(`${t}.coordinateSpace`,"point marker coordinateSpace must be world or local"),e.position!=null&&se(e.position,`${t}.position`,n),e.offset!=null&&se(e.offset,`${t}.offset`,n),e.target!=null&&Sn(e.target,`${t}.target`,n);return}if(e.kind==="object-bounds"){he(e,["kind","target"],t,n),Sn(e.target,`${t}.target`,n);return}if(e.kind==="polyhedron"){he(e,["kind","coordinateSpace","vertices","faces"],t,n),e.coordinateSpace!=null&&e.coordinateSpace!=="world"&&n(`${t}.coordinateSpace`,"polyhedron marker coordinateSpace must be world"),Array.isArray(e.vertices)?e.vertices.forEach((r,i)=>{let o=`${t}.vertices[${i}]`;E(r)?se(r,o,n):n(o,"polyhedron marker vertex must be a vector object")}):n(`${t}.vertices`,"polyhedron marker vertices must be an array"),e.faces!=null&&(Array.isArray(e.faces)?e.faces.forEach((r,i)=>{Array.isArray(r)?r.forEach((o,a)=>{(!Number.isInteger(o)||o<0)&&n(`${t}.faces[${i}][${a}]`,"polyhedron marker index must be a non-negative integer")}):n(`${t}.faces[${i}]`,"polyhedron marker face must be an array")}):n(`${t}.faces`,"polyhedron marker faces must be an array when present"));return}n(`${t}.kind`,"marker.geometry.kind must be box, point, object-bounds, or polyhedron")}function ts(e,t,n){if(!E(e)){n(t,"marker color must be an object");return}he(e,["r","g","b"],t,n);for(let r of["r","g","b"])Cr(e[r])||n(`${t}.${r}`,"marker color component must be between 0 and 1")}function he(e,t,n,r){let i=new Set(t);for(let o of Object.keys(e))i.has(o)||r(`${n}.${o}`,`field is not allowed: ${o}`)}function se(e,t,n){if(e!=null){if(!E(e)){n(t,"value must be a vector object");return}for(let r of["x","y","z"])(typeof e[r]!="number"||!Number.isFinite(e[r]))&&n(`${t}.${r}`,"vector component must be a finite number")}}function ns(e,t,n){if(e!=null){if(!E(e)){n(t,"value must be a vector object");return}for(let r of["x","y"])(typeof e[r]!="number"||!Number.isFinite(e[r]))&&n(`${t}.${r}`,"vector component must be a finite number")}}function K(e){return typeof e=="number"&&Number.isFinite(e)}function De(e){return K(e)&&e>0}function Cr(e){return K(e)&&e>=0&&e<=1}function $t(e,t,n){if(e!=null){if(!E(e)){n(t,"color must be an object");return}for(let r of["r","g","b"])(typeof e[r]!="number"||!Number.isFinite(e[r]))&&n(`${t}.${r}`,"color component must be a finite number")}}function rs(e,t,n){if(e!=null){if(!E(e)){n(t,"camera must be an object");return}e.projection!=null&&e.projection!=="orthographic"&&e.projection!=="perspective"&&n(`${t}.projection`,"camera projection must be orthographic or perspective");for(let r of["alpha","beta"])e[r]!=null&&!K(e[r])&&n(`${t}.${r}`,"camera property must be a finite number when present");for(let r of["radius","orthoSize"])e[r]!=null&&!De(e[r])&&n(`${t}.${r}`,"camera property must be a positive finite number when present");e.fov!=null&&!De(e.fov)&&n(`${t}.fov`,"camera fov must be a positive finite number"),se(e.targetOffset,`${t}.targetOffset`,n),ns(e.targetScreenOffset,`${t}.targetScreenOffset`,n);for(let r of["minZ","maxZ","lowerRadiusLimit","upperRadiusLimit"])e[r]!=null&&!De(e[r])&&n(`${t}.${r}`,"camera property must be a positive finite number");for(let r of["lowerBetaLimit","upperBetaLimit"])e[r]!=null&&!K(e[r])&&n(`${t}.${r}`,"camera property must be a finite number");e.inertia!=null&&!Cr(e.inertia)&&n(`${t}.inertia`,"camera inertia must be between 0 and 1"),De(e.minZ)&&De(e.maxZ)&&e.maxZ<=e.minZ&&n(`${t}.maxZ`,"camera maxZ must be greater than minZ"),K(e.lowerBetaLimit)&&K(e.upperBetaLimit)&&e.upperBetaLimit<e.lowerBetaLimit&&n(`${t}.upperBetaLimit`,"camera upperBetaLimit must be greater than or equal to lowerBetaLimit"),De(e.lowerRadiusLimit)&&De(e.upperRadiusLimit)&&e.upperRadiusLimit<e.lowerRadiusLimit&&n(`${t}.upperRadiusLimit`,"camera upperRadiusLimit must be greater than or equal to lowerRadiusLimit")}}function is(e){let t=e.meta?.generatedFrom;return E(t)&&t.compilerId===wa&&t.compilerVersion===Ta}function os(e,t,n,r=!1){if(e==null)return;let i=r&&E(e)&&!Object.prototype.hasOwnProperty.call(e,"schemaVersion")?as(e,t):e;try{ve(i,t)}catch(o){let a=o;n(typeof a.path=="string"?a.path:t,typeof a.reason=="string"?a.reason:typeof a.message=="string"?a.message:"light does not satisfy the Engine Runtime Light contract")}}function as(e,t){let n={...e,schemaVersion:1};if(e.type!=="directional"||!E(e.direction))return n;let{x:r,y:i,z:o}=e.direction;if(![r,i,o].every(s=>typeof s=="number"&&Number.isFinite(s)))return n;let a=Math.hypot(r,i,o);return a<=0||Math.abs(a-1)>Da?n:{...n,direction:Je(e.direction,`${t}.direction`)}}function Pr(e,t,n){if(e!=null){if(!E(e)){n(t,"outline must be an object");return}e.renderOutline!=null&&typeof e.renderOutline!="boolean"&&n(`${t}.renderOutline`,"renderOutline must be boolean"),e.outlineWidth!=null&&(typeof e.outlineWidth!="number"||!Number.isFinite(e.outlineWidth))&&n(`${t}.outlineWidth`,"outlineWidth must be a finite number"),$t(e.outlineColor,`${t}.outlineColor`,n)}}function ss(e,t,n){if(e==null){n(t,"groundDecal is required when transformType is groundDecal");return}if(!E(e)){n(t,"groundDecal must be an object");return}ds(e,t,n)}function ds(e,t,n){if(P(e.uiKind)||n(`${t}.uiKind`,"groundDecal UI kind must be non-empty"),!E(e.size))n(`${t}.size`,"groundDecal.size must be an object");else for(let r of["width","depth"])(typeof e.size[r]!="number"||!Number.isFinite(e.size[r])||e.size[r]<=0)&&n(`${t}.size.${r}`,"groundDecal size must be a positive finite number");if(e.aspectSourceLayerId!=null&&!P(e.aspectSourceLayerId)&&n(`${t}.aspectSourceLayerId`,"aspectSourceLayerId must be non-empty when present"),e.lockAspectToBorder!=null&&typeof e.lockAspectToBorder!="boolean"&&n(`${t}.lockAspectToBorder`,"lockAspectToBorder must be boolean when present"),e.editorPreviewActive!=null&&n(`${t}.editorPreviewActive`,"editorPreviewActive is editor-only and must not appear in runtime scene data"),ls(e.mask,`${t}.mask`,n),cs(e.rendering,`${t}.rendering`,n),!Array.isArray(e.layers)){n(`${t}.layers`,"groundDecal UI layers must be an array");return}e.layers.forEach((r,i)=>us(r,`${t}.layers[${i}]`,n)),fs(e.layers,`${t}.layers`,n)}function ls(e,t,n){if(e!=null){if(!E(e)){n(t,"groundDecal UI mask must be an object");return}e.enabled!=null&&typeof e.enabled!="boolean"&&n(`${t}.enabled`,"mask.enabled must be boolean"),e.source!=null&&e.source!=="roundedRect"&&e.source!=="borderAlpha"&&e.source!=="texture"&&n(`${t}.source`,"mask.source must be roundedRect, borderAlpha, or texture"),e.textureId!=null&&!P(e.textureId)&&n(`${t}.textureId`,"mask.textureId must be non-empty when present");for(let r of["cornerRadius","padding"])e[r]!=null&&(typeof e[r]!="number"||!Number.isFinite(e[r])||e[r]<0)&&n(`${t}.${r}`,`${r} must be a non-negative finite number`)}}function cs(e,t,n){if(e!=null){if(!E(e)){n(t,"groundDecal UI rendering must be an object");return}for(let r of["textureWidth","textureHeight"])e[r]!=null&&(!Number.isInteger(e[r])||e[r]<=0)&&n(`${t}.${r}`,`${r} must be a positive integer`);for(let r of["alphaIndex","diffuseTextureLevel","emissiveTextureLevel"])e[r]!=null&&(typeof e[r]!="number"||!Number.isFinite(e[r]))&&n(`${t}.${r}`,`${r} must be a finite number`)}}function us(e,t,n){if(!E(e)){n(t,"groundDecal UI layer must be an object");return}P(e.id)||n(`${t}.id`,"layer.id must be non-empty"),P(e.role)||n(`${t}.role`,"layer.role must be non-empty"),e.editorPreviewPercent!=null&&n(`${t}.editorPreviewPercent`,"editorPreviewPercent is editor-only and must not appear in runtime scene data"),e.enabled!=null&&typeof e.enabled!="boolean"&&n(`${t}.enabled`,"layer.enabled must be boolean"),(typeof e.zOrder!="number"||!Number.isFinite(e.zOrder))&&n(`${t}.zOrder`,"layer.zOrder must be a finite number"),e.opacity!=null&&(typeof e.opacity!="number"||!Number.isFinite(e.opacity))&&n(`${t}.opacity`,"layer.opacity must be finite"),e.rotationDeg!=null&&(typeof e.rotationDeg!="number"||!Number.isFinite(e.rotationDeg)||e.rotationDeg<=-180||e.rotationDeg>180)&&n(`${t}.rotationDeg`,"layer.rotationDeg must be in the range (-180, 180]"),ms(e.rect,`${t}.rect`,n),e.kind==="texture"?(e.textureId!=null&&!P(e.textureId)&&n(`${t}.textureId`,"texture layer textureId must be non-empty when present"),e.imageFit!=null&&e.imageFit!=="contain"&&e.imageFit!=="stretch"&&n(`${t}.imageFit`,"texture layer imageFit must be contain or stretch"),je(e.tint,`${t}.tint`,n)):e.kind==="textureProgress"?(e.textureId!=null&&!P(e.textureId)&&n(`${t}.textureId`,"texture progress layer textureId must be non-empty when present"),e.imageFit!=null&&e.imageFit!=="contain"&&e.imageFit!=="stretch"&&n(`${t}.imageFit`,"texture progress layer imageFit must be contain or stretch"),(typeof e.value!="number"||!Number.isFinite(e.value)||e.value<0||e.value>1)&&n(`${t}.value`,"texture progress value must be between 0 and 1"),e.direction!=null&&!["leftToRight","rightToLeft","bottomToTop","topToBottom"].includes(String(e.direction))&&n(`${t}.direction`,"texture progress direction is invalid"),je(e.tint,`${t}.tint`,n)):e.kind==="color"?je(e.color,`${t}.color`,n):e.kind==="progress"?((typeof e.value!="number"||!Number.isFinite(e.value)||e.value<0||e.value>1)&&n(`${t}.value`,"progress value must be between 0 and 1"),e.direction!=null&&!["leftToRight","rightToLeft","bottomToTop","topToBottom"].includes(String(e.direction))&&n(`${t}.direction`,"progress direction is invalid"),je(e.color,`${t}.color`,n)):e.kind==="text"?gs(e.text,`${t}.text`,n):n(`${t}.kind`,"layer.kind must be texture, textureProgress, color, progress, or text")}function fs(e,t,n){let r=new Map;e.forEach((i,o)=>{if(!E(i)||!P(i.id))return;let a=r.get(i.id);if(a!=null){n(`${t}[${o}].id`,`layer.id must be unique; duplicate of layers[${a}]`);return}r.set(i.id,o)})}function ms(e,t,n){if(!E(e)){n(t,"layer.rect must be an object");return}for(let r of["x","z","width","depth"])(typeof e[r]!="number"||!Number.isFinite(e[r]))&&n(`${t}.${r}`,`rect.${r} must be a finite number`);for(let r of["width","depth"])typeof e[r]=="number"&&e[r]<=0&&n(`${t}.${r}`,`rect.${r} must be positive`)}function gs(e,t,n){if(!E(e)){n(t,"text layer text must be an object");return}typeof e.value!="string"&&n(`${t}.value`,"text.value must be a string"),e.fontFamily!=null&&typeof e.fontFamily!="string"&&n(`${t}.fontFamily`,"fontFamily must be a string"),e.fontSize!=null&&(typeof e.fontSize!="number"||!Number.isFinite(e.fontSize)||e.fontSize<=0)&&n(`${t}.fontSize`,"fontSize must be a positive finite number"),e.fontWeight!=null&&typeof e.fontWeight!="string"&&n(`${t}.fontWeight`,"fontWeight must be a string"),je(e.color,`${t}.color`,n),je(e.strokeColor,`${t}.strokeColor`,n),e.strokeWidth!=null&&(typeof e.strokeWidth!="number"||!Number.isFinite(e.strokeWidth)||e.strokeWidth<0)&&n(`${t}.strokeWidth`,"strokeWidth must be a non-negative finite number")}function je(e,t,n){if(e!=null){if(!E(e)){n(t,"color must be an object");return}for(let r of["r","g","b"])(typeof e[r]!="number"||!Number.isFinite(e[r]))&&n(`${t}.${r}`,`color.${r} must be finite`);e.a!=null&&(typeof e.a!="number"||!Number.isFinite(e.a))&&n(`${t}.a`,"color.a must be finite")}}function ps(e,t,n){if(e!=null){if(!E(e)){n(t,"rendering must be an object");return}e.renderingGroupId!=null&&e.renderingGroupId!==0&&e.renderingGroupId!==1&&e.renderingGroupId!==2&&e.renderingGroupId!==3&&n(`${t}.renderingGroupId`,"renderingGroupId must be 0, 1, 2, or 3"),e.alphaIndex!=null&&(typeof e.alphaIndex!="number"||!Number.isFinite(e.alphaIndex))&&n(`${t}.alphaIndex`,"alphaIndex must be a finite number")}}function Ir(e){return typeof e=="number"&&Number.isFinite(e)&&e>0}function Rr(e,t,n){for(let[r,i]of Object.entries(e)){let o=`${t}.${r}`;["albedoColor","diffuseColor","emissiveColor","outlineColor"].includes(r)&&$t(i,o,n),["metallic","roughness","contrast","brightness","saturation","hue","colorDensity","alpha","alphaCutOff","transparencyMode"].includes(r)&&(typeof i!="number"||!Number.isFinite(i))&&n(o,`${r} must be a finite number`),r==="backFaceCulling"&&typeof i!="boolean"&&n(o,"backFaceCulling must be boolean"),["albedoTexture","normalTexture","metallicTexture"].includes(r)&&(E(i)?i.url!=null&&!P(i.url)&&n(`${o}.url`,"texture url must be non-empty when present"):n(o,`${r} must be an object`)),["pbr","standard"].includes(r)&&(E(i)?Rr(i,o,n):n(o,`${r} must be an object`))}}function Ar(e,t,n){let r=JSON.stringify(e),i=va.filter(o=>r.includes(o));i.length>0&&n(t,`contains runtime-only asset fields: ${i.join(", ")}`)}function Or(e,t,n){let r=Nr(e)??512,i=Nr(t)??512;if(!Number.isFinite(n)||n<=0)return{width:r,height:i};let o=r,a=Math.max(1,Math.round(o/n));return a>i&&(a=i,o=Math.max(1,Math.round(a*n))),{width:o,height:a}}function xn(e){let t=e.rendering?.textureWidth??512,n=e.rendering?.textureHeight??512,r=e.size.width>0&&e.size.depth>0?e.size.width/e.size.depth:t/n;return Or(t,n,r)}function Nr(e){return typeof e!="number"||!Number.isFinite(e)||e<=0?null:Math.max(64,Math.min(2048,Math.round(e)))}var Q=(e,t)=>({kind:"number",...e!=null?{min:e}:{},...t!=null?{max:t}:{}}),Me={kind:"texture"},$r={kind:"color"},bs={kind:"enum",values:["lit","unlit"]},ys={kind:"enum",values:["opaque","mask","blend"]},_r={lightingModel:bs,baseColor:{kind:"object",properties:{color:$r,texture:Me,brightness:Q(0),saturation:Q(0),contrast:Q(0),hue:Q(-180,180)}},normal:{kind:"object",properties:{texture:Me,strength:Q(0)}},emission:{kind:"object",properties:{color:$r,intensity:Q(0),texture:Me,maskTexture:Me}},alpha:{kind:"object",properties:{mode:ys,opacity:Q(0,1),cutoff:Q(0,1),texture:Me}}},hs={kind:"object",properties:{..._r,metallic:Q(0,1),roughness:Q(0,1),metallicRoughness:{kind:"object",properties:{texture:Me}},occlusion:{kind:"object",properties:{texture:Me,strength:Q(0)}}}},Ss={kind:"object",properties:_r},Es={lightingModel:"lit",baseColor:{color:{r:1,g:1,b:1},brightness:1,saturation:1,contrast:1,hue:0},metallic:0,roughness:1,emission:{color:{r:0,g:0,b:0},intensity:0}},xs={lightingModel:"lit",baseColor:{color:{r:1,g:1,b:1},brightness:1,saturation:1,contrast:1,hue:0},emission:{color:{r:0,g:0,b:0},intensity:0}},vr=[{id:"surface",title:"Surface",order:40},{id:"geometry",title:"Geometry",order:50},{id:"emission",title:"Emission",order:60},{id:"alpha",title:"Alpha",order:70}],ke={path:"properties.lightingModel",operator:"equals",value:"lit",inactiveReasonKey:"litMaterial"},jr=[Fe("properties.lightingModel","surface",1,"enum","assetLightingModel","lightingModel","lit",{options:[{value:"lit",labelKey:"assetLightingModelLit"},{value:"unlit",labelKey:"assetLightingModelUnlit"}],binding:"lightingModel",updateClass:"define"}),Fe("properties.baseColor.color","surface",2,"color","assetBaseColor","baseColor",{r:1,g:1,b:1},{binding:"baseColor.color"}),Ue("properties.baseColor.texture.textureAssetId","properties.baseColor.texture","surface",3,"assetBaseTexture","baseTexture","baseColor.texture"),ee("properties.baseColor.brightness","surface",4,"assetBrightness","brightness",1,{softMin:0,softMax:4,step:.05,conditions:[Le("properties.baseColor.texture.textureAssetId","baseTexture")]}),ee("properties.baseColor.saturation","surface",5,"assetSaturation","saturation",1,{softMin:0,softMax:2,step:.05,conditions:[Le("properties.baseColor.texture.textureAssetId","baseTexture")]}),ee("properties.baseColor.contrast","surface",6,"assetContrast","contrast",1,{softMin:0,softMax:2,step:.05,conditions:[Le("properties.baseColor.texture.textureAssetId","baseTexture")]}),ee("properties.baseColor.hue","surface",7,"assetHue","hue",0,{step:1,conditions:[Le("properties.baseColor.texture.textureAssetId","baseTexture")]}),Ue("properties.normal.texture.textureAssetId","properties.normal.texture","geometry",10,"assetNormalTexture","normalTexture","normal.texture",[ke]),ee("properties.normal.strength","geometry",11,"assetNormalStrength","normalStrength",1,{softMin:0,softMax:4,step:.05,conditions:[ke,Le("properties.normal.texture.textureAssetId","normalTexture")]}),Fe("properties.emission.color","emission",50,"color","assetEmissionColor","emissionColor",{r:0,g:0,b:0},{binding:"emission.color"}),ee("properties.emission.intensity","emission",51,"assetEmissionIntensity","emissionIntensity",0,{softMin:0,softMax:8,step:.05}),Ue("properties.emission.texture.textureAssetId","properties.emission.texture","emission",52,"assetEmissionTexture","emissionTexture","emission.texture"),Fe("properties.alpha.mode","alpha",60,"enum","assetAlphaMode","alphaMode","opaque",{options:[{value:"opaque",labelKey:"assetAlphaModeOpaque"},{value:"mask",labelKey:"assetAlphaModeMask"},{value:"blend",labelKey:"assetAlphaModeBlend"}],binding:"alpha.mode",updateClass:"pipeline"}),ee("properties.alpha.opacity","alpha",61,"assetAlphaOpacity","alphaOpacity",1,{step:.05,conditions:[{path:"properties.alpha.mode",operator:"equals",value:"blend",inactiveReasonKey:"alphaBlend"}]}),ee("properties.alpha.cutoff","alpha",62,"assetAlphaCutoff","alphaCutoff",.5,{step:.01,conditions:[{path:"properties.alpha.mode",operator:"equals",value:"mask",inactiveReasonKey:"alphaMask"}]}),Ue("properties.alpha.texture.textureAssetId","properties.alpha.texture","alpha",63,"assetAlphaTexture","alphaTexture","alpha.texture",[{path:"properties.alpha.mode",operator:"not-equals",value:"opaque",inactiveReasonKey:"alphaTransparency"}])],Ps=[...jr,ee("properties.metallic","geometry",20,"assetMetallic","metallic",0,{step:.05,conditions:[ke]}),ee("properties.roughness","geometry",21,"assetRoughness","roughness",1,{step:.05,conditions:[ke]}),Ue("properties.metallicRoughness.texture.textureAssetId","properties.metallicRoughness.texture","geometry",22,"assetMetallicRoughnessTexture","metallicRoughnessTexture","metallicRoughness.texture",[ke]),Ue("properties.occlusion.texture.textureAssetId","properties.occlusion.texture","geometry",23,"assetOcclusionTexture","occlusionTexture","occlusion.texture",[ke]),ee("properties.occlusion.strength","geometry",24,"assetOcclusionStrength","occlusionStrength",1,{softMin:0,softMax:4,step:.05,conditions:[ke,Le("properties.occlusion.texture.textureAssetId","occlusionTexture")]})],Is=[{shaderId:"fps.builtin.pbr",version:1,runtimeKind:"pbr",displayName:"PBR",propertiesSchema:hs,defaultProperties:Es,inspector:{sections:vr,fields:Ps}},{shaderId:"fps.builtin.standard",version:1,runtimeKind:"standard",displayName:"Standard",propertiesSchema:Ss,defaultProperties:xs,inspector:{sections:vr,fields:jr}}],Lr=As(Is);function As(e){let t=new Map;for(let r of e){ws(r,t);let i=Ts(r);t.set(r.shaderId,Kr(i))}let n=Object.freeze([...t.values()]);return Object.freeze({get(r){return typeof r=="string"?t.get(r)??null:null},list(){return n}})}function Fr(e,t=Lr){return t.get(e)}function Ur(e){return Fr(e)}function zr(e,t,n="properties",r=Lr){let i=Fr(e,r);if(!i)return[{path:"shaderId",message:`Unknown material shader: ${String(e)}`}];let o=[];return In(i.propertiesSchema,t,n,o),o}function Fe(e,t,n,r,i,o,a,s){return{path:e,sectionId:t,order:n,control:r,labelKey:i,tooltipKey:o,defaultValue:a,updateClass:"uniform",...s}}function ee(e,t,n,r,i,o,a={}){return Fe(e,t,n,"number",r,i,o,{binding:e.replace(/^properties\./,""),step:a.step??.05,displayPrecision:2,precision:2,...a})}function Ue(e,t,n,r,i,o,a,s){return Fe(e,n,r,"texture",i,o,"",{schemaPath:t,binding:a,updateClass:"texture",conditions:s})}function Le(e,t){return{path:e,operator:"truthy",inactiveReasonKey:t}}function ws(e,t){if(!e.shaderId.trim())throw new Error("Material Shader Definition shaderId must not be empty.");if(!Number.isInteger(e.version)||e.version<=0)throw new Error(`Material Shader Definition ${e.shaderId} must use a positive integer version.`);if(t.has(e.shaderId))throw new Error(`Duplicate Material Shader Definition: ${e.shaderId}`);if(e.sourceFile!=null&&!Ms(e.sourceFile))throw new Error(`Material Shader Definition ${e.shaderId} sourceFile must be a safe project-relative path.`);Br(e.shaderId,e.propertiesSchema,"properties");let n=[];if(In(e.propertiesSchema,e.defaultProperties,"properties",n),n.length>0){let o=n[0];throw new Error(`Material Shader Definition ${e.shaderId} default ${o.path} ${o.message}.`)}let r=new Set;for(let o of e.inspector.sections){if(!o.id.trim()||r.has(o.id))throw new Error(`Material Shader Definition ${e.shaderId} contains an invalid or duplicate section: ${o.id}`);r.add(o.id)}let i=new Set;for(let o of e.inspector.fields){if(!o.path.startsWith("properties.")||i.has(o.path))throw new Error(`Material Shader Definition ${e.shaderId} contains an invalid or duplicate field: ${o.path}`);if(!r.has(o.sectionId))throw new Error(`Material Shader Definition ${e.shaderId} field ${o.path} references an unknown section.`);Ds(e,o),i.add(o.path)}}function Ts(e){let t=structuredClone(e);return{...t,inspector:{...t.inspector,fields:t.inspector.fields.map(n=>{if(n.control!=="number")return n;let r=Vr(t.propertiesSchema,n.schemaPath??n.path);return r?.kind!=="number"?n:{...n,...r.min!=null?{min:r.min}:{},...r.max!=null?{max:r.max}:{}}})}}}function Ds(e,t){let n=[["min",t.min],["max",t.max],["softMin",t.softMin],["softMax",t.softMax]];for(let[i,o]of n)if(o!=null&&!Number.isFinite(o))throw new Error(`Material Shader Definition ${e.shaderId} field ${t.path} ${i} must be finite.`);if(t.control!=="number"){if(n.some(([,i])=>i!=null))throw new Error(`Material Shader Definition ${e.shaderId} field ${t.path} uses numeric ranges with a non-number control.`);return}let r=Vr(e.propertiesSchema,t.schemaPath??t.path);if(r?.kind!=="number")throw new Error(`Material Shader Definition ${e.shaderId} field ${t.path} must reference a number schema.`);for(let[i,o,a]of[["min",t.min,r.min],["max",t.max,r.max]])if(o!=null&&o!==a)throw new Error(`Material Shader Definition ${e.shaderId} field ${t.path} ${i} must match propertiesSchema.`);if(t.softMin!=null&&t.softMax!=null&&t.softMin>t.softMax)throw new Error(`Material Shader Definition ${e.shaderId} field ${t.path} softMin must not exceed softMax.`);if(r.min!=null&&t.softMin!=null&&t.softMin<r.min)throw new Error(`Material Shader Definition ${e.shaderId} field ${t.path} softMin must not be below the schema minimum.`);if(r.max!=null&&t.softMax!=null&&t.softMax>r.max)throw new Error(`Material Shader Definition ${e.shaderId} field ${t.path} softMax must not exceed the schema maximum.`)}function Br(e,t,n){if(t.kind==="object"){for(let[r,i]of Object.entries(t.properties))Br(e,i,`${n}.${r}`);return}if(t.kind==="number"){if(t.min!=null&&!Number.isFinite(t.min))throw new Error(`Material Shader Definition ${e} number field ${n} min must be finite.`);if(t.max!=null&&!Number.isFinite(t.max))throw new Error(`Material Shader Definition ${e} number field ${n} max must be finite.`);if(t.min!=null&&t.max!=null&&t.min>t.max)throw new Error(`Material Shader Definition ${e} number field ${n} min must not exceed max.`);return}if(t.kind==="color"&&t.channels!=null&&t.channels!==3&&t.channels!==4)throw new Error(`Material Shader Definition ${e} color field ${n} channels must be 3 or 4.`)}function Ms(e){let t=e.trim();return!t||t.startsWith("/")||t.includes("\\")||t.includes(":")?!1:!t.split("/").includes("..")}function ks(e){let t=e.trim();return t.startsWith("properties.")?t:`properties.${t}`}function Vr(e,t){let n=ks(t).replace(/^properties\./,"").split(".").filter(Boolean);if(n.length===0)return null;let r=e;for(let i of n){if(r.kind!=="object")return null;let o=r.properties[i];if(!o)return null;r=o}return r}function In(e,t,n,r){if(e.kind==="object"){if(!Pn(t)){r.push({path:n,message:"must be an object"});return}for(let o of Object.keys(t))Object.prototype.hasOwnProperty.call(e.properties,o)||r.push({path:`${n}.${o}`,message:"is not supported by the selected shader"});for(let[o,a]of Object.entries(e.properties))t[o]!==void 0&&In(a,t[o],`${n}.${o}`,r);return}if(e.kind==="number"){if(typeof t!="number"||!Number.isFinite(t)){r.push({path:n,message:"must be a finite number"});return}e.min!=null&&t<e.min&&r.push({path:n,message:`must be greater than or equal to ${e.min}`}),e.max!=null&&t>e.max&&r.push({path:n,message:`must be less than or equal to ${e.max}`});return}if(e.kind==="boolean"){typeof t!="boolean"&&r.push({path:n,message:"must be a boolean"});return}if(e.kind==="string"){t!==null&&typeof t!="string"?r.push({path:n,message:"must be a string"}):t===null&&!e.nullable&&r.push({path:n,message:"must not be null"});return}if(e.kind==="enum"){(typeof t!="string"||!e.values.includes(t))&&r.push({path:n,message:`must be one of: ${e.values.join(", ")}`});return}if(e.kind==="color"){let o=e.channels===4?["r","g","b","a"]:["r","g","b"];Gr(t,n,o,r,e.channels===4?"an RGBA object":"an RGB object");return}if(e.kind==="vec2"||e.kind==="vec3"){Gr(t,n,e.kind==="vec2"?["x","y"]:["x","y","z"],r,`a ${e.kind} object`);return}if(t===null)return;if(!Pn(t)){r.push({path:n,message:"must be a texture reference object or null"});return}Object.keys(t).some(o=>o!=="url"&&o!=="textureAssetId")&&r.push({path:n,message:"must contain only url or textureAssetId"});for(let o of["url","textureAssetId"]){let a=t[o];a!==void 0&&(typeof a!="string"||!a.trim())&&r.push({path:`${n}.${o}`,message:"must be a non-empty string"})}}function Gr(e,t,n,r,i){if(!Pn(e)){r.push({path:t,message:`must be ${i}`});return}Object.keys(e).some(o=>!n.includes(o))&&r.push({path:t,message:`must contain only ${n.join(", ")}`});for(let o of n)(typeof e[o]!="number"||!Number.isFinite(e[o]))&&r.push({path:`${t}.${o}`,message:"must be a finite number"})}function Kr(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){Object.freeze(e);for(let t of Object.values(e))Kr(t)}return e}function Pn(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}function Hr(e){return e.trim().replace(/^\/+|\/+$/g,"")}function Cs(e){let t=[],n=new Map(e.assets.map(r=>[r.id,r]));for(let r of e.scene.gameObjects){let i=Us(r),o=vt(r.overrides?.materialBinding);o&&t.push({kind:"root",scope:"scene",gameObjectId:r.id,gameObjectName:r.name,materialAssetId:o,bindingPath:"overrides.materialBinding.materialAssetId",label:i});let a=Rs(e,r,n),s=new Map(a.filter(d=>!!d.slotId).map(d=>[d.slotId,d])),l=r.overrides?.materialSlotBindings??{};for(let[d,u]of Object.entries(l)){let c=vt(u);if(!c)continue;let m=s.get(d),p=zs(m,d);t.push({kind:"slot",scope:"scene",gameObjectId:r.id,gameObjectName:r.name,materialAssetId:c,bindingPath:`overrides.materialSlotBindings.${d}.materialAssetId`,label:`${i} / ${p}`,slotId:d,ownerNodePath:Jr(m)??d})}}for(let r of e.assets)if(!(r.type!=="prefab"||!r.prefab)){Wr(t,{ownerId:r.id,ownerName:r.displayName??r.id,prefabAssetId:r.id,path:`assets.${r.id}.prefab.overrides`,overrides:r.prefab.overrides});for(let i of r.prefab.nodes??[])Wr(t,{ownerId:`${r.id}:${i.id}`,ownerName:`${r.displayName??r.id} / ${i.name??i.id}`,prefabAssetId:r.id,prefabNodeId:i.id,path:`assets.${r.id}.prefab.nodes.${i.id}.overrides`,overrides:i.overrides})}return t}function Wr(e,t){let n=vt(t.overrides?.materialBinding);n&&e.push({kind:"root",scope:"prefab",gameObjectId:t.ownerId,gameObjectName:t.ownerName,materialAssetId:n,bindingPath:`${t.path}.materialBinding.materialAssetId`,label:t.ownerName,prefabAssetId:t.prefabAssetId,...t.prefabNodeId?{prefabNodeId:t.prefabNodeId}:{}});for(let[r,i]of Object.entries(t.overrides?.materialSlotBindings??{})){let o=vt(i);o&&e.push({kind:"slot",scope:"prefab",gameObjectId:t.ownerId,gameObjectName:t.ownerName,materialAssetId:o,bindingPath:`${t.path}.materialSlotBindings.${r}.materialAssetId`,label:`${t.ownerName} / ${r}`,slotId:r,ownerNodePath:r,prefabAssetId:t.prefabAssetId,...t.prefabNodeId?{prefabNodeId:t.prefabNodeId}:{}})}}function Gt(e){let t=[...new Set((e.scene.materialAssets??[]).map(s=>s.id?.trim()).filter(s=>!!s))],n=new Set(t),r=Cs(e),i=r.filter(s=>!n.has(s.materialAssetId)),o=new Map;for(let s of i){let l=o.get(s.materialAssetId)??[];l.push(s),o.set(s.materialAssetId,l)}let a=[...o.entries()].map(([s,l])=>({kind:"missing-material-asset",materialAssetId:s,usages:l}));return{ok:a.length===0,materialAssetIds:t,references:r,missingMaterialAssetIds:a.map(s=>s.materialAssetId),missingReferences:i,issues:a}}function Rs(e,t,n){let r=new Map;for(let i of Ns(e,t,n))r.set(i.slotId,i);return[...r.values()].sort((i,o)=>(i.label??i.slotId).localeCompare(o.label??o.slotId)||i.slotId.localeCompare(o.slotId))}function Jr(e){return e?.sourceSurfaces[0]?.ownerNodePath??null}function Ns(e,t,n){let r=ge(t);if(!r)return[];let o=(n?.get(r.assetId)??e.assets.find(s=>s.id===r.assetId))?.metadata?.materialSlots;if(!Array.isArray(o))return[];let a=[];for(let s of o){let l=Os(s);l&&a.push(l)}return a}function Os(e){if(!e||typeof e!="object"||Array.isArray(e))return null;let t=e,n=typeof t.slotId=="string"&&t.slotId.trim()?t.slotId.trim():"",r=Array.isArray(t.sourceSurfaces)?t.sourceSurfaces:null,i=$s(r);if(!n||!r||i.length===0||i.length!==r.length)return null;let o=typeof t.label=="string"&&t.label.trim()?t.label.trim():i[0].ownerNodePath,a=typeof t.materialName=="string"&&t.materialName.trim()?t.materialName.trim():"",s=Array.isArray(t.materialNames)?t.materialNames.filter(d=>typeof d=="string"&&!!d.trim()).map(d=>d.trim()):void 0,l=Gs(t.sourceMaterialProfiles);return{slotId:n,label:o,sourceSurfaces:i,...a?{materialName:a}:{},...s&&s.length>0?{materialNames:s}:{},...l&&l.length>0?{sourceMaterialProfiles:l}:{}}}function $s(e){return Array.isArray(e)?e.flatMap(t=>{let n=Fs(t);if(!n)return[];let r=Hr(typeof n.ownerNodePath=="string"?n.ownerNodePath:""),i=Number.isInteger(n.meshIndex)&&n.meshIndex>=0?n.meshIndex:void 0,o=Number.isInteger(n.primitiveIndex)&&n.primitiveIndex>=0?n.primitiveIndex:void 0;if(!r||i==null||o==null)return[];let a=Number.isInteger(n.nodeIndex)&&n.nodeIndex>=0?n.nodeIndex:void 0,s=Array.isArray(n.nodeIndexPath)?n.nodeIndexPath.filter(m=>Number.isInteger(m)&&m>=0):void 0,l=Number.isInteger(n.sourceMaterialIndex)&&n.sourceMaterialIndex>=0?n.sourceMaterialIndex:void 0,d=typeof n.sourceMeshName=="string"&&n.sourceMeshName.trim()?n.sourceMeshName.trim():void 0,u=typeof n.triangleCount=="number"&&Number.isFinite(n.triangleCount)&&n.triangleCount>=0?n.triangleCount:void 0,c=vs(n.boundingBox);return[{ownerNodePath:r,...a!=null?{nodeIndex:a}:{},...s&&s.length>0?{nodeIndexPath:s}:{},meshIndex:i,primitiveIndex:o,...l!=null?{sourceMaterialIndex:l}:{},...d?{sourceMeshName:d}:{},...u!=null?{triangleCount:u}:{},...c?{boundingBox:c}:{}}]}):[]}function vs(e){if(!e||typeof e!="object"||Array.isArray(e))return;let t=e,n=qr(t.min),r=qr(t.max);if(!(!n&&!r))return{...n?{min:n}:{},...r?{max:r}:{}}}function qr(e){if(!Array.isArray(e)||e.length<3)return null;let[t,n,r]=e;return typeof t=="number"&&Number.isFinite(t)&&typeof n=="number"&&Number.isFinite(n)&&typeof r=="number"&&Number.isFinite(r)?[t,n,r]:null}function Gs(e){if(!Array.isArray(e))return;let t=e.map(_s).filter(n=>!!n);return t.length>0?t:void 0}function _s(e){if(!e||typeof e!="object"||Array.isArray(e))return null;let t=e;if(!Number.isInteger(t.sourceMaterialIndex))return null;let n=typeof t.materialName=="string"&&t.materialName.trim()?t.materialName.trim():"",r=t.profile&&typeof t.profile=="object"&&!Array.isArray(t.profile)?t.profile:void 0,i=js(t.textureHints);return{sourceMaterialIndex:t.sourceMaterialIndex,...n?{materialName:n}:{},...r?{profile:r}:{},...i&&i.length>0?{textureHints:i}:{}}}function js(e){if(!Array.isArray(e))return;let t=e.map(Ls).filter(n=>!!n);return t.length>0?t:void 0}function Ls(e){if(!e||typeof e!="object"||Array.isArray(e))return null;let t=e,n=typeof t.profilePath=="string"&&t.profilePath.trim()?t.profilePath.trim():"",r=typeof t.reason=="string"&&t.reason.trim()?t.reason.trim():"";return!n||!r?null:{profilePath:n,reason:r,...Number.isInteger(t.textureIndex)?{textureIndex:t.textureIndex}:{},...Number.isInteger(t.imageIndex)?{imageIndex:t.imageIndex}:{},...Number.isInteger(t.bufferView)?{bufferView:t.bufferView}:{},...typeof t.mimeType=="string"&&t.mimeType.trim()?{mimeType:t.mimeType.trim()}:{},...typeof t.uri=="string"&&t.uri.trim()?{uri:t.uri.trim()}:{}}}function Fs(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:null}function Us(e){return e.name?.trim()||e.id}function vt(e){return typeof e?.materialAssetId=="string"?e.materialAssetId.trim():""}function zs(e,t){return e?.label?.trim()||Jr(e)?.trim()||e?.slotId?.trim()||t}var jt=1;var cf=Symbol("unsupported-editor-scene-authored-clone-value");function An(e){return e.components.find(Hs)??null}function ge(e){return e.components.find(Ws)??null}function wn(e){return e.components.find(qs)??null}function _t(e){return e?.type==="prefab"&&_(e.prefab?.sourceAssetId)!=null}function Xr(e){return _(e?.prefab?.prefabId)!=null}function Yr(e){return _(e?.prefab?.sourceAssetId)}function at(e){if(!e?.prefab)return null;let t=Zr(e.prefab),n=_(e.prefab.rootNodeId);if(n&&t.some(i=>i.id===n))return n;let r=t.find(i=>i.kind==="root"&&!i.parentId);return r?r.id:null}function Tn(e){return e?.prefab?Zr(e.prefab):[]}function Zr(e){if(!Array.isArray(e.nodes))return[];let t=[];for(let n of e.nodes){let r=Bs(n);r&&!t.some(i=>i.id===r.id)&&t.push(r)}return structuredClone(t)}function Bs(e){if(!e||typeof e!="object"||Array.isArray(e))return null;let t=e,n=_(t.id);return!n||!Vs(t.kind)?null:{id:n,..._(t.guid)?{guid:_(t.guid)}:{},..._(t.name)?{name:_(t.name)}:{},..._(t.parentId)?{parentId:_(t.parentId)}:{},kind:t.kind,...t.transform?{transform:structuredClone(t.transform)}:{},..._(t.sourceAssetId)?{sourceAssetId:_(t.sourceAssetId)}:{},..._(t.sourceNodePath)?{sourceNodePath:_(t.sourceNodePath)}:{},..._(t.childPrefabId)?{childPrefabId:_(t.childPrefabId)}:{},...t.primitive?{primitive:structuredClone(t.primitive)}:{},...t.light?{light:structuredClone(t.light)}:{},...t.marker?{marker:structuredClone(t.marker)}:{},...t.defaults?{defaults:structuredClone(t.defaults)}:{},...t.overrides?{overrides:structuredClone(t.overrides)}:{},...t.metadata?{metadata:structuredClone(t.metadata)}:{}}}function Vs(e){return e==="root"||e==="group"||e==="model"||e==="primitive"||e==="light"||e==="prefabInstance"||e==="marker"||e==="collision"}function Qr(e,t){let n=_(e?.materialAssetId),r=_(t?.materialAssetId),i=kt(e?.override,t?.override);return Xs({...r??n?{materialAssetId:r??n}:{},...ot(i)?{override:i}:{}})}function ei(e,t){let n={},r=Qr(e?.materialBinding,t?.materialBinding);r&&(n.materialBinding=r);let i=Zs(e?.materialSlotBindings,t?.materialSlotBindings);return i&&(n.materialSlotBindings=i),ot(n)?n:void 0}function st(e,t){let n=typeof t=="string"?Ys(e,t):t,r=typeof t=="string"?t:t.id,i=[],o=Xr(n)?n.prefab:null;if(!n||!o)return i.push({code:"not-prefab-instance",severity:"info",message:n?`GameObject "${n.id}" is not a prefab instance.`:`GameObject "${r}" was not found.`}),{gameObject:n,prefab:null,definition:null,sourceAsset:null,diagnostics:i};let a=e.assets.find(d=>d.id===o.prefabId&&_t(d));a||i.push({code:"missing-prefab-definition",severity:"error",message:`Prefab definition "${o.prefabId}" was not found.`,prefabId:o.prefabId});let s=Yr(a)??_(o.sourceAssetId);a&&o.sourceAssetId&&s&&o.sourceAssetId!==s&&i.push({code:"source-asset-mismatch",severity:"warning",message:`Prefab instance source "${o.sourceAssetId}" does not match definition source "${s}".`,prefabId:o.prefabId,expectedSourceAssetId:s,actualSourceAssetId:o.sourceAssetId});let l=s?e.assets.find(d=>d.id===s):void 0;if(s&&!l&&i.push({code:"missing-source-asset",severity:"error",message:`Prefab source asset "${s}" was not found.`,prefabId:o.prefabId,sourceAssetId:s}),s){let d=e.assets.filter(u=>_t(u)&&Yr(u)===s).map(u=>u.id);d.length>1&&i.push({code:"duplicate-source-prefab",severity:"info",message:`Source asset "${s}" is referenced by ${d.length} prefab definitions.`,prefabId:o.prefabId,sourceAssetId:s})}return{gameObject:n,prefab:o,definition:a??null,sourceAsset:l??null,diagnostics:i}}function Ce(e){return e.kind==="group"||e.kind==="instance"||e.kind==="transform"||e.kind==="primitive"?e.kind:Xr(e)?"instance":e.primitive?"primitive":ge(e)?"instance":wn(e)||e.transformType?"transform":"group"}function ti(e){let t=e.rendering&&typeof e.rendering=="object"&&!Array.isArray(e.rendering)?e.rendering:void 0,n=Ks(t?.renderingGroupId),r=Js(t?.alphaIndex),i={};return n!=null&&(i.renderingGroupId=n),r!=null&&(i.alphaIndex=r),Object.keys(i).length>0?i:void 0}function Ks(e){return e===0||e===1||e===2||e===3?e:null}function Hs(e){return e.type==="Transform"}function Ws(e){return e.type==="ModelRenderer"}function qs(e){return e.type==="ImageRenderer"}function Js(e){return typeof e=="number"&&Number.isFinite(e)?e:null}function _(e){return typeof e=="string"&&e.trim().length>0?e.trim():null}function Ys(e,t){return e.scene.gameObjects.find(n=>n.id===t)??null}function Xs(e){if(!e||typeof e!="object"||Array.isArray(e))return;let t=e,n=_(t.materialAssetId),r=kt(t.override),i={...n?{materialAssetId:n}:{},...ot(r)?{override:r}:{}};return ot(i)?i:void 0}function Zs(e,t){let n=new Set([...Object.keys(e??{}),...Object.keys(t??{})]),r={};for(let i of n){let o=Qr(e?.[i],t?.[i]);o&&(r[i]=o)}return ot(r)?r:void 0}function ot(e){return!!e&&typeof e=="object"&&!Array.isArray(e)&&Object.keys(e).length>0}var Qs=new Set(["id","guid","name","parentId","kind","transform","marker","metadata"]);function ni(e,t,n){if(e.kind!=="marker"){Object.prototype.hasOwnProperty.call(e,"marker")&&T("schema.invalidValue",`${n}.marker`);return}for(let s of Object.keys(e))Qs.has(s)||T("schema.invalidValue",`${n}.${s}`);dt(e.parentId)||T("schema.invalidReference",`${n}.parentId`),rd(e.transform,`${n}.transform`),ed(e.marker,`${n}.marker`);let r=dt(e.id),i=e.marker,o=td(i,`${n}.marker`),a=o[0]??null;for(let s of o){s.target.id===r&&T("schema.invalidReference",`${s.path}.id`),a&&(s.target.kind!==a.target.kind||s.target.id!==a.target.id)&&T("schema.invalidReference",s.path);let l=t.get(s.target.id);l&&(s.target.kind==="marker"&&l.kind!=="marker"&&T("schema.invalidReference",`${s.path}.kind`),s.target.kind==="scene-object"&&l.kind==="marker"&&T("schema.invalidReference",`${s.path}.kind`))}}function ed(e,t){let n=Ee(e);n||T("schema.invalidType",t),te(n,["schemaVersion","type","kind","tags","note","color","target","semanticFrame","geometry","metadata"],t),n.schemaVersion!==1&&T("schema.unsupportedVersion",`${t}.schemaVersion`),dt(n.type)||T("schema.invalidValue",`${t}.type`),n.kind!==void 0&&!dt(n.kind)&&T("schema.invalidValue",`${t}.kind`),n.tags!==void 0&&ad(n.tags,`${t}.tags`),n.note!==void 0&&typeof n.note!="string"&&T("schema.invalidType",`${t}.note`),n.color!==void 0&&od(n.color,`${t}.color`),n.target!==void 0&&Dn(n.target,`${t}.target`),n.semanticFrame!==void 0&&id(n.semanticFrame,`${t}.semanticFrame`),nd(n.geometry,`${t}.geometry`),n.metadata!==void 0&&sd(n.metadata,`${t}.metadata`)}function td(e,t){let n=[];return e.target&&n.push({target:e.target,path:`${t}.target`}),e.geometry.kind==="point"&&e.geometry.target&&n.push({target:e.geometry.target,path:`${t}.geometry.target`}),e.geometry.kind==="object-bounds"&&n.push({target:e.geometry.target,path:`${t}.geometry.target`}),n}function nd(e,t){let n=Ee(e);if(n||T("schema.invalidType",t),n.kind==="box"){te(n,["kind"],t);return}if(n.kind==="point"){te(n,["kind","coordinateSpace","position","offset","target"],t),n.coordinateSpace!==void 0&&n.coordinateSpace!=="world"&&n.coordinateSpace!=="local"&&T("schema.invalidValue",`${t}.coordinateSpace`),n.position!==void 0&&Se(n.position,`${t}.position`),n.offset!==void 0&&Se(n.offset,`${t}.offset`),n.target!==void 0&&Dn(n.target,`${t}.target`);return}if(n.kind==="object-bounds"){te(n,["kind","target"],t),Dn(n.target,`${t}.target`);return}if(n.kind==="polyhedron"){te(n,["kind","coordinateSpace","vertices","faces"],t),n.coordinateSpace!==void 0&&n.coordinateSpace!=="world"&&T("schema.invalidValue",`${t}.coordinateSpace`),Array.isArray(n.vertices)||T("schema.invalidType",`${t}.vertices`),n.vertices.forEach((r,i)=>Se(r,`${t}.vertices[${i}]`)),n.faces!==void 0&&(Array.isArray(n.faces)||T("schema.invalidType",`${t}.faces`),n.faces.forEach((r,i)=>{Array.isArray(r)||T("schema.invalidType",`${t}.faces[${i}]`),r.forEach((o,a)=>{(!Number.isInteger(o)||o<0)&&T("schema.invalidValue",`${t}.faces[${i}][${a}]`)})}));return}T("schema.invalidValue",`${t}.kind`)}function Dn(e,t){let n=Ee(e);n||T("schema.invalidType",t),te(n,["kind","id","label"],t),n.kind!=="marker"&&n.kind!=="scene-object"&&T("schema.invalidValue",`${t}.kind`),dt(n.id)||T("schema.invalidValue",`${t}.id`),n.label!==void 0&&typeof n.label!="string"&&T("schema.invalidType",`${t}.label`)}function rd(e,t){let n=Ee(e);if(n||T("schema.invalidType",t),n.type!=="Transform"&&T("schema.invalidValue",`${t}.type`),n.mode==="matrix"){te(n,["type","mode","matrix"],t),(!Array.isArray(n.matrix)||n.matrix.length!==16)&&T("schema.invalidType",`${t}.matrix`),n.matrix.forEach((r,i)=>Lt(r,`${t}.matrix[${i}]`));return}te(n,["type","mode","position","rotation","scale"],t),n.mode!==void 0&&n.mode!=="trs"&&T("schema.invalidValue",`${t}.mode`),Se(n.position,`${t}.position`),Se(n.rotation,`${t}.rotation`),n.scale!==void 0&&Se(n.scale,`${t}.scale`)}function id(e,t){let n=Ee(e);n||T("schema.invalidType",t),te(n,["origin","forward","right","up","label","description"],t),Se(n.origin,`${t}.origin`);for(let r of["forward","right","up"])n[r]!==void 0&&Se(n[r],`${t}.${r}`);for(let r of["label","description"])n[r]!==void 0&&typeof n[r]!="string"&&T("schema.invalidType",`${t}.${r}`)}function od(e,t){let n=Ee(e);n||T("schema.invalidType",t),te(n,["r","g","b"],t);for(let r of["r","g","b"])Lt(n[r],`${t}.${r}`),(n[r]<0||n[r]>1)&&T("schema.invalidValue",`${t}.${r}`)}function Se(e,t){let n=Ee(e);n||T("schema.invalidType",t),te(n,["x","y","z"],t);for(let r of["x","y","z"])Lt(n[r],`${t}.${r}`)}function ad(e,t){Array.isArray(e)||T("schema.invalidType",t),e.forEach((n,r)=>{typeof n!="string"&&T("schema.invalidType",`${t}[${r}]`)})}function sd(e,t){let n=Ee(e);n||T("schema.invalidType",t),Mn(n,t,new Set)}function Mn(e,t,n){if(e===null||typeof e=="string"||typeof e=="boolean")return;if(typeof e=="number"){Lt(e,t);return}(!e||typeof e!="object")&&T("schema.invalidType",t),n.has(e)&&T("schema.invalidValue",t);let r=Object.getPrototypeOf(e);Array.isArray(e)?r!==Array.prototype&&T("schema.invalidType",t):r!==Object.prototype&&r!==null&&T("schema.invalidType",t),n.add(e);try{if(Array.isArray(e))e.forEach((i,o)=>Mn(i,`${t}[${o}]`,n));else for(let[i,o]of Object.entries(e))Mn(o,`${t}.${i}`,n)}finally{n.delete(e)}}function te(e,t,n){let r=new Set(t);for(let i of Object.keys(e))r.has(i)||T("schema.invalidValue",`${n}.${i}`)}function Lt(e,t){(typeof e!="number"||!Number.isFinite(e))&&T("schema.invalidValue",t)}function Ee(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:null}function dt(e){return typeof e=="string"&&e.trim()?e.trim():null}function T(e,t){throw new Error(`${e}: ${t}`)}function Cn(e,t){return t===e.rootNodeId?e.instanceId:`${e.instanceId}:${dd(t)}`}function dd(e){return encodeURIComponent(e)}function kn(e,t){return{...structuredClone(e),id:Cn(t,e.id)}}function ri(e,t){let n=structuredClone(e);return n.target&&(n.target=kn(n.target,t)),n.geometry.kind==="point"&&n.geometry.target&&(n.geometry.target=kn(n.geometry.target,t)),n.geometry.kind==="object-bounds"&&(n.geometry.target=kn(n.geometry.target,t)),n}var ii={x:-.3,y:-1,z:-.2};var oi="scene.main",ai="scene";function si(e){let t=e.meta?.authoringSource;return{sourceId:t?.sourceId||oi,sourceType:t?.sourceType||ai,revision:typeof t?.revision=="number"?t.revision:1}}var di={type:"directional",intensity:2,direction:{...ii},diffuseColor:{r:1,g:1,b:1},inspectorLanguage:"zh"},Rn={type:"hemispheric",intensity:.8,diffuseColor:{r:1,g:1,b:1},groundColor:{r:.48,g:.52,b:.62},inspectorLanguage:"zh"};function ci(e){return e.filter(t=>t.kind==="model"||t.kind==="texture").map(ld).sort(fd)}function ld(e){let t=e.kind==="texture"?"texture":e.kind==="prefab"?"prefab":"glb",n=Re(e.guid),r=gd(e);return{id:e.assetId,...n?{guid:n}:{},assetId:e.assetId,type:t,kind:e.kind==="texture"?"texture":e.kind==="prefab"?"prefab":"model",displayName:e.displayName,category:e.category??md(e),warmupCount:e.warmupCount,singleton:e.singleton,materialMode:e.materialMode,defaults:Ut(e.defaults),prefab:Ut(e.prefab),external:Ut(e.external),metadata:r,origin:e.origin??"project",dedupeKey:e.dedupeKey??n??yd(e.external)??e.assetId,placeable:ud(e)}}function cd(e){if(!e||typeof e!="object"||Array.isArray(e))return!1;let t=e;return t.kind==="texture"||t.type==="texture"}function ud(e){return cd(e)?!0:!e||typeof e!="object"||Array.isArray(e)||e.placeable!==!1}function fd(e,t){return(e.category??"").localeCompare(t.category??"")||e.displayName.localeCompare(t.displayName)||e.assetId.localeCompare(t.assetId)||e.type.localeCompare(t.type)}function md(e){return e.kind==="prefab"?"Prefab":e.kind==="texture"?"Texture":e.kind==="image"?"Image":e.kind==="sound"?"Sound":"Model"}function gd(e){return pd({originalFileName:e.originalFileName,relativePath:e.relativePath,codeKey:e.codeKey,contentHash:e.contentHash,byteSize:e.byteSize,...Ut(e.metadata)})}function pd(e){if(!Array.isArray(e.materialSlots))return e;let t=Ft(e.assetAnalysis),n=Array.isArray(t?.meshes)?t.meshes:[],r=Array.isArray(t?.nodes)?t.nodes:[],i=new Map(n.flatMap(l=>{let d=Ft(l),u=lt(d?.meshIndex),c=Re(d?.name);return u==null||!c?[]:[[u,c]]})),o=new Map(r.flatMap(l=>{let d=Ft(l),u=lt(d?.nodeIndex),c=Re(d?.meshName);return u==null||!c?[]:[[u,c]]})),a=li(t,"meshCount",n.length)||li(t,"nodeCount",r.length),s=e.materialSlots.map(l=>{let d=Ft(l);if(!d||Re(d.sourceMeshName))return l;let u=lt(d.meshIndex);if(u==null)return l;let c=lt(d.nodeIndex),m=i.get(u)??(c==null?void 0:o.get(c))??(a?bd(d):void 0);return m?{...d,sourceMeshName:m}:l});return{...e,materialSlots:s}}function bd(e){let t=Re(e.label);if(t){let n=t.replace(/\s+\/\s+Primitive\s+\d+$/,"").trim();if(n)return n}return Re(e.ownerNodePath)?.split("/").filter(Boolean).pop()}function li(e,t,n){let r=lt(e?.[t]);return r!=null&&r>n}function yd(e){return!e||typeof e!="object"||Array.isArray(e)?null:Re(e.platformAssetId)}function Re(e){return typeof e=="string"&&e.trim()?e.trim():null}function lt(e){return Number.isInteger(e)&&e>=0?e:null}function Ft(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function Ut(e){return e==null?void 0:structuredClone(e)}function mi(e,t){let n=new Map(t.filter(o=>o.type==="glb").map(o=>[o.assetId,o])),r=e.assets.map(o=>{if(o.type!=="glb")return o;let a=n.get(o.id);return a?ui(o,a):o}),i=new Set(e.assets.map(o=>o.id));for(let o of hd(e)){if(i.has(o))continue;let a=n.get(o);a&&(r.push(ui({id:o,type:"glb"},a)),i.add(o))}return{...e,assets:r}}function hd(e){let t=[],n=new Set,r=i=>{let o=Sd(i);!o||n.has(o)||(n.add(o),t.push(o))};for(let i of e.assets)if(i.type==="prefab"){r(i.prefab?.sourceAssetId);for(let o of i.prefab?.nodes??[])r(o.sourceAssetId)}for(let i of e.scene.gameObjects){for(let a of i.components)a.type==="ModelRenderer"&&r(a.assetId);r(i.prefab?.sourceAssetId);let o=fi(fi(i)?.instance);r(o?.assetId)}return t}function ui(e,t){return{...e,guid:t.guid??e.guid,displayName:t.displayName||e.displayName,category:t.category??e.category,warmupCount:t.warmupCount??e.warmupCount,singleton:t.singleton??e.singleton,materialMode:t.materialMode??e.materialMode,defaults:zt(t.defaults??e.defaults),prefab:zt(t.prefab??e.prefab),external:zt(t.external??e.external),metadata:zt(t.metadata??e.metadata)}}function zt(e){return e==null?void 0:structuredClone(e)}function fi(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function Sd(e){return(typeof e=="string"?e.trim():"")||void 0}function gi(e){let t=Gt(e);if(t.ok)return;let n=new Error(`editor_scene_material_assets_missing: ${t.missingMaterialAssetIds.join(", ")}`);throw n.details={missingMaterialAssetIds:t.missingMaterialAssetIds,missingReferences:t.missingReferences.map(r=>({materialAssetId:r.materialAssetId,gameObjectId:r.gameObjectId,bindingPath:r.bindingPath,label:r.label,kind:r.kind,...r.slotId?{slotId:r.slotId}:{},...r.ownerNodePath?{ownerNodePath:r.ownerNodePath}:{}}))},n}var Ed="sun_light";function xd(e,t,n={}){let r=Ad(Dd(e,t)),i=wd(e,t),o=Td(t,"instance"),a=[...r.diagnostics,...i.diagnostics,...o.diagnostics];return{settings:ce(n.project,r.settings,i.settings,n.node,o.settings),diagnostics:a}}function Pd(e){let t=new Map,n=e.casterId;for(let r of e.explicitReceiverIds??[]){let i=Vt(e.document,r);!i||i.id===n||i.active===!1||t.set(i.id,{receiverId:i.id,source:"explicit",score:120,...ct(i,"explicit",120,["explicit receiver id"])})}for(let r of e.document.scene.gameObjects){if(r.id===n||r.active===!1)continue;let o=re(r.shadow).shadow?.receive;if(o!=="none"){if(o==="enabled"){Nn(t,{receiverId:r.id,source:"explicit",score:100,...ct(r,"explicit",100,["shadow.receive enabled"])});continue}if(o==="auto"){Nn(t,{receiverId:r.id,source:"auto",score:70,...ct(r,"auto",70,["shadow.receive auto"])});continue}Rd(r)&&Nn(t,{receiverId:r.id,source:"auto",score:40,...ct(r,"auto",40,["plane primitive auto receiver"])})}}return[...t.values()].sort((r,i)=>i.score-r.score||r.receiverId.localeCompare(i.receiverId))}function Bt(e){let t=e.caster?.id===e.casterId?e.caster:Vt(e.document,e.casterId),n=[];if(!t)return{casterId:e.casterId,receiverIds:[],backend:"none",mode:"none",quality:e.fallbackQuality??"medium",params:xt(e.fallbackQuality??"medium"),diagnostics:[{code:"shadow.invalidTarget",severity:"error",message:`Shadow caster "${e.casterId}" was not found.`,casterId:e.casterId}]};let r=e.settings?{settings:ce(e.settings.project,e.settings.source,e.settings.prefab,e.settings.node,e.settings.instance),diagnostics:[]}:xd(e.document,t);n.push(...r.diagnostics);let o=r.settings?.cast==="none"?"none":an(r.settings,e.fallbackMode??"none"),a=sn(r.settings,e.fallbackQuality??"medium"),s=xt(a,r.settings?.params),l=Id(o),d=kd(e.explicitReceiverIds),u=l==="none"?{candidates:[],diagnostics:[]}:d.length>0&&e.strictExplicitReceivers===!0?Cd(e.document,t.id,d):{candidates:Pd({document:e.document,casterId:t.id,explicitReceiverIds:d.length>0?d:void 0}),diagnostics:[]};n.push(...u.diagnostics);let c=u.candidates;l!=="none"&&c.length===0&&n.push({code:"shadow.receiverNotFound",severity:"warning",message:`No shadow receiver was found for caster "${t.id}".`,casterId:t.id});let m=l==="none"?null:Md(e.document,r.settings,e.defaultLightId);return m?.diagnostic&&n.push(m.diagnostic),{casterId:t.id,receiverIds:c.map(p=>p.receiverId),...m?.lightId?{lightId:m.lightId}:{},backend:l,mode:o,quality:a,params:s,diagnostics:n}}function Id(e){return e==="dynamic"?"dynamic-map":e==="static"?"static-baked":e==="blob"?"blob":e==="projected"?"projected":"none"}function Ad(e){if(!e)return{diagnostics:[]};let t=e.defaults&&typeof e.defaults=="object"&&!Array.isArray(e.defaults)?e.defaults:void 0;if(!t)return{diagnostics:[]};let n=re(t.shadow);return{settings:n.shadow,diagnostics:n.diagnostics.map(r=>({...r,details:{...r.details??{},source:"asset",assetId:e.id}}))}}function wd(e,t){let n=typeof t.prefab?.prefabId=="string"?t.prefab.prefabId:null;if(!n)return{diagnostics:[]};let r=e.assets.find(o=>o.id===n);if(!r?.prefab?.defaults)return{diagnostics:[]};let i=re(r.prefab.defaults.shadow);return{settings:i.shadow,diagnostics:i.diagnostics.map(o=>({...o,details:{...o.details??{},source:"prefab",prefabId:n}}))}}function Td(e,t){let n=re(e.shadow);return{settings:n.shadow,diagnostics:n.diagnostics.map(r=>({...r,casterId:e.id,details:{...r.details??{},source:t}}))}}function Dd(e,t){let r=ge(t)?.assetId??t.prefab?.sourceAssetId;return r?e.assets.find(i=>i.id===r)??null:null}function Md(e,t,n){if((t?.light?.mode??"inherit")==="explicit"){let a=t?.light?.lightId;return a&&pi(e,a)?{lightId:a}:{diagnostic:{code:"shadow.lightNotFound",severity:"warning",message:a?`Explicit shadow light "${a}" was not found.`:"Shadow light mode is explicit, but no lightId was configured.",...a?{lightId:a}:{}}}}let i=n??Ed;if(pi(e,i))return{lightId:i};let o=e.scene.gameObjects.find(a=>bi(a)&&a.active!==!1);return o?{lightId:o.id}:{diagnostic:{code:"shadow.lightNotFound",severity:"warning",message:"No directional shadow light was found."}}}function pi(e,t){let n=Vt(e,t);return!!n&&n.active!==!1&&bi(n)}function bi(e){return Ce(e)==="transform"&&e.light?.type==="directional"}function Nn(e,t){let n=e.get(t.receiverId);(!n||t.score>n.score)&&e.set(t.receiverId,t)}function kd(e){let t=new Set,n=[];for(let r of e??[]){let i=typeof r=="string"?r.trim():"";!i||t.has(i)||(t.add(i),n.push(i))}return n}function Cd(e,t,n){let r=[],i=[];for(let o of n){let a=Vt(e,o);if(!a){i.push({code:"shadow.receiverNotFound",severity:"warning",message:`Explicit shadow receiver "${o}" was not found.`,casterId:t,receiverId:o,details:{source:"explicit"}});continue}if(a.id===t){i.push({code:"shadow.receiverNotFound",severity:"warning",message:`Shadow caster "${t}" cannot be used as its own receiver.`,casterId:t,receiverId:o,details:{source:"explicit",reason:"self"}});continue}if(a.active===!1){i.push({code:"shadow.receiverNotFound",severity:"warning",message:`Explicit shadow receiver "${o}" is inactive.`,casterId:t,receiverId:o,details:{source:"explicit",reason:"inactive"}});continue}r.push({receiverId:a.id,source:"explicit",score:120,...ct(a,"explicit",120,["explicit receiver id"])})}return{candidates:r,diagnostics:i}}function ct(e,t,n,r){let i=re(e.shadow).shadow;return{active:e.active!==!1,visible:e.active!==!1,...i?.receive?{receive:i.receive}:{},suitability:{score:n,material:Ce(e)==="primitive"?"primitive":t,reasons:r}}}function Rd(e){return Ce(e)==="primitive"&&e.primitive?.shape==="plane"}function Vt(e,t){return e.scene.gameObjects.find(n=>n.id===t)??null}var xi="@fps-games/editor.playable-sdk.scene-compiler",Pi="3",Nd=new Set(["shadowMode","childMaterialBindings","childMaterials"]),Od=new Set(["coordinateSpace","center","size","rotation"]),yi=new Set(["root","group","model","primitive","light","prefabInstance","marker","collision"]);function Ii(e){$d(e,!0)}function $d(e,t){let n=I(e);if(!n)throw new Error("editor_scene_must_be_object");if(n.schemaVersion!==1)throw h("schema.unsupportedVersion","$.schemaVersion");if(!Array.isArray(n.assets))throw new Error("editor_scene_assets_must_be_array");let r=I(n.scene);if(!Array.isArray(r?.gameObjects))throw new Error("editor_scene_game_objects_must_be_array");if(r.materialAssets!=null&&!Array.isArray(r.materialAssets))throw new Error("editor_scene_material_assets_must_be_array");r.shadowMapExperiment!==void 0&&gn(r.shadowMapExperiment),r.gameObjects.forEach((i,o)=>{let a=I(i);a?.shadowMapExperiment!==void 0&&tt(a.shadowMapExperiment,`$.scene.gameObjects[${o}].shadowMapExperiment`)}),_d(n.assets,r.gameObjects),vn(n,"$"),jd(n.assets),Gd(n.assets,r.gameObjects),Ld(r.gameObjects,n.assets),Fd(r.gameObjects),vd(r.materialAssets??[]),t&&Ud(n.assets,r.gameObjects),gi(n)}function vd(e){for(let t=0;t<e.length;t+=1){let n=I(e[t]),r=`$.scene.materialAssets[${t}]`;if(!n)throw h("schema.invalidType",r);if(Object.prototype.hasOwnProperty.call(n,"materialKind"))throw h("schema.deprecatedField",`${r}.materialKind`);if(Object.prototype.hasOwnProperty.call(n,"profile"))throw h("schema.deprecatedField",`${r}.profile`);if(!A(n.id))throw h("schema.invalidType",`${r}.id`);if(!A(n.name))throw h("schema.invalidType",`${r}.name`);let i=A(n.shaderId);if(!i)throw h("schema.invalidValue",`${r}.shaderId`);if(Ur(i)){let a=zr(i,n.properties,`${r}.properties`);if(a[0])throw h("schema.invalidValue",a[0].path)}else if(!I(n.properties))throw h("schema.invalidType",`${r}.properties`);for(let a of Object.keys(n))if(!["id","guid","name","shaderId","properties","system","origin"].includes(a))throw h("schema.unknownField",`${r}.${a}`)}}function Gd(e,t){let n=new Set(e.map(I).filter(o=>o?.type==="glb").map(o=>A(o?.id)).filter(o=>!!o)),r=new Set(e.map(I).filter(o=>o?.type==="texture").map(o=>A(o?.id)).filter(o=>!!o)),i=new Map;for(let o of e.map(I)){if(o?.type!=="prefab")continue;let a=A(o.id),s=A(I(o.prefab)?.sourceAssetId);a&&s&&i.set(a,s)}for(let o=0;o<e.length;o+=1){let a=I(e[o]);if(a?.type!=="prefab")continue;let s=I(a.prefab),l=A(s?.sourceAssetId),d=A(s?.rootNodeId);if(!l||!n.has(l))throw h("schema.invalidReference",`$.assets[${o}].prefab.sourceAssetId`);let u=Array.isArray(s?.nodes)?s.nodes:[];for(let c=0;c<u.length;c+=1){let m=I(u[c]),p=A(m?.sourceAssetId);if(m?.kind==="model"&&(!p||!n.has(p)))throw h("schema.invalidReference",`$.assets[${o}].prefab.nodes[${c}].sourceAssetId`);if(m?.kind==="prefabInstance"){let g=A(m.childPrefabId),b=g?i.get(g):null;if(A(m.id)===d&&l!==b)throw h("schema.invalidReference",`$.assets[${o}].prefab.sourceAssetId`);if(p&&p!==b)throw h("schema.invalidReference",`$.assets[${o}].prefab.nodes[${c}].sourceAssetId`)}}}for(let o=0;o<t.length;o+=1){let a=I(t[o]),s=A(I(a?.instance)?.assetId);if(s&&!n.has(s))throw h("schema.invalidReference",`$.scene.gameObjects[${o}].instance.assetId`);let l=Array.isArray(a?.components)?a.components:[];for(let d=0;d<l.length;d+=1){let u=I(l[d]);if(u?.type!=="ModelRenderer")continue;let c=A(u.assetId);if(!c||!n.has(c))throw h("schema.invalidReference",`$.scene.gameObjects[${o}].components[${d}].assetId`)}for(let d=0;d<l.length;d+=1){let u=I(l[d]);if(u?.type!=="ImageRenderer")continue;let c=A(u.assetId);if(!c||!r.has(c))throw h("schema.invalidReference",`$.scene.gameObjects[${o}].components[${d}].assetId`);let m=I(u.size);if(!m||!Ei(m.width)||!Ei(m.height))throw h("schema.invalidValue",`$.scene.gameObjects[${o}].components[${d}].size`)}}}function _d(e,t){let n=new Set;e.forEach((o,a)=>{let s=I(o);if(!s)throw h("schema.invalidType",`$.assets[${a}]`);let l=A(s.id);if(!l||!A(s.type))throw h("schema.invalidValue",`$.assets[${a}]`);if(n.has(l))throw h("schema.invalidValue",`$.assets[${a}].id`);n.add(l);let d=I(s.defaults);d?.shadowMapExperiment!==void 0&&tt(d.shadowMapExperiment,`$.assets[${a}].defaults.shadowMapExperiment`)});let r=new Set,i=new Map;t.forEach((o,a)=>{let s=I(o);if(!s)throw h("schema.invalidType",`$.scene.gameObjects[${a}]`);let l=A(s.id);if(!l)throw h("schema.invalidValue",`$.scene.gameObjects[${a}].id`);if(r.has(l))throw h("schema.invalidValue",`$.scene.gameObjects[${a}].id`);if(r.add(l),i.set(l,{value:s,index:a}),!Array.isArray(s.components))throw h("schema.invalidType",`$.scene.gameObjects[${a}].components`);s.components.forEach((d,u)=>{let c=I(d);if(!c)throw h("schema.invalidType",`$.scene.gameObjects[${a}].components[${u}]`);if(!A(c.type))throw h("schema.invalidValue",`$.scene.gameObjects[${a}].components[${u}].type`)})});for(let[o,a]of i){if(!("parentId"in a.value))continue;let s=A(a.value.parentId);if(!s||!i.has(s))throw h("schema.invalidReference",`$.scene.gameObjects[${a.index}].parentId`);let l=new Set([o]),d=s;for(;d;){if(l.has(d))throw h("schema.invalidReference",`$.scene.gameObjects[${a.index}].parentId`);l.add(d);let u=i.get(d)?.value;d=u&&u.parentId!=null?A(u.parentId):null}}}function vn(e,t){if(Array.isArray(e)){e.forEach((r,i)=>vn(r,`${t}[${i}]`));return}let n=I(e);if(n)for(let[r,i]of Object.entries(n)){let o=`${t}.${r}`;if(Nd.has(r))throw h("schema.deprecatedField",o);r==="shadow"&&Ze(i,o),!(r==="metadata"||r==="shadowMapExperiment")&&vn(i,o)}}function jd(e){let t=new Set(e.map(I).filter(a=>a?.type==="prefab").map(a=>A(a?.id)).filter(a=>!!a)),n=new Map;for(let a=0;a<e.length;a+=1){let s=I(e[a]);if(s?.type!=="prefab")continue;let l=I(s.prefab);if(!Array.isArray(l?.nodes))throw h("schema.unsupportedVersion",`$.assets[${a}].prefab.nodes`);hi(l.defaults,`$.assets[${a}].prefab.defaults`);let d=[],u=new Set;for(let g=0;g<l.nodes.length;g+=1){let b=`$.assets[${a}].prefab.nodes[${g}]`,S=I(l.nodes[g]);if(!S)throw h("schema.invalidType",b);hi(S.defaults,`${b}.defaults`);let x=A(S.id);if(!x||!yi.has(String(S.kind)))throw h("schema.invalidValue",b);if(u.has(x))throw h("schema.invalidValue",`${b}.id`);u.add(x),d.push(S)}let c=A(l?.rootNodeId),m=c?d.find(g=>A(g?.id)===c):null,p=!!m&&yi.has(String(m.kind))&&!Object.prototype.hasOwnProperty.call(m,"parentId");if(l?.compositionVersion!==jt||d.length===0||!p)throw h("schema.unsupportedVersion",`$.assets[${a}].prefab`);n.set(A(s.id),d.flatMap((g,b)=>{let S=A(g.childPrefabId);return S?[{prefabId:S,path:`$.assets[${a}].prefab.nodes[${b}].childPrefabId`}]:[]}));for(let g=0;g<d.length;g+=1){let b=d[g];ni(b,new Map(d.map(M=>[A(M.id),M])),`$.assets[${a}].prefab.nodes[${g}]`);let S=A(b.id),x=A(b.parentId);if(S!==c&&(!x||!u.has(x)))throw h("schema.invalidReference",`$.assets[${a}].prefab.nodes[${g}].parentId`);if(b.kind==="prefabInstance"){let M=A(b.childPrefabId);if(!M||!t.has(M))throw h("schema.invalidReference",`$.assets[${a}].prefab.nodes[${g}].childPrefabId`)}let D=new Set([S]),w=x;for(;w;){if(D.has(w))throw h("schema.invalidReference",`$.assets[${a}].prefab.nodes[${g}].parentId`);D.add(w);let M=d.find(O=>A(O.id)===w);w=M?A(M.parentId):null}}}let r=new Set,i=new Set,o=a=>{if(!i.has(a)){r.add(a);for(let s of n.get(a)??[]){if(r.has(s.prefabId))throw h("schema.invalidReference",s.path);o(s.prefabId)}r.delete(a),i.add(a)}};for(let a of n.keys())o(a)}function hi(e,t){if(e==null)return;let n=I(e);if(!n)throw h("schema.invalidType",t);if(Object.prototype.hasOwnProperty.call(n,"active")&&typeof n.active!="boolean")throw h("schema.invalidType",`${t}.active`);n.shadowMapExperiment!==void 0&&tt(n.shadowMapExperiment,`${t}.shadowMapExperiment`)}function Ld(e,t){let n=new Map;for(let r of t.map(I)){if(r?.type!=="prefab")continue;let i=A(r.id),o=A(I(r.prefab)?.sourceAssetId);i&&o&&n.set(i,o)}for(let r=0;r<e.length;r+=1){let i=I(e[r]);if(!i||i.prefab==null)continue;let o=I(i.prefab),a=A(o?.prefabId),s=a?n.get(a):null;if(!a||!s)throw h("schema.unsupportedVersion",`$.scene.gameObjects[${r}].prefab`);if(A(o?.sourceAssetId)!==s)throw h("schema.invalidReference",`$.scene.gameObjects[${r}].prefab.sourceAssetId`);let l=A(I(i.instance)?.assetId);if(l&&l!==s)throw h("schema.invalidReference",`$.scene.gameObjects[${r}].instance.assetId`);let d=Array.isArray(i.components)?i.components:[];for(let u=0;u<d.length;u+=1){let c=I(d[u]);if(c?.type==="ModelRenderer"&&A(c.assetId)!==s)throw h("schema.invalidReference",`$.scene.gameObjects[${r}].components[${u}].assetId`)}}}function Fd(e){for(let t=0;t<e.length;t+=1){let n=I(I(I(e[t])?.marker)?.geometry);if(n?.kind!=="box")continue;for(let i of Od)if(Object.prototype.hasOwnProperty.call(n,i))throw h("schema.deprecatedField",`$.scene.gameObjects[${t}].marker.geometry.${i}`);if(!(Array.isArray(I(e[t])?.components)?I(e[t]).components:[]).some(i=>I(i)?.type==="Transform"))throw h("schema.invalidValue",`$.scene.gameObjects[${t}].components`)}}function Ud(e,t){let n=new Map,r=new Map;for(let i=0;i<e.length;i+=1){let o=I(e[i]),a=A(o?.id);if(!o||!a)continue;if(o.type==="prefab"){let c=A(I(o.prefab)?.sourceAssetId);c&&r.set(a,c)}let s=I(o.metadata),l=s?.materialSlots;if(l==null){n.set(a,new Set);continue}if(!Array.isArray(l))throw h("schema.invalidType",`$.assets[${i}].metadata.materialSlots`);let d=zd(s?.assetAnalysis),u=new Set;for(let c=0;c<l.length;c+=1){let m=I(l[c]),p=A(m?.slotId);if(!m||!p)throw h("schema.invalidValue",`$.assets[${i}].metadata.materialSlots[${c}]`);let g=`$.assets[${i}].metadata.materialSlots[${c}]`;for(let b of["ownerNodePath","nodeIndex","nodeIndexPath","meshIndex","primitiveIndex","sourceMaterialIndex","sourceMaterialIndices","sourceMeshName","triangleCount","boundingBox"])if(Object.prototype.hasOwnProperty.call(m,b))throw h("schema.deprecatedField",`${g}.${b}`);if(!Array.isArray(m.sourceSurfaces))throw h("schema.invalidType",`${g}.sourceSurfaces`);if(m.sourceSurfaces.length===0)throw h("schema.invalidValue",`${g}.sourceSurfaces`);for(let b=0;b<m.sourceSurfaces.length;b+=1){let S=`${g}.sourceSurfaces[${b}]`,x=I(m.sourceSurfaces[b]);if(!x||!A(x.ownerNodePath))throw h("schema.invalidValue",S);Si(x,"nodeIndex",S),Si(x,"sourceMaterialIndex",S);for(let w of["meshIndex","primitiveIndex"])if(!Number.isInteger(x[w])||x[w]<0)throw h("schema.invalidValue",`${S}.${w}`);if(x.nodeIndexPath!=null&&(!Array.isArray(x.nodeIndexPath)||x.nodeIndexPath.some(w=>!Number.isInteger(w)||w<0)))throw h("schema.invalidValue",`${S}.nodeIndexPath`);let D=x.meshIndex;if(!A(x.sourceMeshName)&&!d.has(D))throw h("schema.invalidValue",`${S}.sourceMeshName`)}if(u.has(p))throw h("schema.invalidValue",`$.assets[${i}].metadata.materialSlots[${c}].slotId`);u.add(p)}n.set(a,u)}for(let i=0;i<e.length;i+=1){let o=I(e[i]);if(o?.type!=="prefab")continue;let a=I(o.prefab),s=A(a?.sourceAssetId);On(a?.overrides,s?n.get(s):void 0,`$.assets[${i}].prefab.overrides`);let l=Array.isArray(a?.nodes)?a.nodes:[];for(let d=0;d<l.length;d+=1){let u=I(l[d]),c=A(u?.childPrefabId),m=A(u?.sourceAssetId)??(c?r.get(c)??null:null);On(u?.overrides,m?n.get(m):void 0,`$.assets[${i}].prefab.nodes[${d}].overrides`)}}for(let i=0;i<t.length;i+=1){let o=I(t[i]),s=(Array.isArray(o?.components)?o.components:[]).map(I).find(d=>d?.type==="ModelRenderer"),l=A(s?.assetId);On(o?.overrides,l?n.get(l):void 0,`$.scene.gameObjects[${i}].overrides`)}}function On(e,t,n){let r=I(e);if(!r||r.materialSlotBindings==null)return;let i=I(r.materialSlotBindings);if(!i)throw h("schema.invalidType",`${n}.materialSlotBindings`);for(let[o,a]of Object.entries(i)){if(!t?.has(o))throw h("schema.invalidReference",`${n}.materialSlotBindings.${o}`);let s=`${n}.materialSlotBindings.${o}`,l=I(a);if(!l)throw h("schema.invalidType",s);for(let d of Object.keys(l))if(d!=="materialAssetId"&&d!=="override")throw h("schema.deprecatedField",`${s}.${d}`);if("materialAssetId"in l&&l.materialAssetId!=null&&!A(l.materialAssetId))throw h("schema.invalidValue",`${s}.materialAssetId`);if("override"in l&&!I(l.override))throw h("schema.invalidType",`${s}.override`);"override"in l&&Bd(l.override,`${s}.override`)}}function Si(e,t,n){let r=e[t];if(r!=null&&(!Number.isInteger(r)||r<0))throw h("schema.invalidValue",`${n}.${t}`)}function zd(e){let t=I(e),n=Array.isArray(t?.meshes)?t.meshes:[];return new Set(n.flatMap(r=>{let i=I(r),o=i?.meshIndex,a=Number.isInteger(o)?o:null;return a!=null&&A(i?.name)?[a]:[]}))}function Bd(e,t){let n=I(e);if(!n)throw h("schema.invalidType",t);if(ze(n,["lightingModel","baseColor","normal","metallic","roughness","metallicRoughness","occlusion","emission","alpha"],t),"lightingModel"in n&&!["lit","unlit"].includes(String(n.lightingModel)))throw h("schema.invalidValue",`${t}.lightingModel`);for(let r of["metallic","roughness"])ft(n,r,t);Vd(n.baseColor,`${t}.baseColor`),$n(n.normal,`${t}.normal`,["texture","strength"]),$n(n.metallicRoughness,`${t}.metallicRoughness`,["texture"]),$n(n.occlusion,`${t}.occlusion`,["texture","strength"]),Kd(n.emission,`${t}.emission`),Hd(n.alpha,`${t}.alpha`)}function Vd(e,t){if(e==null)return;let n=Be(e,t);ze(n,["color","texture","brightness","saturation","contrast","hue"],t),Ai(n.color,`${t}.color`),ut(n.texture,`${t}.texture`);for(let r of["brightness","saturation","contrast","hue"])ft(n,r,t)}function $n(e,t,n){if(e==null)return;let r=Be(e,t);ze(r,n,t),ut(r.texture,`${t}.texture`),n.includes("strength")&&ft(r,"strength",t)}function Kd(e,t){if(e==null)return;let n=Be(e,t);ze(n,["color","intensity","texture","maskTexture"],t),Ai(n.color,`${t}.color`),ft(n,"intensity",t),ut(n.texture,`${t}.texture`),ut(n.maskTexture,`${t}.maskTexture`)}function Hd(e,t){if(e==null)return;let n=Be(e,t);if(ze(n,["mode","opacity","cutoff","texture"],t),"mode"in n&&!["opaque","mask","blend"].includes(String(n.mode)))throw h("schema.invalidValue",`${t}.mode`);for(let r of["opacity","cutoff"])ft(n,r,t);ut(n.texture,`${t}.texture`)}function ut(e,t){if(e==null)return;let n=Be(e,t);ze(n,["url","textureAssetId"],t);for(let r of["url","textureAssetId"])if(r in n&&n[r]!=null&&!A(n[r]))throw h("schema.invalidValue",`${t}.${r}`)}function Ai(e,t){if(e==null)return;let n=Be(e,t);for(let r of["r","g","b"])Wd(n,r,t)}function ze(e,t,n){let r=new Set(t);for(let i of Object.keys(e))if(!r.has(i))throw h("schema.deprecatedField",`${n}.${i}`)}function ft(e,t,n){if(t in e&&e[t]!=null&&(typeof e[t]!="number"||!Number.isFinite(e[t])))throw h("schema.invalidType",`${n}.${t}`)}function Wd(e,t,n){if(!(t in e)||typeof e[t]!="number"||!Number.isFinite(e[t]))throw h("schema.invalidValue",`${n}.${t}`)}function Be(e,t){let n=I(e);if(!n)throw h("schema.invalidType",t);return n}function h(e,t){let n=new Error(`${e}: ${t}`);return Object.assign(n,{code:e,path:t}),n}function I(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:null}function A(e){return typeof e=="string"&&e.length>0&&e===e.trim()?e:null}function Ei(e){return typeof e=="number"&&Number.isFinite(e)&&e>0}function Ti(e,t,n={}){Ii(e);let r=t;Object.prototype.hasOwnProperty.call(r,"staticShadows")&&r.staticShadows!=null&&nt(r.staticShadows,"$.staticShadows");let{scene:i,...o}=t,a=structuredClone(o),s=U(i)?i:void 0,l=si(e),d={...l,compilerId:xi,compilerVersion:Pi,compiledAt:new Date().toISOString()};a.schemaVersion=3,a.meta={...a.meta??{},generatedFrom:d};let u=s?.rootId||"root",c=e.scene.gameObjects.filter(x=>x.id!==u),m=Zd(e),p={...e,scene:{...e.scene,materialAssets:m}},g=c.flatMap(x=>ll(x,l,p,n)),b=g.map(Di);Jd(u,b),Yd(u,b);let S={rootId:u,assets:p.assets.filter(tl).map(nl),nodes:b,materialAssets:m,materials:structuredClone(s?.materials??[]),textures:structuredClone(s?.textures??[])};return a.scene=S,a.plugins=ul(a.plugins,n.shadowMapExperimentConfig,p.scene.shadowMapExperiment,g,u,l.revision),En(a),{sceneConfig:a,summary:{assetCount:S.assets.length,gameObjectCount:e.scene.gameObjects.length,nodeCount:S.nodes.length}}}function Di(e){if(!Object.prototype.hasOwnProperty.call(e,"shadowMapExperiment")&&!Object.prototype.hasOwnProperty.call(e,"shadowMapExperimentInferredUpdateClass")&&!Object.prototype.hasOwnProperty.call(e,"shadowMapExperimentAuthoredShadow"))return e;let{shadowMapExperiment:t,shadowMapExperimentInferredUpdateClass:n,shadowMapExperimentAuthoredShadow:r,...i}=e;return i}function Jd(e,t){let n=new Set([e]);for(let r=0;r<t.length;r+=1){let i=t[r].id;if(n.has(i)){let o=new Error(`schema.invalidReference: $.scene.nodes[${r}].id`);throw Object.assign(o,{code:"schema.invalidReference",path:`$.scene.nodes[${r}].id`,nodeId:i}),o}n.add(i)}}function Yd(e,t){let n=new Map(t.map(r=>[r.id,r]));for(let r=0;r<t.length;r+=1){let i=t[r];if(!(i.source?.component!=="PrefabMarker"||!("marker"in i)||!i.marker))for(let o of Xd(i.marker)){let a=n.get(o.target.id);if(o.target.id!==e&&(!a||a.source?.objectId===i.source.objectId))continue;let s=`$.scene.nodes[${r}].marker.${o.path}.id`,l=new Error(`schema.invalidReference: ${s}`);throw Object.assign(l,{code:"schema.invalidReference",path:s,nodeId:i.id,targetId:o.target.id}),l}}}function Xd(e){let t=[];return e.target&&t.push({path:"target",target:e.target}),e.geometry.kind==="point"&&e.geometry.target&&t.push({path:"geometry.target",target:e.geometry.target}),e.geometry.kind==="object-bounds"&&t.push({path:"geometry.target",target:e.geometry.target}),t}function Zd(e){let t=structuredClone(e.scene.materialAssets??[]),n=Gt(Qd(e,t));if(!n.ok)throw new Error(`editor_scene_material_assets_missing: ${n.missingMaterialAssetIds.join(", ")}`);return t}function Qd(e,t){let n={...e,scene:{...e.scene,materialAssets:t}};return{...n,scene:{...n.scene,gameObjects:[...n.scene.gameObjects.map(r=>{let i=_i(r,n);if(i)return{...r,overrides:i};if(!("overrides"in r))return r;let o={...r};return delete o.overrides,o}),...el(n)]}}}function el(e){let t=[];for(let n of e.scene.gameObjects){let r=st(e,n);!r.definition||!Ht(r.definition)||t.push(...Mi({editorDocument:e,prefabAsset:r.definition,hostGameObject:n,instanceOverrides:n.overrides,visitedPrefabIds:new Set}))}return t}function Mi(e){if(e.visitedPrefabIds.has(e.prefabAsset.id))return[];e.visitedPrefabIds.add(e.prefabAsset.id);let t=vi(Tn(e.prefabAsset),at(e.prefabAsset)??""),n=t.find(o=>o.id===at(e.prefabAsset));if(!n)return e.visitedPrefabIds.delete(e.prefabAsset.id),[];let r=Gi(t,e.prefabAsset),i=[];for(let o of t){if(o.kind==="prefabInstance"&&o.childPrefabId){let d=e.editorDocument.assets.find(u=>u.id===o.childPrefabId);if(d&&Ht(d)){i.push(...Mi({editorDocument:e.editorDocument,prefabAsset:d,hostGameObject:e.hostGameObject,instanceOverrides:o.overrides,visitedPrefabIds:new Set(e.visitedPrefabIds)}));continue}continue}let a=Tl(e.hostGameObject,o);if(!a)continue;let s=o.kind==="model"&&o.sourceAssetId?e.editorDocument.assets.find(d=>d.id===o.sourceAssetId):void 0,l=Ln({hostGameObject:a,prefabAsset:e.prefabAsset,rootNode:n,node:o,asset:s,editorDocument:e.editorDocument,instanceOverrides:o.id===r?e.instanceOverrides:void 0});l&&i.push({...a,overrides:l})}return e.visitedPrefabIds.delete(e.prefabAsset.id),i}function tl(e){return e.type==="glb"||e.type==="texture"}function nl(e){let t=ol(e),n=e.type==="glb"?al(e):[],r=il(e.external),i=rl(e.defaults);return{id:e.id,type:e.type,...e.guid?{guid:e.guid}:{},...t?{url:t}:{},...typeof e.warmupCount=="number"&&Number.isInteger(e.warmupCount)&&e.warmupCount>=0?{warmupCount:e.warmupCount}:{},...typeof e.singleton=="boolean"?{singleton:e.singleton}:{},...typeof e.materialMode=="string"?{materialMode:e.materialMode}:{},...i!==void 0?{defaults:i}:{},...r?{external:r}:{},...n.length>0?{materialSlots:n}:{}}}function rl(e){if(!e)return;let t=structuredClone(e);return U(t)?(delete t.shadowMapExperiment,Object.keys(t).length>0?t:void 0):t}function il(e){let t=U(e)?e:void 0,n=pe(t?.platformAssetId),r=pe(t?.assetUrl);if(!(!n&&!r))return{...n?{platformAssetId:n}:{},...r?{assetUrl:r}:{}}}function ol(e){let t=U(e.metadata)?e.metadata:void 0,n=U(e.external)?e.external:void 0;return pe(t?.url)??pe(n?.assetUrl)??void 0}function al(e){let t=U(e.metadata)?e.metadata:void 0,n=Array.isArray(t?.materialSlots)?t.materialSlots:[],r=sl(t?.assetAnalysis);return n.flatMap(i=>{if(!U(i))return[];let o=pe(i.slotId);if(!o)return[];let a=pe(i.label),s=(Array.isArray(i.sourceSurfaces)?i.sourceSurfaces:[]).flatMap(l=>{if(!U(l))return[];let d=pe(l.ownerNodePath),u=mt(l.meshIndex),c=mt(l.primitiveIndex);if(!d||u==null||c==null)return[];let m=mt(l.nodeIndex),p=dl(Array.isArray(l.nodeIndexPath)?l.nodeIndexPath:[]),g=mt(l.sourceMaterialIndex),b=pe(l.sourceMeshName)??r.get(u);return[{ownerNodePath:d,...m==null?{}:{nodeIndex:m},...p.length>0?{nodeIndexPath:p}:{},meshIndex:u,primitiveIndex:c,...g==null?{}:{sourceMaterialIndex:g},...b?{sourceMeshName:b}:{}}]});return s.length===0?[]:[{slotId:o,...a?{label:a}:{},sourceSurfaces:s}]})}function sl(e){let t=U(e)?e:void 0,n=Array.isArray(t?.meshes)?t.meshes:[];return new Map(n.flatMap(r=>{if(!U(r))return[];let i=mt(r.meshIndex),o=pe(r.name);return i==null||!o?[]:[[i,o]]}))}function dl(e){return[...new Set(e.filter(t=>typeof t=="number"&&Number.isInteger(t)&&t>=0))]}function mt(e){return typeof e=="number"&&Number.isInteger(e)&&e>=0?e:void 0}function ll(e,t,n,r){let i=st(n,e);return(i.definition&&Ht(i.definition)?bl(e,i.definition,t,n,new Set):[cl(e,t,n,r)]).map(a=>{let s=a.kind==="instance"?n.assets.find(d=>d.id===a.instance.assetId):void 0,l=r.inferShadowMapExperimentUpdateClass?.({gameObject:e,runtimeNode:Di(a),...s?{asset:s}:{}})??gl(s);return{...a,shadowMapExperimentInferredUpdateClass:l,...Object.prototype.hasOwnProperty.call(a,"shadowMapExperimentAuthoredShadow")?{}:ml(a,n)}})}function cl(e,t,n,r={}){let i=An(e),o=ge(e),a=wn(e),s=Ml(e),l=Ce(e),d=_i(e,n),u=ti(e),c=pl(n,e),m={sourceId:t.sourceId,sourceType:t.sourceType,revision:t.revision,...e.guid?{objectGuid:e.guid}:{},objectId:e.id,component:o?"ModelRenderer":a?"ImageRenderer":s||l==="primitive"?"PrimitiveRenderer":l==="transform"?"Transform":"GameObject"},p={id:e.id,...e.name?{name:e.name}:{},...e.parentId?{parentId:e.parentId}:{},...e.active===!1?{enabled:!1}:{},...e.shadow?{shadow:structuredClone(e.shadow)}:{},...c?{shadowMapExperiment:structuredClone(c)}:{},...xl(n,e),...u?{rendering:u}:{},source:m,...i&&"position"in i?{transform:{position:i.position,rotation:i.rotation,...i.scale?{scale:i.scale}:{}}}:{}};if(l==="primitive")return{...p,kind:"primitive",primitive:{shape:s?.shape??"cube"},...d?{overrides:d}:{}};if(a)return{...p,kind:"image",image:{assetId:a.assetId,size:{width:a.size.width,height:a.size.height}},...d?{overrides:d}:{}};if(!o){if(l==="transform"){let g=El(e,r),b=g.transformType;delete g.transformType;let S=wi(b)??wi(e.transformType);return{...p,kind:"transform",...S?{transformType:S}:{},...e.camera?{camera:Rl(e.camera)}:{},...e.light?{light:ji(e.light)}:{},...e.marker?{marker:{label:e.name||e.id,...structuredClone(e.marker)}}:{},...g,...d?{overrides:d}:{}}}return{...p,kind:"group"}}return{...p,kind:"instance",instance:{assetId:o.assetId},...d?{overrides:d}:{}}}function ul(e,t,n,r,i,o){let a=(e??[]).filter(m=>m.pluginId!==mn);if(!t)return a;let s=n,l=r.find(m=>m.id===t.lightRef),d=l?.kind==="transform"&&l.light?.type==="directional"?l:void 0;if(!l&&t.enabled)throw new Error(`shadowMapExperiment.lightMissing:${t.lightRef}`);if(l&&!d&&t.enabled)throw new Error(`shadowMapExperiment.lightUnsupported:${t.lightRef}`);let u=d?.kind==="transform"&&d.light?.type==="directional"?[d.light.direction.x,d.light.direction.y,d.light.direction.z]:[0,-1,0],c=yr({revision:typeof o=="number"&&Number.isInteger(o)&&o>=0?o:0,scopeId:i,config:t,settings:s,lightDirection:u,objects:r.filter(m=>m.kind==="instance"||m.kind==="primitive").map(m=>({entityId:m.id,renderableIds:[m.id],...m.shadowMapExperiment?{override:m.shadowMapExperiment}:{},...fl(m.shadowMapExperimentAuthoredShadow),inferredUpdateClass:m.shadowMapExperimentInferredUpdateClass??"static"}))});return[...a,{pluginId:mn,schemaVersion:3,data:c}]}function fl(e){return{...e?.cast==="none"?{cast:!1}:e?.cast==="enabled"?{cast:!0}:{},...e?.receive==="none"?{receive:!1}:e?.receive==="enabled"?{receive:!0}:{}}}function ml(e,t){let n=e.kind==="instance"?t.assets.find(i=>i.id===e.instance.assetId):void 0,r=ki(Fn(n).shadow,e.shadow);return r?{shadowMapExperimentAuthoredShadow:r}:{}}function ki(...e){let t=ce(...e),n=t?.cast,r=t?.receive;return n||r?{...n?{cast:n}:{},...r?{receive:r}:{}}:void 0}function gl(e){let t=U(e?.metadata?.assetAnalysis)?e.metadata.assetAnalysis:void 0;if(!t)return"static";let n=Gn(t.skinCount),r=Gn(t.morphTargetCount);return n>0||r>0?"skinned":Gn(t.animationCount)>0?"dynamic":"static"}function Gn(e){return typeof e=="number"&&Number.isFinite(e)&&e>=0?e:0}function Kt(...e){for(let t=e.length-1;t>=0;t-=1)if(e[t])return e[t]}function pl(e,t){let n=ge(t),r=st(e,t),i=r.sourceAsset??(n?e.assets.find(o=>o.id===n.assetId):void 0);return Kt(Ci(i),r.definition?.prefab?.defaults?.shadowMapExperiment,t.shadowMapExperiment)}function Ci(e){if(!e||!U(e.defaults))return;let t=e.defaults.shadowMapExperiment;return U(t)?t:void 0}function bl(e,t,n,r,i){return Ri({prefabAsset:t,sourceRef:n,editorDocument:r,hostGameObject:e,rootRuntimeId:e.id,rootParentId:e.parentId,rootName:e.name??t.displayName??t.id,rootTransform:An(e)??void 0,rootActive:e.active,rootShadow:e.shadow,sceneInstanceShadow:e.shadow,rootShadowMapExperiment:e.shadowMapExperiment,instanceOverrides:e.overrides,propertyPathPrefix:`assets.${t.id}.prefab.nodes`,visitedPrefabIds:i})}function Ri(e){if(e.visitedPrefabIds.has(e.prefabAsset.id))return[_n({id:e.rootRuntimeId,name:e.rootName??e.prefabAsset.displayName??e.prefabAsset.id,parentId:e.rootParentId,transform:e.rootTransform,editorDocument:e.editorDocument,sourceRef:e.sourceRef,hostGameObject:e.hostGameObject,component:"PrefabCycle",propertyPath:e.propertyPathPrefix})];e.visitedPrefabIds.add(e.prefabAsset.id);let t=Tn(e.prefabAsset),n=at(e.prefabAsset),r=n?t.find(d=>d.id===n):null;if(!r||t.length===0)return e.visitedPrefabIds.delete(e.prefabAsset.id),[_n({id:e.rootRuntimeId,name:e.rootName??e.prefabAsset.displayName??e.prefabAsset.id,parentId:e.rootParentId,transform:e.rootTransform,editorDocument:e.editorDocument,sourceRef:e.sourceRef,hostGameObject:e.hostGameObject,component:"Prefab",propertyPath:e.propertyPathPrefix})];let i={instanceId:e.rootRuntimeId,rootNodeId:r.id},o=d=>Cn(i,d.id),a=vi(t,r.id),s=Gi(a,e.prefabAsset),l=[];for(let d of a){let u=o(d),c=d.id===r.id?e.rootParentId:o(t.find(g=>g.id===d.parentId)??r),m=hl(t,d),p=Sl(t,d);if(d.kind==="prefabInstance"&&d.childPrefabId){let g=e.editorDocument.assets.find(b=>b.id===d.childPrefabId);if(g&&Ht(g)){let b=d.id===r.id;l.push(...Ri({prefabAsset:g,sourceRef:e.sourceRef,editorDocument:e.editorDocument,hostGameObject:e.hostGameObject,rootRuntimeId:u,rootParentId:c,rootName:b?e.rootName??d.name??g.displayName??g.id:d.name??g.displayName??g.id,rootTransform:b?e.rootTransform??d.transform:d.transform,rootActive:b?e.rootActive??d.defaults?.active??e.prefabAsset.prefab?.defaults?.active:d.defaults?.active,rootShadow:b?ce(e.prefabAsset.prefab?.defaults?.shadow,d.defaults?.shadow,e.rootShadow):d.defaults?.shadow,inheritedShadowParticipationLayers:[e.prefabAsset.prefab?.defaults?.shadow,...p,d.defaults?.shadow,...e.inheritedShadowParticipationLayers??[]],sceneInstanceShadow:e.sceneInstanceShadow,inheritedShadowMapExperiment:Kt(e.prefabAsset.prefab?.defaults?.shadowMapExperiment,e.inheritedShadowMapExperiment,m,d.defaults?.shadowMapExperiment),rootShadowMapExperiment:e.rootShadowMapExperiment,instanceOverrides:b?gt(gt(de(e.prefabAsset.prefab?.overrides),de(d.overrides)),de(e.instanceOverrides)):d.overrides,propertyPathPrefix:`${e.propertyPathPrefix}.${d.id}.childPrefab.nodes`,visitedPrefabIds:new Set(e.visitedPrefabIds)}));continue}l.push(_n({id:u,name:d.name??d.childPrefabId??"Prefab Instance",parentId:c,transform:d.transform,sourceRef:e.sourceRef,editorDocument:e.editorDocument,hostGameObject:e.hostGameObject,component:"UnsupportedPrefabInstance",propertyPath:`${e.propertyPathPrefix}.${d.id}`}));continue}l.push(yl({node:d,rootNode:r,identityScope:i,prefabAsset:e.prefabAsset,runtimeId:u,parentId:c,sourceRef:e.sourceRef,editorDocument:e.editorDocument,hostGameObject:e.hostGameObject,rootRuntimeName:e.rootName,rootRuntimeTransform:e.rootTransform,rootRuntimeActive:e.rootActive,rootRuntimeShadow:e.rootShadow,inheritedShadowParticipationLayers:e.inheritedShadowParticipationLayers,compositionAncestorShadowParticipationLayers:p,sceneInstanceShadow:e.sceneInstanceShadow,inheritedShadowMapExperiment:e.inheritedShadowMapExperiment,compositionAncestorShadowMapExperiment:m,rootRuntimeShadowMapExperiment:e.rootShadowMapExperiment,instanceOverrides:d.id===s?e.instanceOverrides:void 0,propertyPath:`${e.propertyPathPrefix}.${d.id}`}))}return e.visitedPrefabIds.delete(e.prefabAsset.id),Il({compiledNodes:l,editorDocument:e.editorDocument,hostGameObject:e.hostGameObject})}function yl(e){let t=e.node.id===e.rootNode.id,n=t?e.rootRuntimeTransform??e.node.transform:e.node.transform,r=e.node.kind==="model"&&e.node.sourceAssetId?e.editorDocument.assets.find(o=>o.id===e.node.sourceAssetId):void 0,i=Ni({id:e.runtimeId,name:t?e.rootRuntimeName??e.node.name??e.prefabAsset.displayName??e.prefabAsset.id:e.node.name,parentId:e.parentId,transform:n,active:t?e.rootRuntimeActive??e.node.defaults?.active??e.prefabAsset.prefab?.defaults?.active:e.node.defaults?.active,shadow:t?ce(e.prefabAsset.prefab?.defaults?.shadow,e.node.defaults?.shadow,e.rootRuntimeShadow):ce(e.prefabAsset.prefab?.defaults?.shadow,e.node.defaults?.shadow),shadowMapExperimentAuthoredShadow:ki(Fn(r).shadow,e.prefabAsset.prefab?.defaults?.shadow,...e.compositionAncestorShadowParticipationLayers??[],e.node.defaults?.shadow,...e.inheritedShadowParticipationLayers??[],e.sceneInstanceShadow)??{},shadowMapExperiment:Kt(Ci(r),e.prefabAsset.prefab?.defaults?.shadowMapExperiment,e.inheritedShadowMapExperiment,e.compositionAncestorShadowMapExperiment,e.node.defaults?.shadowMapExperiment,e.rootRuntimeShadowMapExperiment),sourceAsset:r,editorDocument:e.editorDocument,sourceRef:e.sourceRef,hostGameObject:e.hostGameObject,component:e.node.kind==="model"?"PrefabModel":e.node.kind==="primitive"?"PrefabPrimitive":e.node.kind==="light"?"PrefabLight":e.node.kind==="marker"?"PrefabMarker":"PrefabNode",propertyPath:e.propertyPath});if(e.node.kind==="model"&&e.node.sourceAssetId){let o=Ln({hostGameObject:e.hostGameObject,prefabAsset:e.prefabAsset,rootNode:e.rootNode,node:e.node,asset:r,editorDocument:e.editorDocument,instanceOverrides:e.instanceOverrides});return{...i,kind:"instance",instance:{assetId:e.node.sourceAssetId},...o?{overrides:o}:{}}}if(e.node.kind==="primitive"){let o=Ln({hostGameObject:e.hostGameObject,prefabAsset:e.prefabAsset,rootNode:e.rootNode,node:e.node,asset:void 0,editorDocument:e.editorDocument,instanceOverrides:e.instanceOverrides});return{...i,kind:"primitive",primitive:{shape:e.node.primitive?.shape??"cube"},...o?{overrides:o}:{}}}return e.node.kind==="light"?{...i,kind:"transform",transformType:"light",...e.node.light?{light:ji(e.node.light)}:{}}:e.node.kind==="marker"&&e.node.marker?{...i,kind:"transform",marker:{label:e.node.name??e.node.id,...ri(e.node.marker,e.identityScope)}}:{...i,kind:"group"}}function hl(e,t){let n=new Map(e.map(o=>[o.id,o])),r=[],i=t.parentId?n.get(t.parentId):void 0;for(;i;)r.unshift(i),i=i.parentId?n.get(i.parentId):void 0;return Kt(...r.map(o=>o.defaults?.shadowMapExperiment))}function Sl(e,t){let n=new Map(e.map(o=>[o.id,o])),r=[],i=t.parentId?n.get(t.parentId):void 0;for(;i;)r.unshift(i),i=i.parentId?n.get(i.parentId):void 0;return r.map(o=>o.defaults?.shadow)}function _n(e){return{...Ni({id:e.id,name:e.name,parentId:e.parentId,transform:e.transform,editorDocument:e.editorDocument,sourceRef:e.sourceRef,hostGameObject:e.hostGameObject,component:e.component,propertyPath:e.propertyPath}),kind:"group"}}function El(e,t){let n=t.readCustomTransformRuntimeData?.(e);return n&&typeof n=="object"&&!Array.isArray(n)?structuredClone(n):{}}function Ni(e){return{id:e.id,...e.name?{name:e.name}:{},...e.parentId?{parentId:e.parentId}:{},...e.active===!1?{enabled:!1}:{},...e.shadow?{shadow:structuredClone(e.shadow)}:{},...Object.prototype.hasOwnProperty.call(e,"shadowMapExperimentAuthoredShadow")?{shadowMapExperimentAuthoredShadow:structuredClone(e.shadowMapExperimentAuthoredShadow??{})}:{},...e.shadowMapExperiment?{shadowMapExperiment:structuredClone(e.shadowMapExperiment)}:{},...Pl(e),source:{sourceId:e.sourceRef.sourceId,sourceType:e.sourceRef.sourceType,revision:e.sourceRef.revision,...e.hostGameObject.guid?{objectGuid:e.hostGameObject.guid}:{},objectId:e.hostGameObject.id,component:e.component,propertyPath:e.propertyPath},...e.transform&&"position"in e.transform?{transform:{position:e.transform.position,rotation:e.transform.rotation,...e.transform.scale?{scale:e.transform.scale}:{}}}:{}}}function xl(e,t){let n=Bt({document:e,casterId:t.id,caster:t});return Un(n,!!t.shadow)?{shadowPlan:n}:{}}function Pl(e){if(!e.editorDocument)return{};let t=re(e.shadow),n=Fn(e.sourceAsset),r=!!e.shadow||!!t.shadow||!!n.shadow;if(!r&&t.diagnostics.length===0&&n.diagnostics.length===0)return{};let i=Bt({document:e.editorDocument,casterId:e.hostGameObject.id,caster:e.hostGameObject,settings:{source:n.shadow,instance:t.shadow}}),o={...i,casterId:e.id,diagnostics:[...n.diagnostics,...t.diagnostics,...i.diagnostics].map(a=>({...a,casterId:a.casterId===e.hostGameObject.id||!a.casterId?e.id:a.casterId}))};return Un(o,r)?{shadowPlan:o}:{}}function Fn(e){if(!e)return{diagnostics:[]};let t=e?.defaults&&typeof e.defaults=="object"&&!Array.isArray(e.defaults)?e.defaults:void 0;if(!t)return{diagnostics:[]};let n=re(t.shadow);return{shadow:n.shadow,diagnostics:n.diagnostics.map(r=>({...r,details:{...r.details??{},source:"asset",assetId:e.id}}))}}function Un(e,t){return t||e.backend!=="none"||e.diagnostics.length>0}function Il(e){if(e.compiledNodes.length===0)return e.compiledNodes;let t=new Set(e.compiledNodes.map(a=>a.id)),n=e.compiledNodes.map(a=>Al(a)),r={...e.editorDocument,scene:{...e.editorDocument.scene,gameObjects:[...e.editorDocument.scene.gameObjects.filter(a=>!t.has(a.id)),...n]}},i=e.compiledNodes.filter(a=>a.shadow?.receive==="enabled").map(a=>a.id),o=n.find(a=>a.light?.type==="directional"&&a.active!==!1)?.id;return e.compiledNodes.map((a,s)=>{let l=n[s],d=Bt({document:r,casterId:a.id,caster:l,explicitReceiverIds:i,...o?{defaultLightId:o}:{}}),u=!!a.shadow;if(!Un(d,u)){if(!a.shadowPlan)return a;let c={...a};return delete c.shadowPlan,c}return{...a,shadowPlan:d}})}function Al(e){let t=[];return e.transform&&t.push({type:"Transform",position:e.transform.position,rotation:e.transform.rotation,...e.transform.scale?{scale:e.transform.scale}:{}}),e.kind==="instance"&&t.push({type:"ModelRenderer",assetId:e.instance.assetId}),e.kind==="image"&&t.push({type:"ImageRenderer",assetId:e.image.assetId,size:structuredClone(e.image.size)}),{id:e.id,...e.name?{name:e.name}:{},kind:e.kind==="image"?"transform":e.kind,...e.parentId?{parentId:e.parentId}:{},...e.enabled===!1?{active:!1}:{},...e.shadow?{shadow:structuredClone(e.shadow)}:{},...e.kind==="primitive"?{primitive:{shape:e.primitive.shape}}:{},...e.kind==="transform"&&e.transformType?{transformType:e.transformType}:{},...e.kind==="transform"&&e.light?{light:e.light}:{},...e.kind==="transform"&&e.camera?{camera:e.camera}:{},...e.kind==="transform"&&e.marker?{marker:structuredClone(e.marker)}:{},components:t}}function Ln(e){let t=e.node.kind==="model"&&e.node.sourceAssetId?$i(e.hostGameObject,e.node,e.node.sourceAssetId):e.hostGameObject,n=e.asset?.id,r=Dl([jn(de(e.prefabAsset.prefab?.overrides),e.prefabAsset.prefab?.sourceAssetId,e.asset),jn(de(e.rootNode.overrides),e.rootNode.kind==="model"?e.rootNode.sourceAssetId:e.prefabAsset.prefab?.sourceAssetId,e.asset),e.node.id===e.rootNode.id?void 0:jn(de(e.node.overrides),e.node.kind==="model"?e.node.sourceAssetId:n,e.asset)]),i=de(e.instanceOverrides);return Oi(gt(r,i),e.asset)}function jn(e,t,n){return Oi(e,t&&t===n?.id?n:void 0)}function Oi(e,t){if(!e?.materialSlotBindings)return e;let n=U(t?.metadata)&&Array.isArray(t.metadata.materialSlots)?t.metadata.materialSlots:[],r=new Set(n.flatMap(a=>{let s=U(a)&&typeof a.slotId=="string"?a.slotId.trim():"";return s?[s]:[]})),i=Object.fromEntries(Object.entries(e.materialSlotBindings).filter(([a])=>r.has(a))),o=structuredClone(e);return Object.keys(i).length>0?o.materialSlotBindings=i:delete o.materialSlotBindings,Object.keys(o).length>0?o:void 0}function $i(e,t,n){return{id:`${e.id}:${t.id}`,...t.name?{name:t.name}:{},kind:"instance",components:[...t.transform?[t.transform]:[],{type:"ModelRenderer",assetId:n}]}}function wl(e,t){return{id:`${e.id}:${t.id}`,...t.name?{name:t.name}:{},kind:"primitive",primitive:{shape:t.primitive?.shape??"cube"},components:[...t.transform?[t.transform]:[]]}}function Tl(e,t){return t.kind==="model"&&t.sourceAssetId?$i(e,t,t.sourceAssetId):t.kind==="primitive"?wl(e,t):null}function Dl(e){let t;for(let n of e){let r=de(n);r&&(t=gt(t,r))}return t}function vi(e,t){let n=new Map;for(let s of e){if(!s.parentId)continue;let l=n.get(s.parentId)??[];l.push(s),n.set(s.parentId,l)}let r=[],i=new Set,o=s=>{if(!i.has(s.id)){i.add(s.id),r.push(s);for(let l of n.get(s.id)??[])o(l)}},a=e.find(s=>s.id===t);a&&o(a);for(let s of e)o(s);return r}function Gi(e,t){let n=t.prefab?.sourceAssetId;return e.find(r=>r.kind==="model"&&r.sourceAssetId===n)?.id??e.find(r=>r.kind==="model")?.id}function Ht(e){return _t(e)&&e.prefab.compositionVersion===jt&&Array.isArray(e.prefab.nodes)&&e.prefab.nodes.length>0&&!!at(e)}function Ml(e){return e.primitive??null}function _i(e,t){let n=Ce(e);if(n!=="instance"&&n!=="transform"&&n!=="primitive")return;let r=ge(e),i=r?t.assets.find(o=>o.id===r.assetId):void 0;return kl(e,t,i)}function kl(e,t,n){let r=de(e.overrides),i=st(t,e),o=de(i.definition?.prefab?.overrides);return gt(o,r)}function gt(e,t){let n=ei(e,t);for(let r of[e,t])if(r)for(let[i,o]of Object.entries(r))Cl(i)||o===void 0||(n??={},n[i]=structuredClone(o));return n&&Object.keys(n).length>0?n:void 0}function de(e){if(!U(e))return;let t=structuredClone(e);return Object.keys(t).length>0?t:void 0}function Cl(e){return e==="materialBinding"||e==="materialSlotBindings"}function U(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}function pe(e){return(typeof e=="string"?e.trim():"")||void 0}function wi(e){return typeof e=="string"?e:void 0}function Rl(e){let t=structuredClone(e);return delete t.inspectorLanguage,t}function ji(e){return e.type==="directional"?ve({schemaVersion:1,type:"directional",intensity:e.intensity,direction:Je(e.direction),diffuseColor:e.diffuseColor??di.diffuseColor}):ve({schemaVersion:1,type:"hemispheric",intensity:e.intensity,diffuseColor:e.diffuseColor??Rn.diffuseColor,groundColor:e.groundColor??Rn.groundColor})}function Nl(e){return typeof e=="number"&&Number.isFinite(e)?e:null}function Li(e){let t=Nl(e);if(t==null)return null;let n=t%360;n>180&&(n-=360),n<=-180&&(n+=360);let r=Ol(n);return Object.is(r,-0)?0:r}function Ol(e){return Math.round(e*1e3)/1e3}var $l=new Set(["leftToRight","rightToLeft","bottomToTop","topToBottom"]);function zi(e){let t=xn(e),n={uiKind:e.uiKind,size:{width:e.size.width,depth:e.size.depth},layers:e.layers.map((r,i)=>vl(r,i)),rendering:{textureWidth:t.width,textureHeight:t.height}};return e.aspectSourceLayerId&&(n.aspectSourceLayerId=e.aspectSourceLayerId),typeof e.lockAspectToBorder=="boolean"&&(n.lockAspectToBorder=e.lockAspectToBorder),e.mask&&(n.mask={...typeof e.mask.enabled=="boolean"?{enabled:e.mask.enabled}:{},...e.mask.source==="roundedRect"||e.mask.source==="borderAlpha"||e.mask.source==="texture"?{source:e.mask.source}:{},...e.mask.textureId?{textureId:e.mask.textureId}:{},...typeof e.mask.cornerRadius=="number"&&Number.isFinite(e.mask.cornerRadius)?{cornerRadius:e.mask.cornerRadius}:{},...typeof e.mask.padding=="number"&&Number.isFinite(e.mask.padding)?{padding:e.mask.padding}:{}}),e.rendering&&(n.rendering={...n.rendering,...typeof e.rendering.alphaIndex=="number"&&Number.isFinite(e.rendering.alphaIndex)?{alphaIndex:e.rendering.alphaIndex}:{},...typeof e.rendering.diffuseTextureLevel=="number"&&Number.isFinite(e.rendering.diffuseTextureLevel)?{diffuseTextureLevel:e.rendering.diffuseTextureLevel}:{},...typeof e.rendering.emissiveTextureLevel=="number"&&Number.isFinite(e.rendering.emissiveTextureLevel)?{emissiveTextureLevel:e.rendering.emissiveTextureLevel}:{}}),n}function vl(e,t){let n=Li(e.rotationDeg??0)??0,r={id:e.id,role:e.role,zOrder:typeof e.zOrder=="number"&&Number.isFinite(e.zOrder)?e.zOrder:t,rect:Gl(e.rect),...n!==0?{rotationDeg:n}:{},...typeof e.enabled=="boolean"?{enabled:e.enabled}:{},...typeof e.opacity=="number"&&Number.isFinite(e.opacity)?{opacity:e.opacity}:{}};return e.kind==="texture"?{...r,kind:"texture",...e.textureId?{textureId:e.textureId}:{},...e.tint?{tint:Ve(e.tint)}:{},...e.imageFit?{imageFit:e.imageFit}:{}}:e.kind==="textureProgress"?{...r,kind:"textureProgress",...e.textureId?{textureId:e.textureId}:{},value:Ui(e.value),...e.tint?{tint:Ve(e.tint)}:{},...e.imageFit?{imageFit:e.imageFit}:{},...Fi(e.direction)?{direction:e.direction}:{}}:e.kind==="color"?{...r,kind:"color",color:Ve(e.color)}:e.kind==="progress"?{...r,kind:"progress",value:Ui(e.value??0),color:Ve(e.color),...Fi(e.direction)?{direction:e.direction}:{}}:{...r,kind:"text",text:{value:e.text.value,color:Ve(e.text.color),...e.text.fontFamily?{fontFamily:e.text.fontFamily}:{},...typeof e.text.fontSize=="number"&&Number.isFinite(e.text.fontSize)?{fontSize:e.text.fontSize}:{},...e.text.fontWeight!=null?{fontWeight:String(e.text.fontWeight)}:{},...e.text.strokeColor?{strokeColor:Ve(e.text.strokeColor)}:{},...typeof e.text.strokeWidth=="number"&&Number.isFinite(e.text.strokeWidth)?{strokeWidth:e.text.strokeWidth}:{},...e.text.align==="left"||e.text.align==="center"||e.text.align==="right"?{align:e.text.align}:{},...e.text.baseline==="top"||e.text.baseline==="middle"||e.text.baseline==="bottom"?{baseline:e.text.baseline}:{}}}}function Gl(e){return{x:e.x,z:e.z,width:e.width,depth:e.depth}}function Ve(e){return{r:e.r,g:e.g,b:e.b,...typeof e.a=="number"?{a:e.a}:{}}}function Fi(e){return typeof e=="string"&&$l.has(e)}function Ui(e){return Number.isFinite(e)?Math.max(0,Math.min(1,e)):0}var Bi=["model","texture","image","sound"],zn=[".glb",".gltf"],Vi=[".png",".jpg",".jpeg",".webp"],_l=[".env",".hdr",".dds",".ktx",".ktx2"],Bn=[...Vi,..._l],Vn=[".mp3",".wav",".ogg",".flac",".aac",".m4a"],Kn=[...zn,...Bn,...Vn];function jl(e){return String(e??"").trim().toLowerCase().replace(/-/g,"")}function Hn(e,t){let n=jl(t);return`${e==="model"?"asset":e==="texture"?"texture":e==="sound"?"sound":"image"}_${n}`}function Wn(e){let i=String(e??"").trim().split(/[^a-zA-Z0-9_$]+/).filter(Boolean).map((o,a)=>a===0?o:`${o.charAt(0).toUpperCase()}${o.slice(1)}`).join("").replace(/[^a-zA-Z0-9_$]/g,"")||"assetUrl";return/^[a-zA-Z_$]/.test(i)?i:`asset${i}`}function qn(e,t=""){let n=String(e??"").trim().toLowerCase();if(n==="glb"||n==="gltf"||n==="model")return"model";if(n==="groundtexture"||n==="ground-texture"||n==="texture")return"texture";if(n==="ui"||n==="image"||n==="img")return"image";if(n==="audio"||n==="sound")return"sound";let r=Ll(t);return zn.includes(r)?"model":Vn.includes(r)?"sound":Bn.includes(r)?"texture":null}function Ll(e){let t=e.split(/[?#]/,1)[0]??"",n=Math.max(t.lastIndexOf("/"),t.lastIndexOf("\\")),r=t.slice(n+1),i=r.lastIndexOf(".");return i>=0?r.slice(i).toLowerCase():""}function Ki(e){let t=String(e??"").trim(),n=t.toLowerCase();for(let r of[...Kn].sort((i,o)=>o.length-i.length))if(n.endsWith(r)){t=t.slice(0,-r.length);break}return t}function Hi(e,t){return String(e??"").trim()||Ki(t)||"Asset"}function Wi(e,t){return Ki(e||t).trim().toLowerCase().normalize("NFKD").replace(/[^a-z0-9]+/g,"_").replace(/^_+|_+$/g,"").replace(/_{2,}/g,"_")||null}function qi(e){return e==="model"?zn:e==="sound"?Vn:e==="texture"?Bn:e==="image"?Vi:[]}function Ji(e){let t=typeof e=="string"&&e.trim()?e.trim():void 0;if(!t)return;if(t.includes("\0"))throw new Error("external_asset_path_must_be_portable");let n=t.replace(/\\/g,"/");if(n.startsWith("/")||/^[a-z]:\//i.test(n)||/^[a-z][a-z0-9+.-]*:/i.test(n))throw new Error("external_asset_path_must_be_portable");let r=[];for(let i of n.split("/"))if(!(!i||i===".")){if(i==="..")throw new Error("external_asset_path_must_be_portable");r.push(i)}if(r.length===0)throw new Error("external_asset_path_must_be_portable");return r.join("/")}function Wt(e,t={}){let n=t.generatedBy??"scripts/register-asset.mjs",r=t.codeKeyPolicy??"legacy",i=e.filter(d=>d.codeKey);if(r==="disabled"&&i.length>0){let d=i[0];throw Object.assign(new Error("manifest_code_key_disabled"),{name:"PlayableEditorAssetCatalogGenerationError",details:{codeKeyPolicy:r,assetId:d.assetId,codeKey:d.codeKey}})}let o=e.map(d=>`import ${Wn(d.assetId)} from ${JSON.stringify(`${d.relativePath}?url`)};`).join(`
4
- `),a=e.map(d=>{let u=pn(d.relativePath);if(!u)throw new Error(`Generated asset catalog entry has no file extension: ${d.assetId}`);if(!bn(u))throw new Error(`Generated asset catalog entry has unsupported format: ${d.assetId} (${u})`);let c=[`guid: ${JSON.stringify(d.guid)}`,`assetId: ${JSON.stringify(d.assetId)}`,`kind: ${JSON.stringify(d.kind)}`,`displayName: ${JSON.stringify(d.displayName)}`,`url: ${Wn(d.assetId)}`,`format: ${JSON.stringify(u)}`,`relativePath: ${JSON.stringify(d.relativePath)}`,d.originalFileName?`originalFileName: ${JSON.stringify(d.originalFileName)}`:"",d.codeKey?`codeKey: ${JSON.stringify(d.codeKey)}`:"",d.category?`category: ${JSON.stringify(d.category)}`:"",typeof d.placeable=="boolean"?`placeable: ${JSON.stringify(d.placeable)}`:"",typeof d.warmupCount=="number"?`warmupCount: ${JSON.stringify(d.warmupCount)}`:"",typeof d.singleton=="boolean"?`singleton: ${JSON.stringify(d.singleton)}`:"",d.materialMode?`materialMode: ${JSON.stringify(d.materialMode)}`:"",d.defaults?`defaults: ${JSON.stringify(d.defaults)}`:"",d.contentHash?`contentHash: ${JSON.stringify(d.contentHash)}`:"",typeof d.byteSize=="number"?`byteSize: ${JSON.stringify(d.byteSize)}`:"",d.external?`external: ${JSON.stringify(d.external)}`:"",d.metadata?`metadata: ${JSON.stringify(d.metadata)}`:"",d.createdAt?`createdAt: ${JSON.stringify(d.createdAt)}`:"",d.updatedAt?`updatedAt: ${JSON.stringify(d.updatedAt)}`:""].filter(Boolean).join(", ");return` ${JSON.stringify(d.assetId)}: { ${c} },`}).join(`
2
+ import cn from"node:fs/promises";import V from"node:path";import{pathToFileURL as Zc}from"node:url";var St=class extends Error{path;reason;code="runtime.lighting.invalid";constructor(t,r){super(`Invalid Runtime Lighting data at ${t}: ${r}`),this.path=t,this.reason=r,this.name="FpsRuntimeLightingDataError"}},fn=1e-6,Fo=1e-4,Uo=new Set(["schemaVersion","type","intensity","direction","diffuseColor"]),zo=new Set(["schemaVersion","type","intensity","diffuseColor","groundColor"]),Bo=new Set(["x","y","z"]),Vo=new Set(["r","g","b"]);function Je(e,t="$.direction"){let r=mn(e,t),n=Math.hypot(r.x,r.y,r.z);return n<=fn&&X(t,"expected a non-zero direction vector"),Object.freeze({x:r.x/n,y:r.y/n,z:r.z/n})}function ve(e,t="$.light"){let r=nr(e,t);r.schemaVersion!==1&&X(`${t}.schemaVersion`,"expected 1");let n=Ko(r.intensity,`${t}.intensity`);if(r.type==="directional"){Et(r,Uo,t);let i=mn(r.direction,`${t}.direction`),o=Math.hypot(i.x,i.y,i.z);return o<=fn&&X(`${t}.direction`,"expected a non-zero direction vector"),Math.abs(o-1)>Fo&&X(`${t}.direction`,"expected a normalized direction vector"),Object.freeze({schemaVersion:1,type:"directional",intensity:n,direction:i,diffuseColor:tr(r.diffuseColor,`${t}.diffuseColor`)})}if(r.type==="hemispheric")return Et(r,zo,t),Object.freeze({schemaVersion:1,type:"hemispheric",intensity:n,diffuseColor:tr(r.diffuseColor,`${t}.diffuseColor`),groundColor:tr(r.groundColor,`${t}.groundColor`)});X(`${t}.type`,"expected directional or hemispheric")}function mn(e,t){let r=nr(e,t);return Et(r,Bo,t),Object.freeze({x:qe(r.x,`${t}.x`),y:qe(r.y,`${t}.y`),z:qe(r.z,`${t}.z`)})}function tr(e,t){let r=nr(e,t);return Et(r,Vo,t),Object.freeze({r:rr(r.r,`${t}.r`),g:rr(r.g,`${t}.g`),b:rr(r.b,`${t}.b`)})}function nr(e,t){(!e||typeof e!="object"||Array.isArray(e))&&X(t,"expected a plain object");let r=Object.getPrototypeOf(e);return r!==Object.prototype&&r!==null&&X(t,"expected a plain object"),e}function Et(e,t,r){for(let n of Object.keys(e))t.has(n)||X(`${r}.${n}`,"unknown field")}function qe(e,t){return(typeof e!="number"||!Number.isFinite(e))&&X(t,"expected a finite number"),e}function Ko(e,t){let r=qe(e,t);return r<0&&X(t,"expected a non-negative number"),r}function rr(e,t){let r=qe(e,t);return(r<0||r>1)&&X(t,"expected a number between 0 and 1"),r}function X(e,t){throw new St(e,t)}var Xe="medium",ir={low:{opacity:.32,softness:.25,bias:.0015,normalBias:.02,maxDistance:24,resolution:512,cascadeCount:1,bakeSamples:8,blurKernel:2},medium:{opacity:.42,softness:.4,bias:.001,normalBias:.01,maxDistance:48,resolution:1024,cascadeCount:2,bakeSamples:24,blurKernel:4},high:{opacity:.5,softness:.58,bias:8e-4,normalBias:.006,maxDistance:80,resolution:2048,cascadeCount:4,bakeSamples:64,blurKernel:8},ultra:{opacity:.56,softness:.72,bias:6e-4,normalBias:.004,maxDistance:120,resolution:4096,cascadeCount:4,bakeSamples:128,blurKernel:12}};function xt(e=Xe,t={}){let r=ir[e]??ir[Xe];return{opacity:Ye(t.opacity,r.opacity),softness:Ye(t.softness,r.softness),bias:Ye(t.bias,r.bias),normalBias:Ye(t.normalBias,r.normalBias),maxDistance:Ye(t.maxDistance,r.maxDistance),resolution:qo(t.resolution,r.resolution),cascadeCount:Jo(t.cascadeCount,r.cascadeCount),bakeSamples:Ho(t.bakeSamples,r.bakeSamples),blurKernel:Wo(t.blurKernel,r.blurKernel)}}function Ye(e,t){return typeof e=="number"&&Number.isFinite(e)?e:t}function Ho(e,t){return typeof e=="number"&&Number.isFinite(e)&&e>0?Math.round(e):t}function Wo(e,t){return typeof e=="number"&&Number.isFinite(e)&&e>=0?Math.round(e):t}function qo(e,t){return e===512||e===1024||e===2048||e===4096?e:t}function Jo(e,t){return e===1||e===2||e===4?e:t}function Pt(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function It(e){return e==="inherit"||e==="none"||e==="enabled"||e==="auto"}function At(e){return e==="inherit"||e==="none"||e==="enabled"||e==="auto"}function wt(e){return e==="inherit"||e==="none"||e==="dynamic"||e==="static"||e==="blob"||e==="projected"||e==="auto"}function Tt(e){return e==="inherit"||e==="low"||e==="medium"||e==="high"||e==="ultra"}function Dt(e){return e==="inherit"||e==="scene-main"||e==="nearest"||e==="explicit"}function gn(e){let t=Pt(e);if(!t)return;let r={};It(t.cast)&&(r.cast=t.cast),At(t.receive)&&(r.receive=t.receive),wt(t.mode)&&(r.mode=t.mode),Tt(t.quality)&&(r.quality=t.quality);let n=Pt(t.light);if(n){let o={};Dt(n.mode)&&(o.mode=n.mode),typeof n.lightId=="string"&&n.lightId.trim()&&(o.lightId=n.lightId.trim()),Object.keys(o).length>0&&(r.light=o)}let i=Yo(t.params);return i&&(r.params=i),Object.keys(r).length>0?r:void 0}function ne(e){let t=gn(e);return t?{shadow:t,diagnostics:[]}:{diagnostics:[]}}function or(e,t="none"){let r=e?.mode;return!r||r==="inherit"||r==="auto"?t:r}function ar(e,t=Xe){let r=e?.quality;return r&&r!=="inherit"?r:t}function ce(...e){let t={};for(let r of e)if(r){if((r.cast==="enabled"||r.cast==="none")&&(t.cast=r.cast),(r.receive==="enabled"||r.receive==="none")&&(t.receive=r.receive),r.mode!==void 0&&r.mode!=="inherit"&&(t.mode=r.mode),r.quality!==void 0&&r.quality!=="inherit"&&(t.quality=r.quality),r.light){let n={...t.light??{}};r.light.mode!==void 0&&r.light.mode!=="inherit"&&(n.mode=r.light.mode),r.light.lightId!==void 0&&(n.lightId=r.light.lightId),Object.keys(n).length>0&&(t.light=n)}r.params&&(t.params={...t.params??{},...r.params})}return Object.keys(t).length>0?t:void 0}function Yo(e){let t=Pt(e);if(!t)return;let r={};return typeof t.opacity=="number"&&Number.isFinite(t.opacity)&&(r.opacity=t.opacity),typeof t.softness=="number"&&Number.isFinite(t.softness)&&(r.softness=t.softness),typeof t.bias=="number"&&Number.isFinite(t.bias)&&(r.bias=t.bias),typeof t.normalBias=="number"&&Number.isFinite(t.normalBias)&&(r.normalBias=t.normalBias),typeof t.maxDistance=="number"&&Number.isFinite(t.maxDistance)&&(r.maxDistance=t.maxDistance),(t.resolution===512||t.resolution===1024||t.resolution===2048||t.resolution===4096)&&(r.resolution=t.resolution),(t.cascadeCount===1||t.cascadeCount===2||t.cascadeCount===4)&&(r.cascadeCount=t.cascadeCount),typeof t.bakeSamples=="number"&&Number.isFinite(t.bakeSamples)&&(r.bakeSamples=t.bakeSamples),typeof t.blurKernel=="number"&&Number.isFinite(t.blurKernel)&&(r.blurKernel=t.blurKernel),Object.keys(r).length>0?r:void 0}var Xo=new Set(["cast","receive","mode","quality","light","params"]),Zo=new Set(["mode","lightId"]),Qo=new Set(["opacity","softness","bias","normalBias","maxDistance","resolution","cascadeCount","bakeSamples","blurKernel"]);function Ze(e,t="$.shadow"){let r=dr(e);if(!r)throw B("schema.invalidType",t);if(sr(r,Xo,t),"cast"in r&&!It(r.cast))throw B("schema.invalidValue",`${t}.cast`);if("receive"in r&&!At(r.receive))throw B("schema.invalidValue",`${t}.receive`);if("mode"in r&&!wt(r.mode))throw B("schema.invalidValue",`${t}.mode`);if("quality"in r&&!Tt(r.quality))throw B("schema.invalidValue",`${t}.quality`);"light"in r&&ea(r.light,`${t}.light`),"params"in r&&ta(r.params,`${t}.params`)}function ea(e,t){let r=dr(e);if(!r)throw B("schema.invalidType",t);if(sr(r,Zo,t),"mode"in r&&!Dt(r.mode))throw B("schema.invalidValue",`${t}.mode`);if("lightId"in r&&(typeof r.lightId!="string"||!r.lightId.trim()))throw B("schema.invalidValue",`${t}.lightId`);if(r.mode==="explicit"&&(typeof r.lightId!="string"||!r.lightId.trim()))throw B("schema.invalidValue",`${t}.lightId`)}function ta(e,t){let r=dr(e);if(!r)throw B("schema.invalidType",t);if(sr(r,Qo,t),Ae(r,"opacity",t,n=>n>=0&&n<=1),Ae(r,"softness",t,n=>n>=0),Ae(r,"bias",t,()=>!0),Ae(r,"normalBias",t,()=>!0),Ae(r,"maxDistance",t,n=>n>0),Ae(r,"bakeSamples",t,n=>n>0),Ae(r,"blurKernel",t,n=>n>=0),"resolution"in r&&![512,1024,2048,4096].includes(r.resolution))throw B("schema.invalidValue",`${t}.resolution`);if("cascadeCount"in r&&![1,2,4].includes(r.cascadeCount))throw B("schema.invalidValue",`${t}.cascadeCount`)}function Ae(e,t,r,n){if(!(t in e))return;let i=e[t];if(typeof i!="number"||!Number.isFinite(i)||!n(i))throw B("schema.invalidValue",`${r}.${t}`)}function sr(e,t,r){for(let n of Object.keys(e))if(!t.has(n))throw B("schema.deprecatedField",`${r}.${n}`)}function B(e,t){let r=new Error(`${e}: ${t}`);return Object.assign(r,{code:e,path:t}),r}function dr(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:null}var fr="fps.shadow-map-experiment";function mr(e,t="$.scene.shadowMapExperiment"){let r=Z(e,t);oe(r,["qualityProfile","behaviorProfile"],t),r.qualityProfile!==void 0&&ie(r.qualityProfile,`${t}.qualityProfile`),r.behaviorProfile!==void 0&&ie(r.behaviorProfile,`${t}.behaviorProfile`)}function tt(e,t="$.shadowMapExperiment"){let r=Z(e,t);oe(r,["behaviorProfile"],t),ie(r.behaviorProfile,`${t}.behaviorProfile`)}function ra(e,t="$"){let r=Z(e,t);oe(r,["schemaVersion","enabled","lightRef","defaultQualityProfile","defaultBehaviorProfile","qualityProfiles","behaviorProfiles"],t),r.schemaVersion!==1&&k(`${t}.schemaVersion`,"expected 1"),typeof r.enabled!="boolean"&&k(`${t}.enabled`,"expected boolean"),ie(r.lightRef,`${t}.lightRef`);let n=ie(r.defaultQualityProfile,`${t}.defaultQualityProfile`),i=ie(r.defaultBehaviorProfile,`${t}.defaultBehaviorProfile`),o=bn(r.qualityProfiles,`${t}.qualityProfiles`),a=bn(r.behaviorProfiles,`${t}.behaviorProfiles`);for(let[s,l]of Object.entries(o))ia(l,`${t}.qualityProfiles.${s}`);for(let[s,l]of Object.entries(a))oa(l,`${t}.behaviorProfiles.${s}`);Object.prototype.hasOwnProperty.call(o,n)||k(`${t}.defaultQualityProfile`,`unknown quality profile: ${n}`),Object.prototype.hasOwnProperty.call(a,i)||k(`${t}.defaultBehaviorProfile`,`unknown behavior profile: ${i}`)}function yn(e){ra(e.config),e.settings!==void 0&&mr(e.settings),(!Number.isInteger(e.revision)||e.revision<0)&&k("$.revision","expected a non-negative integer");let t=e.settings?.qualityProfile??e.config.defaultQualityProfile,r=e.settings?.behaviorProfile??e.config.defaultBehaviorProfile,n=cr(e.config.qualityProfiles,t,"$.settings.qualityProfile","quality");cr(e.config.behaviorProfiles,r,"$.settings.behaviorProfile","behavior");let i=e.objects.map((s,l)=>{let d=`$.objects[${l}]`;s.override!==void 0&&tt(s.override,`${d}.override`);let u=s.override?.behaviorProfile??r,c=cr(e.config.behaviorProfiles,u,`${d}.override.behaviorProfile`,"behavior");return Object.freeze({entityId:ie(s.entityId,`${d}.entityId`),renderableIds:Object.freeze(ma(s.renderableIds,`${d}.renderableIds`)),cast:pn(s.cast,`${d}.cast`)??c.cast==="enabled",receive:pn(s.receive,`${d}.receive`)??c.receive==="enabled",updateClass:c.updateClass!=="auto"?c.updateClass:s.inferredUpdateClass??"static",behaviorProfileId:u})}).sort((s,l)=>s.entityId.localeCompare(l.entityId)),o=e.config.enabled?i:[];ua(o);let a=Object.fromEntries(Object.entries(e.config.behaviorProfiles).sort(([s],[l])=>s.localeCompare(l)).map(([s,l])=>[s,Object.freeze({cast:l.cast==="enabled",receive:l.receive==="enabled",updateClass:l.updateClass})]));return hn({schemaVersion:3,revision:e.revision,enabled:e.config.enabled,scopeId:ie(e.scopeId,"$.scopeId"),light:{entityId:e.config.lightRef,direction:et(e.lightDirection,"$.lightDirection")},qualityProfileId:t,generator:{maps:{...n.maps},...n.cascadeCount===void 0?{}:{cascadeCount:n.cascadeCount},filter:n.receiverFilter,bias:n.bias,normalBias:n.normalBias,darkness:n.darkness,...n.softness===void 0?{}:{softness:n.softness},bounds:fa(n.bounds),backend:{...n.backend}},culling:{...n.culling},diagnosticThresholds:{...n.diagnostics},behaviorProfiles:a,objects:o,diagnostics:[]})}function pn(e,t){if(e!==void 0)return typeof e!="boolean"&&k(t,"expected a boolean"),e}function na(e,t){let r=Z(e,t);oe(r,["mode","center","extent","near","far"],t),r.mode!=="fixed"&&k(`${t}.mode`,"expected fixed"),et(r.center,`${t}.center`),et(r.extent,`${t}.extent`).some(a=>a<=0)&&k(`${t}.extent`,"expected positive values");let i=Mt(r.near,`${t}.near`),o=Mt(r.far,`${t}.far`);(i<0||o<=i)&&k(t,"expected 0 <= near < far")}function ia(e,t){let r=Z(e,t);oe(r,["maps","cascadeCount","receiverFilter","bias","normalBias","darkness","softness","bounds","backend","culling","diagnostics"],t),aa(r.maps,`${t}.maps`),r.cascadeCount!==void 0&&sa(r.cascadeCount,`${t}.cascadeCount`),r.receiverFilter!=="hard"&&r.receiverFilter!=="low-pcf"&&k(`${t}.receiverFilter`,"expected hard or low-pcf"),Qe(r.bias,`${t}.bias`,0,.1),Qe(r.normalBias,`${t}.normalBias`,0,1),Qe(r.darkness,`${t}.darkness`,0,1),r.softness!==void 0&&Qe(r.softness,`${t}.softness`,0,1),na(r.bounds,`${t}.bounds`),da(r.backend,`${t}.backend`),la(r.culling,`${t}.culling`),ca(r.diagnostics,`${t}.diagnostics`)}function oa(e,t){let r=Z(e,t);oe(r,["cast","receive","updateClass"],t),r.cast!=="enabled"&&r.cast!=="disabled"&&k(`${t}.cast`,"expected enabled or disabled"),r.receive!=="enabled"&&r.receive!=="disabled"&&k(`${t}.receive`,"expected enabled or disabled"),["auto","static","dynamic","skinned"].includes(String(r.updateClass))||k(`${t}.updateClass`,"expected auto, static, dynamic, or skinned")}function aa(e,t){let r=Z(e,t);oe(r,["staticResolution","dynamicResolution","compositeResolution"],t),lr(r.staticResolution,`${t}.staticResolution`),lr(r.dynamicResolution,`${t}.dynamicResolution`),lr(r.compositeResolution,`${t}.compositeResolution`)}function lr(e,t){e!==512&&e!==1024&&e!==2048&&e!==4096&&k(t,"expected 512, 1024, 2048, or 4096")}function sa(e,t){e!==1&&e!==2&&e!==4&&k(t,"expected 1, 2, or 4")}function da(e,t){let r=Z(e,t);oe(r,["mode","fallback"],t),["auto","split","single"].includes(String(r.mode))||k(`${t}.mode`,"expected auto, split, or single"),r.fallback!=="single-map"&&r.fallback!=="disable"&&k(`${t}.fallback`,"expected single-map or disable")}function la(e,t){let r=Z(e,t);oe(r,["enabled","guardBandRatio"],t),typeof r.enabled!="boolean"&&k(`${t}.enabled`,"expected boolean"),Qe(r.guardBandRatio,`${t}.guardBandRatio`,0,4)}function ca(e,t){let r=Z(e,t);oe(r,["staticCasterCountWarning","dynamicCasterCountWarning","renderableCountWarning"],t),ur(r.staticCasterCountWarning,`${t}.staticCasterCountWarning`),ur(r.dynamicCasterCountWarning,`${t}.dynamicCasterCountWarning`),ur(r.renderableCountWarning,`${t}.renderableCountWarning`)}function ua(e){let t=new Set,r=new Set;for(let n of e){t.has(n.entityId)&&k("$.objects",`duplicate entity id: ${n.entityId}`),t.add(n.entityId);for(let i of n.renderableIds)r.has(i)&&k("$.objects",`duplicate renderable id: ${i}`),r.add(i)}}function bn(e,t){let r=Z(e,t);Object.keys(r).length===0&&k(t,"expected at least one profile");for(let n of Object.keys(r))ie(n,`${t} key`);return r}function cr(e,t,r,n){return Object.prototype.hasOwnProperty.call(e,t)||k(r,`unknown ${n} profile: ${t}`),e[t]}function fa(e){return Object.freeze({mode:"fixed",center:et(e.center,"$.bounds.center"),extent:et(e.extent,"$.bounds.extent"),near:e.near,far:e.far})}function et(e,t){let r=ga(e,t);return r.length!==3&&k(t,"expected exactly three numbers"),Object.freeze(r.map((n,i)=>Mt(n,`${t}[${i}]`)))}function ma(e,t){let r=e.map((n,i)=>ie(n,`${t}[${i}]`));return new Set(r).size!==r.length&&k(t,"expected unique strings"),r}function Mt(e,t){return(typeof e!="number"||!Number.isFinite(e))&&k(t,"expected a finite number"),e}function Qe(e,t,r,n){let i=Mt(e,t);return(i<r||i>n)&&k(t,`expected ${r}..${n}`),i}function ur(e,t){return(!Number.isInteger(e)||e<0)&&k(t,"expected a non-negative integer"),e}function ie(e,t){return(typeof e!="string"||!e.trim()||e!==e.trim())&&k(t,"expected a trimmed non-empty string"),e}function Z(e,t){(!e||typeof e!="object"||Array.isArray(e))&&k(t,"expected an object");let r=Object.getPrototypeOf(e);return r!==Object.prototype&&r!==null&&k(t,"expected a plain object"),e}function ga(e,t){return Array.isArray(e)||k(t,"expected an array"),e}function oe(e,t,r){let n=new Set(t);for(let i of Object.keys(e))n.has(i)||k(`${r}.${i}`,"unknown field")}function hn(e){if(!e||typeof e!="object"||Object.isFrozen(e))return e;for(let t of Object.values(e))hn(t);return Object.freeze(e)}function k(e,t){throw new Error(`shadow_map_experiment_invalid:${e}:${t}`)}var pa=new Set([".glb",".gltf",".png",".jpg",".jpeg",".webp",".env",".hdr",".dds",".ktx",".ktx2",".mp3",".wav",".ogg",".flac",".aac",".m4a"]);function gr(e){let t=String(e??"").trim().toLowerCase();if(/^\.[a-z0-9]+$/.test(t))return t;let r=t.split(/[?#]/,1)[0]??"",n=r.slice(r.lastIndexOf("/")+1),i=n.lastIndexOf(".");return i<=0||i===n.length-1?null:n.slice(i)}function pr(e){return pa.has(e)}function yr(e){return e==="fps.builtin.pbr"||e==="fps.builtin.standard"?e:void 0}function br(e){if(!e||typeof e!="object")return;let t={};(e.lightingModel==="lit"||e.lightingModel==="unlit")&&(t.lightingModel=e.lightingModel);let r={},n=Sn(e.baseColor?.color);n&&(r.color=n);let i=we(e.baseColor?.texture);i!==void 0&&(r.texture=i),ue(e.baseColor,r,"brightness"),ue(e.baseColor,r,"saturation"),ue(e.baseColor,r,"contrast"),ue(e.baseColor,r,"hue"),Object.keys(r).length>0&&(t.baseColor=r);let o={},a=we(e.normal?.texture);a!==void 0&&(o.texture=a),ue(e.normal,o,"strength"),Object.keys(o).length>0&&(t.normal=o),_e(e.metallic)&&(t.metallic=e.metallic),_e(e.roughness)&&(t.roughness=e.roughness);let s={},l=we(e.metallicRoughness?.texture);l!==void 0&&(s.texture=l),Object.keys(s).length>0&&(t.metallicRoughness=s);let d={},u=we(e.occlusion?.texture);u!==void 0&&(d.texture=u),ue(e.occlusion,d,"strength"),Object.keys(d).length>0&&(t.occlusion=d);let c={},m=Sn(e.emission?.color);m&&(c.color=m),ue(e.emission,c,"intensity");let p=we(e.emission?.texture);p!==void 0&&(c.texture=p);let g=we(e.emission?.maskTexture);g!==void 0&&(c.maskTexture=g),Object.keys(c).length>0&&(t.emission=c);let b={};(e.alpha?.mode==="opaque"||e.alpha?.mode==="mask"||e.alpha?.mode==="blend")&&(b.mode=e.alpha.mode),ue(e.alpha,b,"opacity"),ue(e.alpha,b,"cutoff");let S=we(e.alpha?.texture);return S!==void 0&&(b.texture=S),Object.keys(b).length>0&&(t.alpha=b),Object.keys(t).length>0?t:void 0}function kt(...e){let t={};for(let r of e){let n=br(r);n&&(n.lightingModel&&(t.lightingModel=n.lightingModel),Ge(t,n,"baseColor"),Ge(t,n,"normal"),n.metallic!==void 0&&(t.metallic=n.metallic),n.roughness!==void 0&&(t.roughness=n.roughness),Ge(t,n,"metallicRoughness"),Ge(t,n,"occlusion"),Ge(t,n,"emission"),Ge(t,n,"alpha"))}return br(t)??{}}function Ge(e,t,r){let n=t[r];n&&Object.assign(e,{[r]:{...e[r]??{},...n}})}function Sn(e){return e&&_e(e.r)&&_e(e.g)&&_e(e.b)?{r:e.r,g:e.g,b:e.b}:void 0}function we(e){if(e===null)return null;if(!e||typeof e!="object")return;let t=typeof e.url=="string"?e.url.trim():"",r=typeof e.textureAssetId=="string"?e.textureAssetId.trim():"";if(!(!t&&!r))return{...t?{url:t}:{},...r?{textureAssetId:r}:{}}}function ue(e,t,r){_e(e?.[r])&&(t[r]=e[r])}function _e(e){return typeof e=="number"&&Number.isFinite(e)}function En(e){let t=me(e);if(!t)return null;let r=L(t.sourceHash),n=L(t.lightHash),i=L(t.profileHash);if(!r||!n||!i)return null;let o={sourceHash:r,lightHash:n,profileHash:i,...typeof t.generatedAt=="string"&&t.generatedAt.trim()?{generatedAt:t.generatedAt.trim()}:{},...(()=>{let u=Ia(t.stats);return u?{stats:u}:{}})()};if(t.version!==2||t.format!=="sdf-atlas"||!Array.isArray(t.pages)||!Array.isArray(t.chunks))return null;let a=[],s=new Map;for(let u of t.pages){let c=ba(u);if(!c||s.has(c.id))return null;a.push(c),s.set(c.id,c)}let l=[],d=new Set;for(let u of t.chunks){let c=ya(u,s);if(!c||d.has(c.id))return null;l.push(c),d.add(c.id)}return{version:2,format:"sdf-atlas",pages:a,chunks:l,...o}}function rt(e,t="$.staticShadows"){let r=En(e);if(r)return r;let n=new Error(`schema.unsupportedVersion: ${t}`);throw Object.assign(n,{code:"schema.unsupportedVersion",path:t}),n}function ba(e){let t=me(e);if(!t)return null;let r=L(t.id),n=Ot(t.width),i=Ot(t.height),o=Aa(t.sdfTextureDataUrl);return!r||n==null||i==null||!o?null:{id:r,width:n,height:i,sdfTextureDataUrl:o}}function ya(e,t){let r=me(e);if(!r)return null;let n=L(r.id),i=xa(r.bounds),o=Pa(r.plane),a=L(r.pageId),s=Sa(r.atlasRect),l=Ea(r.atlasUv),d=wa(r.sourceNodeIds),u=L(r.sourceHash),c=L(r.lightHash),m=L(r.profileHash);if(!n||!i||!o||!a||!s||!l||!d||!u||!c||!m)return null;let p=t.get(a);return!p||s.x+s.width>p.width||s.y+s.height>p.height?null:{id:n,bounds:i,plane:o,pageId:a,atlasRect:s,atlasUv:l,sourceNodeIds:d,sourceHash:u,lightHash:c,profileHash:m,...(()=>{let g=ha(r.binding);return g?{binding:g}:{}})()}}function ha(e){let t=me(e);if(!t)return null;let r=L(t.id),n=L(t.ownerCasterId),i=L(t.receiverId),o=L(t.generatedAt),a=L(t.sourceHash);if(!r||!n||!i||!o||!a||t.visibleWhenOwnerVisible!==!0||t.staleWhenOwnerTransformChanges!==!0||t.staleWhenLightChanges!==!0)return null;let s=L(t.lightId),l=L(t.textureAssetId),d=L(t.projectionNodeId);return{id:r,ownerCasterId:n,receiverId:i,...s?{lightId:s}:{},...l?{textureAssetId:l}:{},...d?{projectionNodeId:d}:{},visibleWhenOwnerVisible:!0,staleWhenOwnerTransformChanges:!0,staleWhenLightChanges:!0,generatedAt:o,sourceHash:a}}function Sa(e){let t=me(e);if(!t)return null;let r=ye(t.x),n=ye(t.y),i=Ot(t.width),o=Ot(t.height);return r==null||n==null||i==null||o==null?null:{x:r,y:n,width:i,height:o}}function Ea(e){let t=me(e);if(!t)return null;let r=Ct(t.u0),n=Ct(t.v0),i=Ct(t.u1),o=Ct(t.v1);return r==null||n==null||i==null||o==null||i<=r||o<=n?null:{u0:r,v0:n,u1:i,v1:o}}function xa(e){let t=me(e);if(!t)return null;let r=ae(t.minX),n=ae(t.maxX),i=ae(t.minZ),o=ae(t.maxZ),a=ae(t.y);return r==null||n==null||i==null||o==null||a==null||n<=r||o<=i?null:{minX:r,maxX:n,minZ:i,maxZ:o,y:a}}function Pa(e){let t=me(e);if(!t)return null;let r=ae(t.height),n=ae(t.yOffset);return r==null||n==null||n<0?null:{height:r,yOffset:n}}function Ia(e){let t=me(e);if(!t)return null;let r=ye(t.sourceRootCount),n=ye(t.sourceMeshCount),i=ye(t.attemptedChunkCount),o=ye(t.chunkCount),a=ye(t.textureCount);return r==null||n==null||i==null||o==null||a==null?null:{sourceRootCount:r,sourceMeshCount:n,attemptedChunkCount:i,chunkCount:o,textureCount:a,...Rt(t.skippedChunkCount,"skippedChunkCount"),...Rt(t.pageCount,"pageCount"),...fe(t.resolution,"resolution"),...fe(t.chunkSize,"chunkSize"),...fe(t.atlasSize,"atlasSize"),...Nt(t.atlasUsedPixels,"atlasUsedPixels"),...Nt(t.atlasAllocatedPixels,"atlasAllocatedPixels"),...Ta(t.atlasOccupancy,"atlasOccupancy"),...fe(t.texelsPerMeter,"texelsPerMeter"),...fe(t.effectiveTexelsPerMeter,"effectiveTexelsPerMeter"),...fe(t.maxAtlasPages,"maxAtlasPages"),...Nt(t.sdfRadiusPx,"sdfRadiusPx"),...fe(t.spatialChunkSize,"spatialChunkSize"),...fe(t.effectiveSpatialChunkSize,"effectiveSpatialChunkSize"),...fe(t.targetChunkCount,"targetChunkCount"),...Rt(t.bakedChunkCount,"bakedChunkCount"),...Rt(t.reusedChunkCount,"reusedChunkCount"),...Nt(t.durationMs,"durationMs")}}function Aa(e){let t=L(e);return t&&/^data:image\/png[;,]/i.test(t)?t:null}function wa(e){if(!Array.isArray(e)||e.length===0)return null;let t=[],r=new Set;for(let n of e){let i=L(n);if(!i)return null;r.has(i)||t.push(i),r.add(i)}return t}function L(e){return typeof e=="string"&&e.trim()?e.trim():null}function ae(e){return typeof e=="number"&&Number.isFinite(e)?e:null}function ye(e){return typeof e=="number"&&Number.isInteger(e)&&e>=0?e:null}function Ot(e){return typeof e=="number"&&Number.isInteger(e)&&e>0?e:null}function Ct(e){return typeof e=="number"&&Number.isFinite(e)&&e>=0&&e<=1?e:null}function Rt(e,t){let r=ye(e);return r==null?{}:{[t]:r}}function fe(e,t){let r=ae(e);return r==null||r<=0?{}:{[t]:r}}function Nt(e,t){let r=ae(e);return r==null||r<0?{}:{[t]:r}}function Ta(e,t){let r=ae(e);return r==null||r<0||r>1?{}:{[t]:r}}function me(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:null}var Da="@fps-games/editor.playable-sdk.scene-compiler",Ma="2",ka=1e-4,H={nodeKinds:["group","instance","transform","primitive","image"],primitiveShapes:["cube","sphere","plane","capsule"],transformTypes:["plain","light","camera","groundDecal"],assetTypes:["glb","texture"],materialScopes:["sharedAsset","nodeMaterial"],materialModes:["shared","instance"],materialShaderIds:["fps.builtin.pbr","fps.builtin.standard"],materialAssetSystemPresets:["default-pbr","default-standard"],runtimeV3:{assetFields:["id","guid","type","url","external","warmupCount","singleton","materialMode","defaults","materialSlots"],materialSlotFields:["slotId","label","sourceSurfaces"],materialSlotSourceSurfaceFields:["ownerNodePath","nodeIndex","nodeIndexPath","meshIndex","primitiveIndex","sourceMaterialIndex","sourceMeshName"]},hierarchy:{parentTargets:["root","sceneNode"]},runtimeOnlyTokens:["/@fs","assetUrl","sourceAssetUrl","sourceAssetPath"]},Ca=new Set(H.nodeKinds),Ra=new Set(H.primitiveShapes),Na=new Set(H.assetTypes),Oa=new Set(H.materialModes),$a=new Set(H.materialScopes),va=new Set(H.materialAssetSystemPresets),Ga=new Set(H.transformTypes),nt=new Set(H.hierarchy.parentTargets),_a=H.runtimeOnlyTokens,ja=new Set(H.runtimeV3.assetFields),La=new Set(H.runtimeV3.materialSlotFields),Fa=new Set(H.runtimeV3.materialSlotSourceSurfaceFields);function Ua(e,t={}){let{allowOrphanSharedMaterials:r=!0,allowOrphanNodeMaterials:n=!0,strictAssetIds:i=[],strictNodeIds:o=[],maxErrors:a=50}=t,s=Number.isInteger(a)&&a>0?a:50,l=[],d=new Set(i),u=new Set(o),c=(f,v)=>{l.length<s&&l.push({path:f,message:v})};if(!E(e))return c("$","scene json must be an object"),l;let m=e.schemaVersion;m!==2&&m!==3&&c("$.schemaVersion","schemaVersion must be 2 or 3"),Xa(e.meta?.generatedFrom,"$.meta.generatedFrom",c);let p=as(e),g=e.scene;if(!E(g))return c("$.scene","scene must be an object"),l;if(P(g.rootId)||c("$.scene.rootId","rootId must be a non-empty string"),Array.isArray(g.assets)||c("$.scene.assets","assets must be an array"),Array.isArray(g.nodes)||c("$.scene.nodes","nodes must be an array"),Array.isArray(g.materialAssets)||c("$.scene.materialAssets","materialAssets must be an array"),Array.isArray(g.materials)||c("$.scene.materials","materials must be an array"),Array.isArray(g.textures)||c("$.scene.textures","textures must be an array"),l.length>0)return l;e.staticShadows!=null&&xn(()=>rt(e.staticShadows,"$.staticShadows"),"$.staticShadows",c);let b=new Set,S=new Map,x=new Map,D=new Set,w=new Set([g.rootId]),M=new Map,O=new Map,z=new Set;return g.assets.forEach((f,v)=>{let y=`$.scene.assets[${v}]`;if(!E(f)){c(y,"asset must be an object");return}if(P(f.id)?b.has(f.id)?c(`${y}.id`,`duplicate asset id: ${f.id}`):(b.add(f.id),S.set(f.id,f.type)):c(`${y}.id`,"asset.id must be a non-empty string"),Na.has(f.type)||c(`${y}.type`,"asset.type must be glb or texture"),f.guid!=null&&!P(f.guid)&&c(`${y}.guid`,"asset.guid must be a non-empty string when present"),f.url!=null&&!P(f.url)&&c(`${y}.url`,"url must be a non-empty string when present"),f.external!=null&&!E(f.external)&&c(`${y}.external`,"external must be an object when present"),f.warmupCount!=null&&(!Number.isInteger(f.warmupCount)||f.warmupCount<0)&&c(`${y}.warmupCount`,"warmupCount must be a non-negative integer when present"),f.singleton!=null&&typeof f.singleton!="boolean"&&c(`${y}.singleton`,"singleton must be a boolean when present"),f.materialMode!=null&&!Oa.has(f.materialMode)&&c(`${y}.materialMode`,"materialMode must be shared or instance"),Ya(f.defaults,`${y}.defaults`,c),m===3)for(let j of Object.keys(f))ja.has(j)||c(`${y}.${j}`,`runtime schema v3 asset field is not allowed: ${j}`);else f.displayName!=null&&!P(f.displayName)&&c(`${y}.displayName`,"displayName must be a non-empty string when present"),f.category!=null&&!P(f.category)&&c(`${y}.category`,"category must be a non-empty string when present"),f.metadata!=null&&!E(f.metadata)&&c(`${y}.metadata`,"metadata must be an object when present");let G=m===3?f.materialSlots:E(f.metadata)?f.metadata.materialSlots:void 0,J=m===3?`${y}.materialSlots`:`${y}.metadata.materialSlots`,Y=new Set;G!=null&&(Array.isArray(G)?G.forEach((j,$e)=>{let Ie=`${J}[${$e}]`;if(!E(j)||!P(j.slotId)){c(Ie,m===3?"material slot must contain a stable slotId":"material slot must contain stable slotId and ownerNodePath");return}if(m!==3&&!P(j.ownerNodePath)){c(Ie,"material slot must contain stable slotId and ownerNodePath");return}Y.has(j.slotId)?c(`${Ie}.slotId`,`duplicate material slot id: ${j.slotId}`):Y.add(j.slotId),m===3&&Ja(j,Ie,c)}):c(J,"materialSlots must be an array when present")),P(f.id)&&x.set(f.id,Y),d.has(f.id)&&An(f,y,c)}),g.nodes.forEach((f,v)=>{let y=`$.scene.nodes[${v}]`;if(!E(f)){c(y,"node must be an object");return}P(f.id)&&M.set(f.id,f),P(f.id)?w.has(f.id)?c(`${y}.id`,`duplicate node id: ${f.id}`):(w.add(f.id),typeof f.kind=="string"&&O.set(f.id,f.kind),f.kind==="transform"&&Object.prototype.hasOwnProperty.call(f,"marker")&&z.add(f.id)):c(`${y}.id`,"node.id must be a non-empty string"),Ca.has(f.kind)||c(`${y}.kind`,"node.kind must be group, instance, transform, primitive, or image")}),g.materialAssets.forEach((f,v)=>{let y=`$.scene.materialAssets[${v}]`;if(!E(f)){c(y,"material asset must be an object");return}P(f.id)?D.has(f.id)?c(`${y}.id`,`duplicate material asset id: ${f.id}`):D.add(f.id):c(`${y}.id`,"material asset id must be a non-empty string"),f.name!=null&&!P(f.name)&&c(`${y}.name`,"material asset name must be a non-empty string when present"),f.guid!=null&&!P(f.guid)&&c(`${y}.guid`,"material asset guid must be a non-empty string when present"),Object.prototype.hasOwnProperty.call(f,"materialKind")&&c(`${y}.materialKind`,"materialKind is not supported; use shaderId"),Object.prototype.hasOwnProperty.call(f,"profile")&&c(`${y}.profile`,"profile is not supported; use properties"),yr(f.shaderId)||c(`${y}.shaderId`,"shaderId must be fps.builtin.pbr or fps.builtin.standard"),Dn(f.properties,`${y}.properties`,c);for(let G of Object.keys(f))["id","guid","name","shaderId","properties","system","origin"].includes(G)||c(`${y}.${G}`,`material asset field is not allowed: ${G}`);Va(f.system,`${y}.system`,c),Ka(f.origin,`${y}.origin`,c),Ha(f,y,c)}),g.nodes.forEach((f,v)=>{if(!E(f))return;let y=`$.scene.nodes[${v}]`,G=Object.prototype.hasOwnProperty.call(f,"parentId");G&&!P(f.parentId)&&c(`${y}.parentId`,"parentId must be a non-empty string when present");let J=G?f.parentId:g.rootId;P(J)&&Wa(J,g.rootId,w,`${y}.parentId`,c),P(f.id)&&qa(f.id,g.rootId,M,`${y}.parentId`,c),Za(f.source,`${y}.source`,c),kn(f.transform,`${y}.transform`,c),ys(f.rendering,`${y}.rendering`,c),f.shadow!=null&&xn(()=>Ze(f.shadow,`${y}.shadow`),`${y}.shadow`,c),Object.prototype.hasOwnProperty.call(f,"shadowMode")&&c(`${y}.shadowMode`,"deprecated field; use shadow.mode");let Y=null;f.kind==="instance"&&(E(f.instance)?b.has(f.instance.assetId)?S.get(f.instance.assetId)!=="glb"?c(`${y}.instance.assetId`,"instance.assetId must reference a glb asset"):Y=P(f.instance.assetId)?f.instance.assetId:null:c(`${y}.instance.assetId`,`assetId must reference scene.assets: ${f.instance.assetId}`):c(`${y}.instance`,"instance node must contain instance object")),f.kind==="primitive"&&(E(f.primitive)?Ra.has(f.primitive.shape)||c(`${y}.primitive.shape`,"primitive.shape must be cube, sphere, plane, or capsule"):c(`${y}.primitive`,"primitive node must contain primitive object")),f.kind==="image"&&(E(f.image)?(b.has(f.image.assetId)?S.get(f.image.assetId)!=="texture"&&c(`${y}.image.assetId`,"image.assetId must reference a texture asset"):c(`${y}.image.assetId`,`assetId must reference scene.assets: ${f.image.assetId}`),E(f.image.size)?(In(f.image.size.width)||c(`${y}.image.size.width`,"image.size.width must be positive"),In(f.image.size.height)||c(`${y}.image.size.height`,"image.size.height must be positive")):c(`${y}.image.size`,"image.size must be an object")):c(`${y}.image`,"image node must contain image object")),f.kind==="transform"&&f.transformType!=null&&!Ga.has(f.transformType)&&c(`${y}.transformType`,"transformType must be plain, light, camera, or groundDecal"),f.kind==="transform"&&f.transformType==="groundDecal"?ls(f.groundDecal,`${y}.groundDecal`,c):Object.prototype.hasOwnProperty.call(f,"groundDecal")&&c(`${y}.groundDecal`,"groundDecal is only allowed on transform nodes with transformType groundDecal"),f.kind==="transform"&&(os(f.camera,`${y}.camera`,c),ss(f.light,`${y}.light`,c,p)),Object.prototype.hasOwnProperty.call(f,"marker")&&(f.kind!=="transform"?c(`${y}.marker`,"marker is only allowed on transform nodes"):(Qa(f.marker,`${y}.marker`,c),es(f.marker,f.id,w,z,`${y}.marker`,c))),(f.kind==="instance"||f.kind==="transform"||f.kind==="primitive"||f.kind==="image")&&za(f.overrides,`${y}.overrides`,D,Y?x.get(Y):void 0,m===3?"materialSlots":"metadata.materialSlots",c),u.has(f.id)&&An(f,y,c)}),g.materials.forEach((f,v)=>{let y=`$.scene.materials[${v}]`;if(!E(f)){c(y,"material must be an object");return}if(P(f.id)||c(`${y}.id`,"material.id must be a non-empty string"),f.scope!=null&&!$a.has(f.scope)&&c(`${y}.scope`,"material scope must be sharedAsset or nodeMaterial"),f.scope==="sharedAsset"&&(!P(f.assetId)||!b.has(f.assetId))&&!r&&c(`${y}.assetId`,`shared material assetId must reference scene.assets: ${f.assetId}`),f.scope==="nodeMaterial"){if((!P(f.nodeId)||!w.has(f.nodeId))&&!n)c(`${y}.nodeId`,`node material nodeId must reference scene.nodes: ${f.nodeId}`);else if(P(f.nodeId)&&w.has(f.nodeId)){let G=O.get(f.nodeId);G!=="instance"&&G!=="transform"&&G!=="primitive"&&c(`${y}.nodeId`,`node material nodeId must reference an instance, transform, or primitive node: ${f.nodeId}`)}}P(f.materialName)||c(`${y}.materialName`,"materialName must be a non-empty string"),E(f.properties)?Rn(f.properties,`${y}.properties`,c):c(`${y}.properties`,"properties must be an object")}),l}function wn(e,t={}){let r=Ua(e,t);return{ok:r.length===0,errors:r}}function xn(e,t,r){try{e()}catch(n){let i=typeof n?.path=="string"?n.path:t,o=typeof n?.code=="string"?n.code:"schema.invalidValue";r(i,o)}}function za(e,t,r,n,i,o){if(e!=null){if(!E(e)){o(t,"overrides must be an object when present");return}Tn(e.materialBinding,`${t}.materialBinding`,r,o),Ba(e.materialSlotBindings,`${t}.materialSlotBindings`,"slotId",r,n,i,o),Object.prototype.hasOwnProperty.call(e,"childMaterialBindings")&&o(`${t}.childMaterialBindings`,"deprecated field; use materialSlotBindings keyed by slotId"),Object.prototype.hasOwnProperty.call(e,"childMaterials")&&o(`${t}.childMaterials`,"deprecated field; use materialSlotBindings keyed by slotId")}}function Ba(e,t,r,n,i,o,a){if(e!=null){if(!E(e)){a(t,"material binding map must be an object when present");return}for(let[s,l]of Object.entries(e)){let d=`${t}.${s}`;P(s)||a(d,`${r} must be a non-empty string`),i?i.has(s)||a(d,`${r} must reference asset ${o}`):a(d,`${r} requires an instance asset with ${o}`),l==null?a(d,"material binding must be an object"):Tn(l,d,n,a)}}}function Tn(e,t,r,n){if(e!=null){if(!E(e)){n(t,"material binding must be an object when present");return}e.materialAssetId!=null&&(P(e.materialAssetId)?r.has(e.materialAssetId)||n(`${t}.materialAssetId`,`materialAssetId must reference scene.materialAssets: ${e.materialAssetId}`):n(`${t}.materialAssetId`,"materialAssetId must be non-empty when present")),e.override!=null&&Dn(e.override,`${t}.override`,n)}}function Dn(e,t,r){if(!E(e)){r(t,"material asset profile must be an object");return}if(e.lightingModel!=null&&e.lightingModel!=="lit"&&e.lightingModel!=="unlit"&&r(`${t}.lightingModel`,"lightingModel must be lit or unlit"),e.baseColor!=null)if(!E(e.baseColor))r(`${t}.baseColor`,"baseColor must be an object");else{$t(e.baseColor.color,`${t}.baseColor.color`,r),Te(e.baseColor.texture,`${t}.baseColor.texture`,r);for(let n of["brightness","saturation","contrast","hue"])e.baseColor[n]!=null&&!K(e.baseColor[n])&&r(`${t}.baseColor.${n}`,`${n} must be a finite number`)}for(let n of["metallic","roughness"])e[n]!=null&&!K(e[n])&&r(`${t}.${n}`,`${n} must be a finite number`);e.normal!=null&&(E(e.normal)?(Te(e.normal.texture,`${t}.normal.texture`,r),e.normal.strength!=null&&!K(e.normal.strength)&&r(`${t}.normal.strength`,"normal strength must be a finite number")):r(`${t}.normal`,"normal must be an object")),e.metallicRoughness!=null&&(E(e.metallicRoughness)?Te(e.metallicRoughness.texture,`${t}.metallicRoughness.texture`,r):r(`${t}.metallicRoughness`,"metallicRoughness must be an object")),e.occlusion!=null&&(E(e.occlusion)?(Te(e.occlusion.texture,`${t}.occlusion.texture`,r),e.occlusion.strength!=null&&!K(e.occlusion.strength)&&r(`${t}.occlusion.strength`,"occlusion strength must be a finite number")):r(`${t}.occlusion`,"occlusion must be an object")),e.emission!=null&&(E(e.emission)?($t(e.emission.color,`${t}.emission.color`,r),e.emission.intensity!=null&&!K(e.emission.intensity)&&r(`${t}.emission.intensity`,"emission intensity must be a finite number"),Te(e.emission.texture,`${t}.emission.texture`,r),Te(e.emission.maskTexture,`${t}.emission.maskTexture`,r)):r(`${t}.emission`,"emission must be an object")),e.alpha!=null&&(E(e.alpha)?(e.alpha.mode!=null&&e.alpha.mode!=="opaque"&&e.alpha.mode!=="mask"&&e.alpha.mode!=="blend"&&r(`${t}.alpha.mode`,"alpha mode must be opaque, mask, or blend"),e.alpha.opacity!=null&&!K(e.alpha.opacity)&&r(`${t}.alpha.opacity`,"alpha opacity must be a finite number"),e.alpha.cutoff!=null&&!K(e.alpha.cutoff)&&r(`${t}.alpha.cutoff`,"alpha cutoff must be a finite number"),Te(e.alpha.texture,`${t}.alpha.texture`,r)):r(`${t}.alpha`,"alpha must be an object"))}function Te(e,t,r){if(e!=null){if(!E(e)){r(t,"texture ref must be an object");return}e.url!=null&&!P(e.url)&&r(`${t}.url`,"texture url must be non-empty when present"),e.textureAssetId!=null&&!P(e.textureAssetId)&&r(`${t}.textureAssetId`,"textureAssetId must be non-empty when present")}}function Va(e,t,r){if(e!=null){if(!E(e)){r(t,"material asset system must be an object");return}e.readonly!=null&&typeof e.readonly!="boolean"&&r(`${t}.readonly`,"readonly must be boolean"),e.preset!=null&&!va.has(e.preset)&&r(`${t}.preset`,"preset must be default-pbr or default-standard")}}function Ka(e,t,r){if(e!=null){if(!E(e)){r(t,"material asset origin must be an object");return}e.type!=="imported"&&e.type!=="created"&&e.type!=="duplicated"&&e.type!=="preset"&&r(`${t}.type`,"origin type must be imported, created, duplicated, or preset"),e.sourceAssetGuid!=null&&!P(e.sourceAssetGuid)&&r(`${t}.sourceAssetGuid`,"sourceAssetGuid must be non-empty when present"),e.sourceAssetId!=null&&!P(e.sourceAssetId)&&r(`${t}.sourceAssetId`,"sourceAssetId must be non-empty when present"),e.sourceSlotId!=null&&!P(e.sourceSlotId)&&r(`${t}.sourceSlotId`,"sourceSlotId must be non-empty when present"),e.sourceMaterialIndex!=null&&!Number.isInteger(e.sourceMaterialIndex)&&r(`${t}.sourceMaterialIndex`,"sourceMaterialIndex must be an integer when present"),e.sourceMaterialName!=null&&!P(e.sourceMaterialName)&&r(`${t}.sourceMaterialName`,"sourceMaterialName must be non-empty when present"),e.sourceMaterialAssetId!=null&&!P(e.sourceMaterialAssetId)&&r(`${t}.sourceMaterialAssetId`,"sourceMaterialAssetId must be non-empty when present")}}function Ha(e,t,r){let n=E(e.system)?e.system.preset:void 0;n==="default-pbr"&&e.shaderId!=="fps.builtin.pbr"&&r(`${t}.shaderId`,"default-pbr material assets must use shaderId fps.builtin.pbr"),n==="default-standard"&&e.shaderId!=="fps.builtin.standard"&&r(`${t}.shaderId`,"default-standard material assets must use shaderId fps.builtin.standard")}function Wa(e,t,r,n,i){if(e===t){nt.has("root")||i(n,`parentId must point to scene node: ${e}`);return}if(nt.has("sceneNode")&&r.has(e))return;let o=nt.has("root")&&nt.has("sceneNode")?"root or scene node":nt.has("sceneNode")?"scene node":"root";i(n,`parentId must point to ${o}: ${e}`)}function qa(e,t,r,n,i){if(!P(t))return;let o=new Set([e]),a=P(r.get(e)?.parentId)?r.get(e)?.parentId:t;for(;P(a)&&a!==t;){if(o.has(a)){i(n,`parentId creates a node cycle involving ${e}`);return}o.add(a);let s=r.get(a);if(!s)return;a=P(s.parentId)?s.parentId:t}}function Ja(e,t,r){for(let n of Object.keys(e))La.has(n)||r(`${t}.${n}`,`runtime schema v3 material slot field is not allowed: ${n}`);if(e.label!=null&&!P(e.label)&&r(`${t}.label`,"label must be a non-empty string when present"),!Array.isArray(e.sourceSurfaces)||e.sourceSurfaces.length===0){r(`${t}.sourceSurfaces`,"sourceSurfaces must be a non-empty array");return}for(let n=0;n<e.sourceSurfaces.length;n+=1){let i=`${t}.sourceSurfaces[${n}]`,o=e.sourceSurfaces[n];if(!E(o)){r(i,"source surface must be an object");continue}for(let a of Object.keys(o))Fa.has(a)||r(`${i}.${a}`,`runtime schema v3 material slot source surface field is not allowed: ${a}`);P(o.ownerNodePath)||r(`${i}.ownerNodePath`,"ownerNodePath must be a non-empty string");for(let a of["meshIndex","primitiveIndex"])(!Number.isInteger(o[a])||o[a]<0)&&r(`${i}.${a}`,`${a} must be a non-negative integer`);for(let a of["nodeIndex","sourceMaterialIndex"])o[a]!=null&&(!Number.isInteger(o[a])||o[a]<0)&&r(`${i}.${a}`,`${a} must be a non-negative integer when present`);o.nodeIndexPath!=null&&(!Array.isArray(o.nodeIndexPath)||o.nodeIndexPath.some(a=>!Number.isInteger(a)||a<0))&&r(`${i}.nodeIndexPath`,"nodeIndexPath must contain non-negative integers"),P(o.sourceMeshName)||r(`${i}.sourceMeshName`,"sourceMeshName is required")}}function Ya(e,t,r){if(e!=null){if(!E(e)){r(t,"defaults must be an object");return}if(kn(e.transform,`${t}.transform`,r),Pn(e.outline,`${t}.outline`,r),e.childOutlines!=null)if(!E(e.childOutlines))r(`${t}.childOutlines`,"childOutlines must be an object");else for(let[n,i]of Object.entries(e.childOutlines))Pn(i,`${t}.childOutlines.${n}`,r)}}function Xa(e,t,r){if(e!=null){if(!E(e)){r(t,"generatedFrom must be an object when present");return}Mn(e,t,r),P(e.compilerId)||r(`${t}.compilerId`,"compilerId must be a non-empty string"),P(e.compilerVersion)||r(`${t}.compilerVersion`,"compilerVersion must be a non-empty string"),P(e.compiledAt)||r(`${t}.compiledAt`,"compiledAt must be a non-empty string")}}function Za(e,t,r){if(e!=null){if(!E(e)){r(t,"source must be an object when present");return}Mn(e,t,r),e.objectGuid!=null&&!P(e.objectGuid)&&r(`${t}.objectGuid`,"objectGuid must be a non-empty string when present"),e.objectId!=null&&!P(e.objectId)&&r(`${t}.objectId`,"objectId must be a non-empty string when present"),e.component!=null&&!P(e.component)&&r(`${t}.component`,"component must be a non-empty string when present"),e.propertyPath!=null&&!P(e.propertyPath)&&r(`${t}.propertyPath`,"propertyPath must be a non-empty string when present")}}function Mn(e,t,r){P(e.sourceId)||r(`${t}.sourceId`,"sourceId must be a non-empty string"),P(e.sourceType)||r(`${t}.sourceType`,"sourceType must be a non-empty string"),e.revision!=null&&(typeof e.revision!="number"||!Number.isFinite(e.revision))&&r(`${t}.revision`,"revision must be a finite number when present")}function Sr(e,t){let r=wn(e,t);if(r.ok)return;let n=new Error(`scene_json_schema_failed:
3
+ ${JSON.stringify(r.errors,null,2)}`);throw Object.assign(n,{code:"scene_json_schema_failed",diagnostics:r.errors}),n}function E(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}function P(e){return typeof e=="string"&&e.trim().length>0}function kn(e,t,r){if(e!=null){if(!E(e)){r(t,"transform must be an object");return}se(e.position,`${t}.position`,r),se(e.rotation,`${t}.rotation`,r),se(e.rotationDeg,`${t}.rotationDeg`,r),typeof e.scale=="number"?Number.isFinite(e.scale)||r(`${t}.scale`,"scale number must be finite"):se(e.scale,`${t}.scale`,r)}}function Qa(e,t,r){if(!E(e)){r(t,"marker must be an object");return}he(e,["schemaVersion","label","type","kind","tags","note","color","target","semanticFrame","geometry","metadata"],t,r),e.schemaVersion!==1&&r(`${t}.schemaVersion`,"marker.schemaVersion must be 1"),P(e.label)||r(`${t}.label`,"marker.label must be a non-empty string"),P(e.type)||r(`${t}.type`,"marker.type must be a non-empty string"),e.kind!=null&&!P(e.kind)&&r(`${t}.kind`,"marker.kind must be a non-empty string when present"),e.tags!=null&&(Array.isArray(e.tags)?e.tags.forEach((n,i)=>{typeof n!="string"&&r(`${t}.tags[${i}]`,"marker tag must be a string")}):r(`${t}.tags`,"marker.tags must be an array when present")),e.note!=null&&typeof e.note!="string"&&r(`${t}.note`,"marker.note must be a string when present"),e.color!=null&&ns(e.color,`${t}.color`,r),e.target!=null&&hr(e.target,`${t}.target`,r),e.semanticFrame!=null&&ts(e.semanticFrame,`${t}.semanticFrame`,r),rs(e.geometry,`${t}.geometry`,r),e.metadata!=null&&!E(e.metadata)&&r(`${t}.metadata`,"marker.metadata must be an object when present")}function es(e,t,r,n,i,o){if(!E(e))return;let a=[];e.target!=null&&a.push({value:e.target,path:`${i}.target`}),E(e.geometry)&&e.geometry.target!=null&&a.push({value:e.geometry.target,path:`${i}.geometry.target`});for(let s of a)E(s.value)&&(s.value.kind!=="scene-object"&&s.value.kind!=="marker"&&o(`${s.path}.kind`,"runtime marker target kind must be scene-object or marker"),P(s.value.id)&&(s.value.id===t?o(`${s.path}.id`,"runtime marker target must not reference its marker node"):r.has(s.value.id)?s.value.kind==="marker"&&!n.has(s.value.id)?o(`${s.path}.id`,`runtime marker target must reference a marker node: ${s.value.id}`):s.value.kind==="scene-object"&&n.has(s.value.id)&&o(`${s.path}.id`,`runtime scene-object target must not reference a marker node: ${s.value.id}`):o(`${s.path}.id`,`runtime marker target must reference scene.nodes: ${s.value.id}`)))}function hr(e,t,r){if(!E(e)){r(t,"marker target must be an object");return}he(e,["kind","id","label","path","metadata"],t,r),P(e.kind)||r(`${t}.kind`,"marker target kind must be a non-empty string"),P(e.id)||r(`${t}.id`,"marker target id must be a non-empty string");for(let n of["label","path"])e[n]!=null&&typeof e[n]!="string"&&r(`${t}.${n}`,`marker target ${n} must be a string when present`);e.metadata!=null&&!E(e.metadata)&&r(`${t}.metadata`,"marker target metadata must be an object when present")}function ts(e,t,r){if(!E(e)){r(t,"marker semanticFrame must be an object");return}he(e,["origin","forward","right","up","label","description"],t,r),E(e.origin)?se(e.origin,`${t}.origin`,r):r(`${t}.origin`,"marker semanticFrame.origin must be a vector object");for(let n of["forward","right","up"])e[n]!=null&&se(e[n],`${t}.${n}`,r);for(let n of["label","description"])e[n]!=null&&typeof e[n]!="string"&&r(`${t}.${n}`,`marker semanticFrame ${n} must be a string when present`)}function rs(e,t,r){if(!E(e)){r(t,"marker.geometry must be an object");return}if(e.kind==="box"){he(e,["kind"],t,r);return}if(e.kind==="point"){he(e,["kind","coordinateSpace","position","offset","target"],t,r),e.coordinateSpace!=null&&e.coordinateSpace!=="world"&&e.coordinateSpace!=="local"&&r(`${t}.coordinateSpace`,"point marker coordinateSpace must be world or local"),e.position!=null&&se(e.position,`${t}.position`,r),e.offset!=null&&se(e.offset,`${t}.offset`,r),e.target!=null&&hr(e.target,`${t}.target`,r);return}if(e.kind==="object-bounds"){he(e,["kind","target"],t,r),hr(e.target,`${t}.target`,r);return}if(e.kind==="polyhedron"){he(e,["kind","coordinateSpace","vertices","faces"],t,r),e.coordinateSpace!=null&&e.coordinateSpace!=="world"&&r(`${t}.coordinateSpace`,"polyhedron marker coordinateSpace must be world"),Array.isArray(e.vertices)?e.vertices.forEach((n,i)=>{let o=`${t}.vertices[${i}]`;E(n)?se(n,o,r):r(o,"polyhedron marker vertex must be a vector object")}):r(`${t}.vertices`,"polyhedron marker vertices must be an array"),e.faces!=null&&(Array.isArray(e.faces)?e.faces.forEach((n,i)=>{Array.isArray(n)?n.forEach((o,a)=>{(!Number.isInteger(o)||o<0)&&r(`${t}.faces[${i}][${a}]`,"polyhedron marker index must be a non-negative integer")}):r(`${t}.faces[${i}]`,"polyhedron marker face must be an array")}):r(`${t}.faces`,"polyhedron marker faces must be an array when present"));return}r(`${t}.kind`,"marker.geometry.kind must be box, point, object-bounds, or polyhedron")}function ns(e,t,r){if(!E(e)){r(t,"marker color must be an object");return}he(e,["r","g","b"],t,r);for(let n of["r","g","b"])Cn(e[n])||r(`${t}.${n}`,"marker color component must be between 0 and 1")}function he(e,t,r,n){let i=new Set(t);for(let o of Object.keys(e))i.has(o)||n(`${r}.${o}`,`field is not allowed: ${o}`)}function se(e,t,r){if(e!=null){if(!E(e)){r(t,"value must be a vector object");return}for(let n of["x","y","z"])(typeof e[n]!="number"||!Number.isFinite(e[n]))&&r(`${t}.${n}`,"vector component must be a finite number")}}function is(e,t,r){if(e!=null){if(!E(e)){r(t,"value must be a vector object");return}for(let n of["x","y"])(typeof e[n]!="number"||!Number.isFinite(e[n]))&&r(`${t}.${n}`,"vector component must be a finite number")}}function K(e){return typeof e=="number"&&Number.isFinite(e)}function De(e){return K(e)&&e>0}function Cn(e){return K(e)&&e>=0&&e<=1}function $t(e,t,r){if(e!=null){if(!E(e)){r(t,"color must be an object");return}for(let n of["r","g","b"])(typeof e[n]!="number"||!Number.isFinite(e[n]))&&r(`${t}.${n}`,"color component must be a finite number")}}function os(e,t,r){if(e!=null){if(!E(e)){r(t,"camera must be an object");return}e.projection!=null&&e.projection!=="orthographic"&&e.projection!=="perspective"&&r(`${t}.projection`,"camera projection must be orthographic or perspective");for(let n of["alpha","beta"])e[n]!=null&&!K(e[n])&&r(`${t}.${n}`,"camera property must be a finite number when present");for(let n of["radius","orthoSize"])e[n]!=null&&!De(e[n])&&r(`${t}.${n}`,"camera property must be a positive finite number when present");e.fov!=null&&!De(e.fov)&&r(`${t}.fov`,"camera fov must be a positive finite number"),se(e.targetOffset,`${t}.targetOffset`,r),is(e.targetScreenOffset,`${t}.targetScreenOffset`,r);for(let n of["minZ","maxZ","lowerRadiusLimit","upperRadiusLimit"])e[n]!=null&&!De(e[n])&&r(`${t}.${n}`,"camera property must be a positive finite number");for(let n of["lowerBetaLimit","upperBetaLimit"])e[n]!=null&&!K(e[n])&&r(`${t}.${n}`,"camera property must be a finite number");e.inertia!=null&&!Cn(e.inertia)&&r(`${t}.inertia`,"camera inertia must be between 0 and 1"),De(e.minZ)&&De(e.maxZ)&&e.maxZ<=e.minZ&&r(`${t}.maxZ`,"camera maxZ must be greater than minZ"),K(e.lowerBetaLimit)&&K(e.upperBetaLimit)&&e.upperBetaLimit<e.lowerBetaLimit&&r(`${t}.upperBetaLimit`,"camera upperBetaLimit must be greater than or equal to lowerBetaLimit"),De(e.lowerRadiusLimit)&&De(e.upperRadiusLimit)&&e.upperRadiusLimit<e.lowerRadiusLimit&&r(`${t}.upperRadiusLimit`,"camera upperRadiusLimit must be greater than or equal to lowerRadiusLimit")}}function as(e){let t=e.meta?.generatedFrom;return E(t)&&t.compilerId===Da&&t.compilerVersion===Ma}function ss(e,t,r,n=!1){if(e==null)return;let i=n&&E(e)&&!Object.prototype.hasOwnProperty.call(e,"schemaVersion")?ds(e,t):e;try{ve(i,t)}catch(o){let a=o;r(typeof a.path=="string"?a.path:t,typeof a.reason=="string"?a.reason:typeof a.message=="string"?a.message:"light does not satisfy the Engine Runtime Light contract")}}function ds(e,t){let r={...e,schemaVersion:1};if(e.type!=="directional"||!E(e.direction))return r;let{x:n,y:i,z:o}=e.direction;if(![n,i,o].every(s=>typeof s=="number"&&Number.isFinite(s)))return r;let a=Math.hypot(n,i,o);return a<=0||Math.abs(a-1)>ka?r:{...r,direction:Je(e.direction,`${t}.direction`)}}function Pn(e,t,r){if(e!=null){if(!E(e)){r(t,"outline must be an object");return}e.renderOutline!=null&&typeof e.renderOutline!="boolean"&&r(`${t}.renderOutline`,"renderOutline must be boolean"),e.outlineWidth!=null&&(typeof e.outlineWidth!="number"||!Number.isFinite(e.outlineWidth))&&r(`${t}.outlineWidth`,"outlineWidth must be a finite number"),$t(e.outlineColor,`${t}.outlineColor`,r)}}function ls(e,t,r){if(e==null){r(t,"groundDecal is required when transformType is groundDecal");return}if(!E(e)){r(t,"groundDecal must be an object");return}cs(e,t,r)}function cs(e,t,r){if(P(e.uiKind)||r(`${t}.uiKind`,"groundDecal UI kind must be non-empty"),!E(e.size))r(`${t}.size`,"groundDecal.size must be an object");else for(let n of["width","depth"])(typeof e.size[n]!="number"||!Number.isFinite(e.size[n])||e.size[n]<=0)&&r(`${t}.size.${n}`,"groundDecal size must be a positive finite number");if(e.aspectSourceLayerId!=null&&!P(e.aspectSourceLayerId)&&r(`${t}.aspectSourceLayerId`,"aspectSourceLayerId must be non-empty when present"),e.lockAspectToBorder!=null&&typeof e.lockAspectToBorder!="boolean"&&r(`${t}.lockAspectToBorder`,"lockAspectToBorder must be boolean when present"),e.editorPreviewActive!=null&&r(`${t}.editorPreviewActive`,"editorPreviewActive is editor-only and must not appear in runtime scene data"),us(e.mask,`${t}.mask`,r),fs(e.rendering,`${t}.rendering`,r),!Array.isArray(e.layers)){r(`${t}.layers`,"groundDecal UI layers must be an array");return}e.layers.forEach((n,i)=>ms(n,`${t}.layers[${i}]`,r)),gs(e.layers,`${t}.layers`,r)}function us(e,t,r){if(e!=null){if(!E(e)){r(t,"groundDecal UI mask must be an object");return}e.enabled!=null&&typeof e.enabled!="boolean"&&r(`${t}.enabled`,"mask.enabled must be boolean"),e.source!=null&&e.source!=="roundedRect"&&e.source!=="borderAlpha"&&e.source!=="texture"&&r(`${t}.source`,"mask.source must be roundedRect, borderAlpha, or texture"),e.textureId!=null&&!P(e.textureId)&&r(`${t}.textureId`,"mask.textureId must be non-empty when present");for(let n of["cornerRadius","padding"])e[n]!=null&&(typeof e[n]!="number"||!Number.isFinite(e[n])||e[n]<0)&&r(`${t}.${n}`,`${n} must be a non-negative finite number`)}}function fs(e,t,r){if(e!=null){if(!E(e)){r(t,"groundDecal UI rendering must be an object");return}for(let n of["textureWidth","textureHeight"])e[n]!=null&&(!Number.isInteger(e[n])||e[n]<=0)&&r(`${t}.${n}`,`${n} must be a positive integer`);for(let n of["alphaIndex","diffuseTextureLevel","emissiveTextureLevel"])e[n]!=null&&(typeof e[n]!="number"||!Number.isFinite(e[n]))&&r(`${t}.${n}`,`${n} must be a finite number`)}}function ms(e,t,r){if(!E(e)){r(t,"groundDecal UI layer must be an object");return}P(e.id)||r(`${t}.id`,"layer.id must be non-empty"),P(e.role)||r(`${t}.role`,"layer.role must be non-empty"),e.editorPreviewPercent!=null&&r(`${t}.editorPreviewPercent`,"editorPreviewPercent is editor-only and must not appear in runtime scene data"),e.enabled!=null&&typeof e.enabled!="boolean"&&r(`${t}.enabled`,"layer.enabled must be boolean"),(typeof e.zOrder!="number"||!Number.isFinite(e.zOrder))&&r(`${t}.zOrder`,"layer.zOrder must be a finite number"),e.opacity!=null&&(typeof e.opacity!="number"||!Number.isFinite(e.opacity))&&r(`${t}.opacity`,"layer.opacity must be finite"),e.rotationDeg!=null&&(typeof e.rotationDeg!="number"||!Number.isFinite(e.rotationDeg)||e.rotationDeg<=-180||e.rotationDeg>180)&&r(`${t}.rotationDeg`,"layer.rotationDeg must be in the range (-180, 180]"),ps(e.rect,`${t}.rect`,r),e.kind==="texture"?(e.textureId!=null&&!P(e.textureId)&&r(`${t}.textureId`,"texture layer textureId must be non-empty when present"),e.imageFit!=null&&e.imageFit!=="contain"&&e.imageFit!=="stretch"&&r(`${t}.imageFit`,"texture layer imageFit must be contain or stretch"),je(e.tint,`${t}.tint`,r)):e.kind==="textureProgress"?(e.textureId!=null&&!P(e.textureId)&&r(`${t}.textureId`,"texture progress layer textureId must be non-empty when present"),e.imageFit!=null&&e.imageFit!=="contain"&&e.imageFit!=="stretch"&&r(`${t}.imageFit`,"texture progress layer imageFit must be contain or stretch"),(typeof e.value!="number"||!Number.isFinite(e.value)||e.value<0||e.value>1)&&r(`${t}.value`,"texture progress value must be between 0 and 1"),e.direction!=null&&!["leftToRight","rightToLeft","bottomToTop","topToBottom"].includes(String(e.direction))&&r(`${t}.direction`,"texture progress direction is invalid"),je(e.tint,`${t}.tint`,r)):e.kind==="color"?je(e.color,`${t}.color`,r):e.kind==="progress"?((typeof e.value!="number"||!Number.isFinite(e.value)||e.value<0||e.value>1)&&r(`${t}.value`,"progress value must be between 0 and 1"),e.direction!=null&&!["leftToRight","rightToLeft","bottomToTop","topToBottom"].includes(String(e.direction))&&r(`${t}.direction`,"progress direction is invalid"),je(e.color,`${t}.color`,r)):e.kind==="text"?bs(e.text,`${t}.text`,r):r(`${t}.kind`,"layer.kind must be texture, textureProgress, color, progress, or text")}function gs(e,t,r){let n=new Map;e.forEach((i,o)=>{if(!E(i)||!P(i.id))return;let a=n.get(i.id);if(a!=null){r(`${t}[${o}].id`,`layer.id must be unique; duplicate of layers[${a}]`);return}n.set(i.id,o)})}function ps(e,t,r){if(!E(e)){r(t,"layer.rect must be an object");return}for(let n of["x","z","width","depth"])(typeof e[n]!="number"||!Number.isFinite(e[n]))&&r(`${t}.${n}`,`rect.${n} must be a finite number`);for(let n of["width","depth"])typeof e[n]=="number"&&e[n]<=0&&r(`${t}.${n}`,`rect.${n} must be positive`)}function bs(e,t,r){if(!E(e)){r(t,"text layer text must be an object");return}typeof e.value!="string"&&r(`${t}.value`,"text.value must be a string"),e.fontFamily!=null&&typeof e.fontFamily!="string"&&r(`${t}.fontFamily`,"fontFamily must be a string"),e.fontSize!=null&&(typeof e.fontSize!="number"||!Number.isFinite(e.fontSize)||e.fontSize<=0)&&r(`${t}.fontSize`,"fontSize must be a positive finite number"),e.fontWeight!=null&&typeof e.fontWeight!="string"&&r(`${t}.fontWeight`,"fontWeight must be a string"),je(e.color,`${t}.color`,r),je(e.strokeColor,`${t}.strokeColor`,r),e.strokeWidth!=null&&(typeof e.strokeWidth!="number"||!Number.isFinite(e.strokeWidth)||e.strokeWidth<0)&&r(`${t}.strokeWidth`,"strokeWidth must be a non-negative finite number")}function je(e,t,r){if(e!=null){if(!E(e)){r(t,"color must be an object");return}for(let n of["r","g","b"])(typeof e[n]!="number"||!Number.isFinite(e[n]))&&r(`${t}.${n}`,`color.${n} must be finite`);e.a!=null&&(typeof e.a!="number"||!Number.isFinite(e.a))&&r(`${t}.a`,"color.a must be finite")}}function ys(e,t,r){if(e!=null){if(!E(e)){r(t,"rendering must be an object");return}e.renderingGroupId!=null&&e.renderingGroupId!==0&&e.renderingGroupId!==1&&e.renderingGroupId!==2&&e.renderingGroupId!==3&&r(`${t}.renderingGroupId`,"renderingGroupId must be 0, 1, 2, or 3"),e.alphaIndex!=null&&(typeof e.alphaIndex!="number"||!Number.isFinite(e.alphaIndex))&&r(`${t}.alphaIndex`,"alphaIndex must be a finite number")}}function In(e){return typeof e=="number"&&Number.isFinite(e)&&e>0}function Rn(e,t,r){for(let[n,i]of Object.entries(e)){let o=`${t}.${n}`;["albedoColor","diffuseColor","emissiveColor","outlineColor"].includes(n)&&$t(i,o,r),["metallic","roughness","contrast","brightness","saturation","hue","colorDensity","alpha","alphaCutOff","transparencyMode"].includes(n)&&(typeof i!="number"||!Number.isFinite(i))&&r(o,`${n} must be a finite number`),n==="backFaceCulling"&&typeof i!="boolean"&&r(o,"backFaceCulling must be boolean"),["albedoTexture","normalTexture","metallicTexture"].includes(n)&&(E(i)?i.url!=null&&!P(i.url)&&r(`${o}.url`,"texture url must be non-empty when present"):r(o,`${n} must be an object`)),["pbr","standard"].includes(n)&&(E(i)?Rn(i,o,r):r(o,`${n} must be an object`))}}function An(e,t,r){let n=JSON.stringify(e),i=_a.filter(o=>n.includes(o));i.length>0&&r(t,`contains runtime-only asset fields: ${i.join(", ")}`)}function On(e,t,r){let n=Nn(e)??512,i=Nn(t)??512;if(!Number.isFinite(r)||r<=0)return{width:n,height:i};let o=n,a=Math.max(1,Math.round(o/r));return a>i&&(a=i,o=Math.max(1,Math.round(a*r))),{width:o,height:a}}function Er(e){let t=e.rendering?.textureWidth??512,r=e.rendering?.textureHeight??512,n=e.size.width>0&&e.size.depth>0?e.size.width/e.size.depth:t/r;return On(t,r,n)}function Nn(e){return typeof e!="number"||!Number.isFinite(e)||e<=0?null:Math.max(64,Math.min(2048,Math.round(e)))}var Q=(e,t)=>({kind:"number",...e!=null?{min:e}:{},...t!=null?{max:t}:{}}),Me={kind:"texture"},$n={kind:"color"},hs={kind:"enum",values:["lit","unlit"]},Ss={kind:"enum",values:["opaque","mask","blend"]},_n={lightingModel:hs,baseColor:{kind:"object",properties:{color:$n,texture:Me,brightness:Q(0),saturation:Q(0),contrast:Q(0),hue:Q(-180,180)}},normal:{kind:"object",properties:{texture:Me,strength:Q(0)}},emission:{kind:"object",properties:{color:$n,intensity:Q(0),texture:Me,maskTexture:Me}},alpha:{kind:"object",properties:{mode:Ss,opacity:Q(0,1),cutoff:Q(0,1),texture:Me}}},Es={kind:"object",properties:{..._n,metallic:Q(0,1),roughness:Q(0,1),metallicRoughness:{kind:"object",properties:{texture:Me}},occlusion:{kind:"object",properties:{texture:Me,strength:Q(0)}}}},xs={kind:"object",properties:_n},Ps={lightingModel:"lit",baseColor:{color:{r:1,g:1,b:1},brightness:1,saturation:1,contrast:1,hue:0},metallic:0,roughness:1,emission:{color:{r:0,g:0,b:0},intensity:0}},Is={lightingModel:"lit",baseColor:{color:{r:1,g:1,b:1},brightness:1,saturation:1,contrast:1,hue:0},emission:{color:{r:0,g:0,b:0},intensity:0}},vn=[{id:"surface",title:"Surface",order:40},{id:"geometry",title:"Geometry",order:50},{id:"emission",title:"Emission",order:60},{id:"alpha",title:"Alpha",order:70}],ke={path:"properties.lightingModel",operator:"equals",value:"lit",inactiveReasonKey:"litMaterial"},jn=[Fe("properties.lightingModel","surface",1,"enum","assetLightingModel","lightingModel","lit",{options:[{value:"lit",labelKey:"assetLightingModelLit"},{value:"unlit",labelKey:"assetLightingModelUnlit"}],binding:"lightingModel",updateClass:"define"}),Fe("properties.baseColor.color","surface",2,"color","assetBaseColor","baseColor",{r:1,g:1,b:1},{binding:"baseColor.color"}),Ue("properties.baseColor.texture.textureAssetId","properties.baseColor.texture","surface",3,"assetBaseTexture","baseTexture","baseColor.texture"),ee("properties.baseColor.brightness","surface",4,"assetBrightness","brightness",1,{softMin:0,softMax:4,step:.05,conditions:[Le("properties.baseColor.texture.textureAssetId","baseTexture")]}),ee("properties.baseColor.saturation","surface",5,"assetSaturation","saturation",1,{softMin:0,softMax:2,step:.05,conditions:[Le("properties.baseColor.texture.textureAssetId","baseTexture")]}),ee("properties.baseColor.contrast","surface",6,"assetContrast","contrast",1,{softMin:0,softMax:2,step:.05,conditions:[Le("properties.baseColor.texture.textureAssetId","baseTexture")]}),ee("properties.baseColor.hue","surface",7,"assetHue","hue",0,{step:1,conditions:[Le("properties.baseColor.texture.textureAssetId","baseTexture")]}),Ue("properties.normal.texture.textureAssetId","properties.normal.texture","geometry",10,"assetNormalTexture","normalTexture","normal.texture",[ke]),ee("properties.normal.strength","geometry",11,"assetNormalStrength","normalStrength",1,{softMin:0,softMax:4,step:.05,conditions:[ke,Le("properties.normal.texture.textureAssetId","normalTexture")]}),Fe("properties.emission.color","emission",50,"color","assetEmissionColor","emissionColor",{r:0,g:0,b:0},{binding:"emission.color"}),ee("properties.emission.intensity","emission",51,"assetEmissionIntensity","emissionIntensity",0,{softMin:0,softMax:8,step:.05}),Ue("properties.emission.texture.textureAssetId","properties.emission.texture","emission",52,"assetEmissionTexture","emissionTexture","emission.texture"),Fe("properties.alpha.mode","alpha",60,"enum","assetAlphaMode","alphaMode","opaque",{options:[{value:"opaque",labelKey:"assetAlphaModeOpaque"},{value:"mask",labelKey:"assetAlphaModeMask"},{value:"blend",labelKey:"assetAlphaModeBlend"}],binding:"alpha.mode",updateClass:"pipeline"}),ee("properties.alpha.opacity","alpha",61,"assetAlphaOpacity","alphaOpacity",1,{step:.05,conditions:[{path:"properties.alpha.mode",operator:"equals",value:"blend",inactiveReasonKey:"alphaBlend"}]}),ee("properties.alpha.cutoff","alpha",62,"assetAlphaCutoff","alphaCutoff",.5,{step:.01,conditions:[{path:"properties.alpha.mode",operator:"equals",value:"mask",inactiveReasonKey:"alphaMask"}]}),Ue("properties.alpha.texture.textureAssetId","properties.alpha.texture","alpha",63,"assetAlphaTexture","alphaTexture","alpha.texture",[{path:"properties.alpha.mode",operator:"not-equals",value:"opaque",inactiveReasonKey:"alphaTransparency"}])],As=[...jn,ee("properties.metallic","geometry",20,"assetMetallic","metallic",0,{step:.05,conditions:[ke]}),ee("properties.roughness","geometry",21,"assetRoughness","roughness",1,{step:.05,conditions:[ke]}),Ue("properties.metallicRoughness.texture.textureAssetId","properties.metallicRoughness.texture","geometry",22,"assetMetallicRoughnessTexture","metallicRoughnessTexture","metallicRoughness.texture",[ke]),Ue("properties.occlusion.texture.textureAssetId","properties.occlusion.texture","geometry",23,"assetOcclusionTexture","occlusionTexture","occlusion.texture",[ke]),ee("properties.occlusion.strength","geometry",24,"assetOcclusionStrength","occlusionStrength",1,{softMin:0,softMax:4,step:.05,conditions:[ke,Le("properties.occlusion.texture.textureAssetId","occlusionTexture")]})],ws=[{shaderId:"fps.builtin.pbr",version:1,runtimeKind:"pbr",displayName:"PBR",propertiesSchema:Es,defaultProperties:Ps,inspector:{sections:vn,fields:As}},{shaderId:"fps.builtin.standard",version:1,runtimeKind:"standard",displayName:"Standard",propertiesSchema:xs,defaultProperties:Is,inspector:{sections:vn,fields:jn}}],Ln=Ts(ws);function Ts(e){let t=new Map;for(let n of e){Ds(n,t);let i=Ms(n);t.set(n.shaderId,Kn(i))}let r=Object.freeze([...t.values()]);return Object.freeze({get(n){return typeof n=="string"?t.get(n)??null:null},list(){return r}})}function Fn(e,t=Ln){return t.get(e)}function Un(e){return Fn(e)}function zn(e,t,r="properties",n=Ln){let i=Fn(e,n);if(!i)return[{path:"shaderId",message:`Unknown material shader: ${String(e)}`}];let o=[];return Pr(i.propertiesSchema,t,r,o),o}function Fe(e,t,r,n,i,o,a,s){return{path:e,sectionId:t,order:r,control:n,labelKey:i,tooltipKey:o,defaultValue:a,updateClass:"uniform",...s}}function ee(e,t,r,n,i,o,a={}){return Fe(e,t,r,"number",n,i,o,{binding:e.replace(/^properties\./,""),step:a.step??.05,displayPrecision:2,precision:2,...a})}function Ue(e,t,r,n,i,o,a,s){return Fe(e,r,n,"texture",i,o,"",{schemaPath:t,binding:a,updateClass:"texture",conditions:s})}function Le(e,t){return{path:e,operator:"truthy",inactiveReasonKey:t}}function Ds(e,t){if(!e.shaderId.trim())throw new Error("Material Shader Definition shaderId must not be empty.");if(!Number.isInteger(e.version)||e.version<=0)throw new Error(`Material Shader Definition ${e.shaderId} must use a positive integer version.`);if(t.has(e.shaderId))throw new Error(`Duplicate Material Shader Definition: ${e.shaderId}`);if(e.sourceFile!=null&&!Cs(e.sourceFile))throw new Error(`Material Shader Definition ${e.shaderId} sourceFile must be a safe project-relative path.`);Bn(e.shaderId,e.propertiesSchema,"properties");let r=[];if(Pr(e.propertiesSchema,e.defaultProperties,"properties",r),r.length>0){let o=r[0];throw new Error(`Material Shader Definition ${e.shaderId} default ${o.path} ${o.message}.`)}let n=new Set;for(let o of e.inspector.sections){if(!o.id.trim()||n.has(o.id))throw new Error(`Material Shader Definition ${e.shaderId} contains an invalid or duplicate section: ${o.id}`);n.add(o.id)}let i=new Set;for(let o of e.inspector.fields){if(!o.path.startsWith("properties.")||i.has(o.path))throw new Error(`Material Shader Definition ${e.shaderId} contains an invalid or duplicate field: ${o.path}`);if(!n.has(o.sectionId))throw new Error(`Material Shader Definition ${e.shaderId} field ${o.path} references an unknown section.`);ks(e,o),i.add(o.path)}}function Ms(e){let t=structuredClone(e);return{...t,inspector:{...t.inspector,fields:t.inspector.fields.map(r=>{if(r.control!=="number")return r;let n=Vn(t.propertiesSchema,r.schemaPath??r.path);return n?.kind!=="number"?r:{...r,...n.min!=null?{min:n.min}:{},...n.max!=null?{max:n.max}:{}}})}}}function ks(e,t){let r=[["min",t.min],["max",t.max],["softMin",t.softMin],["softMax",t.softMax]];for(let[i,o]of r)if(o!=null&&!Number.isFinite(o))throw new Error(`Material Shader Definition ${e.shaderId} field ${t.path} ${i} must be finite.`);if(t.control!=="number"){if(r.some(([,i])=>i!=null))throw new Error(`Material Shader Definition ${e.shaderId} field ${t.path} uses numeric ranges with a non-number control.`);return}let n=Vn(e.propertiesSchema,t.schemaPath??t.path);if(n?.kind!=="number")throw new Error(`Material Shader Definition ${e.shaderId} field ${t.path} must reference a number schema.`);for(let[i,o,a]of[["min",t.min,n.min],["max",t.max,n.max]])if(o!=null&&o!==a)throw new Error(`Material Shader Definition ${e.shaderId} field ${t.path} ${i} must match propertiesSchema.`);if(t.softMin!=null&&t.softMax!=null&&t.softMin>t.softMax)throw new Error(`Material Shader Definition ${e.shaderId} field ${t.path} softMin must not exceed softMax.`);if(n.min!=null&&t.softMin!=null&&t.softMin<n.min)throw new Error(`Material Shader Definition ${e.shaderId} field ${t.path} softMin must not be below the schema minimum.`);if(n.max!=null&&t.softMax!=null&&t.softMax>n.max)throw new Error(`Material Shader Definition ${e.shaderId} field ${t.path} softMax must not exceed the schema maximum.`)}function Bn(e,t,r){if(t.kind==="object"){for(let[n,i]of Object.entries(t.properties))Bn(e,i,`${r}.${n}`);return}if(t.kind==="number"){if(t.min!=null&&!Number.isFinite(t.min))throw new Error(`Material Shader Definition ${e} number field ${r} min must be finite.`);if(t.max!=null&&!Number.isFinite(t.max))throw new Error(`Material Shader Definition ${e} number field ${r} max must be finite.`);if(t.min!=null&&t.max!=null&&t.min>t.max)throw new Error(`Material Shader Definition ${e} number field ${r} min must not exceed max.`);return}if(t.kind==="color"&&t.channels!=null&&t.channels!==3&&t.channels!==4)throw new Error(`Material Shader Definition ${e} color field ${r} channels must be 3 or 4.`)}function Cs(e){let t=e.trim();return!t||t.startsWith("/")||t.includes("\\")||t.includes(":")?!1:!t.split("/").includes("..")}function Rs(e){let t=e.trim();return t.startsWith("properties.")?t:`properties.${t}`}function Vn(e,t){let r=Rs(t).replace(/^properties\./,"").split(".").filter(Boolean);if(r.length===0)return null;let n=e;for(let i of r){if(n.kind!=="object")return null;let o=n.properties[i];if(!o)return null;n=o}return n}function Pr(e,t,r,n){if(e.kind==="object"){if(!xr(t)){n.push({path:r,message:"must be an object"});return}for(let o of Object.keys(t))Object.prototype.hasOwnProperty.call(e.properties,o)||n.push({path:`${r}.${o}`,message:"is not supported by the selected shader"});for(let[o,a]of Object.entries(e.properties))t[o]!==void 0&&Pr(a,t[o],`${r}.${o}`,n);return}if(e.kind==="number"){if(typeof t!="number"||!Number.isFinite(t)){n.push({path:r,message:"must be a finite number"});return}e.min!=null&&t<e.min&&n.push({path:r,message:`must be greater than or equal to ${e.min}`}),e.max!=null&&t>e.max&&n.push({path:r,message:`must be less than or equal to ${e.max}`});return}if(e.kind==="boolean"){typeof t!="boolean"&&n.push({path:r,message:"must be a boolean"});return}if(e.kind==="string"){t!==null&&typeof t!="string"?n.push({path:r,message:"must be a string"}):t===null&&!e.nullable&&n.push({path:r,message:"must not be null"});return}if(e.kind==="enum"){(typeof t!="string"||!e.values.includes(t))&&n.push({path:r,message:`must be one of: ${e.values.join(", ")}`});return}if(e.kind==="color"){let o=e.channels===4?["r","g","b","a"]:["r","g","b"];Gn(t,r,o,n,e.channels===4?"an RGBA object":"an RGB object");return}if(e.kind==="vec2"||e.kind==="vec3"){Gn(t,r,e.kind==="vec2"?["x","y"]:["x","y","z"],n,`a ${e.kind} object`);return}if(t===null)return;if(!xr(t)){n.push({path:r,message:"must be a texture reference object or null"});return}Object.keys(t).some(o=>o!=="url"&&o!=="textureAssetId")&&n.push({path:r,message:"must contain only url or textureAssetId"});for(let o of["url","textureAssetId"]){let a=t[o];a!==void 0&&(typeof a!="string"||!a.trim())&&n.push({path:`${r}.${o}`,message:"must be a non-empty string"})}}function Gn(e,t,r,n,i){if(!xr(e)){n.push({path:t,message:`must be ${i}`});return}Object.keys(e).some(o=>!r.includes(o))&&n.push({path:t,message:`must contain only ${r.join(", ")}`});for(let o of r)(typeof e[o]!="number"||!Number.isFinite(e[o]))&&n.push({path:`${t}.${o}`,message:"must be a finite number"})}function Kn(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){Object.freeze(e);for(let t of Object.values(e))Kn(t)}return e}function xr(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}function Hn(e){return e.trim().replace(/^\/+|\/+$/g,"")}function Ns(e){let t=[],r=new Map(e.assets.map(n=>[n.id,n]));for(let n of e.scene.gameObjects){let i=Bs(n),o=vt(n.overrides?.materialBinding);o&&t.push({kind:"root",scope:"scene",gameObjectId:n.id,gameObjectName:n.name,materialAssetId:o,bindingPath:"overrides.materialBinding.materialAssetId",label:i});let a=Os(e,n,r),s=new Map(a.filter(d=>!!d.slotId).map(d=>[d.slotId,d])),l=n.overrides?.materialSlotBindings??{};for(let[d,u]of Object.entries(l)){let c=vt(u);if(!c)continue;let m=s.get(d),p=Vs(m,d);t.push({kind:"slot",scope:"scene",gameObjectId:n.id,gameObjectName:n.name,materialAssetId:c,bindingPath:`overrides.materialSlotBindings.${d}.materialAssetId`,label:`${i} / ${p}`,slotId:d,ownerNodePath:Jn(m)??d})}}for(let n of e.assets)if(!(n.type!=="prefab"||!n.prefab)){Wn(t,{ownerId:n.id,ownerName:n.displayName??n.id,prefabAssetId:n.id,path:`assets.${n.id}.prefab.overrides`,overrides:n.prefab.overrides});for(let i of n.prefab.nodes??[])Wn(t,{ownerId:`${n.id}:${i.id}`,ownerName:`${n.displayName??n.id} / ${i.name??i.id}`,prefabAssetId:n.id,prefabNodeId:i.id,path:`assets.${n.id}.prefab.nodes.${i.id}.overrides`,overrides:i.overrides})}return t}function Wn(e,t){let r=vt(t.overrides?.materialBinding);r&&e.push({kind:"root",scope:"prefab",gameObjectId:t.ownerId,gameObjectName:t.ownerName,materialAssetId:r,bindingPath:`${t.path}.materialBinding.materialAssetId`,label:t.ownerName,prefabAssetId:t.prefabAssetId,...t.prefabNodeId?{prefabNodeId:t.prefabNodeId}:{}});for(let[n,i]of Object.entries(t.overrides?.materialSlotBindings??{})){let o=vt(i);o&&e.push({kind:"slot",scope:"prefab",gameObjectId:t.ownerId,gameObjectName:t.ownerName,materialAssetId:o,bindingPath:`${t.path}.materialSlotBindings.${n}.materialAssetId`,label:`${t.ownerName} / ${n}`,slotId:n,ownerNodePath:n,prefabAssetId:t.prefabAssetId,...t.prefabNodeId?{prefabNodeId:t.prefabNodeId}:{}})}}function Gt(e){let t=[...new Set((e.scene.materialAssets??[]).map(s=>s.id?.trim()).filter(s=>!!s))],r=new Set(t),n=Ns(e),i=n.filter(s=>!r.has(s.materialAssetId)),o=new Map;for(let s of i){let l=o.get(s.materialAssetId)??[];l.push(s),o.set(s.materialAssetId,l)}let a=[...o.entries()].map(([s,l])=>({kind:"missing-material-asset",materialAssetId:s,usages:l}));return{ok:a.length===0,materialAssetIds:t,references:n,missingMaterialAssetIds:a.map(s=>s.materialAssetId),missingReferences:i,issues:a}}function Os(e,t,r){let n=new Map;for(let i of $s(e,t,r))n.set(i.slotId,i);return[...n.values()].sort((i,o)=>(i.label??i.slotId).localeCompare(o.label??o.slotId)||i.slotId.localeCompare(o.slotId))}function Jn(e){return e?.sourceSurfaces[0]?.ownerNodePath??null}function $s(e,t,r){let n=ge(t);if(!n)return[];let o=(r?.get(n.assetId)??e.assets.find(s=>s.id===n.assetId))?.metadata?.materialSlots;if(!Array.isArray(o))return[];let a=[];for(let s of o){let l=vs(s);l&&a.push(l)}return a}function vs(e){if(!e||typeof e!="object"||Array.isArray(e))return null;let t=e,r=typeof t.slotId=="string"&&t.slotId.trim()?t.slotId.trim():"",n=Array.isArray(t.sourceSurfaces)?t.sourceSurfaces:null,i=Gs(n);if(!r||!n||i.length===0||i.length!==n.length)return null;let o=typeof t.label=="string"&&t.label.trim()?t.label.trim():i[0].ownerNodePath,a=typeof t.materialName=="string"&&t.materialName.trim()?t.materialName.trim():"",s=Array.isArray(t.materialNames)?t.materialNames.filter(d=>typeof d=="string"&&!!d.trim()).map(d=>d.trim()):void 0,l=js(t.sourceMaterialProfiles);return{slotId:r,label:o,sourceSurfaces:i,...a?{materialName:a}:{},...s&&s.length>0?{materialNames:s}:{},...l&&l.length>0?{sourceMaterialProfiles:l}:{}}}function Gs(e){return Array.isArray(e)?e.flatMap(t=>{let r=zs(t);if(!r)return[];let n=Hn(typeof r.ownerNodePath=="string"?r.ownerNodePath:""),i=Number.isInteger(r.meshIndex)&&r.meshIndex>=0?r.meshIndex:void 0,o=Number.isInteger(r.primitiveIndex)&&r.primitiveIndex>=0?r.primitiveIndex:void 0;if(!n||i==null||o==null)return[];let a=Number.isInteger(r.nodeIndex)&&r.nodeIndex>=0?r.nodeIndex:void 0,s=Array.isArray(r.nodeIndexPath)?r.nodeIndexPath.filter(m=>Number.isInteger(m)&&m>=0):void 0,l=Number.isInteger(r.sourceMaterialIndex)&&r.sourceMaterialIndex>=0?r.sourceMaterialIndex:void 0,d=typeof r.sourceMeshName=="string"&&r.sourceMeshName.trim()?r.sourceMeshName.trim():void 0,u=typeof r.triangleCount=="number"&&Number.isFinite(r.triangleCount)&&r.triangleCount>=0?r.triangleCount:void 0,c=_s(r.boundingBox);return[{ownerNodePath:n,...a!=null?{nodeIndex:a}:{},...s&&s.length>0?{nodeIndexPath:s}:{},meshIndex:i,primitiveIndex:o,...l!=null?{sourceMaterialIndex:l}:{},...d?{sourceMeshName:d}:{},...u!=null?{triangleCount:u}:{},...c?{boundingBox:c}:{}}]}):[]}function _s(e){if(!e||typeof e!="object"||Array.isArray(e))return;let t=e,r=qn(t.min),n=qn(t.max);if(!(!r&&!n))return{...r?{min:r}:{},...n?{max:n}:{}}}function qn(e){if(!Array.isArray(e)||e.length<3)return null;let[t,r,n]=e;return typeof t=="number"&&Number.isFinite(t)&&typeof r=="number"&&Number.isFinite(r)&&typeof n=="number"&&Number.isFinite(n)?[t,r,n]:null}function js(e){if(!Array.isArray(e))return;let t=e.map(Ls).filter(r=>!!r);return t.length>0?t:void 0}function Ls(e){if(!e||typeof e!="object"||Array.isArray(e))return null;let t=e;if(!Number.isInteger(t.sourceMaterialIndex))return null;let r=typeof t.materialName=="string"&&t.materialName.trim()?t.materialName.trim():"",n=t.profile&&typeof t.profile=="object"&&!Array.isArray(t.profile)?t.profile:void 0,i=Fs(t.textureHints);return{sourceMaterialIndex:t.sourceMaterialIndex,...r?{materialName:r}:{},...n?{profile:n}:{},...i&&i.length>0?{textureHints:i}:{}}}function Fs(e){if(!Array.isArray(e))return;let t=e.map(Us).filter(r=>!!r);return t.length>0?t:void 0}function Us(e){if(!e||typeof e!="object"||Array.isArray(e))return null;let t=e,r=typeof t.profilePath=="string"&&t.profilePath.trim()?t.profilePath.trim():"",n=typeof t.reason=="string"&&t.reason.trim()?t.reason.trim():"";return!r||!n?null:{profilePath:r,reason:n,...Number.isInteger(t.textureIndex)?{textureIndex:t.textureIndex}:{},...Number.isInteger(t.imageIndex)?{imageIndex:t.imageIndex}:{},...Number.isInteger(t.bufferView)?{bufferView:t.bufferView}:{},...typeof t.mimeType=="string"&&t.mimeType.trim()?{mimeType:t.mimeType.trim()}:{},...typeof t.uri=="string"&&t.uri.trim()?{uri:t.uri.trim()}:{}}}function zs(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:null}function Bs(e){return e.name?.trim()||e.id}function vt(e){return typeof e?.materialAssetId=="string"?e.materialAssetId.trim():""}function Vs(e,t){return e?.label?.trim()||Jn(e)?.trim()||e?.slotId?.trim()||t}var jt=1;var mf=Symbol("unsupported-editor-scene-authored-clone-value");function Ir(e){return e.components.find(qs)??null}function ge(e){return e.components.find(Js)??null}function Ar(e){return e.components.find(Ys)??null}function _t(e){return e?.type==="prefab"&&_(e.prefab?.sourceAssetId)!=null}function Xn(e){return _(e?.prefab?.prefabId)!=null}function Yn(e){return _(e?.prefab?.sourceAssetId)}function at(e){if(!e?.prefab)return null;let t=Zn(e.prefab),r=_(e.prefab.rootNodeId);if(r&&t.some(i=>i.id===r))return r;let n=t.find(i=>i.kind==="root"&&!i.parentId);return n?n.id:null}function wr(e){return e?.prefab?Zn(e.prefab):[]}function Zn(e){if(!Array.isArray(e.nodes))return[];let t=[];for(let r of e.nodes){let n=Ks(r);n&&!t.some(i=>i.id===n.id)&&t.push(n)}return structuredClone(t)}function Ks(e){if(!e||typeof e!="object"||Array.isArray(e))return null;let t=e,r=_(t.id);return!r||!Hs(t.kind)?null:{id:r,..._(t.guid)?{guid:_(t.guid)}:{},..._(t.name)?{name:_(t.name)}:{},..._(t.parentId)?{parentId:_(t.parentId)}:{},kind:t.kind,...t.transform?{transform:structuredClone(t.transform)}:{},..._(t.sourceAssetId)?{sourceAssetId:_(t.sourceAssetId)}:{},..._(t.sourceNodePath)?{sourceNodePath:_(t.sourceNodePath)}:{},..._(t.childPrefabId)?{childPrefabId:_(t.childPrefabId)}:{},...t.primitive?{primitive:structuredClone(t.primitive)}:{},...t.light?{light:structuredClone(t.light)}:{},...t.marker?{marker:structuredClone(t.marker)}:{},...t.defaults?{defaults:structuredClone(t.defaults)}:{},...t.overrides?{overrides:structuredClone(t.overrides)}:{},...t.metadata?{metadata:structuredClone(t.metadata)}:{}}}function Hs(e){return e==="root"||e==="group"||e==="model"||e==="primitive"||e==="light"||e==="prefabInstance"||e==="marker"||e==="collision"}function Qn(e,t){let r=_(e?.materialAssetId),n=_(t?.materialAssetId),i=kt(e?.override,t?.override);return Qs({...n??r?{materialAssetId:n??r}:{},...ot(i)?{override:i}:{}})}function ei(e,t){let r={},n=Qn(e?.materialBinding,t?.materialBinding);n&&(r.materialBinding=n);let i=ed(e?.materialSlotBindings,t?.materialSlotBindings);return i&&(r.materialSlotBindings=i),ot(r)?r:void 0}function st(e,t){let r=typeof t=="string"?Zs(e,t):t,n=typeof t=="string"?t:t.id,i=[],o=Xn(r)?r.prefab:null;if(!r||!o)return i.push({code:"not-prefab-instance",severity:"info",message:r?`GameObject "${r.id}" is not a prefab instance.`:`GameObject "${n}" was not found.`}),{gameObject:r,prefab:null,definition:null,sourceAsset:null,diagnostics:i};let a=e.assets.find(d=>d.id===o.prefabId&&_t(d));a||i.push({code:"missing-prefab-definition",severity:"error",message:`Prefab definition "${o.prefabId}" was not found.`,prefabId:o.prefabId});let s=Yn(a)??_(o.sourceAssetId);a&&o.sourceAssetId&&s&&o.sourceAssetId!==s&&i.push({code:"source-asset-mismatch",severity:"warning",message:`Prefab instance source "${o.sourceAssetId}" does not match definition source "${s}".`,prefabId:o.prefabId,expectedSourceAssetId:s,actualSourceAssetId:o.sourceAssetId});let l=s?e.assets.find(d=>d.id===s):void 0;if(s&&!l&&i.push({code:"missing-source-asset",severity:"error",message:`Prefab source asset "${s}" was not found.`,prefabId:o.prefabId,sourceAssetId:s}),s){let d=e.assets.filter(u=>_t(u)&&Yn(u)===s).map(u=>u.id);d.length>1&&i.push({code:"duplicate-source-prefab",severity:"info",message:`Source asset "${s}" is referenced by ${d.length} prefab definitions.`,prefabId:o.prefabId,sourceAssetId:s})}return{gameObject:r,prefab:o,definition:a??null,sourceAsset:l??null,diagnostics:i}}function Ce(e){return e.kind==="group"||e.kind==="instance"||e.kind==="transform"||e.kind==="primitive"?e.kind:Xn(e)?"instance":e.primitive?"primitive":ge(e)?"instance":Ar(e)||e.transformType?"transform":"group"}function ti(e){let t=e.rendering&&typeof e.rendering=="object"&&!Array.isArray(e.rendering)?e.rendering:void 0,r=Ws(t?.renderingGroupId),n=Xs(t?.alphaIndex),i={};return r!=null&&(i.renderingGroupId=r),n!=null&&(i.alphaIndex=n),Object.keys(i).length>0?i:void 0}function Ws(e){return e===0||e===1||e===2||e===3?e:null}function qs(e){return e.type==="Transform"}function Js(e){return e.type==="ModelRenderer"}function Ys(e){return e.type==="ImageRenderer"}function Xs(e){return typeof e=="number"&&Number.isFinite(e)?e:null}function _(e){return typeof e=="string"&&e.trim().length>0?e.trim():null}function Zs(e,t){return e.scene.gameObjects.find(r=>r.id===t)??null}function Qs(e){if(!e||typeof e!="object"||Array.isArray(e))return;let t=e,r=_(t.materialAssetId),n=kt(t.override),i={...r?{materialAssetId:r}:{},...ot(n)?{override:n}:{}};return ot(i)?i:void 0}function ed(e,t){let r=new Set([...Object.keys(e??{}),...Object.keys(t??{})]),n={};for(let i of r){let o=Qn(e?.[i],t?.[i]);o&&(n[i]=o)}return ot(n)?n:void 0}function ot(e){return!!e&&typeof e=="object"&&!Array.isArray(e)&&Object.keys(e).length>0}var td=new Set(["id","guid","name","parentId","kind","transform","marker","metadata"]);function ri(e,t,r){if(e.kind!=="marker"){Object.prototype.hasOwnProperty.call(e,"marker")&&T("schema.invalidValue",`${r}.marker`);return}for(let s of Object.keys(e))td.has(s)||T("schema.invalidValue",`${r}.${s}`);dt(e.parentId)||T("schema.invalidReference",`${r}.parentId`),od(e.transform,`${r}.transform`),rd(e.marker,`${r}.marker`);let n=dt(e.id),i=e.marker,o=nd(i,`${r}.marker`),a=o[0]??null;for(let s of o){s.target.id===n&&T("schema.invalidReference",`${s.path}.id`),a&&(s.target.kind!==a.target.kind||s.target.id!==a.target.id)&&T("schema.invalidReference",s.path);let l=t.get(s.target.id);l&&(s.target.kind==="marker"&&l.kind!=="marker"&&T("schema.invalidReference",`${s.path}.kind`),s.target.kind==="scene-object"&&l.kind==="marker"&&T("schema.invalidReference",`${s.path}.kind`))}}function rd(e,t){let r=Ee(e);r||T("schema.invalidType",t),te(r,["schemaVersion","type","kind","tags","note","color","target","semanticFrame","geometry","metadata"],t),r.schemaVersion!==1&&T("schema.unsupportedVersion",`${t}.schemaVersion`),dt(r.type)||T("schema.invalidValue",`${t}.type`),r.kind!==void 0&&!dt(r.kind)&&T("schema.invalidValue",`${t}.kind`),r.tags!==void 0&&dd(r.tags,`${t}.tags`),r.note!==void 0&&typeof r.note!="string"&&T("schema.invalidType",`${t}.note`),r.color!==void 0&&sd(r.color,`${t}.color`),r.target!==void 0&&Tr(r.target,`${t}.target`),r.semanticFrame!==void 0&&ad(r.semanticFrame,`${t}.semanticFrame`),id(r.geometry,`${t}.geometry`),r.metadata!==void 0&&ld(r.metadata,`${t}.metadata`)}function nd(e,t){let r=[];return e.target&&r.push({target:e.target,path:`${t}.target`}),e.geometry.kind==="point"&&e.geometry.target&&r.push({target:e.geometry.target,path:`${t}.geometry.target`}),e.geometry.kind==="object-bounds"&&r.push({target:e.geometry.target,path:`${t}.geometry.target`}),r}function id(e,t){let r=Ee(e);if(r||T("schema.invalidType",t),r.kind==="box"){te(r,["kind"],t);return}if(r.kind==="point"){te(r,["kind","coordinateSpace","position","offset","target"],t),r.coordinateSpace!==void 0&&r.coordinateSpace!=="world"&&r.coordinateSpace!=="local"&&T("schema.invalidValue",`${t}.coordinateSpace`),r.position!==void 0&&Se(r.position,`${t}.position`),r.offset!==void 0&&Se(r.offset,`${t}.offset`),r.target!==void 0&&Tr(r.target,`${t}.target`);return}if(r.kind==="object-bounds"){te(r,["kind","target"],t),Tr(r.target,`${t}.target`);return}if(r.kind==="polyhedron"){te(r,["kind","coordinateSpace","vertices","faces"],t),r.coordinateSpace!==void 0&&r.coordinateSpace!=="world"&&T("schema.invalidValue",`${t}.coordinateSpace`),Array.isArray(r.vertices)||T("schema.invalidType",`${t}.vertices`),r.vertices.forEach((n,i)=>Se(n,`${t}.vertices[${i}]`)),r.faces!==void 0&&(Array.isArray(r.faces)||T("schema.invalidType",`${t}.faces`),r.faces.forEach((n,i)=>{Array.isArray(n)||T("schema.invalidType",`${t}.faces[${i}]`),n.forEach((o,a)=>{(!Number.isInteger(o)||o<0)&&T("schema.invalidValue",`${t}.faces[${i}][${a}]`)})}));return}T("schema.invalidValue",`${t}.kind`)}function Tr(e,t){let r=Ee(e);r||T("schema.invalidType",t),te(r,["kind","id","label"],t),r.kind!=="marker"&&r.kind!=="scene-object"&&T("schema.invalidValue",`${t}.kind`),dt(r.id)||T("schema.invalidValue",`${t}.id`),r.label!==void 0&&typeof r.label!="string"&&T("schema.invalidType",`${t}.label`)}function od(e,t){let r=Ee(e);if(r||T("schema.invalidType",t),r.type!=="Transform"&&T("schema.invalidValue",`${t}.type`),r.mode==="matrix"){te(r,["type","mode","matrix"],t),(!Array.isArray(r.matrix)||r.matrix.length!==16)&&T("schema.invalidType",`${t}.matrix`),r.matrix.forEach((n,i)=>Lt(n,`${t}.matrix[${i}]`));return}te(r,["type","mode","position","rotation","scale"],t),r.mode!==void 0&&r.mode!=="trs"&&T("schema.invalidValue",`${t}.mode`),Se(r.position,`${t}.position`),Se(r.rotation,`${t}.rotation`),r.scale!==void 0&&Se(r.scale,`${t}.scale`)}function ad(e,t){let r=Ee(e);r||T("schema.invalidType",t),te(r,["origin","forward","right","up","label","description"],t),Se(r.origin,`${t}.origin`);for(let n of["forward","right","up"])r[n]!==void 0&&Se(r[n],`${t}.${n}`);for(let n of["label","description"])r[n]!==void 0&&typeof r[n]!="string"&&T("schema.invalidType",`${t}.${n}`)}function sd(e,t){let r=Ee(e);r||T("schema.invalidType",t),te(r,["r","g","b"],t);for(let n of["r","g","b"])Lt(r[n],`${t}.${n}`),(r[n]<0||r[n]>1)&&T("schema.invalidValue",`${t}.${n}`)}function Se(e,t){let r=Ee(e);r||T("schema.invalidType",t),te(r,["x","y","z"],t);for(let n of["x","y","z"])Lt(r[n],`${t}.${n}`)}function dd(e,t){Array.isArray(e)||T("schema.invalidType",t),e.forEach((r,n)=>{typeof r!="string"&&T("schema.invalidType",`${t}[${n}]`)})}function ld(e,t){let r=Ee(e);r||T("schema.invalidType",t),Dr(r,t,new Set)}function Dr(e,t,r){if(e===null||typeof e=="string"||typeof e=="boolean")return;if(typeof e=="number"){Lt(e,t);return}(!e||typeof e!="object")&&T("schema.invalidType",t),r.has(e)&&T("schema.invalidValue",t);let n=Object.getPrototypeOf(e);Array.isArray(e)?n!==Array.prototype&&T("schema.invalidType",t):n!==Object.prototype&&n!==null&&T("schema.invalidType",t),r.add(e);try{if(Array.isArray(e))e.forEach((i,o)=>Dr(i,`${t}[${o}]`,r));else for(let[i,o]of Object.entries(e))Dr(o,`${t}.${i}`,r)}finally{r.delete(e)}}function te(e,t,r){let n=new Set(t);for(let i of Object.keys(e))n.has(i)||T("schema.invalidValue",`${r}.${i}`)}function Lt(e,t){(typeof e!="number"||!Number.isFinite(e))&&T("schema.invalidValue",t)}function Ee(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:null}function dt(e){return typeof e=="string"&&e.trim()?e.trim():null}function T(e,t){throw new Error(`${e}: ${t}`)}function kr(e,t){return t===e.rootNodeId?e.instanceId:`${e.instanceId}:${cd(t)}`}function cd(e){return encodeURIComponent(e)}function Mr(e,t){return{...structuredClone(e),id:kr(t,e.id)}}function ni(e,t){let r=structuredClone(e);return r.target&&(r.target=Mr(r.target,t)),r.geometry.kind==="point"&&r.geometry.target&&(r.geometry.target=Mr(r.geometry.target,t)),r.geometry.kind==="object-bounds"&&(r.geometry.target=Mr(r.geometry.target,t)),r}var ii={x:-.3,y:-1,z:-.2};var oi="scene.main",ai="scene";function si(e){let t=e.meta?.authoringSource;return{sourceId:t?.sourceId||oi,sourceType:t?.sourceType||ai,revision:typeof t?.revision=="number"?t.revision:1}}var di={type:"directional",intensity:2,direction:{...ii},diffuseColor:{r:1,g:1,b:1},inspectorLanguage:"zh"},Cr={type:"hemispheric",intensity:.8,diffuseColor:{r:1,g:1,b:1},groundColor:{r:.48,g:.52,b:.62},inspectorLanguage:"zh"};function ci(e){return e.filter(t=>t.kind==="model"||t.kind==="texture").map(ud).sort(gd)}function ud(e){let t=e.kind==="texture"?"texture":e.kind==="prefab"?"prefab":"glb",r=Re(e.guid),n=bd(e);return{id:e.assetId,...r?{guid:r}:{},assetId:e.assetId,type:t,kind:e.kind==="texture"?"texture":e.kind==="prefab"?"prefab":"model",displayName:e.displayName,category:e.category??pd(e),warmupCount:e.warmupCount,singleton:e.singleton,materialMode:e.materialMode,defaults:Ut(e.defaults),prefab:Ut(e.prefab),external:Ut(e.external),metadata:n,origin:e.origin??"project",dedupeKey:e.dedupeKey??r??Sd(e.external)??e.assetId,placeable:md(e)}}function fd(e){if(!e||typeof e!="object"||Array.isArray(e))return!1;let t=e;return t.kind==="texture"||t.type==="texture"}function md(e){return fd(e)?!0:!e||typeof e!="object"||Array.isArray(e)||e.placeable!==!1}function gd(e,t){return(e.category??"").localeCompare(t.category??"")||e.displayName.localeCompare(t.displayName)||e.assetId.localeCompare(t.assetId)||e.type.localeCompare(t.type)}function pd(e){return e.kind==="prefab"?"Prefab":e.kind==="texture"?"Texture":e.kind==="image"?"Image":e.kind==="sound"?"Sound":"Model"}function bd(e){return yd({originalFileName:e.originalFileName,relativePath:e.relativePath,codeKey:e.codeKey,contentHash:e.contentHash,byteSize:e.byteSize,...Ut(e.metadata)})}function yd(e){if(!Array.isArray(e.materialSlots))return e;let t=Ft(e.assetAnalysis),r=Array.isArray(t?.meshes)?t.meshes:[],n=Array.isArray(t?.nodes)?t.nodes:[],i=new Map(r.flatMap(l=>{let d=Ft(l),u=lt(d?.meshIndex),c=Re(d?.name);return u==null||!c?[]:[[u,c]]})),o=new Map(n.flatMap(l=>{let d=Ft(l),u=lt(d?.nodeIndex),c=Re(d?.meshName);return u==null||!c?[]:[[u,c]]})),a=li(t,"meshCount",r.length)||li(t,"nodeCount",n.length),s=e.materialSlots.map(l=>{let d=Ft(l);if(!d||Re(d.sourceMeshName))return l;let u=lt(d.meshIndex);if(u==null)return l;let c=lt(d.nodeIndex),m=i.get(u)??(c==null?void 0:o.get(c))??(a?hd(d):void 0);return m?{...d,sourceMeshName:m}:l});return{...e,materialSlots:s}}function hd(e){let t=Re(e.label);if(t){let r=t.replace(/\s+\/\s+Primitive\s+\d+$/,"").trim();if(r)return r}return Re(e.ownerNodePath)?.split("/").filter(Boolean).pop()}function li(e,t,r){let n=lt(e?.[t]);return n!=null&&n>r}function Sd(e){return!e||typeof e!="object"||Array.isArray(e)?null:Re(e.platformAssetId)}function Re(e){return typeof e=="string"&&e.trim()?e.trim():null}function lt(e){return Number.isInteger(e)&&e>=0?e:null}function Ft(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function Ut(e){return e==null?void 0:structuredClone(e)}function mi(e,t){let r=new Map(t.filter(o=>o.type==="glb").map(o=>[o.assetId,o])),n=e.assets.map(o=>{if(o.type!=="glb")return o;let a=r.get(o.id);return a?ui(o,a):o}),i=new Set(e.assets.map(o=>o.id));for(let o of Ed(e)){if(i.has(o))continue;let a=r.get(o);a&&(n.push(ui({id:o,type:"glb"},a)),i.add(o))}return{...e,assets:n}}function Ed(e){let t=[],r=new Set,n=i=>{let o=xd(i);!o||r.has(o)||(r.add(o),t.push(o))};for(let i of e.assets)if(i.type==="prefab"){n(i.prefab?.sourceAssetId);for(let o of i.prefab?.nodes??[])n(o.sourceAssetId)}for(let i of e.scene.gameObjects){for(let a of i.components)a.type==="ModelRenderer"&&n(a.assetId);n(i.prefab?.sourceAssetId);let o=fi(fi(i)?.instance);n(o?.assetId)}return t}function ui(e,t){return{...e,guid:t.guid??e.guid,displayName:t.displayName||e.displayName,category:t.category??e.category,warmupCount:t.warmupCount??e.warmupCount,singleton:t.singleton??e.singleton,materialMode:t.materialMode??e.materialMode,defaults:zt(t.defaults??e.defaults),prefab:zt(t.prefab??e.prefab),external:zt(t.external??e.external),metadata:zt(t.metadata??e.metadata)}}function zt(e){return e==null?void 0:structuredClone(e)}function fi(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function xd(e){return(typeof e=="string"?e.trim():"")||void 0}function gi(e){let t=Gt(e);if(t.ok)return;let r=new Error(`editor_scene_material_assets_missing: ${t.missingMaterialAssetIds.join(", ")}`);throw r.details={missingMaterialAssetIds:t.missingMaterialAssetIds,missingReferences:t.missingReferences.map(n=>({materialAssetId:n.materialAssetId,gameObjectId:n.gameObjectId,bindingPath:n.bindingPath,label:n.label,kind:n.kind,...n.slotId?{slotId:n.slotId}:{},...n.ownerNodePath?{ownerNodePath:n.ownerNodePath}:{}}))},r}var Pd="sun_light";function Id(e,t,r={}){let n=Td(kd(e,t)),i=Dd(e,t),o=Md(t,"instance"),a=[...n.diagnostics,...i.diagnostics,...o.diagnostics];return{settings:ce(r.project,n.settings,i.settings,r.node,o.settings),diagnostics:a}}function Ad(e){let t=new Map,r=e.casterId;for(let n of e.explicitReceiverIds??[]){let i=Vt(e.document,n);!i||i.id===r||i.active===!1||t.set(i.id,{receiverId:i.id,source:"explicit",score:120,...ct(i,"explicit",120,["explicit receiver id"])})}for(let n of e.document.scene.gameObjects){if(n.id===r||n.active===!1)continue;let o=ne(n.shadow).shadow?.receive;if(o!=="none"){if(o==="enabled"){Rr(t,{receiverId:n.id,source:"explicit",score:100,...ct(n,"explicit",100,["shadow.receive enabled"])});continue}if(o==="auto"){Rr(t,{receiverId:n.id,source:"auto",score:70,...ct(n,"auto",70,["shadow.receive auto"])});continue}Od(n)&&Rr(t,{receiverId:n.id,source:"auto",score:40,...ct(n,"auto",40,["plane primitive auto receiver"])})}}return[...t.values()].sort((n,i)=>i.score-n.score||n.receiverId.localeCompare(i.receiverId))}function Bt(e){let t=e.caster?.id===e.casterId?e.caster:Vt(e.document,e.casterId),r=[];if(!t)return{casterId:e.casterId,receiverIds:[],backend:"none",mode:"none",quality:e.fallbackQuality??"medium",params:xt(e.fallbackQuality??"medium"),diagnostics:[{code:"shadow.invalidTarget",severity:"error",message:`Shadow caster "${e.casterId}" was not found.`,casterId:e.casterId}]};let n=e.settings?{settings:ce(e.settings.project,e.settings.source,e.settings.prefab,e.settings.node,e.settings.instance),diagnostics:[]}:Id(e.document,t);r.push(...n.diagnostics);let o=n.settings?.cast==="none"?"none":or(n.settings,e.fallbackMode??"none"),a=ar(n.settings,e.fallbackQuality??"medium"),s=xt(a,n.settings?.params),l=wd(o),d=Rd(e.explicitReceiverIds),u=l==="none"?{candidates:[],diagnostics:[]}:d.length>0&&e.strictExplicitReceivers===!0?Nd(e.document,t.id,d):{candidates:Ad({document:e.document,casterId:t.id,explicitReceiverIds:d.length>0?d:void 0}),diagnostics:[]};r.push(...u.diagnostics);let c=u.candidates;l!=="none"&&c.length===0&&r.push({code:"shadow.receiverNotFound",severity:"warning",message:`No shadow receiver was found for caster "${t.id}".`,casterId:t.id});let m=l==="none"?null:Cd(e.document,n.settings,e.defaultLightId);return m?.diagnostic&&r.push(m.diagnostic),{casterId:t.id,receiverIds:c.map(p=>p.receiverId),...m?.lightId?{lightId:m.lightId}:{},backend:l,mode:o,quality:a,params:s,diagnostics:r}}function wd(e){return e==="dynamic"?"dynamic-map":e==="static"?"static-baked":e==="blob"?"blob":e==="projected"?"projected":"none"}function Td(e){if(!e)return{diagnostics:[]};let t=e.defaults&&typeof e.defaults=="object"&&!Array.isArray(e.defaults)?e.defaults:void 0;if(!t)return{diagnostics:[]};let r=ne(t.shadow);return{settings:r.shadow,diagnostics:r.diagnostics.map(n=>({...n,details:{...n.details??{},source:"asset",assetId:e.id}}))}}function Dd(e,t){let r=typeof t.prefab?.prefabId=="string"?t.prefab.prefabId:null;if(!r)return{diagnostics:[]};let n=e.assets.find(o=>o.id===r);if(!n?.prefab?.defaults)return{diagnostics:[]};let i=ne(n.prefab.defaults.shadow);return{settings:i.shadow,diagnostics:i.diagnostics.map(o=>({...o,details:{...o.details??{},source:"prefab",prefabId:r}}))}}function Md(e,t){let r=ne(e.shadow);return{settings:r.shadow,diagnostics:r.diagnostics.map(n=>({...n,casterId:e.id,details:{...n.details??{},source:t}}))}}function kd(e,t){let n=ge(t)?.assetId??t.prefab?.sourceAssetId;return n?e.assets.find(i=>i.id===n)??null:null}function Cd(e,t,r){if((t?.light?.mode??"inherit")==="explicit"){let a=t?.light?.lightId;return a&&pi(e,a)?{lightId:a}:{diagnostic:{code:"shadow.lightNotFound",severity:"warning",message:a?`Explicit shadow light "${a}" was not found.`:"Shadow light mode is explicit, but no lightId was configured.",...a?{lightId:a}:{}}}}let i=r??Pd;if(pi(e,i))return{lightId:i};let o=e.scene.gameObjects.find(a=>bi(a)&&a.active!==!1);return o?{lightId:o.id}:{diagnostic:{code:"shadow.lightNotFound",severity:"warning",message:"No directional shadow light was found."}}}function pi(e,t){let r=Vt(e,t);return!!r&&r.active!==!1&&bi(r)}function bi(e){return Ce(e)==="transform"&&e.light?.type==="directional"}function Rr(e,t){let r=e.get(t.receiverId);(!r||t.score>r.score)&&e.set(t.receiverId,t)}function Rd(e){let t=new Set,r=[];for(let n of e??[]){let i=typeof n=="string"?n.trim():"";!i||t.has(i)||(t.add(i),r.push(i))}return r}function Nd(e,t,r){let n=[],i=[];for(let o of r){let a=Vt(e,o);if(!a){i.push({code:"shadow.receiverNotFound",severity:"warning",message:`Explicit shadow receiver "${o}" was not found.`,casterId:t,receiverId:o,details:{source:"explicit"}});continue}if(a.id===t){i.push({code:"shadow.receiverNotFound",severity:"warning",message:`Shadow caster "${t}" cannot be used as its own receiver.`,casterId:t,receiverId:o,details:{source:"explicit",reason:"self"}});continue}if(a.active===!1){i.push({code:"shadow.receiverNotFound",severity:"warning",message:`Explicit shadow receiver "${o}" is inactive.`,casterId:t,receiverId:o,details:{source:"explicit",reason:"inactive"}});continue}n.push({receiverId:a.id,source:"explicit",score:120,...ct(a,"explicit",120,["explicit receiver id"])})}return{candidates:n,diagnostics:i}}function ct(e,t,r,n){let i=ne(e.shadow).shadow;return{active:e.active!==!1,visible:e.active!==!1,...i?.receive?{receive:i.receive}:{},suitability:{score:r,material:Ce(e)==="primitive"?"primitive":t,reasons:n}}}function Od(e){return Ce(e)==="primitive"&&e.primitive?.shape==="plane"}function Vt(e,t){return e.scene.gameObjects.find(r=>r.id===t)??null}var xi="@fps-games/editor.playable-sdk.scene-compiler",Pi="3",$d=new Set(["shadowMode","childMaterialBindings","childMaterials"]),vd=new Set(["coordinateSpace","center","size","rotation"]),yi=new Set(["root","group","model","primitive","light","prefabInstance","marker","collision"]);function Ii(e){Gd(e,!0)}function Gd(e,t){let r=I(e);if(!r)throw new Error("editor_scene_must_be_object");if(r.schemaVersion!==1)throw h("schema.unsupportedVersion","$.schemaVersion");if(!Array.isArray(r.assets))throw new Error("editor_scene_assets_must_be_array");let n=I(r.scene);if(!Array.isArray(n?.gameObjects))throw new Error("editor_scene_game_objects_must_be_array");if(n.materialAssets!=null&&!Array.isArray(n.materialAssets))throw new Error("editor_scene_material_assets_must_be_array");n.shadowMapExperiment!==void 0&&mr(n.shadowMapExperiment),n.gameObjects.forEach((i,o)=>{let a=I(i);a?.shadowMapExperiment!==void 0&&tt(a.shadowMapExperiment,`$.scene.gameObjects[${o}].shadowMapExperiment`)}),Ld(r.assets,n.gameObjects),$r(r,"$"),Fd(r.assets),jd(r.assets,n.gameObjects),Ud(n.gameObjects,r.assets),zd(n.gameObjects),_d(n.materialAssets??[]),t&&Bd(r.assets,n.gameObjects),gi(r)}function _d(e){for(let t=0;t<e.length;t+=1){let r=I(e[t]),n=`$.scene.materialAssets[${t}]`;if(!r)throw h("schema.invalidType",n);if(Object.prototype.hasOwnProperty.call(r,"materialKind"))throw h("schema.deprecatedField",`${n}.materialKind`);if(Object.prototype.hasOwnProperty.call(r,"profile"))throw h("schema.deprecatedField",`${n}.profile`);if(!A(r.id))throw h("schema.invalidType",`${n}.id`);if(!A(r.name))throw h("schema.invalidType",`${n}.name`);let i=A(r.shaderId);if(!i)throw h("schema.invalidValue",`${n}.shaderId`);if(Un(i)){let a=zn(i,r.properties,`${n}.properties`);if(a[0])throw h("schema.invalidValue",a[0].path)}else if(!I(r.properties))throw h("schema.invalidType",`${n}.properties`);for(let a of Object.keys(r))if(!["id","guid","name","shaderId","properties","system","origin"].includes(a))throw h("schema.unknownField",`${n}.${a}`)}}function jd(e,t){let r=new Set(e.map(I).filter(o=>o?.type==="glb").map(o=>A(o?.id)).filter(o=>!!o)),n=new Set(e.map(I).filter(o=>o?.type==="texture").map(o=>A(o?.id)).filter(o=>!!o)),i=new Map;for(let o of e.map(I)){if(o?.type!=="prefab")continue;let a=A(o.id),s=A(I(o.prefab)?.sourceAssetId);a&&s&&i.set(a,s)}for(let o=0;o<e.length;o+=1){let a=I(e[o]);if(a?.type!=="prefab")continue;let s=I(a.prefab),l=A(s?.sourceAssetId),d=A(s?.rootNodeId);if(!l||!r.has(l))throw h("schema.invalidReference",`$.assets[${o}].prefab.sourceAssetId`);let u=Array.isArray(s?.nodes)?s.nodes:[];for(let c=0;c<u.length;c+=1){let m=I(u[c]),p=A(m?.sourceAssetId);if(m?.kind==="model"&&(!p||!r.has(p)))throw h("schema.invalidReference",`$.assets[${o}].prefab.nodes[${c}].sourceAssetId`);if(m?.kind==="prefabInstance"){let g=A(m.childPrefabId),b=g?i.get(g):null;if(A(m.id)===d&&l!==b)throw h("schema.invalidReference",`$.assets[${o}].prefab.sourceAssetId`);if(p&&p!==b)throw h("schema.invalidReference",`$.assets[${o}].prefab.nodes[${c}].sourceAssetId`)}}}for(let o=0;o<t.length;o+=1){let a=I(t[o]),s=A(I(a?.instance)?.assetId);if(s&&!r.has(s))throw h("schema.invalidReference",`$.scene.gameObjects[${o}].instance.assetId`);let l=Array.isArray(a?.components)?a.components:[];for(let d=0;d<l.length;d+=1){let u=I(l[d]);if(u?.type!=="ModelRenderer")continue;let c=A(u.assetId);if(!c||!r.has(c))throw h("schema.invalidReference",`$.scene.gameObjects[${o}].components[${d}].assetId`)}for(let d=0;d<l.length;d+=1){let u=I(l[d]);if(u?.type!=="ImageRenderer")continue;let c=A(u.assetId);if(!c||!n.has(c))throw h("schema.invalidReference",`$.scene.gameObjects[${o}].components[${d}].assetId`);let m=I(u.size);if(!m||!Ei(m.width)||!Ei(m.height))throw h("schema.invalidValue",`$.scene.gameObjects[${o}].components[${d}].size`)}}}function Ld(e,t){let r=new Set;e.forEach((o,a)=>{let s=I(o);if(!s)throw h("schema.invalidType",`$.assets[${a}]`);let l=A(s.id);if(!l||!A(s.type))throw h("schema.invalidValue",`$.assets[${a}]`);if(r.has(l))throw h("schema.invalidValue",`$.assets[${a}].id`);r.add(l);let d=I(s.defaults);d?.shadowMapExperiment!==void 0&&tt(d.shadowMapExperiment,`$.assets[${a}].defaults.shadowMapExperiment`)});let n=new Set,i=new Map;t.forEach((o,a)=>{let s=I(o);if(!s)throw h("schema.invalidType",`$.scene.gameObjects[${a}]`);let l=A(s.id);if(!l)throw h("schema.invalidValue",`$.scene.gameObjects[${a}].id`);if(n.has(l))throw h("schema.invalidValue",`$.scene.gameObjects[${a}].id`);if(n.add(l),i.set(l,{value:s,index:a}),!Array.isArray(s.components))throw h("schema.invalidType",`$.scene.gameObjects[${a}].components`);s.components.forEach((d,u)=>{let c=I(d);if(!c)throw h("schema.invalidType",`$.scene.gameObjects[${a}].components[${u}]`);if(!A(c.type))throw h("schema.invalidValue",`$.scene.gameObjects[${a}].components[${u}].type`)})});for(let[o,a]of i){if(!("parentId"in a.value))continue;let s=A(a.value.parentId);if(!s||!i.has(s))throw h("schema.invalidReference",`$.scene.gameObjects[${a.index}].parentId`);let l=new Set([o]),d=s;for(;d;){if(l.has(d))throw h("schema.invalidReference",`$.scene.gameObjects[${a.index}].parentId`);l.add(d);let u=i.get(d)?.value;d=u&&u.parentId!=null?A(u.parentId):null}}}function $r(e,t){if(Array.isArray(e)){e.forEach((n,i)=>$r(n,`${t}[${i}]`));return}let r=I(e);if(r)for(let[n,i]of Object.entries(r)){let o=`${t}.${n}`;if($d.has(n))throw h("schema.deprecatedField",o);n==="shadow"&&Ze(i,o),!(n==="metadata"||n==="shadowMapExperiment")&&$r(i,o)}}function Fd(e){let t=new Set(e.map(I).filter(a=>a?.type==="prefab").map(a=>A(a?.id)).filter(a=>!!a)),r=new Map;for(let a=0;a<e.length;a+=1){let s=I(e[a]);if(s?.type!=="prefab")continue;let l=I(s.prefab);if(!Array.isArray(l?.nodes))throw h("schema.unsupportedVersion",`$.assets[${a}].prefab.nodes`);hi(l.defaults,`$.assets[${a}].prefab.defaults`);let d=[],u=new Set;for(let g=0;g<l.nodes.length;g+=1){let b=`$.assets[${a}].prefab.nodes[${g}]`,S=I(l.nodes[g]);if(!S)throw h("schema.invalidType",b);hi(S.defaults,`${b}.defaults`);let x=A(S.id);if(!x||!yi.has(String(S.kind)))throw h("schema.invalidValue",b);if(u.has(x))throw h("schema.invalidValue",`${b}.id`);u.add(x),d.push(S)}let c=A(l?.rootNodeId),m=c?d.find(g=>A(g?.id)===c):null,p=!!m&&yi.has(String(m.kind))&&!Object.prototype.hasOwnProperty.call(m,"parentId");if(l?.compositionVersion!==jt||d.length===0||!p)throw h("schema.unsupportedVersion",`$.assets[${a}].prefab`);r.set(A(s.id),d.flatMap((g,b)=>{let S=A(g.childPrefabId);return S?[{prefabId:S,path:`$.assets[${a}].prefab.nodes[${b}].childPrefabId`}]:[]}));for(let g=0;g<d.length;g+=1){let b=d[g];ri(b,new Map(d.map(M=>[A(M.id),M])),`$.assets[${a}].prefab.nodes[${g}]`);let S=A(b.id),x=A(b.parentId);if(S!==c&&(!x||!u.has(x)))throw h("schema.invalidReference",`$.assets[${a}].prefab.nodes[${g}].parentId`);if(b.kind==="prefabInstance"){let M=A(b.childPrefabId);if(!M||!t.has(M))throw h("schema.invalidReference",`$.assets[${a}].prefab.nodes[${g}].childPrefabId`)}let D=new Set([S]),w=x;for(;w;){if(D.has(w))throw h("schema.invalidReference",`$.assets[${a}].prefab.nodes[${g}].parentId`);D.add(w);let M=d.find(O=>A(O.id)===w);w=M?A(M.parentId):null}}}let n=new Set,i=new Set,o=a=>{if(!i.has(a)){n.add(a);for(let s of r.get(a)??[]){if(n.has(s.prefabId))throw h("schema.invalidReference",s.path);o(s.prefabId)}n.delete(a),i.add(a)}};for(let a of r.keys())o(a)}function hi(e,t){if(e==null)return;let r=I(e);if(!r)throw h("schema.invalidType",t);if(Object.prototype.hasOwnProperty.call(r,"active")&&typeof r.active!="boolean")throw h("schema.invalidType",`${t}.active`);r.shadowMapExperiment!==void 0&&tt(r.shadowMapExperiment,`${t}.shadowMapExperiment`)}function Ud(e,t){let r=new Map;for(let n of t.map(I)){if(n?.type!=="prefab")continue;let i=A(n.id),o=A(I(n.prefab)?.sourceAssetId);i&&o&&r.set(i,o)}for(let n=0;n<e.length;n+=1){let i=I(e[n]);if(!i||i.prefab==null)continue;let o=I(i.prefab),a=A(o?.prefabId),s=a?r.get(a):null;if(!a||!s)throw h("schema.unsupportedVersion",`$.scene.gameObjects[${n}].prefab`);if(A(o?.sourceAssetId)!==s)throw h("schema.invalidReference",`$.scene.gameObjects[${n}].prefab.sourceAssetId`);let l=A(I(i.instance)?.assetId);if(l&&l!==s)throw h("schema.invalidReference",`$.scene.gameObjects[${n}].instance.assetId`);let d=Array.isArray(i.components)?i.components:[];for(let u=0;u<d.length;u+=1){let c=I(d[u]);if(c?.type==="ModelRenderer"&&A(c.assetId)!==s)throw h("schema.invalidReference",`$.scene.gameObjects[${n}].components[${u}].assetId`)}}}function zd(e){for(let t=0;t<e.length;t+=1){let r=I(I(I(e[t])?.marker)?.geometry);if(r?.kind!=="box")continue;for(let i of vd)if(Object.prototype.hasOwnProperty.call(r,i))throw h("schema.deprecatedField",`$.scene.gameObjects[${t}].marker.geometry.${i}`);if(!(Array.isArray(I(e[t])?.components)?I(e[t]).components:[]).some(i=>I(i)?.type==="Transform"))throw h("schema.invalidValue",`$.scene.gameObjects[${t}].components`)}}function Bd(e,t){let r=new Map,n=new Map;for(let i=0;i<e.length;i+=1){let o=I(e[i]),a=A(o?.id);if(!o||!a)continue;if(o.type==="prefab"){let c=A(I(o.prefab)?.sourceAssetId);c&&n.set(a,c)}let s=I(o.metadata),l=s?.materialSlots;if(l==null){r.set(a,new Set);continue}if(!Array.isArray(l))throw h("schema.invalidType",`$.assets[${i}].metadata.materialSlots`);let d=Vd(s?.assetAnalysis),u=new Set;for(let c=0;c<l.length;c+=1){let m=I(l[c]),p=A(m?.slotId);if(!m||!p)throw h("schema.invalidValue",`$.assets[${i}].metadata.materialSlots[${c}]`);let g=`$.assets[${i}].metadata.materialSlots[${c}]`;for(let b of["ownerNodePath","nodeIndex","nodeIndexPath","meshIndex","primitiveIndex","sourceMaterialIndex","sourceMaterialIndices","sourceMeshName","triangleCount","boundingBox"])if(Object.prototype.hasOwnProperty.call(m,b))throw h("schema.deprecatedField",`${g}.${b}`);if(!Array.isArray(m.sourceSurfaces))throw h("schema.invalidType",`${g}.sourceSurfaces`);if(m.sourceSurfaces.length===0)throw h("schema.invalidValue",`${g}.sourceSurfaces`);for(let b=0;b<m.sourceSurfaces.length;b+=1){let S=`${g}.sourceSurfaces[${b}]`,x=I(m.sourceSurfaces[b]);if(!x||!A(x.ownerNodePath))throw h("schema.invalidValue",S);Si(x,"nodeIndex",S),Si(x,"sourceMaterialIndex",S);for(let w of["meshIndex","primitiveIndex"])if(!Number.isInteger(x[w])||x[w]<0)throw h("schema.invalidValue",`${S}.${w}`);if(x.nodeIndexPath!=null&&(!Array.isArray(x.nodeIndexPath)||x.nodeIndexPath.some(w=>!Number.isInteger(w)||w<0)))throw h("schema.invalidValue",`${S}.nodeIndexPath`);let D=x.meshIndex;if(!A(x.sourceMeshName)&&!d.has(D))throw h("schema.invalidValue",`${S}.sourceMeshName`)}if(u.has(p))throw h("schema.invalidValue",`$.assets[${i}].metadata.materialSlots[${c}].slotId`);u.add(p)}r.set(a,u)}for(let i=0;i<e.length;i+=1){let o=I(e[i]);if(o?.type!=="prefab")continue;let a=I(o.prefab),s=A(a?.sourceAssetId);Nr(a?.overrides,s?r.get(s):void 0,`$.assets[${i}].prefab.overrides`);let l=Array.isArray(a?.nodes)?a.nodes:[];for(let d=0;d<l.length;d+=1){let u=I(l[d]),c=A(u?.childPrefabId),m=A(u?.sourceAssetId)??(c?n.get(c)??null:null);Nr(u?.overrides,m?r.get(m):void 0,`$.assets[${i}].prefab.nodes[${d}].overrides`)}}for(let i=0;i<t.length;i+=1){let o=I(t[i]),s=(Array.isArray(o?.components)?o.components:[]).map(I).find(d=>d?.type==="ModelRenderer"),l=A(s?.assetId);Nr(o?.overrides,l?r.get(l):void 0,`$.scene.gameObjects[${i}].overrides`)}}function Nr(e,t,r){let n=I(e);if(!n||n.materialSlotBindings==null)return;let i=I(n.materialSlotBindings);if(!i)throw h("schema.invalidType",`${r}.materialSlotBindings`);for(let[o,a]of Object.entries(i)){if(!t?.has(o))throw h("schema.invalidReference",`${r}.materialSlotBindings.${o}`);let s=`${r}.materialSlotBindings.${o}`,l=I(a);if(!l)throw h("schema.invalidType",s);for(let d of Object.keys(l))if(d!=="materialAssetId"&&d!=="override")throw h("schema.deprecatedField",`${s}.${d}`);if("materialAssetId"in l&&l.materialAssetId!=null&&!A(l.materialAssetId))throw h("schema.invalidValue",`${s}.materialAssetId`);if("override"in l&&!I(l.override))throw h("schema.invalidType",`${s}.override`);"override"in l&&Kd(l.override,`${s}.override`)}}function Si(e,t,r){let n=e[t];if(n!=null&&(!Number.isInteger(n)||n<0))throw h("schema.invalidValue",`${r}.${t}`)}function Vd(e){let t=I(e),r=Array.isArray(t?.meshes)?t.meshes:[];return new Set(r.flatMap(n=>{let i=I(n),o=i?.meshIndex,a=Number.isInteger(o)?o:null;return a!=null&&A(i?.name)?[a]:[]}))}function Kd(e,t){let r=I(e);if(!r)throw h("schema.invalidType",t);if(ze(r,["lightingModel","baseColor","normal","metallic","roughness","metallicRoughness","occlusion","emission","alpha"],t),"lightingModel"in r&&!["lit","unlit"].includes(String(r.lightingModel)))throw h("schema.invalidValue",`${t}.lightingModel`);for(let n of["metallic","roughness"])ft(r,n,t);Hd(r.baseColor,`${t}.baseColor`),Or(r.normal,`${t}.normal`,["texture","strength"]),Or(r.metallicRoughness,`${t}.metallicRoughness`,["texture"]),Or(r.occlusion,`${t}.occlusion`,["texture","strength"]),Wd(r.emission,`${t}.emission`),qd(r.alpha,`${t}.alpha`)}function Hd(e,t){if(e==null)return;let r=Be(e,t);ze(r,["color","texture","brightness","saturation","contrast","hue"],t),Ai(r.color,`${t}.color`),ut(r.texture,`${t}.texture`);for(let n of["brightness","saturation","contrast","hue"])ft(r,n,t)}function Or(e,t,r){if(e==null)return;let n=Be(e,t);ze(n,r,t),ut(n.texture,`${t}.texture`),r.includes("strength")&&ft(n,"strength",t)}function Wd(e,t){if(e==null)return;let r=Be(e,t);ze(r,["color","intensity","texture","maskTexture"],t),Ai(r.color,`${t}.color`),ft(r,"intensity",t),ut(r.texture,`${t}.texture`),ut(r.maskTexture,`${t}.maskTexture`)}function qd(e,t){if(e==null)return;let r=Be(e,t);if(ze(r,["mode","opacity","cutoff","texture"],t),"mode"in r&&!["opaque","mask","blend"].includes(String(r.mode)))throw h("schema.invalidValue",`${t}.mode`);for(let n of["opacity","cutoff"])ft(r,n,t);ut(r.texture,`${t}.texture`)}function ut(e,t){if(e==null)return;let r=Be(e,t);ze(r,["url","textureAssetId"],t);for(let n of["url","textureAssetId"])if(n in r&&r[n]!=null&&!A(r[n]))throw h("schema.invalidValue",`${t}.${n}`)}function Ai(e,t){if(e==null)return;let r=Be(e,t);for(let n of["r","g","b"])Jd(r,n,t)}function ze(e,t,r){let n=new Set(t);for(let i of Object.keys(e))if(!n.has(i))throw h("schema.deprecatedField",`${r}.${i}`)}function ft(e,t,r){if(t in e&&e[t]!=null&&(typeof e[t]!="number"||!Number.isFinite(e[t])))throw h("schema.invalidType",`${r}.${t}`)}function Jd(e,t,r){if(!(t in e)||typeof e[t]!="number"||!Number.isFinite(e[t]))throw h("schema.invalidValue",`${r}.${t}`)}function Be(e,t){let r=I(e);if(!r)throw h("schema.invalidType",t);return r}function h(e,t){let r=new Error(`${e}: ${t}`);return Object.assign(r,{code:e,path:t}),r}function I(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:null}function A(e){return typeof e=="string"&&e.length>0&&e===e.trim()?e:null}function Ei(e){return typeof e=="number"&&Number.isFinite(e)&&e>0}function Ti(e,t,r={}){Ii(e);let n=t;Object.prototype.hasOwnProperty.call(n,"staticShadows")&&n.staticShadows!=null&&rt(n.staticShadows,"$.staticShadows");let{scene:i,...o}=t,a=structuredClone(o),s=U(i)?i:void 0,l=si(e),d={...l,compilerId:xi,compilerVersion:Pi,compiledAt:new Date().toISOString()};a.schemaVersion=3,a.meta={...a.meta??{},generatedFrom:d};let u=s?.rootId||"root",c=e.scene.gameObjects.filter(x=>x.id!==u),m=el(e),p={...e,scene:{...e.scene,materialAssets:m}},g=c.flatMap(x=>ul(x,l,p,r)),b=g.map(Di);Xd(u,b),Zd(u,b);let S={rootId:u,assets:p.assets.filter(nl).map(il),nodes:b,materialAssets:m,materials:structuredClone(s?.materials??[]),textures:structuredClone(s?.textures??[])};return a.scene=S,a.plugins=ml(a.plugins,r.shadowMapExperimentConfig,p.scene.shadowMapExperiment,g,u,l.revision),Sr(a),{sceneConfig:a,summary:{assetCount:S.assets.length,gameObjectCount:e.scene.gameObjects.length,nodeCount:S.nodes.length}}}function Di(e){if(!Object.prototype.hasOwnProperty.call(e,"shadowMapExperiment")&&!Object.prototype.hasOwnProperty.call(e,"shadowMapExperimentInferredUpdateClass")&&!Object.prototype.hasOwnProperty.call(e,"shadowMapExperimentAuthoredShadow"))return e;let{shadowMapExperiment:t,shadowMapExperimentInferredUpdateClass:r,shadowMapExperimentAuthoredShadow:n,...i}=e;return i}function Xd(e,t){let r=new Set([e]);for(let n=0;n<t.length;n+=1){let i=t[n].id;if(r.has(i)){let o=new Error(`schema.invalidReference: $.scene.nodes[${n}].id`);throw Object.assign(o,{code:"schema.invalidReference",path:`$.scene.nodes[${n}].id`,nodeId:i}),o}r.add(i)}}function Zd(e,t){let r=new Map(t.map(n=>[n.id,n]));for(let n=0;n<t.length;n+=1){let i=t[n];if(!(i.source?.component!=="PrefabMarker"||!("marker"in i)||!i.marker))for(let o of Qd(i.marker)){let a=r.get(o.target.id);if(o.target.id!==e&&(!a||a.source?.objectId===i.source.objectId))continue;let s=`$.scene.nodes[${n}].marker.${o.path}.id`,l=new Error(`schema.invalidReference: ${s}`);throw Object.assign(l,{code:"schema.invalidReference",path:s,nodeId:i.id,targetId:o.target.id}),l}}}function Qd(e){let t=[];return e.target&&t.push({path:"target",target:e.target}),e.geometry.kind==="point"&&e.geometry.target&&t.push({path:"geometry.target",target:e.geometry.target}),e.geometry.kind==="object-bounds"&&t.push({path:"geometry.target",target:e.geometry.target}),t}function el(e){let t=structuredClone(e.scene.materialAssets??[]),r=Gt(tl(e,t));if(!r.ok)throw new Error(`editor_scene_material_assets_missing: ${r.missingMaterialAssetIds.join(", ")}`);return t}function tl(e,t){let r={...e,scene:{...e.scene,materialAssets:t}};return{...r,scene:{...r.scene,gameObjects:[...r.scene.gameObjects.map(n=>{let i=_i(n,r);if(i)return{...n,overrides:i};if(!("overrides"in n))return n;let o={...n};return delete o.overrides,o}),...rl(r)]}}}function rl(e){let t=[];for(let r of e.scene.gameObjects){let n=st(e,r);!n.definition||!Ht(n.definition)||t.push(...Mi({editorDocument:e,prefabAsset:n.definition,hostGameObject:r,instanceOverrides:r.overrides,visitedPrefabIds:new Set}))}return t}function Mi(e){if(e.visitedPrefabIds.has(e.prefabAsset.id))return[];e.visitedPrefabIds.add(e.prefabAsset.id);let t=vi(wr(e.prefabAsset),at(e.prefabAsset)??""),r=t.find(o=>o.id===at(e.prefabAsset));if(!r)return e.visitedPrefabIds.delete(e.prefabAsset.id),[];let n=Gi(t,e.prefabAsset),i=[];for(let o of t){if(o.kind==="prefabInstance"&&o.childPrefabId){let d=e.editorDocument.assets.find(u=>u.id===o.childPrefabId);if(d&&Ht(d)){i.push(...Mi({editorDocument:e.editorDocument,prefabAsset:d,hostGameObject:e.hostGameObject,instanceOverrides:o.overrides,visitedPrefabIds:new Set(e.visitedPrefabIds)}));continue}continue}let a=Ml(e.hostGameObject,o);if(!a)continue;let s=o.kind==="model"&&o.sourceAssetId?e.editorDocument.assets.find(d=>d.id===o.sourceAssetId):void 0,l=jr({hostGameObject:a,prefabAsset:e.prefabAsset,rootNode:r,node:o,asset:s,editorDocument:e.editorDocument,instanceOverrides:o.id===n?e.instanceOverrides:void 0});l&&i.push({...a,overrides:l})}return e.visitedPrefabIds.delete(e.prefabAsset.id),i}function nl(e){return e.type==="glb"||e.type==="texture"}function il(e){let t=sl(e),r=e.type==="glb"?dl(e):[],n=al(e.external),i=ol(e.defaults);return{id:e.id,type:e.type,...e.guid?{guid:e.guid}:{},...t?{url:t}:{},...typeof e.warmupCount=="number"&&Number.isInteger(e.warmupCount)&&e.warmupCount>=0?{warmupCount:e.warmupCount}:{},...typeof e.singleton=="boolean"?{singleton:e.singleton}:{},...typeof e.materialMode=="string"?{materialMode:e.materialMode}:{},...i!==void 0?{defaults:i}:{},...n?{external:n}:{},...r.length>0?{materialSlots:r}:{}}}function ol(e){if(!e)return;let t=structuredClone(e);return U(t)?(delete t.shadowMapExperiment,Object.keys(t).length>0?t:void 0):t}function al(e){let t=U(e)?e:void 0,r=pe(t?.platformAssetId),n=pe(t?.assetUrl);if(!(!r&&!n))return{...r?{platformAssetId:r}:{},...n?{assetUrl:n}:{}}}function sl(e){let t=U(e.metadata)?e.metadata:void 0,r=U(e.external)?e.external:void 0;return pe(t?.url)??pe(r?.assetUrl)??void 0}function dl(e){let t=U(e.metadata)?e.metadata:void 0,r=Array.isArray(t?.materialSlots)?t.materialSlots:[],n=ll(t?.assetAnalysis);return r.flatMap(i=>{if(!U(i))return[];let o=pe(i.slotId);if(!o)return[];let a=pe(i.label),s=(Array.isArray(i.sourceSurfaces)?i.sourceSurfaces:[]).flatMap(l=>{if(!U(l))return[];let d=pe(l.ownerNodePath),u=mt(l.meshIndex),c=mt(l.primitiveIndex);if(!d||u==null||c==null)return[];let m=mt(l.nodeIndex),p=cl(Array.isArray(l.nodeIndexPath)?l.nodeIndexPath:[]),g=mt(l.sourceMaterialIndex),b=pe(l.sourceMeshName)??n.get(u);return[{ownerNodePath:d,...m==null?{}:{nodeIndex:m},...p.length>0?{nodeIndexPath:p}:{},meshIndex:u,primitiveIndex:c,...g==null?{}:{sourceMaterialIndex:g},...b?{sourceMeshName:b}:{}}]});return s.length===0?[]:[{slotId:o,...a?{label:a}:{},sourceSurfaces:s}]})}function ll(e){let t=U(e)?e:void 0,r=Array.isArray(t?.meshes)?t.meshes:[];return new Map(r.flatMap(n=>{if(!U(n))return[];let i=mt(n.meshIndex),o=pe(n.name);return i==null||!o?[]:[[i,o]]}))}function cl(e){return[...new Set(e.filter(t=>typeof t=="number"&&Number.isInteger(t)&&t>=0))]}function mt(e){return typeof e=="number"&&Number.isInteger(e)&&e>=0?e:void 0}function ul(e,t,r,n){let i=st(r,e);return(i.definition&&Ht(i.definition)?hl(e,i.definition,t,r,new Set):[fl(e,t,r,n)]).map(a=>{let s=a.kind==="instance"?r.assets.find(d=>d.id===a.instance.assetId):void 0,l=n.inferShadowMapExperimentUpdateClass?.({gameObject:e,runtimeNode:Di(a),...s?{asset:s}:{}})??bl(s);return{...a,shadowMapExperimentInferredUpdateClass:l,...Object.prototype.hasOwnProperty.call(a,"shadowMapExperimentAuthoredShadow")?{}:pl(a,r)}})}function fl(e,t,r,n={}){let i=Ir(e),o=ge(e),a=Ar(e),s=Cl(e),l=Ce(e),d=_i(e,r),u=ti(e),c=yl(r,e),m={sourceId:t.sourceId,sourceType:t.sourceType,revision:t.revision,...e.guid?{objectGuid:e.guid}:{},objectId:e.id,component:o?"ModelRenderer":a?"ImageRenderer":s||l==="primitive"?"PrimitiveRenderer":l==="transform"?"Transform":"GameObject"},p={id:e.id,...e.name?{name:e.name}:{},...e.parentId?{parentId:e.parentId}:{},...e.active===!1?{enabled:!1}:{},...e.shadow?{shadow:structuredClone(e.shadow)}:{},...c?{shadowMapExperiment:structuredClone(c)}:{},...Il(r,e),...u?{rendering:u}:{},source:m,...i&&"position"in i?{transform:{position:i.position,rotation:i.rotation,...i.scale?{scale:i.scale}:{}}}:{}};if(l==="primitive")return{...p,kind:"primitive",primitive:{shape:s?.shape??"cube"},...d?{overrides:d}:{}};if(a)return{...p,kind:"image",image:{assetId:a.assetId,size:{width:a.size.width,height:a.size.height}},...d?{overrides:d}:{}};if(!o){if(l==="transform"){let g=Pl(e,n),b=g.transformType;delete g.transformType;let S=wi(b)??wi(e.transformType);return{...p,kind:"transform",...S?{transformType:S}:{},...e.camera?{camera:Ol(e.camera)}:{},...e.light?{light:ji(e.light)}:{},...e.marker?{marker:{label:e.name||e.id,...structuredClone(e.marker)}}:{},...g,...d?{overrides:d}:{}}}return{...p,kind:"group"}}return{...p,kind:"instance",instance:{assetId:o.assetId},...d?{overrides:d}:{}}}function ml(e,t,r,n,i,o){let a=(e??[]).filter(m=>m.pluginId!==fr);if(!t)return a;let s=r,l=n.find(m=>m.id===t.lightRef),d=l?.kind==="transform"&&l.light?.type==="directional"?l:void 0;if(!l&&t.enabled)throw new Error(`shadowMapExperiment.lightMissing:${t.lightRef}`);if(l&&!d&&t.enabled)throw new Error(`shadowMapExperiment.lightUnsupported:${t.lightRef}`);let u=d?.kind==="transform"&&d.light?.type==="directional"?[d.light.direction.x,d.light.direction.y,d.light.direction.z]:[0,-1,0],c=yn({revision:typeof o=="number"&&Number.isInteger(o)&&o>=0?o:0,scopeId:i,config:t,settings:s,lightDirection:u,objects:n.filter(m=>m.kind==="instance"||m.kind==="primitive").map(m=>({entityId:m.id,renderableIds:[m.id],...m.shadowMapExperiment?{override:m.shadowMapExperiment}:{},...gl(m.shadowMapExperimentAuthoredShadow),inferredUpdateClass:m.shadowMapExperimentInferredUpdateClass??"static"}))});return[...a,{pluginId:fr,schemaVersion:3,data:c}]}function gl(e){return{...e?.cast==="none"?{cast:!1}:e?.cast==="enabled"?{cast:!0}:{},...e?.receive==="none"?{receive:!1}:e?.receive==="enabled"?{receive:!0}:{}}}function pl(e,t){let r=e.kind==="instance"?t.assets.find(i=>i.id===e.instance.assetId):void 0,n=ki(Lr(r).shadow,e.shadow);return n?{shadowMapExperimentAuthoredShadow:n}:{}}function ki(...e){let t=ce(...e),r=t?.cast,n=t?.receive;return r||n?{...r?{cast:r}:{},...n?{receive:n}:{}}:void 0}function bl(e){let t=U(e?.metadata?.assetAnalysis)?e.metadata.assetAnalysis:void 0;if(!t)return"static";let r=vr(t.skinCount),n=vr(t.morphTargetCount);return r>0||n>0?"skinned":vr(t.animationCount)>0?"dynamic":"static"}function vr(e){return typeof e=="number"&&Number.isFinite(e)&&e>=0?e:0}function Kt(...e){for(let t=e.length-1;t>=0;t-=1)if(e[t])return e[t]}function yl(e,t){let r=ge(t),n=st(e,t),i=n.sourceAsset??(r?e.assets.find(o=>o.id===r.assetId):void 0);return Kt(Ci(i),n.definition?.prefab?.defaults?.shadowMapExperiment,t.shadowMapExperiment)}function Ci(e){if(!e||!U(e.defaults))return;let t=e.defaults.shadowMapExperiment;return U(t)?t:void 0}function hl(e,t,r,n,i){return Ri({prefabAsset:t,sourceRef:r,editorDocument:n,hostGameObject:e,rootRuntimeId:e.id,rootParentId:e.parentId,rootName:e.name??t.displayName??t.id,rootTransform:Ir(e)??void 0,rootActive:e.active,rootShadow:e.shadow,sceneInstanceShadow:e.shadow,rootShadowMapExperiment:e.shadowMapExperiment,instanceOverrides:e.overrides,propertyPathPrefix:`assets.${t.id}.prefab.nodes`,visitedPrefabIds:i})}function Ri(e){if(e.visitedPrefabIds.has(e.prefabAsset.id))return[Gr({id:e.rootRuntimeId,name:e.rootName??e.prefabAsset.displayName??e.prefabAsset.id,parentId:e.rootParentId,transform:e.rootTransform,editorDocument:e.editorDocument,sourceRef:e.sourceRef,hostGameObject:e.hostGameObject,component:"PrefabCycle",propertyPath:e.propertyPathPrefix})];e.visitedPrefabIds.add(e.prefabAsset.id);let t=wr(e.prefabAsset),r=at(e.prefabAsset),n=r?t.find(d=>d.id===r):null;if(!n||t.length===0)return e.visitedPrefabIds.delete(e.prefabAsset.id),[Gr({id:e.rootRuntimeId,name:e.rootName??e.prefabAsset.displayName??e.prefabAsset.id,parentId:e.rootParentId,transform:e.rootTransform,editorDocument:e.editorDocument,sourceRef:e.sourceRef,hostGameObject:e.hostGameObject,component:"Prefab",propertyPath:e.propertyPathPrefix})];let i={instanceId:e.rootRuntimeId,rootNodeId:n.id},o=d=>kr(i,d.id),a=vi(t,n.id),s=Gi(a,e.prefabAsset),l=[];for(let d of a){let u=o(d),c=d.id===n.id?e.rootParentId:o(t.find(g=>g.id===d.parentId)??n),m=El(t,d),p=xl(t,d);if(d.kind==="prefabInstance"&&d.childPrefabId){let g=e.editorDocument.assets.find(b=>b.id===d.childPrefabId);if(g&&Ht(g)){let b=d.id===n.id;l.push(...Ri({prefabAsset:g,sourceRef:e.sourceRef,editorDocument:e.editorDocument,hostGameObject:e.hostGameObject,rootRuntimeId:u,rootParentId:c,rootName:b?e.rootName??d.name??g.displayName??g.id:d.name??g.displayName??g.id,rootTransform:b?e.rootTransform??d.transform:d.transform,rootActive:b?e.rootActive??d.defaults?.active??e.prefabAsset.prefab?.defaults?.active:d.defaults?.active,rootShadow:b?ce(e.prefabAsset.prefab?.defaults?.shadow,d.defaults?.shadow,e.rootShadow):d.defaults?.shadow,inheritedShadowParticipationLayers:[e.prefabAsset.prefab?.defaults?.shadow,...p,d.defaults?.shadow,...e.inheritedShadowParticipationLayers??[]],sceneInstanceShadow:e.sceneInstanceShadow,inheritedShadowMapExperiment:Kt(e.prefabAsset.prefab?.defaults?.shadowMapExperiment,e.inheritedShadowMapExperiment,m,d.defaults?.shadowMapExperiment),rootShadowMapExperiment:e.rootShadowMapExperiment,instanceOverrides:b?gt(gt(de(e.prefabAsset.prefab?.overrides),de(d.overrides)),de(e.instanceOverrides)):d.overrides,propertyPathPrefix:`${e.propertyPathPrefix}.${d.id}.childPrefab.nodes`,visitedPrefabIds:new Set(e.visitedPrefabIds)}));continue}l.push(Gr({id:u,name:d.name??d.childPrefabId??"Prefab Instance",parentId:c,transform:d.transform,sourceRef:e.sourceRef,editorDocument:e.editorDocument,hostGameObject:e.hostGameObject,component:"UnsupportedPrefabInstance",propertyPath:`${e.propertyPathPrefix}.${d.id}`}));continue}l.push(Sl({node:d,rootNode:n,identityScope:i,prefabAsset:e.prefabAsset,runtimeId:u,parentId:c,sourceRef:e.sourceRef,editorDocument:e.editorDocument,hostGameObject:e.hostGameObject,rootRuntimeName:e.rootName,rootRuntimeTransform:e.rootTransform,rootRuntimeActive:e.rootActive,rootRuntimeShadow:e.rootShadow,inheritedShadowParticipationLayers:e.inheritedShadowParticipationLayers,compositionAncestorShadowParticipationLayers:p,sceneInstanceShadow:e.sceneInstanceShadow,inheritedShadowMapExperiment:e.inheritedShadowMapExperiment,compositionAncestorShadowMapExperiment:m,rootRuntimeShadowMapExperiment:e.rootShadowMapExperiment,instanceOverrides:d.id===s?e.instanceOverrides:void 0,propertyPath:`${e.propertyPathPrefix}.${d.id}`}))}return e.visitedPrefabIds.delete(e.prefabAsset.id),wl({compiledNodes:l,editorDocument:e.editorDocument,hostGameObject:e.hostGameObject})}function Sl(e){let t=e.node.id===e.rootNode.id,r=t?e.rootRuntimeTransform??e.node.transform:e.node.transform,n=e.node.kind==="model"&&e.node.sourceAssetId?e.editorDocument.assets.find(o=>o.id===e.node.sourceAssetId):void 0,i=Ni({id:e.runtimeId,name:t?e.rootRuntimeName??e.node.name??e.prefabAsset.displayName??e.prefabAsset.id:e.node.name,parentId:e.parentId,transform:r,active:t?e.rootRuntimeActive??e.node.defaults?.active??e.prefabAsset.prefab?.defaults?.active:e.node.defaults?.active,shadow:t?ce(e.prefabAsset.prefab?.defaults?.shadow,e.node.defaults?.shadow,e.rootRuntimeShadow):ce(e.prefabAsset.prefab?.defaults?.shadow,e.node.defaults?.shadow),shadowMapExperimentAuthoredShadow:ki(Lr(n).shadow,e.prefabAsset.prefab?.defaults?.shadow,...e.compositionAncestorShadowParticipationLayers??[],e.node.defaults?.shadow,...e.inheritedShadowParticipationLayers??[],e.sceneInstanceShadow)??{},shadowMapExperiment:Kt(Ci(n),e.prefabAsset.prefab?.defaults?.shadowMapExperiment,e.inheritedShadowMapExperiment,e.compositionAncestorShadowMapExperiment,e.node.defaults?.shadowMapExperiment,e.rootRuntimeShadowMapExperiment),sourceAsset:n,editorDocument:e.editorDocument,sourceRef:e.sourceRef,hostGameObject:e.hostGameObject,component:e.node.kind==="model"?"PrefabModel":e.node.kind==="primitive"?"PrefabPrimitive":e.node.kind==="light"?"PrefabLight":e.node.kind==="marker"?"PrefabMarker":"PrefabNode",propertyPath:e.propertyPath});if(e.node.kind==="model"&&e.node.sourceAssetId){let o=jr({hostGameObject:e.hostGameObject,prefabAsset:e.prefabAsset,rootNode:e.rootNode,node:e.node,asset:n,editorDocument:e.editorDocument,instanceOverrides:e.instanceOverrides});return{...i,kind:"instance",instance:{assetId:e.node.sourceAssetId},...o?{overrides:o}:{}}}if(e.node.kind==="primitive"){let o=jr({hostGameObject:e.hostGameObject,prefabAsset:e.prefabAsset,rootNode:e.rootNode,node:e.node,asset:void 0,editorDocument:e.editorDocument,instanceOverrides:e.instanceOverrides});return{...i,kind:"primitive",primitive:{shape:e.node.primitive?.shape??"cube"},...o?{overrides:o}:{}}}return e.node.kind==="light"?{...i,kind:"transform",transformType:"light",...e.node.light?{light:ji(e.node.light)}:{}}:e.node.kind==="marker"&&e.node.marker?{...i,kind:"transform",marker:{label:e.node.name??e.node.id,...ni(e.node.marker,e.identityScope)}}:{...i,kind:"group"}}function El(e,t){let r=new Map(e.map(o=>[o.id,o])),n=[],i=t.parentId?r.get(t.parentId):void 0;for(;i;)n.unshift(i),i=i.parentId?r.get(i.parentId):void 0;return Kt(...n.map(o=>o.defaults?.shadowMapExperiment))}function xl(e,t){let r=new Map(e.map(o=>[o.id,o])),n=[],i=t.parentId?r.get(t.parentId):void 0;for(;i;)n.unshift(i),i=i.parentId?r.get(i.parentId):void 0;return n.map(o=>o.defaults?.shadow)}function Gr(e){return{...Ni({id:e.id,name:e.name,parentId:e.parentId,transform:e.transform,editorDocument:e.editorDocument,sourceRef:e.sourceRef,hostGameObject:e.hostGameObject,component:e.component,propertyPath:e.propertyPath}),kind:"group"}}function Pl(e,t){let r=t.readCustomTransformRuntimeData?.(e);return r&&typeof r=="object"&&!Array.isArray(r)?structuredClone(r):{}}function Ni(e){return{id:e.id,...e.name?{name:e.name}:{},...e.parentId?{parentId:e.parentId}:{},...e.active===!1?{enabled:!1}:{},...e.shadow?{shadow:structuredClone(e.shadow)}:{},...Object.prototype.hasOwnProperty.call(e,"shadowMapExperimentAuthoredShadow")?{shadowMapExperimentAuthoredShadow:structuredClone(e.shadowMapExperimentAuthoredShadow??{})}:{},...e.shadowMapExperiment?{shadowMapExperiment:structuredClone(e.shadowMapExperiment)}:{},...Al(e),source:{sourceId:e.sourceRef.sourceId,sourceType:e.sourceRef.sourceType,revision:e.sourceRef.revision,...e.hostGameObject.guid?{objectGuid:e.hostGameObject.guid}:{},objectId:e.hostGameObject.id,component:e.component,propertyPath:e.propertyPath},...e.transform&&"position"in e.transform?{transform:{position:e.transform.position,rotation:e.transform.rotation,...e.transform.scale?{scale:e.transform.scale}:{}}}:{}}}function Il(e,t){let r=Bt({document:e,casterId:t.id,caster:t});return Fr(r,!!t.shadow)?{shadowPlan:r}:{}}function Al(e){if(!e.editorDocument)return{};let t=ne(e.shadow),r=Lr(e.sourceAsset),n=!!e.shadow||!!t.shadow||!!r.shadow;if(!n&&t.diagnostics.length===0&&r.diagnostics.length===0)return{};let i=Bt({document:e.editorDocument,casterId:e.hostGameObject.id,caster:e.hostGameObject,settings:{source:r.shadow,instance:t.shadow}}),o={...i,casterId:e.id,diagnostics:[...r.diagnostics,...t.diagnostics,...i.diagnostics].map(a=>({...a,casterId:a.casterId===e.hostGameObject.id||!a.casterId?e.id:a.casterId}))};return Fr(o,n)?{shadowPlan:o}:{}}function Lr(e){if(!e)return{diagnostics:[]};let t=e?.defaults&&typeof e.defaults=="object"&&!Array.isArray(e.defaults)?e.defaults:void 0;if(!t)return{diagnostics:[]};let r=ne(t.shadow);return{shadow:r.shadow,diagnostics:r.diagnostics.map(n=>({...n,details:{...n.details??{},source:"asset",assetId:e.id}}))}}function Fr(e,t){return t||e.backend!=="none"||e.diagnostics.length>0}function wl(e){if(e.compiledNodes.length===0)return e.compiledNodes;let t=new Set(e.compiledNodes.map(a=>a.id)),r=e.compiledNodes.map(a=>Tl(a)),n={...e.editorDocument,scene:{...e.editorDocument.scene,gameObjects:[...e.editorDocument.scene.gameObjects.filter(a=>!t.has(a.id)),...r]}},i=e.compiledNodes.filter(a=>a.shadow?.receive==="enabled").map(a=>a.id),o=r.find(a=>a.light?.type==="directional"&&a.active!==!1)?.id;return e.compiledNodes.map((a,s)=>{let l=r[s],d=Bt({document:n,casterId:a.id,caster:l,explicitReceiverIds:i,...o?{defaultLightId:o}:{}}),u=!!a.shadow;if(!Fr(d,u)){if(!a.shadowPlan)return a;let c={...a};return delete c.shadowPlan,c}return{...a,shadowPlan:d}})}function Tl(e){let t=[];return e.transform&&t.push({type:"Transform",position:e.transform.position,rotation:e.transform.rotation,...e.transform.scale?{scale:e.transform.scale}:{}}),e.kind==="instance"&&t.push({type:"ModelRenderer",assetId:e.instance.assetId}),e.kind==="image"&&t.push({type:"ImageRenderer",assetId:e.image.assetId,size:structuredClone(e.image.size)}),{id:e.id,...e.name?{name:e.name}:{},kind:e.kind==="image"?"transform":e.kind,...e.parentId?{parentId:e.parentId}:{},...e.enabled===!1?{active:!1}:{},...e.shadow?{shadow:structuredClone(e.shadow)}:{},...e.kind==="primitive"?{primitive:{shape:e.primitive.shape}}:{},...e.kind==="transform"&&e.transformType?{transformType:e.transformType}:{},...e.kind==="transform"&&e.light?{light:e.light}:{},...e.kind==="transform"&&e.camera?{camera:e.camera}:{},...e.kind==="transform"&&e.marker?{marker:structuredClone(e.marker)}:{},components:t}}function jr(e){let t=e.node.kind==="model"&&e.node.sourceAssetId?$i(e.hostGameObject,e.node,e.node.sourceAssetId):e.hostGameObject,r=e.asset?.id,n=kl([_r(de(e.prefabAsset.prefab?.overrides),e.prefabAsset.prefab?.sourceAssetId,e.asset),_r(de(e.rootNode.overrides),e.rootNode.kind==="model"?e.rootNode.sourceAssetId:e.prefabAsset.prefab?.sourceAssetId,e.asset),e.node.id===e.rootNode.id?void 0:_r(de(e.node.overrides),e.node.kind==="model"?e.node.sourceAssetId:r,e.asset)]),i=de(e.instanceOverrides);return Oi(gt(n,i),e.asset)}function _r(e,t,r){return Oi(e,t&&t===r?.id?r:void 0)}function Oi(e,t){if(!e?.materialSlotBindings)return e;let r=U(t?.metadata)&&Array.isArray(t.metadata.materialSlots)?t.metadata.materialSlots:[],n=new Set(r.flatMap(a=>{let s=U(a)&&typeof a.slotId=="string"?a.slotId.trim():"";return s?[s]:[]})),i=Object.fromEntries(Object.entries(e.materialSlotBindings).filter(([a])=>n.has(a))),o=structuredClone(e);return Object.keys(i).length>0?o.materialSlotBindings=i:delete o.materialSlotBindings,Object.keys(o).length>0?o:void 0}function $i(e,t,r){return{id:`${e.id}:${t.id}`,...t.name?{name:t.name}:{},kind:"instance",components:[...t.transform?[t.transform]:[],{type:"ModelRenderer",assetId:r}]}}function Dl(e,t){return{id:`${e.id}:${t.id}`,...t.name?{name:t.name}:{},kind:"primitive",primitive:{shape:t.primitive?.shape??"cube"},components:[...t.transform?[t.transform]:[]]}}function Ml(e,t){return t.kind==="model"&&t.sourceAssetId?$i(e,t,t.sourceAssetId):t.kind==="primitive"?Dl(e,t):null}function kl(e){let t;for(let r of e){let n=de(r);n&&(t=gt(t,n))}return t}function vi(e,t){let r=new Map;for(let s of e){if(!s.parentId)continue;let l=r.get(s.parentId)??[];l.push(s),r.set(s.parentId,l)}let n=[],i=new Set,o=s=>{if(!i.has(s.id)){i.add(s.id),n.push(s);for(let l of r.get(s.id)??[])o(l)}},a=e.find(s=>s.id===t);a&&o(a);for(let s of e)o(s);return n}function Gi(e,t){let r=t.prefab?.sourceAssetId;return e.find(n=>n.kind==="model"&&n.sourceAssetId===r)?.id??e.find(n=>n.kind==="model")?.id}function Ht(e){return _t(e)&&e.prefab.compositionVersion===jt&&Array.isArray(e.prefab.nodes)&&e.prefab.nodes.length>0&&!!at(e)}function Cl(e){return e.primitive??null}function _i(e,t){let r=Ce(e);if(r!=="instance"&&r!=="transform"&&r!=="primitive")return;let n=ge(e),i=n?t.assets.find(o=>o.id===n.assetId):void 0;return Rl(e,t,i)}function Rl(e,t,r){let n=de(e.overrides),i=st(t,e),o=de(i.definition?.prefab?.overrides);return gt(o,n)}function gt(e,t){let r=ei(e,t);for(let n of[e,t])if(n)for(let[i,o]of Object.entries(n))Nl(i)||o===void 0||(r??={},r[i]=structuredClone(o));return r&&Object.keys(r).length>0?r:void 0}function de(e){if(!U(e))return;let t=structuredClone(e);return Object.keys(t).length>0?t:void 0}function Nl(e){return e==="materialBinding"||e==="materialSlotBindings"}function U(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}function pe(e){return(typeof e=="string"?e.trim():"")||void 0}function wi(e){return typeof e=="string"?e:void 0}function Ol(e){let t=structuredClone(e);return delete t.inspectorLanguage,t}function ji(e){return e.type==="directional"?ve({schemaVersion:1,type:"directional",intensity:e.intensity,direction:Je(e.direction),diffuseColor:e.diffuseColor??di.diffuseColor}):ve({schemaVersion:1,type:"hemispheric",intensity:e.intensity,diffuseColor:e.diffuseColor??Cr.diffuseColor,groundColor:e.groundColor??Cr.groundColor})}function $l(e){return typeof e=="number"&&Number.isFinite(e)?e:null}function Li(e){let t=$l(e);if(t==null)return null;let r=t%360;r>180&&(r-=360),r<=-180&&(r+=360);let n=vl(r);return Object.is(n,-0)?0:n}function vl(e){return Math.round(e*1e3)/1e3}var Gl=new Set(["leftToRight","rightToLeft","bottomToTop","topToBottom"]);function zi(e){let t=Er(e),r={uiKind:e.uiKind,size:{width:e.size.width,depth:e.size.depth},layers:e.layers.map((n,i)=>_l(n,i)),rendering:{textureWidth:t.width,textureHeight:t.height}};return e.aspectSourceLayerId&&(r.aspectSourceLayerId=e.aspectSourceLayerId),typeof e.lockAspectToBorder=="boolean"&&(r.lockAspectToBorder=e.lockAspectToBorder),e.mask&&(r.mask={...typeof e.mask.enabled=="boolean"?{enabled:e.mask.enabled}:{},...e.mask.source==="roundedRect"||e.mask.source==="borderAlpha"||e.mask.source==="texture"?{source:e.mask.source}:{},...e.mask.textureId?{textureId:e.mask.textureId}:{},...typeof e.mask.cornerRadius=="number"&&Number.isFinite(e.mask.cornerRadius)?{cornerRadius:e.mask.cornerRadius}:{},...typeof e.mask.padding=="number"&&Number.isFinite(e.mask.padding)?{padding:e.mask.padding}:{}}),e.rendering&&(r.rendering={...r.rendering,...typeof e.rendering.alphaIndex=="number"&&Number.isFinite(e.rendering.alphaIndex)?{alphaIndex:e.rendering.alphaIndex}:{},...typeof e.rendering.diffuseTextureLevel=="number"&&Number.isFinite(e.rendering.diffuseTextureLevel)?{diffuseTextureLevel:e.rendering.diffuseTextureLevel}:{},...typeof e.rendering.emissiveTextureLevel=="number"&&Number.isFinite(e.rendering.emissiveTextureLevel)?{emissiveTextureLevel:e.rendering.emissiveTextureLevel}:{}}),r}function _l(e,t){let r=Li(e.rotationDeg??0)??0,n={id:e.id,role:e.role,zOrder:typeof e.zOrder=="number"&&Number.isFinite(e.zOrder)?e.zOrder:t,rect:jl(e.rect),...r!==0?{rotationDeg:r}:{},...typeof e.enabled=="boolean"?{enabled:e.enabled}:{},...typeof e.opacity=="number"&&Number.isFinite(e.opacity)?{opacity:e.opacity}:{}};return e.kind==="texture"?{...n,kind:"texture",...e.textureId?{textureId:e.textureId}:{},...e.tint?{tint:Ve(e.tint)}:{},...e.imageFit?{imageFit:e.imageFit}:{}}:e.kind==="textureProgress"?{...n,kind:"textureProgress",...e.textureId?{textureId:e.textureId}:{},value:Ui(e.value),...e.tint?{tint:Ve(e.tint)}:{},...e.imageFit?{imageFit:e.imageFit}:{},...Fi(e.direction)?{direction:e.direction}:{}}:e.kind==="color"?{...n,kind:"color",color:Ve(e.color)}:e.kind==="progress"?{...n,kind:"progress",value:Ui(e.value??0),color:Ve(e.color),...Fi(e.direction)?{direction:e.direction}:{}}:{...n,kind:"text",text:{value:e.text.value,color:Ve(e.text.color),...e.text.fontFamily?{fontFamily:e.text.fontFamily}:{},...typeof e.text.fontSize=="number"&&Number.isFinite(e.text.fontSize)?{fontSize:e.text.fontSize}:{},...e.text.fontWeight!=null?{fontWeight:String(e.text.fontWeight)}:{},...e.text.strokeColor?{strokeColor:Ve(e.text.strokeColor)}:{},...typeof e.text.strokeWidth=="number"&&Number.isFinite(e.text.strokeWidth)?{strokeWidth:e.text.strokeWidth}:{},...e.text.align==="left"||e.text.align==="center"||e.text.align==="right"?{align:e.text.align}:{},...e.text.baseline==="top"||e.text.baseline==="middle"||e.text.baseline==="bottom"?{baseline:e.text.baseline}:{}}}}function jl(e){return{x:e.x,z:e.z,width:e.width,depth:e.depth}}function Ve(e){return{r:e.r,g:e.g,b:e.b,...typeof e.a=="number"?{a:e.a}:{}}}function Fi(e){return typeof e=="string"&&Gl.has(e)}function Ui(e){return Number.isFinite(e)?Math.max(0,Math.min(1,e)):0}var Bi=["model","texture","image","sound"],Ur=[".glb",".gltf"],Vi=[".png",".jpg",".jpeg",".webp"],Ll=[".env",".hdr",".dds",".ktx",".ktx2"],zr=[...Vi,...Ll],Br=[".mp3",".wav",".ogg",".flac",".aac",".m4a"],Vr=[...Ur,...zr,...Br];function Fl(e){return String(e??"").trim().toLowerCase().replace(/-/g,"")}function Kr(e,t){let r=Fl(t);return`${e==="model"?"asset":e==="texture"?"texture":e==="sound"?"sound":"image"}_${r}`}function Hr(e){let i=String(e??"").trim().split(/[^a-zA-Z0-9_$]+/).filter(Boolean).map((o,a)=>a===0?o:`${o.charAt(0).toUpperCase()}${o.slice(1)}`).join("").replace(/[^a-zA-Z0-9_$]/g,"")||"assetUrl";return/^[a-zA-Z_$]/.test(i)?i:`asset${i}`}function Wr(e,t=""){let r=String(e??"").trim().toLowerCase();if(r==="glb"||r==="gltf"||r==="model")return"model";if(r==="groundtexture"||r==="ground-texture"||r==="texture")return"texture";if(r==="ui"||r==="image"||r==="img")return"image";if(r==="audio"||r==="sound")return"sound";let n=Ul(t);return Ur.includes(n)?"model":Br.includes(n)?"sound":zr.includes(n)?"texture":null}function Ul(e){let t=e.split(/[?#]/,1)[0]??"",r=Math.max(t.lastIndexOf("/"),t.lastIndexOf("\\")),n=t.slice(r+1),i=n.lastIndexOf(".");return i>=0?n.slice(i).toLowerCase():""}function Ki(e){let t=String(e??"").trim(),r=t.toLowerCase();for(let n of[...Vr].sort((i,o)=>o.length-i.length))if(r.endsWith(n)){t=t.slice(0,-n.length);break}return t}function Hi(e,t){return String(e??"").trim()||Ki(t)||"Asset"}function Wi(e,t){return Ki(e||t).trim().toLowerCase().normalize("NFKD").replace(/[^a-z0-9]+/g,"_").replace(/^_+|_+$/g,"").replace(/_{2,}/g,"_")||null}function qi(e){return e==="model"?Ur:e==="sound"?Br:e==="texture"?zr:e==="image"?Vi:[]}function Ji(e){let t=typeof e=="string"&&e.trim()?e.trim():void 0;if(!t)return;if(t.includes("\0"))throw new Error("external_asset_path_must_be_portable");let r=t.replace(/\\/g,"/");if(r.startsWith("/")||/^[a-z]:\//i.test(r)||/^[a-z][a-z0-9+.-]*:/i.test(r))throw new Error("external_asset_path_must_be_portable");let n=[];for(let i of r.split("/"))if(!(!i||i===".")){if(i==="..")throw new Error("external_asset_path_must_be_portable");n.push(i)}if(n.length===0)throw new Error("external_asset_path_must_be_portable");return n.join("/")}function Wt(e,t={}){let r=t.generatedBy??"scripts/register-asset.mjs",n=t.codeKeyPolicy??"legacy",i=e.filter(d=>d.codeKey);if(n==="disabled"&&i.length>0){let d=i[0];throw Object.assign(new Error("manifest_code_key_disabled"),{name:"PlayableEditorAssetCatalogGenerationError",details:{codeKeyPolicy:n,assetId:d.assetId,codeKey:d.codeKey}})}let o=e.map(d=>`import ${Hr(d.assetId)} from ${JSON.stringify(`${d.relativePath}?url`)};`).join(`
4
+ `),a=e.map(d=>{let u=gr(d.relativePath);if(!u)throw new Error(`Generated asset catalog entry has no file extension: ${d.assetId}`);if(!pr(u))throw new Error(`Generated asset catalog entry has unsupported format: ${d.assetId} (${u})`);let c=[`guid: ${JSON.stringify(d.guid)}`,`assetId: ${JSON.stringify(d.assetId)}`,`kind: ${JSON.stringify(d.kind)}`,`displayName: ${JSON.stringify(d.displayName)}`,`url: ${Hr(d.assetId)}`,`format: ${JSON.stringify(u)}`,`relativePath: ${JSON.stringify(d.relativePath)}`,d.originalFileName?`originalFileName: ${JSON.stringify(d.originalFileName)}`:"",d.codeKey?`codeKey: ${JSON.stringify(d.codeKey)}`:"",d.category?`category: ${JSON.stringify(d.category)}`:"",typeof d.placeable=="boolean"?`placeable: ${JSON.stringify(d.placeable)}`:"",typeof d.warmupCount=="number"?`warmupCount: ${JSON.stringify(d.warmupCount)}`:"",typeof d.singleton=="boolean"?`singleton: ${JSON.stringify(d.singleton)}`:"",d.materialMode?`materialMode: ${JSON.stringify(d.materialMode)}`:"",d.defaults?`defaults: ${JSON.stringify(d.defaults)}`:"",d.contentHash?`contentHash: ${JSON.stringify(d.contentHash)}`:"",typeof d.byteSize=="number"?`byteSize: ${JSON.stringify(d.byteSize)}`:"",d.external?`external: ${JSON.stringify(d.external)}`:"",d.metadata?`metadata: ${JSON.stringify(d.metadata)}`:"",d.createdAt?`createdAt: ${JSON.stringify(d.createdAt)}`:"",d.updatedAt?`updatedAt: ${JSON.stringify(d.updatedAt)}`:""].filter(Boolean).join(", ");return` ${JSON.stringify(d.assetId)}: { ${c} },`}).join(`
5
5
  `),s=new Map;for(let d of i)s.set(d.codeKey,d.assetId);let l=[...s].map(([d,u])=>` ${JSON.stringify(d)}: ${JSON.stringify(u)},`).join(`
6
- `);return[`// This file is generated by ${n}.`,"// Do not edit by hand.","",o,"",'export type GeneratedAssetCatalogKind = "model" | "texture" | "image" | "sound";',"","export interface GeneratedAssetCatalogEntry {"," guid: string;"," assetId: string;"," kind: GeneratedAssetCatalogKind;"," displayName: string;"," url: string;"," format: `.${string}`;"," relativePath: string;"," originalFileName?: string;",...r==="legacy"?[" /** @deprecated Use the canonical assetId for persisted and runtime identity. */"," codeKey?: string;"]:[]," category?: string;"," placeable?: boolean;"," warmupCount?: number;"," singleton?: boolean;"," materialMode?: string;"," defaults?: Record<string, unknown>;"," contentHash?: string;"," byteSize?: number;"," external?: { platformAssetId?: string; assetPath?: string; assetUrl?: string };"," metadata?: Record<string, unknown>;"," createdAt?: string;"," updatedAt?: string;","}","","export const GENERATED_ASSET_CATALOG: Record<string, GeneratedAssetCatalogEntry> = {",a,"};","","export const GENERATED_ASSET_URL_MAP = Object.fromEntries("," Object.entries(GENERATED_ASSET_CATALOG).map(([assetId, entry]) => [assetId, entry.url]),",") as Record<string, string>;","","export const GENERATED_MODEL_ASSET_URL_MAP = Object.fromEntries(",' Object.entries(GENERATED_ASSET_CATALOG).filter(([, entry]) => entry.kind === "model").map(([assetId, entry]) => [assetId, entry.url]),',") as Record<string, string>;","","export const GENERATED_TEXTURE_ASSET_URL_MAP = Object.fromEntries(",' Object.entries(GENERATED_ASSET_CATALOG).filter(([, entry]) => entry.kind === "texture").map(([assetId, entry]) => [assetId, entry.url]),',") as Record<string, string>;","","export const GENERATED_IMAGE_ASSET_URL_MAP = Object.fromEntries(",' Object.entries(GENERATED_ASSET_CATALOG).filter(([, entry]) => entry.kind === "image").map(([assetId, entry]) => [assetId, entry.url]),',") as Record<string, string>;","","export const GENERATED_SOUND_ASSET_URL_MAP = Object.fromEntries(",' Object.entries(GENERATED_ASSET_CATALOG).filter(([, entry]) => entry.kind === "sound").map(([assetId, entry]) => [assetId, entry.url]),',") as Record<string, string>;","","/** @deprecated Resolve assets by canonical assetId through GENERATED_ASSET_CATALOG. */","export const ASSET_IDS = {",l,"} as const satisfies Record<string, string>;"].join(`
6
+ `);return[`// This file is generated by ${r}.`,"// Do not edit by hand.","",o,"",'export type GeneratedAssetCatalogKind = "model" | "texture" | "image" | "sound";',"","export interface GeneratedAssetCatalogEntry {"," guid: string;"," assetId: string;"," kind: GeneratedAssetCatalogKind;"," displayName: string;"," url: string;"," format: `.${string}`;"," relativePath: string;"," originalFileName?: string;",...n==="legacy"?[" /** @deprecated Use the canonical assetId for persisted and runtime identity. */"," codeKey?: string;"]:[]," category?: string;"," placeable?: boolean;"," warmupCount?: number;"," singleton?: boolean;"," materialMode?: string;"," defaults?: Record<string, unknown>;"," contentHash?: string;"," byteSize?: number;"," external?: { platformAssetId?: string; assetPath?: string; assetUrl?: string };"," metadata?: Record<string, unknown>;"," createdAt?: string;"," updatedAt?: string;","}","","export const GENERATED_ASSET_CATALOG: Record<string, GeneratedAssetCatalogEntry> = {",a,"};","","export const GENERATED_ASSET_URL_MAP = Object.fromEntries("," Object.entries(GENERATED_ASSET_CATALOG).map(([assetId, entry]) => [assetId, entry.url]),",") as Record<string, string>;","","export const GENERATED_MODEL_ASSET_URL_MAP = Object.fromEntries(",' Object.entries(GENERATED_ASSET_CATALOG).filter(([, entry]) => entry.kind === "model").map(([assetId, entry]) => [assetId, entry.url]),',") as Record<string, string>;","","export const GENERATED_TEXTURE_ASSET_URL_MAP = Object.fromEntries(",' Object.entries(GENERATED_ASSET_CATALOG).filter(([, entry]) => entry.kind === "texture").map(([assetId, entry]) => [assetId, entry.url]),',") as Record<string, string>;","","export const GENERATED_IMAGE_ASSET_URL_MAP = Object.fromEntries(",' Object.entries(GENERATED_ASSET_CATALOG).filter(([, entry]) => entry.kind === "image").map(([assetId, entry]) => [assetId, entry.url]),',") as Record<string, string>;","","export const GENERATED_SOUND_ASSET_URL_MAP = Object.fromEntries(",' Object.entries(GENERATED_ASSET_CATALOG).filter(([, entry]) => entry.kind === "sound").map(([assetId, entry]) => [assetId, entry.url]),',") as Record<string, string>;","","/** @deprecated Resolve assets by canonical assetId through GENERATED_ASSET_CATALOG. */","export const ASSET_IDS = {",l,"} as const satisfies Record<string, string>;"].join(`
7
7
  `)+`
8
- `}import ir from"node:crypto";import N from"node:fs/promises";import R from"node:path";import Jn from"node:fs/promises";import W from"node:path";var Yn=5;async function qt(e){let t={...e.existingMetadata??{},...e.payloadMetadata??{}},n=await Fl(e);if(n?(t.assetAnalysis=n,t.assetAnalysisStatus="complete"):(delete t.assetAnalysis,t.assetAnalysisStatus="unavailable"),e.kind==="texture"||e.kind==="image"){let i=cc(e.sourcePath,t);return i&&(t.textureUsage=i.usage,t.capabilities={...F(t.capabilities)?t.capabilities:{},materialTexture:i.materialTexture,environmentTexture:i.environmentTexture}),Object.keys(t).length>0?t:null}if(e.kind!=="model")return Object.keys(t).length>0?t:null;t.assetMetadataVersion=Yn;let r=await Ul(e.sourcePath,{assetGuid:e.guid,assetId:e.assetId,cwd:e.cwd,assetsDir:e.assetsDir,existingMaterialSlots:t.materialSlots});return r.length===0?delete t.materialSlots:t.materialSlots=r,Object.keys(t).length>0?t:null}async function Fl(e){return e.kind==="model"?zl(e.sourcePath):e.kind==="texture"||e.kind==="image"?Bl(e.sourcePath):null}async function Ul(e,t={}){try{let n=await Qi(e);return ec(n,{...t,sourcePath:e})}catch{return[]}}async function Qi(e){let t=W.extname(e).toLowerCase();if(t===".gltf")return JSON.parse(await Jn.readFile(e,"utf8"));if(t!==".glb")return null;let n=await Jn.readFile(e);if(n.length<20||n.toString("utf8",0,4)!=="glTF"||n.readUInt32LE(4)!==2||n.readUInt32LE(8)>n.length)return null;let o=12;for(;o+8<=n.length;){let a=n.readUInt32LE(o),s=n.readUInt32LE(o+4);if(o+=8,o+a>n.length)return null;if(s===1313821514){let l=n.toString("utf8",o,o+a).replace(/\0+$/g,"");return JSON.parse(l)}o+=a}return null}async function zl(e){try{let t=await Qi(e);if(!t||typeof t!="object")return null;let n=Array.isArray(t.scenes)?t.scenes:[],r=Array.isArray(t.nodes)?t.nodes:[],i=Array.isArray(t.meshes)?t.meshes:[],o=Array.isArray(t.materials)?t.materials:[],a=Array.isArray(t.textures)?t.textures:[],s=Array.isArray(t.images)?t.images:[],l=Array.isArray(t.animations)?t.animations:[],d=Array.isArray(t.skins)?t.skins:[],u=Array.isArray(t.accessors)?t.accessors:[],c=io(t),m=oo(r),p=new Set(c),g=i.reduce((w,M)=>w+(Array.isArray(M?.primitives)?M.primitives.length:0),0),b=i.reduce((w,M)=>w+(Array.isArray(M?.primitives)?M.primitives.reduce((O,z)=>O+(Array.isArray(z?.targets)?z.targets.length:0),0):0),0),S=ql({nodeCount:r.length,meshCount:i.length,primitiveCount:g,materialCount:o.length,textureCount:a.length,imageCount:s.length}),x=Jl({nodeCount:r.length,meshCount:i.length,primitiveCount:g,materialCount:o.length,textureCount:a.length,imageCount:s.length,animationCount:l.length,skinCount:d.length,morphTargetCount:b,complexity:S});return{kind:"gltf",format:W.extname(e).toLowerCase()===".gltf"?"gltf":"glb",summary:`${r.length} nodes, ${i.length} meshes, ${g} primitives, ${o.length} materials`,complexity:S,sceneCount:n.length,nodeCount:r.length,meshCount:i.length,primitiveCount:g,materialCount:o.length,textureCount:a.length,imageCount:s.length,animationCount:l.length,skinCount:d.length,morphTargetCount:b,nodes:Vl(r,i,o,u,m,p),meshes:Kl(i,o,u),materials:Hl(t),diagnostics:x}}catch{return null}}async function Bl(e){try{let t=await Jn.readFile(e),n=W.extname(e).toLowerCase(),r=n===".png"?Yl(t):n===".jpg"||n===".jpeg"?Xl(t):n===".webp"?Zl(t):null;if(!r)return null;let i=Ql(r);return{kind:"image",format:r.format,summary:`${r.width}x${r.height} ${r.mime}`,complexity:r.estimatedPixels>=4096*4096?"high":r.estimatedPixels>=2048*2048?"medium":"low",width:r.width,height:r.height,mime:r.mime,bitDepth:r.bitDepth,hasAlpha:r.hasAlpha,estimatedPixels:r.estimatedPixels,diagnostics:i}}catch{return null}}function Vl(e,t,n,r,i,o){return e.slice(0,100).map((a,s)=>{let l=Number.isInteger(a?.mesh)?a.mesh:-1,d=l>=0&&l<t.length?t[l]:null,u=Array.isArray(a?.children)?a.children.filter(p=>Number.isInteger(p)):[],c=ao(e,i,o,s),m={nodeIndex:s,nodeIndexPath:lo(i,s),...typeof a?.name=="string"&&a.name.trim()?{name:a.name.trim()}:{},...c?{ownerNodePath:c}:{},...u.length>0?{children:u}:{}};if(d){let p=eo(d,n,r);Object.assign(m,{meshIndex:l,...typeof d?.name=="string"&&d.name.trim()?{meshName:d.name.trim()}:{},primitiveCount:p.length,...p.length>0?{primitives:p}:{}})}return m})}function Kl(e,t,n){return e.slice(0,50).map((r,i)=>{let o=Array.isArray(r?.primitives)?r.primitives:[],a=[...new Set(o.map(l=>Number.isInteger(l?.material)?l.material:-1).filter(l=>l>=0))],s=eo(r,t,n);return{meshIndex:i,...typeof r?.name=="string"&&r.name.trim()?{name:r.name.trim()}:{},primitiveCount:o.length,...s.length>0?{primitives:s}:{},...a.length>0?{materialIndices:a}:{},...a.length>0?{materialNames:a.map(l=>{let d=t[l];return typeof d?.name=="string"?d.name.trim():""}).filter(Boolean)}:{}}})}function eo(e,t,n){let r=F(e)?e:{};return(Array.isArray(r.primitives)?r.primitives:[]).map((o,a)=>{let s=Number.isInteger(o?.material)?o.material:-1,l=s>=0?t[s]:null,d=typeof l?.name=="string"&&l.name.trim()?l.name.trim():"",u=co(o,n),c=uo(o,n);return{primitiveIndex:a,...Number.isInteger(o?.mode)?{mode:o.mode}:{},...s>=0?{sourceMaterialIndex:s}:{},...d?{materialName:d}:{},...Number.isFinite(u)?{triangleCount:u}:{},...c?{boundingBox:c}:{}}})}function Hl(e){return(Array.isArray(e?.materials)?e.materials:[]).slice(0,50).map((n,r)=>{let i=n?.pbrMetallicRoughness&&typeof n.pbrMetallicRoughness=="object"?n.pbrMetallicRoughness:{},o=Wl(n,i);return{sourceMaterialIndex:r,...typeof n?.name=="string"&&n.name.trim()?{materialName:n.name.trim()}:{},...Array.isArray(i.baseColorFactor)?{baseColorFactor:i.baseColorFactor.slice(0,4)}:{},metallicFactor:Number.isFinite(i.metallicFactor)?i.metallicFactor:1,roughnessFactor:Number.isFinite(i.roughnessFactor)?i.roughnessFactor:1,alphaMode:no(n?.alphaMode)??"opaque",...Number.isFinite(n?.alphaCutoff)?{alphaCutoff:n.alphaCutoff}:{},...o.length>0?{textureSlots:o}:{}}})}function Wl(e,t){let n=[];return pt(n,"baseColor",t?.baseColorTexture),pt(n,"metallicRoughness",t?.metallicRoughnessTexture),pt(n,"normal",e?.normalTexture),pt(n,"occlusion",e?.occlusionTexture),pt(n,"emissive",e?.emissiveTexture),n}function pt(e,t,n){!F(n)||!Number.isInteger(n.index)||e.push({slot:t,textureIndex:n.index,...Number.isFinite(n.texCoord)?{texCoord:n.texCoord}:{}})}function ql(e){return e.nodeCount>=300||e.meshCount>=250||e.primitiveCount>=300||e.materialCount>=200||e.textureCount>=80||e.imageCount>=80?"high":e.nodeCount>=100||e.meshCount>=80||e.primitiveCount>=100||e.materialCount>=50||e.textureCount>=24||e.imageCount>=24?"medium":"low"}function Jl(e){let t=[];return e.complexity==="high"&&t.push({severity:"warning",source:"asset",code:"asset.analysis.highComplexity",message:"GLTF asset is structurally complex; agent should place and inspect it before duplicating or using dense shadows.",details:{nodeCount:e.nodeCount,meshCount:e.meshCount,primitiveCount:e.primitiveCount,materialCount:e.materialCount,textureCount:e.textureCount,imageCount:e.imageCount}}),(e.animationCount>0||e.skinCount>0||e.morphTargetCount>0)&&t.push({severity:"info",source:"asset",code:"asset.analysis.riggedOrAnimated",message:"GLTF asset contains animation, skin, or morph target data.",details:{animationCount:e.animationCount,skinCount:e.skinCount,morphTargetCount:e.morphTargetCount}}),t}function Yl(e){if(e.length<33||e[0]!==137||e.toString("ascii",1,4)!=="PNG"||e[4]!==13||e[5]!==10||e[6]!==26||e[7]!==10||e.toString("ascii",12,16)!=="IHDR")return null;let n=e.readUInt32BE(16),r=e.readUInt32BE(20),i=e[24],o=e[25];return{format:"png",mime:"image/png",width:n,height:r,bitDepth:i,hasAlpha:o===4||o===6,estimatedPixels:n*r}}function Xl(e){if(e.length<4||e[0]!==255||e[1]!==216)return null;let t=2;for(;t+9<e.length;){if(e[t]!==255){t+=1;continue}let n=e[t+1],r=e.readUInt16BE(t+2);if(r<2)return null;if(n>=192&&n<=207&&![196,200,204].includes(n)&&t+8<e.length){let o=e[t+4],a=e.readUInt16BE(t+5),s=e.readUInt16BE(t+7);return{format:"jpeg",mime:"image/jpeg",width:s,height:a,bitDepth:o,hasAlpha:!1,estimatedPixels:s*a}}t+=2+r}return null}function Zl(e){if(e.length<30||e.toString("ascii",0,4)!=="RIFF"||e.toString("ascii",8,12)!=="WEBP")return null;let t=e.toString("ascii",12,16);if(t==="VP8X"&&e.length>=30){let n=e[20],r=Yi(e,24)+1,i=Yi(e,27)+1;return{format:"webp",mime:"image/webp",width:r,height:i,hasAlpha:(n&16)!==0,estimatedPixels:r*i}}if(t==="VP8 "&&e.length>=30){let n=e.readUInt16LE(26)&16383,r=e.readUInt16LE(28)&16383;return{format:"webp",mime:"image/webp",width:n,height:r,hasAlpha:!1,estimatedPixels:n*r}}if(t==="VP8L"&&e.length>=25&&e[20]===47){let n=e.readUInt32LE(21),r=(n&16383)+1,i=(n>>14&16383)+1;return{format:"webp",mime:"image/webp",width:r,height:i,hasAlpha:!0,estimatedPixels:r*i}}return null}function Yi(e,t){return e[t]|e[t+1]<<8|e[t+2]<<16}function Ql(e){let t=[];return e.estimatedPixels>=4096*4096&&t.push({severity:"warning",source:"asset",code:"asset.analysis.largeImage",message:"Image asset is large; agent should inspect texture usage before assigning it broadly.",details:{width:e.width,height:e.height,estimatedPixels:e.estimatedPixels}}),t}function ec(e,t={}){if(!e||typeof e!="object")return[];let n=Array.isArray(e.nodes)?e.nodes:[],r=Array.isArray(e.meshes)?e.meshes:[],i=Array.isArray(e.materials)?e.materials:[],o=nc(e,t),a=io(e),s=oo(n),l=new Set(a),d=Array.isArray(e.accessors)?e.accessors:[],u=sc(t.existingMaterialSlots),c=[],m=new Map;for(let p=0;p<n.length;p+=1){let g=n[p],b=Number.isInteger(g?.mesh)?g.mesh:-1;if(b<0||b>=r.length)continue;let S=ao(n,s,l,p);if(!S)continue;let x=r[b],D=Array.isArray(x?.primitives)?x.primitives:[],w=fc(g,x,S),M=so(x),O=lo(s,p);for(let z=0;z<D.length;z+=1){let Pe=D[z],f=mc(Pe,i),v=ro({ownerNodePath:S,nodeIndex:p,meshIndex:b,primitiveIndex:z}),y=co(Pe,d),G=uo(Pe,d),J=D.length>1?`${w} / Primitive ${z}`:w,Y={ownerNodePath:S,nodeIndex:p,nodeIndexPath:O,meshIndex:b,primitiveIndex:z,...M?{sourceMeshName:M}:{},...f.index>=0?{sourceMaterialIndex:f.index}:{},...Number.isFinite(y)?{triangleCount:y}:{},...G?{boundingBox:G}:{}};if(f.index>=0){let j=m.get(f.index)??{label:J,materialName:f.name,sourceSurfaces:[]};j.sourceSurfaces.push(Y),m.set(f.index,j);continue}c.push({slotId:u.byExactSource.get(v)??dc({assetGuid:t.assetGuid,assetId:t.assetId,nodeIndex:p,meshIndex:b,primitiveIndex:D.length>1?z:void 0}),label:J,sourceSurfaces:[Y]})}}for(let[p,g]of m){let b=g.sourceSurfaces.sort(to);c.push({slotId:u.bySourceMaterialIndex.get(p)??lc({assetGuid:t.assetGuid,assetId:t.assetId,sourceMaterialIndex:p}),label:g.label,sourceSurfaces:b,...g.materialName?{materialName:g.materialName,materialNames:[g.materialName]}:{},...rc(o,[p])})}return c.sort(tc)}function tc(e,t){let n=Array.isArray(e.sourceSurfaces)?e.sourceSurfaces[0]:void 0,r=Array.isArray(t.sourceSurfaces)?t.sourceSurfaces[0]:void 0;return to(n,r)}function to(e,t){let n=String(e?.ownerNodePath??"").localeCompare(String(t?.ownerNodePath??""));if(n!==0)return n;let r=Number.isInteger(e?.nodeIndex)?e.nodeIndex:-1,i=Number.isInteger(t?.nodeIndex)?t.nodeIndex:-1;if(r!==i)return r-i;let o=Number.isInteger(e?.meshIndex)?e.meshIndex:-1,a=Number.isInteger(t?.meshIndex)?t.meshIndex:-1;if(o!==a)return o-a;let s=Number.isInteger(e?.primitiveIndex)?e.primitiveIndex:-1,l=Number.isInteger(t?.primitiveIndex)?t.primitiveIndex:-1;return s-l}function nc(e,t={}){let n=Array.isArray(e?.materials)?e.materials:[],r=[];for(let i=0;i<n.length;i+=1){let o=ic(e,i,t);o&&r.push(o)}return r}function rc(e,t){if(!t.length||!e.length)return{};let n=new Map(e.map(i=>[i.sourceMaterialIndex,i])),r=t.map(i=>n.get(i)).filter(Boolean);return r.length>0?{sourceMaterialProfiles:r}:{}}function ic(e,t,n={}){let r=Array.isArray(e?.materials)?e.materials[t]:null;if(!r||typeof r!="object")return null;let i={},o=[],a=r.pbrMetallicRoughness&&typeof r.pbrMetallicRoughness=="object"?r.pbrMetallicRoughness:{},s={},l=Array.isArray(a.baseColorFactor)?a.baseColorFactor:null,d=Xi(l);d&&(s.color=d);let u=bt(e,a.baseColorTexture,n,"baseColor.texture",s,"texture",o);Object.keys(s).length>0&&(i.baseColor={...s,brightness:1,saturation:1,contrast:1,hue:0});let c={};bt(e,r.normalTexture,n,"normal.texture",c,"texture",o),Number.isFinite(r.normalTexture?.scale)?c.strength=r.normalTexture.scale:c.texture&&(c.strength=1),Object.keys(c).length>0&&(i.normal=c),i.metallic=Number.isFinite(a.metallicFactor)?a.metallicFactor:1,i.roughness=Number.isFinite(a.roughnessFactor)?a.roughnessFactor:1;let m={};bt(e,a.metallicRoughnessTexture,n,"metallicRoughness.texture",m,"texture",o),Object.keys(m).length>0&&(i.metallicRoughness=m);let p={};bt(e,r.occlusionTexture,n,"occlusion.texture",p,"texture",o),Number.isFinite(r.occlusionTexture?.strength)?p.strength=r.occlusionTexture.strength:p.texture&&(p.strength=1),Object.keys(p).length>0&&(i.occlusion=p);let g={},b=Xi(Array.isArray(r.emissiveFactor)?r.emissiveFactor:null),S=b&&(b.r!==0||b.g!==0||b.b!==0);S&&(g.color=b),bt(e,r.emissiveTexture,n,"emission.texture",g,"texture",o),S&&(g.intensity=1),Object.keys(g).length>0&&(i.emission=g);let x={},D=no(r.alphaMode);if(D&&(x.mode=D),(D==="mask"||D==="blend")&&(l&&Number.isFinite(l[3])&&l[3]!==1&&(x.opacity=l[3]),Number.isFinite(r.alphaCutoff)?x.cutoff=r.alphaCutoff:D==="mask"&&(x.cutoff=.5),u.texture&&(x.texture=structuredClone(u.texture)),u.hint&&o.push({...u.hint,profilePath:"alpha.texture"})),Object.keys(x).length>0&&(i.alpha=x),Object.keys(i).length===0&&o.length===0)return null;let w=typeof r.name=="string"&&r.name.trim()?r.name.trim():"";return{sourceMaterialIndex:t,...w?{materialName:w}:{},...Object.keys(i).length>0?{profile:i}:{},...o.length>0?{textureHints:o}:{}}}function Xi(e){if(!Array.isArray(e)||e.length<3)return null;let[t,n,r]=e;return Number.isFinite(t)&&Number.isFinite(n)&&Number.isFinite(r)?{r:t,g:n,b:r}:null}function no(e){return e==="MASK"?"mask":e==="BLEND"?"blend":e==="OPAQUE"?"opaque":null}function bt(e,t,n,r,i,o,a){let s=oc(e,t,n,r);return s.texture&&(i[o]=s.texture),s.hint&&a.push(s.hint),s}function oc(e,t,n,r){let i=F(t)?t:{},o=Number.isInteger(i.index)?i.index:-1;if(o<0)return{};let a=Array.isArray(e?.textures)?e.textures:[],s=Array.isArray(e?.images)?e.images:[],l=a[o],d=ac(l),u=d.imageIndex,c=u>=0?s[u]:null,m=typeof c?.uri=="string"?c.uri.trim():"",p=/^data:/i.test(m),g={profilePath:r,textureIndex:o,...u>=0?{imageIndex:u}:{},...d.previewImageIndex>=0?{previewImageIndex:d.previewImageIndex}:{},...m&&!p?{uri:m}:{},...Number.isInteger(c?.bufferView)?{bufferView:c.bufferView}:{},...typeof c?.mimeType=="string"&&c.mimeType.trim()?{mimeType:c.mimeType.trim()}:{}};if(c?.bufferView!=null)return{hint:{...g,reason:"embedded-texture"}};if(!m)return{hint:{...g,reason:"missing-image-uri"}};if(p)return{hint:{...g,reason:"embedded-texture"}};if(/^https?:\/\//i.test(m)||m.startsWith("/"))return{texture:{url:m}};let b=m;try{b=decodeURIComponent(m)}catch{return{hint:{...g,reason:"unresolved-external-texture"}}}let S=W.dirname(String(n.sourcePath??"")),x=W.resolve(S,b),D=n.assetsDir?W.resolve(n.assetsDir):"",w=n.cwd?W.resolve(n.cwd):"",M=D?W.relative(D,x):"../";return D&&w&&M&&!M.startsWith("..")&&!W.isAbsolute(M)?{texture:{url:`/${W.relative(w,x).split(W.sep).join("/")}`},hint:{...g,reason:"external-texture"}}:{hint:{...g,reason:"external-texture"}}}function ac(e){let t=F(e)?e:{},n=F(t.extensions)?t.extensions:{},r=Number.isInteger(t.source)?t.source:-1,i=F(n.KHR_texture_basisu)?n.KHR_texture_basisu:{};if(Number.isInteger(i.source))return{imageIndex:i.source,previewImageIndex:r>=0&&r!==i.source?r:-1};let o=F(n.EXT_texture_webp)?n.EXT_texture_webp:{};return Number.isInteger(o.source)?{imageIndex:o.source,previewImageIndex:-1}:{imageIndex:r,previewImageIndex:-1}}function sc(e){let t=new Map,n=new Map;if(!Array.isArray(e))return{byExactSource:t,bySourceMaterialIndex:new Map};for(let i of e){if(!F(i))continue;let o=Array.isArray(i.sourceSurfaces)?i.sourceSurfaces:[],a=typeof i.slotId=="string"?i.slotId.trim():"";if(!a)continue;let s=new Set;for(let l of o){if(!F(l))continue;let d=typeof l.ownerNodePath=="string"?l.ownerNodePath.trim().replace(/^\/+|\/+$/g,""):"",u=Number.isInteger(l.nodeIndex)?l.nodeIndex:-1,c=Number.isInteger(l.meshIndex)?l.meshIndex:-1,m=Number.isInteger(l.primitiveIndex)?l.primitiveIndex:-1;o.length===1&&d&&u>=0&&c>=0&&m>=0&&t.set(ro({ownerNodePath:d,nodeIndex:u,meshIndex:c,primitiveIndex:m}),a),Number.isInteger(l.sourceMaterialIndex)&&l.sourceMaterialIndex>=0&&s.add(l.sourceMaterialIndex)}if(s.size===1){let[l]=s,d=n.get(l)??[];d.push(a),n.set(l,d)}}let r=new Map;for(let[i,o]of n)o.length===1&&r.set(i,o[0]);return{byExactSource:t,bySourceMaterialIndex:r}}function ro(e){return[e.ownerNodePath,e.nodeIndex,e.meshIndex,e.primitiveIndex].join("\0")}function dc(e){let t=Number.isInteger(e.primitiveIndex)?`:${e.primitiveIndex}`:"",n=`${e.assetGuid||e.assetId||"asset"}:${e.nodeIndex}:${e.meshIndex}${t}`;return`slot_${mo(n)}`}function lc(e){let t=`${e.assetGuid||e.assetId||"asset"}:material:${e.sourceMaterialIndex}`;return`slot_${mo(t)}`}function cc(e,t){if(t.textureUsage==="material"||t.usage==="material")return{usage:"material",materialTexture:!0,environmentTexture:!1};if(F(t.capabilities)&&t.capabilities.materialTexture===!0)return{usage:"material",materialTexture:!0,environmentTexture:!1};if(t.textureUsage==="environment"||t.usage==="environment")return{usage:"environment",materialTexture:!1,environmentTexture:!0};if(F(t.capabilities)&&t.capabilities.environmentTexture===!0)return{usage:"environment",materialTexture:!1,environmentTexture:!0};let n=W.extname(e).toLowerCase();return[".env",".hdr",".dds",".ktx",".ktx2"].includes(n)?{usage:"environment",materialTexture:!1,environmentTexture:!0}:[".png",".jpg",".jpeg",".webp"].includes(n)?{usage:"material",materialTexture:!0,environmentTexture:!1}:null}function io(e){let t=Array.isArray(e.scenes)?e.scenes:[],n=Number.isInteger(e.scene)?e.scene:0,r=t[n]??t[0];return Array.isArray(r?.nodes)?r.nodes.filter(Number.isInteger):[]}function oo(e){let t=new Map;for(let n=0;n<e.length;n+=1){let r=Array.isArray(e[n]?.children)?e[n].children:[];for(let i of r)Number.isInteger(i)&&!t.has(i)&&t.set(i,n)}return t}function ao(e,t,n,r){let i=[],o=r,a=new Set;for(;Number.isInteger(o)&&o>=0&&o<e.length;){if(a.has(o))return"";a.add(o),i.push(uc(e[o],o));let s=t.get(o);if(typeof s!="number"||!Number.isInteger(s))break;o=s}return i.reverse(),i.length>1&&n.has(o)&&i.shift(),i.filter(Boolean).join("/")}function uc(e,t){return(F(e)&&typeof e.name=="string"?e.name.trim():"")||`node_${t}`}function fc(e,t,n){let r=F(e)&&typeof e.name=="string"?e.name.trim():"",i=so(t);return r||i||n.split("/").filter(Boolean).pop()||n}function so(e){return F(e)&&typeof e.name=="string"?e.name.trim():""}function lo(e,t){let n=[],r=t,i=new Set;for(;Number.isInteger(r)&&r>=0;){if(i.has(r))return[];i.add(r),n.push(r);let o=e.get(r);if(!Number.isInteger(o))break;r=o}return n.reverse(),n}function mc(e,t){let n=F(e)?e:{},r=Number.isInteger(n.material)?n.material:-1,i=r>=0?t[r]:null,o=typeof i?.name=="string"&&i.name.trim()?i.name.trim():"";return{index:r,name:o}}function co(e,t){let n=F(e)?e:{},r=Number.isInteger(n.indices)?n.indices:-1,i=fo(n),o=r>=0?t[r]:null,a=i>=0?t[i]:null,s=Number.isFinite(o?.count)?Number(o.count):Number.isFinite(a?.count)?Number(a.count):null;if(s==null)return null;let l=Number.isInteger(n.mode)?n.mode:4;return l===4?Math.floor(s/3):l===5||l===6?Math.max(0,s-2):0}function uo(e,t){let n=F(e)?e:{},r=fo(n),i=r>=0?t[r]:null,o=Zi(i?.min),a=Zi(i?.max);return o&&a?{min:o,max:a}:null}function fo(e){let t=F(e.attributes)?e.attributes:{};return Number.isInteger(t.POSITION)?t.POSITION:-1}function Zi(e){if(!Array.isArray(e)||e.length<3)return null;let t=Number(e[0]),n=Number(e[1]),r=Number(e[2]);return Number.isFinite(t)&&Number.isFinite(n)&&Number.isFinite(r)?[t,n,r]:null}function F(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function mo(e){let t=String(e??""),n=2166136261;for(let r=0;r<t.length;r+=1)n^=t.charCodeAt(r),n=Math.imul(n,16777619);return(n>>>0).toString(16).padStart(8,"0")}import yt from"node:fs/promises";import ne from"node:path";async function po(e,t={}){try{let n=await gc(e);if(!n)return[];let r=Array.isArray(n.gltf.images)?n.gltf.images:[],i=t.imageIndexes?new Set(t.imageIndexes.filter(a=>Number.isInteger(a)&&a>=0)):null,o=[];for(let a=0;a<r.length;a+=1){if(i&&!i.has(a))continue;let s=q(r[a]);if(!s)continue;let l=await pc(e,n,s);if(!l)continue;let d=ht(s.name)??(l.originalFileName?ne.parse(l.originalFileName).name:null)??void 0;o.push({imageIndex:a,bytes:l.bytes,extension:l.extension,mimeType:l.mimeType,...d?{displayName:d}:{},...l.originalFileName?{originalFileName:l.originalFileName}:{}})}return o}catch{return[]}}function bo(e){let t=new Set;for(let n of ho(e)){let r=be(n.imageIndex),i=be(n.previewImageIndex);r!=null&&t.add(r),i!=null&&t.add(i)}return[...t].sort((n,r)=>n-r)}function yo(e){let t=new Map;for(let n of ho(e)){let r=be(n.imageIndex),i=be(n.previewImageIndex);r==null||i==null||r===i||t.set(`${r}:${i}`,{imageIndex:r,previewImageIndex:i})}return[...t.values()].sort((n,r)=>n.imageIndex-r.imageIndex||n.previewImageIndex-r.previewImageIndex)}function ho(e){if(!e)return[];let t=[],n=Array.isArray(e.materialSlots)?e.materialSlots:[];for(let r of n){let i=q(r),o=Array.isArray(i?.sourceMaterialProfiles)?i.sourceMaterialProfiles:[];for(let a of o){let s=q(a),l=Array.isArray(s?.textureHints)?s.textureHints:[];for(let d of l){let u=q(d);u&&t.push(u)}}}return t}function So(e,t){if(!e||t.length===0)return e;let n=new Map(t.map(a=>[a.imageIndex,a.textureAssetId])),r=structuredClone(e),i=Array.isArray(r.materialSlots)?r.materialSlots:[],o=!1;for(let a of i){let s=q(a),l=Array.isArray(s?.sourceMaterialProfiles)?s.sourceMaterialProfiles:[];for(let d of l){let u=q(d);if(!u)continue;let c=Array.isArray(u.textureHints)?u.textureHints:[];if(c.length===0)continue;let m=[];for(let p of c){let g=q(p),b=be(g?.imageIndex),S=ht(g?.profilePath),x=b==null?null:n.get(b)??null;if(!x||!S||!yc(S)){m.push(p);continue}let D=q(u.profile)??{};hc(D,S,{textureAssetId:x}),u.profile=D,o=!0}m.length>0?u.textureHints=m:delete u.textureHints}}return o?r:e}async function gc(e){let t=ne.extname(e).toLowerCase();if(t===".gltf"){let l=JSON.parse(await yt.readFile(e,"utf8")),d=await Promise.all((Array.isArray(l.buffers)?l.buffers:[]).map(u=>go(e,q(u))));return{gltf:l,buffers:d}}if(t!==".glb")return null;let n=await yt.readFile(e);if(n.length<20||n.toString("utf8",0,4)!=="glTF"||n.readUInt32LE(4)!==2||n.readUInt32LE(8)>n.length)return null;let r=null,i=[],o=12;for(;o+8<=n.length;){let l=n.readUInt32LE(o),d=n.readUInt32LE(o+4);if(o+=8,o+l>n.length)return null;let u=n.subarray(o,o+l);d===1313821514?r=JSON.parse(u.toString("utf8").replace(/\0+$/g,"")):d===5130562&&i.push(Buffer.from(u)),o+=l}if(!r)return null;let a=Array.isArray(r.buffers)?r.buffers:[],s=await Promise.all(a.map(async(l,d)=>{let u=q(l);return ht(u?.uri)?go(e,u):i[d]??(d===0?i[0]??null:null)}));return s.length===0&&i.length>0&&s.push(i[0]),{gltf:r,buffers:s}}async function go(e,t){let n=ht(t?.uri);if(!n)return null;let r=Po(n);if(r)return r.bytes;if(Zn(n))return null;let i=xo(n);return i?Eo(e,i):null}async function pc(e,t,n){let r=ht(n.uri);if(r){let p=Po(r);if(p){let D=Xn(p.bytes);return D?{bytes:p.bytes,...D}:null}if(Zn(r))return null;let g=xo(r);if(!g)return null;let b=await Eo(e,g);if(!b)return null;let S=ne.basename(g),x=Xn(b);return x?{bytes:b,...x,originalFileName:S}:null}let i=be(n.bufferView);if(i==null)return null;let o=Array.isArray(t.gltf.bufferViews)?t.gltf.bufferViews:[],a=q(o[i]),s=be(a?.buffer)??0,l=t.buffers[s],d=be(a?.byteOffset)??0,u=be(a?.byteLength);if(!l||u==null||d+u>l.length)return null;let c=Buffer.from(l.subarray(d,d+u)),m=Xn(c);return m?{bytes:c,...m}:null}async function Eo(e,t){if(ne.isAbsolute(t)||ne.win32.isAbsolute(t)||t.includes("\0"))return null;try{let n=await yt.realpath(ne.dirname(e)),r=ne.resolve(n,t),i=await yt.realpath(r);return bc(n,i)?await yt.readFile(i):null}catch{return null}}function xo(e){if(Zn(e))return null;try{return decodeURIComponent(e)}catch{return null}}function bc(e,t){let n=ne.relative(e,t);return n===""||!n.startsWith(`..${ne.sep}`)&&n!==".."&&!ne.isAbsolute(n)}function Po(e){let t=/^data:([^;,]+)?(?:;[^,]*)?,(.*)$/is.exec(e);if(!t)return null;let n=e.slice(0,e.indexOf(","));try{return{bytes:n.toLowerCase().includes(";base64")?Buffer.from(t[2]??"","base64"):Buffer.from(decodeURIComponent(t[2]??""),"utf8")}}catch{return null}}function Xn(e){return e.length>=8&&e.subarray(0,8).equals(Buffer.from([137,80,78,71,13,10,26,10]))?{extension:".png",mimeType:"image/png"}:e.length>=3&&e[0]===255&&e[1]===216&&e[2]===255?{extension:".jpg",mimeType:"image/jpeg"}:e.length>=12&&e.toString("ascii",0,4)==="RIFF"&&e.toString("ascii",8,12)==="WEBP"?{extension:".webp",mimeType:"image/webp"}:e.length>=12&&e.subarray(0,12).equals(Buffer.from([171,75,84,88,32,50,48,187,13,10,26,10]))?{extension:".ktx2",mimeType:"image/ktx2"}:null}function yc(e){return["baseColor.texture","normal.texture","metallicRoughness.texture","occlusion.texture","emission.texture","emission.maskTexture","alpha.texture"].includes(e)}function hc(e,t,n){let r=t.split("."),i=e;for(let o=0;o<r.length-1;o+=1){let a=r[o],s=q(i[a])??{};i[a]=s,i=s}i[r[r.length-1]]=n}function Zn(e){return/^[a-z][a-z0-9+.-]*:/i.test(e)||e.startsWith("/")||ne.win32.isAbsolute(e)}function q(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:null}function ht(e){return typeof e=="string"&&e.trim()?e.trim():null}function be(e){return Number.isInteger(e)&&e>=0?e:null}function er(e){if(typeof e=="number"&&Number.isFinite(e)&&e>0)return e;if(!e||typeof e!="object")return;let t=e,n=Qn(t.x),r=Qn(t.y),i=Qn(t.z);if(!(n==null||r==null||i==null||n<=0||r<=0||i<=0))return{x:n,y:r,z:i}}function Qn(e){return typeof e=="number"&&Number.isFinite(e)?e:null}function tr(e){return e==="shared"||e==="instance"?e:void 0}function nr(e){return Number.isInteger(e)&&e>=0?e:void 0}var C=class extends Error{constructor(t,n={}){super(t),this.name="PlayableEditorAssetRegistryError",this.details=n}};function Sc(e){let t={};for(let n=0;n<e.length;n+=1){let r=e[n];if(r==="--unregister"){t.unregister=!0;continue}if(r==="--payload"){t.payload=e[n+1],n+=1;continue}if(r==="--asset-id"){t.assetId=e[n+1],n+=1;continue}if(r==="--guid"){t.guid=e[n+1],n+=1;continue}if(r==="--delete-file"){t.deleteFile=!0;continue}if(r==="--keep-file"){t.deleteFile=!1;continue}if(r==="--force"){t.force=!0;continue}(r==="--help"||r==="-h")&&(t.help=!0)}return t}async function To(e,t=process.argv.slice(2)){let n=Sc(t),r=await Ic(e),i=le(r.errorCodes),o=(a,s={})=>{let l={ok:!1,error:a,...s};process.stderr.write(`${JSON.stringify(l,null,2)}
9
- `),process.exit(1)};try{if(n.help){process.stdout.write(["Usage:",` ${e.commands?.register??"npm run asset:register"} -- --payload /path/to/payload.json`,` ${e.commands?.unregister??"npm run asset:unregister"} -- --payload /path/to/payload.json`,` ${e.commands?.unregister??"npm run asset:unregister"} -- --asset-id asset_xxx [--keep-file] [--force]`,` ${e.commands?.unregister??"npm run asset:unregister"} -- --guid xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx [--keep-file] [--force]`,""].join(`
10
- `));return}if(n.unregister){let s=await Pc(e,n,i);process.stdout.write(`${JSON.stringify(s)}
11
- `);return}let a=await Yt(e,n,i);process.stdout.write(`${JSON.stringify(a)}
12
- `)}catch(a){a instanceof C&&o(a.message,a.details),o("asset_register_failed",{message:a instanceof Error?a.message:String(a)})}}async function Yt(e,t,n={}){if(!t.payload&&!t.payloadData)throw new C("missing_payload_arg");let r=await Co(e,t),i=e.codeKeyPolicy??"legacy";if(i==="disabled"&&Object.prototype.hasOwnProperty.call(r,"codeKey"))throw new C("payload_code_key_disabled",{codeKeyPolicy:i,codeKey:r.codeKey});let o=R.resolve(e.cwd,String(r.sourcePath??r.assetPath??"")),a=Ac(e,o);if(!a)throw new C(e.unsupportedSourceErrorCode??n.sourceMustBeSupportedAsset??"source_must_be_supported_asset",{sourcePath:o,supportedExtensions:Mo(e)});try{await N.access(o)}catch{throw new C(n.sourceFileNotFound??"source_file_not_found",{sourcePath:o})}let s=Oc(r);await N.mkdir(e.generatedDir,{recursive:!0});let l=await Oe(e),d=await dr(o),u=qn(r.kind??r.assetKind??r.assetType,o);if(!u)throw new C("unsupported_asset_kind",{sourcePath:o,assetType:r.assetType});or(u,o,"source_path");let c=Nc(l,r,s,o,d,u,e),m=$(r.assetName)??c?.originalFileName??R.basename(o),p=$(r.guid);if(c&&p&&c.guid!==p)throw new C("payload_guid_must_match_existing_asset",{guid:p,existingGuid:c.guid,existingAssetId:c.assetId});let g=c?.guid??p??ir.randomUUID(),b=$(r.projectAssetId),S=Hn(u,g);if(c?.assetId&&c.assetId!==S)throw new C("manifest_asset_id_must_match_guid",{guid:g,assetId:c.assetId,expectedAssetId:S});if(b&&b!==S)throw new C("project_asset_id_must_match_guid",{guid:g,projectAssetId:b,expectedAssetId:S});let x=`${S}${a}`,D=wc(e,{existing:c,sourcePath:o,kind:u,targetFileName:x}),w=Ke(e,D,u,"target_path"),M=new Date().toISOString(),O=Hi($(r.displayName)??c?.displayName,m),z=Jt({...Jt(c?.external)??{},...s??{}}),Pe=!1,f=[],v=null;try{await N.mkdir(R.dirname(w),{recursive:!0});let y=Dc(o,w),G=y||await Oo(w),J=!c||c.contentHash!==d.contentHash||!G;!y&&J&&(await N.copyFile(o,w),Pe=!c);let j=await Ro(e,{existing:c,payload:r,sourcePath:o,targetPath:w,kind:u,guid:g,assetId:S});if(u==="model"){let We=await Ec({config:e,manifest:l,metadata:j,sourcePath:o,sourceAssetId:S,sourceAssetGuid:g,sourceDisplayName:O,now:M});f=We.createdPaths,j=So(j,We.references)}let $e=ar({...c??{},guid:g,assetId:S,kind:u,displayName:O,relativePath:D,originalFileName:m,...i==="legacy"?{codeKey:Wi($(r.codeKey)??$(r.assetName)??c?.codeKey,m)}:{},...$(r.category)?{category:$(r.category)}:{},placeable:u==="texture"?!0:typeof r.placeable=="boolean"?r.placeable:c?.placeable??u==="model",...nr(r.warmupCount)!=null?{warmupCount:nr(r.warmupCount)}:{},...typeof r.singleton=="boolean"?{singleton:r.singleton}:{},...tr(r.materialMode)?{materialMode:tr(r.materialMode)}:{},...er(r.scale)?{defaults:{transform:{scale:er(r.scale)}}}:{},contentHash:d.contentHash,byteSize:d.byteSize,external:z,metadata:j,createdAt:c?.createdAt??M,updatedAt:J?M:c?.updatedAt??M});if(!$e)throw new C("invalid_manifest_entry",{assetId:S,guid:g});v=$e;let Ie=l.findIndex(We=>We.guid===g||We.assetId===S);Ie>=0?l[Ie]=$e:l.push($e),l.sort(Gc),await $o(e,l)}catch(y){Pe&&await N.rm(w,{force:!0}).catch(()=>{});for(let G of f)await N.rm(G,{force:!0}).catch(()=>{});throw y}return{ok:!0,guid:g,assetId:S,kind:u,...v?.contentHash?{contentHash:v.contentHash}:{},...v?.external?{external:v.external}:{},displayName:v?.displayName,originalFileName:v?.originalFileName,assetUrl:Cc(e,D,u),targetPath:w,manifestPath:e.manifestPath,registryPath:e.registryPath}}async function Ec(e){let t=bo(e.metadata),n=yo(e.metadata),r=await po(e.sourcePath,{imageIndexes:t}),i=[],o=new Map,a=[];try{for(let d of r){let u=No(d.bytes),c=e.manifest.find(O=>O.kind==="texture"&&O.contentHash===u.contentHash&&le(le(O.metadata).capabilities).materialTexture!==!1&&le(O.metadata).textureUsage!=="environment");if(c){o.set(d.imageIndex,c),i.push({imageIndex:d.imageIndex,textureAssetId:c.assetId});continue}let m=jc(u.contentHash),p=Hn("texture",m),g=e.manifest.find(O=>O.guid===m||O.assetId===p);if(g)throw new C("derived_texture_identity_conflict",{sourceAssetId:e.sourceAssetId,imageIndex:d.imageIndex,assetId:p,contentHash:u.contentHash,conflictingAssetId:g.assetId,conflictingContentHash:g.contentHash});let b=`${p}${d.extension}`,S=ko(e.config,"texture",b),x=Ke(e.config,S,"texture","derived_texture_target_path");if(await N.mkdir(R.dirname(x),{recursive:!0}),await Oo(x)){let O=await dr(x);if(O.contentHash!==u.contentHash)throw new C("derived_texture_target_conflict",{sourceAssetId:e.sourceAssetId,imageIndex:d.imageIndex,assetId:p,targetPath:x,contentHash:u.contentHash,existingContentHash:O.contentHash})}else await _c(x,d.bytes),a.push(x);let D=d.displayName?`${e.sourceDisplayName} / ${d.displayName}`:`${e.sourceDisplayName} Texture ${d.imageIndex+1}`,w=await Ro(e.config,{existing:null,payload:{metadata:{textureUsage:"material",capabilities:{materialTexture:!0,environmentTexture:!1},derivedFrom:{kind:"gltf-image",sourceAssetId:e.sourceAssetId,sourceAssetGuid:e.sourceAssetGuid,imageIndex:d.imageIndex,mimeType:d.mimeType}}},sourcePath:x,targetPath:x,kind:"texture",guid:m,assetId:p}),M=ar({guid:m,assetId:p,kind:"texture",displayName:D,relativePath:S,originalFileName:d.originalFileName??`${Lc(D)}${d.extension}`,category:"Texture",placeable:!0,contentHash:u.contentHash,byteSize:u.byteSize,metadata:w,createdAt:e.now,updatedAt:e.now});if(!M)throw new C("invalid_derived_texture_manifest_entry",{sourceAssetId:e.sourceAssetId,imageIndex:d.imageIndex,assetId:p});e.manifest.push(M),o.set(d.imageIndex,M),i.push({imageIndex:d.imageIndex,textureAssetId:p})}let s=new Map,l=new Map;for(let d of o.values())R.extname(d.relativePath).toLowerCase()===".ktx2"&&s.set(d.assetId,d);for(let d of n){let u=o.get(d.imageIndex),c=o.get(d.previewImageIndex);!u||!c||R.extname(u.relativePath).toLowerCase()!==".ktx2"||l.set(u.assetId,c.assetId)}for(let d of s.values()){let u=le(d.metadata),c=xc(u);delete c[e.sourceAssetId];let m=l.get(d.assetId);m&&(c[e.sourceAssetId]=m);let p=Object.fromEntries(Object.entries(c).sort(([S],[x])=>S.localeCompare(x))),g=Object.values(p)[0],b={...u};g?(b.previewTextureAssetId=g,b.previewTextureAssetIdsBySourceAssetId=p):(delete b.previewTextureAssetId,delete b.previewTextureAssetIdsBySourceAssetId),d.metadata=b}return{references:i,createdPaths:a}}catch(s){for(let l of a)await N.rm(l,{force:!0}).catch(()=>{});throw s}}function xc(e){let t={},n=le(e.previewTextureAssetIdsBySourceAssetId);for(let[o,a]of Object.entries(n)){let s=$(o),l=$(a);s&&l&&(t[s]=l)}if(Object.keys(t).length>0)return t;let r=$(e.previewTextureAssetId),i=$(le(e.derivedFrom).sourceAssetId);return r&&i&&(t[i]=r),t}async function Do(e,t={}){let n=await Oe(e),r=[];for(let i of n){let o=Ke(e,i.relativePath,i.kind,"refresh_source_path"),a;try{a=await dr(o)}catch(u){throw Zt(u)&&u.code==="ENOENT"?new C(t.sourceFileNotFound??"source_file_not_found",{assetId:i.assetId,guid:i.guid,sourcePath:o}):u}let s=i.kind==="model"&&le(i.metadata).assetMetadataVersion!==Yn,l=i.kind==="texture"&&i.placeable===!1;if(i.contentHash===a.contentHash&&i.byteSize===a.byteSize&&!s&&!l)continue;let d=await Yt(e,{payloadData:{sourcePath:o,guid:i.guid,projectAssetId:i.assetId,kind:i.kind}},t);if(!d.contentHash)throw new C("asset_refresh_missing_content_hash",{assetId:i.assetId,guid:i.guid,sourcePath:o});r.push({guid:i.guid,assetId:i.assetId,kind:i.kind,...i.contentHash?{previousContentHash:i.contentHash}:{},contentHash:d.contentHash})}return{ok:!0,scannedAssetCount:n.length,refreshedAssets:r}}async function Pc(e,t,n={}){let r=await Co(e,t),i=$(t.assetId??r?.assetId),o=$(t.guid??r?.guid);if(!i&&!o)throw new C(n.missingAssetId??"missing_asset_id");let a=Uc(t,r),s=zc(t,r);await N.mkdir(e.generatedDir,{recursive:!0});let l=await Oe(e),d=l.findIndex(p=>i&&p.assetId===i||o&&p.guid===o);if(d<0)throw new C(n.manifestEntryNotFound??"manifest_entry_not_found",{assetId:i,guid:o,manifestPath:e.manifestPath});let u=l[d];if(!u)throw new C("manifest_entry_not_found",{assetId:i,guid:o});await Bc(e,u.assetId,s,n),l.splice(d,1);let c=!1,m=null;return a&&(m=Ke(e,u.relativePath,u.kind,"unregister_target_path"),await N.rm(m,{force:!0}),c=!0),await $o(e,l),{ok:!0,guid:u.guid,assetId:u.assetId,kind:u.kind,removed:!0,deleteFile:a,force:s,deletedFile:c,targetPath:m,manifestPath:e.manifestPath,registryPath:e.registryPath}}async function Oe(e){let t=await Xt(e.manifestPath,[]);if(!Array.isArray(t))throw new C("manifest_invalid_root",{manifestPath:e.manifestPath});let n=t.map((a,s)=>{let l=ar(a,!0);if(!l)throw new C("manifest_invalid_entry",{index:s,manifestPath:e.manifestPath});return l}),r=new Set,i=new Set,o=e.codeKeyPolicy??"legacy";for(let a of n){if(o==="disabled"&&a.codeKey)throw new C("manifest_code_key_disabled",{manifestPath:e.manifestPath,codeKeyPolicy:o,assetId:a.assetId,codeKey:a.codeKey});if(r.has(a.assetId))throw new C("manifest_duplicate_asset_id",{assetId:a.assetId});if(i.has(a.guid))throw new C("manifest_duplicate_guid",{guid:a.guid});r.add(a.assetId),i.add(a.guid)}return n}async function Ic(e){return e.loadRules?e.loadRules():e.rulesPath?Xt(e.rulesPath,{}):{}}function Io(e){return(Array.isArray(e)?e:[e]).filter(n=>typeof n=="string"&&!!n.trim()).map(n=>{let r=n.trim().toLowerCase();return r.startsWith(".")?r:`.${r}`})}function Mo(e){let t=Io(e.supportedExtensions??e.supportedExtension);return t.length>0?t:Io(Kn)}function Ac(e,t){let n=t.toLowerCase();return Mo(e).find(r=>n.endsWith(r))??null}function wc(e,t){return t.existing?.relativePath?t.existing.relativePath:Tc(e,t.sourcePath,t.kind)??ko(e,t.kind,t.targetFileName)}function ko(e,t,n){let r=e.relativeImportedPath;return r.length>=2?r(t,n):r({kind:t,fileName:n})}function Tc(e,t,n){let r=e.assetRootDir??e.assetsDir;if(!r)return null;let i=R.resolve(t);return!Ao(R.resolve(r),i)||Ao(R.resolve(e.generatedDir),i)?null:(or(n,i,"source_path"),R.relative(e.generatedDir,i).split(R.sep).join("/"))}function Ao(e,t){let n=R.relative(e,t);return n===""||!n.startsWith("..")&&!R.isAbsolute(n)}function Dc(e,t){return R.relative(R.resolve(e),R.resolve(t))===""}function Mc(e,t,n){let r=R.relative(e,t);if(r.startsWith("..")||R.isAbsolute(r))throw new C(`${n}_outside_allowed_directory`,{parent:e,child:t})}function kc(e,t,n){let r=R.relative(e,t);if(!r.startsWith("..")&&!R.isAbsolute(r))throw new C(`${n}_inside_forbidden_directory`,{parent:e,child:t})}function Ke(e,t,n,r){let i=R.resolve(e.generatedDir,t),o=R.resolve(e.assetRootDir??e.assetsDir??e.importedDir??e.generatedDir);return Mc(o,i,r),kc(R.resolve(e.generatedDir),i,r),or(n,i,r),i}function Cc(e,t,n){let r=Ke(e,t,n,"asset_url_path");return typeof e.publicUrlForCatalogRelativePath=="function"?e.publicUrlForCatalogRelativePath(t):typeof e.publicUrlForRelativePath=="function"?e.publicUrlForRelativePath(t):`/${R.relative(e.cwd,r).split(R.sep).join("/")}`}function or(e,t,n){let r=R.extname(t).toLowerCase(),i=qi(e);if(!i.includes(r))throw new C(`${n}_unsupported_extension`,{kind:e,filePath:t,extension:r,supportedExtensions:i})}async function Xt(e,t){try{return JSON.parse(await N.readFile(e,"utf8"))}catch(n){if(Zt(n)&&n.code==="ENOENT")return t;throw n}}async function Co(e,t){if(t.payloadData)return structuredClone(t.payloadData);if(!t.payload)return{};let n=R.resolve(e.cwd,t.payload),r=await Xt(n,null);if(!r||typeof r!="object"||Array.isArray(r))throw new C("invalid_payload_json",{payloadPath:n});return r}function ar(e,t=!1){if(!e||typeof e!="object"||Array.isArray(e))return null;let n=e,r=t?sr:$,i=r(n.guid),o=r(n.assetId),a=r(n.kind);if(t&&(!a||"assetKind"in n||"assetType"in n))return null;let s=t?Bi.includes(a)?a:null:qn(n.kind??n.assetKind??n.assetType,n.relativePath),l=r(n.displayName),d=r(n.relativePath);if(!i||!o||!s||!l||!d||t&&(!Ne(n,"originalFileName")||!Ne(n,"codeKey")||!Ne(n,"category")||!Ne(n,"materialMode")||!Ne(n,"contentHash")||!Ne(n,"createdAt")||!Ne(n,"updatedAt")||"placeable"in n&&typeof n.placeable!="boolean"||"warmupCount"in n&&(!Number.isInteger(n.warmupCount)||n.warmupCount<0)||"singleton"in n&&typeof n.singleton!="boolean"||"defaults"in n&&xe(n.defaults)==null||"byteSize"in n&&(!Number.isFinite(n.byteSize)||n.byteSize<0)||"metadata"in n&&xe(n.metadata)==null||"external"in n&&!Rc(n.external)))return null;let u=xe(n.metadata),c=r(n.originalFileName),m=r(n.codeKey),p=r(n.category),g=r(n.materialMode),b=xe(n.defaults),S=r(n.contentHash),x=Jt(n.external),D=r(n.createdAt),w=r(n.updatedAt);return{guid:i,assetId:o,kind:s,displayName:l,relativePath:d,...c?{originalFileName:c}:{},...m?{codeKey:m}:{},...p?{category:p}:{},...typeof n.placeable=="boolean"?{placeable:n.placeable}:{},...typeof n.warmupCount=="number"?{warmupCount:n.warmupCount}:{},...typeof n.singleton=="boolean"?{singleton:n.singleton}:{},...g?{materialMode:g}:{},...b?{defaults:b}:{},...S?{contentHash:S}:{},...typeof n.byteSize=="number"?{byteSize:n.byteSize}:{},...x?{external:x}:{},...u?{metadata:u}:{},...D?{createdAt:D}:{},...w?{updatedAt:w}:{}}}function sr(e){return typeof e=="string"&&e.length>0&&e===e.trim()?e:null}function Ne(e,t){return!(t in e)||sr(e[t])!=null}function Rc(e){if(!e||typeof e!="object"||Array.isArray(e))return!1;let t=e,n=["platformAssetId","assetPath","assetUrl"],r=Object.keys(t);return r.length>0&&r.every(i=>n.includes(i)&&sr(t[i])!=null)}function Jt(e,t=!1){if(!e||typeof e!="object"||Array.isArray(e))return null;let n=e,r=$(n.platformAssetId),i;try{if(i=Ji(n.assetPath),t&&Object.prototype.hasOwnProperty.call(n,"assetPath")&&!i)throw new Error("external_asset_path_must_be_portable")}catch{if(t)throw new C("external_asset_path_must_be_portable",{assetPath:$(n.assetPath)})}let o=$(n.assetUrl);return!r&&!i&&!o?null:{...r?{platformAssetId:r}:{},...i?{assetPath:i}:{},...o?{assetUrl:o}:{}}}function xe(e){return!e||typeof e!="object"||Array.isArray(e)?null:structuredClone(e)}async function Ro(e,t){let n=xe(t.payload?.metadata);if(typeof e.resolveAssetMetadata=="function"){let r=await e.resolveAssetMetadata({...t,existingMetadata:xe(t.existing?.metadata),payloadMetadata:n}),i=xe(r);return i||null}return qt({kind:t.kind,sourcePath:t.sourcePath,existingMetadata:xe(t.existing?.metadata),payloadMetadata:n,guid:t.guid,assetId:t.assetId,cwd:e.cwd,assetsDir:e.assetsDir})}function Nc(e,t,n,r,i,o,a){let s=$(t.guid),l=$(t.projectAssetId);if(s){let c=e.find(m=>m.guid===s);if(c)return c}if(l){let c=e.find(m=>m.assetId===l);if(c)return c}if(n?.platformAssetId){let c=e.find(m=>m.kind===o&&$c(m.external)===n.platformAssetId);if(c)return c}if(n?.assetPath){let c=e.find(m=>m.kind===o&&vc(m.external)===n.assetPath);if(c)return c}let d=R.resolve(r),u=e.find(c=>{if(c.kind!==o)return!1;try{return R.resolve(Ke(a,c.relativePath,c.kind,"manifest_asset_path"))===d}catch{return!1}});if(u)return u;if(i.contentHash){let c=e.find(m=>m.kind===o&&m.contentHash===i.contentHash);if(c)return c}return null}function Oc(e){return Jt({...e.external&&typeof e.external=="object"&&!Array.isArray(e.external)?e.external:{},platformAssetId:e.external?.platformAssetId??e.platformAssetId??e.assetId,assetUrl:e.external?.assetUrl??e.assetUrl},!0)}function $c(e){return $(le(e).platformAssetId)}function vc(e){return $(le(e).assetPath)}function Gc(e,t){return e.kind.localeCompare(t.kind)||e.displayName.localeCompare(t.displayName)||e.assetId.localeCompare(t.assetId)}async function rr(e,t){try{if(await N.readFile(e,"utf8")===t)return!1}catch(r){if(!Zt(r)||r.code!=="ENOENT")throw r}let n=`${e}.tmp-${process.pid}-${Date.now()}`;try{return await N.writeFile(n,t),await N.rename(n,e),!0}catch(r){throw await N.rm(n,{force:!0}).catch(()=>{}),r}}async function _c(e,t){let n=`${e}.tmp-${process.pid}-${Date.now()}`;try{await N.writeFile(n,t),await N.rename(n,e)}catch(r){throw await N.rm(n,{force:!0}).catch(()=>{}),r}}async function dr(e){let t=await N.readFile(e),n=await N.stat(e);return{...No(t),byteSize:n.size}}function No(e){return{contentHash:`sha256:${ir.createHash("sha256").update(e).digest("hex")}`,byteSize:e.byteLength}}function jc(e){let t=ir.createHash("sha256").update(`material-texture\0${e}`).digest("hex");return`${t.slice(0,8)}-${t.slice(8,12)}-5${t.slice(13,16)}-8${t.slice(17,20)}-${t.slice(20,32)}`}function Lc(e){return e.trim().replace(/[^\p{L}\p{N}._-]+/gu,"_").replace(/^_+|_+$/g,"")||"Imported_Texture"}async function Oo(e){try{return await N.access(e),!0}catch{return!1}}async function $o(e,t){let n=Wt(t,{codeKeyPolicy:e.codeKeyPolicy??"legacy"});await N.mkdir(R.dirname(e.manifestPath),{recursive:!0}),await N.mkdir(R.dirname(e.registryPath),{recursive:!0});let r=await wo(e.manifestPath),i=await wo(e.registryPath);try{await rr(e.manifestPath,`${JSON.stringify(t,null,2)}
13
- `),await rr(e.registryPath,n)}catch(o){let a=[];for(let[s,l]of[[e.manifestPath,r],[e.registryPath,i]])try{await Fc(s,l)}catch(d){a.push(d)}if(a.length>0){let s=new Error("generated_registry_transaction_rollback_failed");throw s.cause=o,s.rollbackErrors=a,s}throw o}}async function wo(e){try{return(await N.lstat(e)).isFile()?{kind:"file",content:await N.readFile(e,"utf8")}:{kind:"other"}}catch(t){if(Zt(t)&&t.code==="ENOENT")return{kind:"missing"};throw t}}async function Fc(e,t){if(t.kind!=="other"){if(t.kind==="missing"){await N.rm(e,{force:!0});return}await rr(e,t.content)}}function Uc(e,t){return typeof e.deleteFile=="boolean"?e.deleteFile:t&&typeof t.deleteFile=="boolean"?t.deleteFile:!0}function zc(e,t){return!!(e.force||t?.force===!0)}async function Bc(e,t,n,r){if(n||!e.scenePath)return;let i=await Xt(e.scenePath,null),a=(Array.isArray(i?.scene?.nodes)?i.scene.nodes:[]).filter(s=>s?.kind==="instance"&&s?.instance?.assetId===t||s?.kind==="image"&&s?.image?.assetId===t).map(s=>s.id).filter(Boolean);if(a.length!==0)throw new C(r.assetStillReferenced??"asset_still_referenced",{assetId:t,scenePath:e.scenePath,nodeIds:a})}function $(e){return typeof e=="string"&&e.trim()?e.trim():null}function le(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}function Zt(e){return e instanceof Error&&"code"in e}var Vc=[".glb",".gltf"],Kc=[".png",".jpg",".jpeg",".webp"],Hc=[".env",".hdr",".dds",".ktx",".ktx2"],Wc=[...Kc,...Hc],qc=[".mp3",".wav",".ogg",".flac",".aac",".m4a"],vo=[...Vc,...Wc,...qc];var ur=B.resolve(process.cwd()),Yc=await Xc(ur),_o=Zc(Yc),Qt=Qc(ur,_o),[en,He,...Go]=process.argv.slice(2);en==="asset"&&(He==="register"||He==="unregister")?await To(Qt,He==="unregister"?["--unregister",...Go]:Go):en==="asset"&&He==="refresh-metadata"?await eu(Qt):en==="asset"&&He==="regenerate-catalog"?await tu(Qt):en==="scene"&&He==="recompile"?await nu(ur,_o,Qt):(process.stderr.write(["Usage:"," fps-editor-project asset register --payload /path/to/payload.json"," fps-editor-project asset unregister --asset-id asset_xxx [--keep-file] [--force]"," fps-editor-project asset refresh-metadata"," fps-editor-project asset regenerate-catalog"," fps-editor-project scene recompile",""].join(`
14
- `)),process.exitCode=1);async function Xc(e){let t=B.join(e,"fps.config.ts"),n=await import(`${Jc(t).href}?fps-editor-project=${Date.now()}`),r=n.default??n.fpsConfig;if(!r||typeof r!="object"||r.schemaVersion!==1)throw new Error("fps.config.ts must default-export a valid defineFpsProject() definition.");return r}function Zc(e){let t=e.authoring?.source,n=e.authoring?.assets;if(!t||!n)throw new Error("fps.config.ts is missing authoring source/assets.");return{source:{editorScene:t.document,runtimeScene:t.runtimeArtifact,rendering:t.rendering,shadows:t.shadows},assets:n}}function Qc(e,t){let n=B.resolve(e,t.assets.importedDir),r=B.resolve(e,t.assets.generatedDir),i=B.dirname(n);return{cwd:e,codeKeyPolicy:"disabled",assetsDir:i,importedDir:n,generatedDir:r,manifestPath:B.join(r,"asset-catalog.manifest.json"),registryPath:B.join(r,"asset-catalog.generated.ts"),scenePath:B.resolve(e,t.source.runtimeScene),supportedExtensions:vo,commands:{register:"asset:register",unregister:"asset:unregister"},relativeImportedPath(o,a){let s=o==="sound"?"sounds":o==="model"?"":"textures";return B.relative(r,B.join(n,s,a)).split(B.sep).join("/")},resolveAssetMetadata(o){return qt({kind:o.kind,sourcePath:o.sourcePath,existingMetadata:o.existingMetadata,payloadMetadata:o.payloadMetadata,guid:o.guid,assetId:o.assetId,cwd:e,assetsDir:i})}}}async function eu(e){let t=await Oe(e),n=0;for(let r of t){if(!r.relativePath)continue;let i=B.resolve(e.generatedDir,r.relativePath);await Yt(e,{payloadData:{sourcePath:i,kind:r.kind,guid:r.guid,projectAssetId:r.assetId,assetName:r.originalFileName,displayName:r.displayName,category:r.category,placeable:r.placeable,warmupCount:r.warmupCount,singleton:r.singleton,materialMode:r.materialMode,metadata:r.metadata}}),n+=1}process.stdout.write(`Refreshed metadata for ${n} canonical asset entries.
15
- `)}async function tu(e){let t=await Do(e),n=await Oe(e),r=Wt(n,{codeKeyPolicy:e.codeKeyPolicy,generatedBy:"fps-editor-project asset regenerate-catalog"});await cr.writeFile(e.registryPath,r),process.stdout.write(`Regenerated ${e.registryPath} from ${n.length} canonical asset entries after refreshing ${t.refreshedAssets.length} asset(s).
16
- `)}async function nu(e,t,n){let r=B.resolve(e,t.source.editorScene),i=B.resolve(e,t.source.runtimeScene),o=t.source.shadows?B.resolve(e,t.source.shadows):null,[a,s,l,d]=await Promise.all([lr(r),lr(i),o?lr(o):null,Oe(n)]),u=mi(a,ci(d)),c=Ti(u,s,{...l?{shadowMapExperimentConfig:l}:{},readCustomTransformRuntimeData:m=>m?.transformType==="groundDecal"&&m.groundDecal?{groundDecal:zi(m.groundDecal)}:null});await cr.writeFile(i,`${JSON.stringify(c.sceneConfig,null,2)}
8
+ `}import nn from"node:crypto";import N from"node:fs/promises";import R from"node:path";import qr from"node:fs/promises";import W from"node:path";var Jr=5;async function qt(e){let t={...e.existingMetadata??{},...e.payloadMetadata??{}},r=await zl(e);if(r?(t.assetAnalysis=r,t.assetAnalysisStatus="complete"):(delete t.assetAnalysis,t.assetAnalysisStatus="unavailable"),e.kind==="texture"||e.kind==="image"){let i=fc(e.sourcePath,t);return i&&(t.textureUsage=i.usage,t.capabilities={...F(t.capabilities)?t.capabilities:{},materialTexture:i.materialTexture,environmentTexture:i.environmentTexture}),Object.keys(t).length>0?t:null}if(e.kind!=="model")return Object.keys(t).length>0?t:null;t.assetMetadataVersion=Jr;let n=await Bl(e.sourcePath,{assetGuid:e.guid,assetId:e.assetId,cwd:e.cwd,assetsDir:e.assetsDir,existingMaterialSlots:t.materialSlots});return n.length===0?delete t.materialSlots:t.materialSlots=n,Object.keys(t).length>0?t:null}async function zl(e){return e.kind==="model"?Vl(e.sourcePath):e.kind==="texture"||e.kind==="image"?Kl(e.sourcePath):null}async function Bl(e,t={}){try{let r=await Qi(e);return rc(r,{...t,sourcePath:e})}catch{return[]}}async function Qi(e){let t=W.extname(e).toLowerCase();if(t===".gltf")return JSON.parse(await qr.readFile(e,"utf8"));if(t!==".glb")return null;let r=await qr.readFile(e);if(r.length<20||r.toString("utf8",0,4)!=="glTF"||r.readUInt32LE(4)!==2||r.readUInt32LE(8)>r.length)return null;let o=12;for(;o+8<=r.length;){let a=r.readUInt32LE(o),s=r.readUInt32LE(o+4);if(o+=8,o+a>r.length)return null;if(s===1313821514){let l=r.toString("utf8",o,o+a).replace(/\0+$/g,"");return JSON.parse(l)}o+=a}return null}async function Vl(e){try{let t=await Qi(e);if(!t||typeof t!="object")return null;let r=Array.isArray(t.scenes)?t.scenes:[],n=Array.isArray(t.nodes)?t.nodes:[],i=Array.isArray(t.meshes)?t.meshes:[],o=Array.isArray(t.materials)?t.materials:[],a=Array.isArray(t.textures)?t.textures:[],s=Array.isArray(t.images)?t.images:[],l=Array.isArray(t.animations)?t.animations:[],d=Array.isArray(t.skins)?t.skins:[],u=Array.isArray(t.accessors)?t.accessors:[],c=io(t),m=oo(n),p=new Set(c),g=i.reduce((w,M)=>w+(Array.isArray(M?.primitives)?M.primitives.length:0),0),b=i.reduce((w,M)=>w+(Array.isArray(M?.primitives)?M.primitives.reduce((O,z)=>O+(Array.isArray(z?.targets)?z.targets.length:0),0):0),0),S=Yl({nodeCount:n.length,meshCount:i.length,primitiveCount:g,materialCount:o.length,textureCount:a.length,imageCount:s.length}),x=Xl({nodeCount:n.length,meshCount:i.length,primitiveCount:g,materialCount:o.length,textureCount:a.length,imageCount:s.length,animationCount:l.length,skinCount:d.length,morphTargetCount:b,complexity:S});return{kind:"gltf",format:W.extname(e).toLowerCase()===".gltf"?"gltf":"glb",summary:`${n.length} nodes, ${i.length} meshes, ${g} primitives, ${o.length} materials`,complexity:S,sceneCount:r.length,nodeCount:n.length,meshCount:i.length,primitiveCount:g,materialCount:o.length,textureCount:a.length,imageCount:s.length,animationCount:l.length,skinCount:d.length,morphTargetCount:b,nodes:Hl(n,i,o,u,m,p),meshes:Wl(i,o,u),materials:ql(t),diagnostics:x}}catch{return null}}async function Kl(e){try{let t=await qr.readFile(e),r=W.extname(e).toLowerCase(),n=r===".png"?Zl(t):r===".jpg"||r===".jpeg"?Ql(t):r===".webp"?ec(t):null;if(!n)return null;let i=tc(n);return{kind:"image",format:n.format,summary:`${n.width}x${n.height} ${n.mime}`,complexity:n.estimatedPixels>=4096*4096?"high":n.estimatedPixels>=2048*2048?"medium":"low",width:n.width,height:n.height,mime:n.mime,bitDepth:n.bitDepth,hasAlpha:n.hasAlpha,estimatedPixels:n.estimatedPixels,diagnostics:i}}catch{return null}}function Hl(e,t,r,n,i,o){return e.slice(0,100).map((a,s)=>{let l=Number.isInteger(a?.mesh)?a.mesh:-1,d=l>=0&&l<t.length?t[l]:null,u=Array.isArray(a?.children)?a.children.filter(p=>Number.isInteger(p)):[],c=ao(e,i,o,s),m={nodeIndex:s,nodeIndexPath:lo(i,s),...typeof a?.name=="string"&&a.name.trim()?{name:a.name.trim()}:{},...c?{ownerNodePath:c}:{},...u.length>0?{children:u}:{}};if(d){let p=eo(d,r,n);Object.assign(m,{meshIndex:l,...typeof d?.name=="string"&&d.name.trim()?{meshName:d.name.trim()}:{},primitiveCount:p.length,...p.length>0?{primitives:p}:{}})}return m})}function Wl(e,t,r){return e.slice(0,50).map((n,i)=>{let o=Array.isArray(n?.primitives)?n.primitives:[],a=[...new Set(o.map(l=>Number.isInteger(l?.material)?l.material:-1).filter(l=>l>=0))],s=eo(n,t,r);return{meshIndex:i,...typeof n?.name=="string"&&n.name.trim()?{name:n.name.trim()}:{},primitiveCount:o.length,...s.length>0?{primitives:s}:{},...a.length>0?{materialIndices:a}:{},...a.length>0?{materialNames:a.map(l=>{let d=t[l];return typeof d?.name=="string"?d.name.trim():""}).filter(Boolean)}:{}}})}function eo(e,t,r){let n=F(e)?e:{};return(Array.isArray(n.primitives)?n.primitives:[]).map((o,a)=>{let s=Number.isInteger(o?.material)?o.material:-1,l=s>=0?t[s]:null,d=typeof l?.name=="string"&&l.name.trim()?l.name.trim():"",u=co(o,r),c=uo(o,r);return{primitiveIndex:a,...Number.isInteger(o?.mode)?{mode:o.mode}:{},...s>=0?{sourceMaterialIndex:s}:{},...d?{materialName:d}:{},...Number.isFinite(u)?{triangleCount:u}:{},...c?{boundingBox:c}:{}}})}function ql(e){return(Array.isArray(e?.materials)?e.materials:[]).slice(0,50).map((r,n)=>{let i=r?.pbrMetallicRoughness&&typeof r.pbrMetallicRoughness=="object"?r.pbrMetallicRoughness:{},o=Jl(r,i);return{sourceMaterialIndex:n,...typeof r?.name=="string"&&r.name.trim()?{materialName:r.name.trim()}:{},...Array.isArray(i.baseColorFactor)?{baseColorFactor:i.baseColorFactor.slice(0,4)}:{},metallicFactor:Number.isFinite(i.metallicFactor)?i.metallicFactor:1,roughnessFactor:Number.isFinite(i.roughnessFactor)?i.roughnessFactor:1,alphaMode:ro(r?.alphaMode)??"opaque",...Number.isFinite(r?.alphaCutoff)?{alphaCutoff:r.alphaCutoff}:{},...o.length>0?{textureSlots:o}:{}}})}function Jl(e,t){let r=[];return pt(r,"baseColor",t?.baseColorTexture),pt(r,"metallicRoughness",t?.metallicRoughnessTexture),pt(r,"normal",e?.normalTexture),pt(r,"occlusion",e?.occlusionTexture),pt(r,"emissive",e?.emissiveTexture),r}function pt(e,t,r){!F(r)||!Number.isInteger(r.index)||e.push({slot:t,textureIndex:r.index,...Number.isFinite(r.texCoord)?{texCoord:r.texCoord}:{}})}function Yl(e){return e.nodeCount>=300||e.meshCount>=250||e.primitiveCount>=300||e.materialCount>=200||e.textureCount>=80||e.imageCount>=80?"high":e.nodeCount>=100||e.meshCount>=80||e.primitiveCount>=100||e.materialCount>=50||e.textureCount>=24||e.imageCount>=24?"medium":"low"}function Xl(e){let t=[];return e.complexity==="high"&&t.push({severity:"warning",source:"asset",code:"asset.analysis.highComplexity",message:"GLTF asset is structurally complex; agent should place and inspect it before duplicating or using dense shadows.",details:{nodeCount:e.nodeCount,meshCount:e.meshCount,primitiveCount:e.primitiveCount,materialCount:e.materialCount,textureCount:e.textureCount,imageCount:e.imageCount}}),(e.animationCount>0||e.skinCount>0||e.morphTargetCount>0)&&t.push({severity:"info",source:"asset",code:"asset.analysis.riggedOrAnimated",message:"GLTF asset contains animation, skin, or morph target data.",details:{animationCount:e.animationCount,skinCount:e.skinCount,morphTargetCount:e.morphTargetCount}}),t}function Zl(e){if(e.length<33||e[0]!==137||e.toString("ascii",1,4)!=="PNG"||e[4]!==13||e[5]!==10||e[6]!==26||e[7]!==10||e.toString("ascii",12,16)!=="IHDR")return null;let r=e.readUInt32BE(16),n=e.readUInt32BE(20),i=e[24],o=e[25];return{format:"png",mime:"image/png",width:r,height:n,bitDepth:i,hasAlpha:o===4||o===6,estimatedPixels:r*n}}function Ql(e){if(e.length<4||e[0]!==255||e[1]!==216)return null;let t=2;for(;t+9<e.length;){if(e[t]!==255){t+=1;continue}let r=e[t+1],n=e.readUInt16BE(t+2);if(n<2)return null;if(r>=192&&r<=207&&![196,200,204].includes(r)&&t+8<e.length){let o=e[t+4],a=e.readUInt16BE(t+5),s=e.readUInt16BE(t+7);return{format:"jpeg",mime:"image/jpeg",width:s,height:a,bitDepth:o,hasAlpha:!1,estimatedPixels:s*a}}t+=2+n}return null}function ec(e){if(e.length<30||e.toString("ascii",0,4)!=="RIFF"||e.toString("ascii",8,12)!=="WEBP")return null;let t=e.toString("ascii",12,16);if(t==="VP8X"&&e.length>=30){let r=e[20],n=Yi(e,24)+1,i=Yi(e,27)+1;return{format:"webp",mime:"image/webp",width:n,height:i,hasAlpha:(r&16)!==0,estimatedPixels:n*i}}if(t==="VP8 "&&e.length>=30){let r=e.readUInt16LE(26)&16383,n=e.readUInt16LE(28)&16383;return{format:"webp",mime:"image/webp",width:r,height:n,hasAlpha:!1,estimatedPixels:r*n}}if(t==="VP8L"&&e.length>=25&&e[20]===47){let r=e.readUInt32LE(21),n=(r&16383)+1,i=(r>>14&16383)+1;return{format:"webp",mime:"image/webp",width:n,height:i,hasAlpha:!0,estimatedPixels:n*i}}return null}function Yi(e,t){return e[t]|e[t+1]<<8|e[t+2]<<16}function tc(e){let t=[];return e.estimatedPixels>=4096*4096&&t.push({severity:"warning",source:"asset",code:"asset.analysis.largeImage",message:"Image asset is large; agent should inspect texture usage before assigning it broadly.",details:{width:e.width,height:e.height,estimatedPixels:e.estimatedPixels}}),t}function rc(e,t={}){if(!e||typeof e!="object")return[];let r=Array.isArray(e.nodes)?e.nodes:[],n=Array.isArray(e.meshes)?e.meshes:[],i=Array.isArray(e.materials)?e.materials:[],o=ic(e,t),a=io(e),s=oo(r),l=new Set(a),d=Array.isArray(e.accessors)?e.accessors:[],u=lc(t.existingMaterialSlots),c=[],m=new Map;for(let p=0;p<r.length;p+=1){let g=r[p],b=Number.isInteger(g?.mesh)?g.mesh:-1;if(b<0||b>=n.length)continue;let S=ao(r,s,l,p);if(!S)continue;let x=n[b],D=Array.isArray(x?.primitives)?x.primitives:[],w=gc(g,x,S),M=so(x),O=lo(s,p);for(let z=0;z<D.length;z+=1){let Pe=D[z],f=pc(Pe,i),v=no({ownerNodePath:S,nodeIndex:p,meshIndex:b,primitiveIndex:z}),y=co(Pe,d),G=uo(Pe,d),J=D.length>1?`${w} / Primitive ${z}`:w,Y={ownerNodePath:S,nodeIndex:p,nodeIndexPath:O,meshIndex:b,primitiveIndex:z,...M?{sourceMeshName:M}:{},...f.index>=0?{sourceMaterialIndex:f.index}:{},...Number.isFinite(y)?{triangleCount:y}:{},...G?{boundingBox:G}:{}};if(f.index>=0){let j=m.get(f.index)??{label:J,materialName:f.name,sourceSurfaces:[]};j.sourceSurfaces.push(Y),m.set(f.index,j);continue}c.push({slotId:u.byExactSource.get(v)??cc({assetGuid:t.assetGuid,assetId:t.assetId,nodeIndex:p,meshIndex:b,primitiveIndex:D.length>1?z:void 0}),label:J,sourceSurfaces:[Y]})}}for(let[p,g]of m){let b=g.sourceSurfaces.sort(to);c.push({slotId:u.bySourceMaterialIndex.get(p)??uc({assetGuid:t.assetGuid,assetId:t.assetId,sourceMaterialIndex:p}),label:g.label,sourceSurfaces:b,...g.materialName?{materialName:g.materialName,materialNames:[g.materialName]}:{},...oc(o,[p])})}return c.sort(nc)}function nc(e,t){let r=Array.isArray(e.sourceSurfaces)?e.sourceSurfaces[0]:void 0,n=Array.isArray(t.sourceSurfaces)?t.sourceSurfaces[0]:void 0;return to(r,n)}function to(e,t){let r=String(e?.ownerNodePath??"").localeCompare(String(t?.ownerNodePath??""));if(r!==0)return r;let n=Number.isInteger(e?.nodeIndex)?e.nodeIndex:-1,i=Number.isInteger(t?.nodeIndex)?t.nodeIndex:-1;if(n!==i)return n-i;let o=Number.isInteger(e?.meshIndex)?e.meshIndex:-1,a=Number.isInteger(t?.meshIndex)?t.meshIndex:-1;if(o!==a)return o-a;let s=Number.isInteger(e?.primitiveIndex)?e.primitiveIndex:-1,l=Number.isInteger(t?.primitiveIndex)?t.primitiveIndex:-1;return s-l}function ic(e,t={}){let r=Array.isArray(e?.materials)?e.materials:[],n=[];for(let i=0;i<r.length;i+=1){let o=ac(e,i,t);o&&n.push(o)}return n}function oc(e,t){if(!t.length||!e.length)return{};let r=new Map(e.map(i=>[i.sourceMaterialIndex,i])),n=t.map(i=>r.get(i)).filter(Boolean);return n.length>0?{sourceMaterialProfiles:n}:{}}function ac(e,t,r={}){let n=Array.isArray(e?.materials)?e.materials[t]:null;if(!n||typeof n!="object")return null;let i={},o=[],a=n.pbrMetallicRoughness&&typeof n.pbrMetallicRoughness=="object"?n.pbrMetallicRoughness:{},s={},l=Array.isArray(a.baseColorFactor)?a.baseColorFactor:null,d=Xi(l);d&&(s.color=d);let u=bt(e,a.baseColorTexture,r,"baseColor.texture",s,"texture",o);Object.keys(s).length>0&&(i.baseColor={...s,brightness:1,saturation:1,contrast:1,hue:0});let c={};bt(e,n.normalTexture,r,"normal.texture",c,"texture",o),Number.isFinite(n.normalTexture?.scale)?c.strength=n.normalTexture.scale:c.texture&&(c.strength=1),Object.keys(c).length>0&&(i.normal=c),i.metallic=Number.isFinite(a.metallicFactor)?a.metallicFactor:1,i.roughness=Number.isFinite(a.roughnessFactor)?a.roughnessFactor:1;let m={};bt(e,a.metallicRoughnessTexture,r,"metallicRoughness.texture",m,"texture",o),Object.keys(m).length>0&&(i.metallicRoughness=m);let p={};bt(e,n.occlusionTexture,r,"occlusion.texture",p,"texture",o),Number.isFinite(n.occlusionTexture?.strength)?p.strength=n.occlusionTexture.strength:p.texture&&(p.strength=1),Object.keys(p).length>0&&(i.occlusion=p);let g={},b=Xi(Array.isArray(n.emissiveFactor)?n.emissiveFactor:null),S=b&&(b.r!==0||b.g!==0||b.b!==0);S&&(g.color=b),bt(e,n.emissiveTexture,r,"emission.texture",g,"texture",o),S&&(g.intensity=1),Object.keys(g).length>0&&(i.emission=g);let x={},D=ro(n.alphaMode);if(D&&(x.mode=D),(D==="mask"||D==="blend")&&(l&&Number.isFinite(l[3])&&l[3]!==1&&(x.opacity=l[3]),Number.isFinite(n.alphaCutoff)?x.cutoff=n.alphaCutoff:D==="mask"&&(x.cutoff=.5),u.texture&&(x.texture=structuredClone(u.texture)),u.hint&&o.push({...u.hint,profilePath:"alpha.texture"})),Object.keys(x).length>0&&(i.alpha=x),Object.keys(i).length===0&&o.length===0)return null;let w=typeof n.name=="string"&&n.name.trim()?n.name.trim():"";return{sourceMaterialIndex:t,...w?{materialName:w}:{},...Object.keys(i).length>0?{profile:i}:{},...o.length>0?{textureHints:o}:{}}}function Xi(e){if(!Array.isArray(e)||e.length<3)return null;let[t,r,n]=e;return Number.isFinite(t)&&Number.isFinite(r)&&Number.isFinite(n)?{r:t,g:r,b:n}:null}function ro(e){return e==="MASK"?"mask":e==="BLEND"?"blend":e==="OPAQUE"?"opaque":null}function bt(e,t,r,n,i,o,a){let s=sc(e,t,r,n);return s.texture&&(i[o]=s.texture),s.hint&&a.push(s.hint),s}function sc(e,t,r,n){let i=F(t)?t:{},o=Number.isInteger(i.index)?i.index:-1;if(o<0)return{};let a=Array.isArray(e?.textures)?e.textures:[],s=Array.isArray(e?.images)?e.images:[],l=a[o],d=dc(l),u=d.imageIndex,c=u>=0?s[u]:null,m=typeof c?.uri=="string"?c.uri.trim():"",p=/^data:/i.test(m),g={profilePath:n,textureIndex:o,...u>=0?{imageIndex:u}:{},...d.previewImageIndex>=0?{previewImageIndex:d.previewImageIndex}:{},...m&&!p?{uri:m}:{},...Number.isInteger(c?.bufferView)?{bufferView:c.bufferView}:{},...typeof c?.mimeType=="string"&&c.mimeType.trim()?{mimeType:c.mimeType.trim()}:{}};if(c?.bufferView!=null)return{hint:{...g,reason:"embedded-texture"}};if(!m)return{hint:{...g,reason:"missing-image-uri"}};if(p)return{hint:{...g,reason:"embedded-texture"}};if(/^https?:\/\//i.test(m)||m.startsWith("/"))return{texture:{url:m}};let b=m;try{b=decodeURIComponent(m)}catch{return{hint:{...g,reason:"unresolved-external-texture"}}}let S=W.dirname(String(r.sourcePath??"")),x=W.resolve(S,b),D=r.assetsDir?W.resolve(r.assetsDir):"",w=r.cwd?W.resolve(r.cwd):"",M=D?W.relative(D,x):"../";return D&&w&&M&&!M.startsWith("..")&&!W.isAbsolute(M)?{texture:{url:`/${W.relative(w,x).split(W.sep).join("/")}`},hint:{...g,reason:"external-texture"}}:{hint:{...g,reason:"external-texture"}}}function dc(e){let t=F(e)?e:{},r=F(t.extensions)?t.extensions:{},n=Number.isInteger(t.source)?t.source:-1,i=F(r.KHR_texture_basisu)?r.KHR_texture_basisu:{};if(Number.isInteger(i.source))return{imageIndex:i.source,previewImageIndex:n>=0&&n!==i.source?n:-1};let o=F(r.EXT_texture_webp)?r.EXT_texture_webp:{};return Number.isInteger(o.source)?{imageIndex:o.source,previewImageIndex:-1}:{imageIndex:n,previewImageIndex:-1}}function lc(e){let t=new Map,r=new Map;if(!Array.isArray(e))return{byExactSource:t,bySourceMaterialIndex:new Map};for(let i of e){if(!F(i))continue;let o=Array.isArray(i.sourceSurfaces)?i.sourceSurfaces:[],a=typeof i.slotId=="string"?i.slotId.trim():"";if(!a)continue;let s=new Set;for(let l of o){if(!F(l))continue;let d=typeof l.ownerNodePath=="string"?l.ownerNodePath.trim().replace(/^\/+|\/+$/g,""):"",u=Number.isInteger(l.nodeIndex)?l.nodeIndex:-1,c=Number.isInteger(l.meshIndex)?l.meshIndex:-1,m=Number.isInteger(l.primitiveIndex)?l.primitiveIndex:-1;o.length===1&&d&&u>=0&&c>=0&&m>=0&&t.set(no({ownerNodePath:d,nodeIndex:u,meshIndex:c,primitiveIndex:m}),a),Number.isInteger(l.sourceMaterialIndex)&&l.sourceMaterialIndex>=0&&s.add(l.sourceMaterialIndex)}if(s.size===1){let[l]=s,d=r.get(l)??[];d.push(a),r.set(l,d)}}let n=new Map;for(let[i,o]of r)o.length===1&&n.set(i,o[0]);return{byExactSource:t,bySourceMaterialIndex:n}}function no(e){return[e.ownerNodePath,e.nodeIndex,e.meshIndex,e.primitiveIndex].join("\0")}function cc(e){let t=Number.isInteger(e.primitiveIndex)?`:${e.primitiveIndex}`:"",r=`${e.assetGuid||e.assetId||"asset"}:${e.nodeIndex}:${e.meshIndex}${t}`;return`slot_${mo(r)}`}function uc(e){let t=`${e.assetGuid||e.assetId||"asset"}:material:${e.sourceMaterialIndex}`;return`slot_${mo(t)}`}function fc(e,t){if(t.textureUsage==="material"||t.usage==="material")return{usage:"material",materialTexture:!0,environmentTexture:!1};if(F(t.capabilities)&&t.capabilities.materialTexture===!0)return{usage:"material",materialTexture:!0,environmentTexture:!1};if(t.textureUsage==="environment"||t.usage==="environment")return{usage:"environment",materialTexture:!1,environmentTexture:!0};if(F(t.capabilities)&&t.capabilities.environmentTexture===!0)return{usage:"environment",materialTexture:!1,environmentTexture:!0};let r=W.extname(e).toLowerCase();return[".env",".hdr",".dds",".ktx",".ktx2"].includes(r)?{usage:"environment",materialTexture:!1,environmentTexture:!0}:[".png",".jpg",".jpeg",".webp"].includes(r)?{usage:"material",materialTexture:!0,environmentTexture:!1}:null}function io(e){let t=Array.isArray(e.scenes)?e.scenes:[],r=Number.isInteger(e.scene)?e.scene:0,n=t[r]??t[0];return Array.isArray(n?.nodes)?n.nodes.filter(Number.isInteger):[]}function oo(e){let t=new Map;for(let r=0;r<e.length;r+=1){let n=Array.isArray(e[r]?.children)?e[r].children:[];for(let i of n)Number.isInteger(i)&&!t.has(i)&&t.set(i,r)}return t}function ao(e,t,r,n){let i=[],o=n,a=new Set;for(;Number.isInteger(o)&&o>=0&&o<e.length;){if(a.has(o))return"";a.add(o),i.push(mc(e[o],o));let s=t.get(o);if(typeof s!="number"||!Number.isInteger(s))break;o=s}return i.reverse(),i.length>1&&r.has(o)&&i.shift(),i.filter(Boolean).join("/")}function mc(e,t){return(F(e)&&typeof e.name=="string"?e.name.trim():"")||`node_${t}`}function gc(e,t,r){let n=F(e)&&typeof e.name=="string"?e.name.trim():"",i=so(t);return n||i||r.split("/").filter(Boolean).pop()||r}function so(e){return F(e)&&typeof e.name=="string"?e.name.trim():""}function lo(e,t){let r=[],n=t,i=new Set;for(;Number.isInteger(n)&&n>=0;){if(i.has(n))return[];i.add(n),r.push(n);let o=e.get(n);if(!Number.isInteger(o))break;n=o}return r.reverse(),r}function pc(e,t){let r=F(e)?e:{},n=Number.isInteger(r.material)?r.material:-1,i=n>=0?t[n]:null,o=typeof i?.name=="string"&&i.name.trim()?i.name.trim():"";return{index:n,name:o}}function co(e,t){let r=F(e)?e:{},n=Number.isInteger(r.indices)?r.indices:-1,i=fo(r),o=n>=0?t[n]:null,a=i>=0?t[i]:null,s=Number.isFinite(o?.count)?Number(o.count):Number.isFinite(a?.count)?Number(a.count):null;if(s==null)return null;let l=Number.isInteger(r.mode)?r.mode:4;return l===4?Math.floor(s/3):l===5||l===6?Math.max(0,s-2):0}function uo(e,t){let r=F(e)?e:{},n=fo(r),i=n>=0?t[n]:null,o=Zi(i?.min),a=Zi(i?.max);return o&&a?{min:o,max:a}:null}function fo(e){let t=F(e.attributes)?e.attributes:{};return Number.isInteger(t.POSITION)?t.POSITION:-1}function Zi(e){if(!Array.isArray(e)||e.length<3)return null;let t=Number(e[0]),r=Number(e[1]),n=Number(e[2]);return Number.isFinite(t)&&Number.isFinite(r)&&Number.isFinite(n)?[t,r,n]:null}function F(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function mo(e){let t=String(e??""),r=2166136261;for(let n=0;n<t.length;n+=1)r^=t.charCodeAt(n),r=Math.imul(r,16777619);return(r>>>0).toString(16).padStart(8,"0")}import yt from"node:fs/promises";import re from"node:path";async function po(e,t={}){try{let r=await bc(e);if(!r)return[];let n=Array.isArray(r.gltf.images)?r.gltf.images:[],i=t.imageIndexes?new Set(t.imageIndexes.filter(a=>Number.isInteger(a)&&a>=0)):null,o=[];for(let a=0;a<n.length;a+=1){if(i&&!i.has(a))continue;let s=q(n[a]);if(!s)continue;let l=await yc(e,r,s);if(!l)continue;let d=ht(s.name)??(l.originalFileName?re.parse(l.originalFileName).name:null)??void 0;o.push({imageIndex:a,bytes:l.bytes,extension:l.extension,mimeType:l.mimeType,...d?{displayName:d}:{},...l.originalFileName?{originalFileName:l.originalFileName}:{}})}return o}catch{return[]}}function bo(e){let t=new Set;for(let r of ho(e)){let n=be(r.imageIndex),i=be(r.previewImageIndex);n!=null&&t.add(n),i!=null&&t.add(i)}return[...t].sort((r,n)=>r-n)}function yo(e){let t=new Map;for(let r of ho(e)){let n=be(r.imageIndex),i=be(r.previewImageIndex);n==null||i==null||n===i||t.set(`${n}:${i}`,{imageIndex:n,previewImageIndex:i})}return[...t.values()].sort((r,n)=>r.imageIndex-n.imageIndex||r.previewImageIndex-n.previewImageIndex)}function ho(e){if(!e)return[];let t=[],r=Array.isArray(e.materialSlots)?e.materialSlots:[];for(let n of r){let i=q(n),o=Array.isArray(i?.sourceMaterialProfiles)?i.sourceMaterialProfiles:[];for(let a of o){let s=q(a),l=Array.isArray(s?.textureHints)?s.textureHints:[];for(let d of l){let u=q(d);u&&t.push(u)}}}return t}function So(e,t){if(!e||t.length===0)return e;let r=new Map(t.map(a=>[a.imageIndex,a.textureAssetId])),n=structuredClone(e),i=Array.isArray(n.materialSlots)?n.materialSlots:[],o=!1;for(let a of i){let s=q(a),l=Array.isArray(s?.sourceMaterialProfiles)?s.sourceMaterialProfiles:[];for(let d of l){let u=q(d);if(!u)continue;let c=Array.isArray(u.textureHints)?u.textureHints:[];if(c.length===0)continue;let m=[];for(let p of c){let g=q(p),b=be(g?.imageIndex),S=ht(g?.profilePath),x=b==null?null:r.get(b)??null;if(!x||!S||!Sc(S)){m.push(p);continue}let D=q(u.profile)??{};Ec(D,S,{textureAssetId:x}),u.profile=D,o=!0}m.length>0?u.textureHints=m:delete u.textureHints}}return o?n:e}async function bc(e){let t=re.extname(e).toLowerCase();if(t===".gltf"){let l=JSON.parse(await yt.readFile(e,"utf8")),d=await Promise.all((Array.isArray(l.buffers)?l.buffers:[]).map(u=>go(e,q(u))));return{gltf:l,buffers:d}}if(t!==".glb")return null;let r=await yt.readFile(e);if(r.length<20||r.toString("utf8",0,4)!=="glTF"||r.readUInt32LE(4)!==2||r.readUInt32LE(8)>r.length)return null;let n=null,i=[],o=12;for(;o+8<=r.length;){let l=r.readUInt32LE(o),d=r.readUInt32LE(o+4);if(o+=8,o+l>r.length)return null;let u=r.subarray(o,o+l);d===1313821514?n=JSON.parse(u.toString("utf8").replace(/\0+$/g,"")):d===5130562&&i.push(Buffer.from(u)),o+=l}if(!n)return null;let a=Array.isArray(n.buffers)?n.buffers:[],s=await Promise.all(a.map(async(l,d)=>{let u=q(l);return ht(u?.uri)?go(e,u):i[d]??(d===0?i[0]??null:null)}));return s.length===0&&i.length>0&&s.push(i[0]),{gltf:n,buffers:s}}async function go(e,t){let r=ht(t?.uri);if(!r)return null;let n=Po(r);if(n)return n.bytes;if(Xr(r))return null;let i=xo(r);return i?Eo(e,i):null}async function yc(e,t,r){let n=ht(r.uri);if(n){let p=Po(n);if(p){let D=Yr(p.bytes);return D?{bytes:p.bytes,...D}:null}if(Xr(n))return null;let g=xo(n);if(!g)return null;let b=await Eo(e,g);if(!b)return null;let S=re.basename(g),x=Yr(b);return x?{bytes:b,...x,originalFileName:S}:null}let i=be(r.bufferView);if(i==null)return null;let o=Array.isArray(t.gltf.bufferViews)?t.gltf.bufferViews:[],a=q(o[i]),s=be(a?.buffer)??0,l=t.buffers[s],d=be(a?.byteOffset)??0,u=be(a?.byteLength);if(!l||u==null||d+u>l.length)return null;let c=Buffer.from(l.subarray(d,d+u)),m=Yr(c);return m?{bytes:c,...m}:null}async function Eo(e,t){if(re.isAbsolute(t)||re.win32.isAbsolute(t)||t.includes("\0"))return null;try{let r=await yt.realpath(re.dirname(e)),n=re.resolve(r,t),i=await yt.realpath(n);return hc(r,i)?await yt.readFile(i):null}catch{return null}}function xo(e){if(Xr(e))return null;try{return decodeURIComponent(e)}catch{return null}}function hc(e,t){let r=re.relative(e,t);return r===""||!r.startsWith(`..${re.sep}`)&&r!==".."&&!re.isAbsolute(r)}function Po(e){let t=/^data:([^;,]+)?(?:;[^,]*)?,(.*)$/is.exec(e);if(!t)return null;let r=e.slice(0,e.indexOf(","));try{return{bytes:r.toLowerCase().includes(";base64")?Buffer.from(t[2]??"","base64"):Buffer.from(decodeURIComponent(t[2]??""),"utf8")}}catch{return null}}function Yr(e){return e.length>=8&&e.subarray(0,8).equals(Buffer.from([137,80,78,71,13,10,26,10]))?{extension:".png",mimeType:"image/png"}:e.length>=3&&e[0]===255&&e[1]===216&&e[2]===255?{extension:".jpg",mimeType:"image/jpeg"}:e.length>=12&&e.toString("ascii",0,4)==="RIFF"&&e.toString("ascii",8,12)==="WEBP"?{extension:".webp",mimeType:"image/webp"}:e.length>=12&&e.subarray(0,12).equals(Buffer.from([171,75,84,88,32,50,48,187,13,10,26,10]))?{extension:".ktx2",mimeType:"image/ktx2"}:null}function Sc(e){return["baseColor.texture","normal.texture","metallicRoughness.texture","occlusion.texture","emission.texture","emission.maskTexture","alpha.texture"].includes(e)}function Ec(e,t,r){let n=t.split("."),i=e;for(let o=0;o<n.length-1;o+=1){let a=n[o],s=q(i[a])??{};i[a]=s,i=s}i[n[n.length-1]]=r}function Xr(e){return/^[a-z][a-z0-9+.-]*:/i.test(e)||e.startsWith("/")||re.win32.isAbsolute(e)}function q(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:null}function ht(e){return typeof e=="string"&&e.trim()?e.trim():null}function be(e){return Number.isInteger(e)&&e>=0?e:null}function Qr(e){if(typeof e=="number"&&Number.isFinite(e)&&e>0)return e;if(!e||typeof e!="object")return;let t=e,r=Zr(t.x),n=Zr(t.y),i=Zr(t.z);if(!(r==null||n==null||i==null||r<=0||n<=0||i<=0))return{x:r,y:n,z:i}}function Zr(e){return typeof e=="number"&&Number.isFinite(e)?e:null}function en(e){return e==="shared"||e==="instance"?e:void 0}function tn(e){return Number.isInteger(e)&&e>=0?e:void 0}var C=class extends Error{constructor(t,r={}){super(t),this.name="PlayableEditorAssetRegistryError",this.details=r}};function xc(e){let t={};for(let r=0;r<e.length;r+=1){let n=e[r];if(n==="--unregister"){t.unregister=!0;continue}if(n==="--payload"){t.payload=e[r+1],r+=1;continue}if(n==="--asset-id"){t.assetId=e[r+1],r+=1;continue}if(n==="--guid"){t.guid=e[r+1],r+=1;continue}if(n==="--delete-file"){t.deleteFile=!0;continue}if(n==="--keep-file"){t.deleteFile=!1;continue}if(n==="--force"){t.force=!0;continue}(n==="--help"||n==="-h")&&(t.help=!0)}return t}async function To(e,t=process.argv.slice(2)){let r=xc(t),n=await wc(e),i=le(n.errorCodes),o=(a,s={})=>{let l={ok:!1,error:a,...s};process.stderr.write(`${JSON.stringify(l,null,2)}
9
+ `),process.exit(1)};try{if(r.help){process.stdout.write(["Usage:",` ${e.commands?.register??"npm run asset:register"} -- --payload /path/to/payload.json`,` ${e.commands?.unregister??"npm run asset:unregister"} -- --payload /path/to/payload.json`,` ${e.commands?.unregister??"npm run asset:unregister"} -- --asset-id asset_xxx [--keep-file] [--force]`,` ${e.commands?.unregister??"npm run asset:unregister"} -- --guid xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx [--keep-file] [--force]`,""].join(`
10
+ `));return}if(r.unregister){let s=await Ac(e,r,i);process.stdout.write(`${JSON.stringify(s)}
11
+ `);return}let a=await Yt(e,r,i);process.stdout.write(`${JSON.stringify(a)}
12
+ `)}catch(a){a instanceof C&&o(a.message,a.details),o("asset_register_failed",{message:a instanceof Error?a.message:String(a)})}}async function Yt(e,t,r={}){if(!t.payload&&!t.payloadData)throw new C("missing_payload_arg");let n=await Co(e,t),i=e.codeKeyPolicy??"legacy";if(i==="disabled"&&Object.prototype.hasOwnProperty.call(n,"codeKey"))throw new C("payload_code_key_disabled",{codeKeyPolicy:i,codeKey:n.codeKey});let o=R.resolve(e.cwd,String(n.sourcePath??n.assetPath??"")),a=Tc(e,o);if(!a)throw new C(e.unsupportedSourceErrorCode??r.sourceMustBeSupportedAsset??"source_must_be_supported_asset",{sourcePath:o,supportedExtensions:Mo(e)});try{await N.access(o)}catch{throw new C(r.sourceFileNotFound??"source_file_not_found",{sourcePath:o})}let s=vc(n);await N.mkdir(e.generatedDir,{recursive:!0});let l=await Oe(e),d=await dn(o),u=Wr(n.kind??n.assetKind??n.assetType,o);if(!u)throw new C("unsupported_asset_kind",{sourcePath:o,assetType:n.assetType});on(u,o,"source_path");let c=$c(l,n,s,o,d,u,e),m=$(n.assetName)??c?.originalFileName??R.basename(o),p=$(n.guid);if(c&&p&&c.guid!==p)throw new C("payload_guid_must_match_existing_asset",{guid:p,existingGuid:c.guid,existingAssetId:c.assetId});let g=c?.guid??p??nn.randomUUID(),b=$(n.projectAssetId),S=Kr(u,g);if(c?.assetId&&c.assetId!==S)throw new C("manifest_asset_id_must_match_guid",{guid:g,assetId:c.assetId,expectedAssetId:S});if(b&&b!==S)throw new C("project_asset_id_must_match_guid",{guid:g,projectAssetId:b,expectedAssetId:S});let x=`${S}${a}`,D=Dc(e,{existing:c,sourcePath:o,kind:u,targetFileName:x}),w=Ke(e,D,u,"target_path"),M=new Date().toISOString(),O=Hi($(n.displayName)??c?.displayName,m),z=Jt({...Jt(c?.external)??{},...s??{}}),Pe=!1,f=[],v=null;try{await N.mkdir(R.dirname(w),{recursive:!0});let y=kc(o,w),G=y||await Oo(w),J=!c||c.contentHash!==d.contentHash||!G;!y&&J&&(await N.copyFile(o,w),Pe=!c);let j=await Ro(e,{existing:c,payload:n,sourcePath:o,targetPath:w,kind:u,guid:g,assetId:S});if(u==="model"){let We=await Pc({config:e,manifest:l,metadata:j,sourcePath:o,sourceAssetId:S,sourceAssetGuid:g,sourceDisplayName:O,now:M});f=We.createdPaths,j=So(j,We.references)}let $e=an({...c??{},guid:g,assetId:S,kind:u,displayName:O,relativePath:D,originalFileName:m,...i==="legacy"?{codeKey:Wi($(n.codeKey)??$(n.assetName)??c?.codeKey,m)}:{},...$(n.category)?{category:$(n.category)}:{},placeable:u==="texture"?!0:typeof n.placeable=="boolean"?n.placeable:c?.placeable??u==="model",...tn(n.warmupCount)!=null?{warmupCount:tn(n.warmupCount)}:{},...typeof n.singleton=="boolean"?{singleton:n.singleton}:{},...en(n.materialMode)?{materialMode:en(n.materialMode)}:{},...Qr(n.scale)?{defaults:{transform:{scale:Qr(n.scale)}}}:{},contentHash:d.contentHash,byteSize:d.byteSize,external:z,metadata:j,createdAt:c?.createdAt??M,updatedAt:J?M:c?.updatedAt??M});if(!$e)throw new C("invalid_manifest_entry",{assetId:S,guid:g});v=$e;let Ie=l.findIndex(We=>We.guid===g||We.assetId===S);Ie>=0?l[Ie]=$e:l.push($e),l.sort(jc),await $o(e,l)}catch(y){Pe&&await N.rm(w,{force:!0}).catch(()=>{});for(let G of f)await N.rm(G,{force:!0}).catch(()=>{});throw y}return{ok:!0,guid:g,assetId:S,kind:u,...v?.contentHash?{contentHash:v.contentHash}:{},...v?.external?{external:v.external}:{},displayName:v?.displayName,originalFileName:v?.originalFileName,assetUrl:Nc(e,D,u),targetPath:w,manifestPath:e.manifestPath,registryPath:e.registryPath}}async function Pc(e){let t=bo(e.metadata),r=yo(e.metadata),n=await po(e.sourcePath,{imageIndexes:t}),i=[],o=new Map,a=[];try{for(let d of n){let u=No(d.bytes),c=e.manifest.find(O=>O.kind==="texture"&&O.contentHash===u.contentHash&&le(le(O.metadata).capabilities).materialTexture!==!1&&le(O.metadata).textureUsage!=="environment");if(c){o.set(d.imageIndex,c),i.push({imageIndex:d.imageIndex,textureAssetId:c.assetId});continue}let m=Fc(u.contentHash),p=Kr("texture",m),g=e.manifest.find(O=>O.guid===m||O.assetId===p);if(g)throw new C("derived_texture_identity_conflict",{sourceAssetId:e.sourceAssetId,imageIndex:d.imageIndex,assetId:p,contentHash:u.contentHash,conflictingAssetId:g.assetId,conflictingContentHash:g.contentHash});let b=`${p}${d.extension}`,S=ko(e.config,"texture",b),x=Ke(e.config,S,"texture","derived_texture_target_path");if(await N.mkdir(R.dirname(x),{recursive:!0}),await Oo(x)){let O=await dn(x);if(O.contentHash!==u.contentHash)throw new C("derived_texture_target_conflict",{sourceAssetId:e.sourceAssetId,imageIndex:d.imageIndex,assetId:p,targetPath:x,contentHash:u.contentHash,existingContentHash:O.contentHash})}else await Lc(x,d.bytes),a.push(x);let D=d.displayName?`${e.sourceDisplayName} / ${d.displayName}`:`${e.sourceDisplayName} Texture ${d.imageIndex+1}`,w=await Ro(e.config,{existing:null,payload:{metadata:{textureUsage:"material",capabilities:{materialTexture:!0,environmentTexture:!1},derivedFrom:{kind:"gltf-image",sourceAssetId:e.sourceAssetId,sourceAssetGuid:e.sourceAssetGuid,imageIndex:d.imageIndex,mimeType:d.mimeType}}},sourcePath:x,targetPath:x,kind:"texture",guid:m,assetId:p}),M=an({guid:m,assetId:p,kind:"texture",displayName:D,relativePath:S,originalFileName:d.originalFileName??`${Uc(D)}${d.extension}`,category:"Texture",placeable:!0,contentHash:u.contentHash,byteSize:u.byteSize,metadata:w,createdAt:e.now,updatedAt:e.now});if(!M)throw new C("invalid_derived_texture_manifest_entry",{sourceAssetId:e.sourceAssetId,imageIndex:d.imageIndex,assetId:p});e.manifest.push(M),o.set(d.imageIndex,M),i.push({imageIndex:d.imageIndex,textureAssetId:p})}let s=new Map,l=new Map;for(let d of o.values())R.extname(d.relativePath).toLowerCase()===".ktx2"&&s.set(d.assetId,d);for(let d of r){let u=o.get(d.imageIndex),c=o.get(d.previewImageIndex);!u||!c||R.extname(u.relativePath).toLowerCase()!==".ktx2"||l.set(u.assetId,c.assetId)}for(let d of s.values()){let u=le(d.metadata),c=Ic(u);delete c[e.sourceAssetId];let m=l.get(d.assetId);m&&(c[e.sourceAssetId]=m);let p=Object.fromEntries(Object.entries(c).sort(([S],[x])=>S.localeCompare(x))),g=Object.values(p)[0],b={...u};g?(b.previewTextureAssetId=g,b.previewTextureAssetIdsBySourceAssetId=p):(delete b.previewTextureAssetId,delete b.previewTextureAssetIdsBySourceAssetId),d.metadata=b}return{references:i,createdPaths:a}}catch(s){for(let l of a)await N.rm(l,{force:!0}).catch(()=>{});throw s}}function Ic(e){let t={},r=le(e.previewTextureAssetIdsBySourceAssetId);for(let[o,a]of Object.entries(r)){let s=$(o),l=$(a);s&&l&&(t[s]=l)}if(Object.keys(t).length>0)return t;let n=$(e.previewTextureAssetId),i=$(le(e.derivedFrom).sourceAssetId);return n&&i&&(t[i]=n),t}async function Do(e,t={}){let r=await Oe(e),n=[];for(let i of r){let o=Ke(e,i.relativePath,i.kind,"refresh_source_path"),a;try{a=await dn(o)}catch(u){throw Zt(u)&&u.code==="ENOENT"?new C(t.sourceFileNotFound??"source_file_not_found",{assetId:i.assetId,guid:i.guid,sourcePath:o}):u}let s=i.kind==="model"&&le(i.metadata).assetMetadataVersion!==Jr,l=i.kind==="texture"&&i.placeable===!1;if(i.contentHash===a.contentHash&&i.byteSize===a.byteSize&&!s&&!l)continue;let d=await Yt(e,{payloadData:{sourcePath:o,guid:i.guid,projectAssetId:i.assetId,kind:i.kind}},t);if(!d.contentHash)throw new C("asset_refresh_missing_content_hash",{assetId:i.assetId,guid:i.guid,sourcePath:o});n.push({guid:i.guid,assetId:i.assetId,kind:i.kind,...i.contentHash?{previousContentHash:i.contentHash}:{},contentHash:d.contentHash})}return{ok:!0,scannedAssetCount:r.length,refreshedAssets:n}}async function Ac(e,t,r={}){let n=await Co(e,t),i=$(t.assetId??n?.assetId),o=$(t.guid??n?.guid);if(!i&&!o)throw new C(r.missingAssetId??"missing_asset_id");let a=Bc(t,n),s=Vc(t,n);await N.mkdir(e.generatedDir,{recursive:!0});let l=await Oe(e),d=l.findIndex(p=>i&&p.assetId===i||o&&p.guid===o);if(d<0)throw new C(r.manifestEntryNotFound??"manifest_entry_not_found",{assetId:i,guid:o,manifestPath:e.manifestPath});let u=l[d];if(!u)throw new C("manifest_entry_not_found",{assetId:i,guid:o});await Kc(e,u.assetId,s,r),l.splice(d,1);let c=!1,m=null;return a&&(m=Ke(e,u.relativePath,u.kind,"unregister_target_path"),await N.rm(m,{force:!0}),c=!0),await $o(e,l),{ok:!0,guid:u.guid,assetId:u.assetId,kind:u.kind,removed:!0,deleteFile:a,force:s,deletedFile:c,targetPath:m,manifestPath:e.manifestPath,registryPath:e.registryPath}}async function Oe(e){let t=await Xt(e.manifestPath,[]);if(!Array.isArray(t))throw new C("manifest_invalid_root",{manifestPath:e.manifestPath});let r=t.map((a,s)=>{let l=an(a,!0);if(!l)throw new C("manifest_invalid_entry",{index:s,manifestPath:e.manifestPath});return l}),n=new Set,i=new Set,o=e.codeKeyPolicy??"legacy";for(let a of r){if(o==="disabled"&&a.codeKey)throw new C("manifest_code_key_disabled",{manifestPath:e.manifestPath,codeKeyPolicy:o,assetId:a.assetId,codeKey:a.codeKey});if(n.has(a.assetId))throw new C("manifest_duplicate_asset_id",{assetId:a.assetId});if(i.has(a.guid))throw new C("manifest_duplicate_guid",{guid:a.guid});n.add(a.assetId),i.add(a.guid)}return r}async function wc(e){return e.loadRules?e.loadRules():e.rulesPath?Xt(e.rulesPath,{}):{}}function Io(e){return(Array.isArray(e)?e:[e]).filter(r=>typeof r=="string"&&!!r.trim()).map(r=>{let n=r.trim().toLowerCase();return n.startsWith(".")?n:`.${n}`})}function Mo(e){let t=Io(e.supportedExtensions??e.supportedExtension);return t.length>0?t:Io(Vr)}function Tc(e,t){let r=t.toLowerCase();return Mo(e).find(n=>r.endsWith(n))??null}function Dc(e,t){return t.existing?.relativePath?t.existing.relativePath:Mc(e,t.sourcePath,t.kind)??ko(e,t.kind,t.targetFileName)}function ko(e,t,r){let n=e.relativeImportedPath;return n.length>=2?n(t,r):n({kind:t,fileName:r})}function Mc(e,t,r){let n=e.assetRootDir??e.assetsDir;if(!n)return null;let i=R.resolve(t);return!Ao(R.resolve(n),i)||Ao(R.resolve(e.generatedDir),i)?null:(on(r,i,"source_path"),R.relative(e.generatedDir,i).split(R.sep).join("/"))}function Ao(e,t){let r=R.relative(e,t);return r===""||!r.startsWith("..")&&!R.isAbsolute(r)}function kc(e,t){return R.relative(R.resolve(e),R.resolve(t))===""}function Cc(e,t,r){let n=R.relative(e,t);if(n.startsWith("..")||R.isAbsolute(n))throw new C(`${r}_outside_allowed_directory`,{parent:e,child:t})}function Rc(e,t,r){let n=R.relative(e,t);if(!n.startsWith("..")&&!R.isAbsolute(n))throw new C(`${r}_inside_forbidden_directory`,{parent:e,child:t})}function Ke(e,t,r,n){let i=R.resolve(e.generatedDir,t),o=R.resolve(e.assetRootDir??e.assetsDir??e.importedDir??e.generatedDir);return Cc(o,i,n),Rc(R.resolve(e.generatedDir),i,n),on(r,i,n),i}function Nc(e,t,r){let n=Ke(e,t,r,"asset_url_path");return typeof e.publicUrlForCatalogRelativePath=="function"?e.publicUrlForCatalogRelativePath(t):typeof e.publicUrlForRelativePath=="function"?e.publicUrlForRelativePath(t):`/${R.relative(e.cwd,n).split(R.sep).join("/")}`}function on(e,t,r){let n=R.extname(t).toLowerCase(),i=qi(e);if(!i.includes(n))throw new C(`${r}_unsupported_extension`,{kind:e,filePath:t,extension:n,supportedExtensions:i})}async function Xt(e,t){try{return JSON.parse(await N.readFile(e,"utf8"))}catch(r){if(Zt(r)&&r.code==="ENOENT")return t;throw r}}async function Co(e,t){if(t.payloadData)return structuredClone(t.payloadData);if(!t.payload)return{};let r=R.resolve(e.cwd,t.payload),n=await Xt(r,null);if(!n||typeof n!="object"||Array.isArray(n))throw new C("invalid_payload_json",{payloadPath:r});return n}function an(e,t=!1){if(!e||typeof e!="object"||Array.isArray(e))return null;let r=e,n=t?sn:$,i=n(r.guid),o=n(r.assetId),a=n(r.kind);if(t&&(!a||"assetKind"in r||"assetType"in r))return null;let s=t?Bi.includes(a)?a:null:Wr(r.kind??r.assetKind??r.assetType,r.relativePath),l=n(r.displayName),d=n(r.relativePath);if(!i||!o||!s||!l||!d||t&&(!Ne(r,"originalFileName")||!Ne(r,"codeKey")||!Ne(r,"category")||!Ne(r,"materialMode")||!Ne(r,"contentHash")||!Ne(r,"createdAt")||!Ne(r,"updatedAt")||"placeable"in r&&typeof r.placeable!="boolean"||"warmupCount"in r&&(!Number.isInteger(r.warmupCount)||r.warmupCount<0)||"singleton"in r&&typeof r.singleton!="boolean"||"defaults"in r&&xe(r.defaults)==null||"byteSize"in r&&(!Number.isFinite(r.byteSize)||r.byteSize<0)||"metadata"in r&&xe(r.metadata)==null||"external"in r&&!Oc(r.external)))return null;let u=xe(r.metadata),c=n(r.originalFileName),m=n(r.codeKey),p=n(r.category),g=n(r.materialMode),b=xe(r.defaults),S=n(r.contentHash),x=Jt(r.external),D=n(r.createdAt),w=n(r.updatedAt);return{guid:i,assetId:o,kind:s,displayName:l,relativePath:d,...c?{originalFileName:c}:{},...m?{codeKey:m}:{},...p?{category:p}:{},...typeof r.placeable=="boolean"?{placeable:r.placeable}:{},...typeof r.warmupCount=="number"?{warmupCount:r.warmupCount}:{},...typeof r.singleton=="boolean"?{singleton:r.singleton}:{},...g?{materialMode:g}:{},...b?{defaults:b}:{},...S?{contentHash:S}:{},...typeof r.byteSize=="number"?{byteSize:r.byteSize}:{},...x?{external:x}:{},...u?{metadata:u}:{},...D?{createdAt:D}:{},...w?{updatedAt:w}:{}}}function sn(e){return typeof e=="string"&&e.length>0&&e===e.trim()?e:null}function Ne(e,t){return!(t in e)||sn(e[t])!=null}function Oc(e){if(!e||typeof e!="object"||Array.isArray(e))return!1;let t=e,r=["platformAssetId","assetPath","assetUrl"],n=Object.keys(t);return n.length>0&&n.every(i=>r.includes(i)&&sn(t[i])!=null)}function Jt(e,t=!1){if(!e||typeof e!="object"||Array.isArray(e))return null;let r=e,n=$(r.platformAssetId),i;try{if(i=Ji(r.assetPath),t&&Object.prototype.hasOwnProperty.call(r,"assetPath")&&!i)throw new Error("external_asset_path_must_be_portable")}catch{if(t)throw new C("external_asset_path_must_be_portable",{assetPath:$(r.assetPath)})}let o=$(r.assetUrl);return!n&&!i&&!o?null:{...n?{platformAssetId:n}:{},...i?{assetPath:i}:{},...o?{assetUrl:o}:{}}}function xe(e){return!e||typeof e!="object"||Array.isArray(e)?null:structuredClone(e)}async function Ro(e,t){let r=xe(t.payload?.metadata);if(typeof e.resolveAssetMetadata=="function"){let n=await e.resolveAssetMetadata({...t,existingMetadata:xe(t.existing?.metadata),payloadMetadata:r}),i=xe(n);return i||null}return qt({kind:t.kind,sourcePath:t.sourcePath,existingMetadata:xe(t.existing?.metadata),payloadMetadata:r,guid:t.guid,assetId:t.assetId,cwd:e.cwd,assetsDir:e.assetsDir})}function $c(e,t,r,n,i,o,a){let s=$(t.guid),l=$(t.projectAssetId);if(s){let c=e.find(m=>m.guid===s);if(c)return c}if(l){let c=e.find(m=>m.assetId===l);if(c)return c}if(r?.platformAssetId){let c=e.find(m=>m.kind===o&&Gc(m.external)===r.platformAssetId);if(c)return c}if(r?.assetPath){let c=e.find(m=>m.kind===o&&_c(m.external)===r.assetPath);if(c)return c}let d=R.resolve(n),u=e.find(c=>{if(c.kind!==o)return!1;try{return R.resolve(Ke(a,c.relativePath,c.kind,"manifest_asset_path"))===d}catch{return!1}});if(u)return u;if(i.contentHash){let c=e.find(m=>m.kind===o&&m.contentHash===i.contentHash);if(c)return c}return null}function vc(e){return Jt({...e.external&&typeof e.external=="object"&&!Array.isArray(e.external)?e.external:{},platformAssetId:e.external?.platformAssetId??e.platformAssetId??e.assetId,assetUrl:e.external?.assetUrl??e.assetUrl},!0)}function Gc(e){return $(le(e).platformAssetId)}function _c(e){return $(le(e).assetPath)}function jc(e,t){return e.kind.localeCompare(t.kind)||e.displayName.localeCompare(t.displayName)||e.assetId.localeCompare(t.assetId)}async function rn(e,t){try{if(await N.readFile(e,"utf8")===t)return!1}catch(n){if(!Zt(n)||n.code!=="ENOENT")throw n}let r=`${e}.tmp-${process.pid}-${Date.now()}`;try{return await N.writeFile(r,t),await N.rename(r,e),!0}catch(n){throw await N.rm(r,{force:!0}).catch(()=>{}),n}}async function Lc(e,t){let r=`${e}.tmp-${process.pid}-${Date.now()}`;try{await N.writeFile(r,t),await N.rename(r,e)}catch(n){throw await N.rm(r,{force:!0}).catch(()=>{}),n}}async function dn(e){let t=await N.readFile(e),r=await N.stat(e);return{...No(t),byteSize:r.size}}function No(e){return{contentHash:`sha256:${nn.createHash("sha256").update(e).digest("hex")}`,byteSize:e.byteLength}}function Fc(e){let t=nn.createHash("sha256").update(`material-texture\0${e}`).digest("hex");return`${t.slice(0,8)}-${t.slice(8,12)}-5${t.slice(13,16)}-8${t.slice(17,20)}-${t.slice(20,32)}`}function Uc(e){return e.trim().replace(/[^\p{L}\p{N}._-]+/gu,"_").replace(/^_+|_+$/g,"")||"Imported_Texture"}async function Oo(e){try{return await N.access(e),!0}catch{return!1}}async function $o(e,t){let r=Wt(t,{codeKeyPolicy:e.codeKeyPolicy??"legacy"});await N.mkdir(R.dirname(e.manifestPath),{recursive:!0}),await N.mkdir(R.dirname(e.registryPath),{recursive:!0});let n=await wo(e.manifestPath),i=await wo(e.registryPath);try{await rn(e.manifestPath,`${JSON.stringify(t,null,2)}
13
+ `),await rn(e.registryPath,r)}catch(o){let a=[];for(let[s,l]of[[e.manifestPath,n],[e.registryPath,i]])try{await zc(s,l)}catch(d){a.push(d)}if(a.length>0){let s=new Error("generated_registry_transaction_rollback_failed");throw s.cause=o,s.rollbackErrors=a,s}throw o}}async function wo(e){try{return(await N.lstat(e)).isFile()?{kind:"file",content:await N.readFile(e,"utf8")}:{kind:"other"}}catch(t){if(Zt(t)&&t.code==="ENOENT")return{kind:"missing"};throw t}}async function zc(e,t){if(t.kind!=="other"){if(t.kind==="missing"){await N.rm(e,{force:!0});return}await rn(e,t.content)}}function Bc(e,t){return typeof e.deleteFile=="boolean"?e.deleteFile:t&&typeof t.deleteFile=="boolean"?t.deleteFile:!0}function Vc(e,t){return!!(e.force||t?.force===!0)}async function Kc(e,t,r,n){if(r||!e.scenePath)return;let i=await Xt(e.scenePath,null),a=(Array.isArray(i?.scene?.nodes)?i.scene.nodes:[]).filter(s=>s?.kind==="instance"&&s?.instance?.assetId===t||s?.kind==="image"&&s?.image?.assetId===t).map(s=>s.id).filter(Boolean);if(a.length!==0)throw new C(n.assetStillReferenced??"asset_still_referenced",{assetId:t,scenePath:e.scenePath,nodeIds:a})}function $(e){return typeof e=="string"&&e.trim()?e.trim():null}function le(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}function Zt(e){return e instanceof Error&&"code"in e}var Hc=[".glb",".gltf"],Wc=[".png",".jpg",".jpeg",".webp"],qc=[".env",".hdr",".dds",".ktx",".ktx2"],Jc=[...Wc,...qc],Yc=[".mp3",".wav",".ogg",".flac",".aac",".m4a"],vo=[...Hc,...Jc,...Yc];import Xc from"node:path";function Go(e){let t=[],r;for(let n=0;n<e.length;n+=1){let i=e[n];if(i!=="--project-root"&&!i.startsWith("--project-root=")){t.push(i);continue}if(r!==void 0)throw new Error("--project-root may only be provided once.");let o=i==="--project-root"?e[++n]:i.slice(15);if(o===void 0||!o.trim()||o.startsWith("--"))throw new Error("--project-root requires a non-empty path.");r=o}return{argv:t,projectRoot:Xc.resolve(process.cwd(),r??"."),explicit:r!==void 0}}var jo=Go(process.argv.slice(2)),un=jo.projectRoot,Qc=await eu(un),Lo=tu(Qc),Qt=ru(un,Lo),[er,He,..._o]=jo.argv;er==="asset"&&(He==="register"||He==="unregister")?await To(Qt,He==="unregister"?["--unregister",..._o]:_o):er==="asset"&&He==="refresh-metadata"?await nu(Qt):er==="asset"&&He==="regenerate-catalog"?await iu(Qt):er==="scene"&&He==="recompile"?await ou(un,Lo,Qt):(process.stderr.write(["Usage:"," fps-editor-project --project-root /path/to/project asset register --payload /path/to/payload.json"," fps-editor-project --project-root /path/to/project asset unregister --asset-id asset_xxx [--keep-file] [--force]"," fps-editor-project --project-root /path/to/project asset refresh-metadata"," fps-editor-project --project-root /path/to/project asset regenerate-catalog"," fps-editor-project --project-root /path/to/project scene recompile",""].join(`
14
+ `)),process.exitCode=1);async function eu(e){let t=V.join(e,"fps.config.ts"),r=await import(`${Zc(t).href}?fps-editor-project=${Date.now()}`),n=r.default??r.fpsConfig;if(!n||typeof n!="object"||n.schemaVersion!==1)throw new Error("fps.config.ts must default-export a valid defineFpsProject() definition.");return n}function tu(e){let t=e.authoring?.source,r=e.authoring?.assets;if(!t||!r)throw new Error("fps.config.ts is missing authoring source/assets.");return{source:{editorScene:t.document,runtimeScene:t.runtimeArtifact,rendering:t.rendering,shadows:t.shadows},assets:r}}function ru(e,t){let r=V.resolve(e,t.assets.importedDir),n=V.resolve(e,t.assets.generatedDir),i=V.dirname(r);return{cwd:e,codeKeyPolicy:"disabled",assetsDir:i,importedDir:r,generatedDir:n,manifestPath:V.join(n,"asset-catalog.manifest.json"),registryPath:V.join(n,"asset-catalog.generated.ts"),scenePath:V.resolve(e,t.source.runtimeScene),supportedExtensions:vo,commands:{register:"asset:register",unregister:"asset:unregister"},relativeImportedPath(o,a){let s=o==="sound"?"sounds":o==="model"?"":"textures";return V.relative(n,V.join(r,s,a)).split(V.sep).join("/")},resolveAssetMetadata(o){return qt({kind:o.kind,sourcePath:o.sourcePath,existingMetadata:o.existingMetadata,payloadMetadata:o.payloadMetadata,guid:o.guid,assetId:o.assetId,cwd:e,assetsDir:i})}}}async function nu(e){let t=await Oe(e),r=0;for(let n of t){if(!n.relativePath)continue;let i=V.resolve(e.generatedDir,n.relativePath);await Yt(e,{payloadData:{sourcePath:i,kind:n.kind,guid:n.guid,projectAssetId:n.assetId,assetName:n.originalFileName,displayName:n.displayName,category:n.category,placeable:n.placeable,warmupCount:n.warmupCount,singleton:n.singleton,materialMode:n.materialMode,metadata:n.metadata}}),r+=1}process.stdout.write(`Refreshed metadata for ${r} canonical asset entries.
15
+ `)}async function iu(e){let t=await Do(e),r=await Oe(e),n=Wt(r,{codeKeyPolicy:e.codeKeyPolicy,generatedBy:"fps-editor-project asset regenerate-catalog"});await cn.writeFile(e.registryPath,n),process.stdout.write(`Regenerated ${e.registryPath} from ${r.length} canonical asset entries after refreshing ${t.refreshedAssets.length} asset(s).
16
+ `)}async function ou(e,t,r){let n=V.resolve(e,t.source.editorScene),i=V.resolve(e,t.source.runtimeScene),o=t.source.shadows?V.resolve(e,t.source.shadows):null,[a,s,l,d]=await Promise.all([ln(n),ln(i),o?ln(o):null,Oe(r)]),u=mi(a,ci(d)),c=Ti(u,s,{...l?{shadowMapExperimentConfig:l}:{},readCustomTransformRuntimeData:m=>m?.transformType==="groundDecal"&&m.groundDecal?{groundDecal:zi(m.groundDecal)}:null});await cn.writeFile(i,`${JSON.stringify(c.sceneConfig,null,2)}
17
17
  `),process.stdout.write(`Runtime scene recompiled from the authoritative Editor document.
18
- `)}async function lr(e){return JSON.parse(await cr.readFile(e,"utf8"))}
18
+ `)}async function ln(e){return JSON.parse(await cn.readFile(e,"utf8"))}