@doegis/core
Version:
DOE GIS API
3 lines (1 loc) • 3.98 kB
JavaScript
import e from"../../../core/Logger.js";import{isSome as o,isNone as t}from"../../../core/maybe.js";import{b as r}from"../../../chunks/mat4f64.js";import{makeMaterialParameters as s,makeTextureSource as a}from"./LoaderResult.js";import{GLTFResource as n}from"./internal/Resource.js";import{TextureSamplingMode as i,PrimitiveType as l}from"../../webgl/enums.js";let u=0;async function m(s,a,i={},m=!0){const p=await n.load(s,a,i),f="gltf_"+u++,x={lods:[],materials:new Map,textures:new Map,meta:c(p)},g=!(!p.json.asset.extras||"symbolResource"!==p.json.asset.extras.ESRI_type),h=new Map;await d(p,(async(s,a,n,u)=>{const c=h.get(n)??0;h.set(n,c+1);const d=void 0!==s.mode?s.mode:l.TRIANGLES,g=d===l.TRIANGLES||d===l.TRIANGLE_STRIP||d===l.TRIANGLE_FAN?d:null;if(t(g))return void e.getLogger("esri.views.3d.glTF").warn("[Unsupported Feature] Unsupported primitive mode ("+l[d]+"). Skipping primitive.");if(!p.hasPositions(s))return void e.getLogger("esri.views.3d.glTF").warn("Skipping primitive without POSITION vertex attribute.");const v=p.getPositionData(s,i),w=p.getMaterial(s,i,m),R=p.hasNormals(s)?p.getNormalData(s,i):null,S=p.hasTangents(s)?p.getTangentData(s,i):null,_=p.hasTextureCoordinates(s)?p.getTextureCoordinates(s,i):null,E=p.hasVertexColors(s)?p.getVertexColors(s,i):null,I=p.getIndexData(s,i),M={transform:r(a),attributes:{position:await v,normal:R?await R:null,texCoord0:_?await _:null,color:E?await E:null,tangent:S?await S:null},indices:await I,primitiveType:g,material:T(x,await w,f)};let F=null;o(x.meta)&&o(x.meta.ESRI_lod)&&"screenSpaceRadius"===x.meta.ESRI_lod.metric&&(F=x.meta.ESRI_lod.thresholds[n]),x.lods[n]=x.lods[n]||{parts:[],name:u,lodThreshold:F},x.lods[n].parts[c]=M}));for(const e of x.lods)e.parts=e.parts.filter((e=>!!e));const v=await p.getLoadedBuffersSize();return{model:x,meta:{isEsriSymbolResource:g,uri:p.uri},customMeta:{},size:v}}function c(e){const t=e.json;let r=null;return t.nodes.forEach((e=>{const t=e.extras;o(t)&&(t.ESRI_proxyEllipsoid||t.ESRI_lod)&&(r=t)})),r}async function d(o,t){const r=o.json,s=r.scenes[r.scene||0].nodes,a=s.length>1,n=[];for(const e of s){const o=r.nodes[e];if(n.push(i(e,0)),p(o)&&!a){o.extensions.MSFT_lod.ids.forEach(((e,o)=>i(e,o+1)))}}async function i(s,a){const l=r.nodes[s],u=o.getNodeTransform(s);if(null!=l.weights&&e.getLogger("esri.views.3d.glTF").warn("[Unsupported Feature] Morph targets are not supported."),null!=l.mesh){const e=r.meshes[l.mesh];for(const o of e.primitives)n.push(t(o,u,a,e.name))}for(const e of l.children||[])n.push(i(e,a))}await Promise.all(n)}function p(e){return e.extensions&&e.extensions.MSFT_lod&&Array.isArray(e.extensions.MSFT_lod.ids)}function T(e,o,t){const r=o=>{const r=`${t}_tex_${o&&o.id}${o&&o.name?"_"+o.name:""}`;if(o&&!e.textures.has(r)){const t=a(o.data,{wrap:{s:o.wrapS,t:o.wrapT},mipmap:f.includes(o.minFilter),noUnpackFlip:!0});e.textures.set(r,t)}return r},n=`${t}_mat_${o.id}_${o.name}`;if(!e.materials.has(n)){const t=s({color:[o.color[0],o.color[1],o.color[2]],opacity:o.color[3],alphaMode:o.alphaMode,alphaCutoff:o.alphaCutoff,doubleSided:o.doubleSided,colorMixMode:o.ESRI_externalColorMixMode,textureColor:o.colorTexture?r(o.colorTexture):void 0,textureNormal:o.normalTexture?r(o.normalTexture):void 0,textureOcclusion:o.occlusionTexture?r(o.occlusionTexture):void 0,textureEmissive:o.emissiveTexture?r(o.emissiveTexture):void 0,textureMetallicRoughness:o.metallicRoughnessTexture?r(o.metallicRoughnessTexture):void 0,emissiveFactor:[o.emissiveFactor[0],o.emissiveFactor[1],o.emissiveFactor[2]],colorTextureTransform:o.colorTextureTransform,normalTextureTransform:o.normalTextureTransform,occlusionTextureTransform:o.occlusionTextureTransform,emissiveTextureTransform:o.emissiveTextureTransform,metallicRoughnessTextureTransform:o.metallicRoughnessTextureTransform,metallicFactor:o.metallicFactor,roughnessFactor:o.roughnessFactor});e.materials.set(n,t)}return n}const f=[i.LINEAR_MIPMAP_LINEAR,i.LINEAR_MIPMAP_NEAREST];export{m as loadGLTF};