cesium-native/Cesium3DTilesSelection/src/RasterOverlayTile.cpp

95 lines
3.0 KiB
C++

#include "Cesium3DTilesSelection/RasterOverlayTile.h"
#include "Cesium3DTilesSelection/IPrepareRendererResources.h"
#include "Cesium3DTilesSelection/RasterOverlay.h"
#include "Cesium3DTilesSelection/RasterOverlayTileProvider.h"
#include "Cesium3DTilesSelection/TilesetExternals.h"
#include "CesiumAsync/IAssetResponse.h"
#include "CesiumAsync/ITaskProcessor.h"
#include "CesiumUtility/joinToString.h"
using namespace CesiumAsync;
namespace Cesium3DTilesSelection {
RasterOverlayTile::RasterOverlayTile(RasterOverlay& overlay) noexcept
: _pOverlay(&overlay),
_targetGeometricError(0.0),
_rectangle(CesiumGeometry::Rectangle(0.0, 0.0, 0.0, 0.0)),
_tileCredits(),
_state(LoadState::Placeholder),
_image(),
_pRendererResources(nullptr),
_references(0),
_moreDetailAvailable(MoreDetailAvailable::Unknown) {}
RasterOverlayTile::RasterOverlayTile(
RasterOverlay& overlay,
double targetGeometricError,
const CesiumGeometry::Rectangle& rectangle)
: _pOverlay(&overlay),
_targetGeometricError(targetGeometricError),
_rectangle(rectangle),
_tileCredits(),
_state(LoadState::Unloaded),
_image(),
_pRendererResources(nullptr),
_references(0),
_moreDetailAvailable(MoreDetailAvailable::Unknown) {}
RasterOverlayTile::~RasterOverlayTile() {
RasterOverlayTileProvider* pTileProvider = this->_pOverlay->getTileProvider();
if (pTileProvider) {
const std::shared_ptr<IPrepareRendererResources>&
pPrepareRendererResources =
pTileProvider->getPrepareRendererResources();
if (pPrepareRendererResources) {
void* pLoadThreadResult =
this->getState() == RasterOverlayTile::LoadState::Done
? nullptr
: this->_pRendererResources;
void* pMainThreadResult =
this->getState() == RasterOverlayTile::LoadState::Done
? this->_pRendererResources
: nullptr;
pPrepareRendererResources->freeRaster(
*this,
pLoadThreadResult,
pMainThreadResult);
}
}
}
void RasterOverlayTile::loadInMainThread() {
if (this->getState() != RasterOverlayTile::LoadState::Loaded) {
return;
}
// Do the final main thread raster loading
RasterOverlayTileProvider* pTileProvider = this->_pOverlay->getTileProvider();
this->_pRendererResources =
pTileProvider->getPrepareRendererResources()->prepareRasterInMainThread(
*this,
this->_pRendererResources);
this->setState(LoadState::Done);
}
void RasterOverlayTile::addReference() noexcept { ++this->_references; }
void RasterOverlayTile::releaseReference() noexcept {
assert(this->_references > 0);
uint32_t references = --this->_references;
if (references == 0) {
assert(this->_pOverlay != nullptr);
assert(this->_pOverlay->getTileProvider() != nullptr);
this->_pOverlay->getTileProvider()->removeTile(this);
}
}
void RasterOverlayTile::setState(LoadState newState) {
this->_state = newState;
}
} // namespace Cesium3DTilesSelection