// 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 ../../../chunks/tslib.es6 ../../../Camera ../../../Viewpoint ../../../core/Accessor ../../../core/Logger ../../../core/maybe ../../../core/reactiveUtils ../../../core/scheduling ../../../core/screenUtils ../../../core/accessorSupport/decorators/property ../../../core/has ../../../core/RandomLCG ../../../core/accessorSupport/decorators/subclass ../../../chunks/vec32 ../../../core/libs/gl-matrix-2/factories/vec3f64 ../../../chunks/vec42 ../../../core/libs/gl-matrix-2/factories/vec4f64 ../../../geometry/Extent ../../../geometry/Point ../../../geometry/projection ../../ViewingMode ../camera/constraintUtils ../camera/intersectionUtils ./ConstraintsManager ./Frustum ./GoToOperation ./controllers/SurfaceCollisionCorrectionController ../support/cameraUtils ../support/PropertiesPool ../support/viewpointUtils ../webgl/RenderCamera ../webgl-engine/lib/rendererUtils ../webgl-engine/lib/RenderFeature ../../support/RenderState ../../webgl/FramebufferObject".split(" "), function(d,e,t,x,E,l,z,m,F,G,g,aa,ba,H,I,J,A,K,B,L,r,M,N,C,O,P,Q,R,f,S,D,T,u,v,p,U){d.ViewStateManager=class extends E{constructor(a){super(a);this.ready=!1;this._windowDevicePixelRatio=1;this._devicePixelRatioOverride=null;this._idleTimeout=300;this.test={viewStateManager:this,contentCameraResetState:new Map,setDevicePixelRatio:b=>this._devicePixelRatioOverride=b,renderState:null,get maximumPixelRatio(){return this.viewStateManager.view.qualitySettings.maximumPixelRatio},get updatingIgnoreRenderState(){return null!= this.renderState},get idleTimeoutEnabled(){return 0this.view.state.events,"before-camera-change",a=>a&&this._updateElevation(a)),m.watch(()=>this.view.state?.camera, (a,b)=>this._cameraChangedHandler(a,b),m.sync)]);m.when(()=>this.view.state?.camera,a=>this._updateElevation(a),{once:!0,sync:!0});this.addHandles([F.addFrameTask({prepare:()=>this._prepareFrame()}),m.watch(()=>this.view.state.cameraController,()=>{this._cameraSetByUser=!0;this.removeHandles("pending-initial-view")}),m.on(()=>this.view.state.events,"camera-projection-changed",()=>this.notifyChange("scale"))])}destroy(){this.exit();this._propertiesPool=z.destroyMaybe(this._propertiesPool)}get camera(){const a= this._get("camera");if(!this.ready)return a;const b=f.internalToExternal(this.view,this.view.state.camera,y);return b&&a&&b.equals(a)?a:b.clone()}set camera(a){this._updatePropertyBeforeReady("camera",a)||(this.view.elevationProvider?.enableCache(!0),this.setStateCamera(f.externalToInternal(this.view,a),{applyConstraints:!1})||l.getLogger(this).error("#camera\x3d","Invalid camera",a),this.view.elevationProvider?.enableCache(!1))}get contentCamera(){const a=this._get("contentCamera");if(!this.ready)return a; const b=f.internalToExternal(this.view,this.view.state.contentCamera,y);return b&&a&&b.equals(a)?a:b.clone()}set contentCamera(a){this._updatePropertyBeforeReady("contentCamera",a)||(a=f.externalToInternal(this.view,a),null==a?this.view.state.contentCamera=null:(this._updateElevation(a),this.view.state.contentCamera=a))}installContentCameraReset(a){this.removeHandles("content-camera-reset");this.test.contentCameraResetState.clear();if(!this.view.state.fixedContentCamera)return!1;const b=this.zoom, c=this.view.state.camera.distance**2,h=J.fromArray(this.view.state.camera.center),n=a.sticky?this.contentCamera.clone():null;this.addHandles([m.watch(()=>this.contentCamera,()=>{a.sticky||(this.removeHandles("content-camera-reset"),this.test.contentCameraResetState.clear())}),m.watch(()=>this.zoom,k=>{void 0!==k&&void 0!==b&&(this.test.contentCameraResetState.set("view.zoom",Math.abs(k-b)/2),2 this.view.state.camera,k=>{k=I.squaredDistance(h,k.center);this.test.contentCameraResetState.set("camera.center",k/c);k>c?this.contentCamera=null:this.view.state.fixedContentCamera||(this.contentCamera=n)})],"content-camera-reset");return!0}get center(){return this.ready?this.view.pointsOfInterest.centerOnContent.location:this._get("center")}set center(a){this._updatePropertyBeforeReady("center",a)||(a?this.isCompatible(a)?this.setStateCamera(this._centerToCamera(a),{applyConstraints:!0})?this.view.pointsOfInterest.centerOnContent.runTask(): l.getLogger(this).error("#center\x3d","Invalid center",a):l.getLogger(this).error("#center\x3d","Center has an incompatible spatial reference (center: "+(a.spatialReference?a.spatialReference.wkid:"none")+", view: "+this.view.spatialReference?.wkid+")",a):l.getLogger(this).error("#center\x3d","Center may not be null or undefined"))}get extent(){if(!this.ready)return this._get("extent");var a=this.view;a=f.toExtent(a,a.state.camera,a.pointsOfInterest.centerOnContent.renderLocation);return null!=a? a:this._get("extent")}set extent(a){this._updatePropertyBeforeReady("extent",a)||(a?this.isCompatible(a)?this.setStateCamera(this._extentToCamera(a),{applyConstraints:!0})||l.getLogger(this).error("#extent\x3d","Invalid extent",a):l.getLogger(this).error("#extent\x3d","Extent has an incompatible spatial reference (extent: "+(a.spatialReference?a.spatialReference.wkid:"none")+", view: "+this.view.spatialReference?.wkid+")",a):l.getLogger(this).error("#extent\x3d","Extent may not be null or undefined"))}get frustum(){const a= this._propertiesPool.get("frustum");a.renderCoordsHelper=this.view.renderCoordsHelper;a.update(this.view.state.camera);return a}get constraintsManager(){return this._constraintsManager}get _initialViewpoint(){const a=this.view.map;return a&&"initialViewProperties"in a?a.initialViewProperties?.viewpoint:void 0}get hasInitialView(){return!!this._initialViewpoint}get scale(){if(this.ready){const a=this.view.pointsOfInterest.centerOnContent;return f.distanceToScale(this.view,a.distance,a.location.latitude)}return this._get("scale")}set scale(a){this._updatePropertyBeforeReady("scale", a)||this.setStateCamera(this._scaleToCamera(a),{applyConstraints:!0})||l.getLogger(this).error("#scale\x3d","Invalid scale",a)}get terrainScale(){if(!this.ready)return this._get("scale");var a=this.view;const b=a.basemapTerrain.tilingScheme;var c=a.pointsOfInterest.cameraOnSurface.scale;if(!b||!c)return this._get("scale");const h=a.state.contentCamera;a=f.directionToHeadingTilt(a,h.eye,h.viewForward,h.up).tilt;90c?this._get("scale"):b.scaleAtLevel(c)}get padding(){if(!this.ready)return this._get("padding"); var a=this.view.state.camera,b=a.padding;const c=a.pixelRatio;a=this._get("padding");const h=Math.round(b[u.PaddingSide.TOP]/c),n=Math.round(b[u.PaddingSide.RIGHT]/c),k=Math.round(b[u.PaddingSide.BOTTOM]/c);b=Math.round(b[u.PaddingSide.LEFT]/c);return null!=a&&a.top===h&&a.right===n&&a.bottom===k&&a.left===b?a:{top:h,right:n,bottom:k,left:b}}set padding(a){this._updatePropertyBeforeReady("padding",a)||(this._paddingToArray(a,this.view.state.camera.pixelRatio,w),this.view.state.updateCamera(b=>b.padding= w))}_paddingToArray(a,b,c){a?A.set(c,a.top||0,a.right||0,a.bottom||0,a.left||0):A.set(c,0,0,0,0);for(a=0;4>a;a++)c[a]=Math.round(c[a]*b)}get screenCenter(){const a=this.padding;return G.createScreenPoint((this.view.width-(a.left+a.right))/2+a.left,(this.view.height-(a.top+a.bottom))/2+a.top)}get viewpoint(){return this.ready?D.fromCamera(this.view,this.camera):this._get("viewpoint")}set viewpoint(a){if(!this._updatePropertyBeforeReady("viewpoint",a))if(a)if(this.isCompatible(a))this.setStateCamera(this._viewpointToCamera(a), {applyConstraints:!a.camera})||l.getLogger(this).error("#viewpoint\x3d","Invalid viewpoint",a);else{var b=null!=a.camera?a.camera.position:a.targetGeometry;b=null!=b&&b.spatialReference;l.getLogger(this).error("#viewpoint\x3d","Viewpoint has an incompatible spatial reference (viewpoint: "+(b?b.wkid:"none")+", view: "+this.view.spatialReference?.wkid+")",a)}else l.getLogger(this).error("#viewpoint\x3d","Viewpoint may not be null or undefined")}get zoom(){return this.ready?f.scaleToZoom(this.view,this.scale): this._get("zoom")}set zoom(a){this._updatePropertyBeforeReady("zoom",a)||void 0===a||this.setStateCamera(this._zoomToCamera(a),{applyConstraints:!0})||l.getLogger(this).error("#zoom\x3d","Invalid zoom",a)}_computeCanvasSize(){if(this._devicePixelRatioOverride)return this.view.state.contentPixelRatio=this._devicePixelRatioOverride,this._tmpCanvasSize.width=Math.round(this.view.surface.clientWidth*this._devicePixelRatioOverride),this._tmpCanvasSize.height=Math.round(this.view.surface.clientHeight*this._devicePixelRatioOverride), this._tmpCanvasSize.pixelRatio=this._devicePixelRatioOverride,this._tmpCanvasSize;var a=Math.min(this._windowDevicePixelRatio,this.view.qualitySettings.maximumPixelRatio);a=(this._usePhysicalPixelRendering?this._windowDevicePixelRatio:a)*this.view.resolutionScale;this._tmpCanvasSize.width=Math.round(this.view.surface.clientWidth*a);this._tmpCanvasSize.height=Math.round(this.view.surface.clientHeight*a);const b=this.view._stage.renderView.renderingContext?.parameters.maxTextureSize;b&&U.ensureAttachmentMaxSize(this._tmpCanvasSize, b);this._tmpCanvasSize.pixelRatio=0this.view.basemapTerrain.ready,()=>{this.removeHandles("pending-initial-view");this._setInitialView(this.view.dataExtent)}, {once:!0,initial:!0}),"pending-initial-view"))}exit(){this._cancelGoToOperation();this.ready&&(this._override("padding",this.padding),this._set("ready",!1),this._clearOverride("hasInitialView"),this._cameraSetByUser=!1,this.removeHandles("pending-initial-view"),this._constraintsManager=z.destroyMaybe(this._constraintsManager))}async goTo(a,b){b={animate:!0,...b};null!=this._gotoOperation&&this._gotoOperation.abort(b.animate);this._gotoOperation=new Q.GoToOperation(a,b,this.view);this.view.resourceController.scheduler.stopFrame(); return this._gotoOperation.promise}debugSetCameraOnContent(){this.setStateCamera(C.cameraOnContentAlongViewDirection(this.view),{applyConstraints:!1})}step(a){const b=this.view.state,c=b?.cameraController;c&&(b.updateCamera(h=>c.stepController(a,h)),c.steppingFinished&&c.finishController())}_cancelGoToOperation(){null!=this._gotoOperation&&(this._gotoOperation.abort(),this._gotoOperation=null)}_getInitialProperties(){const a=new Set,b=[];for(const {propertyName:c,overrides:h}of W){const n=a.has(c), k=this._isOverridden(c);!n&&k&&b.push({name:c,value:this._get(c)});this._clearOverride(c);(n||k)&&h.forEach(X=>a.add(X))}return b}_setInitialView(a){if(null!=a&&!this._cameraSetByUser)if(a instanceof t)this.setStateCamera(f.externalToInternal(this.view,a),{applyConstraints:!1});else if(a instanceof x)if(a.targetGeometry instanceof B){var b=f.fromExtentSync(this.view,a.targetGeometry,0,.5,f.OrientationMode.LOCKED);null!=b&&this.setStateCamera(f.externalToInternal(this.view,b),{applyConstraints:!0})}else b= {applyConstraints:!a.camera},a=this._viewpointToCamera(a),this.setStateCamera(a,b);else b=f.fromExtentSync(this.view,a,0,.5,f.OrientationMode.LOCKED),null!=b&&this.setStateCamera(f.externalToInternal(this.view,b),{applyConstraints:!0})}_updatePropertyBeforeReady(a,b){if(this.ready)return!1;this._override(a,b);b&&Y.has(a)&&this._override("hasInitialView",!0);return!0}isCompatible(a){return null==a?!1:a instanceof x?a.camera?this.isCompatible(a.camera):this.isCompatible(a.targetGeometry):a instanceof t?this.isCompatible(a.position):a.spatialReference&&!r.requiresLoad(a.spatialReference,this.view.spatialReference)}_getPreservingHeadingTilt(a=Z){this._cameraSetByUser?(a.heading=this.camera.heading,a.tilt=this.camera.tilt):(a.heading=0,a.tilt=.5);return a}_centerPointAtDistanceToCamera(a,b,c=q){const {heading:h,tilt:n}=this._getPreservingHeadingTilt();a=f.getObserverForPointAtDistanceSync(this.view,h,n,a,b,f.OrientationMode.ADJUST);if(null==a)return null;c.copyFrom(this.view.state.camera);c.eye= a.eye;c.center=a.center;c.up=a.up;return c}_centerToCamera(a){const b=this.view.pointsOfInterest.centerOnContent;b.runTask();return this._centerPointAtDistanceToCamera(a,b.distance)}_extentToCamera(a){const {heading:b,tilt:c}=this._getPreservingHeadingTilt();return(a=f.fromExtentSync(this.view,a,b,c,f.OrientationMode.ADJUST,y))?f.externalToInternal(this.view,a):null}_scaleToCamera(a){if(null==a)return null;const b=this.view.pointsOfInterest.centerOnContent;b.runTask();const c=b.renderLocation;a=f.scaleToDistance(this.view, a,b.location.latitude);return this._centerPointAtDistanceToCamera(c,a)}_zoomToCamera(a){return this._scaleToCamera(f.zoomToScale(this.view,a))}_viewpointToCamera(a){return f.externalToInternal(this.view,D.toCameraSync(this.view,a))}setStateCamera(a,b){if(null==a||!this.view.state.stopActiveCameraController())return!1;this._cameraSetByUser=!0;b.doNotCancelGoToOperation||this._cancelGoToOperation();this.view.state.updateCamera(c=>{b.positionAndOrientationOnly?(c.eye=a.eye,c.center=a.center,c.up=a.up, c.fov=a.fov):c.copyFrom(a);b.applyConstraints&&N.applyAll(this.view,c)});b.applyConstraints||(this.view.state.cameraController=new R.SurfaceCollisionCorrectionController({view:this.view,desiredCamera:a}));return!0}_prepareFrame(){const {surface:a,canvas:b}=this.view;if(a&&b){this._windowDevicePixelRatio=window.devicePixelRatio;var c=this._computeCanvasSize();if(0!==c.width&&0!==c.height){if(b.width!==c.width||b.height!==c.height)b.width=c.width,b.height=c.height;if(this.view.state){const h=this.view.state.camera; if(h.fullWidth!==c.width||h.fullHeight!==c.height||h.pixelRatio!==c.pixelRatio)q.copyFrom(h),q.pixelRatio!==c.pixelRatio&&(this._paddingToArray(this.padding,c.pixelRatio,w),q.padding=w),q.fullWidth=c.width,q.fullHeight=c.height,q.pixelRatio=c.pixelRatio,this.view.state.camera=q;this._updateViewState()}}}}_updateElevation(a){var b=this.view.basemapTerrain?.spatialReference;const c=this.view.renderCoordsHelper?.getAltitude(a.eye)??0;b=b?C.surfaceElevationBelowRenderLocation(this.view,a.eye):0;a.relativeElevation= c-b}_updateViewState(){null!=this.test.renderState?this.view.state.mode=this.test.renderState:this.view.animation?this.view.state.mode=p.RenderState.ANIMATING:this.view.interacting?this.view.state.mode=p.RenderState.INTERACTING:(this.view.state.mode===p.RenderState.ANIMATING&&(this._cameraChangeTime=0),performance.now()-this._cameraChangeTime