| @@ -13,14 +13,17 @@ import { heading, distance } from '@dc-modules/math' | |||
| import TrackViewMode from './TrackViewMode' | |||
| const DEF_OPTS = { | |||
| showPath: false, | |||
| pathWidth: 1, | |||
| pathMaterial: Cesium.Color.ORANGE.withAlpha(0.8), | |||
| pathLeadTime: 1, | |||
| clampToGround: false, | |||
| clampToTileset: false | |||
| } | |||
| const DEF_PATH_STYLE = { | |||
| width: 2, | |||
| material: Cesium.Color.ORANGE, | |||
| clampToGround: true, | |||
| depthFailMaterial: Cesium.Color.ORANGE.withAlpha(0.8) | |||
| } | |||
| class Track { | |||
| constructor(positions, duration, callback, options) { | |||
| this._id = Util.uuid() | |||
| @@ -35,6 +38,16 @@ class Track { | |||
| this._controller = undefined | |||
| this._viewed = false | |||
| this._delegate = new Cesium.Entity() | |||
| this._pathPositions = [] | |||
| this._path = new Cesium.Entity({ | |||
| show: false, | |||
| polyline: { | |||
| positions: new Cesium.CallbackProperty(() => { | |||
| return this._pathPositions | |||
| }) | |||
| } | |||
| }) | |||
| this._positionIndex = 0 | |||
| this._timeLine = [] | |||
| this._startTime = undefined | |||
| @@ -61,7 +74,7 @@ class Track { | |||
| set positions(postions) { | |||
| this._positions = Parse.parsePositions(postions) | |||
| this._resetTimeLine() | |||
| this._resetTimeLine({}) | |||
| return this | |||
| } | |||
| @@ -71,7 +84,7 @@ class Track { | |||
| set duration(duration) { | |||
| this._duration = duration | |||
| this._resetTimeLine() | |||
| this._resetTimeLine({}) | |||
| return this | |||
| } | |||
| @@ -85,7 +98,7 @@ class Track { | |||
| } else { | |||
| this._startTime = startTime | |||
| } | |||
| this._resetTimeLine() | |||
| this._resetTimeLine({}) | |||
| return this | |||
| } | |||
| @@ -121,6 +134,7 @@ class Track { | |||
| } | |||
| this._controller = controller | |||
| this._controller.delegate.add(this._delegate) | |||
| this._controller.delegate.add(this._path) | |||
| !this._startTime && (this._startTime = Cesium.JulianDate.now()) | |||
| this._state = State.ADDED | |||
| } | |||
| @@ -130,10 +144,13 @@ class Track { | |||
| * @private | |||
| */ | |||
| _onRemove() { | |||
| if (this._controller) { | |||
| this._controller.delegate.remove(this._delegate) | |||
| if (!this._controller) { | |||
| return false | |||
| } | |||
| this._controller.delegate.remove(this._delegate) | |||
| this._controller.delegate.remove(this._path) | |||
| this._viewed = false | |||
| this._startTime = undefined | |||
| this._state = State.REMOVED | |||
| } | |||
| @@ -149,13 +166,14 @@ class Track { | |||
| } | |||
| let now = Cesium.JulianDate.now() | |||
| if (Cesium.JulianDate.lessThan(now, this._endTime)) { | |||
| let p = this._sampledPosition.getValue(now) | |||
| this._pathPositions.push(p) | |||
| if (this._options.clampToTileset) { | |||
| this._delegate.position = viewer.scene.clampToHeight( | |||
| this._sampledPosition.getValue(now), | |||
| [this._delegate] | |||
| ) | |||
| this._delegate.position = viewer.scene.clampToHeight(p, [ | |||
| this._delegate | |||
| ]) | |||
| } else { | |||
| this._delegate.position = this._sampledPosition.getValue(now) | |||
| this._delegate.position = p | |||
| } | |||
| let time = this._timeLine[this._positionIndex] | |||
| if (time) { | |||
| @@ -166,10 +184,7 @@ class Track { | |||
| let mat = Cesium.Matrix3.fromQuaternion( | |||
| this._delegate.orientation.getValue(now) | |||
| ) | |||
| let mat4 = Cesium.Matrix4.fromRotationTranslation( | |||
| mat, | |||
| this._sampledPosition.getValue(now) | |||
| ) | |||
| let mat4 = Cesium.Matrix4.fromRotationTranslation(mat, p) | |||
| let hpr = Cesium.Transforms.fixedFrameToHeadingPitchRoll(mat4) | |||
| position.heading = Cesium.Math.toDegrees(hpr.heading) | |||
| position.pitch = Cesium.Math.toDegrees(hpr.pitch) | |||
| @@ -287,6 +302,7 @@ class Track { | |||
| this._sampledPosition | |||
| ) | |||
| this._endTime = this._timeLine[this._timeLine.length - 1] | |||
| this._pathPositions = [] | |||
| } | |||
| /** | |||
| @@ -353,7 +369,17 @@ class Track { | |||
| return this | |||
| } | |||
| setPath() {} | |||
| /** | |||
| * | |||
| * @param visible | |||
| * @param style | |||
| * @returns {Track} | |||
| */ | |||
| setPath(visible, style = {}) { | |||
| this._path.show = !!visible | |||
| Util.merge(this._path.polyline, DEF_PATH_STYLE, style) | |||
| return this | |||
| } | |||
| } | |||
| export default Track | |||