#pragma once #include #include #include #include #include #include namespace CesiumGltf { /** * @brief The byte range within a buffer where this mip exists. */ struct CESIUMGLTF_API ImageAssetMipPosition { /** * @brief The byte index where this mip begins. */ size_t byteOffset; /** * @brief The size in bytes of this mip. */ size_t byteSize; }; /** * @brief A 2D image asset, including its pixel data. The image may have * mipmaps, and it may be encoded in a GPU compression format. */ struct CESIUMGLTF_API ImageAsset final : public CesiumUtility::SharedAsset { /** * @brief The width of the image in pixels. */ int32_t width = 0; /** * @brief The height of the image in pixels. */ int32_t height = 0; /** * @brief The number of channels per pixel. */ int32_t channels = 4; /** * @brief The number of bytes per channel. */ int32_t bytesPerChannel = 1; /** * @brief The gpu compressed pixel format for this image or NONE if it is not * compressed. */ GpuCompressedPixelFormat compressedPixelFormat = GpuCompressedPixelFormat::NONE; /** * @brief The offset of each mip in the pixel data. * * A list of the positions of each mip's data within the overall pixel buffer. * The first element will be the full image, the second will be the second * biggest and etc. If this is empty, assume the entire buffer is a single * image, the mip map will need to be generated on the client in this case. */ std::vector mipPositions; /** * @brief The pixel data. * * This will be the raw pixel data when compressedPixelFormat is std::nullopt. * Otherwise, this buffer will store the compressed pixel data in the * specified format. * * If mipPositions is not empty, this buffer will contains multiple mips * back-to-back. * * When this is an uncompressed texture: * -The pixel data is consistent with the * [stb](https://github.com/nothings/stb) image library. * * -For a correctly-formed image, the size of the array will be * `width * height * channels * bytesPerChannel` bytes. There is no * padding between rows or columns of the image, regardless of format. * * -The channels and their meaning are as follows: * * | Number of Channels | Channel Order and Meaning | * |--------------------|---------------------------| * | 1 | grey | * | 2 | grey, alpha | * | 3 | red, green, blue | * | 4 | red, green, blue, alpha | */ std::vector pixelData; /** * @brief The effective size of this image, in bytes, for estimating resource * usage for caching purposes. * * When this value is less than zero (the default), the size of this image * should be assumed to equal the size of the {@link pixelData} array. When * it is greater than or equal to zero, the specified size should be used * instead. For example, the overridden size may account for: * * The `pixelData` being cleared during the load process in order to save * memory. * * The cost of any renderer resources (e.g., GPU textures) created for * this image. */ int64_t sizeBytes = -1; /** * @brief Constructs an empty image asset. */ ImageAsset() = default; /** * @brief Converts this image to the given number of channels. * * If the new channel count is lower than the current channel count (for * example, RGBA -> RG), the conversion happens in-place and the extra * channels' values are dropped. If the new channel count is greater than the * current channel count (for example, RG -> RGBA), a new `pixelData` buffer * is allocated and the missing channels are filled with `defaultValue`. * * @param newChannels The new number of channels for this image. * @param defaultValue The default value for missing channels when increasing * the channel count. * * @warning Currently only works with one-byte-per-channel images. */ void changeNumberOfChannels( int32_t newChannels, std::byte defaultValue = std::byte{0}); /** * @brief Gets the size of this asset, in bytes. * * If {@link sizeBytes} is greater than or equal to zero, it is returned. * Otherwise, the size of the {@link pixelData} array is returned. */ int64_t getSizeBytes() const { return this->sizeBytes >= 0 ? this->sizeBytes : static_cast(this->pixelData.size()); } }; } // namespace CesiumGltf