Skip to content

Commit 7a0a6e7

Browse files
authoredFeb 22, 2017
Merge pull request #4979 from AnalyticalGraphicsInc/pick-translucent
Pick translucent geometry
2 parents 913b253 + 4686c2f commit 7a0a6e7

File tree

9 files changed

+528
-108
lines changed

9 files changed

+528
-108
lines changed
 

‎CHANGES.md

+1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ Change Log
2525
* Fixed an issue with constant `VertexArray` attributes not being set correctly. [#4995](https://github.com/AnalyticalGraphicsInc/cesium/pull/4995)
2626
* Add support for `Scene.pickPosition` in Columbus view and 2D. [#4990](https://github.com/AnalyticalGraphicsInc/cesium/pull/4990)
2727
* Added `Label.scaleByDistance` to control minimum/maximum label size based on distance from the camera. [#5019](https://github.com/AnalyticalGraphicsInc/cesium/pull/5019)
28+
* Add support for depth picking translucent primitives when `Scene.pickTranslucentDepth` is `true`. [#4979](https://github.com/AnalyticalGraphicsInc/cesium/pull/4979)
2829

2930
### 1.30 - 2017-02-01
3031

‎Source/Renderer/ShaderCache.js

+78-7
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ define([
5555
* fragmentShaderSource : fs,
5656
* attributeLocations : attributeLocations
5757
* });
58-
*
58+
*
5959
* @see ShaderCache#getShaderProgram
6060
*/
6161
ShaderCache.prototype.replaceShaderProgram = function(options) {
@@ -103,7 +103,7 @@ define([
103103
var keyword = vertexShaderText + fragmentShaderText + JSON.stringify(attributeLocations);
104104
var cachedShader;
105105

106-
if (this._shaders[keyword]) {
106+
if (defined(this._shaders[keyword])) {
107107
cachedShader = this._shaders[keyword];
108108

109109
// No longer want to release this if it was previously released.
@@ -125,6 +125,7 @@ define([
125125
cache : this,
126126
shaderProgram : shaderProgram,
127127
keyword : keyword,
128+
derivedKeywords : [],
128129
count : 0
129130
};
130131

@@ -138,14 +139,86 @@ define([
138139
return cachedShader.shaderProgram;
139140
};
140141

142+
ShaderCache.prototype.getDerivedShaderProgram = function(shaderProgram, keyword) {
143+
var cachedShader = shaderProgram._cachedShader;
144+
var derivedKeyword = keyword + cachedShader.keyword;
145+
var cachedDerivedShader = this._shaders[derivedKeyword];
146+
if (!defined(cachedDerivedShader)) {
147+
return undefined;
148+
}
149+
150+
return cachedDerivedShader.shaderProgram;
151+
};
152+
153+
ShaderCache.prototype.createDerivedShaderProgram = function(shaderProgram, keyword, options) {
154+
var cachedShader = shaderProgram._cachedShader;
155+
var derivedKeyword = keyword + cachedShader.keyword;
156+
157+
var vertexShaderSource = options.vertexShaderSource;
158+
var fragmentShaderSource = options.fragmentShaderSource;
159+
var attributeLocations = options.attributeLocations;
160+
161+
if (typeof vertexShaderSource === 'string') {
162+
vertexShaderSource = new ShaderSource({
163+
sources : [vertexShaderSource]
164+
});
165+
}
166+
167+
if (typeof fragmentShaderSource === 'string') {
168+
fragmentShaderSource = new ShaderSource({
169+
sources : [fragmentShaderSource]
170+
});
171+
}
172+
173+
var vertexShaderText = vertexShaderSource.createCombinedVertexShader();
174+
var fragmentShaderText = fragmentShaderSource.createCombinedFragmentShader();
175+
176+
var context = this._context;
177+
var derivedShaderProgram = new ShaderProgram({
178+
gl : context._gl,
179+
logShaderCompilation : context.logShaderCompilation,
180+
debugShaders : context.debugShaders,
181+
vertexShaderSource : vertexShaderSource,
182+
vertexShaderText : vertexShaderText,
183+
fragmentShaderSource : fragmentShaderSource,
184+
fragmentShaderText : fragmentShaderText,
185+
attributeLocations : attributeLocations
186+
});
187+
188+
var derivedCachedShader = {
189+
cache : this,
190+
shaderProgram : derivedShaderProgram,
191+
keyword : derivedKeyword,
192+
derivedKeywords : [],
193+
count : 0
194+
};
195+
196+
cachedShader.derivedKeywords.push(keyword);
197+
derivedShaderProgram._cachedShader = derivedCachedShader;
198+
this._shaders[derivedKeyword] = derivedCachedShader;
199+
return derivedShaderProgram;
200+
};
201+
202+
function destroyShader(cache, cachedShader) {
203+
var derivedKeywords = cachedShader.derivedKeywords;
204+
var length = derivedKeywords.length;
205+
for (var i = 0; i < length; ++i) {
206+
var keyword = derivedKeywords[i] + cachedShader.keyword;
207+
var derivedCachedShader = cache._shaders[keyword];
208+
destroyShader(cache, derivedCachedShader);
209+
}
210+
211+
delete cache._shaders[cachedShader.keyword];
212+
cachedShader.shaderProgram.finalDestroy();
213+
}
214+
141215
ShaderCache.prototype.destroyReleasedShaderPrograms = function() {
142216
var shadersToRelease = this._shadersToRelease;
143217

144218
for ( var keyword in shadersToRelease) {
145219
if (shadersToRelease.hasOwnProperty(keyword)) {
146220
var cachedShader = shadersToRelease[keyword];
147-
delete this._shaders[cachedShader.keyword];
148-
cachedShader.shaderProgram.finalDestroy();
221+
destroyShader(this, cachedShader);
149222
--this._numberOfShaders;
150223
}
151224
}
@@ -168,13 +241,11 @@ define([
168241

169242
ShaderCache.prototype.destroy = function() {
170243
var shaders = this._shaders;
171-
172-
for ( var keyword in shaders) {
244+
for (var keyword in shaders) {
173245
if (shaders.hasOwnProperty(keyword)) {
174246
shaders[keyword].shaderProgram.finalDestroy();
175247
}
176248
}
177-
178249
return destroyObject(this);
179250
};
180251

‎Source/Scene/FrameState.js

+8-1
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,14 @@ define([
117117
* @type {Boolean}
118118
* @default false
119119
*/
120-
pick : false
120+
pick : false,
121+
122+
/**
123+
* <code>true</code> if the primitive should update for a depth only pass, <code>false</code> otherwise.
124+
* @type {Boolean}
125+
* @default false
126+
*/
127+
depth : false
121128
};
122129

123130
/**

‎Source/Scene/OIT.js

+12-35
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,6 @@ define([
8282

8383
this._translucentRenderStateCache = {};
8484
this._alphaRenderStateCache = {};
85-
this._translucentShaderCache = {};
86-
this._alphaShaderCache = {};
8785

8886
this._compositeCommand = undefined;
8987
this._adjustTranslucentCommand = undefined;
@@ -411,9 +409,8 @@ define([
411409
' float ai = czm_gl_FragColor.a;\n' +
412410
' gl_FragColor = vec4(ai);\n';
413411

414-
function getTranslucentShaderProgram(context, shaderProgram, cache, source) {
415-
var id = shaderProgram.id;
416-
var shader = cache[id];
412+
function getTranslucentShaderProgram(context, shaderProgram, keyword, source) {
413+
var shader = context.shaderCache.getDerivedShaderProgram(shaderProgram, keyword);
417414
if (!defined(shader)) {
418415
var attributeLocations = shaderProgram._attributeLocations;
419416

@@ -446,29 +443,26 @@ define([
446443
source +
447444
'}\n');
448445

449-
shader = ShaderProgram.fromCache({
450-
context : context,
446+
shader = context.shaderCache.createDerivedShaderProgram(shaderProgram, keyword, {
451447
vertexShaderSource : shaderProgram.vertexShaderSource,
452448
fragmentShaderSource : fs,
453449
attributeLocations : attributeLocations
454450
});
455-
456-
cache[id] = shader;
457451
}
458452

459453
return shader;
460454
}
461455

462-
function getTranslucentMRTShaderProgram(oit, context, shaderProgram) {
463-
return getTranslucentShaderProgram(context, shaderProgram, oit._translucentShaderCache, mrtShaderSource);
456+
function getTranslucentMRTShaderProgram(context, shaderProgram) {
457+
return getTranslucentShaderProgram(context, shaderProgram, 'translucentMRT', mrtShaderSource);
464458
}
465459

466-
function getTranslucentColorShaderProgram(oit, context, shaderProgram) {
467-
return getTranslucentShaderProgram(context, shaderProgram, oit._translucentShaderCache, colorShaderSource);
460+
function getTranslucentColorShaderProgram(context, shaderProgram) {
461+
return getTranslucentShaderProgram(context, shaderProgram, 'translucentMultipass', colorShaderSource);
468462
}
469463

470-
function getTranslucentAlphaShaderProgram(oit, context, shaderProgram) {
471-
return getTranslucentShaderProgram(context, shaderProgram, oit._alphaShaderCache, alphaShaderSource);
464+
function getTranslucentAlphaShaderProgram(context, shaderProgram) {
465+
return getTranslucentShaderProgram(context, shaderProgram, 'alphaMultipass', alphaShaderSource);
472466
}
473467

474468
OIT.prototype.createDerivedCommands = function(command, context, result) {
@@ -487,7 +481,7 @@ define([
487481
result.translucentCommand = DrawCommand.shallowClone(command, result.translucentCommand);
488482

489483
if (!defined(translucentShader) || result.shaderProgramId !== command.shaderProgram.id) {
490-
result.translucentCommand.shaderProgram = getTranslucentMRTShaderProgram(this, context, command.shaderProgram);
484+
result.translucentCommand.shaderProgram = getTranslucentMRTShaderProgram(context, command.shaderProgram);
491485
result.translucentCommand.renderState = getTranslucentMRTRenderState(this, context, command.renderState);
492486
result.shaderProgramId = command.shaderProgram.id;
493487
} else {
@@ -510,9 +504,9 @@ define([
510504
result.alphaCommand = DrawCommand.shallowClone(command, result.alphaCommand);
511505

512506
if (!defined(colorShader) || result.shaderProgramId !== command.shaderProgram.id) {
513-
result.translucentCommand.shaderProgram = getTranslucentColorShaderProgram(this, context, command.shaderProgram);
507+
result.translucentCommand.shaderProgram = getTranslucentColorShaderProgram(context, command.shaderProgram);
514508
result.translucentCommand.renderState = getTranslucentColorRenderState(this, context, command.renderState);
515-
result.alphaCommand.shaderProgram = getTranslucentAlphaShaderProgram(this, context, command.shaderProgram);
509+
result.alphaCommand.shaderProgram = getTranslucentAlphaShaderProgram(context, command.shaderProgram);
516510
result.alphaCommand.renderState = getTranslucentAlphaRenderState(this, context, command.renderState);
517511
result.shaderProgramId = command.shaderProgram.id;
518512
} else {
@@ -639,23 +633,6 @@ define([
639633
this._adjustAlphaCommand.shaderProgram = this._adjustAlphaCommand.shaderProgram && this._adjustAlphaCommand.shaderProgram.destroy();
640634
}
641635

642-
var name;
643-
var cache = this._translucentShaderCache;
644-
for (name in cache) {
645-
if (cache.hasOwnProperty(name) && defined(cache[name])) {
646-
cache[name].destroy();
647-
}
648-
}
649-
this._translucentShaderCache = {};
650-
651-
cache = this._alphaShaderCache;
652-
for (name in cache) {
653-
if (cache.hasOwnProperty(name) && defined(cache[name])) {
654-
cache[name].destroy();
655-
}
656-
}
657-
this._alphaShaderCache = {};
658-
659636
return destroyObject(this);
660637
};
661638

‎Source/Scene/Scene.js

+239-32
Large diffs are not rendered by default.

‎Source/Scene/ShadowMap.js

+25-26
Original file line numberDiff line numberDiff line change
@@ -1481,28 +1481,28 @@ define([
14811481
result.receiveShadows = false;
14821482

14831483
if (!defined(castShader) || oldShaderId !== command.shaderProgram.id || shadowsDirty) {
1484-
if (defined(castShader)) {
1485-
castShader.destroy();
1486-
}
1487-
14881484
var shaderProgram = command.shaderProgram;
1489-
var vertexShaderSource = shaderProgram.vertexShaderSource;
1490-
var fragmentShaderSource = shaderProgram.fragmentShaderSource;
14911485

14921486
var isTerrain = command.pass === Pass.GLOBE;
14931487
var isOpaque = command.pass !== Pass.TRANSLUCENT;
14941488
var isPointLight = shadowMap._isPointLight;
14951489
var usesDepthTexture= shadowMap._usesDepthTexture;
14961490

1497-
var castVS = ShadowMapShader.createShadowCastVertexShader(vertexShaderSource, isPointLight, isTerrain);
1498-
var castFS = ShadowMapShader.createShadowCastFragmentShader(fragmentShaderSource, isPointLight, usesDepthTexture, isOpaque);
1491+
var keyword = ShadowMapShader.getShadowCastShaderKeyword(isPointLight, isTerrain, usesDepthTexture, isOpaque);
1492+
castShader = context.shaderCache.getDerivedShaderProgram(shaderProgram, keyword);
1493+
if (!defined(castShader)) {
1494+
var vertexShaderSource = shaderProgram.vertexShaderSource;
1495+
var fragmentShaderSource = shaderProgram.fragmentShaderSource;
14991496

1500-
castShader = ShaderProgram.fromCache({
1501-
context : context,
1502-
vertexShaderSource : castVS,
1503-
fragmentShaderSource : castFS,
1504-
attributeLocations : shaderProgram._attributeLocations
1505-
});
1497+
var castVS = ShadowMapShader.createShadowCastVertexShader(vertexShaderSource, isPointLight, isTerrain);
1498+
var castFS = ShadowMapShader.createShadowCastFragmentShader(fragmentShaderSource, isPointLight, usesDepthTexture, isOpaque);
1499+
1500+
castShader = context.shaderCache.createDerivedShaderProgram(shaderProgram, keyword, {
1501+
vertexShaderSource : castVS,
1502+
fragmentShaderSource : castFS,
1503+
attributeLocations : shaderProgram._attributeLocations
1504+
});
1505+
}
15061506

15071507
castRenderState = shadowMap._primitiveRenderState;
15081508
if (isPointLight) {
@@ -1582,20 +1582,19 @@ define([
15821582
var shaderDirty = result.receiveShaderProgramId !== command.shaderProgram.id;
15831583

15841584
if (!defined(receiveShader) || shaderDirty || shadowsDirty || castShadowsDirty) {
1585-
if (defined(receiveShader)) {
1586-
receiveShader.destroy();
1585+
var keyword = ShadowMapShader.getShadowReceiveShaderKeyword(lightShadowMaps[0], command.castShadows, isTerrain, hasTerrainNormal);
1586+
receiveShader = context.shaderCache.getDerivedShaderProgram(shaderProgram, keyword);
1587+
if (!defined(receiveShader)) {
1588+
var receiveVS = ShadowMapShader.createShadowReceiveVertexShader(vertexShaderSource, isTerrain, hasTerrainNormal);
1589+
var receiveFS = ShadowMapShader.createShadowReceiveFragmentShader(fragmentShaderSource, lightShadowMaps[0], command.castShadows, isTerrain, hasTerrainNormal);
1590+
1591+
receiveShader = context.shaderCache.createDerivedShaderProgram(shaderProgram, keyword, {
1592+
vertexShaderSource : receiveVS,
1593+
fragmentShaderSource : receiveFS,
1594+
attributeLocations : shaderProgram._attributeLocations
1595+
});
15871596
}
15881597

1589-
var receiveVS = ShadowMapShader.createShadowReceiveVertexShader(vertexShaderSource, isTerrain, hasTerrainNormal);
1590-
var receiveFS = ShadowMapShader.createShadowReceiveFragmentShader(fragmentShaderSource, lightShadowMaps[0], command.castShadows, isTerrain, hasTerrainNormal);
1591-
1592-
receiveShader = ShaderProgram.fromCache({
1593-
context : context,
1594-
vertexShaderSource : receiveVS,
1595-
fragmentShaderSource : receiveFS,
1596-
attributeLocations : shaderProgram._attributeLocations
1597-
});
1598-
15991598
receiveUniformMap = combineUniforms(lightShadowMaps[0], command.uniformMap, isTerrain);
16001599
}
16011600

‎Source/Scene/ShadowMapShader.js

+17
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ define([
1313
function ShadowMapShader() {
1414
}
1515

16+
ShadowMapShader.getShadowCastShaderKeyword = function(isPointLight, isTerrain, usesDepthTexture, isOpaque) {
17+
return 'castShadow ' + isPointLight + ' ' + isTerrain + ' ' + usesDepthTexture + ' ' + isOpaque;
18+
};
19+
1620
ShadowMapShader.createShadowCastVertexShader = function(vs, isPointLight, isTerrain) {
1721
var defines = vs.defines.slice(0);
1822
var sources = vs.sources.slice(0);
@@ -106,6 +110,19 @@ define([
106110
});
107111
};
108112

113+
ShadowMapShader.getShadowReceiveShaderKeyword = function(shadowMap, castShadows, isTerrain, hasTerrainNormal) {
114+
var usesDepthTexture = shadowMap._usesDepthTexture;
115+
var polygonOffsetSupported = shadowMap._polygonOffsetSupported;
116+
var isPointLight = shadowMap._isPointLight;
117+
var isSpotLight = shadowMap._isSpotLight;
118+
var hasCascades = shadowMap._numberOfCascades > 1;
119+
var debugCascadeColors = shadowMap.debugCascadeColors;
120+
var softShadows = shadowMap.softShadows;
121+
122+
return 'receiveShadow ' + usesDepthTexture + polygonOffsetSupported + isPointLight + isSpotLight +
123+
hasCascades + debugCascadeColors + softShadows + castShadows + isTerrain + hasTerrainNormal;
124+
};
125+
109126
ShadowMapShader.createShadowReceiveVertexShader = function(vs, isTerrain, hasTerrainNormal) {
110127
var defines = vs.defines.slice(0);
111128
var sources = vs.sources.slice(0);

‎Specs/Renderer/ShaderCacheSpec.js

+63
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,69 @@ defineSuite([
165165
cache.destroy();
166166
});
167167

168+
it('create derived shader program', function() {
169+
var vs = 'attribute vec4 position; void main() { gl_Position = position; }';
170+
var fs = 'void main() { gl_FragColor = vec4(1.0); }';
171+
172+
var cache = new ShaderCache(context);
173+
var sp = cache.getShaderProgram({
174+
vertexShaderSource : vs,
175+
fragmentShaderSource : fs,
176+
attributeLocations : {
177+
position : 0
178+
}
179+
});
180+
181+
var keyword = 'derived';
182+
var spDerived = cache.getDerivedShaderProgram(sp, keyword);
183+
expect(spDerived).not.toBeDefined();
184+
185+
var fsDerived = 'void main() { gl_FragColor = vec4(vec3(1.0), 0.5); }';
186+
spDerived = cache.createDerivedShaderProgram(sp, keyword, {
187+
vertexShaderSource : vs,
188+
fragmentShaderSource : fsDerived,
189+
attributeLocations : {
190+
position : 0
191+
}
192+
});
193+
expect(spDerived).toBeDefined();
194+
195+
cache.destroy();
196+
});
197+
198+
it('destroying a shader program destroys its derived shaders', function() {
199+
var vs = 'attribute vec4 position; void main() { gl_Position = position; }';
200+
var fs = 'void main() { gl_FragColor = vec4(1.0); }';
201+
202+
var cache = new ShaderCache(context);
203+
var sp = cache.getShaderProgram({
204+
vertexShaderSource : vs,
205+
fragmentShaderSource : fs,
206+
attributeLocations : {
207+
position : 0
208+
}
209+
});
210+
211+
var keyword = 'derived';
212+
var fsDerived = 'void main() { gl_FragColor = vec4(vec3(1.0), 0.5); }';
213+
var spDerived = cache.createDerivedShaderProgram(sp, keyword, {
214+
vertexShaderSource : vs,
215+
fragmentShaderSource : fsDerived,
216+
attributeLocations : {
217+
position : 0
218+
}
219+
});
220+
expect(spDerived).toBeDefined();
221+
222+
sp.destroy();
223+
cache.destroyReleasedShaderPrograms();
224+
225+
expect(sp.isDestroyed()).toEqual(true);
226+
expect(spDerived.isDestroyed()).toEqual(true);
227+
228+
cache.destroy();
229+
});
230+
168231
it('is destroyed', function() {
169232
var vs = 'attribute vec4 position; void main() { gl_Position = position; }';
170233
var fs = 'void main() { gl_FragColor = vec4(1.0); }';

‎Specs/Scene/SceneSpec.js

+85-7
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,9 @@ defineSuite([
1919
'Renderer/Framebuffer',
2020
'Renderer/Pass',
2121
'Renderer/PixelDatatype',
22+
'Renderer/RenderState',
2223
'Renderer/ShaderProgram',
24+
'Renderer/ShaderSource',
2325
'Renderer/Texture',
2426
'Scene/Camera',
2527
'Scene/EllipsoidSurfaceAppearance',
@@ -55,7 +57,9 @@ defineSuite([
5557
Framebuffer,
5658
Pass,
5759
PixelDatatype,
60+
RenderState,
5861
ShaderProgram,
62+
ShaderSource,
5963
Texture,
6064
Camera,
6165
EllipsoidSurfaceAppearance,
@@ -74,9 +78,21 @@ defineSuite([
7478
'use strict';
7579

7680
var scene;
81+
var simpleShaderProgram;
82+
var simpleRenderState;
7783

7884
beforeAll(function() {
7985
scene = createScene();
86+
simpleShaderProgram = ShaderProgram.fromCache({
87+
context : scene.context,
88+
vertexShaderSource : new ShaderSource({
89+
sources : ['void main() { gl_Position = vec4(1.0); }']
90+
}),
91+
fragmentShaderSource : new ShaderSource({
92+
sources : ['void main() { gl_FragColor = vec4(1.0); }']
93+
})
94+
});
95+
simpleRenderState = new RenderState();
8096
});
8197

8298
afterEach(function() {
@@ -199,6 +215,8 @@ defineSuite([
199215

200216
it('debugCommandFilter filters commands', function() {
201217
var c = new DrawCommand({
218+
shaderProgram : simpleShaderProgram,
219+
renderState : simpleRenderState,
202220
pass : Pass.OPAQUE
203221
});
204222
c.execute = function() {};
@@ -216,6 +234,8 @@ defineSuite([
216234

217235
it('debugCommandFilter does not filter commands', function() {
218236
var c = new DrawCommand({
237+
shaderProgram : simpleShaderProgram,
238+
renderState : simpleRenderState,
219239
pass : Pass.OPAQUE
220240
});
221241
c.execute = function() {};
@@ -233,6 +253,8 @@ defineSuite([
233253
var center = Cartesian3.add(scene.camera.position, scene.camera.direction, new Cartesian3());
234254

235255
var c = new DrawCommand({
256+
shaderProgram : simpleShaderProgram,
257+
renderState : simpleRenderState,
236258
pass : Pass.OPAQUE,
237259
debugShowBoundingVolume : true,
238260
boundingVolume : new BoundingSphere(center, radius)
@@ -249,13 +271,9 @@ defineSuite([
249271

250272
it('debugShowCommands tints commands', function() {
251273
var c = new DrawCommand({
252-
pass : Pass.OPAQUE,
253-
254-
shaderProgram : ShaderProgram.fromCache({
255-
context : scene.context,
256-
vertexShaderSource : 'void main() { gl_Position = vec4(1.0); }',
257-
fragmentShaderSource : 'void main() { gl_FragColor = vec4(1.0); }'
258-
})
274+
shaderProgram : simpleShaderProgram,
275+
renderState : simpleRenderState,
276+
pass : Pass.OPAQUE
259277
});
260278
c.execute = function() {};
261279

@@ -753,6 +771,66 @@ defineSuite([
753771
});
754772
});
755773

774+
it('pickPosition picks translucent geometry when pickTranslucentDepth is true', function() {
775+
if (!scene.pickPositionSupported) {
776+
return;
777+
}
778+
779+
var rectangle = Rectangle.fromDegrees(-100.0, 30.0, -90.0, 40.0);
780+
scene.camera.setView({
781+
destination : rectangle
782+
});
783+
784+
var canvas = scene.canvas;
785+
var windowPosition = new Cartesian2(canvas.clientWidth / 2, canvas.clientHeight / 2);
786+
787+
var rectanglePrimitive = createRectangle(rectangle);
788+
rectanglePrimitive.appearance.material.uniforms.color = new Color(1.0, 0.0, 0.0, 0.5);
789+
790+
var primitives = scene.primitives;
791+
primitives.add(rectanglePrimitive);
792+
793+
scene.useDepthPicking = true;
794+
scene.pickTranslucentDepth = false;
795+
expect(scene).toRenderAndCall(function() {
796+
var position = scene.pickPosition(windowPosition);
797+
expect(position).not.toBeDefined();
798+
});
799+
800+
scene.pickTranslucentDepth = true;
801+
expect(scene).toRenderAndCall(function() {
802+
var position = scene.pickPosition(windowPosition);
803+
expect(position).toBeDefined();
804+
});
805+
806+
var rectanglePrimitive2 = createRectangle(rectangle);
807+
rectanglePrimitive2.appearance.material.uniforms.color = new Color(0.0, 1.0, 0.0, 0.5);
808+
primitives.add(rectanglePrimitive2);
809+
810+
expect(scene).toRenderAndCall(function() {
811+
var position = scene.pickPosition(windowPosition);
812+
expect(position).toBeDefined();
813+
814+
var commandList = scene.frameState.commandList;
815+
expect(commandList.length).toEqual(2);
816+
817+
var command1 = commandList[0];
818+
var command2 = commandList[1];
819+
820+
expect(command1.derivedCommands).toBeDefined();
821+
expect(command2.derivedCommands).toBeDefined();
822+
823+
expect(command1.derivedCommands.depth).toBeDefined();
824+
expect(command2.derivedCommands.depth).toBeDefined();
825+
826+
expect(command1.derivedCommands.depth.depthOnlyCommand).toBeDefined();
827+
expect(command2.derivedCommands.depth.depthOnlyCommand).toBeDefined();
828+
829+
expect(command1.derivedCommands.depth.depthOnlyCommand.shaderProgram).toEqual(command2.derivedCommands.depth.depthOnlyCommand.shaderProgram);
830+
expect(command1.derivedCommands.depth.depthOnlyCommand.renderState).toEqual(command2.derivedCommands.depth.depthOnlyCommand.renderState);
831+
});
832+
});
833+
756834
it('pickPosition throws without windowPosition', function() {
757835
expect(function() {
758836
scene.pickPosition();

0 commit comments

Comments
 (0)
Please sign in to comment.