Files
UnrealEngine/Engine/Plugins/TextureGraph/Source/TextureGraphEngine/FxMat/RenderMaterial_FX_Combined.cpp
2025-05-18 13:04:45 +08:00

106 lines
3.1 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "RenderMaterial_FX_Combined.h"
#include "FxMat/FxMaterial.h"
#include "Job/JobArgs.h"
#include "Job/Job.h"
#include "Transform/BlobTransform.h"
#include "Device/FX/DeviceBuffer_FX.h"
#include "Engine/TextureRenderTarget2DArray.h"
#include "Device/FX/Device_FX.h"
#include "2D/TexArray.h"
DEFINE_LOG_CATEGORY(LogRenderMaterial_FX_NoTile);
const FName RenderMaterial_FX_Combined::MemberName = "TileInfo";
RenderMaterial_FX_Combined::RenderMaterial_FX_Combined(FString InName, FxMaterialPtr InFXMaterial) : RenderMaterial_FX(InName, InFXMaterial)
{
verifyf(InFXMaterial->DoesMemberExist(MemberName), TEXT("Please add member %s to parameter of shader and modify shader enviornment"), *MemberName.ToString());
}
RenderMaterial_FX_Combined::~RenderMaterial_FX_Combined()
{
}
void RenderMaterial_FX_Combined::AddTileArgs(TransformArgs& Args)
{
FTileInfo TileInfo;
auto TileArgs = ARG_TILEINFO(TileInfo, TCHAR_TO_ANSI(*(MemberName.ToString())));
const_cast<Job*>(Args.JobObj)->AddArg(TileArgs);
}
AsyncPrepareResult RenderMaterial_FX_Combined::PrepareResources(const TransformArgs& Args)
{
AddTileArgs(const_cast<TransformArgs&>(Args));
std::vector<std::decay_t<AsyncPrepareResult>, std::allocator<std::decay_t<AsyncPrepareResult>>> Promises;
for (auto BlobToCombine : ToBeCombined)
{
int rows = BlobToCombine->Rows();
int cols = BlobToCombine->Cols();
ResourceBindInfo BindInfo;
BindInfo.bIsCombined = true;
BindInfo.NumTilesX = rows;
BindInfo.NumTilesY = cols;
BindInfo.Dev = Device_FX::Get();
Promises.push_back(BlobToCombine->PrepareForWrite(BindInfo));
}
if (Promises.empty())
return cti::make_ready_continuable(0);
return cti::make_continuable<int32>([Promises = std::move(Promises)](auto&& Promise) mutable
{
cti::when_all(Promises.begin(), Promises.end()).then([FWD_PROMISE(Promise)]() mutable
{
/// Resolve the Promise on game thread
Util::OnGameThread([FWD_PROMISE(Promise)]() mutable
{
Promise.set_value(0);
});
});
});
}
std::shared_ptr<BlobTransform> RenderMaterial_FX_Combined::DuplicateInstance(FString NewName)
{
if (NewName.IsEmpty())
NewName = Name;
check(FXMaterial);
FxMaterialPtr Clone = FXMaterial->Clone();
check(Clone);
RenderMaterial_FX_CombinedPtr noTileMat = std::make_shared<RenderMaterial_FX_Combined>(NewName, Clone);
return std::static_pointer_cast<BlobTransform>(noTileMat);
}
AsyncTransformResultPtr RenderMaterial_FX_Combined::Exec(const TransformArgs& Args)
{
return RenderMaterial::Exec(Args);
}
TiledBlobPtr RenderMaterial_FX_Combined::AddBlobToCombine(TiledBlobPtr BlobToCombine)
{
ToBeCombined.Add(BlobToCombine);
return BlobToCombine;
}
void RenderMaterial_FX_Combined::FreeCombinedBlob()
{
for (auto BlobToCombine : ToBeCombined)
{
DeviceBufferRef SourceBuffer = BlobToCombine->GetBufferRef();
DeviceBuffer_FX* SourceFXBuffer = static_cast<DeviceBuffer_FX*>(SourceBuffer.get());
TexArrayPtr SourceTexArray = std::static_pointer_cast<TexArray>(SourceFXBuffer->GetTexture());
if (SourceTexArray->GetRenderTargetArray()->GetResource())
SourceTexArray->GetRenderTargetArray()->ReleaseResource();
}
ToBeCombined.Empty();
}