Skip to content

Commit c932599

Browse files
author
hpinkos
committed
check undefined attributes
1 parent 6575cec commit c932599

9 files changed

+436
-22
lines changed

CHANGES.md

+1
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ Change Log
4444
* Fixed animation for glTF models with missing animation targets. [#6351](https://github.com/AnalyticalGraphicsInc/cesium/pull/6351)
4545
* Fixed occlusion when `globe.show` is `false`. [#6374](https://github.com/AnalyticalGraphicsInc/cesium/pull/6374)
4646
* Fixed double-sided flag for glTF materials with `BLEND` enabled. [#6371](https://github.com/AnalyticalGraphicsInc/cesium/pull/6371)
47+
* Fixed crash for entities with static geometry and time-dynamic attributes [#6377](https://github.com/AnalyticalGraphicsInc/cesium/pull/6377)
4748

4849
### 1.43 - 2018-03-01
4950

Source/DataSources/StaticGeometryColorBatch.js

+4-3
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ define([
2828

2929
var colorScratch = new Color();
3030
var distanceDisplayConditionScratch = new DistanceDisplayCondition();
31+
var defaultDistanceDisplayCondition = new DistanceDisplayCondition();
3132

3233
function Batch(primitives, translucent, appearanceType, depthFailAppearanceType, depthFailMaterialProperty, closed, shadows) {
3334
this.translucent = translucent;
@@ -208,7 +209,7 @@ define([
208209

209210
if (!updater.fillMaterialProperty.isConstant || waitingOnCreate) {
210211
var colorProperty = updater.fillMaterialProperty.color;
211-
var resultColor = colorProperty.getValue(time, colorScratch);
212+
var resultColor = Property.getValueOrDefault(colorProperty, time, Color.WHITE, colorScratch);
212213
if (!Color.equals(attributes._lastColor, resultColor)) {
213214
attributes._lastColor = Color.clone(resultColor, attributes._lastColor);
214215
attributes.color = ColorGeometryInstanceAttribute.toValue(resultColor, attributes.color);
@@ -220,7 +221,7 @@ define([
220221

221222
if (defined(this.depthFailAppearanceType) && updater.depthFailMaterialProperty instanceof ColorMaterialProperty && (!updater.depthFailMaterialProperty.isConstant || waitingOnCreate)) {
222223
var depthFailColorProperty = updater.depthFailMaterialProperty.color;
223-
var depthColor = depthFailColorProperty.getValue(time, colorScratch);
224+
var depthColor = Property.getValueOrDefault(depthFailColorProperty, time, Color.WHITE, colorScratch);
224225
if (!Color.equals(attributes._lastDepthFailColor, depthColor)) {
225226
attributes._lastDepthFailColor = Color.clone(depthColor, attributes._lastDepthFailColor);
226227
attributes.depthFailColor = ColorGeometryInstanceAttribute.toValue(depthColor, attributes.depthFailColor);
@@ -235,7 +236,7 @@ define([
235236

236237
var distanceDisplayConditionProperty = updater.distanceDisplayConditionProperty;
237238
if (!Property.isConstant(distanceDisplayConditionProperty)) {
238-
var distanceDisplayCondition = distanceDisplayConditionProperty.getValue(time, distanceDisplayConditionScratch);
239+
var distanceDisplayCondition = Property.getValueOrDefault(distanceDisplayConditionProperty, time, defaultDistanceDisplayCondition, distanceDisplayConditionScratch);
239240
if (!DistanceDisplayCondition.equals(distanceDisplayCondition, attributes._lastDistanceDisplayCondition)) {
240241
attributes._lastDistanceDisplayCondition = DistanceDisplayCondition.clone(distanceDisplayCondition, attributes._lastDistanceDisplayCondition);
241242
attributes.distanceDisplayCondition = DistanceDisplayConditionGeometryInstanceAttribute.toValue(distanceDisplayCondition, attributes.distanceDisplayCondition);

Source/DataSources/StaticGeometryPerMaterialBatch.js

+7-6
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ define([
2727
'use strict';
2828

2929
var distanceDisplayConditionScratch = new DistanceDisplayCondition();
30+
var defaultDistanceDisplayCondition = new DistanceDisplayCondition();
3031

3132
function Batch(primitives, appearanceType, materialProperty, depthFailAppearanceType, depthFailMaterialProperty, closed, shadows) {
3233
this.primitives = primitives;
@@ -213,12 +214,12 @@ define([
213214
this.attributes.set(instance.id.id, attributes);
214215
}
215216

216-
if (defined(this.depthFailAppearanceType) && this.depthFailAppearanceType instanceof ColorMaterialProperty && !updater.depthFailMaterialProperty.isConstant) {
217+
if (defined(this.depthFailAppearanceType) && this.depthFailMaterialProperty instanceof ColorMaterialProperty && !updater.depthFailMaterialProperty.isConstant) {
217218
var depthFailColorProperty = updater.depthFailMaterialProperty.color;
218-
depthFailColorProperty.getValue(time, colorScratch);
219-
if (!Color.equals(attributes._lastDepthFailColor, colorScratch)) {
220-
attributes._lastDepthFailColor = Color.clone(colorScratch, attributes._lastDepthFailColor);
221-
attributes.depthFailColor = ColorGeometryInstanceAttribute.toValue(colorScratch, attributes.depthFailColor);
219+
var depthFailColor = Property.getValueOrDefault(depthFailColorProperty, time, Color.WHITE, colorScratch);
220+
if (!Color.equals(attributes._lastDepthFailColor, depthFailColor)) {
221+
attributes._lastDepthFailColor = Color.clone(depthFailColor, attributes._lastDepthFailColor);
222+
attributes.depthFailColor = ColorGeometryInstanceAttribute.toValue(depthFailColor, attributes.depthFailColor);
222223
}
223224
}
224225

@@ -230,7 +231,7 @@ define([
230231

231232
var distanceDisplayConditionProperty = updater.distanceDisplayConditionProperty;
232233
if (!Property.isConstant(distanceDisplayConditionProperty)) {
233-
var distanceDisplayCondition = distanceDisplayConditionProperty.getValue(time, distanceDisplayConditionScratch);
234+
var distanceDisplayCondition = Property.getValueOrDefault(distanceDisplayConditionProperty, time, defaultDistanceDisplayCondition, distanceDisplayConditionScratch);
234235
if (!DistanceDisplayCondition.equals(distanceDisplayCondition, attributes._lastDistanceDisplayCondition)) {
235236
attributes._lastDistanceDisplayCondition = DistanceDisplayCondition.clone(distanceDisplayCondition, attributes._lastDistanceDisplayCondition);
236237
attributes.distanceDisplayCondition = DistanceDisplayConditionGeometryInstanceAttribute.toValue(distanceDisplayCondition, attributes.distanceDisplayCondition);

Source/DataSources/StaticGroundGeometryColorBatch.js

+6-5
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ define([
2222

2323
var colorScratch = new Color();
2424
var distanceDisplayConditionScratch = new DistanceDisplayCondition();
25+
var defaultDistanceDisplayCondition = new DistanceDisplayCondition();
2526

2627
function Batch(primitives, classificationType, color, key) {
2728
this.primitives = primitives;
@@ -152,12 +153,12 @@ define([
152153

153154
if (!updater.fillMaterialProperty.isConstant || waitingOnCreate) {
154155
var colorProperty = updater.fillMaterialProperty.color;
155-
colorProperty.getValue(time, colorScratch);
156+
var fillColor = Property.getValueOrDefault(colorProperty, time, Color.WHITE, colorScratch);
156157

157-
if (!Color.equals(attributes._lastColor, colorScratch)) {
158-
attributes._lastColor = Color.clone(colorScratch, attributes._lastColor);
158+
if (!Color.equals(attributes._lastColor, fillColor)) {
159+
attributes._lastColor = Color.clone(fillColor, attributes._lastColor);
159160
var color = this.color;
160-
var newColor = colorScratch.toBytes(scratchArray);
161+
var newColor = fillColor.toBytes(scratchArray);
161162
if (color[0] !== newColor[0] || color[1] !== newColor[1] ||
162163
color[2] !== newColor[2] || color[3] !== newColor[3]) {
163164
this.itemsToRemove[removedCount++] = updater;
@@ -173,7 +174,7 @@ define([
173174

174175
var distanceDisplayConditionProperty = updater.distanceDisplayConditionProperty;
175176
if (!Property.isConstant(distanceDisplayConditionProperty)) {
176-
var distanceDisplayCondition = distanceDisplayConditionProperty.getValue(time, distanceDisplayConditionScratch);
177+
var distanceDisplayCondition = Property.getValueOrDefault(distanceDisplayConditionProperty, time, defaultDistanceDisplayCondition, distanceDisplayConditionScratch);
177178
if (!DistanceDisplayCondition.equals(distanceDisplayCondition, attributes._lastDistanceDisplayCondition)) {
178179
attributes._lastDistanceDisplayCondition = DistanceDisplayCondition.clone(distanceDisplayCondition, attributes._lastDistanceDisplayCondition);
179180
attributes.distanceDisplayCondition = DistanceDisplayConditionGeometryInstanceAttribute.toValue(distanceDisplayCondition, attributes.distanceDisplayCondition);

Source/DataSources/StaticOutlineGeometryBatch.js

+9-8
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@ define([
2424
Property) {
2525
'use strict';
2626

27+
var colorScratch = new Color();
28+
var distanceDisplayConditionScratch = new DistanceDisplayCondition();
29+
var defaultDistanceDisplayCondition = new DistanceDisplayCondition();
30+
2731
function Batch(primitives, translucent, width, shadows) {
2832
this.translucent = translucent;
2933
this.width = width;
@@ -71,9 +75,6 @@ define([
7175
}
7276
};
7377

74-
var colorScratch = new Color();
75-
var distanceDisplayConditionScratch = new DistanceDisplayCondition();
76-
7778
Batch.prototype.update = function(time) {
7879
var isUpdated = true;
7980
var removedCount = 0;
@@ -161,10 +162,10 @@ define([
161162

162163
if (!updater.outlineColorProperty.isConstant || waitingOnCreate) {
163164
var outlineColorProperty = updater.outlineColorProperty;
164-
outlineColorProperty.getValue(time, colorScratch);
165-
if (!Color.equals(attributes._lastColor, colorScratch)) {
166-
attributes._lastColor = Color.clone(colorScratch, attributes._lastColor);
167-
attributes.color = ColorGeometryInstanceAttribute.toValue(colorScratch, attributes.color);
165+
var outlineColor = Property.getValueOrDefault(outlineColorProperty, time, Color.WHITE, colorScratch);
166+
if (!Color.equals(attributes._lastColor, outlineColor)) {
167+
attributes._lastColor = Color.clone(outlineColor, attributes._lastColor);
168+
attributes.color = ColorGeometryInstanceAttribute.toValue(outlineColor, attributes.color);
168169
if ((this.translucent && attributes.color[3] === 255) || (!this.translucent && attributes.color[3] !== 255)) {
169170
this.itemsToRemove[removedCount++] = updater;
170171
}
@@ -179,7 +180,7 @@ define([
179180

180181
var distanceDisplayConditionProperty = updater.distanceDisplayConditionProperty;
181182
if (!Property.isConstant(distanceDisplayConditionProperty)) {
182-
var distanceDisplayCondition = distanceDisplayConditionProperty.getValue(time, distanceDisplayConditionScratch);
183+
var distanceDisplayCondition = Property.getValueOrDefault(distanceDisplayConditionProperty, time, defaultDistanceDisplayCondition, distanceDisplayConditionScratch);
183184
if (!DistanceDisplayCondition.equals(distanceDisplayCondition, attributes._lastDistanceDisplayCondition)) {
184185
attributes._lastDistanceDisplayCondition = DistanceDisplayCondition.clone(distanceDisplayCondition, attributes._lastDistanceDisplayCondition);
185186
attributes.distanceDisplayCondition = DistanceDisplayConditionGeometryInstanceAttribute.toValue(distanceDisplayCondition, attributes.distanceDisplayCondition);

Specs/DataSources/StaticGeometryColorBatchSpec.js

+146
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,17 @@ defineSuite([
22
'DataSources/StaticGeometryColorBatch',
33
'Core/Cartesian3',
44
'Core/Color',
5+
'Core/DistanceDisplayCondition',
56
'Core/JulianDate',
7+
'Core/Math',
8+
'Core/TimeInterval',
9+
'Core/TimeIntervalCollection',
610
'DataSources/CallbackProperty',
11+
'DataSources/ColorMaterialProperty',
712
'DataSources/EllipseGeometryUpdater',
813
'DataSources/Entity',
914
'DataSources/PolylineGeometryUpdater',
15+
'DataSources/TimeIntervalCollectionProperty',
1016
'Scene/PerInstanceColorAppearance',
1117
'Scene/PolylineColorAppearance',
1218
'Scene/ShadowMode',
@@ -16,11 +22,17 @@ defineSuite([
1622
StaticGeometryColorBatch,
1723
Cartesian3,
1824
Color,
25+
DistanceDisplayCondition,
1926
JulianDate,
27+
CesiumMath,
28+
TimeInterval,
29+
TimeIntervalCollection,
2030
CallbackProperty,
31+
ColorMaterialProperty,
2132
EllipseGeometryUpdater,
2233
Entity,
2334
PolylineGeometryUpdater,
35+
TimeIntervalCollectionProperty,
2436
PerInstanceColorAppearance,
2537
PolylineColorAppearance,
2638
ShadowMode,
@@ -87,6 +99,97 @@ defineSuite([
8799
});
88100
});
89101

102+
it('updates with sampled color out of range', function() {
103+
var validTime = JulianDate.fromIso8601('2018-02-14T04:10:00+1100');
104+
var color = new TimeIntervalCollectionProperty();
105+
color.intervals.addInterval(TimeInterval.fromIso8601({
106+
iso8601: '2018-02-14T04:00:00+1100/2018-02-14T04:15:00+1100',
107+
data: Color.RED
108+
}));
109+
var entity = new Entity({
110+
availability: new TimeIntervalCollection([TimeInterval.fromIso8601({iso8601: '2018-02-14T04:00:00+1100/2018-02-14T04:30:00+1100'})]),
111+
position : new Cartesian3(1234, 5678, 9101112),
112+
ellipse: {
113+
semiMajorAxis : 2,
114+
semiMinorAxis : 1,
115+
extrudedHeight: 20,
116+
material: new ColorMaterialProperty(color)
117+
}
118+
});
119+
120+
var batch = new StaticGeometryColorBatch(scene.primitives, PerInstanceColorAppearance, undefined, false, ShadowMode.DISABLED);
121+
122+
var updater = new EllipseGeometryUpdater(entity, scene);
123+
batch.add(validTime, updater);
124+
125+
return pollToPromise(function() {
126+
scene.initializeFrame();
127+
var isUpdated = batch.update(validTime);
128+
scene.render(validTime);
129+
return isUpdated;
130+
}).then(function() {
131+
expect(scene.primitives.length).toEqual(1);
132+
var primitive = scene.primitives.get(0);
133+
var attributes = primitive.getGeometryInstanceAttributes(entity);
134+
expect(attributes.color).toEqual([255, 0, 0, 255]);
135+
136+
batch.update(time);
137+
scene.render(time);
138+
139+
primitive = scene.primitives.get(0);
140+
attributes = primitive.getGeometryInstanceAttributes(entity);
141+
expect(attributes.color).toEqual([255, 255, 255, 255]);
142+
143+
batch.removeAllPrimitives();
144+
});
145+
});
146+
147+
it('updates with sampled distance display condition out of range', function() {
148+
var validTime = JulianDate.fromIso8601('2018-02-14T04:10:00+1100');
149+
var ddc = new TimeIntervalCollectionProperty();
150+
ddc.intervals.addInterval(TimeInterval.fromIso8601({
151+
iso8601: '2018-02-14T04:00:00+1100/2018-02-14T04:15:00+1100',
152+
data: new DistanceDisplayCondition(1.0, 2.0)
153+
}));
154+
var entity = new Entity({
155+
availability: new TimeIntervalCollection([TimeInterval.fromIso8601({iso8601: '2018-02-14T04:00:00+1100/2018-02-14T04:30:00+1100'})]),
156+
position : new Cartesian3(1234, 5678, 9101112),
157+
ellipse: {
158+
semiMajorAxis : 2,
159+
semiMinorAxis : 1,
160+
extrudedHeight: 20,
161+
material: Color.RED,
162+
distanceDisplayCondition: ddc
163+
}
164+
});
165+
166+
var batch = new StaticGeometryColorBatch(scene.primitives, PerInstanceColorAppearance, undefined, false, ShadowMode.DISABLED);
167+
168+
var updater = new EllipseGeometryUpdater(entity, scene);
169+
batch.add(validTime, updater);
170+
171+
return pollToPromise(function() {
172+
scene.initializeFrame();
173+
var isUpdated = batch.update(validTime);
174+
scene.render(validTime);
175+
return isUpdated;
176+
}).then(function() {
177+
expect(scene.primitives.length).toEqual(1);
178+
var primitive = scene.primitives.get(0);
179+
var attributes = primitive.getGeometryInstanceAttributes(entity);
180+
expect(attributes.distanceDisplayCondition).toEqualEpsilon([1.0, 2.0], CesiumMath.EPSILON6);
181+
182+
batch.update(time);
183+
scene.render(time);
184+
185+
primitive = scene.primitives.get(0);
186+
attributes = primitive.getGeometryInstanceAttributes(entity);
187+
expect(attributes.distanceDisplayCondition).toEqual([0.0, Infinity]);
188+
189+
batch.removeAllPrimitives();
190+
});
191+
});
192+
90193
it('updates color attribute after rebuilding polyline primitive', function() {
91194
var batch = new StaticGeometryColorBatch(scene.primitives, PolylineColorAppearance, undefined, false, ShadowMode.DISABLED);
92195

@@ -128,4 +231,47 @@ defineSuite([
128231
});
129232
});
130233
});
234+
235+
it('updates with sampled depth fail color out of range', function() {
236+
var validTime = JulianDate.fromIso8601('2018-02-14T04:10:00+1100');
237+
var color = new TimeIntervalCollectionProperty();
238+
color.intervals.addInterval(TimeInterval.fromIso8601({
239+
iso8601: '2018-02-14T04:00:00+1100/2018-02-14T04:15:00+1100',
240+
data: Color.RED
241+
}));
242+
var entity = new Entity({
243+
availability: new TimeIntervalCollection([TimeInterval.fromIso8601({iso8601: '2018-02-14T04:00:00+1100/2018-02-14T04:30:00+1100'})]),
244+
polyline : {
245+
positions : [Cartesian3.fromDegrees(0.0, 0.0), Cartesian3.fromDegrees(0.0, 1.0)],
246+
material : Color.BLUE,
247+
depthFailMaterial: new ColorMaterialProperty(color)
248+
}
249+
});
250+
251+
var batch = new StaticGeometryColorBatch(scene.primitives, PolylineColorAppearance, PolylineColorAppearance, false, ShadowMode.DISABLED);
252+
253+
var updater = new PolylineGeometryUpdater(entity, scene);
254+
batch.add(validTime, updater);
255+
256+
return pollToPromise(function() {
257+
scene.initializeFrame();
258+
var isUpdated = batch.update(validTime);
259+
scene.render(validTime);
260+
return isUpdated;
261+
}).then(function() {
262+
expect(scene.primitives.length).toEqual(1);
263+
var primitive = scene.primitives.get(0);
264+
var attributes = primitive.getGeometryInstanceAttributes(entity);
265+
expect(attributes.depthFailColor).toEqual([255, 0, 0, 255]);
266+
267+
batch.update(time);
268+
scene.render(time);
269+
270+
primitive = scene.primitives.get(0);
271+
attributes = primitive.getGeometryInstanceAttributes(entity);
272+
expect(attributes.depthFailColor).toEqual([255, 255, 255, 255]);
273+
274+
batch.removeAllPrimitives();
275+
});
276+
});
131277
});

0 commit comments

Comments
 (0)