meface/docs/.vuepress/public/utils/PolylineTrailMaterial.js

97 lines
3.2 KiB
JavaScript
Raw Normal View History

2023-11-17 10:54:23 +08:00
class PolylineTrailMaterial {
constructor(option = {}) {
this._definitionChanged = new Cesium.Event()
this._color = undefined
this._colorSubscription = undefined
this._time = (new Date()).getTime()
this.color = option.color ? option.color : Cesium.Color.fromCssColorString('rgba(90,90,255, 1)');
this.duration = option.duration ? option.duration : 5000
// this.img = option.img ? option.img :'/images/colors2.png'
this.img = this.createMaterialImage()
// 类型会自动加载到cesium中
this.type = option.type ? option.type : 'PolylineTrail'
// 着色器
this.source = option.source ? option.source : 'czm_material czm_getMaterial(czm_materialInput materialInput)' +
'{' +
'czm_material material = czm_getDefaultMaterial(materialInput);' +
'vec2 st = materialInput.st;' +
'vec4 colorImage = texture2D(image, vec2(fract(st.s - time), st.t));' +
'material.alpha = colorImage.a * color.a;' +
'material.diffuse = (colorImage.rgb+color.rgb)/2.0;' +
'return material;' +
'}'
this.addMaterial()
}
createMaterialImage(){
var c = document.createElement("canvas");
c.width = 512;
c.height = 32;
var ctx = c.getContext("2d");
var colorstr = this.color.toCssColorString().replace("rgb(","").replace(")","");
var my_gradient = ctx.createLinearGradient(0, 0, c.width, 0);
my_gradient.addColorStop(0, "rgba("+colorstr+", 1)");
my_gradient.addColorStop(1, "rgba("+colorstr+", 0)");
ctx.fillStyle = my_gradient;
ctx.fillRect(0, 0, c.width, c.height);
return c.toDataURL('image/png');
}
getType() {
return 'PolylineTrail'
}
getValue(time, result) {
if (!Cesium.defined(result)) {
result = {}
}
result.color = Cesium.Property.getValueOrClonedDefault(this._color, time, Cesium.Color.WHITE, result.color)
result.image = this.img
result.time = (((new Date()).getTime() - this._time) % this.duration) / this.duration
return result
}
equals(other) {
return this === other || (other instanceof PolylineTrailMaterial && Cesium.Property.equals(this._color, other._color))
}
addMaterial() {
Cesium.Material._materialCache.addMaterial(this.type, {
fabric: {
type: this.type,
uniforms: {
color: new Cesium.Color(1.0, 0.0, 0.0, 0.5),
image: this.img,
time: 100
},
source: this.source
},
translucent: (material) => {
return true
}
})
// 注意Cesium.defineProperties会报错需要改为Object
Object.defineProperties(PolylineTrailMaterial.prototype, {
isConstant: {
get: () => {
return false
},
configurable: true
},
definitionChanged: {
get: () => {
return this._definitionChanged
},
configurable: true
},
color: {
value: Cesium.createPropertyDescriptor('color'),
configurable: true,
writable: true
}
})
}
}