cesium 0.21 → 0.21.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/app/assets/javascripts/Assets/Textures/moonSmall.jpg +0 -0
- data/app/assets/javascripts/Cesium.js +10 -1
- data/app/assets/javascripts/Core/Cartesian2.js +28 -0
- data/app/assets/javascripts/Core/Cartesian3.js +28 -0
- data/app/assets/javascripts/Core/Cartesian4.js +28 -0
- data/app/assets/javascripts/Core/CatmullRomSpline.js +3 -3
- data/app/assets/javascripts/Core/Clock.js +7 -7
- data/app/assets/javascripts/Core/Color.js +1 -1
- data/app/assets/javascripts/Core/ComponentDatatype.js +11 -7
- data/app/assets/javascripts/Core/CorridorGeometryLibrary.js +23 -29
- data/app/assets/javascripts/Core/Ellipsoid.js +6 -0
- data/app/assets/javascripts/Core/EllipsoidTangentPlane.js +5 -4
- data/app/assets/javascripts/Core/Event.js +2 -1
- data/app/assets/javascripts/Core/ExtentGeometry.js +1 -1
- data/app/assets/javascripts/Core/ExtentOutlineGeometry.js +1 -1
- data/app/assets/javascripts/Core/GeometryAttributes.js +1 -1
- data/app/assets/javascripts/Core/GeometryInstance.js +2 -2
- data/app/assets/javascripts/Core/GeometryPipeline.js +10 -7
- data/app/assets/javascripts/Core/HermiteSpline.js +1 -1
- data/app/assets/javascripts/Core/Iau2000Orientation.js +132 -0
- data/app/assets/javascripts/Core/IauOrientationAxes.js +98 -0
- data/app/assets/javascripts/Core/IauOrientationParameters.js +48 -0
- data/app/assets/javascripts/Core/IntersectionTests.js +5 -5
- data/app/assets/javascripts/Core/JulianDate.js +27 -5
- data/app/assets/javascripts/Core/Math.js +9 -0
- data/app/assets/javascripts/Core/Matrix2.js +1 -142
- data/app/assets/javascripts/Core/Matrix3.js +168 -153
- data/app/assets/javascripts/Core/Matrix4.js +0 -249
- data/app/assets/javascripts/Core/NearFarScalar.js +13 -0
- data/app/assets/javascripts/Core/PolygonGeometry.js +1 -1
- data/app/assets/javascripts/Core/PolygonOutlineGeometry.js +2 -2
- data/app/assets/javascripts/Core/PolygonPipeline.js +2 -2
- data/app/assets/javascripts/Core/PolylinePipeline.js +7 -3
- data/app/assets/javascripts/Core/PolylineVolumeGeometry.js +239 -0
- data/app/assets/javascripts/Core/PolylineVolumeGeometryLibrary.js +404 -0
- data/app/assets/javascripts/Core/PolylineVolumeOutlineGeometry.js +154 -0
- data/app/assets/javascripts/Core/Quaternion.js +37 -10
- data/app/assets/javascripts/Core/Shapes.js +26 -2
- data/app/assets/javascripts/Core/Simon1994PlanetaryPositions.js +3 -3
- data/app/assets/javascripts/Core/TimeInterval.js +28 -17
- data/app/assets/javascripts/Core/TimeIntervalCollection.js +30 -0
- data/app/assets/javascripts/Core/Transforms.js +5 -5
- data/app/assets/javascripts/Core/WallGeometryLibrary.js +2 -2
- data/app/assets/javascripts/Core/getFilenameFromUri.js +37 -0
- data/app/assets/javascripts/DynamicScene/ColorMaterialProperty.js +2 -2
- data/app/assets/javascripts/DynamicScene/CzmlDataSource.js +96 -18
- data/app/assets/javascripts/DynamicScene/DataSource.js +8 -0
- data/app/assets/javascripts/DynamicScene/DynamicBillboard.js +15 -3
- data/app/assets/javascripts/DynamicScene/DynamicBillboardVisualizer.js +6 -1
- data/app/assets/javascripts/DynamicScene/DynamicConeVisualizerUsingCustomSensor.js +1 -1
- data/app/assets/javascripts/DynamicScene/DynamicLabel.js +12 -1
- data/app/assets/javascripts/DynamicScene/DynamicLabelVisualizer.js +5 -0
- data/app/assets/javascripts/DynamicScene/DynamicObject.js +44 -17
- data/app/assets/javascripts/DynamicScene/DynamicObjectView.js +3 -3
- data/app/assets/javascripts/DynamicScene/DynamicPoint.js +12 -1
- data/app/assets/javascripts/DynamicScene/DynamicPointVisualizer.js +11 -2
- data/app/assets/javascripts/DynamicScene/DynamicPolyline.js +10 -30
- data/app/assets/javascripts/DynamicScene/DynamicPolylineVisualizer.js +5 -20
- data/app/assets/javascripts/DynamicScene/GeoJsonDataSource.js +26 -8
- data/app/assets/javascripts/DynamicScene/GridMaterialProperty.js +2 -2
- data/app/assets/javascripts/DynamicScene/ImageMaterialProperty.js +2 -2
- data/app/assets/javascripts/DynamicScene/PolylineOutlineMaterialProperty.js +66 -0
- data/app/assets/javascripts/DynamicScene/PositionProperty.js +3 -3
- data/app/assets/javascripts/DynamicScene/ReferenceProperty.js +1 -1
- data/app/assets/javascripts/DynamicScene/SampledProperty.js +14 -8
- data/app/assets/javascripts/Renderer/AutomaticUniforms.js +4 -3
- data/app/assets/javascripts/Renderer/Context.js +16 -2
- data/app/assets/javascripts/Renderer/UniformState.js +14 -14
- data/app/assets/javascripts/Scene/Billboard.js +102 -26
- data/app/assets/javascripts/Scene/BillboardCollection.js +69 -16
- data/app/assets/javascripts/Scene/Camera.js +7 -7
- data/app/assets/javascripts/Scene/CameraController.js +23 -12
- data/app/assets/javascripts/Scene/CameraFlightPath.js +11 -11
- data/app/assets/javascripts/Scene/CentralBodySurface.js +1 -1
- data/app/assets/javascripts/Scene/CustomSensorVolume.js +17 -2
- data/app/assets/javascripts/Scene/EllipsoidPrimitive.js +79 -24
- data/app/assets/javascripts/Scene/ExtentPrimitive.js +17 -1
- data/app/assets/javascripts/Scene/Label.js +94 -18
- data/app/assets/javascripts/Scene/LabelCollection.js +6 -2
- data/app/assets/javascripts/Scene/Moon.js +150 -0
- data/app/assets/javascripts/Scene/Polygon.js +18 -1
- data/app/assets/javascripts/Scene/Polyline.js +32 -13
- data/app/assets/javascripts/Scene/PolylineCollection.js +7 -6
- data/app/assets/javascripts/Scene/Primitive.js +2 -2
- data/app/assets/javascripts/Scene/RectangularPyramidSensorVolume.js +12 -0
- data/app/assets/javascripts/Scene/Scene.js +122 -14
- data/app/assets/javascripts/Scene/SceneTransforms.js +2 -2
- data/app/assets/javascripts/Scene/SceneTransitioner.js +4 -4
- data/app/assets/javascripts/Scene/ScreenSpaceCameraController.js +1 -1
- data/app/assets/javascripts/Scene/SkyBox.js +53 -48
- data/app/assets/javascripts/Scene/TileMapServiceImageryProvider.js +2 -2
- data/app/assets/javascripts/Shaders/BillboardCollectionVS.glsl +36 -14
- data/app/assets/javascripts/Shaders/BillboardCollectionVS.js +27 -9
- data/app/assets/javascripts/Shaders/Builtin/Functions/phong.glsl +13 -0
- data/app/assets/javascripts/Shaders/Builtin/Functions/phong.js +10 -0
- data/app/assets/javascripts/Shaders/EllipsoidFS.glsl +24 -0
- data/app/assets/javascripts/Shaders/EllipsoidFS.js +21 -1
- data/app/assets/javascripts/Widgets/CesiumWidget/CesiumWidget.js +30 -9
- data/app/assets/javascripts/Widgets/HomeButton/HomeButtonViewModel.js +6 -5
- data/app/assets/javascripts/Widgets/Viewer/Viewer.js +13 -0
- data/app/assets/javascripts/Widgets/Viewer/viewerDynamicObjectMixin.js +46 -4
- data/app/assets/javascripts/Workers/cesiumWorkerBootstrapper.js +16 -8
- data/app/assets/javascripts/Workers/createPolylineVolumeGeometry.js +23 -0
- data/app/assets/javascripts/Workers/createPolylineVolumeOutlineGeometry.js +23 -0
- data/lib/cesium/version.rb +1 -1
- metadata +15 -5
- data/test/dummy/tmp/pids/server.pid +0 -1
|
@@ -0,0 +1,404 @@
|
|
|
1
|
+
/*global define*/
|
|
2
|
+
define(['Core/defined', 'Core/Cartesian2', 'Core/Cartesian3', 'Core/Cartesian4', 'Core/Cartographic', 'Core/CornerType', 'Core/DeveloperError', 'Core/EllipsoidTangentPlane', 'Core/PolylinePipeline', 'Core/Matrix3', 'Core/Matrix4', 'Core/Quaternion', 'Core/Transforms', 'Core/Math'], function(
|
|
3
|
+
defined,
|
|
4
|
+
Cartesian2,
|
|
5
|
+
Cartesian3,
|
|
6
|
+
Cartesian4,
|
|
7
|
+
Cartographic,
|
|
8
|
+
CornerType,
|
|
9
|
+
DeveloperError,
|
|
10
|
+
EllipsoidTangentPlane,
|
|
11
|
+
PolylinePipeline,
|
|
12
|
+
Matrix3,
|
|
13
|
+
Matrix4,
|
|
14
|
+
Quaternion,
|
|
15
|
+
Transforms,
|
|
16
|
+
CesiumMath) {
|
|
17
|
+
"use strict";
|
|
18
|
+
|
|
19
|
+
var scratch2Array = [new Cartesian3(), new Cartesian3()];
|
|
20
|
+
var scratchCartesian1 = new Cartesian3();
|
|
21
|
+
var scratchCartesian2 = new Cartesian3();
|
|
22
|
+
var scratchCartesian3 = new Cartesian3();
|
|
23
|
+
var scratchCartesian4 = new Cartesian3();
|
|
24
|
+
var scratchCartesian5 = new Cartesian3();
|
|
25
|
+
var scratchCartesian6 = new Cartesian3();
|
|
26
|
+
var scratchCartesian7 = new Cartesian3();
|
|
27
|
+
var scratchCartesian8 = new Cartesian3();
|
|
28
|
+
var scratchCartesian9 = new Cartesian3();
|
|
29
|
+
|
|
30
|
+
var scratch1 = new Cartesian3();
|
|
31
|
+
var scratch2 = new Cartesian3();
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* @private
|
|
35
|
+
*/
|
|
36
|
+
var PolylineVolumeGeometryLibrary = {};
|
|
37
|
+
|
|
38
|
+
var cartographic = new Cartographic();
|
|
39
|
+
function scaleToSurface(positions, ellipsoid) {
|
|
40
|
+
var heights = new Array(positions.length);
|
|
41
|
+
for ( var i = 0; i < positions.length; i++) {
|
|
42
|
+
var pos = positions[i];
|
|
43
|
+
cartographic = ellipsoid.cartesianToCartographic(pos, cartographic);
|
|
44
|
+
heights[i] = cartographic.height;
|
|
45
|
+
positions[i] = ellipsoid.scaleToGeodeticSurface(pos, pos);
|
|
46
|
+
}
|
|
47
|
+
return heights;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function subdivideHeights(points, h0, h1, granularity) {
|
|
51
|
+
var p0 = points[0];
|
|
52
|
+
var p1 = points[1];
|
|
53
|
+
var angleBetween = Cartesian3.angleBetween(p0, p1);
|
|
54
|
+
var numPoints = Math.ceil(angleBetween / granularity);
|
|
55
|
+
var heights = new Array(numPoints);
|
|
56
|
+
var i;
|
|
57
|
+
if (h0 === h1) {
|
|
58
|
+
for (i = 0; i < numPoints; i++) {
|
|
59
|
+
heights[i] = h0;
|
|
60
|
+
}
|
|
61
|
+
heights.push(h1);
|
|
62
|
+
return heights;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
var dHeight = h1 - h0;
|
|
66
|
+
var heightPerVertex = dHeight / (numPoints);
|
|
67
|
+
|
|
68
|
+
for (i = 1; i < numPoints; i++) {
|
|
69
|
+
var h = h0 + i * heightPerVertex;
|
|
70
|
+
heights[i] = h;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
heights[0] = h0;
|
|
74
|
+
heights.push(h1);
|
|
75
|
+
return heights;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function computeRotationAngle(start, end, position, ellipsoid) {
|
|
79
|
+
var tangentPlane = new EllipsoidTangentPlane(position, ellipsoid);
|
|
80
|
+
var next = tangentPlane.projectPointOntoPlane(Cartesian3.add(position, start, nextScratch), nextScratch);
|
|
81
|
+
var prev = tangentPlane.projectPointOntoPlane(Cartesian3.add(position, end, prevScratch), prevScratch);
|
|
82
|
+
var angle = Cartesian2.angleBetween(next, prev);
|
|
83
|
+
|
|
84
|
+
return (prev.x * next.y - prev.y * next.x >= 0.0) ? -angle : angle;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
var negativeX = new Cartesian4(-1, 0, 0, 0);
|
|
88
|
+
var transform = new Matrix4();
|
|
89
|
+
var translation = new Matrix4();
|
|
90
|
+
var rotationZ = new Matrix3();
|
|
91
|
+
var scaleMatrix = Matrix3.IDENTITY.clone();
|
|
92
|
+
var westScratch = new Cartesian4();
|
|
93
|
+
var finalPosScratch = new Cartesian4();
|
|
94
|
+
var heightCartesian = new Cartesian3();
|
|
95
|
+
function addPosition(center, left, shape, finalPositions, ellipsoid, height, xScalar, repeat) {
|
|
96
|
+
var west = westScratch;
|
|
97
|
+
var finalPosition = finalPosScratch;
|
|
98
|
+
transform = Transforms.eastNorthUpToFixedFrame(center, ellipsoid, transform);
|
|
99
|
+
|
|
100
|
+
west = Matrix4.multiplyByVector(transform, negativeX, west);
|
|
101
|
+
west = Cartesian3.normalize(west, west);
|
|
102
|
+
var angle = computeRotationAngle(west, left, center, ellipsoid);
|
|
103
|
+
rotationZ = Matrix3.fromRotationZ(angle, rotationZ);
|
|
104
|
+
|
|
105
|
+
heightCartesian.z = height;
|
|
106
|
+
transform = Matrix4.multiply(transform, Matrix4.fromRotationTranslation(rotationZ, heightCartesian, translation), transform);
|
|
107
|
+
var scale = scaleMatrix;
|
|
108
|
+
scale[0] = xScalar;
|
|
109
|
+
|
|
110
|
+
for ( var j = 0; j < repeat; j++) {
|
|
111
|
+
for ( var i = 0; i < shape.length; i += 3) {
|
|
112
|
+
finalPosition = Cartesian3.fromArray(shape, i, finalPosition);
|
|
113
|
+
finalPosition = Matrix3.multiplyByVector(scale, finalPosition, finalPosition);
|
|
114
|
+
finalPosition = Matrix4.multiplyByPoint(transform, finalPosition, finalPosition);
|
|
115
|
+
finalPositions.push(finalPosition.x, finalPosition.y, finalPosition.z);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
return finalPositions;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
var centerScratch = new Cartesian3();
|
|
123
|
+
function addPositions(centers, left, shape, finalPositions, ellipsoid, heights, xScalar) {
|
|
124
|
+
for ( var i = 0; i < centers.length; i += 3) {
|
|
125
|
+
var center = Cartesian3.fromArray(centers, i, centerScratch);
|
|
126
|
+
finalPositions = addPosition(center, left, shape, finalPositions, ellipsoid, heights[i / 3], xScalar, 1);
|
|
127
|
+
}
|
|
128
|
+
return finalPositions;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
function convertShapeTo3DDuplicate(shape2D, boundingRectangle) { //orientate 2D shape to XZ plane center at (0, 0, 0), duplicate points
|
|
132
|
+
var length = shape2D.length;
|
|
133
|
+
var shape = new Array(length * 6);
|
|
134
|
+
var index = 0;
|
|
135
|
+
var xOffset = boundingRectangle.x + boundingRectangle.width / 2;
|
|
136
|
+
var yOffset = boundingRectangle.y + boundingRectangle.height / 2;
|
|
137
|
+
|
|
138
|
+
var point = shape2D[0];
|
|
139
|
+
shape[index++] = point.x - xOffset;
|
|
140
|
+
shape[index++] = 0.0;
|
|
141
|
+
shape[index++] = point.y - yOffset;
|
|
142
|
+
for ( var i = 1; i < length; i++) {
|
|
143
|
+
point = shape2D[i];
|
|
144
|
+
var x = point.x - xOffset;
|
|
145
|
+
var z = point.y - yOffset;
|
|
146
|
+
shape[index++] = x;
|
|
147
|
+
shape[index++] = 0.0;
|
|
148
|
+
shape[index++] = z;
|
|
149
|
+
|
|
150
|
+
shape[index++] = x;
|
|
151
|
+
shape[index++] = 0.0;
|
|
152
|
+
shape[index++] = z;
|
|
153
|
+
}
|
|
154
|
+
point = shape2D[0];
|
|
155
|
+
shape[index++] = point.x - xOffset;
|
|
156
|
+
shape[index++] = 0.0;
|
|
157
|
+
shape[index++] = point.y - yOffset;
|
|
158
|
+
|
|
159
|
+
return shape;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
function convertShapeTo3D(shape2D, boundingRectangle) { //orientate 2D shape to XZ plane center at (0, 0, 0)
|
|
163
|
+
var length = shape2D.length;
|
|
164
|
+
var shape = new Array(length * 3);
|
|
165
|
+
var index = 0;
|
|
166
|
+
var xOffset = boundingRectangle.x + boundingRectangle.width / 2;
|
|
167
|
+
var yOffset = boundingRectangle.y + boundingRectangle.height / 2;
|
|
168
|
+
|
|
169
|
+
for ( var i = 0; i < length; i++) {
|
|
170
|
+
shape[index++] = shape2D[i].x - xOffset;
|
|
171
|
+
shape[index++] = 0;
|
|
172
|
+
shape[index++] = shape2D[i].y - yOffset;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
return shape;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
var quaterion = new Quaternion();
|
|
179
|
+
var startPointScratch = new Cartesian3();
|
|
180
|
+
var rotMatrix = new Matrix3();
|
|
181
|
+
function computeRoundCorner(pivot, startPoint, endPoint, cornerType, leftIsOutside, ellipsoid, finalPositions, shape, height, duplicatePoints) {
|
|
182
|
+
var angle = Cartesian3.angleBetween(Cartesian3.subtract(startPoint, pivot, scratch1), Cartesian3.subtract(endPoint, pivot, scratch2));
|
|
183
|
+
var granularity = (cornerType.value === CornerType.BEVELED.value) ? 0 : Math.ceil(angle / CesiumMath.toRadians(5));
|
|
184
|
+
|
|
185
|
+
var m;
|
|
186
|
+
if (leftIsOutside) {
|
|
187
|
+
m = Matrix3.fromQuaternion(Quaternion.fromAxisAngle(Cartesian3.negate(pivot, scratch1), angle / (granularity + 1), quaterion), rotMatrix);
|
|
188
|
+
} else {
|
|
189
|
+
m = Matrix3.fromQuaternion(Quaternion.fromAxisAngle(pivot, angle / (granularity + 1), quaterion), rotMatrix);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
var left;
|
|
193
|
+
var surfacePoint;
|
|
194
|
+
startPoint = Cartesian3.clone(startPoint, startPointScratch);
|
|
195
|
+
if (granularity > 0) {
|
|
196
|
+
var repeat = duplicatePoints ? 2 : 1;
|
|
197
|
+
for ( var i = 0; i < granularity; i++) {
|
|
198
|
+
startPoint = Matrix3.multiplyByVector(m, startPoint, startPoint);
|
|
199
|
+
left = Cartesian3.subtract(startPoint, pivot, scratch1);
|
|
200
|
+
left = Cartesian3.normalize(left, left);
|
|
201
|
+
if (!leftIsOutside) {
|
|
202
|
+
left = Cartesian3.negate(left, left);
|
|
203
|
+
}
|
|
204
|
+
surfacePoint = ellipsoid.scaleToGeodeticSurface(startPoint, scratch2);
|
|
205
|
+
finalPositions = addPosition(surfacePoint, left, shape, finalPositions, ellipsoid, height, 1, repeat);
|
|
206
|
+
}
|
|
207
|
+
} else {
|
|
208
|
+
left = Cartesian3.subtract(startPoint, pivot, scratch1);
|
|
209
|
+
left = Cartesian3.normalize(left, left);
|
|
210
|
+
if (!leftIsOutside) {
|
|
211
|
+
left = Cartesian3.negate(left, left);
|
|
212
|
+
}
|
|
213
|
+
surfacePoint = ellipsoid.scaleToGeodeticSurface(startPoint, scratch2);
|
|
214
|
+
finalPositions = addPosition(surfacePoint, left, shape, finalPositions, ellipsoid, height, 1, 1);
|
|
215
|
+
|
|
216
|
+
endPoint = Cartesian3.clone(endPoint, startPointScratch);
|
|
217
|
+
left = Cartesian3.subtract(endPoint, pivot, scratch1);
|
|
218
|
+
left = Cartesian3.normalize(left, left);
|
|
219
|
+
if (!leftIsOutside) {
|
|
220
|
+
left = Cartesian3.negate(left, left);
|
|
221
|
+
}
|
|
222
|
+
surfacePoint = ellipsoid.scaleToGeodeticSurface(endPoint, scratch2);
|
|
223
|
+
finalPositions = addPosition(surfacePoint, left, shape, finalPositions, ellipsoid, height, 1, 1);
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
return finalPositions;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
PolylineVolumeGeometryLibrary.removeDuplicatesFromShape = function(shapePositions) {
|
|
230
|
+
var length = shapePositions.length;
|
|
231
|
+
var cleanedPositions = [];
|
|
232
|
+
for ( var i0 = length - 1, i1 = 0; i1 < length; i0 = i1++) {
|
|
233
|
+
var v0 = shapePositions[i0];
|
|
234
|
+
var v1 = shapePositions[i1];
|
|
235
|
+
|
|
236
|
+
if (!Cartesian2.equals(v0, v1)) {
|
|
237
|
+
cleanedPositions.push(v1); // Shallow copy!
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
return cleanedPositions;
|
|
242
|
+
};
|
|
243
|
+
|
|
244
|
+
var nextScratch = new Cartesian3();
|
|
245
|
+
var prevScratch = new Cartesian3();
|
|
246
|
+
PolylineVolumeGeometryLibrary.angleIsGreaterThanPi = function(forward, backward, position, ellipsoid) {
|
|
247
|
+
var tangentPlane = new EllipsoidTangentPlane(position, ellipsoid);
|
|
248
|
+
var next = tangentPlane.projectPointOntoPlane(Cartesian3.add(position, forward, nextScratch), nextScratch);
|
|
249
|
+
var prev = tangentPlane.projectPointOntoPlane(Cartesian3.add(position, backward, prevScratch), prevScratch);
|
|
250
|
+
|
|
251
|
+
return ((prev.x * next.y) - (prev.y * next.x)) >= 0.0;
|
|
252
|
+
};
|
|
253
|
+
|
|
254
|
+
function latLonEquals(c0, c1) {
|
|
255
|
+
return ((CesiumMath.equalsEpsilon(c0.latitude, c1.latitude, CesiumMath.EPSILON6)) && (CesiumMath.equalsEpsilon(c0.longitude, c1.longitude, CesiumMath.EPSILON6)));
|
|
256
|
+
}
|
|
257
|
+
var carto0 = new Cartographic();
|
|
258
|
+
var carto1 = new Cartographic();
|
|
259
|
+
PolylineVolumeGeometryLibrary.removeDuplicatesFromPositions = function(positions, ellipsoid) {
|
|
260
|
+
var length = positions.length;
|
|
261
|
+
if (length < 2) {
|
|
262
|
+
return positions.slice(0);
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
var cleanedPositions = [];
|
|
266
|
+
cleanedPositions.push(positions[0]);
|
|
267
|
+
|
|
268
|
+
for (var i = 1; i < length; ++i) {
|
|
269
|
+
var v0 = positions[i - 1];
|
|
270
|
+
var v1 = positions[i];
|
|
271
|
+
var c0 = ellipsoid.cartesianToCartographic(v0, carto0);
|
|
272
|
+
var c1 = ellipsoid.cartesianToCartographic(v1, carto1);
|
|
273
|
+
|
|
274
|
+
if (!latLonEquals(c0, c1)) {
|
|
275
|
+
cleanedPositions.push(v1); // Shallow copy!
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
return cleanedPositions;
|
|
280
|
+
};
|
|
281
|
+
|
|
282
|
+
PolylineVolumeGeometryLibrary.computePositions = function(positions, shape2D, boundingRectangle, geometry, duplicatePoints) {
|
|
283
|
+
var ellipsoid = geometry._ellipsoid;
|
|
284
|
+
var heights = scaleToSurface(positions, ellipsoid);
|
|
285
|
+
var granularity = geometry._granularity;
|
|
286
|
+
var cornerType = geometry._cornerType;
|
|
287
|
+
var shapeForSides = duplicatePoints ? convertShapeTo3DDuplicate(shape2D, boundingRectangle) : convertShapeTo3D(shape2D, boundingRectangle);
|
|
288
|
+
var shapeForEnds = duplicatePoints ? convertShapeTo3D(shape2D, boundingRectangle) : undefined;
|
|
289
|
+
var heightOffset = boundingRectangle.height / 2;
|
|
290
|
+
var width = boundingRectangle.width / 2;
|
|
291
|
+
var length = positions.length;
|
|
292
|
+
var finalPositions = [];
|
|
293
|
+
var ends = duplicatePoints ? [] : undefined;
|
|
294
|
+
|
|
295
|
+
var forward = scratchCartesian1;
|
|
296
|
+
var backward = scratchCartesian2;
|
|
297
|
+
var cornerDirection = scratchCartesian3;
|
|
298
|
+
var surfaceNormal = scratchCartesian4;
|
|
299
|
+
var pivot = scratchCartesian5;
|
|
300
|
+
var start = scratchCartesian6;
|
|
301
|
+
var end = scratchCartesian7;
|
|
302
|
+
var left = scratchCartesian8;
|
|
303
|
+
var previousPosition = scratchCartesian9;
|
|
304
|
+
|
|
305
|
+
var position = positions[0];
|
|
306
|
+
var nextPosition = positions[1];
|
|
307
|
+
surfaceNormal = ellipsoid.geodeticSurfaceNormal(position, surfaceNormal);
|
|
308
|
+
forward = Cartesian3.subtract(nextPosition, position, forward);
|
|
309
|
+
forward = Cartesian3.normalize(forward, forward);
|
|
310
|
+
left = Cartesian3.cross(surfaceNormal, forward, left);
|
|
311
|
+
left = Cartesian3.normalize(left, left);
|
|
312
|
+
var h0 = heights[0];
|
|
313
|
+
var h1 = heights[1];
|
|
314
|
+
if (duplicatePoints) {
|
|
315
|
+
ends = addPosition(position, left, shapeForEnds, ends, ellipsoid, h0 + heightOffset, 1, 1);
|
|
316
|
+
}
|
|
317
|
+
previousPosition = Cartesian3.clone(position, previousPosition);
|
|
318
|
+
position = nextPosition;
|
|
319
|
+
backward = Cartesian3.negate(forward, backward);
|
|
320
|
+
var subdividedHeights;
|
|
321
|
+
var subdividedPositions;
|
|
322
|
+
for ( var i = 1; i < length - 1; i++) {
|
|
323
|
+
var repeat = duplicatePoints ? 2 : 1;
|
|
324
|
+
nextPosition = positions[i + 1];
|
|
325
|
+
forward = Cartesian3.subtract(nextPosition, position, forward);
|
|
326
|
+
forward = Cartesian3.normalize(forward, forward);
|
|
327
|
+
cornerDirection = Cartesian3.add(forward, backward, cornerDirection);
|
|
328
|
+
cornerDirection = Cartesian3.normalize(cornerDirection, cornerDirection);
|
|
329
|
+
surfaceNormal = ellipsoid.geodeticSurfaceNormal(position, surfaceNormal);
|
|
330
|
+
var doCorner = !Cartesian3.equalsEpsilon(Cartesian3.negate(cornerDirection, scratch1), surfaceNormal, CesiumMath.EPSILON2);
|
|
331
|
+
if (doCorner) {
|
|
332
|
+
cornerDirection = Cartesian3.cross(cornerDirection, surfaceNormal, cornerDirection);
|
|
333
|
+
cornerDirection = Cartesian3.cross(surfaceNormal, cornerDirection, cornerDirection);
|
|
334
|
+
cornerDirection = Cartesian3.normalize(cornerDirection, cornerDirection);
|
|
335
|
+
var scalar = 1 / Math.max(0.25, (Cartesian3.magnitude(Cartesian3.cross(cornerDirection, backward, scratch1))));
|
|
336
|
+
var leftIsOutside = PolylineVolumeGeometryLibrary.angleIsGreaterThanPi(forward, backward, position, ellipsoid);
|
|
337
|
+
if (leftIsOutside) {
|
|
338
|
+
pivot = Cartesian3.add(position, Cartesian3.multiplyByScalar(cornerDirection, scalar * width, cornerDirection), pivot);
|
|
339
|
+
start = Cartesian3.add(pivot, Cartesian3.multiplyByScalar(left, width, start), start);
|
|
340
|
+
scratch2Array[0] = Cartesian3.clone(previousPosition, scratch2Array[0]);
|
|
341
|
+
scratch2Array[1] = Cartesian3.clone(start, scratch2Array[1]);
|
|
342
|
+
subdividedHeights = subdivideHeights(scratch2Array, h0 + heightOffset, h1 + heightOffset, granularity);
|
|
343
|
+
subdividedPositions = PolylinePipeline.scaleToSurface(scratch2Array);
|
|
344
|
+
finalPositions = addPositions(subdividedPositions, left, shapeForSides, finalPositions, ellipsoid, subdividedHeights, 1);
|
|
345
|
+
left = Cartesian3.cross(surfaceNormal, forward, left);
|
|
346
|
+
left = Cartesian3.normalize(left, left);
|
|
347
|
+
end = Cartesian3.add(pivot, Cartesian3.multiplyByScalar(left, width, end), end);
|
|
348
|
+
if (cornerType.value === CornerType.ROUNDED.value || cornerType.value === CornerType.BEVELED.value) {
|
|
349
|
+
computeRoundCorner(pivot, start, end, cornerType, leftIsOutside, ellipsoid, finalPositions, shapeForSides, h1 + heightOffset, duplicatePoints);
|
|
350
|
+
} else {
|
|
351
|
+
cornerDirection = Cartesian3.negate(cornerDirection, cornerDirection);
|
|
352
|
+
finalPositions = addPosition(position, cornerDirection, shapeForSides, finalPositions, ellipsoid, h1 + heightOffset, scalar, repeat);
|
|
353
|
+
}
|
|
354
|
+
previousPosition = Cartesian3.clone(end, previousPosition);
|
|
355
|
+
} else {
|
|
356
|
+
pivot = Cartesian3.add(position, Cartesian3.multiplyByScalar(cornerDirection, scalar * width, cornerDirection), pivot);
|
|
357
|
+
start = Cartesian3.add(pivot, Cartesian3.multiplyByScalar(left, -width, start), start);
|
|
358
|
+
scratch2Array[0] = Cartesian3.clone(previousPosition, scratch2Array[0]);
|
|
359
|
+
scratch2Array[1] = Cartesian3.clone(start, scratch2Array[1]);
|
|
360
|
+
subdividedHeights = subdivideHeights(scratch2Array, h0 + heightOffset, h1 + heightOffset, granularity);
|
|
361
|
+
subdividedPositions = PolylinePipeline.scaleToSurface(scratch2Array, granularity, ellipsoid);
|
|
362
|
+
finalPositions = addPositions(subdividedPositions, left, shapeForSides, finalPositions, ellipsoid, subdividedHeights, 1);
|
|
363
|
+
left = Cartesian3.cross(surfaceNormal, forward, left);
|
|
364
|
+
left = Cartesian3.normalize(left, left);
|
|
365
|
+
end = Cartesian3.add(pivot, Cartesian3.multiplyByScalar(left, -width, end), end);
|
|
366
|
+
if (cornerType.value === CornerType.ROUNDED.value || cornerType.value === CornerType.BEVELED.value) {
|
|
367
|
+
computeRoundCorner(pivot, start, end, cornerType, leftIsOutside, ellipsoid, finalPositions, shapeForSides, h1 + heightOffset, duplicatePoints);
|
|
368
|
+
} else {
|
|
369
|
+
finalPositions = addPosition(position, cornerDirection, shapeForSides, finalPositions, ellipsoid, h1 + heightOffset, scalar, repeat);
|
|
370
|
+
}
|
|
371
|
+
previousPosition = Cartesian3.clone(end, previousPosition);
|
|
372
|
+
}
|
|
373
|
+
backward = Cartesian3.negate(forward, backward);
|
|
374
|
+
} else {
|
|
375
|
+
finalPositions = addPosition(previousPosition, left, shapeForSides, finalPositions, ellipsoid, h0 + heightOffset, 1, 1);
|
|
376
|
+
previousPosition = position;
|
|
377
|
+
}
|
|
378
|
+
h0 = h1;
|
|
379
|
+
h1 = heights[i + 1];
|
|
380
|
+
position = nextPosition;
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
scratch2Array[0] = Cartesian3.clone(previousPosition, scratch2Array[0]);
|
|
384
|
+
scratch2Array[1] = Cartesian3.clone(position, scratch2Array[1]);
|
|
385
|
+
subdividedHeights = subdivideHeights(scratch2Array, h0 + heightOffset, h1 + heightOffset, granularity);
|
|
386
|
+
subdividedPositions = PolylinePipeline.scaleToSurface(scratch2Array, granularity, ellipsoid);
|
|
387
|
+
finalPositions = addPositions(subdividedPositions, left, shapeForSides, finalPositions, ellipsoid, subdividedHeights, 1);
|
|
388
|
+
if (duplicatePoints) {
|
|
389
|
+
ends = addPosition(position, left, shapeForEnds, ends, ellipsoid, h1 + heightOffset, 1, 1);
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
length = finalPositions.length;
|
|
393
|
+
var posLength = duplicatePoints ? length + ends.length : length;
|
|
394
|
+
var combinedPositions = new Float64Array(posLength);
|
|
395
|
+
combinedPositions.set(finalPositions);
|
|
396
|
+
if (duplicatePoints) {
|
|
397
|
+
combinedPositions.set(ends, length);
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
return combinedPositions;
|
|
401
|
+
};
|
|
402
|
+
|
|
403
|
+
return PolylineVolumeGeometryLibrary;
|
|
404
|
+
});
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/*global define*/
|
|
2
|
+
define(['Core/defined', 'Core/DeveloperError', 'Core/Cartesian3', 'Core/CornerType', 'Core/ComponentDatatype', 'Core/Ellipsoid', 'Core/Geometry', 'Core/GeometryPipeline', 'Core/IndexDatatype', 'Core/Math', 'Core/PolygonPipeline', 'Core/PolylineVolumeGeometryLibrary', 'Core/PrimitiveType', 'Core/defaultValue', 'Core/BoundingSphere', 'Core/BoundingRectangle', 'Core/GeometryAttribute', 'Core/GeometryAttributes', 'Core/WindingOrder'], function(
|
|
3
|
+
defined,
|
|
4
|
+
DeveloperError,
|
|
5
|
+
Cartesian3,
|
|
6
|
+
CornerType,
|
|
7
|
+
ComponentDatatype,
|
|
8
|
+
Ellipsoid,
|
|
9
|
+
Geometry,
|
|
10
|
+
GeometryPipeline,
|
|
11
|
+
IndexDatatype,
|
|
12
|
+
CesiumMath,
|
|
13
|
+
PolygonPipeline,
|
|
14
|
+
PolylineVolumeGeometryLibrary,
|
|
15
|
+
PrimitiveType,
|
|
16
|
+
defaultValue,
|
|
17
|
+
BoundingSphere,
|
|
18
|
+
BoundingRectangle,
|
|
19
|
+
GeometryAttribute,
|
|
20
|
+
GeometryAttributes,
|
|
21
|
+
WindingOrder) {
|
|
22
|
+
"use strict";
|
|
23
|
+
|
|
24
|
+
function computeAttributes(positions, shape, boundingRectangle, ellipsoid) {
|
|
25
|
+
var attributes = new GeometryAttributes();
|
|
26
|
+
attributes.position = new GeometryAttribute({
|
|
27
|
+
componentDatatype : ComponentDatatype.DOUBLE,
|
|
28
|
+
componentsPerAttribute : 3,
|
|
29
|
+
values : positions
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
var shapeLength = shape.length;
|
|
33
|
+
var vertexCount = attributes.position.values.length / 3;
|
|
34
|
+
var positionLength = positions.length / 3;
|
|
35
|
+
var shapeCount = positionLength / shapeLength;
|
|
36
|
+
var indices = IndexDatatype.createTypedArray(vertexCount, 2 * shapeLength * (shapeCount + 1));
|
|
37
|
+
var i, j;
|
|
38
|
+
var index = 0;
|
|
39
|
+
i = 0;
|
|
40
|
+
var offset = i * shapeLength;
|
|
41
|
+
for (j = 0; j < shapeLength - 1; j++) {
|
|
42
|
+
indices[index++] = j + offset;
|
|
43
|
+
indices[index++] = j + offset + 1;
|
|
44
|
+
}
|
|
45
|
+
indices[index++] = shapeLength - 1 + offset;
|
|
46
|
+
indices[index++] = offset;
|
|
47
|
+
|
|
48
|
+
i = shapeCount - 1;
|
|
49
|
+
offset = i * shapeLength;
|
|
50
|
+
for (j = 0; j < shapeLength - 1; j++) {
|
|
51
|
+
indices[index++] = j + offset;
|
|
52
|
+
indices[index++] = j + offset + 1;
|
|
53
|
+
}
|
|
54
|
+
indices[index++] = shapeLength - 1 + offset;
|
|
55
|
+
indices[index++] = offset;
|
|
56
|
+
|
|
57
|
+
for (i = 0; i < shapeCount - 1; i++) {
|
|
58
|
+
var firstOffset = shapeLength * i;
|
|
59
|
+
var secondOffset = firstOffset + shapeLength;
|
|
60
|
+
for (j = 0; j < shapeLength; j++) {
|
|
61
|
+
indices[index++] = j + firstOffset;
|
|
62
|
+
indices[index++] = j + secondOffset;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
var geometry = new Geometry({
|
|
67
|
+
attributes : attributes,
|
|
68
|
+
indices : IndexDatatype.createTypedArray(vertexCount, indices),
|
|
69
|
+
boundingSphere : BoundingSphere.fromVertices(positions),
|
|
70
|
+
primitiveType : PrimitiveType.LINES
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
return geometry;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* A description of a polyline with a volume (a 2D shape extruded along a polyline).
|
|
78
|
+
*
|
|
79
|
+
* @alias PolylineVolumeOutlineGeometry
|
|
80
|
+
* @constructor
|
|
81
|
+
*
|
|
82
|
+
* @param {Array} options.polylinePositions An array of {Cartesain3} positions that define the center of the polyline volume.
|
|
83
|
+
* @param {Number} options.shapePositions An array of {Cartesian2} positions that define the shape to be extruded along the polyline
|
|
84
|
+
* @param {Ellipsoid} [options.ellipsoid=Ellipsoid.WGS84] The ellipsoid to be used as a reference.
|
|
85
|
+
* @param {Number} [options.granularity=CesiumMath.RADIANS_PER_DEGREE] The distance, in radians, between each latitude and longitude. Determines the number of positions in the buffer.
|
|
86
|
+
* @param {Boolean} [options.cornerType = CornerType.ROUNDED] Determines the style of the corners.
|
|
87
|
+
*
|
|
88
|
+
* @exception {DeveloperError} options.polylinePositions is required.
|
|
89
|
+
* @exception {DeveloperError} options.shapePositions is required.
|
|
90
|
+
*
|
|
91
|
+
* @see PolylineVolumeOutlineGeometry#createGeometry
|
|
92
|
+
*
|
|
93
|
+
* @example
|
|
94
|
+
* var volumeOutline = new PolylineVolumeOutlineGeometry({
|
|
95
|
+
* polylinePositions : ellipsoid.cartographicArrayToCartesianArray([
|
|
96
|
+
* Cartographic.fromDegrees(-72.0, 40.0),
|
|
97
|
+
* Cartographic.fromDegrees(-70.0, 35.0)
|
|
98
|
+
* ]),
|
|
99
|
+
* shapePositions : Shapes.compute2DCircle(100000.0)
|
|
100
|
+
* });
|
|
101
|
+
*/
|
|
102
|
+
var PolylineVolumeOutlineGeometry = function(options) {
|
|
103
|
+
options = defaultValue(options, defaultValue.EMPTY_OBJECT);
|
|
104
|
+
var positions = options.polylinePositions;
|
|
105
|
+
if (!defined(positions)) {
|
|
106
|
+
throw new DeveloperError('options.polylinePositions is required.');
|
|
107
|
+
}
|
|
108
|
+
var shape = options.shapePositions;
|
|
109
|
+
if (!defined(shape)) {
|
|
110
|
+
throw new DeveloperError('options.shapePositions is required.');
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
this._positions = positions;
|
|
114
|
+
this._shape = shape;
|
|
115
|
+
this._ellipsoid = defaultValue(options.ellipsoid, Ellipsoid.WGS84);
|
|
116
|
+
this._cornerType = defaultValue(options.cornerType, CornerType.ROUNDED);
|
|
117
|
+
this._granularity = defaultValue(options.granularity, CesiumMath.RADIANS_PER_DEGREE);
|
|
118
|
+
this._workerName = 'createPolylineVolumeOutlineGeometry';
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Computes the geometric representation of the outline of a polyline with a volume, including its vertices, indices, and a bounding sphere.
|
|
123
|
+
* @memberof PolylineVolumeOutlineGeometry
|
|
124
|
+
*
|
|
125
|
+
* @param {PolylineVolumeOutlineGeometry} polylineVolumeOutlineGeometry A description of the polyline volume outline.
|
|
126
|
+
*
|
|
127
|
+
* @returns {Geometry} The computed vertices and indices.
|
|
128
|
+
*
|
|
129
|
+
* @exception {DeveloperError} Count of unique polyline positions must be greater than 1.
|
|
130
|
+
* @exception {DeveloperError} Count of unique shape positions must be at least 3.
|
|
131
|
+
*/
|
|
132
|
+
var brScratch = new BoundingRectangle();
|
|
133
|
+
PolylineVolumeOutlineGeometry.createGeometry = function(polylineVolumeOutlineGeometry) {
|
|
134
|
+
var positions = polylineVolumeOutlineGeometry._positions;
|
|
135
|
+
var cleanPositions = PolylineVolumeGeometryLibrary.removeDuplicatesFromPositions(positions, polylineVolumeOutlineGeometry._ellipsoid);
|
|
136
|
+
if (cleanPositions.length < 2) {
|
|
137
|
+
throw new DeveloperError('Count of unique polyline positions must be greater than 1.');
|
|
138
|
+
}
|
|
139
|
+
var shape2D = polylineVolumeOutlineGeometry._shape;
|
|
140
|
+
shape2D = PolylineVolumeGeometryLibrary.removeDuplicatesFromShape(shape2D);
|
|
141
|
+
if (shape2D.length < 3) {
|
|
142
|
+
throw new DeveloperError('Count of unique shape positions must be at least 3.');
|
|
143
|
+
}
|
|
144
|
+
if (PolygonPipeline.computeWindingOrder2D(shape2D).value === WindingOrder.CLOCKWISE.value) {
|
|
145
|
+
shape2D.reverse();
|
|
146
|
+
}
|
|
147
|
+
var boundingRectangle = BoundingRectangle.fromPoints(shape2D, brScratch);
|
|
148
|
+
|
|
149
|
+
var computedPositions = PolylineVolumeGeometryLibrary.computePositions(cleanPositions, shape2D, boundingRectangle, polylineVolumeOutlineGeometry, false);
|
|
150
|
+
return computeAttributes(computedPositions, shape2D, boundingRectangle, polylineVolumeOutlineGeometry._ellipsoid);
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
return PolylineVolumeOutlineGeometry;
|
|
154
|
+
});
|