// 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;ec&&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{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 {this._collection.setObjectVisibility(r,n);this._elevationProvider.objectChanged(this._collection.getComponentObb(r))}),this._memCache.pop(`${k}`))}}for(h=0;h{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=1z);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