UNPKG

@doegis/core

Version:

DOE GIS API

3 lines (1 loc) 2.56 kB
import{removeMaybe as e,isSome as s,isNone as o}from"../../../../core/maybe.js";import{addFrameTask as d}from"../../../../core/scheduling.js";import{FadeDirection as i}from"../support/I3SLayerView.js";class t{constructor(){this.lodCrossfadeSignedDuration=0}}class a{constructor(e){this._view=e,this._preRenderFrameTaskHandle=null,this._currentFrameStartTime=null,this._numFadingNodes=0}get updating(){return this._numFadingNodes>0}stopNodeFading(s){null!=s.lodCrossfadeProgress&&(this._numFadingNodes--,s.lodCrossfadeProgress=null,0===this._numFadingNodes&&(null!=this._preRenderFrameTaskHandle&&(this._preRenderFrameTaskHandle=e(this._preRenderFrameTaskHandle)),this._view.notifyLODUpdate(),this._view.notifyUpdate()))}_startNodeFading(e,s,o){0===this._numFadingNodes&&(this._preRenderFrameTaskHandle=d({preRender:e=>this._updateAllNodeFading(e)}),this._view.notifyLODUpdate()),null==e.lodCrossfadeProgress&&(this._numFadingNodes++,this._view.notifyUpdate()),e.lodCrossfadeSignedDuration=o,e.lodCrossfadeProgress=s}_updateAllNodeFading(e){const o=this._view.nodeCrossfadingEnabled;this._view.foreachCrossfadeNode(((d,i)=>{if(s(i)&&s(i.lodCrossfadeProgress)){const s=i.lodCrossfadeSignedDuration,t=s>0?this._view.fullOpacity:0,a=e.deltaTime/s,r=i.lodCrossfadeProgress+Math.abs(a),n=!o||r>=1||0===s,l=t-(n?0:s>0?1:-1)*(1-r);n?(this.stopNodeFading(i),s<0&&this._view.markNodeToRemove(d)):i.lodCrossfadeProgress=r,this._view.setNodeOpacityByIndex(d,l)}})),this._view.removeMarkedNodes()}stopAllNodeFading(){this._view.foreachCrossfadeNode(((e,o)=>{if(s(o)&&s(o.lodCrossfadeProgress)){this.stopNodeFading(o);const s=o.lodCrossfadeSignedDuration;s<0&&this._view.markNodeToRemove(e);const d=s>0?this._view.fullOpacity:0;this._view.setNodeOpacityByIndex(e,d)}})),this._view.removeMarkedNodes()}fadeNode(e,s,o,d){null==this._currentFrameStartTime&&(this._currentFrameStartTime=Date.now());const t=this._view,a=t.nodeCrossfadingEnabled,n=o===i.FadeIn?t.fullOpacity:0,l=a?d?o===i.FadeIn?t.lodCrossfadeinDuration:t.lodCrossfadeoutDuration:t.lodCrossfadeUncoveredDuration:0,h=this._view.getNodeOpacityByIndex(e);if(a&&h!==n&&l>0){const e=1-Math.abs(n-h);this._startNodeFading(s,e,r(o)*l)}else this.stopNodeFading(s),this._view.setNodeOpacityByIndex(e,n),o===i.FadeOut&&this._view.removeNode(e)}isNodeFullyFadedIn(e){const s=this._view.getNodeCrossfadeMetaData(e);return o(s)||null==s.lodCrossfadeProgress&&this._view.getNodeOpacityByIndex(e)===this._view.fullOpacity}}function r(e){return e===i.FadeIn?1:-1}export{a as I3SCrossfadeHelper,t as NodeCrossfadeMetaData};