Skip to content

Commit

Permalink
Merge pull request #5159 from jasonbeverage/dashedlines
Browse files Browse the repository at this point in the history
Support for "dashed" polylines
  • Loading branch information
mramato authored Apr 20, 2017
2 parents b9f4481 + 4447fde commit 380e1bf
Show file tree
Hide file tree
Showing 17 changed files with 706 additions and 25 deletions.
19 changes: 19 additions & 0 deletions Apps/Sandcastle/gallery/CZML Polyline.html
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,25 @@
"followSurface" : false,
"width" : 10
}
}, {
"id" : "dashedLine",
"name" : "Blue dashed line",
"polyline" : {
"positions" : {
"cartographicDegrees" : [
-75, 45, 500000,
-125, 45, 500000
]
},
"material" : {
"polylineDash" : {
"color" : {
"rgba" : [0, 255, 255, 255]
}
}
},
"width" : 4
}
}];

var viewer = new Cesium.Viewer('cesiumContainer');
Expand Down
108 changes: 108 additions & 0 deletions Apps/Sandcastle/gallery/Polyline Dash.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no">
<meta name="description" content="Draw dashed polylines.">
<meta name="cesium-sandcastle-labels" content="Geometries">
<title>Cesium Demo</title>
<script type="text/javascript" src="../Sandcastle-header.js"></script>
<script type="text/javascript" src="../../../ThirdParty/requirejs-2.1.20/require.js"></script>
<script type="text/javascript">
require.config({
baseUrl : '../../../Source',
waitSeconds : 60
});
</script>
</head>
<body class="sandcastle-loading" data-sandcastle-bucket="bucket-requirejs.html">
<style>
@import url(../templates/bucket.css);
</style>
<div id="cesiumContainer" class="fullSize"></div>
<div id="loadingOverlay"><h1>Loading...</h1></div>
<div id="toolbar"></div>
<script id="cesium_sandcastle_script">
function startup(Cesium) {
'use strict';
//Sandcastle_Begin
var viewer = new Cesium.Viewer('cesiumContainer');

var redLine = viewer.entities.add({
name : 'Red dashed line',
polyline : {
positions : Cesium.Cartesian3.fromDegreesArrayHeights([-75, 38, 250000,
-125, 38, 250000]),
width : 5,
material : new Cesium.PolylineDashMaterialProperty({
color: Cesium.Color.RED
})
}
});

var blueLine = viewer.entities.add({
name : 'Wide blue dashed line with a gap color',
polyline : {
positions : Cesium.Cartesian3.fromDegreesArrayHeights([-75, 40, 250000,
-125, 40, 250000]),
width : 30,
material : new Cesium.PolylineDashMaterialProperty({
color : Cesium.Color.BLUE,
gapColor: Cesium.Color.YELLOW
})
}
});

var orangeLine = viewer.entities.add({
name : 'Orange dashed line with a short dash length',
polyline : {
positions : Cesium.Cartesian3.fromDegreesArrayHeights([-75, 42, 250000,
-125, 42, 250000]),
width : 5,
material : new Cesium.PolylineDashMaterialProperty({
color : Cesium.Color.ORANGE,
dashLength: 8.0
})
}
});

var cyanLine = viewer.entities.add({
name : 'Cyan dashed line with a dash pattern.',
polyline : {
positions : Cesium.Cartesian3.fromDegreesArrayHeights([-75, 44, 250000,
-125, 44, 250000]),
width : 10,
material : new Cesium.PolylineDashMaterialProperty({
color : Cesium.Color.CYAN,
dashPattern: parseInt("110000001111", 2)
})
}
});

var yellowLine = viewer.entities.add({
name : 'Yellow dashed line with a dash pattern.',
polyline : {
positions : Cesium.Cartesian3.fromDegreesArrayHeights([-75, 46, 250000,
-125, 46, 250000]),
width : 10,
material : new Cesium.PolylineDashMaterialProperty({
color : Cesium.Color.YELLOW,
dashPattern: parseInt("1010101010101010", 2)
})
}
});


viewer.zoomTo(viewer.entities);
//Sandcastle_End
Sandcastle.finishedLoading();
}
if (typeof Cesium !== "undefined") {
startup(Cesium);
} else if (typeof require === "function") {
require(["Cesium"], startup);
}
</script>
</body>
</html>
Binary file added Apps/Sandcastle/gallery/Polyline Dash.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
12 changes: 12 additions & 0 deletions Apps/Sandcastle/gallery/Polyline.html
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,18 @@
}
});

var dashedLine = viewer.entities.add({
name : 'Blue dashed line',
polyline : {
positions : Cesium.Cartesian3.fromDegreesArrayHeights([-75, 45, 500000,
-125, 45, 500000]),
width : 4,
material : new Cesium.PolylineDashMaterialProperty({
color: Cesium.Color.CYAN
})
}
});

viewer.zoomTo(viewer.entities);
//Sandcastle_End
Sandcastle.finishedLoading();
Expand Down
1 change: 1 addition & 0 deletions CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ Change Log
* Upgrade FXAA to version 3.11. [#5200](https://github.com/AnalyticalGraphicsInc/cesium/pull/5200)
* `Scene.pickPosition` now caches results per frame to increase performance [#5117](https://github.com/AnalyticalGraphicsInc/cesium/issues/5117)
* Fix billboards not initially clustering. [#5208](https://github.com/AnalyticalGraphicsInc/cesium/pull/5208)
* Added support for dashed polylines. Added `PolylineDashMaterialProperty` and CZML `polylineDash` properties - `color`, `gapColor`, `dashLength`, `dashPattern` - and similar properties to Cesium's `Material`. [#5159](https://github.com/AnalyticalGraphicsInc/cesium/pull/5159)

### 1.32 - 2017-04-03

Expand Down
11 changes: 11 additions & 0 deletions Source/DataSources/CzmlDataSource.js
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ define([
'./PointGraphics',
'./PolygonGraphics',
'./PolylineArrowMaterialProperty',
'./PolylineDashMaterialProperty',
'./PolylineGlowMaterialProperty',
'./PolylineGraphics',
'./PolylineOutlineMaterialProperty',
Expand Down Expand Up @@ -152,6 +153,7 @@ define([
PointGraphics,
PolygonGraphics,
PolylineArrowMaterialProperty,
PolylineDashMaterialProperty,
PolylineGlowMaterialProperty,
PolylineGraphics,
PolylineOutlineMaterialProperty,
Expand Down Expand Up @@ -1009,6 +1011,15 @@ define([
}
materialData = packetData.polylineArrow;
processPacketData(Color, existingMaterial, 'color', materialData.color, undefined, undefined, entityCollection);
} else if (defined(packetData.polylineDash)) {
if (!(existingMaterial instanceof PolylineDashMaterialProperty)) {
existingMaterial = new PolylineDashMaterialProperty();
}
materialData = packetData.polylineDash;
processPacketData(Color, existingMaterial, 'color', materialData.color, undefined, undefined, entityCollection);
processPacketData(Color, existingMaterial, 'gapColor', materialData.gapColor, undefined, undefined, entityCollection);
processPacketData(Number, existingMaterial, 'dashLength', materialData.dashLength, undefined, sourceUri, entityCollection);
processPacketData(Number, existingMaterial, 'dashPattern', materialData.dashPattern, undefined, sourceUri, entityCollection);
}

if (defined(existingInterval)) {
Expand Down
156 changes: 156 additions & 0 deletions Source/DataSources/PolylineDashMaterialProperty.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
/*global define*/
define([
'../Core/Color',
'../Core/defaultValue',
'../Core/defined',
'../Core/defineProperties',
'../Core/Event',
'./createPropertyDescriptor',
'./Property'
], function(
Color,
defaultValue,
defined,
defineProperties,
Event,
createPropertyDescriptor,
Property) {
'use strict';

var defaultColor = Color.WHITE;
var defaultGapColor = Color.TRANSPARENT;
var defaultDashLength = 16.0;
var defaultDashPattern = 255.0;

/**
* A {@link MaterialProperty} that maps to polyline dash {@link Material} uniforms.
* @alias PolylineDashMaterialProperty
* @constructor
*
* @param {Object} [options] Object with the following properties:
* @param {Property} [options.color=Color.WHITE] A Property specifying the {@link Color} of the line.
* @param {Property} [options.gapColor=Color.TRANSPARENT] A Property specifying the {@link Color} of the gaps in the line.
* @param {Property} [options.dashLength=16.0] A numeric Property specifying the length of the dash pattern in pixel.s
* @param {Property} [options.dashPattern=255.0] A numeric Property specifying a 16 bit pattern for the dash
*/
function PolylineDashMaterialProperty(options) {
options = defaultValue(options, defaultValue.EMPTY_OBJECT);

this._definitionChanged = new Event();
this._color = undefined;
this._colorSubscription = undefined;
this._gapColor = undefined;
this._gapColorSubscription = undefined;
this._dashLength = undefined;
this._dashLengthSubscription = undefined;
this._dashPattern = undefined;
this._dashPatternSubscription = undefined;

this.color = options.color;
this.gapColor = options.gapColor;
this.dashLength = options.dashLength;
this.dashPattern = options.dashPattern;
}

defineProperties(PolylineDashMaterialProperty.prototype, {
/**
* Gets a value indicating if this property is constant. A property is considered
* constant if getValue always returns the same result for the current definition.
* @memberof PolylineDashMaterialProperty.prototype
* @type {Boolean}
* @readonly
*/
isConstant : {
get : function() {
return (Property.isConstant(this._color) &&
Property.isConstant(this._gapColor) &&
Property.isConstant(this._dashLength) &&
Property.isConstant(this._dashPattern));
}
},
/**
* Gets the event that is raised whenever the definition of this property changes.
* The definition is considered to have changed if a call to getValue would return
* a different result for the same time.
* @memberof PolylineDashMaterialProperty.prototype
* @type {Event}
* @readonly
*/
definitionChanged : {
get : function() {
return this._definitionChanged;
}
},
/**
* Gets or sets the Property specifying the {@link Color} of the line.
* @memberof PolylineDashMaterialProperty.prototype
* @type {Property}
*/
color : createPropertyDescriptor('color'),
/**
* Gets or sets the Property specifying the {@link Color} of the gaps in the line.
* @memberof PolylineDashMaterialProperty.prototype
* @type {Property}
*/
gapColor : createPropertyDescriptor('gapColor'),
/**
* Gets or sets the numeric Property specifying the length of a dash cycle
* @memberof PolylineDashMaterialProperty.prototype
* @type {Property}
*/
dashLength : createPropertyDescriptor('dashLength'),
/**
* Gets or sets the numeric Property specifying a dash pattern
* @memberof PolylineDashMaterialProperty.prototype
* @type {Property}
*/
dashPattern : createPropertyDescriptor('dashPattern')
});

/**
* Gets the {@link Material} type at the provided time.
*
* @param {JulianDate} time The time for which to retrieve the type.
* @returns {String} The type of material.
*/
PolylineDashMaterialProperty.prototype.getType = function(time) {
return 'PolylineDash';
};

/**
* Gets the value of the property at the provided time.
*
* @param {JulianDate} time The time for which to retrieve the value.
* @param {Object} [result] The object to store the value into, if omitted, a new instance is created and returned.
* @returns {Object} The modified result parameter or a new instance if the result parameter was not supplied.
*/
PolylineDashMaterialProperty.prototype.getValue = function(time, result) {
if (!defined(result)) {
result = {};
}
result.color = Property.getValueOrClonedDefault(this._color, time, defaultColor, result.color);
result.gapColor = Property.getValueOrClonedDefault(this._gapColor, time, defaultGapColor, result.gapColor);
result.dashLength = Property.getValueOrDefault(this._dashLength, time, defaultDashLength, result.dashLength);
result.dashPattern = Property.getValueOrDefault(this._dashPattern, time, defaultDashPattern, result.dashPattern);
return result;
};

/**
* Compares this property to the provided property and returns
* <code>true</code> if they are equal, <code>false</code> otherwise.
*
* @param {Property} [other] The other property.
* @returns {Boolean} <code>true</code> if left and right are equal, <code>false</code> otherwise.
*/
PolylineDashMaterialProperty.prototype.equals = function(other) {
return this === other || //
(other instanceof PolylineDashMaterialProperty &&
Property.equals(this._color, other._color) &&
Property.equals(this._gapColor, other._gapColor) &&
Property.equals(this._dashLength, other._dashLength) &&
Property.equals(this._dashPattern, other._dashPattern)
);
};

return PolylineDashMaterialProperty;
});
Loading

0 comments on commit 380e1bf

Please sign in to comment.