|
@@ -0,0 +1,186 @@
|
|
|
+class WallMaterialProperty {
|
|
|
+ /**
|
|
|
+ * 构造方法
|
|
|
+ * @ignore 无需公开
|
|
|
+ * @param {Cesium.Viewer} viewer 着色器运行所需的视图
|
|
|
+ * @param {JSON} options 配置项
|
|
|
+ * @param {Cesium.Color} options.color [墙的颜色,默认蓝色] 可选
|
|
|
+ * @param {Number} options.duration [循环时间 默认1000] 可选
|
|
|
+ * @param {String} options.trailImage 墙的贴图
|
|
|
+ * @param {JSON} options.param 着色器参数
|
|
|
+ * @param {Number} options.param.count [数量 可选 默认为1]
|
|
|
+ * @param {String} options.param.direction [方向 可选 默认竖直 ] 取值vertical/horizontal
|
|
|
+ * @param {String} options.param.order [顺序 可选 上下/下上/顺时针/逆时针 与方向配合使用 ] 取值+/-
|
|
|
+ */
|
|
|
+ constructor(viewer, options) {
|
|
|
+
|
|
|
+
|
|
|
+ /* 着色器运行依赖的视图 */
|
|
|
+ this._viewer = viewer;
|
|
|
+ options = options || {};
|
|
|
+
|
|
|
+ /* 变更事件 */
|
|
|
+ this._definitionChanged = new Cesium.Event();
|
|
|
+ this._color = undefined;
|
|
|
+ /* 墙的颜色 */
|
|
|
+ this.color = options.color || Cesium.Color.BLUE;
|
|
|
+ /* 动态循环周期 */
|
|
|
+ this.duration = options.duration || 1000;
|
|
|
+
|
|
|
+ this.count = options.duration || 1;
|
|
|
+ this.direction = options.duration || 'vertical';
|
|
|
+ this.order = options.duration || '-';
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ /* 墙的贴图 */
|
|
|
+ this.trailImage = Cesium.defaultValue(options.trailImage, 'jt3dSDK/imgs/wallmaterial/wl.png');
|
|
|
+ /* 默认时间 */
|
|
|
+ this._time = (new Date()).getTime();
|
|
|
+ /* 材质类型名称 */
|
|
|
+ this._materialTypeName = 'WallMaterial' + this._guid();
|
|
|
+ /* 存储相关参数的属性 以便后期进行追踪修改 */
|
|
|
+ this._param = {
|
|
|
+ color: this.color._value.toCssColorString(),
|
|
|
+ image: this.trailImage,
|
|
|
+ duration: this.duration,
|
|
|
+ count: this.count,
|
|
|
+ direction: this.direction,
|
|
|
+ order: this.order,
|
|
|
+ }
|
|
|
+ /* 将材质加入缓存 以便重复利用 */
|
|
|
+ Cesium.Material._materialCache.addMaterial(this._materialTypeName, {
|
|
|
+ fabric: {
|
|
|
+ type: this._materialTypeName,
|
|
|
+ uniforms: {
|
|
|
+ time: -20,
|
|
|
+ color: new Cesium.Color(1.0, 0.0, 0.0, 0.5),
|
|
|
+ image: options.trailImage,
|
|
|
+ },
|
|
|
+ source: this._getDirectionWallShader(options.param)
|
|
|
+ },
|
|
|
+ translucent: function(material) {
|
|
|
+ /* 材质是否半透明 */
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 生成GUID随机数
|
|
|
+ * @ignore 无需公开
|
|
|
+ */
|
|
|
+ _guid() {
|
|
|
+ function S4() {
|
|
|
+ return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
|
|
|
+ }
|
|
|
+ return (S4() + S4() + "-" + S4() + "-" + S4() + "-" + S4() + "-" + S4() + S4() + S4());
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 重新获取类型方法
|
|
|
+ * @ignore 无需公开
|
|
|
+ * @param {Cesium.JulianDate} time 时间
|
|
|
+ */
|
|
|
+ getType(time) {
|
|
|
+ return this._materialTypeName;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 重写获取值方法
|
|
|
+ * @ignore 无需公开
|
|
|
+ * @param {Cesium.JulianDate} time
|
|
|
+ * @param {JSON} result
|
|
|
+ */
|
|
|
+ getValue(time, result) {
|
|
|
+ if (!Cesium.defined(result)) {
|
|
|
+ result = {};
|
|
|
+ }
|
|
|
+ result.color = Cesium.Property.getValueOrClonedDefault(this._color, time, Cesium.Color.BLUE, result.color);
|
|
|
+ result.image = this.trailImage;
|
|
|
+ if (this.duration) {
|
|
|
+ result.time = (((new Date()).getTime() - this._time) % this.duration) / this.duration;
|
|
|
+ }
|
|
|
+ this._viewer.scene.requestRender();
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 重写对比函数
|
|
|
+ * @ignore 无需公开
|
|
|
+ * @param {Object} other 传入对比对象
|
|
|
+ */
|
|
|
+ equals(other) {
|
|
|
+ return (this === other || (other instanceof WallMaterialProperty && Cesium.Property.equals(this
|
|
|
+ ._color, other._color) && other._param.order === this._param.order && other._param.count ===
|
|
|
+ this._param.count && other._param.direction === this._param.direction && other.duration === this
|
|
|
+ .duration));
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 创建着色器资源
|
|
|
+ * @ignore 无需公开
|
|
|
+ * @param {JSON} options 配置项
|
|
|
+ * @param {Number} options.count [数量 可选 默认为1]
|
|
|
+ * @param {String} options.direction [方向 可选 默认竖直 ] 取值vertical/horizontal
|
|
|
+ * @param {String} options.order [顺序 可选 上下/下上/顺时针/逆时针 与方向配合使用 ] 取值+/-
|
|
|
+ */
|
|
|
+ _getDirectionWallShader(options) {
|
|
|
+ let op = Cesium.defaultValue(options, {});
|
|
|
+ // console.log('>>>op===', op);
|
|
|
+ let count = op.count !== undefined && typeof op.count === 'number' && op.count > 0 ? op.count : 1;
|
|
|
+ let direction = op.direction === 'horizontal' ? 'horizontal' : 'vertical';
|
|
|
+ let order = op.order === '+' ? '+' : '-';
|
|
|
+ this._param.count = count;
|
|
|
+ this._param.direction = direction;
|
|
|
+ this._param.order = order;
|
|
|
+ let materail = '';
|
|
|
+ /* 补充参数 */
|
|
|
+ // console.log('_param', this._param);
|
|
|
+ materail += 'czm_material czm_getMaterial(czm_materialInput materialInput){\n' +
|
|
|
+ ' czm_material material = czm_getDefaultMaterial(materialInput);\n' +
|
|
|
+ ' vec2 st = materialInput.st;\n';
|
|
|
+ if (direction === 'vertical') {
|
|
|
+ materail += ' vec4 colorImage = texture2D(image,vec2(st.s,fract(float(' + count + ')*st.t ' + order + ' time)));\n';
|
|
|
+ } else if (direction === 'horizontal') {
|
|
|
+ materail += ' vec4 colorImage = texture2D(image, vec2(fract(float(' + count + ')*st.s ' + order + ' time), st.t));\n'
|
|
|
+ }
|
|
|
+ materail += ' vec4 fragColor;\n' +
|
|
|
+ ' fragColor.rgb = color.rgb / 1.0;\n' +
|
|
|
+ ' fragColor = czm_gammaCorrect(fragColor);\n' +
|
|
|
+ ' material.alpha = colorImage.a * color.a;\n' +
|
|
|
+ ' material.diffuse = color.rgb;\n' +
|
|
|
+ ' material.emission = fragColor.rgb;\n' +
|
|
|
+ ' return material;\n' +
|
|
|
+ '}';
|
|
|
+ return materail;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * 增加默认属性
|
|
|
+ */
|
|
|
+Object.defineProperties(WallMaterialProperty.prototype, {
|
|
|
+ /**
|
|
|
+ * @ignore 无需公开
|
|
|
+ * 判断是否相等,返回false表示属性一直在变化中
|
|
|
+ */
|
|
|
+ isConstant: {
|
|
|
+ get: function() {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ },
|
|
|
+ /**
|
|
|
+ * @ignore 无需公开
|
|
|
+ * 事件变更
|
|
|
+ */
|
|
|
+ definitionChanged: {
|
|
|
+ get: function() {
|
|
|
+ return this._definitionChanged;
|
|
|
+ }
|
|
|
+ },
|
|
|
+ /* 颜色属性 */
|
|
|
+ color: Cesium.createPropertyDescriptor('color')
|
|
|
+})
|
|
|
+
|
|
|
+export default WallMaterialProperty;
|