/** * @Author : Caven Chen */ import { Cesium } from '../../../libs' import State from '../../state/State' import { Util } from '../../utils' import FogShader from '../../material/shader/weather/FogShader.glsl' class Fog { constructor(viewer) { this._id = Util.uuid() this._viewer = viewer this._delegate = undefined this._enable = false this._fogByDistance = { near: 10, nearValue: 0, far: 2000, farValue: 1.0 } this._color = new Cesium.Color(0, 0, 0, 1) this._state = State.INITIALIZED } get type() { return 'fog' } set enable(enable) { this._enable = enable if (enable && this._viewer && !this._delegate) { this._createPostProcessStage() } this._delegate && (this._delegate.enabled = enable) } get enable() { return this._enable } set fogByDistance(fogByDistance) { this._fogByDistance = fogByDistance this._delegate && (this._delegate.uniforms.fogByDistance = new Cesium.Cartesian4( this._fogByDistance?.near || 10, this._fogByDistance?.nearValue || 0.0, this._fogByDistance?.far || 2000, this._fogByDistance?.farValue || 1.0 )) } get fogByDistance() { return this._fogByDistance } set color(color) { this._color = color this._delegate && (this._delegate.uniforms.fogColor = color) } get color() { return this._color } /** * * @private */ _createPostProcessStage() { this._delegate = new Cesium.PostProcessStage({ name: this._id, fragmentShader: FogShader, uniforms: { fogByDistance: new Cesium.Cartesian4( this._fogByDistance?.near || 10, this._fogByDistance?.nearValue || 0.0, this._fogByDistance?.far || 200, this._fogByDistance?.farValue || 1.0 ), fogColor: this._color, }, }) this._viewer.scene.postProcessStages.add(this._delegate) } } export default Fog