Cesium3DTilesetMostDetailedTraversal.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. import Intersect from "../Core/Intersect.js";
  2. import ManagedArray from "../Core/ManagedArray.js";
  3. import Cesium3DTileRefine from "./Cesium3DTileRefine.js";
  4. /**
  5. * Traversal that loads all leaves that intersect the camera frustum.
  6. * Used to determine ray-tileset intersections during a pickFromRayMostDetailed call.
  7. *
  8. * @private
  9. */
  10. function Cesium3DTilesetMostDetailedTraversal() {}
  11. var traversal = {
  12. stack: new ManagedArray(),
  13. stackMaximumLength: 0,
  14. };
  15. Cesium3DTilesetMostDetailedTraversal.selectTiles = function (
  16. tileset,
  17. frameState
  18. ) {
  19. tileset._selectedTiles.length = 0;
  20. tileset._requestedTiles.length = 0;
  21. tileset._hasMixedContent = false;
  22. var ready = true;
  23. var root = tileset.root;
  24. root.updateVisibility(frameState);
  25. if (!isVisible(root)) {
  26. return ready;
  27. }
  28. var stack = traversal.stack;
  29. stack.push(tileset.root);
  30. while (stack.length > 0) {
  31. traversal.stackMaximumLength = Math.max(
  32. traversal.stackMaximumLength,
  33. stack.length
  34. );
  35. var tile = stack.pop();
  36. var add = tile.refine === Cesium3DTileRefine.ADD;
  37. var replace = tile.refine === Cesium3DTileRefine.REPLACE;
  38. var traverse = canTraverse(tileset, tile);
  39. if (traverse) {
  40. updateAndPushChildren(tileset, tile, stack, frameState);
  41. }
  42. if (add || (replace && !traverse)) {
  43. loadTile(tileset, tile);
  44. touchTile(tileset, tile, frameState);
  45. selectDesiredTile(tileset, tile, frameState);
  46. if (!hasEmptyContent(tile) && !tile.contentAvailable) {
  47. ready = false;
  48. }
  49. }
  50. visitTile(tileset);
  51. }
  52. traversal.stack.trim(traversal.stackMaximumLength);
  53. return ready;
  54. };
  55. function isVisible(tile) {
  56. return tile._visible && tile._inRequestVolume;
  57. }
  58. function hasEmptyContent(tile) {
  59. return tile.hasEmptyContent || tile.hasTilesetContent;
  60. }
  61. function hasUnloadedContent(tile) {
  62. return !hasEmptyContent(tile) && tile.contentUnloaded;
  63. }
  64. function canTraverse(tileset, tile) {
  65. if (tile.children.length === 0) {
  66. return false;
  67. }
  68. if (tile.hasTilesetContent) {
  69. // Traverse external tileset to visit its root tile
  70. // Don't traverse if the subtree is expired because it will be destroyed
  71. return !tile.contentExpired;
  72. }
  73. if (tile.hasEmptyContent) {
  74. return true;
  75. }
  76. return true; // Keep traversing until a leave is hit
  77. }
  78. function updateAndPushChildren(tileset, tile, stack, frameState) {
  79. var children = tile.children;
  80. var length = children.length;
  81. for (var i = 0; i < length; ++i) {
  82. var child = children[i];
  83. child.updateVisibility(frameState);
  84. if (isVisible(child)) {
  85. stack.push(child);
  86. }
  87. }
  88. }
  89. function loadTile(tileset, tile) {
  90. if (hasUnloadedContent(tile) || tile.contentExpired) {
  91. tile._priority = 0.0; // Highest priority
  92. tileset._requestedTiles.push(tile);
  93. }
  94. }
  95. function touchTile(tileset, tile, frameState) {
  96. if (tile._touchedFrame === frameState.frameNumber) {
  97. // Prevents another pass from touching the frame again
  98. return;
  99. }
  100. tileset._cache.touch(tile);
  101. tile._touchedFrame = frameState.frameNumber;
  102. }
  103. function visitTile(tileset) {
  104. ++tileset.statistics.visited;
  105. }
  106. function selectDesiredTile(tileset, tile, frameState) {
  107. if (
  108. tile.contentAvailable &&
  109. tile.contentVisibility(frameState) !== Intersect.OUTSIDE
  110. ) {
  111. tileset._selectedTiles.push(tile);
  112. }
  113. }
  114. export default Cesium3DTilesetMostDetailedTraversal;