@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
6 lines (5 loc) • 5.66 kB
JavaScript
/*
All material copyright ESRI, All Rights Reserved, unless otherwise specified.
See https://js.arcgis.com/4.33/esri/copyright.txt for details.
*/
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 o}from"../../../../core/urlUtils.js";import{TextureEncoding as n}from"./enums.js";import{readBinaryAttribute as s,createGeometryDescriptor as a}from"./I3SBinaryReader.js";import{getMaterialAndTextures as u,getMaterialAndTexturesFromShared as l,selectEncoding as f}from"./I3SMaterialUtil.js";class d{constructor(e,t,r,i,o,n){if(this._streamDataController=t,this._logger=r,this._defaultGeometrySchema=i,this._requiredAttributes=o,this._options=n,this._logLayer=e,this._layerUrl=e.parsedUrl.path,this._geometryDefinitions=e.geometryDefinitions,e.materialDefinitions){const t=e.textureSetDefinitions;this._materialAndTextures=e.materialDefinitions.map((r=>u(t,r,"integrated-mesh"===e.type)))}}_load(e,t,r){return this._streamDataController.request(e,t,r)}_loadAttribute(e,t,r){const i=`${this._layerUrl}/nodes/${e.resources.attributes}/attributes/${t.key}/0`;return this._load(i,"binary",r).then((e=>s(t,e)))}async loadAttributes(e,t,r){const o=await Promise.allSettled(t.map((t=>this._loadAttribute(e,t.attributeStorageInfo,r)))),n={};for(let s=0;s<t.length;++s){const r=o[s],a=t[s];if("fulfilled"===r.status){const e=r.value;n[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 n}async loadNodeData(r,i){const o=null!=this._requiredAttributes&&r.resources.attributes?e(this.loadAttributes(r,this._requiredAttributes,i)):null,{bufferDefinition:n,bufferIndex:s}=_(this._geometryDefinitions,r),u=!!r.resources.geometry,f=u?e(this._loadGeometry(r.resources.geometry,s,i)):null,d=r.resources.hasSharedResource?await this._loadShared(r,i):null,y=r.resources.materialDefinition,D=this._materialAndTextures&&null!=y&&y>=0?this._materialAndTextures[y]:null!=d?l(d):null,b=D?.material,x=D?.textures??[],p=`${r.id}`,A=!u&&this._options.loadFeatureData,$=A?await this._loadFeatureData(p,i):null,T=A?m($):c(b),j=null==T?h($):null,w=x.length>0?e(this.loadTextures(r,x,i)):null;let I=null,S=null;if(f){I=t(await f);const e=g(this._defaultGeometrySchema,d);S=a(n,e)}const U=w?t(await w):null,q=o?t(await o):{},B=q?{attributeData:q,loadedAttributes:this._requiredAttributes}:null;if(null!=T)return{geometryData:T,attributeDataInfo:B,geometryBuffer:I,geometryDescriptor:S,requiredTextures:x,textureData:U};if(null!=j)return{pointData:j,attributeDataInfo:B,geometryBuffer:I,geometryDescriptor:S,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=>o(e,t))):e.hrefConcat=o(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];"data:"===r.slice(0,5)&&(e.encoding[t]=r.slice(5))}else{const t=e.encoding;"data:"===t.slice(0,5)&&(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._load(r,"json",t);return d._fixTextureEncodings(i),d._addAbsoluteHrefTexture(i,r),i}_loadTexture(e,t,r,i,o){return i===n.DDS_S3TC||i===n.KTX2||i===n.Basis?this._load(e,"binary",o).then((e=>({id:t,usage:r,data:e,encoding:i}))):this._load(e,"image",o).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 o=f(t.encodings,this._options.textureEncodings);if(null==o)return this._logger.error("#loadTextures",this._logLayer,`No known encoding for texture found on node ${e.id}`),Promise.reject();const n=e.resources.texture||e.id,s=`${this._layerUrl}/nodes/${n}/textures/${o.name}`;return this._loadTexture(s,t.id,t.usage,o.encoding,r)})))}_loadFeatureData(e,t){const r=`${this._layerUrl}/nodes/${e}/features/0`;return this._load(r,"json",t)}_loadGeometry(e,t,r){const i=`${this._layerUrl}/nodes/${e}/geometries/${t}`;return this._load(i,"binary",r)}}function c(e){return{featureIds:[],geometries:[{type:"ArrayBufferView",params:{material:e}}],featureDataPosition:[0,0,0]}}function m(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 h(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 g(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 _(e,t){const r={bufferDefinition:null,bufferIndex:0},i=t.resources.geometryDefinition;if(null==e||null==i||i<0)return r;const o=i>=0?e[i].geometryBuffers:null;if(null==o)return r;for(let n=0;n<o.length;n++){const e=o[n];if(null==e.compressedAttributes)r.bufferIndex=n,r.bufferDefinition=o[n];else if("draco"===e.compressedAttributes.encoding&&!has("disable-feature:i3s-draco"))return r.bufferIndex=n,r.bufferDefinition=e,r}return r}export{d as default};