mirror of
https://github.com/jiawanlong/Cesium-Examples.git
synced 2025-07-04 15:17:36 +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;
|
|
},
|
|
}); |