You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
o3de/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Processing/ImageAssetProducer.h

86 lines
3.1 KiB
C++

/*
* Copyright (c) Contributors to the Open 3D Engine Project.
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
*
* SPDX-License-Identifier: Apache-2.0 OR MIT
*
*/
#pragma once
#include <AssetBuilderSDK/AssetBuilderSDK.h>
#include <Atom/RPI.Reflect/Image/ImageMipChainAsset.h>
#include <Atom/RPI.Reflect/Image/StreamingImageAsset.h>
#include <Atom/ImageProcessing/ImageObject.h>
namespace ImageProcessingAtom
{
using namespace AZ;
/**
* The ImageAssetProducer saves an ImageObject to a StreamingImageAsset and several MipChainAsset. And save them to files on disk.
* It also generats a list of AssetBuilderSDK::JobProduct which can be used for Image Builder's ProcessJob's result.
*/
class ImageAssetProducer
{
public:
/**
* Constructor with all required initialization parameters.
* @param imageObject is the image object to be processed and saved
* @param saveFolder is the path of the folder where the image asset files be saved
* @param sourceAssetId is the asset id of this image. It's used to generate full asset id for MipChainAssets which will be referenced in StreamingImageAsset.
* @param sourceAssetName is the name of source asset file. It doesn't include path.
* @param subId is the product subId to use for the output product.
*/
ImageAssetProducer(
const IImageObjectPtr imageObject,
AZStd::string_view saveFolder,
const Data::AssetId& sourceAssetId,
AZStd::string_view sourceAssetName,
uint8_t numResidentMips,
uint32_t subId);
/// Build image assets for the image object and save them to asset files. It also generates AssetBuilderSDK jobProducts if it success.
bool BuildImageAssets();
/// Return the list of JobProducts. The list could be empty of the build process failed.
const AZStd::vector<AssetBuilderSDK::JobProduct>& GetJobProducts() const;
protected:
enum class ImageAssetType
{
Image,
MipChain,
};
// Generate one MipChainAsset
bool BuildMipChainAsset(const Data::AssetId& chainAssetId, uint32_t startMip, uint32_t mipLevels,
Data::Asset<RPI::ImageMipChainAsset>& outAsset, bool saveAsProduct);
// Generate all job products which can be used for AssetProcessor job response
void GenerateJobProducts();
// Save all generated assets to files
void SaveAssetsToFile();
// Generate product assets' full path
AZStd::string GenerateAssetFullPath(ImageAssetType assetType, uint32_t assetSubId);
private:
ImageAssetProducer() = default;
// All inputs. They shouldn't be modified.
const IImageObjectPtr m_imageObject;
const AZStd::string m_productFolder;
const Data::AssetId m_sourceAssetId;
const AZStd::string m_fileName;
const uint32_t m_subId = AZ::RPI::StreamingImageAsset::GetImageAssetSubId();
const uint8_t m_numResidentMips = 0u;
AZStd::vector<AssetBuilderSDK::JobProduct> m_jobProducts;
};
}