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
@@ -38,6 +38,7 @@ define(['Core/defined', 'Core/DeveloperError', 'Core/Color', 'Core/defaultValue'
38
38
  var ROTATION_INDEX = Billboard.ROTATION_INDEX;
39
39
  var ALIGNED_AXIS_INDEX = Billboard.ALIGNED_AXIS_INDEX;
40
40
  var SCALE_BY_DISTANCE_INDEX = Billboard.SCALE_BY_DISTANCE_INDEX;
41
+ var TRANSLUCENCY_BY_DISTANCE_INDEX = Billboard.TRANSLUCENCY_BY_DISTANCE_INDEX;
41
42
  var NUMBER_OF_PROPERTIES = Billboard.NUMBER_OF_PROPERTIES;
42
43
 
43
44
  // PERFORMANCE_IDEA: Use vertex compression so we don't run out of
@@ -53,7 +54,8 @@ define(['Core/defined', 'Core/DeveloperError', 'Core/Color', 'Core/defaultValue'
53
54
  pickColor : 7, // pickColor and color shared an index because pickColor is only used during
54
55
  color : 7, // the 'pick' pass and 'color' is only used during the 'color' pass.
55
56
  rotationAndAlignedAxis : 8,
56
- scaleByDistance : 9
57
+ scaleByDistance : 9,
58
+ translucencyByDistance : 10
57
59
  };
58
60
 
59
61
  // Identifies to the VertexArrayFacade the attributes that are used only for the pick
@@ -131,6 +133,10 @@ define(['Core/defined', 'Core/DeveloperError', 'Core/Color', 'Core/defaultValue'
131
133
  this._compiledShaderScaleByDistance = false;
132
134
  this._compiledShaderScaleByDistancePick = false;
133
135
 
136
+ this._shaderTranslucencyByDistance = false;
137
+ this._compiledShaderTranslucencyByDistance = false;
138
+ this._compiledShaderTranslucencyByDistancePick = false;
139
+
134
140
  this._propertiesChanged = new Uint32Array(NUMBER_OF_PROPERTIES);
135
141
 
136
142
  this._maxSize = 0.0;
@@ -169,8 +175,8 @@ define(['Core/defined', 'Core/DeveloperError', 'Core/Color', 'Core/defaultValue'
169
175
  * billboards.add({ imageIndex: 0, position : new Cartesian3(0.0, 0.0, 1000000.0) }); // up
170
176
  * ]);
171
177
  */
172
- this.modelMatrix = Matrix4.IDENTITY.clone();
173
- this._modelMatrix = Matrix4.IDENTITY.clone();
178
+ this.modelMatrix = Matrix4.clone(Matrix4.IDENTITY);
179
+ this._modelMatrix = Matrix4.clone(Matrix4.IDENTITY);
174
180
 
175
181
  this._mode = SceneMode.SCENE3D;
176
182
  this._projection = undefined;
@@ -188,7 +194,8 @@ define(['Core/defined', 'Core/DeveloperError', 'Core/Color', 'Core/defaultValue'
188
194
  BufferUsage.STATIC_DRAW, // COLOR_INDEX
189
195
  BufferUsage.STATIC_DRAW, // ROTATION_INDEX
190
196
  BufferUsage.STATIC_DRAW, // ALIGNED_AXIS_INDEX
191
- BufferUsage.STATIC_DRAW // SCALE_BY_DISTANCE_INDEX
197
+ BufferUsage.STATIC_DRAW, // SCALE_BY_DISTANCE_INDEX
198
+ BufferUsage.STATIC_DRAW // TRANSLUCENCY_BY_DISTANCE_INDEX
192
199
  ];
193
200
 
194
201
  var that = this;
@@ -230,9 +237,9 @@ define(['Core/defined', 'Core/DeveloperError', 'Core/Color', 'Core/defaultValue'
230
237
  * horizontalOrigin : HorizontalOrigin.CENTER,
231
238
  * verticalOrigin : VerticalOrigin.CENTER,
232
239
  * scale : 1.0,
233
- * scaleByDistance : new NearFarScalar(5e6, 1.0, 2e7, 0.0),
234
240
  * imageIndex : 0,
235
- * color : Color.WHITE
241
+ * color : Color.WHITE,
242
+ * id : undefined
236
243
  * });
237
244
  *
238
245
  * // Example 2: Specify only the billboard's cartographic position.
@@ -660,6 +667,11 @@ define(['Core/defined', 'Core/DeveloperError', 'Core/Color', 'Core/defaultValue'
660
667
  componentsPerAttribute : 4,
661
668
  componentDatatype : ComponentDatatype.FLOAT,
662
669
  usage : buffersUsage[SCALE_BY_DISTANCE_INDEX]
670
+ }, {
671
+ index : attributeIndices.translucencyByDistance,
672
+ componentsPerAttribute : 4,
673
+ componentDatatype : ComponentDatatype.FLOAT,
674
+ usage : buffersUsage[TRANSLUCENCY_BY_DISTANCE_INDEX]
663
675
  }], 4 * numberOfBillboards); // 4 vertices per billboard
664
676
  }
665
677
 
@@ -844,9 +856,9 @@ define(['Core/defined', 'Core/DeveloperError', 'Core/Color', 'Core/defaultValue'
844
856
  var allPurposeWriters = vafWriters[allPassPurpose];
845
857
  var writer = allPurposeWriters[attributeIndices.scaleByDistance];
846
858
  var near = 0.0;
847
- var nearValue = 0.0;
848
- var far = 0.0;
849
- var farValue = 0.0;
859
+ var nearValue = 1.0;
860
+ var far = 1.0;
861
+ var farValue = 1.0;
850
862
 
851
863
  var scale = billboard.getScaleByDistance();
852
864
  if (defined(scale)) {
@@ -868,6 +880,35 @@ define(['Core/defined', 'Core/DeveloperError', 'Core/Color', 'Core/defaultValue'
868
880
  writer(i + 3, near, nearValue, far, farValue);
869
881
  }
870
882
 
883
+ function writeTranslucencyByDistance(billboardCollection, context, textureAtlasCoordinates, vafWriters, billboard) {
884
+ var i = billboard._index * 4;
885
+ var allPurposeWriters = vafWriters[allPassPurpose];
886
+ var writer = allPurposeWriters[attributeIndices.translucencyByDistance];
887
+ var near = 0.0;
888
+ var nearValue = 1.0;
889
+ var far = 1.0;
890
+ var farValue = 1.0;
891
+
892
+ var translucency = billboard.getTranslucencyByDistance();
893
+ if (defined(translucency)) {
894
+ near = translucency.near;
895
+ nearValue = translucency.nearValue;
896
+ far = translucency.far;
897
+ farValue = translucency.farValue;
898
+
899
+ if (nearValue !== 1.0 || farValue !== 1.0) {
900
+ // translucency by distance calculation in shader need not be enabled
901
+ // until a billboard with near and far !== 1.0 is found
902
+ billboardCollection._shaderTranslucencyByDistance = true;
903
+ }
904
+ }
905
+
906
+ writer(i + 0, near, nearValue, far, farValue);
907
+ writer(i + 1, near, nearValue, far, farValue);
908
+ writer(i + 2, near, nearValue, far, farValue);
909
+ writer(i + 3, near, nearValue, far, farValue);
910
+ }
911
+
871
912
  function writeBillboard(billboardCollection, context, textureAtlasCoordinates, vafWriters, billboard) {
872
913
  writePosition(billboardCollection, context, textureAtlasCoordinates, vafWriters, billboard);
873
914
  writePixelOffset(billboardCollection, context, textureAtlasCoordinates, vafWriters, billboard);
@@ -878,6 +919,7 @@ define(['Core/defined', 'Core/DeveloperError', 'Core/Color', 'Core/defaultValue'
878
919
  writeTextureCoordinatesAndImageSize(billboardCollection, context, textureAtlasCoordinates, vafWriters, billboard);
879
920
  writeRotationAndAlignedAxis(billboardCollection, context, textureAtlasCoordinates, vafWriters, billboard);
880
921
  writeScaleByDistance(billboardCollection, context, textureAtlasCoordinates, vafWriters, billboard);
922
+ writeTranslucencyByDistance(billboardCollection, context, textureAtlasCoordinates, vafWriters, billboard);
881
923
  }
882
924
 
883
925
  function recomputeActualPositions(billboardCollection, billboards, length, frameState, modelMatrix, recomputeBoundingVolume) {
@@ -920,11 +962,11 @@ define(['Core/defined', 'Core/DeveloperError', 'Core/Color', 'Core/defaultValue'
920
962
  if (billboardCollection._mode !== mode ||
921
963
  billboardCollection._projection !== projection ||
922
964
  mode !== SceneMode.SCENE3D &&
923
- !modelMatrix.equals(billboardCollection.modelMatrix)) {
965
+ !Matrix4.equals(modelMatrix, billboardCollection.modelMatrix)) {
924
966
 
925
967
  billboardCollection._mode = mode;
926
968
  billboardCollection._projection = projection;
927
- billboardCollection.modelMatrix.clone(modelMatrix);
969
+ Matrix4.clone(billboardCollection.modelMatrix, modelMatrix);
928
970
  billboardCollection._createVertexArray = true;
929
971
 
930
972
  if (mode === SceneMode.SCENE3D || mode === SceneMode.SCENE2D || mode === SceneMode.COLUMBUS_VIEW) {
@@ -1066,6 +1108,10 @@ define(['Core/defined', 'Core/DeveloperError', 'Core/Color', 'Core/defaultValue'
1066
1108
  writers.push(writeScaleByDistance);
1067
1109
  }
1068
1110
 
1111
+ if (properties[TRANSLUCENCY_BY_DISTANCE_INDEX]) {
1112
+ writers.push(writeTranslucencyByDistance);
1113
+ }
1114
+
1069
1115
  vafWriters = this._vaf.writers;
1070
1116
 
1071
1117
  if ((billboardsToUpdateLength / billboardsLength) > 0.1) {
@@ -1140,19 +1186,23 @@ define(['Core/defined', 'Core/DeveloperError', 'Core/Color', 'Core/defaultValue'
1140
1186
  });
1141
1187
  }
1142
1188
 
1143
- if (!defined(this._sp) || (this._shaderRotation && !this._compiledShaderRotation) ||
1144
- (this._shaderScaleByDistance && !this._compiledShaderScaleByDistance)) {
1189
+ if (!defined(this._sp) ||
1190
+ (this._shaderRotation && !this._compiledShaderRotation) ||
1191
+ (this._shaderScaleByDistance && !this._compiledShaderScaleByDistance) ||
1192
+ (this._shaderTranslucencyByDistance && !this._compiledShaderTranslucencyByDistance)) {
1145
1193
  this._sp = context.getShaderCache().replaceShaderProgram(
1146
1194
  this._sp,
1147
1195
  createShaderSource({
1148
1196
  defines : [this._shaderRotation ? 'ROTATION' : '',
1149
- this._shaderScaleByDistance ? 'EYE_DISTANCE_SCALING' : ''],
1197
+ this._shaderScaleByDistance ? 'EYE_DISTANCE_SCALING' : '',
1198
+ this._shaderTranslucencyByDistance ? 'EYE_DISTANCE_TRANSLUCENCY' : ''],
1150
1199
  sources : [BillboardCollectionVS]
1151
1200
  }),
1152
1201
  BillboardCollectionFS,
1153
1202
  attributeIndices);
1154
1203
  this._compiledShaderRotation = this._shaderRotation;
1155
1204
  this._compiledShaderScaleByDistance = this._shaderScaleByDistance;
1205
+ this._compiledShaderTranslucencyByDistance = this._shaderTranslucencyByDistance;
1156
1206
  }
1157
1207
 
1158
1208
  va = this._vaf.vaByPurpose[colorPassPurpose];
@@ -1182,13 +1232,15 @@ define(['Core/defined', 'Core/DeveloperError', 'Core/Color', 'Core/defaultValue'
1182
1232
 
1183
1233
  if (!defined(this._spPick) ||
1184
1234
  (this._shaderRotation && !this._compiledShaderRotationPick) ||
1185
- (this._shaderScaleByDistance && !this._compiledShaderScaleByDistancePick)) {
1235
+ (this._shaderScaleByDistance && !this._compiledShaderScaleByDistancePick) ||
1236
+ (this._shaderTranslucencyByDistance && !this._compiledShaderTranslucencyByDistancePick)) {
1186
1237
  this._spPick = context.getShaderCache().replaceShaderProgram(
1187
1238
  this._spPick,
1188
1239
  createShaderSource({
1189
1240
  defines : ['RENDER_FOR_PICK',
1190
1241
  this._shaderRotation ? 'ROTATION' : '',
1191
- this._shaderScaleByDistance ? 'EYE_DISTANCE_SCALING' : ''],
1242
+ this._shaderScaleByDistance ? 'EYE_DISTANCE_SCALING' : '',
1243
+ this._shaderTranslucencyByDistance ? 'EYE_DISTANCE_TRANSLUCENCY' : ''],
1192
1244
  sources : [BillboardCollectionVS]
1193
1245
  }),
1194
1246
  createShaderSource({
@@ -1198,6 +1250,7 @@ define(['Core/defined', 'Core/DeveloperError', 'Core/Color', 'Core/defaultValue'
1198
1250
  attributeIndices);
1199
1251
  this._compiledShaderRotationPick = this._shaderRotation;
1200
1252
  this._compiledShaderScaleByDistancePick = this._shaderScaleByDistance;
1253
+ this._compiledShaderTranslucencyByDistancePick = this._shaderTranslucencyByDistance;
1201
1254
  }
1202
1255
 
1203
1256
  va = this._vaf.vaByPurpose[pickPassPurpose];
@@ -145,8 +145,8 @@ define(['Core/defined', 'Core/defineProperties', 'Core/DeveloperError', 'Core/Ma
145
145
  u.x, u.y, u.z, -Cartesian3.dot(u, e),
146
146
  -d.x, -d.y, -d.z, Cartesian3.dot(d, e),
147
147
  0.0, 0.0, 0.0, 1.0);
148
- camera._viewMatrix = viewMatrix.multiply(camera._invTransform);
149
- camera._invViewMatrix = camera._viewMatrix.inverseTransformation();
148
+ camera._viewMatrix = Matrix4.multiply(viewMatrix, camera._invTransform);
149
+ camera._invViewMatrix = Matrix4.inverseTransformation(camera._viewMatrix);
150
150
  }
151
151
 
152
152
  function update(camera) {
@@ -179,11 +179,11 @@ define(['Core/defined', 'Core/defineProperties', 'Core/DeveloperError', 'Core/Ma
179
179
  if (transformChanged) {
180
180
  transform = camera._transform = Matrix4.clone(camera.transform);
181
181
 
182
- camera._invTransform = camera._transform.inverseTransformation();
182
+ camera._invTransform = Matrix4.inverseTransformation(camera._transform);
183
183
  }
184
184
 
185
185
  if (positionChanged || transformChanged) {
186
- camera._positionWC = Cartesian3.fromCartesian4(transform.multiplyByPoint(position), camera._positionWC);
186
+ camera._positionWC = Cartesian3.fromCartesian4(Matrix4.multiplyByPoint(transform, position), camera._positionWC);
187
187
  }
188
188
 
189
189
  if (directionChanged || upChanged || rightChanged) {
@@ -205,15 +205,15 @@ define(['Core/defined', 'Core/defineProperties', 'Core/DeveloperError', 'Core/Ma
205
205
  }
206
206
 
207
207
  if (directionChanged || transformChanged) {
208
- camera._directionWC = Cartesian3.fromCartesian4(transform.multiplyByVector(new Cartesian4(direction.x, direction.y, direction.z, 0.0)));
208
+ camera._directionWC = Cartesian3.fromCartesian4(Matrix4.multiplyByVector(transform, new Cartesian4(direction.x, direction.y, direction.z, 0.0)));
209
209
  }
210
210
 
211
211
  if (upChanged || transformChanged) {
212
- camera._upWC = Cartesian3.fromCartesian4(transform.multiplyByVector(new Cartesian4(up.x, up.y, up.z, 0.0)));
212
+ camera._upWC = Cartesian3.fromCartesian4(Matrix4.multiplyByVector(transform, new Cartesian4(up.x, up.y, up.z, 0.0)));
213
213
  }
214
214
 
215
215
  if (rightChanged || transformChanged) {
216
- camera._rightWC = Cartesian3.fromCartesian4(transform.multiplyByVector(new Cartesian4(right.x, right.y, right.z, 0.0)));
216
+ camera._rightWC = Cartesian3.fromCartesian4(Matrix4.multiplyByVector(transform, new Cartesian4(right.x, right.y, right.z, 0.0)));
217
217
  }
218
218
 
219
219
  if (positionChanged || directionChanged || upChanged || rightChanged || transformChanged) {
@@ -1,5 +1,5 @@
1
1
  /*global define*/
2
- define(['Core/defaultValue', 'Core/defined', 'Core/defineProperties', 'Core/Cartesian2', 'Core/Cartesian3', 'Core/Cartesian4', 'Core/Cartographic', 'Core/DeveloperError', 'Core/Ellipsoid', 'Core/GeographicProjection', 'Core/IntersectionTests', 'Core/Math', 'Core/Matrix3', 'Core/Matrix4', 'Core/Quaternion', 'Core/Ray', 'Scene/SceneMode', 'ThirdParty/Tween'], function(
2
+ define(['Core/defaultValue', 'Core/defined', 'Core/defineProperties', 'Core/Cartesian2', 'Core/Cartesian3', 'Core/Cartesian4', 'Core/Cartographic', 'Core/DeveloperError', 'Core/Ellipsoid', 'Core/GeographicProjection', 'Core/IntersectionTests', 'Core/Math', 'Core/Matrix3', 'Core/Matrix4', 'Core/Quaternion', 'Core/Ray', 'Core/Transforms', 'Scene/SceneMode', 'ThirdParty/Tween'], function(
3
3
  defaultValue,
4
4
  defined,
5
5
  defineProperties,
@@ -16,6 +16,7 @@ define(['Core/defaultValue', 'Core/defined', 'Core/defineProperties', 'Core/Cart
16
16
  Matrix4,
17
17
  Quaternion,
18
18
  Ray,
19
+ Transforms,
19
20
  SceneMode,
20
21
  Tween) {
21
22
  "use strict";
@@ -343,7 +344,8 @@ define(['Core/defaultValue', 'Core/defined', 'Core/defineProperties', 'Core/Cart
343
344
  }
344
345
 
345
346
  var turnAngle = defaultValue(angle, this.defaultLookAmount);
346
- var rotation = Matrix3.fromQuaternion(Quaternion.fromAxisAngle(axis, turnAngle, lookScratchQuaternion), lookScratchMatrix);
347
+ var quaternion = Quaternion.fromAxisAngle(axis, -turnAngle, lookScratchQuaternion);
348
+ var rotation = Matrix3.fromQuaternion(quaternion, lookScratchMatrix);
347
349
 
348
350
  var direction = this._camera.direction;
349
351
  var up = this._camera.up;
@@ -396,7 +398,7 @@ define(['Core/defaultValue', 'Core/defined', 'Core/defineProperties', 'Core/Cart
396
398
  var direction = Cartesian3.clone(camera.directionWC, appendTransformDirection);
397
399
 
398
400
  oldTransform = camera.transform;
399
- camera.transform = transform.multiply(oldTransform);
401
+ camera.transform = Matrix4.multiply(transform, oldTransform);
400
402
 
401
403
  var invTransform = camera.inverseTransform;
402
404
  Cartesian3.clone(Matrix4.multiplyByVector(invTransform, position, position), camera.position);
@@ -462,7 +464,8 @@ define(['Core/defaultValue', 'Core/defined', 'Core/defineProperties', 'Core/Cart
462
464
  var camera = this._camera;
463
465
 
464
466
  var turnAngle = defaultValue(angle, this.defaultRotateAmount);
465
- var rotation = Matrix3.fromQuaternion(Quaternion.fromAxisAngle(axis, turnAngle, rotateScratchQuaternion), rotateScratchMatrix);
467
+ var quaternion = Quaternion.fromAxisAngle(axis, -turnAngle, rotateScratchQuaternion);
468
+ var rotation = Matrix3.fromQuaternion(quaternion, rotateScratchMatrix);
466
469
 
467
470
  var oldTransform = appendTransform(this, transform);
468
471
  Matrix3.multiplyByVector(rotation, camera.position, camera.position);
@@ -736,12 +739,20 @@ define(['Core/defaultValue', 'Core/defined', 'Core/defineProperties', 'Core/Cart
736
739
  return Math.atan2(camera.right.y, camera.right.x);
737
740
  }
738
741
 
739
- var scratchHeadingCartesian4 = new Cartesian4();
742
+ var scratchHeadingMatrix4 = new Matrix4();
743
+ var scratchHeadingMatrix3 = new Matrix3();
744
+ var scratchHeadingCartesian3 = new Cartesian3();
740
745
 
741
746
  function getHeading3D(controller) {
742
747
  var camera = controller._camera;
743
- var z = Matrix4.multiplyByVector(camera.viewMatrix, Cartesian4.UNIT_Z, scratchHeadingCartesian4);
744
- return CesiumMath.PI_OVER_TWO - Math.atan2(z.y, z.x);
748
+
749
+ var ellipsoid = controller._projection.getEllipsoid();
750
+ var toFixedFrame = Transforms.eastNorthUpToFixedFrame(camera.position, ellipsoid, scratchHeadingMatrix4);
751
+ var transform = Matrix4.getRotation(toFixedFrame, scratchHeadingMatrix3);
752
+ Matrix3.transpose(transform, transform);
753
+
754
+ var right = Matrix3.multiplyByVector(transform, camera.right, scratchHeadingCartesian3);
755
+ return Math.atan2(right.y, right.x);
745
756
  }
746
757
 
747
758
  function setHeading2D(controller, angle) {
@@ -968,7 +979,7 @@ define(['Core/defaultValue', 'Core/defined', 'Core/defineProperties', 'Core/Cart
968
979
  var west = extent.west;
969
980
 
970
981
  var transform = Matrix4.clone(camera.transform, viewExtentCVTransform);
971
- transform.setColumn(3, Cartesian4.UNIT_W);
982
+ Matrix4.setColumn(transform, 3, Cartesian4.UNIT_W);
972
983
  var invTransform = camera.inverseTransform;
973
984
 
974
985
  var cart = viewExtentCVCartographic;
@@ -1350,7 +1361,7 @@ define(['Core/defaultValue', 'Core/defined', 'Core/defineProperties', 'Core/Cart
1350
1361
  var updateCV = function(value) {
1351
1362
  var interp = Cartesian3.lerp(position, newPosition, value.time);
1352
1363
  var pos = new Cartesian4(interp.x, interp.y, interp.z, 1.0);
1353
- camera.position = Cartesian3.fromCartesian4(camera.inverseTransform.multiplyByVector(pos));
1364
+ camera.position = Cartesian3.fromCartesian4(Matrix4.multiplyByVector(camera.inverseTransform, pos));
1354
1365
  };
1355
1366
 
1356
1367
  return {
@@ -1371,14 +1382,14 @@ define(['Core/defaultValue', 'Core/defined', 'Core/defineProperties', 'Core/Cart
1371
1382
  var position = camera.position;
1372
1383
  var direction = camera.direction;
1373
1384
 
1374
- var normal = Cartesian3.fromCartesian4(camera.inverseTransform.multiplyByVector(Cartesian4.UNIT_X));
1385
+ var normal = Cartesian3.fromCartesian4(Matrix4.multiplyByVector(camera.inverseTransform, Cartesian4.UNIT_X));
1375
1386
  var scalar = -Cartesian3.dot(normal, position) / Cartesian3.dot(normal, direction);
1376
1387
  var center = Cartesian3.add(position, Cartesian3.multiplyByScalar(direction, scalar));
1377
1388
  center = new Cartesian4(center.x, center.y, center.z, 1.0);
1378
- var centerWC = camera.transform.multiplyByVector(center);
1389
+ var centerWC = Matrix4.multiplyByVector(camera.transform, center);
1379
1390
 
1380
1391
  var cameraPosition = new Cartesian4(camera.position.x, camera.position.y, camera.position.z, 1.0);
1381
- var positionWC = camera.transform.multiplyByVector(cameraPosition);
1392
+ var positionWC = Matrix4.multiplyByVector(camera.transform, cameraPosition);
1382
1393
 
1383
1394
  var tanPhi = Math.tan(controller._camera.frustum.fovy * 0.5);
1384
1395
  var tanTheta = controller._camera.frustum.aspectRatio * tanPhi;
@@ -144,7 +144,7 @@ define(['Core/Cartesian2', 'Core/Cartesian3', 'Core/clone', 'Core/defaultValue',
144
144
  }];
145
145
 
146
146
  angle = Math.acos(Cartesian3.dot(Cartesian3.normalize(afterStart), Cartesian3.normalize(aboveEnd)));
147
- axis = Cartesian3.cross(afterStart, aboveEnd);
147
+ axis = Cartesian3.cross(aboveEnd, afterStart);
148
148
  if (Cartesian3.equalsEpsilon(axis, Cartesian3.ZERO, CesiumMath.EPSILON6)) {
149
149
  axis = Cartesian3.UNIT_Z;
150
150
  }
@@ -154,7 +154,7 @@ define(['Core/Cartesian2', 'Core/Cartesian3', 'Core/clone', 'Core/defaultValue',
154
154
  for ( var i = startCondition; i > 0.0; i = i - increment) {
155
155
  rotation = Matrix3.fromQuaternion(Quaternion.fromAxisAngle(axis, i));
156
156
  points.push({
157
- point : rotation.multiplyByVector(aboveEnd)
157
+ point : Matrix3.multiplyByVector(rotation, aboveEnd)
158
158
  });
159
159
  }
160
160
 
@@ -212,9 +212,9 @@ define(['Core/Cartesian2', 'Core/Cartesian3', 'Core/clone', 'Core/defaultValue',
212
212
  Matrix3.fromQuaternion(orientation, rotMatrix);
213
213
 
214
214
  camera.position = path.evaluate(time, camera.position);
215
- camera.right = rotMatrix.getRow(0, camera.right);
216
- camera.up = rotMatrix.getRow(1, camera.up);
217
- camera.direction = Cartesian3.negate(rotMatrix.getRow(2, camera.direction), camera.direction);
215
+ camera.right = Matrix3.getRow(rotMatrix, 0, camera.right);
216
+ camera.up = Matrix3.getRow(rotMatrix, 1, camera.up);
217
+ camera.direction = Cartesian3.negate(Matrix3.getRow(rotMatrix, 2, camera.direction), camera.direction);
218
218
  };
219
219
 
220
220
  return update;
@@ -328,9 +328,9 @@ define(['Core/Cartesian2', 'Core/Cartesian3', 'Core/clone', 'Core/defaultValue',
328
328
  Matrix3.fromQuaternion(orientation, rotMatrix);
329
329
 
330
330
  camera.position = path.evaluate(time, camera.position);
331
- camera.right = rotMatrix.getRow(0, camera.right);
332
- camera.up = rotMatrix.getRow(1, camera.up);
333
- camera.direction = Cartesian3.negate(rotMatrix.getRow(2, camera.direction), camera.direction);
331
+ camera.right = Matrix3.getRow(rotMatrix, 0, camera.right);
332
+ camera.up = Matrix3.getRow(rotMatrix, 1, camera.up);
333
+ camera.direction = Cartesian3.negate(Matrix3.getRow(rotMatrix, 2, camera.direction), camera.direction);
334
334
  };
335
335
 
336
336
  return update;
@@ -358,9 +358,9 @@ define(['Core/Cartesian2', 'Core/Cartesian3', 'Core/clone', 'Core/defaultValue',
358
358
  var zoom = camera.position.z;
359
359
  camera.position.z = height;
360
360
 
361
- camera.right = rotMatrix.getRow(0, camera.right);
362
- camera.up = rotMatrix.getRow(1, camera.up);
363
- camera.direction = Cartesian3.negate(rotMatrix.getRow(2, camera.direction), camera.direction);
361
+ camera.right = Matrix3.getRow(rotMatrix, 0, camera.right);
362
+ camera.up = Matrix3.getRow(rotMatrix, 1, camera.up);
363
+ camera.direction = Cartesian3.negate(Matrix3.getRow(rotMatrix, 2, camera.direction), camera.direction);
364
364
 
365
365
  var frustum = camera.frustum;
366
366
  var ratio = frustum.top / frustum.right;
@@ -849,7 +849,7 @@ define(['Core/defaultValue', 'Core/defined', 'Core/destroyObject', 'Core/Boundin
849
849
  centerEye.w = 1.0;
850
850
 
851
851
  Matrix4.multiplyByVector(viewMatrix, centerEye, centerEye);
852
- viewMatrix.setColumn(3, centerEye, modifiedModelViewScratch);
852
+ Matrix4.setColumn(viewMatrix, 3, centerEye, modifiedModelViewScratch);
853
853
 
854
854
  var tileImageryCollection = tile.imagery;
855
855
  var imageryIndex = 0;
@@ -181,6 +181,18 @@ define(['Core/defaultValue', 'Core/defined', 'Core/DeveloperError', 'Core/Color'
181
181
  */
182
182
  this.intersectionWidth = defaultValue(options.intersectionWidth, 5.0);
183
183
 
184
+ /**
185
+ * User-defined object returned when the sensors is picked.
186
+ *
187
+ * @type Object
188
+ *
189
+ * @default undefined
190
+ *
191
+ * @see Scene#pick
192
+ */
193
+ this.id = options.id;
194
+ this._id = undefined;
195
+
184
196
  var that = this;
185
197
  this._uniforms = {
186
198
  u_showThroughEllipsoid : function() {
@@ -444,9 +456,12 @@ define(['Core/defaultValue', 'Core/defined', 'Core/DeveloperError', 'Core/Color'
444
456
  if (pass.pick) {
445
457
  var pickCommand = this._pickCommand;
446
458
 
447
- if (!defined(this._pickId)) {
459
+ if (!defined(this._pickId) || (this._id !== this.id)) {
460
+ this._id = this.id;
461
+ this._pickId = this._pickId && this._pickId.destroy();
448
462
  this._pickId = context.createPickId({
449
- primitive : this._pickIdThis
463
+ primitive : this._pickIdThis,
464
+ id : this.id
450
465
  });
451
466
  }
452
467
 
@@ -1,5 +1,6 @@
1
1
  /*global define*/
2
- define(['Core/BoxGeometry', 'Core/Cartesian3', 'Core/Cartesian4', 'Core/combine', 'Core/defined', 'Core/DeveloperError', 'Core/destroyObject', 'Core/Matrix4', 'Core/BoundingSphere', 'Core/PrimitiveType', 'Renderer/CullFace', 'Renderer/BlendingState', 'Renderer/BufferUsage', 'Renderer/CommandLists', 'Renderer/DrawCommand', 'Renderer/createShaderSource', 'Scene/Material', 'Scene/SceneMode', 'Shaders/EllipsoidVS', 'Shaders/EllipsoidFS'], function(
2
+ define(['Core/defaultValue', 'Core/BoxGeometry', 'Core/Cartesian3', 'Core/Cartesian4', 'Core/combine', 'Core/defined', 'Core/DeveloperError', 'Core/destroyObject', 'Core/Matrix4', 'Core/BoundingSphere', 'Core/PrimitiveType', 'Renderer/CullFace', 'Renderer/BlendingState', 'Renderer/BufferUsage', 'Renderer/CommandLists', 'Renderer/DrawCommand', 'Renderer/createShaderSource', 'Scene/Material', 'Scene/SceneMode', 'Shaders/EllipsoidVS', 'Shaders/EllipsoidFS'], function(
3
+ defaultValue,
3
4
  BoxGeometry,
4
5
  Cartesian3,
5
6
  Cartesian4,
@@ -35,13 +36,20 @@ define(['Core/BoxGeometry', 'Core/Cartesian3', 'Core/Cartesian4', 'Core/combine'
35
36
  * @alias EllipsoidPrimitive
36
37
  * @constructor
37
38
  *
39
+ * @param {Cartesian3} [options.center=Cartesian3.ZERO] The center of the ellipsoid in the ellipsoid's model coordinates.
40
+ * @param {Cartesian3} [options.radii=undefined] The radius of the ellipsoid along the <code>x</code>, <code>y</code>, and <code>z</code> axes in the ellipsoid's model coordinates.
41
+ * @param {Matrix4} [options.modelMatrix=Matrix4.IDENTITY] The 4x4 transformation matrix that transforms the ellipsoid from model to world coordinates.
42
+ * @param {Boolean} [options.show=true] Determines if this primitive will be shown.
43
+ * @param {Material} [options.material=Material.ColorType] The surface appearance of the primitive.
44
+ * @param {Object} [options.id=undefined] A user-defined object to return when the instance is picked with {@link Scene#pick}
45
+ *
38
46
  * @example
39
47
  * // 1. Create a sphere using the ellipsoid primitive
40
- * var e = new EllipsoidPrimitive();
41
- * e.center = ellipsoid.cartographicToCartesian(
42
- * Cartographic.fromDegrees(-75.0, 40.0, 500000.0));
43
- * e.radii = new Cartesian3(500000.0, 500000.0, 500000.0);
44
- * primitives.add(e);
48
+ * primitives.add(new EllipsoidPrimitive({
49
+ * center : ellipsoid.cartographicToCartesian(
50
+ * Cartographic.fromDegrees(-75.0, 40.0, 500000.0)),
51
+ * radii : new Cartesian3(500000.0, 500000.0, 500000.0)
52
+ * }));
45
53
  *
46
54
  * @example
47
55
  * // 2. Create a tall ellipsoid in an east-north-up reference frame
@@ -54,7 +62,9 @@ define(['Core/BoxGeometry', 'Core/Cartesian3', 'Core/Cartesian4', 'Core/combine'
54
62
  *
55
63
  * @demo <a href="http://cesium.agi.com/Cesium/Apps/Sandcastle/index.html?src=Volumes.html">Cesium Sandcastle Volumes Demo</a>
56
64
  */
57
- var EllipsoidPrimitive = function() {
65
+ var EllipsoidPrimitive = function(options) {
66
+ options = defaultValue(options, defaultValue.EMPTY_OBJECT);
67
+
58
68
  /**
59
69
  * The center of the ellipsoid in the ellipsoid's model coordinates.
60
70
  * <p>
@@ -66,7 +76,7 @@ define(['Core/BoxGeometry', 'Core/Cartesian3', 'Core/Cartesian4', 'Core/combine'
66
76
  *
67
77
  * @see EllipsoidPrimitive#modelMatrix
68
78
  */
69
- this.center = Cartesian3.clone(Cartesian3.ZERO);
79
+ this.center = Cartesian3.clone(defaultValue(options.center, Cartesian3.ZERO));
70
80
 
71
81
  /**
72
82
  * The radius of the ellipsoid along the <code>x</code>, <code>y</code>, and <code>z</code> axes in the ellipsoid's model coordinates.
@@ -84,7 +94,7 @@ define(['Core/BoxGeometry', 'Core/Cartesian3', 'Core/Cartesian4', 'Core/combine'
84
94
  *
85
95
  * @see EllipsoidPrimitive#modelMatrix
86
96
  */
87
- this.radii = undefined;
97
+ this.radii = Cartesian3.clone(options.radii);
88
98
  this._radii = new Cartesian3();
89
99
 
90
100
  this._oneOverEllipsoidRadiiSquared = new Cartesian3();
@@ -110,8 +120,8 @@ define(['Core/BoxGeometry', 'Core/Cartesian3', 'Core/Cartesian4', 'Core/combine'
110
120
  * @see Transforms.eastNorthUpToFixedFrame
111
121
  * @see czm_model
112
122
  */
113
- this.modelMatrix = Matrix4.IDENTITY.clone();
114
- this._computedModelMatrix = Matrix4.IDENTITY.clone();
123
+ this.modelMatrix = Matrix4.clone(defaultValue(options.modelMatrix, Matrix4.IDENTITY));
124
+ this._computedModelMatrix = new Matrix4();
115
125
 
116
126
  /**
117
127
  * Determines if the ellipsoid primitive will be shown.
@@ -119,7 +129,7 @@ define(['Core/BoxGeometry', 'Core/Cartesian3', 'Core/Cartesian4', 'Core/combine'
119
129
  * @type {Boolean}
120
130
  * @default true
121
131
  */
122
- this.show = true;
132
+ this.show = defaultValue(options.show, true);
123
133
 
124
134
  /**
125
135
  * The surface appearance of the ellipsoid. This can be one of several built-in {@link Material} objects or a custom material, scripted with
@@ -140,9 +150,31 @@ define(['Core/BoxGeometry', 'Core/Cartesian3', 'Core/Cartesian4', 'Core/combine'
140
150
  *
141
151
  * @see <a href='https://github.com/AnalyticalGraphicsInc/cesium/wiki/Fabric'>Fabric</a>
142
152
  */
143
- this.material = Material.fromType(Material.ColorType);
153
+ this.material = defaultValue(options.material, Material.fromType(Material.ColorType));
144
154
  this._material = undefined;
145
155
 
156
+ /**
157
+ * User-defined object returned when the ellipsoid is picked.
158
+ *
159
+ * @type Object
160
+ *
161
+ * @default undefined
162
+ *
163
+ * @see Scene#pick
164
+ */
165
+ this.id = options.id;
166
+ this._id = undefined;
167
+
168
+ /**
169
+ * @private
170
+ */
171
+ this.onlySunLighting = defaultValue(options.onlySunLighting, false);
172
+ this._onlySunLighting = false;
173
+
174
+ this._owner = options._owner;
175
+ this._executeInClosestFrustum = defaultValue(options._executeInClosestFrustum, true);
176
+ this._writeDepth = defaultValue(options._writeDepth, false);
177
+
146
178
  this._sp = undefined;
147
179
  this._rs = undefined;
148
180
  this._va = undefined;
@@ -224,10 +256,15 @@ define(['Core/BoxGeometry', 'Core/Cartesian3', 'Core/Cartesian4', 'Core/combine'
224
256
  },
225
257
  // Do not write depth since the depth for the bounding box is
226
258
  // wrong; it is not the true of the ray casted ellipsoid.
227
- // Once WebGL has the extension for writing gl_FragDepth,
228
- // we can write the correct depth. For now, most ellipsoids
229
- // will be translucent so we don't want to write depth anyway.
230
- depthMask : false,
259
+ // For now, most ellipsoids will be translucent so we don't want
260
+ // to write depth anyway.
261
+ //
262
+ // For ellipsoids that we know are opaque and the EXT_frag_depth
263
+ // extension is available, we can set _writeDepth to true. This is
264
+ // a workaround and should be updated when we know which primitives
265
+ // are translucent.
266
+ // See the road map: https://github.com/AnalyticalGraphicsInc/cesium/wiki/Data-Driven-Renderer-Details
267
+ depthMask : this._writeDepth && context.getFragmentDepth(),
231
268
  blending : BlendingState.ALPHA_BLEND
232
269
  });
233
270
  }
@@ -258,12 +295,21 @@ define(['Core/BoxGeometry', 'Core/Cartesian3', 'Core/Cartesian4', 'Core/combine'
258
295
  this._material = this.material;
259
296
  this._material.update(context);
260
297
 
298
+ var lightingChanged = this.onlySunLighting !== this._onlySunLighting;
299
+ this._onlySunLighting = this.onlySunLighting;
300
+
261
301
  if (frameState.passes.color) {
262
302
  var colorCommand = this._colorCommand;
263
303
 
264
304
  // Recompile shader when material changes
265
- if (materialChanged) {
266
- var colorFS = createShaderSource({ sources : [this.material.shaderSource, EllipsoidFS] });
305
+ if (materialChanged || lightingChanged) {
306
+ var colorFS = createShaderSource({
307
+ defines : [
308
+ this.onlySunLighting ? 'ONLY_SUN_LIGHTING' : '',
309
+ (this._writeDepth && context.getFragmentDepth()) ? 'WRITE_DEPTH' : ''
310
+ ],
311
+ sources : [this.material.shaderSource, EllipsoidFS] }
312
+ );
267
313
 
268
314
  this._sp = context.getShaderCache().replaceShaderProgram(this._sp, EllipsoidVS, colorFS, attributeIndices);
269
315
 
@@ -272,7 +318,8 @@ define(['Core/BoxGeometry', 'Core/Cartesian3', 'Core/Cartesian4', 'Core/combine'
272
318
  colorCommand.renderState = this._rs;
273
319
  colorCommand.shaderProgram = this._sp;
274
320
  colorCommand.uniformMap = combine([this._uniforms, this.material._uniforms], false, false);
275
- colorCommand.executeInClosestFrustum = true;
321
+ colorCommand.executeInClosestFrustum = this._executeInClosestFrustum;
322
+ colorCommand.owner = defaultValue(this._owner, this);
276
323
  }
277
324
 
278
325
  colorCommand.boundingVolume = this._boundingSphere;
@@ -284,15 +331,22 @@ define(['Core/BoxGeometry', 'Core/Cartesian3', 'Core/Cartesian4', 'Core/combine'
284
331
  if (frameState.passes.pick) {
285
332
  var pickCommand = this._pickCommand;
286
333
 
287
- if (!defined(this._pickId)) {
334
+ if (!defined(this._pickId) || (this._id !== this.id)) {
335
+ this._id = this.id;
336
+ this._pickId = this._pickId && this._pickId.destroy();
288
337
  this._pickId = context.createPickId({
289
- primitive : this
338
+ primitive : this,
339
+ id : this.id
290
340
  });
291
341
  }
292
342
 
293
343
  // Recompile shader when material changes
294
- if (materialChanged || !defined(this._pickSP)) {
344
+ if (materialChanged || lightingChanged || !defined(this._pickSP)) {
295
345
  var pickFS = createShaderSource({
346
+ defines : [
347
+ this.onlySunLighting ? 'ONLY_SUN_LIGHTING' : '',
348
+ (this._writeDepth && context.getFragmentDepth()) ? 'WRITE_DEPTH' : ''
349
+ ],
296
350
  sources : [this.material.shaderSource, EllipsoidFS],
297
351
  pickColorQualifier : 'uniform'
298
352
  });
@@ -304,7 +358,8 @@ define(['Core/BoxGeometry', 'Core/Cartesian3', 'Core/Cartesian4', 'Core/combine'
304
358
  pickCommand.renderState = this._rs;
305
359
  pickCommand.shaderProgram = this._pickSP;
306
360
  pickCommand.uniformMap = combine([this._uniforms, this._pickUniforms, this.material._uniforms], false, false);
307
- pickCommand.executeInClosestFrustum = true;
361
+ pickCommand.executeInClosestFrustum = this._executeInClosestFrustum;
362
+ pickCommand.owner = defaultValue(this._owner, this);
308
363
  }
309
364
 
310
365
  pickCommand.boundingVolume = this._boundingSphere;