Files

137 lines
4.2 KiB
C++

#pragma once
#include "CesiumGltf/FeatureIdTexture.h"
#include "CesiumGltf/TextureView.h"
#include <cstdint>
namespace CesiumGltf {
struct Model;
/**
* @brief The status of a feature ID texture view.
*
* The {@link FeatureIdTextureView} constructor always completes successfully,
* but it may not always reflect the actual content of the
* {@link FeatureIdTexture}. This enumeration provides the reason.
*/
enum class FeatureIdTextureViewStatus {
/**
* @brief This view is valid and ready to use.
*/
Valid,
/**
* @brief This view has not yet been initialized.
*/
ErrorUninitialized,
/**
* @brief This feature ID texture has a texture index that doesn't exist in
* the glTF.
*/
ErrorInvalidTexture,
/**
* @brief This feature ID texture has an image index that doesn't exist in
* the glTF.
*/
ErrorInvalidImage,
/**
* @brief This feature ID texture has a sampler index that doesn't exist in
* the glTF.
*/
ErrorInvalidSampler,
/**
* @brief This feature ID texture has an empty image.
*/
ErrorEmptyImage,
/**
* @brief The image for this feature ID texture has channels that take up more
* than a byte. Only single-byte channels are supported.
*/
ErrorInvalidImageBytesPerChannel,
/**
* @brief The channels of this feature ID texture property are invalid.
* Channels must be in the range 0-3, with a minimum of one channel. Although
* more than four channels can be defined for specialized texture
* formats, this view only supports a maximum of four channels.
*/
ErrorInvalidChannels
};
/**
* @brief A view on the image data of {@link FeatureIdTexture}.
*
* It provides the ability to sample the feature IDs from the
* {@link FeatureIdTexture} using texture coordinates.
*/
class FeatureIdTextureView : public TextureView {
public:
/**
* @brief Constructs an uninitialized and invalid view.
*/
FeatureIdTextureView() noexcept;
/**
* @brief Construct a view of the data specified by a {@link FeatureIdTexture}.
*
* A feature ID texture may contain the `KHR_texture_transform` extension,
* which transforms the texture coordinates used to sample the texture. The
* extension may also override the TEXCOORD set index that was originally
* specified by the feature ID texture.
*
* If a view is constructed with applyKhrTextureTransformExtension set to
* true, the view will automatically apply the texture transform to any UV
* coordinates used to sample the texture. If the extension defines its own
* TEXCOORD set index, it will override the original value.
*
* Otherwise, if the flag is set to false, UVs will not be transformed and
* the original TEXCOORD set index will be preserved. The extension's values
* may still be retrieved using getTextureTransform, if desired.
*
* @param model The glTF in which to look for the feature ID texture's data.
* @param featureIdTexture The feature ID texture to create a view for.
* @param options The set of options to use for this `FeatureIdTextureView`.
*/
FeatureIdTextureView(
const Model& model,
const FeatureIdTexture& featureIdTexture,
const TextureViewOptions& options = TextureViewOptions()) noexcept;
/**
* @brief Get the feature ID from the texture at the given texture
* coordinates. If the texture is somehow invalid, this returns -1.
*
* @param u The u-component of the texture coordinates. Must be within
* [0.0, 1.0].
* @param v The v-component of the texture coordinates. Must be within
* [0.0, 1.0].
* @return The feature ID at the nearest pixel to the texture coordinates.
*/
int64_t getFeatureID(double u, double v) const noexcept;
/**
* @brief Get the status of this view.
*
* If invalid, it will not be safe to sample feature IDs from this view.
*/
FeatureIdTextureViewStatus status() const noexcept { return this->_status; }
/**
* @brief Get the channels of this feature ID texture. The channels represent
* the bytes of the actual feature ID, in little-endian order.
*/
std::vector<int64_t> getChannels() const noexcept { return this->_channels; }
private:
FeatureIdTextureViewStatus _status;
std::vector<int64_t> _channels;
};
} // namespace CesiumGltf