Factory function for ActivatedRasterOverlay.

This commit is contained in:
Kevin Ring 2025-09-12 22:18:08 +10:00
parent c792367f8f
commit b5fc62f045
8 changed files with 43 additions and 28 deletions

View File

@ -91,7 +91,7 @@ void RasterOverlayCollection::add(
IntrusivePointer<OverlayList> pList = this->_pOverlays;
pList->overlays.push_back(pOverlay);
pList->activatedOverlays.emplace_back(new ActivatedRasterOverlay(
pList->activatedOverlays.emplace_back(ActivatedRasterOverlay::create(
RasterOverlayExternals{
.pAssetAccessor = this->_externals.pAssetAccessor,
.pPrepareRendererResources =

View File

@ -4,6 +4,7 @@
#include <CesiumAsync/SharedFuture.h>
#include <CesiumGeometry/Rectangle.h>
#include <CesiumGeospatial/Ellipsoid.h>
#include <CesiumRasterOverlays/Library.h>
#include <CesiumUtility/IntrusivePointer.h>
#include <CesiumUtility/ReferenceCounted.h>
@ -21,15 +22,16 @@ struct TileProviderAndTile;
namespace CesiumRasterOverlays {
class ActivatedRasterOverlay
class CESIUMRASTEROVERLAYS_API ActivatedRasterOverlay
: public CesiumUtility::ReferenceCountedNonThreadSafe<
ActivatedRasterOverlay> {
public:
ActivatedRasterOverlay(
static CesiumUtility::IntrusivePointer<ActivatedRasterOverlay> create(
const CesiumRasterOverlays::RasterOverlayExternals& externals,
const CesiumUtility::IntrusivePointer<
CesiumRasterOverlays::RasterOverlay>& pOverlay,
const CesiumGeospatial::Ellipsoid& ellipsoid);
~ActivatedRasterOverlay();
CesiumAsync::SharedFuture<void>& getReadyEvent();
@ -142,6 +144,12 @@ public:
bool loadTileThrottled(RasterOverlayTile& tile);
private:
ActivatedRasterOverlay(
const CesiumRasterOverlays::RasterOverlayExternals& externals,
const CesiumUtility::IntrusivePointer<
CesiumRasterOverlays::RasterOverlay>& pOverlay,
const CesiumGeospatial::Ellipsoid& ellipsoid);
CesiumAsync::Future<TileProviderAndTile>
doLoad(RasterOverlayTile& tile, bool isThrottledLoad);

View File

@ -18,21 +18,12 @@ using namespace CesiumUtility;
namespace CesiumRasterOverlays {
ActivatedRasterOverlay::ActivatedRasterOverlay(
IntrusivePointer<ActivatedRasterOverlay> ActivatedRasterOverlay::create(
const RasterOverlayExternals& externals,
const IntrusivePointer<RasterOverlay>& pOverlay,
const Ellipsoid& ellipsoid)
: _pOverlay(pOverlay),
_pPlaceholderTileProvider(
pOverlay->createPlaceholder(externals, ellipsoid)),
_pPlaceholderTile(nullptr),
_pTileProvider(nullptr),
_tileDataBytes(0),
_totalTilesCurrentlyLoading(0),
_throttledTilesCurrentlyLoading(0),
_readyEvent(externals.asyncSystem.createResolvedFuture().share()) {
this->_pPlaceholderTile =
new RasterOverlayTile(*this, glm::dvec2(0.0), Rectangle());
const Ellipsoid& ellipsoid) {
IntrusivePointer<ActivatedRasterOverlay> pResult =
new ActivatedRasterOverlay(externals, pOverlay, ellipsoid);
CesiumAsync::Future<RasterOverlay::CreateTileProviderResult> future =
pOverlay->createTileProvider(
@ -43,12 +34,9 @@ ActivatedRasterOverlay::ActivatedRasterOverlay(
externals.pLogger,
nullptr);
// This continuation, by capturing thiz, keeps the instance from being
// This continuation, by capturing pResult, keeps the instance from being
// destroyed. But it does not keep the RasterOverlayCollection itself alive.
IntrusivePointer<ActivatedRasterOverlay> thiz = this;
// TODO: dangerous to do this in the constructor, because no one else can
// possibly have a reference to it yet.
this->_readyEvent =
pResult->_readyEvent =
std::move(future)
.catchInMainThread(
[](const std::exception& e)
@ -61,7 +49,7 @@ ActivatedRasterOverlay::ActivatedRasterOverlay(
e.what())});
})
.thenInMainThread(
[pOverlay, thiz, externals](
[pOverlay, pResult, externals](
RasterOverlay::CreateTileProviderResult&& result) {
IntrusivePointer<RasterOverlayTileProvider> pProvider = nullptr;
if (result) {
@ -84,9 +72,28 @@ ActivatedRasterOverlay::ActivatedRasterOverlay(
externals.asyncSystem);
}
thiz->_pTileProvider = pProvider;
pResult->_pTileProvider = pProvider;
})
.share();
return pResult;
}
ActivatedRasterOverlay::ActivatedRasterOverlay(
const RasterOverlayExternals& externals,
const IntrusivePointer<RasterOverlay>& pOverlay,
const Ellipsoid& ellipsoid)
: _pOverlay(pOverlay),
_pPlaceholderTileProvider(
pOverlay->createPlaceholder(externals, ellipsoid)),
_pPlaceholderTile(nullptr),
_pTileProvider(nullptr),
_tileDataBytes(0),
_totalTilesCurrentlyLoading(0),
_throttledTilesCurrentlyLoading(0),
_readyEvent(externals.asyncSystem.createResolvedFuture().share()) {
this->_pPlaceholderTile =
new RasterOverlayTile(*this, glm::dvec2(0.0), Rectangle());
}
ActivatedRasterOverlay::~ActivatedRasterOverlay() {

View File

@ -132,7 +132,7 @@ TEST_CASE("Add raster overlay to glTF") {
new TileMapServiceRasterOverlay("test", tmr);
IntrusivePointer<ActivatedRasterOverlay> pActivated =
new ActivatedRasterOverlay(
ActivatedRasterOverlay::create(
RasterOverlayExternals{
.pAssetAccessor = pMockAssetAccessor,
.pPrepareRendererResources = nullptr,

View File

@ -74,7 +74,7 @@ TEST_CASE(
std::shared_ptr<CesiumNativeTests::SimpleAssetRequest>>());
IntrusivePointer<ActivatedRasterOverlay> pActivated =
new ActivatedRasterOverlay(
ActivatedRasterOverlay::create(
RasterOverlayExternals{
.pAssetAccessor = pAssetAccessor,
.pPrepareRendererResources = nullptr,

View File

@ -166,7 +166,7 @@ TEST_CASE("QuadtreeRasterOverlayTileProvider getTile") {
IntrusivePointer<TestRasterOverlay> pOverlay = new TestRasterOverlay("Test");
IntrusivePointer<ActivatedRasterOverlay> pActivated =
new ActivatedRasterOverlay(
ActivatedRasterOverlay::create(
RasterOverlayExternals{
pAssetAccessor,
nullptr,

View File

@ -73,7 +73,7 @@ TEST_CASE("TileMapServiceRasterOverlay") {
SUBCASE("can load images") {
IntrusivePointer<ActivatedRasterOverlay> pActivated =
new ActivatedRasterOverlay(
ActivatedRasterOverlay::create(
RasterOverlayExternals{
pMockAssetAccessor,
nullptr,

View File

@ -44,7 +44,7 @@ TEST_CASE("UrlTemplateRasterOverlay getTile") {
"http://example.com/{x}/{y}/{z}.png");
IntrusivePointer<ActivatedRasterOverlay> pActivated =
new ActivatedRasterOverlay(
ActivatedRasterOverlay::create(
RasterOverlayExternals{
pAssetAccessor,
nullptr,