test content and subtree available for subtrees

This commit is contained in:
Bao Tran 2022-07-05 15:21:38 -04:00
parent b1dbf11d35
commit 4b43dfde4f
1 changed files with 61 additions and 7 deletions

View File

@ -8,7 +8,7 @@
using namespace Cesium3DTilesSelection;
namespace {
void markAvailableForQuadtree(
void markTileAvailableForQuadtree(
const CesiumGeometry::QuadtreeTileID& tileID,
std::vector<std::byte>& available) {
// This function assumes that subtree tile ID is (0, 0, 0).
@ -22,6 +22,16 @@ void markAvailableForQuadtree(
const uint64_t bitIndex = availabilityBitIndex % 8;
available[byteIndex] |= std::byte(1 << bitIndex);
}
void markSubtreeAvailableForQuadtree(
const CesiumGeometry::QuadtreeTileID& tileID,
std::vector<std::byte>& available) {
uint64_t availabilityBitIndex =
libmorton::morton2D_64_encode(tileID.x, tileID.y);
const uint64_t byteIndex = availabilityBitIndex / 8;
const uint64_t bitIndex = availabilityBitIndex % 8;
available[byteIndex] |= std::byte(1 << bitIndex);
}
} // namespace
TEST_CASE("Test SubtreeAvailability methods") {
@ -29,7 +39,10 @@ TEST_CASE("Test SubtreeAvailability methods") {
uint64_t maxSubtreeLevels = 5;
uint64_t maxTiles = static_cast<uint64_t>(
std::pow(4.0, static_cast<double>(maxSubtreeLevels - 1)));
uint64_t maxSubtreeTiles = uint64_t(1) << (2 * (maxSubtreeLevels));
uint64_t bufferSize = static_cast<uint64_t>(std::ceil(maxTiles / 8));
uint64_t subtreeBufferSize =
static_cast<uint64_t>(std::ceil(maxSubtreeTiles / 8));
// create expected available tiles
std::vector<CesiumGeometry::QuadtreeTileID> availableTileIDs;
@ -46,14 +59,31 @@ TEST_CASE("Test SubtreeAvailability methods") {
unavailableTileIDs.emplace_back(CesiumGeometry::QuadtreeTileID{2, 3, 0});
unavailableTileIDs.emplace_back(CesiumGeometry::QuadtreeTileID{3, 0, 4});
// create available subtree
std::vector<CesiumGeometry::QuadtreeTileID> availableSubtreeIDs;
availableSubtreeIDs.emplace_back(CesiumGeometry::QuadtreeTileID{5, 31, 31});
availableSubtreeIDs.emplace_back(CesiumGeometry::QuadtreeTileID{5, 30, 28});
availableSubtreeIDs.emplace_back(CesiumGeometry::QuadtreeTileID{5, 20, 10});
availableSubtreeIDs.emplace_back(CesiumGeometry::QuadtreeTileID{5, 11, 1});
// create unavailable subtree
std::vector<CesiumGeometry::QuadtreeTileID> unavailableSubtreeIDs;
unavailableSubtreeIDs.emplace_back(CesiumGeometry::QuadtreeTileID{5, 3, 31});
unavailableSubtreeIDs.emplace_back(CesiumGeometry::QuadtreeTileID{5, 10, 18});
unavailableSubtreeIDs.emplace_back(CesiumGeometry::QuadtreeTileID{5, 20, 12});
unavailableSubtreeIDs.emplace_back(CesiumGeometry::QuadtreeTileID{5, 11, 12});
// setup tile availability buffer
std::vector<std::byte> contentAvailabilityBuffer(bufferSize);
std::vector<std::byte> tileAvailabilityBuffer(bufferSize);
std::vector<std::byte> subtreeAvailabilityBuffer(
uint64_t(1) << (2 * (maxSubtreeLevels)));
std::vector<std::byte> subtreeAvailabilityBuffer(subtreeBufferSize);
for (const auto& tileID : availableTileIDs) {
markAvailableForQuadtree(tileID, tileAvailabilityBuffer);
markAvailableForQuadtree(tileID, contentAvailabilityBuffer);
markTileAvailableForQuadtree(tileID, tileAvailabilityBuffer);
markTileAvailableForQuadtree(tileID, contentAvailabilityBuffer);
}
for (const auto& subtreeID : availableSubtreeIDs) {
markSubtreeAvailableForQuadtree(subtreeID, subtreeAvailabilityBuffer);
}
std::vector<std::vector<std::byte>> buffers{
@ -87,7 +117,31 @@ TEST_CASE("Test SubtreeAvailability methods") {
}
}
SECTION("isContentAvailable()") {}
SECTION("isContentAvailable()") {
for (const auto& tileID : availableTileIDs) {
CHECK(quadtreeAvailability.isContentAvailable(
tileID.level,
libmorton::morton2D_64_encode(tileID.x, tileID.y),
0));
}
SECTION("isSubtreeAvailable()") {}
for (const auto& tileID : unavailableTileIDs) {
CHECK(!quadtreeAvailability.isContentAvailable(
tileID.level,
libmorton::morton2D_64_encode(tileID.x, tileID.y),
0));
}
}
SECTION("isSubtreeAvailable()") {
for (const auto& subtreeID : availableSubtreeIDs) {
CHECK(quadtreeAvailability.isSubtreeAvailable(
libmorton::morton2D_64_encode(subtreeID.x, subtreeID.y)));
}
for (const auto& subtreeID : unavailableSubtreeIDs) {
CHECK(!quadtreeAvailability.isSubtreeAvailable(
libmorton::morton2D_64_encode(subtreeID.x, subtreeID.y)));
}
}
}