UNPKG

@arcgis/core

Version:

ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API

3 lines (2 loc) 5.52 kB
/* COPYRIGHT Esri - https://js.arcgis.com/5.0.8/LICENSE.txt */ import{result as e,assertResult as t}from"../../../../core/asyncUtils.js";import has from"../../../../core/has.js";import{clone as r}from"../../../../core/lang.js";import{throwIfAbortError as i}from"../../../../core/promiseUtils.js";import{makeAbsolute as s}from"../../../../core/urlUtils.js";import{readBinaryAttribute as o,createGeometryDescriptor as n}from"./I3SBinaryReader.js";import{getMaterialAndTextures as a,getMaterialAndTexturesFromShared as u,selectEncoding as l}from"./I3SMaterialUtil.js";class f{constructor(e,t,r,i,s,o){if(this._requester=t,this._logger=r,this._defaultGeometrySchema=i,this._requiredAttributes=s,this._options=o,this._logLayer=e,this._layerUrl=e.parsedUrl.path,this._geometryDefinitions=e.geometryDefinitions,e.materialDefinitions){const t=e.textureSetDefinitions;this._materialAndTextures=e.materialDefinitions.map(r=>a(t,r,"integrated-mesh"===e.type))}}_loadAttribute(e,t,r){const i=`${this._layerUrl}/nodes/${e.resources.attributes}/attributes/${t.key}/0`;return this._requester.request(i,"array-buffer",r).then(e=>o(t,e))}async loadAttributes(e,t,r){const s=await Promise.allSettled(t.map(t=>this._loadAttribute(e,t.attributeStorageInfo,r))),o={};for(let n=0;n<t.length;++n){const r=s[n],a=t[n];if("fulfilled"===r.status){const e=r.value;o[a.name]=e}else{const t=r.reason;i(t),this._logger.error("#loadAttributes",this._logLayer,`Failed to load attributeData for '${a.name}' on node '${e.id}'`,t)}}return o}async loadNodeData(r,i){const s=null!=this._requiredAttributes&&r.resources.attributes?e(this.loadAttributes(r,this._requiredAttributes,i)):null,{bufferDefinition:o,bufferIndex:a}=g(this._geometryDefinitions,r),l=!!r.resources.geometry,f=l?e(this._loadGeometry(r.resources.geometry,a,i)):null,_=r.resources.hasSharedResource?await this._loadShared(r,i):null,y=r.resources.materialDefinition,b=this._materialAndTextures&&null!=y&&y>=0?this._materialAndTextures[y]:null!=_?u(_):null,D=b?.material,x=b?.textures??[],p=`${r.id}`,A=!l&&this._options.loadFeatureData,q=A?await this._loadFeatureData(p,i):null,$=A?c(q):d(D),T=null==$?m(q):null,j=x.length>0?e(this.loadTextures(r,x,i)):null;let w=null,I=null;if(f){w=t(await f);const e=h(this._defaultGeometrySchema,_);I=n(o,e)}const U=j?t(await j):null,S=s?t(await s):{},P=S?{attributeData:S,loadedAttributes:this._requiredAttributes}:null;if(null!=$)return{geometryData:$,attributeDataInfo:P,geometryBuffer:w,geometryDescriptor:I,requiredTextures:x,textureData:U};if(null!=T)return{pointData:T,attributeDataInfo:P,geometryBuffer:w,geometryDescriptor:I,requiredTextures:x,textureData:U};throw new Error}static _addAbsoluteHrefTexture(e,t){const r=e.textureDefinitions;if(null!=r)for(const i of Object.keys(r))for(const e of r[i].images)Array.isArray(e.href)?e.hrefConcat=e.href.map(e=>s(e,t)):e.hrefConcat=s(e.href,t)}static _fixTextureEncodings(e){const t=e.textureDefinitions;if(null!=t)for(const r in t){const e=t[r];if(Array.isArray(e.encoding))for(let t=0;t<e.encoding.length;t++){const r=e.encoding[t];r.startsWith("data:")&&(e.encoding[t]=r.slice(5))}else{const t=e.encoding;t.startsWith("data:")&&(e.encoding=t.slice(5))}}}async _loadShared(e,t){if(null==e.resources.geometry)return{};const r=`${this._layerUrl}/nodes/${e.resources.geometry}/shared`,i=await this._requester.request(r,"json",t);return f._fixTextureEncodings(i),f._addAbsoluteHrefTexture(i,r),i}_loadTexture(e,t,r,i,s){return 4===i||1===i||2===i?this._requester.request(e,"array-buffer",s).then(e=>({id:t,usage:r,data:e,encoding:i})):this._requester.request(e,"image",s).then(e=>({id:t,usage:r,data:e,encoding:i}))}loadTextures(e,t,r){const i=this._options.textureUsageMask;return Promise.all(t.map(t=>{if(0===(t.usage&i))return null;const s=l(t.encodings,this._options.textureEncodings);if(null==s)return this._logger.error("#loadTextures",this._logLayer,`No known encoding for texture found on node ${e.id}`),Promise.reject();const o=e.resources.texture||e.id,n=`${this._layerUrl}/nodes/${o}/textures/${s.name}`;return this._loadTexture(n,t.id,t.usage,s.encoding,r)}))}_loadFeatureData(e,t){const r=`${this._layerUrl}/nodes/${e}/features/0`;return this._requester.request(r,"json",t)}_loadGeometry(e,t,r){const i=`${this._layerUrl}/nodes/${e}/geometries/${t}`;return this._requester.request(i,"array-buffer",r)}}function d(e){return{featureIds:[],geometries:[{type:"ArrayBufferView",params:{material:e}}],featureDataPosition:[0,0,0]}}function c(e){if(!e)return null;for(const t of e.featureData){const e=t.geometries;if(null!=e)for(const r of e)return{featureIds:[t.id],featureDataPosition:t.position,geometries:[r]}}return null}function m(e){if(!e)return null;const t=new Array;for(const r of e.featureData)null!=r.position&&t.push({featureIds:[r.id],featureDataPosition:r.position,geometries:[]});return t}function h(e,t){if(!e||!t?.materialDefinitions)return e;const i=Object.keys(t.materialDefinitions)[0];return!t.materialDefinitions[i].params.vertexRegions&&e.vertexAttributes.region&&delete(e=r(e)).vertexAttributes.region,e}function g(e,t){const r={bufferDefinition:null,bufferIndex:0},i=t.resources.geometryDefinition;if(null==e||null==i||i<0)return r;const s=i>=0?e[i].geometryBuffers:null;if(null==s)return r;for(let o=0;o<s.length;o++){const e=s[o];if(null==e.compressedAttributes)r.bufferIndex=o,r.bufferDefinition=s[o];else if("draco"===e.compressedAttributes.encoding&&!has("disable-feature:i3s-draco"))return r.bufferIndex=o,r.bufferDefinition=e,r}return r}export{f as default};