MCPcopy Create free account
hub / github.com/CesiumGS/cesium-native / computeAvailability

Method computeAvailability

CesiumGeometry/src/QuadtreeAvailability.cpp:70–209  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

68 _pRoot(nullptr) {}
69
70uint8_t QuadtreeAvailability::computeAvailability(
71 const QuadtreeTileID& tileID) const noexcept {
72
73 // The root tile and root tile's subtree are implicitly available.
74 if (!this->_pRoot && tileID.level == 0) {
75 return TileAvailabilityFlags::TILE_AVAILABLE |
76 TileAvailabilityFlags::SUBTREE_AVAILABLE;
77 }
78
79 if (!this->_pRoot || tileID.level > this->_maximumLevel) {
80 return 0;
81 }
82
83 uint32_t level = 0;
84 AvailabilityNode* pNode = this->_pRoot.get();
85
86 while (pNode && pNode->subtree && tileID.level >= level) {
87 const AvailabilitySubtree& subtree = *pNode->subtree;
88
89 AvailabilityAccessor tileAvailabilityAccessor(
90 subtree.tileAvailability,
91 subtree);
92 AvailabilityAccessor contentAvailabilityAccessor(
93 subtree.contentAvailability,
94 subtree);
95 AvailabilityAccessor subtreeAvailabilityAccessor(
96 subtree.subtreeAvailability,
97 subtree);
98
99 uint32_t levelsLeft = tileID.level - level;
100 uint32_t subtreeRelativeMask = ~(0xFFFFFFFF << levelsLeft);
101
102 if (levelsLeft < this->_subtreeLevels) {
103 // The availability info is within this subtree.
104 uint8_t availability = TileAvailabilityFlags::REACHABLE;
105
106 uint32_t relativeMortonIndex = getMortonIndex(
107 tileID.x & subtreeRelativeMask,
108 tileID.y & subtreeRelativeMask);
109
110 // For reference:
111 // https://github.com/CesiumGS/3d-tiles/tree/3d-tiles-next/extensions/3DTILES_implicit_tiling#availability-bitstream-lengths
112 // The below is identical to:
113 // (4^levelRelativeToSubtree - 1) / 3
114 uint32_t offset = ((1U << (levelsLeft << 1U)) - 1U) / 3U;
115
116 uint32_t availabilityIndex = relativeMortonIndex + offset;
117 uint32_t byteIndex = availabilityIndex >> 3;
118 uint8_t bitIndex = static_cast<uint8_t>(availabilityIndex & 7);
119 uint8_t bitMask = static_cast<uint8_t>(1 << bitIndex);
120
121 // Check tile availability.
122 if ((tileAvailabilityAccessor.isConstant() &&
123 tileAvailabilityAccessor.getConstant()) ||
124 (tileAvailabilityAccessor.isBufferView() &&
125 (uint8_t)tileAvailabilityAccessor[byteIndex] & bitMask)) {
126 availability |= TileAvailabilityFlags::TILE_AVAILABLE;
127 }

Callers

nothing calls this directly

Calls 4

countOnesInBufferFunction · 0.85
countOnesInByteFunction · 0.85
getMortonIndexFunction · 0.70
getMethod · 0.45

Tested by

no test coverage detected