UNPKG

@animech-public/playcanvas

Version:
2 lines (1 loc) 3.66 kB
import{ADDRESS_CLAMP_TO_EDGE as e,TEXTURETYPE_RGBP as l,PIXELFORMAT_RGB8 as t,PIXELFORMAT_RGBA8 as s,TEXTURETYPE_RGBM as r,TEXTURETYPE_DEFAULT as n}from"../../platform/graphics/constants.js";import{Texture as a}from"../../platform/graphics/texture.js";import{Asset as i}from"../asset/asset.js";import{ResourceHandler as o}from"./handler.js";class u extends o{constructor(e){super(e,"cubemap"),this._device=e.graphicsDevice,this._registry=e.assets,this._loader=e.loader}load(e,l,t){this.loadAssets(t,l)}open(e,l,t){return t?t.resource:null}patch(e,l){this.loadAssets(e,((t,s)=>{t&&(l.fire("error",e),l.fire(`error:${e.id}`,t,e),e.fire("error",e))}))}getAssetIds(e){const l=[];if(l[0]=e.file,(e.loadFaces||!e.file)&&e.data&&e.data.textures)for(let t=0;t<6;++t)l[t+1]=e.data.textures[t];else l[1]=l[2]=l[3]=l[4]=l[5]=l[6]=null;return l}compareAssetIds(e,l){return e&&l?parseInt(e,10)===e||"string"==typeof e?e===l:e.url===l.url:null!==e==(null!==l)}update(i,o,u){const d=i.data||{},p=i._handlerState.assets,m=i._resources;let c,f,h;const g=[null,null,null,null,null,null,null],y=function(){return d.hasOwnProperty("type")?d.type:d.hasOwnProperty("rgbm")?d.rgbm?r:n:null};if(i.loaded&&u[0]===p[0])g[1]=m[1]||null,g[2]=m[2]||null,g[3]=m[3]||null,g[4]=m[4]||null,g[5]=m[5]||null,g[6]=m[6]||null;else if(u[0])if(c=u[0].resource,c.cubemap)for(h=0;h<6;++h)g[h+1]=new a(this._device,{name:`${i.name}_prelitCubemap${c.width>>h}`,cubemap:!0,type:y()||c.type,width:c.width>>h,height:c.height>>h,format:c.format,levels:[c._levels[h]],fixCubemapSeams:!0,addressU:e,addressV:e,mipmaps:0===h});else c.type=l,c.addressU=e,c.addressV=e,c.mipmaps=!1,g[1]=c;const _=u.slice(1);if(i.loaded&&this.cmpArrays(_,p.slice(1)))g[0]=m[0]||null;else if(-1===_.indexOf(null)){var w;const l=_.map((e=>e.resource)),r=[];for(f=0;f<l[0]._levels.length;++f)r.push(l.map((e=>e._levels[f])));const n=l[0].format,o=new a(this._device,{name:`${i.name}_faces`,cubemap:!0,type:y()||l[0].type,width:l[0].width,height:l[0].height,format:n===t?s:n,mipmaps:null==(w=d.mipmaps)||w,levels:r,minFilter:d.hasOwnProperty("minFilter")?d.minFilter:l[0].minFilter,magFilter:d.hasOwnProperty("magFilter")?d.magFilter:l[0].magFilter,anisotropy:d.hasOwnProperty("anisotropy")?d.anisotropy:1,addressU:e,addressV:e,fixCubemapSeams:!!u[0]});g[0]=o}if(!this.cmpArrays(g,m))for(i.resources=g,i._handlerState.assetIds=o,i._handlerState.assets=u,h=0;h<m.length;++h)null!==m[h]&&-1===g.indexOf(m[h])&&m[h].destroy();for(h=0;h<p.length;++h)null!==p[h]&&-1===u.indexOf(p[h])&&p[h].unload()}cmpArrays(e,l){if(e.length!==l.length)return!1;for(let t=0;t<e.length;++t)if(e[t]!==l[t])return!1;return!0}resolveId(e){const l=parseInt(e,10);return l===e||l.toString()===e?l:e}loadAssets(e,l){e.hasOwnProperty("_handlerState")||(e._handlerState={assetIds:[null,null,null,null,null,null,null],assets:[null,null,null,null,null,null,null]});const t=this,s=t.getAssetIds(e),r=[null,null,null,null,null,null,null],n=e._handlerState.assetIds,a=e._handlerState.assets,o=t._registry;let u=7;const d=function(n,a){r[n]=a,u--,0===u&&(t.update(e,s,r),l(null,e.resources))},p=function(e,t,s){l(t)},m=function(e,l){l.loaded?d(e,l):(o.once(`load:${l.id}`,d.bind(t,e)),o.once(`error:${l.id}`,p.bind(t,e)),l.loading||o.load(l))};let c;for(let l=0;l<7;++l){const r=this.resolveId(s[l]);if(r)if(t.compareAssetIds(r,n[l]))m(l,a[l]);else if(parseInt(r,10)===r)c=o.get(r),c?m(l,c):setTimeout(((e,l)=>{const t=o.get(l);t?m(e,t):p(0,`failed to find dependent cubemap asset=${l}`)}).bind(null,l,r));else{const t="string"==typeof r?{url:r,filename:r}:r;c=new i(`${e.name}_part_${l}`,"texture",t),o.add(c),m(l,c)}else d(l,null)}}}export{u as CubemapHandler};