// All material copyright Esri, All Rights Reserved, unless otherwise specified. // See https://js.arcgis.com/4.30/esri/copyright.txt for details. //>>built define("exports ../../../core/arrayUtils ../../../core/has ../../../core/mathUtils ../../../core/maybe ../../../chunks/vec32 ../../../core/libs/gl-matrix-2/factories/vec3f64 ../../../geometry/support/aaBoundingRect ../../../geometry/support/Ellipsoid ../support/buffer/glUtil ./GeometryState ./LayerClass ./NeighborIndex ./PatchGeometry ./TerrainConst ./terrainUtils ./TextureFader ./Tile ./TileOverlayData ./tileUtils ../webgl-engine/lib/VertexArrayObject ../webgl-engine/shaders/TerrainTechnique ../../webgl/BufferObject ../../webgl/enums".split(" "), function(P,ja,wa,Y,ka,r,t,la,Z,ma,na,W,U,oa,pa,b,X,qa,ra,sa,ta,ua,aa,ba){function L(a,d){return d?.isLoaded||d===a?d:null}class va{constructor(){this.geometry=new oa.PatchGeometry;this._texture=this._vao=this.geometryState=this.intersectionData=null;this._textureRef=new X.TextureFader(()=>this.tile.surface.fadeDuration);this.overlay=new ra;this._localOrigin=null;this._geometryStateChangedSinceLastUpdate=!0;this._hasGeometry=!1;this._modifiedFlags=0}get tile(){return this._tile}get localOrigin(){return this._localOrigin}init(a, d){this.clear();this._tile=a;this.geometry.reset();this.intersectionData=null;this.geometryState=new na.GeometryState;this._localOrigin=d;this.overlay.clear()}clear(){this.releaseGeometry();this.releaseTexture();this._textureRef.clear();this.geometryState=this.intersectionData=this._tile=null}updateGeometryIfNeeded(a){if(!this._vao||this._geometryStateChangedSinceLastUpdate||this.wireframeChanged||this.clippingAreaChanged||this.samplerDataChanged||this.numVerticesPerSideChanged||this.dirtyCorners|| this.dirtyEdgeResolutions||this.dirtyEdges)this._updateGeometry(a),this._geometryStateChangedSinceLastUpdate=!1;if(b.enableTerrainInternalChecks&&this.tile.intersectsClippingArea)for(a=0;4>a;++a)b.internalAssert(this.geometry.getEdgeCount(a)===this.geometryState.edgeResolutions[a]+1)}_calculateEdgeResolution(a,d){const h=this.tile,n=this.geometryState.numVerticesPerSide-1;if(!h.surface.isGlobal){var k=h.surface.extent;if(null!=k&&(0===a&&h.extent[3]>k[3]||1===a&&h.extent[2]>k[2]||2===a&&h.extent[1]< k[1]||3===a&&h.extent[0]{if(c===h)return!0;if(c.isLoaded)return e=Math.max(e,2** (c.level-f)),!0;b.internalAssert(!c.isLeaf);return!1});return e}updateNeighborData(){const a=this.tile;if(a.intersectsClippingArea){var d=a.renderData.geometryState,h=m=>(m.isLoaded||m.level===a.level)&&m?.intersectsClippingArea,n=d.edgePeerNeighbors,k=d.edgePeerNeighborSamplerVersions;for(var f=0;4>f;++f){var e=a.findNeighborTile(b.neighborEdgeIndices[f],h),c=L(a,e),g=c?.renderData?.geometryState.samplerDataVersion??-1,l=L(a,n[f]);c=c!==l;l=k[f]!==g;b.enableTerrainInternalChecks&&e&&(b.internalAssert(a.level>= e.level),b.internalAssert(a.level-e.level<=pa.maxTileNeighborLevelDelta));n[f]=e;if(c||l)k[f]=g,this._markEdgeDirty(f);g=d.edgeResolutions[f];e=this._calculateEdgeResolution(f,e);b.internalAssert(Y.isPowerOfTwo(e));b.internalAssert(1<=e);d.edgeResolutions[f]=e;g!==e&&this._markEdgeResolutionDirty(f)}for(let m=0;4>m;++m){e=a.findNeighborTile(b.neighborCornerIndices[m],h);d.cornerPeerNeighbors[m]=e;k=L(a,n[m]);f=L(a,n[(m+1)%4]);e=L(a,e);v[m]=e;v[(m+1)%4]=f;v[(m+2)%4]=a;v[(m+3)%4]=k;b.internalAssert(v.some(p=> p?.isLoaded||p===a));const u=v.reduce((p,D)=>Math.min(p,D?.level??Infinity),Infinity);v.forEach((p,D)=>{p&&p?.level>u&&(v[D]=null)});b.internalAssert(v.some(p=>p?.isLoaded||p===a));const x=d.cornerNeighborCornerTiles;k=d.cornerNeighborCornerTileSamplerVersions;for(f=0;4>f;++f){e=v[f];g=e?.renderData.geometryState.samplerDataVersion??-1;c=4*m+f;l=x[c]!==e;const p=!l&&k[c]!==g;if(l||p)x[c]=e,k[c]=g,this._markCornerDirty(m)}b.enableTerrainInternalChecks&&b.internalAssert(ca.some(p=>x[4*m+p]?.isLoaded|| x[4*m+p]===a))}b.enableTerrainInternalChecks&&b.internalAssert(this.geometryState.edgeResolutions.every(m=>0d;++d)v[d]=null}}_updateGeometry(a){if(this.tile.intersectsClippingArea){b.enableTerrainInternalChecks&&b.internalAssert(!this.tile.intersectsClippingArea||this.geometryState.edgeResolutions.every(l=>0l+m+1,0);e=e||f&&c>(n?.maxEdgeVertexCount??0);c=!e&&f;f=!c&&(0!==this.dirtyEdges||f);var g=!f&&0!==this.dirtyCorners;e?(this.releaseGeometry(),this._createGeometry(a)):c?d.updateEdgeElevationsAndResolutions():f||g?d.updateEdgeElevations():g?d.updateCornerElevations():console.warn("Update for no reason?");this._modifiedFlags=0}}get hasGeometry(){return this._hasGeometry}releaseGeometry(){this._hasGeometry= !1;this.intersectionData=null;if(!this._vao)return!1;this._vao=ka.disposeMaybe(this._vao);this.geometry.release();return!0}ensureTexture(a,d,h){d=d?ba.PixelFormat.RGBA:ba.PixelFormat.RGB;null==this._texture||this._texture.descriptor.width===a&&this._texture.descriptor.pixelFormat===d||this.releaseTexture();null==this._texture&&(this._texture=h(),this.tile.setMemoryDirty());return this._texture}releaseTexture(){null!=this._texture&&(this._texture.release(),this._texture=null,this.tile.setMemoryDirty())}get numVerticesPerSideChanged(){return 0!== (this._modifiedFlags&1)}get samplerDataChanged(){return 0!==(this._modifiedFlags&2)}get clippingAreaChanged(){return 0!==(this._modifiedFlags&4)}get wireframeChanged(){return 0!==(this._modifiedFlags&8)}get dirtyEdges(){return this._modifiedFlags>>4&15}get dirtyCorners(){return this._modifiedFlags>>8&15}get dirtyEdgeResolutions(){return this._modifiedFlags>>12&15}_markCornerDirty(a){this._modifiedFlags|=1<null!=d?0>(2>c?-1:1)*(a.extent[3-c]-d[3-c]):!1),n=a.level;b.internalAssert(0===this.dirtyCorners);b.internalAssert(0===this.dirtyEdges);b.internalAssert(0===this.dirtyEdgeResolutions);b.internalAssert(!this.numVerticesPerSideChanged);b.internalAssert(!this.samplerDataChanged);b.internalAssert(!this.clippingAreaChanged);b.internalAssert(!this.wireframeChanged);var k=b.neighborCornerIndices.map(e=>a.findNeighborCornerTileExact(e, c=>!c.intersectsClippingArea||c.isLoaded||c.level===a.level)??null).map(e=>e?.intersectsClippingArea?e:null),f=this.geometryState;for(let e=0;4>e;++e){const c=f.cornerPeerNeighbors[e],g=k[e];b.internalAssert(g===c,`Tile[${a.lij}].corner[${e}] out of date: cur=[${c?.lij}] exp=[${g?.lij}]`)}b.neighborEdgeIndices.forEach((e,c)=>{if(!h[c]){var g=a.findNeighborTile(e,E=>(E.level===n||E?.isLoaded)&&E?.intersectsClippingArea);if(g){b.internalAssert(g.isLoaded||g.level===a.level);b.internalAssert(g===this.geometryState.edgePeerNeighbors[c]); var l=n-g.level;if(g.isLoaded){var m=g.renderData;b.internalAssert(qa.isEdgeNeighbor(a,g,e));b.internalAssert(0<=l);var u=2**l;if(0>l)b.internalAssert(!1);else{var x=a.renderData,p=x.geometry,D=x.localOrigin,Q=p.getEdgeCount(c),y=p.numVerticesPerSide-1,F=m.geometry;if(F){var da=m.localOrigin,q=this.geometryState.edgePeerNeighbors[c];q?.isLoaded&&(q=q.renderData,b.internalAssert(x.geometryState.edgePeerNeighborSamplerVersions[c]===q.geometryState.samplerDataVersion),b.internalAssert(this.geometryState.edgePeerNeighborSamplerVersions[c]=== q.geometryState.samplerDataVersion));var B=(c+2)%4,R=F.getEdgeCount(B);q=Q-1;var S=R-1;b.internalAssert(q*u===S,`Tile[${a.lij}]:e${c},res=${q} edgeRes mismatch with`+` Neighbor[${g.lij}]:e${B},res=${S} (expected:${q*u})`);q=a.extent;S=e===U.NeighborIndex.NORTH||e===U.NeighborIndex.SOUTH;var G=R-1,H=G>>l,w=Q-1;if(1>H)b.internalAssert(1===w);else{b.internalAssert(H===w);b.internalAssert(Y.isPowerOfTwo(H));w=F.numVerticesPerSide-1;b.internalAssert(0{const T=t.clone(z),ea=t.clone(A);a.updateEdgeElevations();g.updateEdgeElevations();p.getEdgeVertexPosition(c, z,D,I);F.getEdgeVertexPosition(B,A,da,J);const K=t.create();r.sub(K,z,T);01-ia||a===g;if(!y){const T=t.create();r.sub(T,N,O);G=()=>`Mismatch in tile edge normal ${b.lij2s(a.lij)} (${I}/${Q-1}) edge ${c} vs neighbor ${b.lij2s(g.lij)} (${J}/${R-1}) nedge ${B} :`+`${b.v32s(N)} vs ${b.v32s(O)} dot = ${ia} : ${b.v32s(T)}`;console.warn("Mismatch in tile edge normal: ",G());a.updateEdgeElevations();g.updateEdgeElevations();w=t.create();M=t.create();p.getEdgeNormal(c, w,I);F.getEdgeNormal(B,M,J);r.equals(N,w)||console.warn("Missing update in tile normal: ",b.v32s(N)," \x3d\x3e ",b.v32s(w));r.equals(O,M)||console.warn("Missing update in neighbor normal: ",b.v32s(O)," \x3d\x3e ",b.v32s(M));b.internalAssert(y,G())}}I+=1;J+=1}}}else b.internalAssert(!1)}}else b.internalAssert(!g.isLeaf),b.internalAssert(0===l)}else e=!a.surface.updatingRootTiles&&null!=a.surface.rootTiles&&0X.ActivationTime});P.PatchRenderData=va;P.neighborTileIfLoadedOrSelf=L;P.zeroToFour=ca;Object.defineProperty(P,Symbol.toStringTag,{value:"Module"})});