Files

248 lines
8.5 KiB
C++

#pragma once
#include "IPrepareRendererResources.h"
#include <CesiumGeometry/Rectangle.h>
#include <CesiumGeospatial/Projection.h>
#include <CesiumRasterOverlays/RasterOverlayTile.h>
#include <CesiumUtility/IntrusivePointer.h>
#include <memory>
namespace Cesium3DTilesSelection {
class Tile;
/**
* @brief The result of applying a {@link CesiumRasterOverlays::RasterOverlayTile} to geometry.
*
* Instances of this class are used by a {@link Tile} in order to map
* imagery data that is given as {@link CesiumRasterOverlays::RasterOverlayTile} instances
* to the 2D region that is covered by the tile geometry.
*/
class RasterMappedTo3DTile final {
public:
/**
* @brief The states indicating whether the raster tile is attached to the
* geometry.
*/
enum class AttachmentState {
/**
* @brief This raster tile is not yet attached to the geometry at all.
*/
Unattached = 0,
/**
* @brief This raster tile is attached to the geometry, but it is a
* temporary, low-res version usable while the full-res version is loading.
*/
TemporarilyAttached = 1,
/**
* @brief This raster tile is attached to the geometry.
*/
Attached = 2
};
/**
* @brief Creates a new instance.
*
* @param pRasterTile The {@link CesiumRasterOverlays::RasterOverlayTile} that is mapped to the
* geometry.
* @param textureCoordinateIndex The index of the texture coordinates to use
* with this mapped raster overlay.
*/
RasterMappedTo3DTile(
const CesiumUtility::IntrusivePointer<
CesiumRasterOverlays::RasterOverlayTile>& pRasterTile,
int32_t textureCoordinateIndex);
/**
* @brief Returns a {@link CesiumRasterOverlays::RasterOverlayTile} that is currently loading.
*
* The caller has to check the exact state of this tile, using
* {@link Tile::getState}.
*
* @return The tile that is loading, or `nullptr`.
*/
CesiumRasterOverlays::RasterOverlayTile* getLoadingTile() noexcept {
return this->_pLoadingTile.get();
}
/** @copydoc getLoadingTile */
const CesiumRasterOverlays::RasterOverlayTile*
getLoadingTile() const noexcept {
return this->_pLoadingTile.get();
}
/**
* @brief Returns the {@link CesiumRasterOverlays::RasterOverlayTile} that represents the imagery
* data that is ready to render.
*
* This will be `nullptr` when the tile data has not yet been loaded.
*
* @return The tile, or `nullptr`.
*/
CesiumRasterOverlays::RasterOverlayTile* getReadyTile() noexcept {
return this->_pReadyTile.get();
}
/** @copydoc getReadyTile */
const CesiumRasterOverlays::RasterOverlayTile* getReadyTile() const noexcept {
return this->_pReadyTile.get();
}
/**
* @brief Returns an identifier for the texture coordinates of this tile.
*
* The texture coordinates for this raster are found in the glTF as an
* attribute named `_CESIUMOVERLAY_n` where `n` is this value.
*
* @return The texture coordinate ID.
*/
int32_t getTextureCoordinateID() const noexcept {
return this->_textureCoordinateID;
}
/**
* @brief Sets the texture coordinate ID.
*
* @see getTextureCoordinateID
*
* @param textureCoordinateID The ID.
*/
void setTextureCoordinateID(int32_t textureCoordinateID) noexcept {
this->_textureCoordinateID = textureCoordinateID;
}
/**
* @brief Returns the translation that converts between the geometry texture
* coordinates and the texture coordinates that should be used to sample this
* raster texture.
*
* `rasterCoordinates = geometryCoordinates * scale + translation`
*
* @returns The translation.
*/
const glm::dvec2& getTranslation() const noexcept {
return this->_translation;
}
/**
* @brief Returns the scaling that converts between the geometry texture
* coordinates and the texture coordinates that should be used to sample this
* raster texture.
*
* @see getTranslation
*
* @returns The scaling.
*/
const glm::dvec2& getScale() const noexcept { return this->_scale; }
/**
* @brief Indicates whether this overlay tile is currently attached to its
* owning geometry tile.
*
* When a raster overlay tile is attached to a geometry tile,
* {@link IPrepareRendererResources::attachRasterInMainThread} is invoked.
* When it is detached,
* {@link IPrepareRendererResources::detachRasterInMainThread} is invoked.
*/
AttachmentState getState() const noexcept { return this->_state; }
/**
* @brief Update this tile during the update of its owner.
*
* This is only supposed to be called by
* `TilesetContentManager::updateDoneState`. It will return whether there is a
* more detailed version of the raster data available.
*
* @param prepareRendererResources The {@link IPrepareRendererResources} used to
* create render resources for raster overlay
* @param tile The owner tile.
* @return The {@link CesiumRasterOverlays::RasterOverlayTile::MoreDetailAvailable} state.
*/
CesiumRasterOverlays::RasterOverlayTile::MoreDetailAvailable
update(IPrepareRendererResources& prepareRendererResources, Tile& tile);
/**
* @copydoc CesiumRasterOverlays::RasterOverlayTile::isMoreDetailAvailable
*/
bool isMoreDetailAvailable() const noexcept;
/**
* @brief Detach the raster from the given tile.
* @param prepareRendererResources The IPrepareRendererResources used to
* detach raster overlay from the tile geometry
* @param tile The owner tile.
*/
void detachFromTile(
IPrepareRendererResources& prepareRendererResources,
Tile& tile) noexcept;
/**
* @brief Does a throttled load of the mapped {@link CesiumRasterOverlays::RasterOverlayTile}.
*
* @return If the mapped tile is already in the process of loading or it has
* already finished loading, this method does nothing and returns true. If too
* many loads are already in progress, this method does nothing and returns
* false. Otherwise, it begins the asynchronous process to load the tile and
* returns true.
*/
bool loadThrottled() noexcept;
/**
* @brief Creates a maping between a {@link CesiumRasterOverlays::RasterOverlay} and a {@link Tile}.
*
* The returned mapping will be to a placeholder {@link CesiumRasterOverlays::RasterOverlayTile} if
* the overlay's tile provider is not yet ready (i.e. it's still a
* placeholder) or if the overlap between the tile and the raster overlay
* cannot yet be determined because the projected rectangle of the tile is not
* yet known.
*
* Returns a pointer to the created `RasterMappedTo3DTile` in the Tile's
* {@link Tile::getMappedRasterTiles} collection. Note that this pointer may
* become invalid as soon as another item is added to or removed from this
* collection.
*
* @param maximumScreenSpaceError The maximum screen space error that is used
* for the current tile
* @param tileProvider The overlay tile provider to map to the tile. This may
* be a placeholder if the tile provider is not yet ready.
* @param placeholder The placeholder tile provider for this overlay. This is
* always a placeholder, even if the tile provider is already ready.
* @param tile The tile to which to map the overlay.
* @param missingProjections The list of projections for which there are not
* yet any texture coordiantes. On return, the given overlay's Projection may
* be added to this collection if the Tile does not yet have texture
* coordinates for the Projection and the Projection is not already in the
* collection.
* @param ellipsoid The {@link CesiumGeospatial::Ellipsoid}.
* @return A pointer the created mapping, which may be to a placeholder, or
* nullptr if no mapping was created at all because the Tile does not overlap
* the raster overlay.
*/
static RasterMappedTo3DTile* mapOverlayToTile(
double maximumScreenSpaceError,
CesiumRasterOverlays::RasterOverlayTileProvider& tileProvider,
CesiumRasterOverlays::RasterOverlayTileProvider& placeholder,
Tile& tile,
std::vector<CesiumGeospatial::Projection>& missingProjections,
const CesiumGeospatial::Ellipsoid& ellipsoid CESIUM_DEFAULT_ELLIPSOID);
private:
void computeTranslationAndScale(const Tile& tile);
CesiumUtility::IntrusivePointer<CesiumRasterOverlays::RasterOverlayTile>
_pLoadingTile;
CesiumUtility::IntrusivePointer<CesiumRasterOverlays::RasterOverlayTile>
_pReadyTile;
int32_t _textureCoordinateID;
glm::dvec2 _translation;
glm::dvec2 _scale;
AttachmentState _state;
bool _originalFailed;
};
} // namespace Cesium3DTilesSelection