Skip to content

Commit

Permalink
Merge pull request CesiumGS#3929 from AnalyticalGraphicsInc/shadows-p…
Browse files Browse the repository at this point in the history
…icking-fix2

Fix shadows when picking #2
  • Loading branch information
pjcozzi committed May 18, 2016
2 parents 2225059 + 6759ba3 commit 7e1e66e
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 10 deletions.
2 changes: 0 additions & 2 deletions Apps/Sandcastle/gallery/development/Shadows.html
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,6 @@
'use strict';
//Sandcastle_Begin


function BiasOptions(options) {
this.type = options.type;
this.polygonOffset = Cesium.knockout.observable(options.polygonOffset);
Expand Down Expand Up @@ -724,7 +723,6 @@
}
}, Cesium.ScreenSpaceEventType.MIDDLE_DOUBLE_CLICK);


//Sandcastle_End
Sandcastle.finishedLoading();
}
Expand Down
28 changes: 20 additions & 8 deletions Source/Scene/Scene.js
Original file line number Diff line number Diff line change
Expand Up @@ -1159,7 +1159,9 @@ define([
command.debugOverlappingFrustums = 0;
}

updateDerivedCommands(scene, command);
if (!scene.frameState.passes.pick) {
updateDerivedCommands(scene, command);
}

var frustumCommandsList = scene._frustumCommandsList;
var length = frustumCommandsList.length;
Expand Down Expand Up @@ -1241,6 +1243,7 @@ define([
var far = -Number.MAX_VALUE;
var undefBV = false;

var updateShadowHints = (frameState.shadowMaps.length > 0) && !frameState.passes.pick;
var shadowNear = Number.MAX_VALUE;
var shadowFar = -Number.MAX_VALUE;
var shadowClosestObjectSize = Number.MAX_VALUE;
Expand Down Expand Up @@ -1286,7 +1289,7 @@ define([
// When moving the camera low LOD globe tiles begin to load, whose bounding volumes
// throw off the near/far fitting for the shadow map. Only update for globe tiles that the
// camera isn't inside.
if (command.receiveShadows && (distances.start < ShadowMap.MAXIMUM_DISTANCE) &&
if (updateShadowHints && command.receiveShadows && (distances.start < ShadowMap.MAXIMUM_DISTANCE) &&
!((pass === Pass.GLOBE) && (distances.start < -100.0) && (distances.stop > 100.0))) {

// Get the smallest bounding volume the camera is near. This is used to improve cascaded shadow splits.
Expand Down Expand Up @@ -1320,14 +1323,18 @@ define([
near = Math.min(Math.max(near, camera.frustum.near), camera.frustum.far);
far = Math.max(Math.min(far, camera.frustum.far), near);

shadowNear = Math.min(Math.max(shadowNear, camera.frustum.near), camera.frustum.far);
shadowFar = Math.max(Math.min(shadowFar, camera.frustum.far), shadowNear);
if (updateShadowHints) {
shadowNear = Math.min(Math.max(shadowNear, camera.frustum.near), camera.frustum.far);
shadowFar = Math.max(Math.min(shadowFar, camera.frustum.far), shadowNear);
}
}

// Use the computed near and far for shadows
frameState.shadowHints.nearPlane = shadowNear;
frameState.shadowHints.farPlane = shadowFar;
frameState.shadowHints.closestObjectSize = shadowClosestObjectSize;
if (updateShadowHints) {
frameState.shadowHints.nearPlane = shadowNear;
frameState.shadowHints.farPlane = shadowFar;
frameState.shadowHints.closestObjectSize = shadowClosestObjectSize;
}

// Exploit temporal coherence. If the frustums haven't changed much, use the frustums computed
// last frame, else compute the new frustums and sort them by frustum again.
Expand Down Expand Up @@ -1418,7 +1425,7 @@ define([

if (scene.debugShowCommands || scene.debugShowFrustums) {
executeDebugCommand(command, scene, passState);
} else if (scene.frameState.shadowMaps.length > 0 && command.receiveShadows) {
} else if (!scene.frameState.passes.pick && scene.frameState.shadowMaps.length > 0 && command.receiveShadows) {
command.derivedCommands.shadows.receiveCommand.execute(context, passState);
} else {
command.execute(context, passState);
Expand Down Expand Up @@ -2052,6 +2059,11 @@ define([
var globe = scene._globe;
var shadowMaps = frameState.shadowMaps;
var length = shadowMaps.length;

if (length === 0 || frameState.passes.pick) {
return;
}

for (var i = 0; i < length; ++i) {
var shadowMap = shadowMaps[i];
shadowMap.update(frameState);
Expand Down

0 comments on commit 7e1e66e

Please sign in to comment.