Skip to content

Commit 97159a4

Browse files
authored
Merge pull request #7115 from AnalyticalGraphicsInc/offscreen-picking
Clamp to 3D Tiles most detailed
2 parents 14af39b + 9956a08 commit 97159a4

31 files changed

+2260
-93
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="utf-8">
5+
<meta http-equiv="X-UA-Compatible" content="IE=edge">
6+
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no">
7+
<meta name="description" content="Sample the most detailed heights of a 3D Tileset.">
8+
<meta name="cesium-sandcastle-labels" content="Showcases, 3D Tiles">
9+
<title>Cesium Demo</title>
10+
<script type="text/javascript" src="../Sandcastle-header.js"></script>
11+
<script type="text/javascript" src="../../../ThirdParty/requirejs-2.1.20/require.js"></script>
12+
<script type="text/javascript">
13+
if(typeof require === 'function') {
14+
require.config({
15+
baseUrl : '../../../Source',
16+
waitSeconds : 120
17+
});
18+
}
19+
</script>
20+
</head>
21+
<body class="sandcastle-loading" data-sandcastle-bucket="bucket-requirejs.html">
22+
<style>
23+
@import url(../templates/bucket.css);
24+
</style>
25+
<div id="cesiumContainer" class="fullSize"></div>
26+
<div id="loadingOverlay"><h1>Loading...</h1></div>
27+
<div id="toolbar"></div>
28+
<script id="cesium_sandcastle_script">
29+
function startup(Cesium) {
30+
'use strict';
31+
//Sandcastle_Begin
32+
var viewer = new Cesium.Viewer('cesiumContainer', {
33+
terrainProvider : Cesium.createWorldTerrain()
34+
});
35+
var scene = viewer.scene;
36+
37+
var tileset = scene.primitives.add(
38+
new Cesium.Cesium3DTileset({
39+
url: Cesium.IonResource.fromAssetId(6074)
40+
})
41+
);
42+
43+
scene.camera.setView({
44+
destination: new Cesium.Cartesian3(1216411.0748779264, -4736313.10747583, 4081359.5125561724),
45+
orientation: new Cesium.HeadingPitchRoll(4.239925103568368, -0.4911293834802475, 6.279849292088564),
46+
endTransform : Cesium.Matrix4.IDENTITY
47+
});
48+
49+
Sandcastle.addToolbarButton('Sample heights', function() {
50+
sampleHeights();
51+
});
52+
53+
function sampleHeights() {
54+
if (!scene.clampToHeightSupported) {
55+
console.log('This browser does not support clampToHeightMostDetailed.');
56+
}
57+
58+
viewer.entities.removeAll();
59+
60+
var cartesian1 = new Cesium.Cartesian3(1216390.063324395, -4736314.814479433, 4081341.9787972216);
61+
var cartesian2 = new Cesium.Cartesian3(1216329.5413318684, -4736272.029009798, 4081407.9342479417);
62+
63+
var count = 30;
64+
var cartesians = new Array(count);
65+
for (var i = 0; i < count; ++i) {
66+
var offset = i / (count - 1);
67+
cartesians[i] = Cesium.Cartesian3.lerp(cartesian1, cartesian2, offset, new Cesium.Cartesian3());
68+
}
69+
70+
scene.clampToHeightMostDetailed(cartesians).then(function(clampedCartesians) {
71+
for (var i = 0; i < count; ++i) {
72+
viewer.entities.add({
73+
position: clampedCartesians[i],
74+
ellipsoid : {
75+
radii : new Cesium.Cartesian3(0.2, 0.2, 0.2),
76+
material : Cesium.Color.RED
77+
}
78+
});
79+
}
80+
81+
viewer.entities.add({
82+
polyline : {
83+
positions : clampedCartesians,
84+
followSurface : false,
85+
width : 2,
86+
material : new Cesium.PolylineOutlineMaterialProperty({
87+
color : Cesium.Color.YELLOW
88+
}),
89+
depthFailMaterial : new Cesium.PolylineOutlineMaterialProperty({
90+
color : Cesium.Color.YELLOW
91+
})
92+
}
93+
});
94+
});
95+
}
96+
//Sandcastle_End
97+
Sandcastle.finishedLoading();
98+
}
99+
if (typeof Cesium !== 'undefined') {
100+
startup(Cesium);
101+
} else if (typeof require === 'function') {
102+
require(['Cesium'], startup);
103+
}
104+
</script>
105+
</body>
106+
</html>
Loading

CHANGES.md

+3
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ Change Log
44
### 1.52 - 2018-12-03
55

66
##### Additions :tada:
7+
* Added functions to get the most detailed height of 3D Tiles on-screen or off-screen. [#7115](https://github.com/AnalyticalGraphicsInc/cesium/pull/7115)
8+
* Added `Scene.sampleHeightMostDetailed`, an asynchronous version of `Scene.sampleHeight` that uses the maximum level of detail for 3D Tiles.
9+
* Added `Scene.clampToHeightMostDetailed`, an asynchronous version of `Scene.clampToHeight` that uses the maximum level of detail for 3D Tiles.
710
* Added `Scene.invertClassificationSupported` for checking if invert classification is supported.
811
* Added `computeLineSegmentLineSegmentIntersection` to `Intersections2D`. [#7228](https://github.com/AnalyticalGraphicsInc/Cesium/pull/7228)
912

Source/Scene/Cesium3DTileset.js

+52-26
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ define([
2929
'./Cesium3DTileContentState',
3030
'./Cesium3DTileOptimizations',
3131
'./Cesium3DTileRefine',
32+
'./Cesium3DTilesetAsyncTraversal',
3233
'./Cesium3DTilesetCache',
3334
'./Cesium3DTilesetStatistics',
3435
'./Cesium3DTilesetTraversal',
@@ -73,6 +74,7 @@ define([
7374
Cesium3DTileContentState,
7475
Cesium3DTileOptimizations,
7576
Cesium3DTileRefine,
77+
Cesium3DTilesetAsyncTraversal,
7678
Cesium3DTilesetCache,
7779
Cesium3DTilesetStatistics,
7880
Cesium3DTilesetTraversal,
@@ -204,6 +206,7 @@ define([
204206
this._statistics = new Cesium3DTilesetStatistics();
205207
this._statisticsLastRender = new Cesium3DTilesetStatistics();
206208
this._statisticsLastPick = new Cesium3DTilesetStatistics();
209+
this._statisticsLastAsync = new Cesium3DTilesetStatistics();
207210

208211
this._tilesLoaded = false;
209212
this._initialTilesLoaded = false;
@@ -1707,9 +1710,9 @@ define([
17071710
function updateTiles(tileset, frameState) {
17081711
tileset._styleEngine.applyStyle(tileset, frameState);
17091712

1713+
var statistics = tileset._statistics;
17101714
var passes = frameState.passes;
17111715
var isRender = passes.render;
1712-
var statistics = tileset._statistics;
17131716
var commandList = frameState.commandList;
17141717
var numberOfInitialCommands = commandList.length;
17151718
var selectedTiles = tileset._selectedTiles;
@@ -1899,69 +1902,76 @@ define([
18991902

19001903
///////////////////////////////////////////////////////////////////////////
19011904

1902-
/**
1903-
* @private
1904-
*/
1905-
Cesium3DTileset.prototype.update = function(frameState) {
1905+
function update(tileset, frameState) {
19061906
if (frameState.mode === SceneMode.MORPHING) {
1907-
return;
1907+
return false;
19081908
}
19091909

1910-
if (!this.show || !this.ready) {
1911-
return;
1910+
if (!tileset.show || !tileset.ready) {
1911+
return false;
19121912
}
19131913

1914-
if (!defined(this._loadTimestamp)) {
1915-
this._loadTimestamp = JulianDate.clone(frameState.time);
1914+
if (!defined(tileset._loadTimestamp)) {
1915+
tileset._loadTimestamp = JulianDate.clone(frameState.time);
19161916
}
19171917

19181918
// Update clipping planes
1919-
var clippingPlanes = this._clippingPlanes;
1920-
this._clippingPlanesOriginMatrixDirty = true;
1919+
var clippingPlanes = tileset._clippingPlanes;
1920+
tileset._clippingPlanesOriginMatrixDirty = true;
19211921
if (defined(clippingPlanes) && clippingPlanes.enabled) {
19221922
clippingPlanes.update(frameState);
19231923
}
19241924

1925-
this._timeSinceLoad = Math.max(JulianDate.secondsDifference(frameState.time, this._loadTimestamp) * 1000, 0.0);
1925+
tileset._timeSinceLoad = Math.max(JulianDate.secondsDifference(frameState.time, tileset._loadTimestamp) * 1000, 0.0);
19261926

1927-
this._skipLevelOfDetail = this.skipLevelOfDetail && !defined(this._classificationType) && !this._disableSkipLevelOfDetail && !this._allTilesAdditive;
1927+
tileset._skipLevelOfDetail = tileset.skipLevelOfDetail && !defined(tileset._classificationType) && !tileset._disableSkipLevelOfDetail && !tileset._allTilesAdditive;
19281928

19291929
// Do out-of-core operations (new content requests, cache removal,
19301930
// process new tiles) only during the render pass.
19311931
var passes = frameState.passes;
19321932
var isRender = passes.render;
19331933
var isPick = passes.pick;
1934+
var isAsync = passes.async;
19341935

1935-
var statistics = this._statistics;
1936+
var statistics = tileset._statistics;
19361937
statistics.clear();
19371938

1938-
if (this.dynamicScreenSpaceError) {
1939-
updateDynamicScreenSpaceError(this, frameState);
1939+
if (tileset.dynamicScreenSpaceError) {
1940+
updateDynamicScreenSpaceError(tileset, frameState);
19401941
}
19411942

19421943
if (isRender) {
1943-
this._cache.reset();
1944+
tileset._cache.reset();
1945+
}
1946+
1947+
var ready;
1948+
1949+
if (isAsync) {
1950+
ready = Cesium3DTilesetAsyncTraversal.selectTiles(tileset, frameState);
1951+
} else {
1952+
ready = Cesium3DTilesetTraversal.selectTiles(tileset, frameState);
19441953
}
19451954

1946-
Cesium3DTilesetTraversal.selectTiles(this, frameState);
1955+
if (isRender || isAsync) {
1956+
requestTiles(tileset);
1957+
}
19471958

19481959
if (isRender) {
1949-
requestTiles(this);
1950-
processTiles(this, frameState);
1960+
processTiles(tileset, frameState);
19511961
}
19521962

1953-
updateTiles(this, frameState);
1963+
updateTiles(tileset, frameState);
19541964

19551965
if (isRender) {
1956-
unloadTiles(this);
1966+
unloadTiles(tileset);
19571967

19581968
// Events are raised (added to the afterRender queue) here since promises
19591969
// may resolve outside of the update loop that then raise events, e.g.,
19601970
// model's readyPromise.
1961-
raiseLoadProgressEvent(this, frameState);
1971+
raiseLoadProgressEvent(tileset, frameState);
19621972

19631973
if (statistics.selected !== 0) {
1964-
var credits = this._credits;
1974+
var credits = tileset._credits;
19651975
if (defined(credits)) {
19661976
var length = credits.length;
19671977
for (var i = 0; i < length; i++) {
@@ -1972,8 +1982,24 @@ define([
19721982
}
19731983

19741984
// Update last statistics
1975-
var statisticsLast = isPick ? this._statisticsLastPick : this._statisticsLastRender;
1985+
var statisticsLast = isAsync ? tileset._statisticsLastAsync : (isPick ? tileset._statisticsLastPick : tileset._statisticsLastRender);
19761986
Cesium3DTilesetStatistics.clone(statistics, statisticsLast);
1987+
1988+
return ready;
1989+
}
1990+
1991+
/**
1992+
* @private
1993+
*/
1994+
Cesium3DTileset.prototype.update = function(frameState) {
1995+
update(this, frameState);
1996+
};
1997+
1998+
/**
1999+
* @private
2000+
*/
2001+
Cesium3DTileset.prototype.updateAsync = function(frameState) {
2002+
return update(this, frameState);
19772003
};
19782004

19792005
/**

0 commit comments

Comments
 (0)