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.
Files changed (108) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/Assets/Textures/moonSmall.jpg +0 -0
  3. data/app/assets/javascripts/Cesium.js +10 -1
  4. data/app/assets/javascripts/Core/Cartesian2.js +28 -0
  5. data/app/assets/javascripts/Core/Cartesian3.js +28 -0
  6. data/app/assets/javascripts/Core/Cartesian4.js +28 -0
  7. data/app/assets/javascripts/Core/CatmullRomSpline.js +3 -3
  8. data/app/assets/javascripts/Core/Clock.js +7 -7
  9. data/app/assets/javascripts/Core/Color.js +1 -1
  10. data/app/assets/javascripts/Core/ComponentDatatype.js +11 -7
  11. data/app/assets/javascripts/Core/CorridorGeometryLibrary.js +23 -29
  12. data/app/assets/javascripts/Core/Ellipsoid.js +6 -0
  13. data/app/assets/javascripts/Core/EllipsoidTangentPlane.js +5 -4
  14. data/app/assets/javascripts/Core/Event.js +2 -1
  15. data/app/assets/javascripts/Core/ExtentGeometry.js +1 -1
  16. data/app/assets/javascripts/Core/ExtentOutlineGeometry.js +1 -1
  17. data/app/assets/javascripts/Core/GeometryAttributes.js +1 -1
  18. data/app/assets/javascripts/Core/GeometryInstance.js +2 -2
  19. data/app/assets/javascripts/Core/GeometryPipeline.js +10 -7
  20. data/app/assets/javascripts/Core/HermiteSpline.js +1 -1
  21. data/app/assets/javascripts/Core/Iau2000Orientation.js +132 -0
  22. data/app/assets/javascripts/Core/IauOrientationAxes.js +98 -0
  23. data/app/assets/javascripts/Core/IauOrientationParameters.js +48 -0
  24. data/app/assets/javascripts/Core/IntersectionTests.js +5 -5
  25. data/app/assets/javascripts/Core/JulianDate.js +27 -5
  26. data/app/assets/javascripts/Core/Math.js +9 -0
  27. data/app/assets/javascripts/Core/Matrix2.js +1 -142
  28. data/app/assets/javascripts/Core/Matrix3.js +168 -153
  29. data/app/assets/javascripts/Core/Matrix4.js +0 -249
  30. data/app/assets/javascripts/Core/NearFarScalar.js +13 -0
  31. data/app/assets/javascripts/Core/PolygonGeometry.js +1 -1
  32. data/app/assets/javascripts/Core/PolygonOutlineGeometry.js +2 -2
  33. data/app/assets/javascripts/Core/PolygonPipeline.js +2 -2
  34. data/app/assets/javascripts/Core/PolylinePipeline.js +7 -3
  35. data/app/assets/javascripts/Core/PolylineVolumeGeometry.js +239 -0
  36. data/app/assets/javascripts/Core/PolylineVolumeGeometryLibrary.js +404 -0
  37. data/app/assets/javascripts/Core/PolylineVolumeOutlineGeometry.js +154 -0
  38. data/app/assets/javascripts/Core/Quaternion.js +37 -10
  39. data/app/assets/javascripts/Core/Shapes.js +26 -2
  40. data/app/assets/javascripts/Core/Simon1994PlanetaryPositions.js +3 -3
  41. data/app/assets/javascripts/Core/TimeInterval.js +28 -17
  42. data/app/assets/javascripts/Core/TimeIntervalCollection.js +30 -0
  43. data/app/assets/javascripts/Core/Transforms.js +5 -5
  44. data/app/assets/javascripts/Core/WallGeometryLibrary.js +2 -2
  45. data/app/assets/javascripts/Core/getFilenameFromUri.js +37 -0
  46. data/app/assets/javascripts/DynamicScene/ColorMaterialProperty.js +2 -2
  47. data/app/assets/javascripts/DynamicScene/CzmlDataSource.js +96 -18
  48. data/app/assets/javascripts/DynamicScene/DataSource.js +8 -0
  49. data/app/assets/javascripts/DynamicScene/DynamicBillboard.js +15 -3
  50. data/app/assets/javascripts/DynamicScene/DynamicBillboardVisualizer.js +6 -1
  51. data/app/assets/javascripts/DynamicScene/DynamicConeVisualizerUsingCustomSensor.js +1 -1
  52. data/app/assets/javascripts/DynamicScene/DynamicLabel.js +12 -1
  53. data/app/assets/javascripts/DynamicScene/DynamicLabelVisualizer.js +5 -0
  54. data/app/assets/javascripts/DynamicScene/DynamicObject.js +44 -17
  55. data/app/assets/javascripts/DynamicScene/DynamicObjectView.js +3 -3
  56. data/app/assets/javascripts/DynamicScene/DynamicPoint.js +12 -1
  57. data/app/assets/javascripts/DynamicScene/DynamicPointVisualizer.js +11 -2
  58. data/app/assets/javascripts/DynamicScene/DynamicPolyline.js +10 -30
  59. data/app/assets/javascripts/DynamicScene/DynamicPolylineVisualizer.js +5 -20
  60. data/app/assets/javascripts/DynamicScene/GeoJsonDataSource.js +26 -8
  61. data/app/assets/javascripts/DynamicScene/GridMaterialProperty.js +2 -2
  62. data/app/assets/javascripts/DynamicScene/ImageMaterialProperty.js +2 -2
  63. data/app/assets/javascripts/DynamicScene/PolylineOutlineMaterialProperty.js +66 -0
  64. data/app/assets/javascripts/DynamicScene/PositionProperty.js +3 -3
  65. data/app/assets/javascripts/DynamicScene/ReferenceProperty.js +1 -1
  66. data/app/assets/javascripts/DynamicScene/SampledProperty.js +14 -8
  67. data/app/assets/javascripts/Renderer/AutomaticUniforms.js +4 -3
  68. data/app/assets/javascripts/Renderer/Context.js +16 -2
  69. data/app/assets/javascripts/Renderer/UniformState.js +14 -14
  70. data/app/assets/javascripts/Scene/Billboard.js +102 -26
  71. data/app/assets/javascripts/Scene/BillboardCollection.js +69 -16
  72. data/app/assets/javascripts/Scene/Camera.js +7 -7
  73. data/app/assets/javascripts/Scene/CameraController.js +23 -12
  74. data/app/assets/javascripts/Scene/CameraFlightPath.js +11 -11
  75. data/app/assets/javascripts/Scene/CentralBodySurface.js +1 -1
  76. data/app/assets/javascripts/Scene/CustomSensorVolume.js +17 -2
  77. data/app/assets/javascripts/Scene/EllipsoidPrimitive.js +79 -24
  78. data/app/assets/javascripts/Scene/ExtentPrimitive.js +17 -1
  79. data/app/assets/javascripts/Scene/Label.js +94 -18
  80. data/app/assets/javascripts/Scene/LabelCollection.js +6 -2
  81. data/app/assets/javascripts/Scene/Moon.js +150 -0
  82. data/app/assets/javascripts/Scene/Polygon.js +18 -1
  83. data/app/assets/javascripts/Scene/Polyline.js +32 -13
  84. data/app/assets/javascripts/Scene/PolylineCollection.js +7 -6
  85. data/app/assets/javascripts/Scene/Primitive.js +2 -2
  86. data/app/assets/javascripts/Scene/RectangularPyramidSensorVolume.js +12 -0
  87. data/app/assets/javascripts/Scene/Scene.js +122 -14
  88. data/app/assets/javascripts/Scene/SceneTransforms.js +2 -2
  89. data/app/assets/javascripts/Scene/SceneTransitioner.js +4 -4
  90. data/app/assets/javascripts/Scene/ScreenSpaceCameraController.js +1 -1
  91. data/app/assets/javascripts/Scene/SkyBox.js +53 -48
  92. data/app/assets/javascripts/Scene/TileMapServiceImageryProvider.js +2 -2
  93. data/app/assets/javascripts/Shaders/BillboardCollectionVS.glsl +36 -14
  94. data/app/assets/javascripts/Shaders/BillboardCollectionVS.js +27 -9
  95. data/app/assets/javascripts/Shaders/Builtin/Functions/phong.glsl +13 -0
  96. data/app/assets/javascripts/Shaders/Builtin/Functions/phong.js +10 -0
  97. data/app/assets/javascripts/Shaders/EllipsoidFS.glsl +24 -0
  98. data/app/assets/javascripts/Shaders/EllipsoidFS.js +21 -1
  99. data/app/assets/javascripts/Widgets/CesiumWidget/CesiumWidget.js +30 -9
  100. data/app/assets/javascripts/Widgets/HomeButton/HomeButtonViewModel.js +6 -5
  101. data/app/assets/javascripts/Widgets/Viewer/Viewer.js +13 -0
  102. data/app/assets/javascripts/Widgets/Viewer/viewerDynamicObjectMixin.js +46 -4
  103. data/app/assets/javascripts/Workers/cesiumWorkerBootstrapper.js +16 -8
  104. data/app/assets/javascripts/Workers/createPolylineVolumeGeometry.js +23 -0
  105. data/app/assets/javascripts/Workers/createPolylineVolumeOutlineGeometry.js +23 -0
  106. data/lib/cesium/version.rb +1 -1
  107. metadata +15 -5
  108. data/test/dummy/tmp/pids/server.pid +0 -1
@@ -20,24 +20,26 @@ define(['Core/defaultValue', 'Core/defined', 'Core/DeveloperError', 'Core/Boundi
20
20
  *
21
21
  * @demo <a href="http://cesium.agi.com/Cesium/Apps/Sandcastle/index.html?src=Polylines.html">Cesium Sandcastle Polyline Demo</a>
22
22
  */
23
- var Polyline = function(description, polylineCollection) {
24
- description = defaultValue(description, EMPTY_OBJECT);
23
+ var Polyline = function(options, polylineCollection) {
24
+ options = defaultValue(options, EMPTY_OBJECT);
25
25
 
26
- this._show = defaultValue(description.show, true);
27
- this._width = defaultValue(description.width, 1.0);
26
+ this._show = defaultValue(options.show, true);
27
+ this._width = defaultValue(options.width, 1.0);
28
28
 
29
- this._material = description.material;
29
+ this._material = options.material;
30
30
  if (!defined(this._material)) {
31
31
  this._material = Material.fromType(Material.ColorType);
32
32
  this._material.uniforms.color = new Color(1.0, 1.0, 1.0, 1.0);
33
33
  }
34
34
 
35
- var positions = description.positions;
35
+ var positions = options.positions;
36
36
  if (!defined(positions)) {
37
37
  positions = [];
38
38
  }
39
39
 
40
40
  this._positions = positions;
41
+ this._length = positions.length;
42
+ this._id = options.id;
41
43
 
42
44
  var modelMatrix;
43
45
  if (defined(this._polylineCollection)) {
@@ -53,7 +55,7 @@ define(['Core/defaultValue', 'Core/defined', 'Core/DeveloperError', 'Core/Boundi
53
55
  this._polylineCollection = polylineCollection;
54
56
  this._dirty = false;
55
57
  this._pickId = undefined;
56
- this._pickIdThis = description._pickIdThis;
58
+ this._pickIdThis = options._pickIdThis;
57
59
  this._boundingVolume = BoundingSphere.fromPoints(this._positions);
58
60
  this._boundingVolume2D = new BoundingSphere(); // modified in PolylineCollection
59
61
  };
@@ -149,11 +151,12 @@ define(['Core/defaultValue', 'Core/defined', 'Core/DeveloperError', 'Core/Boundi
149
151
  throw new DeveloperError('value is required.');
150
152
  }
151
153
 
152
- if (this._positions.length !== value.length) {
154
+ if (this._positions.length !== value.length || this._positions.length !== this._length) {
153
155
  makeDirty(this, POSITION_SIZE_INDEX);
154
156
  }
155
157
 
156
158
  this._positions = value;
159
+ this._length = value.length;
157
160
  this._boundingVolume = BoundingSphere.fromPoints(this._positions, this._boundingVolume);
158
161
  makeDirty(this, POSITION_INDEX);
159
162
 
@@ -173,7 +176,7 @@ define(['Core/defaultValue', 'Core/defined', 'Core/DeveloperError', 'Core/Boundi
173
176
  var segmentLengths = this._segments.lengths;
174
177
 
175
178
  var positionsChanged = this._propertiesChanged[POSITION_INDEX] > 0 || this._propertiesChanged[POSITION_SIZE_INDEX] > 0;
176
- if (!modelMatrix.equals(this._modelMatrix) || positionsChanged) {
179
+ if (!Matrix4.equals(modelMatrix, this._modelMatrix) || positionsChanged) {
177
180
  this._segments = PolylinePipeline.wrapLongitude(this._positions, modelMatrix);
178
181
  }
179
182
 
@@ -222,9 +225,10 @@ define(['Core/defaultValue', 'Core/defined', 'Core/DeveloperError', 'Core/Boundi
222
225
  if (!defined(material)) {
223
226
  throw new DeveloperError('material is required.');
224
227
  }
225
-
226
- this._material = material;
227
- makeDirty(this, MATERIAL_INDEX);
228
+ if (this._material !== material) {
229
+ this._material = material;
230
+ makeDirty(this, MATERIAL_INDEX);
231
+ }
228
232
  };
229
233
 
230
234
  /**
@@ -271,10 +275,25 @@ define(['Core/defaultValue', 'Core/defined', 'Core/DeveloperError', 'Core/Boundi
271
275
  }
272
276
  };
273
277
 
278
+ /**
279
+ * Returns the user-defined object returned when the polyline is picked.
280
+ *
281
+ * @memberof Polyline
282
+ *
283
+ * @returns {Object} The user-defined object returned when the polyline is picked.
284
+ */
285
+ Polyline.prototype.getId = function() {
286
+ return this._id;
287
+ };
288
+
289
+ /**
290
+ * @private
291
+ */
274
292
  Polyline.prototype.getPickId = function(context) {
275
293
  if (!defined(this._pickId)) {
276
294
  this._pickId = context.createPickId({
277
- primitive : defaultValue(this._pickIdThis, this)
295
+ primitive : defaultValue(this._pickIdThis, this),
296
+ id : this._id
278
297
  });
279
298
  }
280
299
  return this._pickId;
@@ -114,8 +114,8 @@ define(['Core/defined', 'Core/DeveloperError', 'Core/Color', 'Core/combine', 'Co
114
114
  * @see Transforms.eastNorthUpToFixedFrame
115
115
  * @see czm_model
116
116
  */
117
- this.modelMatrix = Matrix4.IDENTITY.clone();
118
- this._modelMatrix = Matrix4.IDENTITY.clone();
117
+ this.modelMatrix = Matrix4.clone(Matrix4.IDENTITY);
118
+ this._modelMatrix = Matrix4.clone(Matrix4.IDENTITY);
119
119
 
120
120
  this._rs = undefined;
121
121
 
@@ -401,6 +401,7 @@ define(['Core/defined', 'Core/DeveloperError', 'Core/Color', 'Core/combine', 'Co
401
401
  this._polylinesUpdated = false;
402
402
  }
403
403
 
404
+ properties = this._propertiesChanged;
404
405
  for ( var k = 0; k < NUMBER_OF_PROPERTIES; ++k) {
405
406
  properties[k] = 0;
406
407
  }
@@ -477,7 +478,7 @@ define(['Core/defined', 'Core/DeveloperError', 'Core/Color', 'Core/combine', 'Co
477
478
  var polyline = polylines[s];
478
479
  var mId = createMaterialId(polyline._material);
479
480
  if (mId !== currentId) {
480
- if (defined(currentId)) {
481
+ if (defined(currentId) && count > 0) {
481
482
  if (commandIndex >= commandsLength) {
482
483
  command = new DrawCommand();
483
484
  command.owner = polylineCollection;
@@ -918,10 +919,10 @@ define(['Core/defined', 'Core/DeveloperError', 'Core/Color', 'Core/combine', 'Co
918
919
  var mode = frameState.mode;
919
920
  var projection = frameState.scene2D.projection;
920
921
 
921
- if (collection._mode !== mode || (collection._projection !== projection) || (!collection._modelMatrix.equals(collection.modelMatrix))) {
922
+ if (collection._mode !== mode || (collection._projection !== projection) || (!Matrix4.equals(collection._modelMatrix, collection.modelMatrix))) {
922
923
  collection._mode = mode;
923
924
  collection._projection = projection;
924
- collection._modelMatrix = collection.modelMatrix.clone();
925
+ collection._modelMatrix = Matrix4.clone(collection.modelMatrix);
925
926
  collection._createVertexArray = true;
926
927
  }
927
928
  }
@@ -1330,7 +1331,7 @@ define(['Core/defined', 'Core/DeveloperError', 'Core/Color', 'Core/combine', 'Co
1330
1331
 
1331
1332
  for ( var n = 0; n < length; ++n) {
1332
1333
  position = positions[n];
1333
- p = modelMatrix.multiplyByPoint(position);
1334
+ p = Matrix4.multiplyByPoint(modelMatrix, position);
1334
1335
  newPositions.push(projection.project(ellipsoid.cartesianToCartographic(Cartesian3.fromCartesian4(p))));
1335
1336
  }
1336
1337
 
@@ -41,7 +41,7 @@ define(['Core/defaultValue', 'Core/defined', 'Core/defineProperties', 'Core/Deve
41
41
  * </p>
42
42
  * <p>
43
43
  * Combining multiple instances into one primitive is called batching, and significantly improves performance for static data.
44
- * Instances can be individually picked; {@link Context#pick} returns their {@link GeometryInstance#id}. Using
44
+ * Instances can be individually picked; {@link Scene#pick} returns their {@link GeometryInstance#id}. Using
45
45
  * per-instance appearances like {@link PerInstanceColorAppearance}, each instance can also have a unique color.
46
46
  * </p>
47
47
  * <p>
@@ -195,7 +195,7 @@ define(['Core/defaultValue', 'Core/defined', 'Core/defineProperties', 'Core/Deve
195
195
  *
196
196
  * @see czm_model
197
197
  */
198
- this.modelMatrix = Matrix4.IDENTITY.clone();
198
+ this.modelMatrix = Matrix4.clone(Matrix4.IDENTITY);
199
199
 
200
200
  /**
201
201
  * Determines if the primitive will be shown. This affects all geometry
@@ -159,6 +159,17 @@ define(['Core/clone', 'Core/Color', 'Core/defaultValue', 'Core/defined', 'Core/d
159
159
  */
160
160
  this.intersectionWidth = defaultValue(options.intersectionWidth, 5.0);
161
161
 
162
+ /**
163
+ * User-defined object returned when the sensors is picked.
164
+ *
165
+ * @type Object
166
+ *
167
+ * @default undefined
168
+ *
169
+ * @see Scene#pick
170
+ */
171
+ this.id = options.id;
172
+
162
173
  var customSensorOptions = clone(options);
163
174
  customSensorOptions._pickIdThis = defaultValue(options._pickIdThis, this);
164
175
  this._customSensor = new CustomSensorVolume(customSensorOptions);
@@ -188,6 +199,7 @@ define(['Core/clone', 'Core/Color', 'Core/defaultValue', 'Core/defined', 'Core/d
188
199
  s.material = this.material;
189
200
  s.intersectionColor = this.intersectionColor;
190
201
  s.intersectionWidth = this.intersectionWidth;
202
+ s.id = this.id;
191
203
 
192
204
  if ((this._xHalfAngle !== this.xHalfAngle) || (this._yHalfAngle !== this.yHalfAngle)) {
193
205
 
@@ -1,10 +1,11 @@
1
1
  /*global define*/
2
- define(['Core/Math', 'Core/Color', 'Core/defaultValue', 'Core/defined', 'Core/destroyObject', 'Core/GeographicProjection', 'Core/Ellipsoid', 'Core/Occluder', 'Core/BoundingRectangle', 'Core/BoundingSphere', 'Core/Cartesian2', 'Core/Cartesian3', 'Core/Intersect', 'Core/Interval', 'Core/Matrix4', 'Core/JulianDate', 'Core/EllipsoidGeometry', 'Core/GeometryInstance', 'Core/GeometryPipeline', 'Core/ColorGeometryInstanceAttribute', 'Renderer/Context', 'Renderer/ClearCommand', 'Renderer/PassState', 'Scene/Camera', 'Scene/ScreenSpaceCameraController', 'Scene/CompositePrimitive', 'Scene/CullingVolume', 'Scene/AnimationCollection', 'Scene/SceneMode', 'Scene/SceneTransforms', 'Scene/FrameState', 'Scene/OrthographicFrustum', 'Scene/PerspectiveOffCenterFrustum', 'Scene/FrustumCommands', 'Scene/Primitive', 'Scene/PerInstanceColorAppearance', 'Scene/SunPostProcess', 'Scene/CreditDisplay'], function(
2
+ define(['Core/Math', 'Core/Color', 'Core/defaultValue', 'Core/defined', 'Core/destroyObject', 'Core/DeveloperError', 'Core/GeographicProjection', 'Core/Ellipsoid', 'Core/Occluder', 'Core/BoundingRectangle', 'Core/BoundingSphere', 'Core/Cartesian2', 'Core/Cartesian3', 'Core/Intersect', 'Core/Interval', 'Core/Matrix4', 'Core/JulianDate', 'Core/EllipsoidGeometry', 'Core/GeometryInstance', 'Core/GeometryPipeline', 'Core/ColorGeometryInstanceAttribute', 'Core/ShowGeometryInstanceAttribute', 'Renderer/Context', 'Renderer/ClearCommand', 'Renderer/PassState', 'Scene/Camera', 'Scene/ScreenSpaceCameraController', 'Scene/CompositePrimitive', 'Scene/CullingVolume', 'Scene/AnimationCollection', 'Scene/SceneMode', 'Scene/SceneTransforms', 'Scene/FrameState', 'Scene/OrthographicFrustum', 'Scene/PerspectiveOffCenterFrustum', 'Scene/FrustumCommands', 'Scene/Primitive', 'Scene/PerInstanceColorAppearance', 'Scene/SunPostProcess', 'Scene/CreditDisplay'], function(
3
3
  CesiumMath,
4
4
  Color,
5
5
  defaultValue,
6
6
  defined,
7
7
  destroyObject,
8
+ DeveloperError,
8
9
  GeographicProjection,
9
10
  Ellipsoid,
10
11
  Occluder,
@@ -20,6 +21,7 @@ define(['Core/Math', 'Core/Color', 'Core/defaultValue', 'Core/defined', 'Core/de
20
21
  GeometryInstance,
21
22
  GeometryPipeline,
22
23
  ColorGeometryInstanceAttribute,
24
+ ShowGeometryInstanceAttribute,
23
25
  Context,
24
26
  ClearCommand,
25
27
  PassState,
@@ -140,6 +142,14 @@ define(['Core/Math', 'Core/Color', 'Core/defaultValue', 'Core/defined', 'Core/de
140
142
  this.sunBloom = true;
141
143
  this._sunBloom = undefined;
142
144
 
145
+ /**
146
+ * The {@link Moon}
147
+ *
148
+ * @type Moon
149
+ * @default undefined
150
+ */
151
+ this.moon = undefined;
152
+
143
153
  /**
144
154
  * The background color, which is only visible if there is no sky box, i.e., {@link Scene#skyBox} is undefined.
145
155
  *
@@ -148,7 +158,7 @@ define(['Core/Math', 'Core/Color', 'Core/defaultValue', 'Core/defined', 'Core/de
148
158
  *
149
159
  * @see Scene#skyBox
150
160
  */
151
- this.backgroundColor = Color.BLACK.clone();
161
+ this.backgroundColor = Color.clone(Color.BLACK);
152
162
 
153
163
  /**
154
164
  * The current mode of the scene.
@@ -602,7 +612,11 @@ define(['Core/Math', 'Core/Color', 'Core/defaultValue', 'Core/defined', 'Core/de
602
612
  }
603
613
  }
604
614
 
605
- function isSunVisible(command, frameState) {
615
+ function isVisible(command, frameState) {
616
+ if (!defined(command)) {
617
+ return;
618
+ }
619
+
606
620
  var occluder = (frameState.mode === SceneMode.SCENE3D) ? frameState.occluder: undefined;
607
621
  var cullingVolume = frameState.cullingVolume;
608
622
 
@@ -613,11 +627,14 @@ define(['Core/Math', 'Core/Color', 'Core/defaultValue', 'Core/defined', 'Core/de
613
627
  }
614
628
  cullingVolume = scratchCullingVolume;
615
629
 
630
+ var modelMatrix = defaultValue(command.modelMatrix, Matrix4.IDENTITY);
631
+ var transformedBV = command.boundingVolume.transform(modelMatrix); //TODO: Remove this allocation.
632
+
616
633
  return ((defined(command)) &&
617
634
  ((!defined(command.boundingVolume)) ||
618
635
  !command.cull ||
619
- ((cullingVolume.getVisibility(command.boundingVolume) !== Intersect.OUTSIDE) &&
620
- (!defined(occluder) || occluder.isBoundingSphereVisible(command.boundingVolume)))));
636
+ ((cullingVolume.getVisibility(transformedBV) !== Intersect.OUTSIDE) &&
637
+ (!defined(occluder) || occluder.isBoundingSphereVisible(transformedBV)))));
621
638
  }
622
639
 
623
640
  function executeCommands(scene, passState, clearColor) {
@@ -643,7 +660,8 @@ define(['Core/Math', 'Core/Color', 'Core/defaultValue', 'Core/defined', 'Core/de
643
660
  var skyBoxCommand = (frameState.passes.color && defined(scene.skyBox)) ? scene.skyBox.update(context, frameState) : undefined;
644
661
  var skyAtmosphereCommand = (frameState.passes.color && defined(scene.skyAtmosphere)) ? scene.skyAtmosphere.update(context, frameState) : undefined;
645
662
  var sunCommand = (frameState.passes.color && defined(scene.sun)) ? scene.sun.update(context, frameState) : undefined;
646
- var sunVisible = isSunVisible(sunCommand, frameState);
663
+ var sunVisible = isVisible(sunCommand, frameState);
664
+
647
665
 
648
666
  if (sunVisible && scene.sunBloom) {
649
667
  passState.framebuffer = scene._sunPostProcess.update(context);
@@ -715,6 +733,18 @@ define(['Core/Math', 'Core/Color', 'Core/defaultValue', 'Core/defined', 'Core/de
715
733
  }
716
734
  }
717
735
 
736
+ function updatePrimitives(scene) {
737
+ var context = scene._context;
738
+ var frameState = scene._frameState;
739
+ var commandList = scene._commandList;
740
+
741
+ scene._primitives.update(context, frameState, commandList);
742
+
743
+ if (defined(scene.moon)) {
744
+ scene.moon.update(context, frameState, commandList);
745
+ }
746
+ }
747
+
718
748
  /**
719
749
  * DOC_TBA
720
750
  * @memberof Scene
@@ -750,12 +780,10 @@ define(['Core/Math', 'Core/Color', 'Core/defaultValue', 'Core/defined', 'Core/de
750
780
  frameState.creditDisplay.beginFrame();
751
781
 
752
782
  var context = this._context;
753
-
754
783
  us.update(context, frameState);
755
784
 
756
785
  this._commandList.length = 0;
757
- this._primitives.update(context, frameState, this._commandList);
758
-
786
+ updatePrimitives(this);
759
787
  createPotentiallyVisibleSet(this, 'colorList');
760
788
 
761
789
  var passState = this._passState;
@@ -847,12 +875,26 @@ define(['Core/Math', 'Core/Color', 'Core/defaultValue', 'Core/defined', 'Core/de
847
875
  var scratchColorZero = new Color(0.0, 0.0, 0.0, 0.0);
848
876
 
849
877
  /**
850
- * DOC_TBA
878
+ * Returns an object with a `primitive` property that contains the first (top) primitive in the scene
879
+ * at a particular window coordinate or undefined if nothing is at the location. Other properties may
880
+ * potentially be set depending on the type of primitive.
881
+ *
851
882
  * @memberof Scene
883
+ *
884
+ * @param {Cartesian2} windowPosition Window coordinates to perform picking on.
885
+ *
886
+ * @returns {Object} Object containing the picked primitive.
887
+ *
888
+ * @exception {DeveloperError} windowPosition is undefined.
889
+ *
852
890
  */
853
891
  Scene.prototype.pick = function(windowPosition) {
892
+ if(!defined(windowPosition)) {
893
+ throw new DeveloperError('windowPosition is undefined.');
894
+ }
895
+
854
896
  var context = this._context;
855
- var primitives = this._primitives;
897
+ var us = this.getUniformState();
856
898
  var frameState = this._frameState;
857
899
 
858
900
  var drawingBufferPosition = SceneTransforms.transformWindowToDrawingBuffer(context, windowPosition);
@@ -866,9 +908,10 @@ define(['Core/Math', 'Core/Color', 'Core/defaultValue', 'Core/defined', 'Core/de
866
908
  frameState.cullingVolume = getPickCullingVolume(this, drawingBufferPosition, rectangleWidth, rectangleHeight);
867
909
  frameState.passes.pick = true;
868
910
 
869
- var commandLists = this._commandList;
870
- commandLists.length = 0;
871
- primitives.update(context, frameState, commandLists);
911
+ us.update(context, frameState);
912
+
913
+ this._commandList.length = 0;
914
+ updatePrimitives(this);
872
915
  createPotentiallyVisibleSet(this, 'pickList');
873
916
 
874
917
  scratchRectangle.x = drawingBufferPosition.x - ((rectangleWidth - 1.0) * 0.5);
@@ -880,6 +923,71 @@ define(['Core/Math', 'Core/Color', 'Core/defaultValue', 'Core/defined', 'Core/de
880
923
  return object;
881
924
  };
882
925
 
926
+ /**
927
+ * Returns a list of objects, each containing a `primitive` property, for all primitives at
928
+ * a particular window coordinate position. Other properties may also be set depending on the
929
+ * type of primitive. The primitives in the list are ordered by their visual order in the
930
+ * scene (front to back).
931
+ *
932
+ * @memberof Scene
933
+ *
934
+ * @param {Cartesian2} windowPosition Window coordinates to perform picking on.
935
+ *
936
+ * @returns {Array} Array of objects, each containing 1 picked primitives.
937
+ *
938
+ * @exception {DeveloperError} windowPosition is undefined.
939
+ *
940
+ * @example
941
+ * var pickedObjects = Scene.drillPick(new Cartesian2(100.0, 200.0));
942
+ */
943
+ Scene.prototype.drillPick = function(windowPosition) {
944
+ // PERFORMANCE_IDEA: This function calls each primitive's update for each pass. Instead
945
+ // we could update the primitive once, and then just execute their commands for each pass,
946
+ // and cull commands for picked primitives. e.g., base on the command's owner.
947
+ if (!defined(windowPosition)) {
948
+ throw new DeveloperError('windowPosition is undefined.');
949
+ }
950
+
951
+ var pickedObjects = [];
952
+
953
+ var pickedResult = this.pick(windowPosition);
954
+ while (defined(pickedResult) && defined(pickedResult.primitive)) {
955
+ var primitive = pickedResult.primitive;
956
+ pickedObjects.push(pickedResult);
957
+
958
+ // hide the picked primitive and call picking again to get the next primitive
959
+ if (defined(primitive.show)) {
960
+ primitive.show = false;
961
+ } else if (typeof primitive.setShow === 'function') {
962
+ primitive.setShow(false);
963
+ } else if (typeof primitive.getGeometryInstanceAttributes === 'function') {
964
+ var attributes = primitive.getGeometryInstanceAttributes(pickedResult.id);
965
+ if (defined(attributes) && defined(attributes.show)) {
966
+ attributes.show = ShowGeometryInstanceAttribute.toValue(false);
967
+ }
968
+ }
969
+
970
+ pickedResult = this.pick(windowPosition);
971
+ }
972
+
973
+ // unhide the picked primitives
974
+ for (var i = 0; i < pickedObjects.length; ++i) {
975
+ var p = pickedObjects[i].primitive;
976
+ if (defined(p.show)) {
977
+ p.show = true;
978
+ } else if (typeof p.setShow === 'function') {
979
+ p.setShow(true);
980
+ } else if (typeof p.getGeometryInstanceAttributes === 'function') {
981
+ var attr = p.getGeometryInstanceAttributes(pickedObjects[i].id);
982
+ if (defined(attr) && defined(attr.show)) {
983
+ attr.show = ShowGeometryInstanceAttribute.toValue(true);
984
+ }
985
+ }
986
+ }
987
+
988
+ return pickedObjects;
989
+ };
990
+
883
991
  /**
884
992
  * DOC_TBA
885
993
  * @memberof Scene
@@ -68,7 +68,7 @@ define(['Core/defaultValue', 'Core/defined', 'Core/DeveloperError', 'Core/Cartog
68
68
 
69
69
  // View-projection matrix to transform from world coordinates to clip coordinates
70
70
  var viewProjection = scene.getUniformState().getViewProjection();
71
- viewProjection.multiplyByPoint(actualPosition, positionCC);
71
+ Matrix4.multiplyByPoint(viewProjection, actualPosition, positionCC);
72
72
 
73
73
  return SceneTransforms.clipToWindowCoordinates(scene.getContext(), positionCC, result);
74
74
  };
@@ -117,7 +117,7 @@ define(['Core/defaultValue', 'Core/defined', 'Core/DeveloperError', 'Core/Cartog
117
117
 
118
118
  // View-projection matrix to transform from world coordinates to clip coordinates
119
119
  var viewProjection = scene.getUniformState().getViewProjection();
120
- viewProjection.multiplyByPoint(actualPosition, positionCC);
120
+ Matrix4.multiplyByPoint(viewProjection, actualPosition, positionCC);
121
121
 
122
122
  return SceneTransforms.clipToDrawingBufferCoordinates(scene.getContext(), positionCC, result);
123
123
  };
@@ -333,12 +333,12 @@ define(['Core/defaultValue', 'Core/defined', 'Core/destroyObject', 'Core/Develop
333
333
  var dir = new Cartesian4(camera.direction.x, camera.direction.y, camera.direction.z, 0.0);
334
334
  var up = new Cartesian4(camera.up.x, camera.up.y, camera.up.z, 0.0);
335
335
 
336
- var frame = transform.inverseTransformation().multiply(camera.transform);
336
+ var frame = Matrix4.multiply(Matrix4.inverseTransformation(transform), camera.transform);
337
337
  camera.transform = Matrix4.clone(transform);
338
338
 
339
- camera.position = Cartesian3.fromCartesian4(frame.multiplyByVector(pos));
340
- camera.direction = Cartesian3.fromCartesian4(frame.multiplyByVector(dir));
341
- camera.up = Cartesian3.fromCartesian4(frame.multiplyByVector(up));
339
+ camera.position = Cartesian3.fromCartesian4(Matrix4.multiplyByVector(frame, pos));
340
+ camera.direction = Cartesian3.fromCartesian4(Matrix4.multiplyByVector(frame, dir));
341
+ camera.up = Cartesian3.fromCartesian4(Matrix4.multiplyByVector(frame, up));
342
342
  camera.right = Cartesian3.cross(camera.direction, camera.up);
343
343
  }
344
344