线段缓冲
diff --git a/src/Obj/Base/PolylineObject/eventBinding.js b/src/Obj/Base/PolylineObject/eventBinding.js
index bcbf281..7a665f8 100644
--- a/src/Obj/Base/PolylineObject/eventBinding.js
+++ b/src/Obj/Base/PolylineObject/eventBinding.js
@@ -22,7 +22,7 @@ class eventBinding {
let isEvent = false
let removeName = []
if (!elements[i] || !elements[i].attributes) {
- continue
+ continue
}
for (let m of elements[i].attributes) {
switch (m.name) {
@@ -38,13 +38,15 @@ class eventBinding {
if (e.target.type == 'number') {
if (e.data != '.' && (e.data != '-' || e.target.value)) {
value = Number(value)
- if((e.target.max) && value>Number(e.target.max)) {
+ if ((e.target.max) && value > Number(e.target.max)) {
value = Number(e.target.max)
+ e.target.value = value
}
- if((e.target.min) && value {
let value = e.target.value
- if(e.target.type == 'number' && value!='') {
+ if (e.target.type == 'number' && value != '') {
value = Number(value)
e.target.value = value
}
@@ -97,7 +99,7 @@ class eventBinding {
}
// elements[i].attributes[m] = undefined
}
- for(let n=0;n {
let colorPicker = new ewPlugins('colorpicker', {
@@ -168,6 +170,48 @@ class PolylineObject extends Base {
}
}
+ get speed() {
+ return this.options.speed
+ }
+
+ set speed(v) {
+ this.options.speed = v
+ this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, this.options)
+ }
+ get dashSize() {
+ return this.options.dashSize
+ }
+
+ set dashSize(v) {
+ this.options.dashSize = v
+ this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, this.options)
+ }
+
+ get rotate() {
+ return this.options.rotate
+ }
+
+ set rotate(v) {
+ this.options.rotate = v
+ PolylineObject.closeNodeEdit(this)
+ this._elms.rotate &&
+ this._elms.rotate.forEach(item => {
+ item.checked = v
+ })
+
+ this.options.rotate = v
+ this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, this.options)
+ }
+
+ get space() {
+ return this.options.space
+ }
+
+ set space(v) {
+ this.options.space = v
+ this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, this.options)
+ }
+
get length() {
return this.options.length
}
@@ -275,6 +319,56 @@ class PolylineObject extends Base {
name: '泛光',
value: '泛光',
key: 2
+ },
+ {
+ name: '尾迹光线',
+ value: '尾迹光线',
+ key: 3
+ },
+ {
+ name: '多尾迹光线',
+ value: '多尾迹光线',
+ key: 4
+ },
+ {
+ name: '流动虚线1',
+ value: '流动虚线1',
+ key: 5
+ },
+ {
+ name: '流动虚线2',
+ value: '流动虚线2',
+ key: 6
+ },
+ {
+ name: '流动箭头1',
+ value: '流动箭头1',
+ key: 7
+ },
+ {
+ name: '流动箭头2',
+ value: '流动箭头2',
+ key: 8
+ },
+ {
+ name: '流动箭头3',
+ value: '流动箭头3',
+ key: 9
+ },
+ {
+ name: '流动箭头4',
+ value: '流动箭头4',
+ key: 10
+ },
+ {
+ name: '流动箭头5',
+ value: '流动箭头5',
+ key: 11
+ },
+ {
+ name: '流动箭头6',
+ value: '流动箭头6',
+ key: 12
}
]
this.options.type = Number(v)
@@ -283,6 +377,18 @@ class PolylineObject extends Base {
this._elms.lineType &&
this._elms.lineType.forEach(item => {
item.value = lineTypeData[i].value
+ if (2 < item.value && item.value < 13) {//贴图参数
+ document.getElementById('dashTextureDom').style.display = 'flex'
+ } else {
+ document.getElementById('dashTextureDom').style.display = 'none'
+ }
+ if (2 < item.value && item.value < 5) {//尾迹参数
+ document.getElementsByClassName('lineSpace')[0].style.display = 'none'
+ document.getElementsByClassName('lineSpace')[1].style.display = 'none'
+ } else {
+ document.getElementsByClassName('lineSpace')[0].style.display = 'flex'
+ document.getElementsByClassName('lineSpace')[1].style.display = 'flex'
+ }
})
break
}
@@ -291,7 +397,9 @@ class PolylineObject extends Base {
this.entity.polyline &&
(this.entity.polyline.material = this.getMaterial(
this.options.color,
- this.options.type
+ this.options.type,
+ this.entity,
+ this.options
))
}
get noseToTail() {
@@ -445,6 +553,7 @@ class PolylineObject extends Base {
set extendWidth(v) {
this.options['extend-width'] = v
+ this.heightMode = this.heightMode
this._elms.extendWidth &&
this._elms.extendWidth.forEach(item => {
item.value = v
@@ -507,21 +616,6 @@ class PolylineObject extends Base {
})
}
- get labelFontFamily() {
- return this.options.label.fontFamily
- }
-
- set labelFontFamily(v) {
- this.options.label.fontFamily = v || 0
- this.label && (this.label.fontFamily = this.options.label.fontFamily)
-
- let name = getFontFamilyName(this.labelFontFamily) || ''
- this._elms.labelFontFamily &&
- this._elms.labelFontFamily.forEach(item => {
- item.value = name
- })
- }
-
get labelColor() {
return this.options.label.color
}
@@ -1141,7 +1235,6 @@ class PolylineObject extends Base {
],
text: that.options.name,
fontSize: that.options.label.fontSize,
- fontFamily: that.options.label.fontFamily,
color: that.options.label.color,
pixelOffset: that.options.label.pixelOffset,
backgroundColor: that.options.label.backgroundColor,
@@ -1170,7 +1263,7 @@ class PolylineObject extends Base {
positions: Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray),
width: that.options.width,
clampToGround: ground,
- material: that.getMaterial(that.options.color, that.options.type),
+ material: that.getMaterial(that.options.color, that.options.type, that.entity, that.options),
zIndex: that.sdk._entityZIndex
}
})
@@ -1508,6 +1601,56 @@ class PolylineObject extends Base {
name: '泛光',
value: '泛光',
key: 2
+ },
+ {
+ name: '尾迹光线',
+ value: '尾迹光线',
+ key: 3
+ },
+ {
+ name: '多尾迹光线',
+ value: '多尾迹光线',
+ key: 4
+ },
+ {
+ name: '流动虚线1',
+ value: '流动虚线1',
+ key: 5
+ },
+ {
+ name: '流动虚线2',
+ value: '流动虚线2',
+ key: 6
+ },
+ {
+ name: '流动箭头1',
+ value: '流动箭头1',
+ key: 7
+ },
+ {
+ name: '流动箭头2',
+ value: '流动箭头2',
+ key: 8
+ },
+ {
+ name: '流动箭头3',
+ value: '流动箭头3',
+ key: 9
+ },
+ {
+ name: '流动箭头4',
+ value: '流动箭头4',
+ key: 10
+ },
+ {
+ name: '流动箭头5',
+ value: '流动箭头5',
+ key: 11
+ },
+ {
+ name: '流动箭头6',
+ value: '流动箭头6',
+ key: 12
}
]
let lineTypeDataLegpObject = legp(
@@ -1533,6 +1676,20 @@ class PolylineObject extends Base {
for (let i = 0; i < lineTypeData.length; i++) {
if (lineTypeData[i].value === lineTypeDataLegpElm.value) {
this.lineType = lineTypeData[i].key
+
+ //控制参数显隐
+ if (2 < this.lineType && this.lineType < 13) {//贴图参数
+ document.getElementById('dashTextureDom').style.display = 'flex'
+ } else {
+ document.getElementById('dashTextureDom').style.display = 'none'
+ }
+ if (2 < this.lineType && this.lineType < 5) {//尾迹参数
+ document.getElementsByClassName('lineSpace')[0].style.display = 'none'
+ document.getElementsByClassName('lineSpace')[1].style.display = 'none'
+ } else {
+ document.getElementsByClassName('lineSpace')[0].style.display = 'flex'
+ document.getElementsByClassName('lineSpace')[1].style.display = 'flex'
+ }
break
}
}
@@ -1760,37 +1917,6 @@ class PolylineObject extends Base {
this._elms.altInput.push(altInput)
tBodyElm.appendChild(tr)
}
-
- let fontData = getFontList()
- let fontObject = legp(
- this._DialogObject._element.content.getElementsByClassName(
- 'font-select-box'
- )[0],
- '.font-select'
- )
- if (fontObject) {
- fontObject.legp_search(fontData)
- let fontDataLegpElm = this._DialogObject._element.content
- .getElementsByClassName('font-select')[0]
- .getElementsByTagName('input')[0]
- fontDataLegpElm.value = fontData[this.labelFontFamily].value
- for (let i = 0; i < fontData.length; i++) {
- if (fontData[i].value == fontDataLegpElm.value) {
- fontObject.legp_searchActive(fontData[i].value)
- break
- }
- }
- fontDataLegpElm.addEventListener('input', () => {
- for (let i = 0; i < fontData.length; i++) {
- if (fontData[i].value === fontDataLegpElm.value) {
- this.labelFontFamily = fontData[i].key
- break
- }
- }
- })
- this._elms.labelFontFamily = [fontDataLegpElm]
- }
-
}, 0)
} else {
if (this._DialogObject && this._DialogObject.close) {
@@ -1972,10 +2098,6 @@ class PolylineObject extends Base {
this.labelShow = this.originalOptions.label.show
this.labelColor = this.originalOptions.label.color
this.labelFontSize = this.originalOptions.label.fontSize
- this.labelFontFamily = this.originalOptions.label.fontFamily
- this.labelScaleByDistance = this.originalOptions.label.scaleByDistance
- this.labelNear = this.originalOptions.label.near
- this.labelFar = this.originalOptions.label.far
this.labelLineWidth = this.originalOptions.label.lineWidth
this.labelPixelOffset = this.originalOptions.label.pixelOffset
this.labelLineColor = this.originalOptions.label.lineColor
@@ -1987,6 +2109,10 @@ class PolylineObject extends Base {
this.attributeVr = this.options.attribute.vr.content
this.attributeCamera = this.options.attribute.camera.content
this.attributeGoods = this.options.attribute.goods.content
+ this.rotate = this.originalOptions.rotate
+ this.speed = this.originalOptions.speed
+ this.dashSize = this.originalOptions.dashSize
+ this.space = this.originalOptions.space
this.cameraSelect && this.cameraSelect()
this.goodsSelect && this.goodsSelect()
@@ -2039,7 +2165,7 @@ class PolylineObject extends Base {
.value
) {
this.options.attribute.link.content.push({
- name: '链接',
+ name: '链接' + (this.options.attribute.link.content.length + 1),
url: this._DialogObject._element.content.getElementsByClassName(
'link_add'
)[0].value
@@ -2057,7 +2183,7 @@ class PolylineObject extends Base {
// input.addEventListener('change', (event) => {
// if (input.value) {
// this.options.attribute.link.content.push({
- // name: '链接',
+ // name: '链接' + (this.options.attribute.link.content.length + 1),
// url: input.value
// })
// this.attributeLink = this.options.attribute.link.content
@@ -2067,7 +2193,7 @@ class PolylineObject extends Base {
}
addAttributeLink(link) {
this.options.attribute.link.content.push({
- name: '链接',
+ name: '链接' + (this.options.attribute.link.content.length + 1),
url: link
})
this.attributeLink = this.options.attribute.link.content
@@ -2080,7 +2206,7 @@ class PolylineObject extends Base {
)[0].value
) {
this.options.attribute.vr.content.push({
- name: '全景图' ,
+ name: '全景图' + (this.options.attribute.vr.content.length + 1),
url: this._DialogObject._element.content.getElementsByClassName(
'vr_add'
)[0].value
@@ -2096,7 +2222,7 @@ class PolylineObject extends Base {
addAttributeRr(vr) {
this.options.attribute.vr.content.push({
- name: '全景图' ,
+ name: '全景图' + (this.options.attribute.vr.content.length + 1),
url: vr
})
this.attributeVr = this.options.attribute.vr.content
diff --git a/src/Obj/Materail/FlowDashedLineFlowMaterialProperty.js b/src/Obj/Materail/FlowDashedLineFlowMaterialProperty.js
new file mode 100644
index 0000000..546cda6
--- /dev/null
+++ b/src/Obj/Materail/FlowDashedLineFlowMaterialProperty.js
@@ -0,0 +1,148 @@
+/*
+ * @Description: 流动线
+ */
+function FlowDashedLine() {
+ class FlowDashedLineFlowMaterialProperty {
+ constructor(options) {
+ this._definitionChanged = new Cesium.Event();
+ this._color = undefined;
+ this._speed = undefined;
+ this._uType = undefined;
+ this._space = undefined;
+ this._dashSize = undefined;
+ this.color = new Cesium.Color.fromCssColorString(options.color || "rgba(255,255,255,1)");
+ this.speed = options.speed != undefined ? options.speed : 1.0;//速度
+ this.space = options.space || 0.0;//速度
+ this.dashSize = options.dashSize || 0.03;//速度
+ this.uType = options.uType === undefined ? 1 : options.uType;//类型:0:普通流动线 1:虚化虚线
+ this.lineBackAlpha = options.lineBackAlpha || 0.05;
+ }
+
+ get isConstant() {
+ return false;
+ }
+
+ get definitionChanged() {
+ return this._definitionChanged;
+ }
+
+ getType(time) {
+ return Cesium.Material.FlowDashedLineMaterialType;
+ }
+
+ getValue(time, result) {
+ if (!Cesium.defined(result)) {
+ result = {};
+ }
+
+ result.color = Cesium.Property.getValueOrDefault(
+ this._color,
+ time,
+ Cesium.Color.RED,
+ result.color
+ );
+ result.speed = Cesium.Property.getValueOrDefault(
+ this._speed,
+ time,
+ 10,
+ result.speed
+ );
+ result.space = Cesium.Property.getValueOrDefault(
+ this._space,
+ time,
+ 10,
+ result.space
+ );
+ result.dashSize = Cesium.Property.getValueOrDefault(
+ this._dashSize,
+ time,
+ 10,
+ result.dashSize
+ );
+ result.uType = Cesium.Property.getValueOrDefault(
+ this._uType,
+ time,
+ 1,
+ result.uType
+ );
+ result.lineBackAlpha = this.lineBackAlpha;
+ result.frameNumber = Cesium.getTimestamp();
+ return result;
+ }
+
+ equals(other) {
+ return (
+ this === other ||
+ (other instanceof FlowDashedLineFlowMaterialProperty &&
+ Cesium.Property.equals(this._color, other._color) &&
+ Cesium.Property.equals(this._speed, other.speed) &&
+ Cesium.Property.equals(this._uType, other.uType) &&
+ Cesium.Property.equals(this.lineBackAlpha, other.lineBackAlpha))
+ );
+ }
+ }
+
+ Object.defineProperties(FlowDashedLineFlowMaterialProperty.prototype, {
+ color: Cesium.createPropertyDescriptor("color"),
+ speed: Cesium.createPropertyDescriptor("speed"),
+ space: Cesium.createPropertyDescriptor("space"),
+ dashSize: Cesium.createPropertyDescriptor("dashSize"),
+ uType: Cesium.createPropertyDescriptor("uType"),
+ transparency: Cesium.createPropertyDescriptor("lineBackAlpha"),
+ });
+
+ Cesium.FlowDashedLineFlowMaterialProperty = FlowDashedLineFlowMaterialProperty;
+ Cesium.Material.FlowDashedLineFlowMaterialProperty = "FlowDashedLineFlowMaterialProperty";
+ Cesium.Material.FlowDashedLineMaterialType = "FlowDashedLineMaterialType";
+ Cesium.Material.FlowDashedLineMaterialSource = `
+ uniform vec4 color;
+ uniform float speed;
+ // uniform int uType;
+ uniform float lineBackAlpha;
+
+ czm_material czm_getMaterial(czm_materialInput materialInput)
+ {
+ czm_material material = czm_getDefaultMaterial(materialInput);
+ vec2 st = materialInput.st;
+
+ float dashSize = 0.1;
+ float gapSize = space;
+ // speed现在表示完成一次完整动画循环的秒数
+ float progress = speed==0.0 ? 0.0 : fract(frameNumber / 1000.0 / speed);
+ float pattern = fract(st.x / dashSize * (1.0 + gapSize) + progress / dashSize * (1.0 + gapSize));
+ float dash1 = step(0.0, pattern) - step(1.0/(1.0 + gapSize), pattern);
+ float dash2 = smoothstep(0.0, 0.2, pattern) -
+ smoothstep(1.0/(1.0 + gapSize),
+ 1.0/(1.0 + gapSize) + 0.2,
+ pattern);
+ float dash = (float(uType) != 1.0)?dash1:dash2;
+ material.alpha = dash;
+ material.diffuse = color.rgb;
+ return material;
+ }
+ `;
+
+ Cesium.Material._materialCache.addMaterial(
+ Cesium.Material.FlowDashedLineMaterialType,
+ {
+ fabric: {
+ type: Cesium.Material.FlowDashedLineMaterialType,
+ uniforms: {
+ color: new Cesium.Color(1.0, 1.0, 1.0, 1.0),
+ speed: 1,
+ space: 0.0,
+ dashSize: 0.03,
+ frameNumber: Cesium.getTimestamp(),
+ uType: 1,
+ lineBackAlpha: 0.05,
+ },
+ source: Cesium.Material.FlowDashedLineMaterialSource,
+ },
+ translucent: function (material) {
+ return true;
+ },
+ }
+ );
+}
+
+export { FlowDashedLine }
diff --git a/src/Obj/Materail/FlowLineMaterialProperty.js b/src/Obj/Materail/FlowLineMaterialProperty.js
new file mode 100644
index 0000000..7b4e009
--- /dev/null
+++ b/src/Obj/Materail/FlowLineMaterialProperty.js
@@ -0,0 +1,113 @@
+/*
+ * @Description: 流动线
+ */
+function FlowLine() {
+ class FlowLineMaterialProperty {
+ constructor(options) {
+ this._definitionChanged = new Cesium.Event();
+ this._color = undefined;
+ this._duration = undefined;
+ this.color = new Cesium.Color.fromCssColorString(options.color || "rgba(255,255,255,1)");
+ this.duration = options.duration || 10.0;
+ this.lineBackAlpha = options.lineBackAlpha || 0.05;
+ }
+
+ get isConstant() {
+ return false;
+ }
+
+ get definitionChanged() {
+ return this._definitionChanged;
+ }
+
+ getType(time) {
+ return Cesium.Material.FlowLineMaterialType;
+ }
+
+ getValue(time, result) {
+ if (!Cesium.defined(result)) {
+ result = {};
+ }
+
+ result.color = Cesium.Property.getValueOrDefault(
+ this._color,
+ time,
+ Cesium.Color.RED,
+ result.color
+ );
+ result.duration = Cesium.Property.getValueOrDefault(
+ this._duration,
+ time,
+ 10,
+ result.duration
+ );
+ result.lineBackAlpha = this.lineBackAlpha;
+ result.frameNumber = Cesium.getTimestamp();
+ return result;
+ }
+
+ equals(other) {
+ return (
+ this === other ||
+ (other instanceof FlowLineMaterialProperty &&
+ Cesium.Property.equals(this._color, other._color) &&
+ Cesium.Property.equals(this._duration, other.duration) &&
+ Cesium.Property.equals(this.lineBackAlpha, other.lineBackAlpha))
+ );
+ }
+ }
+
+ Object.defineProperties(FlowLineMaterialProperty.prototype, {
+ color: Cesium.createPropertyDescriptor("color"),
+ duration: Cesium.createPropertyDescriptor("duration"),
+ transparency: Cesium.createPropertyDescriptor("lineBackAlpha"),
+ });
+
+ Cesium.FlowLineMaterialProperty = FlowLineMaterialProperty;
+ Cesium.Material.FlowLineMaterialProperty = "FlowLineMaterialProperty";
+ Cesium.Material.FlowLineMaterialType = "FlowLineMaterialType";
+ Cesium.Material.FlowLineMaterialSource = `
+ uniform vec4 color;
+ uniform float duration;
+ uniform float lineBackAlpha;
+
+ czm_material czm_getMaterial(czm_materialInput materialInput)
+ {
+ //生成默认的基础材质
+ czm_material material = czm_getDefaultMaterial(materialInput);
+ //获取st(uv)
+ vec2 st = materialInput.st;
+ //获取当前帧数,10秒内变化0-1
+ float time = fract(czm_frameNumber / (60.0*duration));
+ //长度1/10
+ time = time * (1.0 + 0.1);
+ //平滑过渡函数
+ float alpha = smoothstep(time-0.1,time,st.s) * step(-time,-st.s);
+ //光带轨迹(不会完全透明)
+ alpha += lineBackAlpha;
+ material.alpha = alpha;
+ material.diffuse = color.rgb;
+ return material;
+ }
+ `;
+
+ Cesium.Material._materialCache.addMaterial(
+ Cesium.Material.FlowLineMaterialType,
+ {
+ fabric: {
+ type: Cesium.Material.FlowLineMaterialType,
+ uniforms: {
+ color: new Cesium.Color(1.0, 1.0, 1.0, 1.0),
+ duration: 10.0,
+ lineBackAlpha: 0.05,
+ },
+ source: Cesium.Material.FlowLineMaterialSource,
+ },
+ translucent: function (material) {
+ return true;
+ },
+ }
+ );
+}
+
+export { FlowLine }
diff --git a/src/Obj/Materail/LineTextureMaterialProperty.js b/src/Obj/Materail/LineTextureMaterialProperty.js
new file mode 100644
index 0000000..5bed3ec
--- /dev/null
+++ b/src/Obj/Materail/LineTextureMaterialProperty.js
@@ -0,0 +1,123 @@
+/*
+ * @Description: 流动线
+ */
+function LineTexture() {
+ class LineTextureMaterialProperty {
+ constructor(options) {
+ this._definitionChanged = new Cesium.Event();
+ this._image = undefined;
+ this._color = undefined;
+ this._speed = undefined;
+ this._repeat = undefined;
+ this.image = options.image || "";
+ this.color = new Cesium.Color.fromCssColorString(options.color || "rgba(255,255,255,1)");
+ this.speed = options.speed != undefined ? options.speed : 1.0;
+ this.repeat = options.repeat || 1.0;
+ }
+
+ get isConstant() {
+ return false;
+ }
+
+ get definitionChanged() {
+ return this._definitionChanged;
+ }
+
+ getType(time) {
+ return Cesium.Material.LineTextureMaterialType;
+ }
+
+ getValue(time, result) {
+ if (!Cesium.defined(result)) {
+ result = {};
+ }
+ result.image = Cesium.Property.getValueOrDefault(
+ this._image,
+ time,
+ "",
+ result.image
+ );
+ result.color = Cesium.Property.getValueOrDefault(
+ this._color,
+ time,
+ Cesium.Color.RED,
+ result.color
+ );
+ result.speed = Cesium.Property.getValueOrDefault(
+ this._speed,
+ time,
+ 1.0,
+ result.speed
+ );
+ result.repeat = Cesium.Property.getValueOrDefault(
+ this._repeat,
+ time,
+ 1.0,
+ result.repeat
+ );
+ result.frameNumber = Cesium.getTimestamp();
+ return result;
+ }
+
+ equals(other) {
+ return (
+ this === other ||
+ (other instanceof LineTextureMaterialProperty &&
+ Cesium.Property.equals(this._image, other._image) &&
+ Cesium.Property.equals(this._color, other._color) &&
+ Cesium.Property.equals(this._imageW, other._imageW) &&
+ Cesium.Property.equals(this._speed, other._speed))
+ );
+ }
+ }
+
+ Object.defineProperties(LineTextureMaterialProperty.prototype, {
+ image: Cesium.createPropertyDescriptor("image"),
+ color: Cesium.createPropertyDescriptor("color"),
+ speed: Cesium.createPropertyDescriptor("speed"),
+ repeat: Cesium.createPropertyDescriptor("repeat"),
+ });
+
+ Cesium.LineTextureMaterialProperty = LineTextureMaterialProperty;
+ Cesium.Material.LineTextureMaterialProperty = "LineTextureMaterialProperty";
+ Cesium.Material.LineTextureMaterialType = "LineTextureMaterialType";
+ Cesium.Material.LineTextureMaterialSource = `
+ uniform vec4 color;
+ uniform sampler2D image;
+ uniform float speed;
+ uniform float repeat;
+ czm_material czm_getMaterial(czm_materialInput materialInput)
+ {
+ czm_material material = czm_getDefaultMaterial(materialInput);
+ vec2 st = materialInput.st;
+ st.s *= repeat; // 关键:通过repeat控制纹理密度
+ // vec4 colorImage = texture2D(image, vec2(fract(st.s + speed*czm_frameNumber* 0.01), st.t));
+ vec4 colorImage = speed==0.0?texture2D(image, vec2(fract(st.s), st.t)):texture2D(image, vec2(fract(st.s + frameNumber / 1000.0 / speed * repeat ), st.t));
+ material.alpha = colorImage.a * color.a;
+ material.diffuse = color.rgb;
+ return material;
+ }
+ `;
+ Cesium.Material._materialCache.addMaterial(
+ Cesium.Material.LineTextureMaterialType,
+ {
+ fabric: {
+ type: Cesium.Material.LineTextureMaterialType,
+ uniforms: {
+ color: new Cesium.Color(1.0, 1.0, 1.0, 1.0),
+ image: '',
+ repeat: 1.0,
+ speed: 1.0,
+ frameNumber: Cesium.getTimestamp(),
+ uTime: 1
+ },
+ source: Cesium.Material.LineTextureMaterialSource,
+ },
+ translucent: function (material) {
+ return true;
+ },
+ }
+ );
+}
+
+export { LineTexture }
diff --git a/src/Obj/Materail/PolylineFlowMaterialProperty.js b/src/Obj/Materail/PolylineFlowMaterialProperty.js
new file mode 100644
index 0000000..5621365
--- /dev/null
+++ b/src/Obj/Materail/PolylineFlowMaterialProperty.js
@@ -0,0 +1,131 @@
+/*
+ * @Description: 流动线
+ */
+function PolylineFlow() {
+ class PolylineFlowMaterialProperty {
+ constructor(options) {
+ this._definitionChanged = new Cesium.Event();
+ this._color = undefined;
+ this._speed = undefined;
+ this._rotate = undefined;
+ this.color = new Cesium.Color.fromCssColorString(options.color || "rgba(255,255,255,1)");
+ this.speed = options.speed != undefined ? options.speed : 1.0;//速度
+ this.lineBackAlpha = options.lineBackAlpha || 0.05;
+ this.rotate = options.rotate;
+ }
+
+ get isConstant() {
+ return false;
+ }
+
+ get definitionChanged() {
+ return this._definitionChanged;
+ }
+
+ getType(time) {
+ return Cesium.Material.PolylineFlowMaterialType;
+ }
+
+ getValue(time, result) {
+ if (!Cesium.defined(result)) {
+ result = {};
+ }
+
+ result.color = Cesium.Property.getValueOrDefault(
+ this._color,
+ time,
+ Cesium.Color.RED,
+ result.color
+ );
+ result.speed = Cesium.Property.getValueOrDefault(
+ this._speed,
+ time,
+ 10,
+ result.speed
+ );
+ result.rotate = Cesium.Property.getValueOrDefault(
+ this._rotate,
+ time,
+ true,
+ result.rotate
+ );
+ result.lineBackAlpha = this.lineBackAlpha;
+ result.frameTime = Cesium.getTimestamp();
+ // result.frameNumber = Cesium.getTimestamp();
+ return result;
+ }
+
+ equals(other) {
+ return (
+ this === other ||
+ (other instanceof PolylineFlowMaterialProperty &&
+ Cesium.Property.equals(this._color, other._color) &&
+ Cesium.Property.equals(this._speed, other.speed) &&
+ Cesium.Property.equals(this.lineBackAlpha, other.lineBackAlpha))
+ );
+ }
+ }
+
+ Object.defineProperties(PolylineFlowMaterialProperty.prototype, {
+ color: Cesium.createPropertyDescriptor("color"),
+ speed: Cesium.createPropertyDescriptor("speed"),
+ rotate: Cesium.createPropertyDescriptor("rotate"),
+ transparency: Cesium.createPropertyDescriptor("lineBackAlpha"),
+ });
+
+ Cesium.PolylineFlowMaterialProperty = PolylineFlowMaterialProperty;
+ Cesium.Material.PolylineFlowMaterialProperty = "PolylineFlowMaterialProperty";
+ Cesium.Material.PolylineFlowMaterialType = "PolylineFlowMaterialType";
+ Cesium.Material.PolylineFlowMaterialSource = `
+ uniform vec4 color;
+ uniform float speed;
+ uniform float lineBackAlpha;
+
+ czm_material czm_getMaterial(czm_materialInput materialInput)
+ {
+ //生成默认的基础材质
+ czm_material material = czm_getDefaultMaterial(materialInput);
+ //获取st(uv)
+ vec2 st = materialInput.st;
+ //获取当前帧数,10秒内变化0-1
+ // float time = fract(czm_frameNumber * speed / 60.0);
+ // float time = fract(abs(speed) * czm_frameNumber * 0.01);
+ float time = fract(frameTime / 1000.0 / abs(speed));
+ //长度1/10
+ // time = time * (1.0 + 0.1);
+ float staticAlpha = rotate?smoothstep(0.0,1.0, 1.0-st.s) * step(-1.0,-(1.0-st.s)):smoothstep(0.0,1.0, st.s) * step(-1.0,-st.s);
+
+ //平滑过渡函数
+ float alpha1 = smoothstep(time-0.1,time,1.0-st.s) * step(-time,- (1.0-st.s));
+ float alpha2 = smoothstep(time-0.1,time,st.s) * step(-time,- st.s);
+ float alpha =(speed== 0.0)? staticAlpha:(speed < 0.0)?alpha2:alpha1;
+ //光带轨迹(不会完全透明)
+ alpha += lineBackAlpha;
+ material.alpha = alpha;
+ material.diffuse = color.rgb;
+ return material;
+ }
+ `;
+
+ Cesium.Material._materialCache.addMaterial(
+ Cesium.Material.PolylineFlowMaterialType,
+ {
+ fabric: {
+ type: Cesium.Material.PolylineFlowMaterialType,
+ uniforms: {
+ color: new Cesium.Color(1.0, 1.0, 1.0, 1.0),
+ speed: 0.1,
+ rotate: true,
+ frameTime: Cesium.getTimestamp(),
+ lineBackAlpha: 0.05,
+ },
+ source: Cesium.Material.PolylineFlowMaterialSource,
+ },
+ translucent: function (material) {
+ return true;
+ },
+ }
+ );
+}
+
+export { PolylineFlow }
diff --git a/src/Obj/Materail/PolylineFlowMultMaterialProperty.js b/src/Obj/Materail/PolylineFlowMultMaterialProperty.js
new file mode 100644
index 0000000..8e37538
--- /dev/null
+++ b/src/Obj/Materail/PolylineFlowMultMaterialProperty.js
@@ -0,0 +1,167 @@
+/*
+ * @Description: 流动线
+ */
+function PolylineFlowMult() {
+ class PolylineFlowMultMaterialProperty {
+ constructor(options) {
+ this._definitionChanged = new Cesium.Event();
+ this._color = undefined;
+ this._speed = undefined;
+ this._rotate = undefined;
+ this.color = new Cesium.Color.fromCssColorString(options.color || "rgba(255,255,255,1)");
+ this.speed = options.speed != undefined ? options.speed : 1.0;//速度
+ this.lineBackAlpha = options.lineBackAlpha || 0.05;
+ this.rotate = options.rotate;
+ }
+
+ get isConstant() {
+ return false;
+ }
+
+ get definitionChanged() {
+ return this._definitionChanged;
+ }
+
+ getType(time) {
+ return Cesium.Material.PolylineFlowMultMaterialType;
+ }
+
+ getValue(time, result) {
+ if (!Cesium.defined(result)) {
+ result = {};
+ }
+
+ result.color = Cesium.Property.getValueOrDefault(
+ this._color,
+ time,
+ Cesium.Color.RED,
+ result.color
+ );
+ result.speed = Cesium.Property.getValueOrDefault(
+ this._speed,
+ time,
+ 10,
+ result.speed
+ );
+ result.rotate = Cesium.Property.getValueOrDefault(
+ this._rotate,
+ time,
+ true,
+ result.rotate
+ );
+ result.lineBackAlpha = this.lineBackAlpha;
+ result.frameTime = Cesium.getTimestamp();
+ return result;
+ }
+
+ equals(other) {
+ return (
+ this === other ||
+ (other instanceof PolylineFlowMultMaterialProperty &&
+ Cesium.Property.equals(this._color, other._color) &&
+ Cesium.Property.equals(this._speed, other.speed) &&
+ Cesium.Property.equals(this._rotate, other.rotate) &&
+ Cesium.Property.equals(this.lineBackAlpha, other.lineBackAlpha))
+ );
+ }
+ }
+
+ Object.defineProperties(PolylineFlowMultMaterialProperty.prototype, {
+ color: Cesium.createPropertyDescriptor("color"),
+ speed: Cesium.createPropertyDescriptor("speed"),
+ rotate: Cesium.createPropertyDescriptor("rotate"),
+ transparency: Cesium.createPropertyDescriptor("lineBackAlpha"),
+ });
+
+ Cesium.PolylineFlowMultMaterialProperty = PolylineFlowMultMaterialProperty;
+ Cesium.Material.PolylineFlowMultMaterialProperty = "PolylineFlowMultMaterialProperty";
+ Cesium.Material.PolylineFlowMultMaterialType = "PolylineFlowMultMaterialType";
+ Cesium.Material.PolylineFlowMaterialSource = `
+ uniform vec4 color;
+ uniform float speed;
+ uniform float lineBackAlpha;
+
+ czm_material czm_getMaterial(czm_materialInput materialInput)
+ {
+ czm_material material = czm_getDefaultMaterial(materialInput);
+ vec2 st = materialInput.st;
+
+ // 基础时间轴(控制主光带)
+ float baseTime = fract(czm_frameNumber * speed / 60.0) * 1.1;
+
+ // 高频时间轴(控制高光点)
+ // float highlightTime = fract(czm_frameNumber * speed * 3.0 / 60.0);
+ // float highlightTime = fract(abs(speed) * czm_frameNumber * 0.01);
+ float highlightTime = fract(frameTime / 1000.0 / abs(speed));
+ float highlightSpacing = 0.3; // 高光点间隔
+
+ // 主光带透明度计算
+ float mainAlpha = smoothstep(baseTime-0.1, baseTime, st.s) * step(-baseTime, -st.s);
+
+ // 多高光点计算(3个周期性光斑)
+ float highlight11 = smoothstep(highlightTime-0.05, highlightTime, st.s) *
+ step(-highlightTime, -st.s) *
+ (1.0 - smoothstep(0.0, highlightSpacing, abs(st.s - highlightTime)));
+
+ float highlight21 = smoothstep(highlightTime+highlightSpacing-0.05,
+ highlightTime+highlightSpacing, st.s) *
+ step(-(highlightTime+highlightSpacing), -st.s) *
+ (1.0 - smoothstep(0.0, highlightSpacing, abs(st.s - (highlightTime+highlightSpacing))));
+
+ float highlight31 = smoothstep(highlightTime+2.0*highlightSpacing-0.05,
+ highlightTime+2.0*highlightSpacing, st.s) *
+ step(-(highlightTime+2.0*highlightSpacing), -st.s) *
+ (1.0 - smoothstep(0.0, highlightSpacing, abs(st.s - (highlightTime+2.0*highlightSpacing))));
+
+
+ float highlight12 = smoothstep(highlightTime-0.05, highlightTime, 1.0 - st.s) *
+ step(-highlightTime, -(1.0-st.s)) *
+ (1.0 - smoothstep(0.0, highlightSpacing, abs(1.0 - st.s - highlightTime)));
+
+ float highlight22 = smoothstep(highlightTime+highlightSpacing-0.05,
+ highlightTime+highlightSpacing, 1.0 - st.s) *
+ step(-(highlightTime+highlightSpacing),-(1.0 - st.s)) *
+ (1.0 - smoothstep(0.0, highlightSpacing, abs(1.0-st.s - (highlightTime+highlightSpacing))));
+
+ float highlight32 = smoothstep(highlightTime+2.0*highlightSpacing-0.05,
+ highlightTime+2.0*highlightSpacing, 1.0 - st.s) *
+ step(-(highlightTime+2.0*highlightSpacing), -(1.0-st.s)) *
+ (1.0 - smoothstep(0.0, highlightSpacing, abs(1.0 - st.s - (highlightTime+2.0*highlightSpacing))));
+
+
+ float highlight1 = !rotate?highlight11:highlight12;
+ float highlight2 = !rotate?highlight21:highlight22;
+ float highlight3 = !rotate?highlight31:highlight32;
+ // 合并效果
+ // material.alpha = mainAlpha * 0.7 +
+ // (highlight1 + highlight2 + highlight3) * 0.5 +
+ // lineBackAlpha;
+ material.alpha = (highlight1 + highlight2 + highlight3) * 0.5 +
+ lineBackAlpha;
+ material.diffuse = color.rgb; // 高光区变亮
+ return material;
+ }
+ `;
+
+ Cesium.Material._materialCache.addMaterial(
+ Cesium.Material.PolylineFlowMultMaterialType,
+ {
+ fabric: {
+ type: Cesium.Material.PolylineFlowMultMaterialType,
+ uniforms: {
+ color: new Cesium.Color(1.0, 1.0, 1.0, 1.0),
+ speed: 0.1,
+ rotate: true,
+ frameTime: Cesium.getTimestamp(),
+ lineBackAlpha: 0.05,
+ },
+ source: Cesium.Material.PolylineFlowMaterialSource,
+ },
+ translucent: function (material) {
+ return true;
+ },
+ }
+ );
+}
+
+export { PolylineFlowMult }
diff --git a/src/Obj/Materail/index.js b/src/Obj/Materail/index.js
index 5397891..e7fff6b 100644
--- a/src/Obj/Materail/index.js
+++ b/src/Obj/Materail/index.js
@@ -2,6 +2,11 @@ import { StreamWall1, StreamWall2 } from './WallMaterialProperty'
import { RadarScan } from './RadarScanMaterialProperty'
import { CustomColorMaterialSource } from './CustomColorMaterialSource'
import { CustomImageMaterialSource } from './CustomImageMaterialSource'
+import { FlowLine } from './FlowLineMaterialProperty'
+import { PolylineFlow } from './PolylineFlowMaterialProperty'
+import { PolylineFlowMult } from './PolylineFlowMultMaterialProperty'
+import { FlowDashedLine } from './FlowDashedLineFlowMaterialProperty'
+import { LineTexture } from './LineTextureMaterialProperty'
function init_material() {
StreamWall1()
@@ -9,6 +14,11 @@ function init_material() {
RadarScan()
CustomColorMaterialSource()
CustomImageMaterialSource()
+ FlowLine()
+ PolylineFlow()
+ PolylineFlowMult()
+ FlowDashedLine()
+ LineTexture()
}
-export { init_material }
\ No newline at end of file
+export { init_material }
diff --git a/src/Tools/index.js b/src/Tools/index.js
index 11528d8..3cf0284 100644
--- a/src/Tools/index.js
+++ b/src/Tools/index.js
@@ -10,6 +10,7 @@ import { Proj } from './proj'
import { open as projConvertOpen, close as projConvertClose } from './projConvert'
import { open as projectionConvertOpen, close as projectionConvertClose } from './projectionConvert'
import { setActiveViewer, closeRotateAround, closeViewFollow } from '../Global/global'
+import FlowPictureMaterialProperty from '../Obj/Materail/FlowPictureMaterialProperty'
class Tools {
/**
@@ -513,8 +514,11 @@ class Tools {
return res
}
- getMaterial(color = '#2ab0c2', type = 0) {
+ getMaterial(color = '#2ab0c2', type = 0, entity = null, newParam = {}) {
let material = ''
+
+
+
switch (Number(type)) {
case 1: //虚线
@@ -528,6 +532,55 @@ class Tools {
glowPower: 0.2,
color: Cesium.Color.fromCssColorString(color),
})
+ break
+ case 3: //尾迹光线
+ material = new Cesium.PolylineFlowMaterialProperty({
+ color: color,
+ speed: newParam.rotate ? newParam.speed : 0 - newParam.speed,
+ rotate: newParam.rotate
+ })
+ break
+ case 4: //多尾迹光线
+ material = new Cesium.PolylineFlowMultMaterialProperty({
+ color: color,
+ speed: newParam.rotate ? newParam.speed : 0 - newParam.speed,
+ rotate: newParam.rotate
+ })
+ break
+ case 5: //普通流动虚线
+ material = new Cesium.FlowDashedLineFlowMaterialProperty({
+ color: color,
+ uType: 0,
+ speed: newParam.rotate ? newParam.speed : 0 - newParam.speed,
+ // dashSize: newParam.dashSize,
+ space: newParam.space
+ })
+ console.log(newParam.space)
+ break
+ case 6: //流动虚线2
+ material = new Cesium.FlowDashedLineFlowMaterialProperty({
+ color: color,
+ uType: 1,
+ speed: newParam.rotate ? newParam.speed : 0 - newParam.speed,
+ // dashSize: newParam.dashSize,
+ space: newParam.space
+ })
+ break
+ case 7: //流动箭头1
+ case 8: //流动箭头2
+ case 9: //流动箭头3
+ case 10: //流动箭头4
+ case 11: //流动箭头5
+ case 12: //流动箭头6
+ let param = {
+ color: color,
+ image: this.getSourceRootPath() + `/img/arrow/${type - 6}.png`,
+ space: newParam.space,
+ speed: newParam.speed
+ }
+ param.speed = newParam.rotate ? param.speed : 0 - param.speed
+ this.getFlowTexture(this, param, entity)
+
break
default:
material = Cesium.Color.fromCssColorString(color)
@@ -535,6 +588,81 @@ class Tools {
}
return material
}
+ getFlowTexture(that, options, entity) {
+
+ const canvasEle = document.createElement('canvas');
+ const ctx = canvasEle.getContext('2d')
+ const myImg = new Image()
+ // myImg.src = that.getSourceRootPath() + '/img/arrow/1.png'
+ myImg.src = options.image
+ myImg.onload = function () {
+ options.space = Math.max(0.1, options.space);
+ if (options.speed > 0 || options.speed == 0) {
+ canvasEle.width = myImg.width * (options.space + 1)
+ canvasEle.height = myImg.height
+ ctx.drawImage(myImg, myImg.width * (options.space / 2), 0)
+ } else {
+ ctx.clearRect(0, 0, canvasEle.width, canvasEle.height);
+ canvasEle.width = myImg.width * (options.space + 1)
+ canvasEle.height = myImg.height
+ ctx.save(); // 保存当前状态
+ ctx.translate(canvasEle.width / 2, canvasEle.height / 2); // 移动原点至中心
+ ctx.rotate(Math.PI); // (弧度制)
+ ctx.translate(-canvasEle.width / 2, -canvasEle.height / 2); // 移回原点
+ ctx.drawImage(myImg, myImg.width * (options.space / 2), 0)
+ ctx.restore(); // 恢复状态
+ }
+
+ // let repeat = getRepeat()
+ // }, false)
+ entity.polyline.material = new Cesium.LineTextureMaterialProperty(
+ {
+ color: options.color,
+ // image: options.image,
+ image: canvasEle,
+ speed: options.speed,
+ // repeat: repeat
+ repeat: new Cesium.CallbackProperty(function () {
+ // function getRepeat() {
+ var positionProperty = entity.polyline.positions;
+ var positions = positionProperty.getValue(that.sdk.viewer.clock.currentTime);
+
+ if (!Cesium.defined(positions)) {
+ // return new Cesium.Cartesian2(1.0, 1.0);
+ return 1.0;
+ }
+
+ var distance = 0;
+ for (var i = 0; i < positions.length - 1; ++i) {
+ distance += Cesium.Cartesian3.distance(positions[i], positions[i + 1]);
+ }
+
+ var repeatX = distance / entity.polyline.width.getValue();
+ // 根据地图缩放程度调整repeatX
+ var cameraHeight = that.sdk.viewer.camera.positionCartographic.height;
+ var boundingSphere = new Cesium.BoundingSphere(
+ new Cesium.Cartesian3(-1000000, 0, 0), // 中心点坐标
+ 500000 // 半径(距离)
+ );
+
+ // 获取绘图缓冲区的宽度和高度(通常是屏幕的分辨率)
+ var drawingBufferWidth = that.sdk.viewer.canvas.clientWidth;
+ var drawingBufferHeight = that.sdk.viewer.canvas.clientHeight;
+
+ // 使用 getPixelSize 方法获取包围球在屏幕上的像素大小
+ var groundResolution = that.sdk.viewer.scene.camera.getPixelSize(boundingSphere, drawingBufferWidth, drawingBufferHeight)
+ // repeatX *= groundResolution / cameraHeight / ((myImg.width / myImg.height * 5) + 1);
+ repeatX *= groundResolution / cameraHeight / (options.space * (canvasEle.width / canvasEle.height * 5) + 1);
+ // if (repeatX < 3) {
+ // repeatX = 3
+ // }
+ // return new Cesium.Cartesian2(repeatX, 1.0);
+ return repeatX;
+ })
+ }
+ )
+ }
+ }
/*创建直箭头图片*/
create_arrow1_picture(color) {
@@ -982,8 +1110,8 @@ class Tools {
/**
* @desc cmyk转rbg
- * @param {*} color
- * @returns
+ * @param {*} color
+ * @returns
*/
cmykToRgb(color) {
let { c, m, y, k } = color
diff --git a/static/custom/css/index.css b/static/custom/css/index.css
index 904f430..0933ac5 100644
--- a/static/custom/css/index.css
+++ b/static/custom/css/index.css
@@ -1784,6 +1784,89 @@
.YJ-custom-base-dialog.water-surface>.content>div .row .label {
flex: 0 0 60px;
}
+/* 流光飞线 */
+.YJ-custom-base-dialog.flow-line-surface>.content {
+ width: 586px;
+}
+
+.YJ-custom-base-dialog.flow-line-surface>.content>div .row .label {
+ flex: 0 0 60px;
+}
+
+/* 光照 */
+.YJ-custom-base-dialog.sun-shine-surface>.content {
+ width: 586px;
+}
+
+.YJ-custom-base-dialog.sun-shine-surface>.content>div .row .label {
+ flex: 0 0 60px;
+}
+
+.YJ-custom-base-dialog.sun-shine-surface>.content>div .timeline-container {
+ width: 100%;
+ padding: 20px 0;
+ position: relative;
+}
+
+.YJ-custom-base-dialog.sun-shine-surface>.content>div .timeline {
+ height: 8px;
+ background: #f0f0f0;
+ border-radius: 15px;
+ position: relative;
+ cursor: pointer;
+}
+
+.YJ-custom-base-dialog.sun-shine-surface>.content>div .progress {
+ height: 100%;
+ width: 0;
+ background: rgba(var(--color-sdk-base-rgb), 1);
+ border-radius: 15px;
+ position: relative;
+}
+
+.YJ-custom-base-dialog.sun-shine-surface>.content>div .handle {
+ width: 16px;
+ height: 16px;
+ background: white;
+ /* border: 3px solid #4285f4; */
+ background: rgba(var(--color-sdk-base-rgb), 1);
+ border-radius: 50%;
+ position: absolute;
+ right: -8px;
+ top: 50%;
+ transform: translateY(-50%);
+ cursor: grab;
+}
+
+.YJ-custom-base-dialog.sun-shine-surface>.content>div .time-marks {
+ display: flex;
+ justify-content: space-between;
+ margin-top: 5px;
+}
+
+.YJ-custom-base-dialog.sun-shine-surface>.content>div .time-mark {
+ font-size: 12px;
+ color: #fff;
+}
+
+.YJ-custom-base-dialog.sun-shine-surface>.content>div .controls {
+ margin: 15px 0;
+}
+
+
+.YJ-custom-base-dialog.sun-shine-surface>.content>div .current-time {
+ font-size: 12px;
+ position: absolute;
+ width: 50px;
+ text-align: center;
+ right: -25px;
+ top: -200%;
+ transform: translateY(-50%);
+}
+
+.YJ-custom-base-dialog.sun-shine-surface>.content>div #timePause {
+ margin-top: 10px;
+}
/* 电子围墙 */
.YJ-custom-base-dialog.wall-stereoscopic>.content {
@@ -2515,7 +2598,9 @@
.YJ-custom-base-dialog.polyline>.content {
width: 580px;
}
-
+.YJ-custom-base-dialog.polyline>.content>div #dashTextureDom {
+ display: none;
+}
.YJ-custom-base-dialog.polyline>.content>div .row .col {
margin: 0 10px;
}
@@ -2564,6 +2649,8 @@
max-height: 185px;
}
+
+
/* 贴地图片 */
.YJ-custom-base-dialog.ground-image>.content {
width: 500px;
@@ -2987,4 +3074,4 @@
.YJ-custom-base-dialog.contour>.content .label {
flex: 0 0 56px;
-}
\ No newline at end of file
+}
diff --git a/static/img/arrow/1.png b/static/img/arrow/1.png
new file mode 100644
index 0000000..a959a24
Binary files /dev/null and b/static/img/arrow/1.png differ
diff --git a/static/img/arrow/2.png b/static/img/arrow/2.png
new file mode 100644
index 0000000..1c1985a
Binary files /dev/null and b/static/img/arrow/2.png differ
diff --git a/static/img/arrow/3.png b/static/img/arrow/3.png
new file mode 100644
index 0000000..895389c
Binary files /dev/null and b/static/img/arrow/3.png differ
diff --git a/static/img/arrow/4.png b/static/img/arrow/4.png
new file mode 100644
index 0000000..dcd6705
Binary files /dev/null and b/static/img/arrow/4.png differ
diff --git a/static/img/arrow/5.png b/static/img/arrow/5.png
new file mode 100644
index 0000000..f444e83
Binary files /dev/null and b/static/img/arrow/5.png differ
diff --git a/static/img/arrow/6.png b/static/img/arrow/6.png
new file mode 100644
index 0000000..a1b7f9a
Binary files /dev/null and b/static/img/arrow/6.png differ