You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
37 lines
18 KiB
37 lines
18 KiB
// All material copyright Esri, All Rights Reserved, unless otherwise specified. |
|
// See https://js.arcgis.com/4.30/esri/copyright.txt for details. |
|
//>>built |
|
define("../../../chunks/tslib.es6 ../../../core/Error ../../../core/has ../../../core/Logger ../../../core/maybe ../../../core/reactiveUtils ../../../core/scheduling ../../../core/accessorSupport/decorators/property ../../../core/RandomLCG ../../../core/accessorSupport/decorators/subclass ../../../core/libs/gl-matrix-2/math/mat3 ../../../core/libs/gl-matrix-2/factories/mat3f64 ../../../core/libs/gl-matrix-2/math/mat4 ../../../core/libs/gl-matrix-2/factories/mat4f64 ../../../core/libs/gl-matrix-2/factories/quatf64 ../../../chunks/vec32 ../../../core/libs/gl-matrix-2/factories/vec3f64 ../../../core/libs/gl-matrix-2/factories/vec4f64 ../../../geometry/ellipsoidUtils ../../../geometry/projection/computeTranslationToOriginAndRotation ../../../geometry/projection/localLinearScaleFactors ../../../geometry/projection/projectVectorToVector ../../../geometry/support/buffer/BufferView ../../../layers/ILyr3DWasmPerSceneView ../../../support/elevationInfoUtils ../../ViewingMode ./IntegratedMesh3DTilesViewPerformanceInfo ./interfaces ./LayerView3D ./Lyr3DWasm ./i3s/LayerElevationProvider ./support/lyr3dTypeConversions ./support/Tiles3DIntersectionHandler ../support/ElevationRange ../support/orientedBoundingBox ../webgl-engine/collections/Component/ObjectParameters ../webgl-engine/collections/Component/SourceGeometry ../webgl-engine/collections/Component/Transform ../webgl-engine/collections/Component/Material/ComponentMaterial ../webgl-engine/core/material/RenderTexture ../webgl-engine/core/shaderLibrary/attributes/TextureCoordinateAttribute.glsl ../webgl-engine/core/shaderLibrary/util/EllipsoidMode ../webgl-engine/lib/Attribute ../webgl-engine/lib/basicInterfaces ../webgl-engine/lib/Normals ../webgl-engine/lib/Texture ../webgl-engine/lib/VertexAttribute ../webgl-engine/materials/internal/bufferWriterUtils ../../layers/LayerView ../../support/layerViewUtils".split(" "), |
|
function(F,Q,ea,V,W,R,fa,I,B,ha,X,J,Y,Z,ia,aa,K,ja,ka,la,ma,na,x,f,ba,oa,pa,qa,ra,C,sa,D,ta,ua,ca,va,wa,xa,ya,za,da,Aa,L,G,Ba,Ca,M,Da,Ea,Fa){var u;(function(b){b[b.API=1]="API";b[b.VerboseAPI=2]="VerboseAPI";b[b.Error=3]="Error"})(u||={});class Ga{constructor(){this.handle=0;this.isVisible=!1;this.components=[];this.cpuMemoryUsage=this.vboMemoryUsage=this.texMemoryUsage=0;this.textures=[]}totalMemory(){return this.texMemoryUsage+this.vboMemoryUsage+this.cpuMemoryUsage}}B=class extends ra.LayerView3D(Ea){constructor(){super(...arguments); |
|
this.type="integrated-mesh-3dtiles";this._visibleGeometryChangedSchedulerHandle=null;this._wasmLayerId=-1;this.ignoresMemoryFactor=!1;this.drapeTargetType=qa.DrapeTargetType.WithoutRasterImage;this._lyrHandleToObjects=new Map;this._initialCullFace=new Map;this._suspendedHandle=null;this._dbgFlags=new Set}initialize(){this._dbgFlags.add(u.Error);this._dbg(u.VerboseAPI,"Tiles3DLayerView3D initialize() called");if(!this._canProjectWithoutEngine())throw new Q("layerview:spatial-reference-incompatible", |
|
"The spatial reference of this scene layer is incompatible with the spatial reference of the view",{});const b=C.addLayerViewToWasm(this).then(a=>{this._intersectionHandler=new ta.Tiles3DIntersectionHandler(this);this.view.sceneIntersectionHelper.addIntersectionHandler(this._intersectionHandler);this._updatingHandles.add(()=>this.slicePlaneEnabled,g=>this._slicePlaneEnabledChange(g));this._elevationProvider=new sa.LayerElevationProvider({view:this.view,layerElevationSource:this,intersectionHandler:this._intersectionHandler}); |
|
this.view.elevationProvider.register("im",this._elevationProvider);this.view.basemapTerrain.overlayManager.registerDrapeTarget(this);this._wasmLayerId=a;this._memCache=this.view.resourceController.memoryController.newCache(`t3d-${this.uid}`,g=>this._onRemoveFromCache(g));this.addHandles([R.watch(()=>this.layer.elevationInfo,g=>this._elevationInfoChanged(g))]);this._suspendedHandle=R.watch(()=>this.suspended,g=>{const h=C.getLyr3DWasm(this.view);h&&h.setEnabled(this,!g)},R.initial)}).catch(a=>{C.removeLayerViewFromWasm(this); |
|
this._wasmLayerId=-1;if(a===f.invalidLayerView)throw new Q("tiles3d:addLayer-failure","The 3d tiles layer description was invalid.",{});if(a===f.wasmFailedToInit)throw new Q("tiles3d:addLayer-failure","The 3d tiles layer web assembly module failed to download.",{});});this.addResolvingPromise(b)}destroy(){this._dbg(u.VerboseAPI,"Tiles3DLayerView3D destroy() called");C.removeLayerViewFromWasm(this);this._suspendedHandle&&(this._suspendedHandle.remove(),this._suspendedHandle=null);this._intersectionHandler&& |
|
(this.view.sceneIntersectionHelper.removeIntersectionHandler(this._intersectionHandler),this._intersectionHandler=null);this._elevationProvider&&(this._elevationProvider.objectsChanged(this._obbs),this.view.elevationProvider.unregister(this._elevationProvider),this._elevationProvider=null);this.view.basemapTerrain.overlayManager.unregisterDrapeTarget(this);this._lyrHandleToObjects.forEach(b=>this.freeObject(b));this._lyrHandleToObjects.clear();this._initialCullFace.clear();this._memCache=W.destroyMaybe(this._memCache); |
|
this._updatingHandles=W.destroyMaybe(this._updatingHandles);this.emit("visible-geometry-changed");this._visibleGeometryChangedSchedulerHandle&&(this._visibleGeometryChangedSchedulerHandle.remove(),this._visibleGeometryChangedSchedulerHandle=null)}_visibleGeometryChanged(){null==this._visibleGeometryChangedSchedulerHandle&&(this._visibleGeometryChangedSchedulerHandle=fa.schedule(()=>{this.emit("visible-geometry-changed");this._visibleGeometryChangedSchedulerHandle=null}))}_slicePlaneEnabledChange(b){this._intersectionHandler&& |
|
(this._intersectionHandler.slicePlaneEnabled=b);this.objects.forEach(a=>{const g=this._collection.getMaterial(a);g.commonMaterialParameters.hasSlicePlane=b;g.commonMaterialParameters.cullFace=b?G.CullFaceOptions.None:this._initialCullFace.get(a)})}_elevationInfoChanged(b){const a=C.getLyr3DWasm(this.view);a&&a.setLayerOffset(this,ba.getElevationOffsetInMeters(b))}get _obbs(){return this.objects.map(b=>this._collection.getComponentObb(b))}get wasmLayerId(){return this._wasmLayerId}get usedMemory(){let b= |
|
0;this._lyrHandleToObjects.forEach(a=>{a.isVisible&&(b+=a.totalMemory())});return b}get unloadedMemory(){let b=0;this._lyrHandleToObjects.forEach(a=>{a.isVisible||(b+=a.totalMemory())});return b}get visibleAtCurrentScale(){return Fa.isInEffectiveScaleRange(this.layer.effectiveScaleRange,this.view.terrainScale)}get performanceInfo(){let b=0,a=0,g=0,h=0,k=0,d=0;this._lyrHandleToObjects.forEach(n=>{n.isVisible?(b+=n.texMemoryUsage,a+=n.vboMemoryUsage,k++):(g+=n.texMemoryUsage,h+=n.vboMemoryUsage,d++)}); |
|
return new pa.IntegratedMesh3DTilesViewPerformanceInfo(this.usedMemory,k,d,Math.round(a/1048.576)/1E3,Math.round(b/1048.576)/1E3,Math.round(h/1048.576)/1E3,Math.round(g/1048.576)/1E3)}_canProjectWithoutEngine(){if(this.view.state.viewingMode===oa.ViewingMode.Local){const b=this.view.renderSpatialReference?.isWebMercator?3857:this.view.renderSpatialReference?.wkid??-1;if(3857!==b&&32662!==b)return!1}return!0}get _stage(){return this.view._stage}get _collection(){return this._stage.renderView.componentObjectCollection}get elevationOffset(){return ba.getElevationOffsetInMeters(this.layer.elevationInfo)}get elevationRange(){const b= |
|
this.fullExtent;return b?.zmin&&b?.zmax?new ua.ElevationRange(b.zmin,b.zmax):null}getElevationRange(b){return null}get fullExtent(){return this.layer.fullExtent}get objects(){return Array.from(this._lyrHandleToObjects.values()).reduce((b,a)=>b.concat(a.components),[])}isUpdating(){const b=C.getLyr3DWasm(this.view);return 0>this._wasmLayerId||null==b?!1:b.isUpdating(this._wasmLayerId)}updatingFlagChanged(){this.notifyChange("updating")}async createRenderable(b){const a=b.meshData;if(null==a.data)throw Error("meshData.data undefined"); |
|
a.desc=JSON.parse(a.desc);if(null==a.desc)throw Error("meshData.desc undefined");const g=K.fromArray(a.desc.origin),h=[],k=new Map,d=new Ga;d.handle=b.handle;this._lyrHandleToObjects.set(b.handle,d);b=this.view.basemapTerrain.spatialReference;let n;if("global"===this.view.viewingMode){var r=Z.create();la.computeTranslationToOriginAndRotation(ka.SphericalECEFSpatialReferenceLike,g,r,b);r=X.fromMat4(J.create(),r);n=X.invert(J.create(),r)}else n=r=J.IDENTITY;var v=Z.create();Y.translate(v,v,g);v=Y.getTranslation(K.create(), |
|
v);var m=null;const q=K.create();a.desc.obb&&(m=a.desc.obb.quaternion,m=new ca.Obb(a.desc.obb.center,a.desc.obb.halfSize,ia.fromValues(m[0],m[1],m[2],m[3])));for(let e=0;e<a.desc.prims.length;e++){var p=a.desc.prims[e];this._dbg(u.VerboseAPI,JSON.stringify(p));if(p.ptype===f.Lyr3DPrimitiveType.Lines)continue;if(null==D.primTypeConversion[p.ptype]||null==a.data){this._dbg(u.VerboseAPI,"[Unsupported Feature] Unsupported primitive mode ("+p.ptype+"). Skipping primitive.");continue}const l=a.desc?.materials&& |
|
null!=p.materialId?a.desc.materials[p.materialId]:null,E=null!=l?l.lightingModel:f.Lyr3DLightingModel.Unlit;var w=!ea("disable-feature:im-shading");const {positionView:z,positionAttr:A,normalsView:Ha,normalsAttr:S,colorAttr:N,texCoord0Attr:O,indicesView:H}=this.getBufferViews(p,a.data.buffer,r,w);if(null==A||null==z||null==H)continue;p={colors:null!=N,textureCoordinates:null!=O?da.TextureCoordinateAttributeType.Default:da.TextureCoordinateAttributeType.None,hasNormals:null!=Ha,needsNormals:w};const Ia= |
|
A.data.length/A.size;w=(c,y)=>c&&c.data.length/c.size!==Ia?(this._dbg(u.Error,`${y} !== numPos. Skipping primitive.`),!1):!0;if(!w(O,"numTexcoord")||!w(N,"numColors")||!w(S,"normals"))continue;w=wa.createVertexBufferLayout(p);null!=m?m=m.clone():(m=ca.compute(A),aa.add(q,m.center,g),m.center=q);if(r!==J.IDENTITY)for(var t=0;t<z.count;t++)z.getVec(t,q),aa.transformMat3(q,q,r),z.setVec(t,q);const T=w.createBuffer(A.data.length);t=new Map([[M.VertexAttribute.POSITION,A]]);null!=O&&t.set(M.VertexAttribute.UV0, |
|
O);null!=N&&t.set(M.VertexAttribute.COLOR,N);null!=S&&t.set(M.VertexAttribute.NORMALCOMPRESSED,S);t.forEach((c,y)=>{null!=c&&Da.writeDefaultAttribute(y,c,null,null,T,0)});t=new Uint32Array([0,H.typedBuffer.length]);p={vertices:{data:T.buffer,count:T.byteLength/w.stride,layoutParameters:p},positionData:{positions:z.typedBuffer,indices:H.typedBuffer},indices:H.typedBuffer,componentOffsets:t};d.cpuMemoryUsage+=z.count;d.cpuMemoryUsage+=H.count;w=this.view.renderSpatialReference;t=K.create();const U= |
|
[1,1,1];ma.localLinearScaleFactors(v,w,U,b)||this._dbg(u.Error,"Unsupported coordinate system for IM overlay");na.projectVectorToVector(v,w,t,b);const P=this._collection.createObject(new va.ObjectParameters(ja.fromValues(t[0],t[1],U[0],U[1]),new xa.Transform(v,n),m,p));l&&this._collection.updateMaterial(P,c=>{c.baseColor=l.baseColorFactor;c.usePBR=E===f.Lyr3DLightingModel.Pbr;c.hasParametersFromSource=!1;c.baseColorTexture=this._getTexture(l.baseColorTex,a,k);c.usePBR&&(c.mrrFactors=[l.metallicFactor, |
|
l.roughnessFactor,0],c.emissiveFactor=l.emissiveFactor??[0,0,0],c.metallicRoughnessTexture=this._getTexture(l.metalTex,a,k),c.emissionTexture=this._getTexture(l.emissiveTex,a,k),c.occlusionTexture=this._getTexture(l.occlusionTex,a,k),c.normalTexture=this._getTexture(l.normalTex,a,k));c.objectOpacity=0;c.alphaDiscardMode=G.AlphaDiscardMode.Mask;var y=[];c.baseColorTexture&&y.push(c.baseColorTexture.loadPromise);c.usePBR&&c.metallicRoughnessTexture&&y.push(c.metallicRoughnessTexture.loadPromise);c.usePBR&& |
|
c.emissionTexture&&y.push(c.emissionTexture.loadPromise);c.usePBR&&c.occlusionTexture&&y.push(c.occlusionTexture.loadPromise);c.usePBR&&c.normalTexture&&y.push(c.normalTexture.loadPromise);y=Promise.all(y);h.push(y);y.then(()=>{c.alphaDiscardMode=D.alphaModeConversion[l.alphaMode];c.objectOpacity=1;d.texMemoryUsage+=c.baseColorTexture?.glTexture?.usedMemory||0;c.usePBR&&(d.texMemoryUsage+=c.metallicRoughnessTexture?.glTexture?.usedMemory||0,d.texMemoryUsage+=c.emissionTexture?.glTexture?.usedMemory|| |
|
0,d.texMemoryUsage+=c.occlusionTexture?.glTexture?.usedMemory||0,d.texMemoryUsage+=c.normalTexture?.glTexture?.usedMemory||0)});c.commonMaterialParameters.doubleSided=l.isDoubleSided;c.commonMaterialParameters.cullFace=l.faceCulling?D.faceCullingConversion[l.faceCulling]:G.CullFaceOptions.Back;this._initialCullFace.set(P,c.commonMaterialParameters.cullFace);c.commonMaterialParameters.hasSlicePlane=this.slicePlaneEnabled;c.componentParameters.castShadows=ya.ComponentParameterSummary.All;c.textureAlphaCutoff= |
|
l.alphaCutoff??.1;c.alphaDiscardMode=D.alphaModeConversion[l.alphaMode];c.isIntegratedMesh=!0;c.polygonOffsetEnabled=!1;c.hasOccludees=!1;c.ellipsoidMode=Aa.getEllipsoidMode(this.view.spatialReference)});d.components.push(P);d.vboMemoryUsage+=this._collection.getObjectGPUMemoryUsage(P)}await Promise.all(h);k.forEach(e=>{d.textures.push(e)});if(!this._memCache)throw Error("no memCache");this._memCache.put(`${d.handle}`,d,d.totalMemory());return{memUsageBytes:d.totalMemory()}}freeRenderable(b){const a= |
|
this._lyrHandleToObjects.get(b);a&&(this.freeObject(a),this._lyrHandleToObjects.delete(b))}freeObject(b){this._memCache&&this._memCache.pop(`${b.handle}`);b.components.forEach(a=>{b.textures.forEach(g=>{this._stage.remove(g)});this._collection.destroyObject(a);this._initialCullFace.delete(a)})}setRenderableVisibility(b,a,g){if(this._memCache){for(var h=0;h<g;++h){var k=b[h];const n=a[h];if(n){var d=this._lyrHandleToObjects.get(k);d&&(this._visibleGeometryChanged(),d.isVisible=n,d.components.forEach(r=> |
|
{this._collection.setObjectVisibility(r,n);this._elevationProvider.objectChanged(this._collection.getComponentObb(r))}),this._memCache.pop(`${k}`))}}for(h=0;h<g;++h){k=b[h];const n=a[h];!n&&(d=this._lyrHandleToObjects.get(k))&&(this._visibleGeometryChanged(),d.isVisible=n,d.components.forEach(r=>{this._collection.setObjectVisibility(r,n);this._elevationProvider.objectChanged(this._collection.getComponentObb(r))}),this._memCache.put(`${k}`,d,d.totalMemory()))}}}_getTexture(b,a,g){let h=null;if(b&& |
|
a.desc?.images&&a.data?.buffer){const d=a.desc.images[b?.imageId];h=g.get(d);if(!h&&d){const n=this._stage.renderView.renderingContext.parameters.maxMaxAnisotropy,r=1<n;b=D.wrapModeConversion[b.wrapMode??f.Lyr3DUvWrapMode.None];let v=d.alpha?4:3;var k=new Uint8Array(a.data.buffer,d.data.byteOffset,d.data.byteCount);let m=null,q=a=null;switch(d.format){case f.Lyr3DImageFormat.Raw:d.pixelFormat===f.Lyr3DPixelFormat.R8?(m=k.buffer,v=1,a=""):d.pixelFormat===f.Lyr3DPixelFormat.Rgb8?(m=k.buffer,v=3,a=""): |
|
d.pixelFormat===f.Lyr3DPixelFormat.Rgba8&&(m=k.buffer,v=4,a="");break;case f.Lyr3DImageFormat.Dxt1:m=k.buffer;v=3;a=G.TextureEncodingMimeType.DDS_ENCODING;break;case f.Lyr3DImageFormat.Dxt5:m=k.buffer;v=4;a=G.TextureEncodingMimeType.DDS_ENCODING;break;case f.Lyr3DImageFormat.Png:a="image/png";q=document.createElement("img");break;case f.Lyr3DImageFormat.Jpeg:a="image/jpeg";q=document.createElement("img");break;case f.Lyr3DImageFormat.Etc2:a="image/ktx";q=document.createElement("img");break;case f.Lyr3DImageFormat.Astc:this._dbg(u.Error, |
|
"Astc texture not supported");break;case f.Lyr3DImageFormat.Pvrtc:this._dbg(u.Error,"Pvrtc texture not supported")}q&&a&&(k=new Blob([k],{type:a}),q.src=URL.createObjectURL(k),m=q);m&&null!=a&&(h=new Ca.Texture(m,{mipmap:r,maxAnisotropy:n,encoding:a,wrap:b,components:v,noUnpackFlip:!0,width:d.mip0Width,height:d.mip0Height}),this._stage.add(h),g.set(d,h))}}return h?new za.RenderTexture(this.view._stage.renderView.textures,h.id):null}getBufferViews(b,a,g,h){let k,d,n,r,v,m,q=null;for(let w=0;w<b.atrbs.length;w++){const t= |
|
b.atrbs[w],e=t.view,l=e.byteOffset+e.byteCount,E=[...Array(e.byteCount/D.lyr3DTypeToByteSize[e.type]).keys()].map(z=>z);try{switch(t.sem){case f.Lyr3DVtxAtrbSemantic.Position:3!==e.ncomp||e.type!==f.Lyr3DType.F32?this._dbg(u.Error,"[Unsupported Feature] Unsupported view for Position ("+e+")"):(k=new x.BufferViewVec3f(a,e.byteOffset,void 0,l),d=new L.Attribute(k.typedBuffer,E,3));break;case f.Lyr3DVtxAtrbSemantic.Normal:if(3!==e.ncomp||e.type!==f.Lyr3DType.F32)this._dbg(u.Error,"[Unsupported Feature] Unsupported view for Normal ("+ |
|
e+")");else if(h){const z=new x.BufferViewVec3f(a,e.byteOffset,void 0,l),A=Ba.compressAndTransformNormals(z.typedBuffer,g);v=new x.BufferViewInt16(A);m=new L.Attribute(v.typedBuffer,E,2)}break;case f.Lyr3DVtxAtrbSemantic.TexCoord:2!==e.ncomp||e.type!==f.Lyr3DType.F32?this._dbg(u.Error,"[Unsupported Feature] Unsupported view for Texcoord ("+e+")"):void 0===r&&(r=new L.Attribute((new x.BufferViewVec2f(a,e.byteOffset,void 0,l)).typedBuffer,E,2));break;case f.Lyr3DVtxAtrbSemantic.Color:4===e.ncomp?(e.type=== |
|
f.Lyr3DType.F32&&(q=new x.BufferViewVec4f(a,e.byteOffset,void 0,l)),e.type===f.Lyr3DType.U8&&(q=new x.BufferViewVec4u8(a,e.byteOffset,void 0,l)),e.type===f.Lyr3DType.U16&&(q=new x.BufferViewVec4u16(a,e.byteOffset,void 0,l))):3===e.ncomp&&(e.type===f.Lyr3DType.F32&&(q=new x.BufferViewVec3f(a,e.byteOffset,void 0,l)),e.type===f.Lyr3DType.U8&&(q=new x.BufferViewVec3u8(a,e.byteOffset,void 0,l)),e.type===f.Lyr3DType.U16&&(q=new x.BufferViewVec3u16(a,e.byteOffset,void 0,l)));null==q?this._dbg(u.VerboseAPI, |
|
"[Unsupported Feature] Unsupported view for Color ("+e+")"):n=new L.Attribute(q.typedBuffer,E,e.ncomp);break;case f.Lyr3DVtxAtrbSemantic.FeatureIndex:break;default:this._dbg(u.VerboseAPI,"[Unsupported Feature] Unsupported semantic ("+t.sem+"). Skipping vertex attribute.")}}catch(z){this._dbg(u.VerboseAPI,"Error Creating buffer ("+z+"). Skipping vertex attribute.")}}if(b.index)switch(g=b.index.view,h=g.byteOffset+g.byteCount,b.index.view.type){case f.Lyr3DType.U16:var p=new x.BufferViewUint16(a,g.byteOffset, |
|
void 0,h);break;case f.Lyr3DType.U32:p=new x.BufferViewUint32(a,g.byteOffset,void 0,h);break;default:this._dbg(u.Error,"[Unsupported Feature] index type not supported ("+g.type+").")}if(null==p&&null!=k)for(b=k.count,65535>b?(p=new Uint16Array(b),p=new x.BufferViewUint16(p)):(p=new Uint32Array(b),p=new x.BufferViewUint32(p)),a=0;a<b;a++)p.set(a,a);return{positionView:k,positionAttr:d,colorAttr:n,texCoord0Attr:r,indicesView:p,normalsView:v,normalsAttr:m}}_onRemoveFromCache(b){const a=C.getLyr3DWasm(this.view); |
|
if(a)a.onRenderableEvicted(this,b.handle,b.totalMemory());this.freeRenderable(b.handle)}_dbg(b,a){this._dbgFlags.has(b)&&(b===u.Error?V.getLogger(this).error(a):V.getLogger(this).warn(a))}};F.__decorate([I.property()],B.prototype,"_visibleGeometryChangedSchedulerHandle",void 0);F.__decorate([I.property()],B.prototype,"layer",void 0);F.__decorate([I.property({readOnly:!0})],B.prototype,"visibleAtCurrentScale",null);F.__decorate([I.property()],B.prototype,"elevationOffset",null);return B=F.__decorate([ha.subclass("esri.views.3d.layers.IntegratedMesh3DTilesLayerView3D")], |
|
B)}); |