diff --git a/Cesium3DTilesSelection/include/Cesium3DTilesSelection/TilesetViewGroup.h b/Cesium3DTilesSelection/include/Cesium3DTilesSelection/TilesetViewGroup.h index 18030755c..dc4a722a9 100644 --- a/Cesium3DTilesSelection/include/Cesium3DTilesSelection/TilesetViewGroup.h +++ b/Cesium3DTilesSelection/include/Cesium3DTilesSelection/TilesetViewGroup.h @@ -225,6 +225,24 @@ class CESIUM3DTILESSELECTION_API TilesetViewGroup final /** @inheritdoc */ const Tile* getNextTileToLoadInMainThread() override; + /** + * @brief Check if given credit is referenced in this view group's last frame. + * + * @param credit to test. + * @return True if the credit is referenced in this view group's last frame. + */ + bool isCreditReferenced(CesiumUtility::Credit credit) const noexcept; + + /** + * @brief Check if given credit is referenced in raster overlays in this + * view group's last frame. + * + * @param credit to test. + * @return True if the credit is referenced in raster overlays in this + * view group's last frame. + */ + bool isCreditReferencedByRaster(CesiumUtility::Credit credit) const noexcept; + private: double _weight = 1.0; std::vector _mainThreadLoadQueue; @@ -235,6 +253,8 @@ class CESIUM3DTILESSELECTION_API TilesetViewGroup final TraversalState _traversalState; CesiumUtility::CreditReferencer _previousFrameCredits; CesiumUtility::CreditReferencer _currentFrameCredits; + CesiumUtility::CreditReferencer _previousFrameRasterCredits; + CesiumUtility::CreditReferencer _currentFrameRasterCredits; }; } // namespace Cesium3DTilesSelection diff --git a/Cesium3DTilesSelection/src/TilesetViewGroup.cpp b/Cesium3DTilesSelection/src/TilesetViewGroup.cpp index 4dd1ccabe..cc8e1d0eb 100644 --- a/Cesium3DTilesSelection/src/TilesetViewGroup.cpp +++ b/Cesium3DTilesSelection/src/TilesetViewGroup.cpp @@ -202,6 +202,7 @@ void TilesetViewGroup::finishFrame( if (pRasterOverlayTile != nullptr) { for (const Credit& credit : pRasterOverlayTile->getCredits()) { this->_currentFrameCredits.addCreditReference(credit); + this->_currentFrameRasterCredits.addCreditReference(credit); } } } @@ -218,6 +219,11 @@ void TilesetViewGroup::finishFrame( this->_previousFrameCredits.releaseAllReferences(); std::swap(this->_previousFrameCredits, this->_currentFrameCredits); + + this->_previousFrameRasterCredits.releaseAllReferences(); + std::swap( + this->_previousFrameRasterCredits, + this->_currentFrameRasterCredits); } } @@ -259,4 +265,14 @@ const Tile* TilesetViewGroup::getNextTileToLoadInMainThread() { return pResult; } +bool TilesetViewGroup::isCreditReferenced( + CesiumUtility::Credit credit) const noexcept { + return this->_previousFrameCredits.isCreditReferenced(credit); +} + +bool TilesetViewGroup::isCreditReferencedByRaster( + CesiumUtility::Credit credit) const noexcept { + return this->_previousFrameRasterCredits.isCreditReferenced(credit); +} + } // namespace Cesium3DTilesSelection diff --git a/CesiumUtility/include/CesiumUtility/CreditReferencer.h b/CesiumUtility/include/CesiumUtility/CreditReferencer.h index 075f2471e..b156e05d7 100644 --- a/CesiumUtility/include/CesiumUtility/CreditReferencer.h +++ b/CesiumUtility/include/CesiumUtility/CreditReferencer.h @@ -106,6 +106,13 @@ class CreditReferencer { */ void releaseAllReferences() noexcept; + /** + * @brief Tests if a credit is referenced by this referencer. + * + * @param credit to test if it is referenced. + */ + bool isCreditReferenced(Credit credit) const noexcept; + private: std::shared_ptr _pCreditSystem; std::vector _references; diff --git a/CesiumUtility/src/CreditReferencer.cpp b/CesiumUtility/src/CreditReferencer.cpp index 94de96bdd..78eee130a 100644 --- a/CesiumUtility/src/CreditReferencer.cpp +++ b/CesiumUtility/src/CreditReferencer.cpp @@ -82,4 +82,15 @@ void CreditReferencer::releaseAllReferences() noexcept { this->_references.clear(); } +bool CreditReferencer::isCreditReferenced(Credit credit) const noexcept { + if (!this->_pCreditSystem) + return false; + + if (this->_references.size() <= credit.id) { + return false; + } + + return this->_references[credit.id] > 0; +} + } // namespace CesiumUtility diff --git a/CesiumUtility/test/TestCreditReferencer.cpp b/CesiumUtility/test/TestCreditReferencer.cpp index 34a917ae9..f2a003169 100644 --- a/CesiumUtility/test/TestCreditReferencer.cpp +++ b/CesiumUtility/test/TestCreditReferencer.cpp @@ -19,6 +19,7 @@ TEST_CASE("CreditReferencer") { referencer.addCreditReference(credit1); referencer.releaseAllReferences(); + REQUIRE(referencer.isCreditReferenced(credit1) == false); } SUBCASE("adds references to the underlying credit system") { @@ -115,5 +116,50 @@ TEST_CASE("CreditReferencer") { const CreditsSnapshot& snapshot2 = pCreditSystem->getSnapshot(); REQUIRE(snapshot2.currentCredits.size() == 0); } + + SUBCASE("and checks credit references") { + REQUIRE(pReferencer->isCreditReferenced(credit1) == true); + REQUIRE(pReferencer->isCreditReferenced(credit2) == true); + REQUIRE(pReferencer->isCreditReferenced(credit3) == false); + } + + SUBCASE("and checks credit references after releasing them") { + pReferencer->releaseAllReferences(); + REQUIRE(pReferencer->isCreditReferenced(credit1) == false); + REQUIRE(pReferencer->isCreditReferenced(credit2) == false); + REQUIRE(pReferencer->isCreditReferenced(credit3) == false); + } + + SUBCASE("and checks credit references after duplicating via the copy " + "constructor") { + CreditReferencer referencerCopy(*pReferencer); + REQUIRE(referencerCopy.isCreditReferenced(credit1) == true); + REQUIRE(referencerCopy.isCreditReferenced(credit2) == true); + REQUIRE(referencerCopy.isCreditReferenced(credit3) == false); + + pReferencer->releaseAllReferences(); + REQUIRE(pReferencer->isCreditReferenced(credit1) == false); + REQUIRE(pReferencer->isCreditReferenced(credit2) == false); + REQUIRE(pReferencer->isCreditReferenced(credit3) == false); + REQUIRE(referencerCopy.isCreditReferenced(credit1) == true); + REQUIRE(referencerCopy.isCreditReferenced(credit2) == true); + REQUIRE(referencerCopy.isCreditReferenced(credit3) == false); + } + + SUBCASE("and checks credit references after duplicating via the move " + "constructor") { + CreditReferencer referencerMove(std::move(*pReferencer)); + REQUIRE(referencerMove.isCreditReferenced(credit1) == true); + REQUIRE(referencerMove.isCreditReferenced(credit2) == true); + REQUIRE(referencerMove.isCreditReferenced(credit3) == false); + + pReferencer->releaseAllReferences(); + REQUIRE(pReferencer->isCreditReferenced(credit1) == false); + REQUIRE(pReferencer->isCreditReferenced(credit2) == false); + REQUIRE(pReferencer->isCreditReferenced(credit3) == false); + REQUIRE(referencerMove.isCreditReferenced(credit1) == true); + REQUIRE(referencerMove.isCreditReferenced(credit2) == true); + REQUIRE(referencerMove.isCreditReferenced(credit3) == false); + } } }