mirror of
				https://github.com/jiawanlong/Cesium-Examples.git
				synced 2025-11-04 09:14:17 +00:00 
			
		
		
		
	
		
			
	
	
		
			112 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			112 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 
								 | 
							
								 /**
							 | 
						||
| 
								 | 
							
								         * 水波纹扩散材质
							 | 
						||
| 
								 | 
							
								         * @param {*} options
							 | 
						||
| 
								 | 
							
								         * @param {String} options.color 颜色
							 | 
						||
| 
								 | 
							
								         * @param {Number} options.duration 持续时间 毫秒
							 | 
						||
| 
								 | 
							
								         * @param {Number} options.count 波浪数量
							 | 
						||
| 
								 | 
							
								         * @param {Number} options.gradient 渐变曲率
							 | 
						||
| 
								 | 
							
								         */
							 | 
						||
| 
								 | 
							
								 function CircleWaveMaterialProperty(options) {
							 | 
						||
| 
								 | 
							
								    this._definitionChanged = new Cesium.Event();
							 | 
						||
| 
								 | 
							
								    this.color = Cesium.defaultValue(options.color && new Cesium.Color.fromCssColorString(options.color), Cesium.Color.RED);
							 | 
						||
| 
								 | 
							
								    this.duration = Cesium.defaultValue(options.duration, 1000);
							 | 
						||
| 
								 | 
							
								    this.count = Cesium.defaultValue(options.count, 2);
							 | 
						||
| 
								 | 
							
								    if (this.count <= 0) {
							 | 
						||
| 
								 | 
							
								        this.count = 1;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    this.gradient = Cesium.defaultValue(options.gradient, 0.1);
							 | 
						||
| 
								 | 
							
								    if (this.gradient > 1) {
							 | 
						||
| 
								 | 
							
								        this.gradient = 1;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    this.time = new Date().getTime();
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								Object.defineProperties(CircleWaveMaterialProperty.prototype, {
							 | 
						||
| 
								 | 
							
								    isConstant: {
							 | 
						||
| 
								 | 
							
								        get: function () {
							 | 
						||
| 
								 | 
							
								            return false;
							 | 
						||
| 
								 | 
							
								        },
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								    definitionChanged: {
							 | 
						||
| 
								 | 
							
								        get: function () {
							 | 
						||
| 
								 | 
							
								            return this._definitionChanged;
							 | 
						||
| 
								 | 
							
								        },
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								    color: Cesium.createPropertyDescriptor('color'),
							 | 
						||
| 
								 | 
							
								    gradient: Cesium.createPropertyDescriptor('gradient'),
							 | 
						||
| 
								 | 
							
								    duration: Cesium.createPropertyDescriptor('duration'),
							 | 
						||
| 
								 | 
							
								    count: Cesium.createPropertyDescriptor('count'),
							 | 
						||
| 
								 | 
							
								});
							 | 
						||
| 
								 | 
							
								CircleWaveMaterialProperty.prototype.getType = function () {
							 | 
						||
| 
								 | 
							
								    return Cesium.Material.CircleWaveMaterialType;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								CircleWaveMaterialProperty.prototype.getValue = function (time, result) {
							 | 
						||
| 
								 | 
							
								    if (!Cesium.defined(result)) {
							 | 
						||
| 
								 | 
							
								        result = {};
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    result.color = Cesium.Property.getValueOrClonedDefault(this.color, time, Cesium.Color.WHITE, result.color);
							 | 
						||
| 
								 | 
							
								    result.time = ((new Date().getTime() - this.time) % this.duration) / this.duration;
							 | 
						||
| 
								 | 
							
								    result.count = this.count;
							 | 
						||
| 
								 | 
							
								    result.gradient = 1 + 10 * (1 - this.gradient);
							 | 
						||
| 
								 | 
							
								    return result;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								CircleWaveMaterialProperty.prototype.equals = function (other) {
							 | 
						||
| 
								 | 
							
								    const reData =
							 | 
						||
| 
								 | 
							
								        this === other ||
							 | 
						||
| 
								 | 
							
								        (other instanceof CircleWaveMaterialProperty
							 | 
						||
| 
								 | 
							
								            && Cesium.Property.equals(this.color, other.color)
							 | 
						||
| 
								 | 
							
								            && Cesium.Property.equals(this.duration, other.duration)
							 | 
						||
| 
								 | 
							
								            && Cesium.Property.equals(this.count, other.count)
							 | 
						||
| 
								 | 
							
								            && Cesium.Property.equals(this.gradient, other.gradient));
							 | 
						||
| 
								 | 
							
								    return reData;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								Cesium.CircleWaveMaterialProperty = CircleWaveMaterialProperty;
							 | 
						||
| 
								 | 
							
								Cesium.Material.CircleWaveMaterialType = 'CircleWaveMaterial';
							 | 
						||
| 
								 | 
							
								Cesium.Material.CircleWaveSource = `
							 | 
						||
| 
								 | 
							
								              czm_material czm_getMaterial(czm_materialInput materialInput) {
							 | 
						||
| 
								 | 
							
								                czm_material material = czm_getDefaultMaterial(materialInput);
							 | 
						||
| 
								 | 
							
								                material.diffuse = 1.5 * color.rgb;
							 | 
						||
| 
								 | 
							
								                vec2 st = materialInput.st;
							 | 
						||
| 
								 | 
							
								                vec3 str = materialInput.str;
							 | 
						||
| 
								 | 
							
								                float dis = distance(st, vec2(0.5, 0.5));
							 | 
						||
| 
								 | 
							
								                float per = fract(time);
							 | 
						||
| 
								 | 
							
								                if (abs(str.z) > 0.001) {
							 | 
						||
| 
								 | 
							
								                  discard;
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								                if (dis > 0.5) {
							 | 
						||
| 
								 | 
							
								                  discard;
							 | 
						||
| 
								 | 
							
								                } else {
							 | 
						||
| 
								 | 
							
								                  float perDis = 0.5 / count;
							 | 
						||
| 
								 | 
							
								                  float disNum;
							 | 
						||
| 
								 | 
							
								                  float bl = .0;
							 | 
						||
| 
								 | 
							
								                  for (int i = 0; i <= 9; i++) {
							 | 
						||
| 
								 | 
							
								                    if (float(i) <= count) {
							 | 
						||
| 
								 | 
							
								                      disNum = perDis *float(i) - dis + per / count;
							 | 
						||
| 
								 | 
							
								                      if (disNum > 0.0) {
							 | 
						||
| 
								 | 
							
								                        if (disNum < perDis) {
							 | 
						||
| 
								 | 
							
								                          bl = 1.0 - disNum / perDis;
							 | 
						||
| 
								 | 
							
								                        } else if(disNum - perDis < perDis) {
							 | 
						||
| 
								 | 
							
								                          bl = 1.0 - abs(1.0 - disNum / perDis);
							 | 
						||
| 
								 | 
							
								                        }
							 | 
						||
| 
								 | 
							
								                        material.alpha = pow(bl, gradient);
							 | 
						||
| 
								 | 
							
								                      }
							 | 
						||
| 
								 | 
							
								                    }
							 | 
						||
| 
								 | 
							
								                  }
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								                return material;
							 | 
						||
| 
								 | 
							
								              }
							 | 
						||
| 
								 | 
							
								              `;
							 | 
						||
| 
								 | 
							
								Cesium.Material._materialCache.addMaterial(Cesium.Material.CircleWaveMaterialType, {
							 | 
						||
| 
								 | 
							
								    fabric: {
							 | 
						||
| 
								 | 
							
								        type: Cesium.Material.CircleWaveMaterialType,
							 | 
						||
| 
								 | 
							
								        uniforms: {
							 | 
						||
| 
								 | 
							
								            color: new Cesium.Color(181, 241, 254, 1),
							 | 
						||
| 
								 | 
							
								            time: 1,
							 | 
						||
| 
								 | 
							
								            count: 1,
							 | 
						||
| 
								 | 
							
								            gradient: 0.1,
							 | 
						||
| 
								 | 
							
								        },
							 | 
						||
| 
								 | 
							
								        source: Cesium.Material.CircleWaveSource,
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								    translucent: function () {
							 | 
						||
| 
								 | 
							
								        return true;
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								});
							 |