From d5e1d8a5f773738f6766175ea409f47740a24c97 Mon Sep 17 00:00:00 2001
From: GuLiMmo <2820890765@qq.com>
Date: Wed, 28 Feb 2024 19:09:25 +0800
Subject: [PATCH] 航线库更新

---
 src/utils/cesium/ImageTrailMaterial.ts |  263 +++++++++++++++++++++++++++++----------------------
 1 files changed, 149 insertions(+), 114 deletions(-)

diff --git a/src/utils/cesium/ImageTrailMaterial.ts b/src/utils/cesium/ImageTrailMaterial.ts
index b0394d1..84434d1 100644
--- a/src/utils/cesium/ImageTrailMaterial.ts
+++ b/src/utils/cesium/ImageTrailMaterial.ts
@@ -1,127 +1,162 @@
-import * as Cesium from 'cesium'
-/**
- * 定义Cesium材质对象
- */
-class ImageTrailMaterial {
-  _definitionChanged: Cesium.Event<(...args: any[]) => void>;
-  _color: undefined;
-  _colorSubscription: undefined;
-  _speed: undefined;
-  _speedSubscription: undefined;
-  _image: undefined;
-  _imageSubscription: undefined;
-  _repeat: undefined;
-  _repeatSubscription: undefined;
-  color: any;
-  speed: any;
-  image: any;
-  repeat: Cesium.Cartesian2;
-  constructor (options : any = {}) {
-    this._definitionChanged = new Cesium.Event()
-    this._color = undefined
-    this._colorSubscription = undefined
-    this._speed = undefined
-    this._speedSubscription = undefined
-    this._image = undefined
-    this._imageSubscription = undefined
-    this._repeat = undefined
-    this._repeatSubscription = undefined
-    this.color = options.color || Cesium.Color.fromBytes(0, 0, 255, 255)
-    this.speed = options.speed || 1
-    this.image = options.image
-    this.repeat = new Cesium.Cartesian2(
-      options.repeat?.x || 1,
-      options.repeat?.y || 1
-    )
-  }
+import * as cesium from 'cesium'
 
-  get isConstant () {
-    return false
-  }
+const Cesium: any = cesium
 
-  get definitionChanged () {
-    return this._definitionChanged
-  }
+const getResource = (name: string) => {
+  return new URL(`/src/assets/icons/${name}`, import.meta.url).href
+}
 
-  getType () {
-    return Cesium.Material.ImageTrailMaterialType
-  }
+const defaultColor = Cesium.Color.TRANSPARENT
+const defaultImage = getResource('arrow-right.png')
+const defaultImageimageW = 10
+const defaultAnimation = false
+const defaultDuration = 3000
 
-  getValue (time: any, result: any) {
-    if (!result) {
-      result = {}
-    }
-    result.color = Cesium.Property?.getValueOrUndefined(this._color, time)
-    result.image = Cesium.Property?.getValueOrUndefined(this._image, time)
-    result.repeat = Cesium.Property?.getValueOrUndefined(this._repeat, time)
-    result.speed = this._speed
-    return result
-  }
+function ImageTrailMaterial (this: any, opt: any = {}) {
+  opt = Cesium.defaultValue(opt, Cesium.defaultValue.EMPTY_OBJECT)
+  this._definitionChanged = new Cesium.Event()
+  // 自定义材质
+  // 自定义图片颜色
+  this._color = undefined
+  this._colorSubscription = undefined
+  // 自定义背景颜色
+  this._backgroundColor = undefined
+  this._backgroundColorSubscription = undefined
+  // 图片
+  this._image = undefined
+  this._imageSubscription = undefined
+  // 图片宽度
+  this._imageW = undefined
+  this._imageWSubscription = undefined
+  // 是否开启动画
+  this._animation = undefined
+  this._animationSubscription = undefined
+  // 动画持续时间
+  this._duration = undefined
+  this._durationSubscription = undefined
 
-  equals (other: this) {
-    return (
-      this === other ||
-      (other instanceof ImageTrailMaterial &&
-        Cesium.Property.equals(this._color, other._color) &&
-        Cesium.Property.equals(this._image, other._image) &&
-        Cesium.Property.equals(this._repeat, other._repeat) &&
-        Cesium.Property.equals(this._speed, other._speed))
-    )
+  // 变量初始化
+  this.color = opt.color || defaultColor // 颜色
+  this.backgroundColor = opt.backgroundColor || defaultColor // 颜色
+  this._image = opt.image || defaultImage // 材质图片
+  this.imageW = opt.imageW || defaultImageimageW
+  this.animation = opt.animation || defaultAnimation
+  this.duration = opt.duration || defaultDuration
+  this._time = undefined
+}
+
+ImageTrailMaterial.prototype.getType = function () {
+  return Cesium.Material.ImageTrailMaterialType
+}
+
+// 这个方法在每次渲染时被调用,result的参数会传入glsl中。
+ImageTrailMaterial.prototype.getValue = function (
+  time: any,
+  result: {
+    color?: any
+    backgroundColor?: any
+    image?: any
+    imageW?: any
+    animation?: any
+    time?: any
+  },
+) {
+  if (!Cesium.defined(result)) {
+    result = {}
   }
+  // result.color = Cesium.Property.getValueOrClonedDefault(
+  //   this._color,
+  //   time,
+  //   defaultColor,
+  //   result.color,
+  // )
+  // result.backgroundColor = Cesium.Property.getValueOrClonedDefault(
+  //   this._backgroundColor,
+  //   time,
+  //   defaultColor,
+  //   result.backgroundColor,
+  // )
+  result.color = Cesium.Property.getValueOrUndefined(this._color, time)
+  result.backgroundColor = Cesium.Property.getValueOrUndefined(this._backgroundColor, time)
+  result.image = this._image
+  result.imageW = this._imageW
+  result.animation = this._animation
+  if (this._time === undefined) {
+    this._time = new Date().getTime()
+  }
+  result.time =
+    ((new Date().getTime() - this._time) % this._duration) / this._duration
+  return result
+}
+
+ImageTrailMaterial.prototype.equals = function (other: {
+  _color: any
+  _backgroundColor: any
+}) {
+  return (
+    this === other ||
+    (other instanceof ImageTrailMaterial &&
+      Cesium.Property.equals(this._color, other._color) &&
+      Cesium.Property.equals(this._backgroundColor, other._backgroundColor))
+  )
 }
 
 Object.defineProperties(ImageTrailMaterial.prototype, {
+  isConstant: {
+    get: function get () {
+      return false
+    },
+  },
+  definitionChanged: {
+    get: function get () {
+      return this._definitionChanged
+    },
+  },
   color: Cesium.createPropertyDescriptor('color'),
-  speed: Cesium.createPropertyDescriptor('speed'),
+  backgroundColor: Cesium.createPropertyDescriptor('backgroundColor'),
   image: Cesium.createPropertyDescriptor('image'),
-  repeat: Cesium.createPropertyDescriptor('repeat'),
+  imageW: Cesium.createPropertyDescriptor('imageW'),
+  animation: Cesium.createPropertyDescriptor('animation'),
+  duration: Cesium.createPropertyDescriptor('duration'),
 })
-// 材质类型
-Cesium.Material.ImageTrailMaterialType = 'PolylineImageTrail'
-// 添加材质到缓冲区中
-Cesium.Material._materialCache.addMaterial(
-  Cesium.Material.ImageTrailMaterialType,
-  {
-    fabric: {
-      type: Cesium.Material.ImageTrailMaterialType,
-      // uniform变量
-      uniforms: {
-        color: new Cesium.Color(1.0, 0.0, 0.0, 0.7),
-        image: Cesium.Material.DefaultImageId,
-        speed: 1,
-        repeat: new Cesium.Cartesian2(1, 1),
-      },
-      //
-      source: `
-                    uniform sampler2D image; 
-                    uniform float speed;
-                    uniform vec4 color;
-                    uniform vec2 repeat;
-                    
-                    czm_material czm_getMaterial(czm_materialInput materialInput){
-                        czm_material material=czm_getDefaultMaterial(materialInput);
-                        vec2 st=repeat * materialInput.st;
-                        float time=fract(czm_frameNumber*speed/1000.);
-                        // st.s是横轴方向运动,st.t是纵轴,
-                        // vec2(fract(st.s-time),st.t)是横轴按照时间变化而变化,纵轴保持正常不变化
-                        vec4 colorImage=texture2D(image,vec2(fract(st.s-time),st.t));
-                        vec4 fragColor;
-                        fragColor.rgb=color.rgb / 1.0;
-                        if(color.a==0.){
-                            material.alpha=colorImage.a;
-                            material.diffuse=colorImage.rgb;
-                        }else{
-                            material.alpha=colorImage.a*color.a;
-                            material.diffuse=max(color.rgb*material.alpha*3.,color.rgb);
-                        }
-                        return material;
-                    }
-                    `
-    },
-    translucent: function () {
-      return true
-    },
-  }
-)
 
-export default ImageTrailMaterial
+// 写到Cesium对象上,就可以像其他MaterialProperty一样使用了
+Cesium.Material.ImageTrailMaterialType = 'PolylineImageTrail'
+
+Cesium.Material._materialCache.addMaterial(Cesium.Material.ImageTrailMaterialType, {
+  fabric: {
+    type: 'ImageLine',
+    uniforms: {
+      // uniforms参数跟我们上面定义的参数以及getValue方法中返回的result对应,这里值是默认值
+      color: new Cesium.Color(1, 0, 0, 1.0),
+      backgroundColor: new Cesium.Color(0, 0, 0, 0.0),
+      image: '',
+      imageW: 1,
+      animation: false,
+      duration: 30,
+      time: 0,
+    },
+    // source编写glsl,可以使用uniforms参数,值来自getValue方法的result
+    source: `
+      czm_material czm_getMaterial(czm_materialInput materialInput)
+      {
+          czm_material material = czm_getDefaultMaterial(materialInput);
+          vec2 st = materialInput.st;
+          float s = st.s/ (abs(fwidth(st.s)) * imageW * czm_pixelRatio);
+          if(animation==true){
+            s = s-time;//增加运动效果
+          }
+          float t = st.t;
+          vec4 colorImage = texture(image, vec2(fract(s), t));
+          material.diffuse = colorImage.rgb;
+          material.emission = max(backgroundColor.rgb*material.alpha*1.,backgroundColor.rgb);
+          return material;
+      }    
+    `,
+  },
+  translucent: function translucent () {
+    return true
+  },
+})
+
+export default (ImageTrailMaterial as any)

--
Gitblit v1.9.3