Files
2025-05-18 13:04:45 +08:00

134 lines
3.9 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "RenderMaterial_FX.h"
#include "FxMat/FxMaterial.h"
#include "2D/Tex.h"
#include "Kismet/KismetRenderingLibrary.h"
#include "TextureGraphEngineGameInstance.h"
#include "Engine/Canvas.h"
#include "TextureGraphEngine.h"
#include "Engine/TextureRenderTarget2DArray.h"
#include <TextureResource.h>
RenderMaterial_FX::RenderMaterial_FX(FString InName, FxMaterialPtr InFXMaterial)
: RenderMaterial(InName)
, FXMaterial(InFXMaterial)
{
static constexpr int32 MaxName = 256;
char FullName[MaxName] = {0};
FMemory::Memcpy((char*)FullName, (const char*)TCHAR_TO_ANSI(*InName), (size_t)std::min((int32)InName.Len(), MaxName - 1));
HashValue = std::make_shared<CHash>(DataUtil::Hash((const uint8*)FullName, sizeof(FullName)), true);
}
RenderMaterial_FX::~RenderMaterial_FX()
{
}
CHashPtr RenderMaterial_FX::Hash() const
{
return HashValue;
}
void RenderMaterial_FX::SetTexture(FName InName, const UTexture* Texture) const
{
FXMaterial->SetTextureParameterValue(InName, Texture);
}
void RenderMaterial_FX::SetArrayTexture(FName InName, const std::vector<const UTexture*>& Textures) const
{
FXMaterial->SetArrayTextureParameterValue(InName, Textures);
}
void RenderMaterial_FX::SetInt(FName InName, int32 Value) const
{
FXMaterial->SetScalarParameterValue(InName, Value);
}
void RenderMaterial_FX::SetFloat(FName InName, float Value) const
{
FXMaterial->SetScalarParameterValue(InName, Value);
}
void RenderMaterial_FX::SetColor(FName InName, const FLinearColor& Value) const
{
FXMaterial->SetVectorParameterValue(InName, Value);
}
void RenderMaterial_FX::SetIntVector4(FName InName, const FIntVector4& Value) const
{
FXMaterial->SetVectorParameterValue(InName, Value);
}
void RenderMaterial_FX::SetMatrix(FName InName, const FMatrix& Value) const
{
FXMaterial->SetMatrixParameterValue(InName, Value);
}
std::shared_ptr<BlobTransform> RenderMaterial_FX::DuplicateInstance(FString NewName)
{
if (NewName.IsEmpty())
NewName = Name;
check(FXMaterial);
FxMaterialPtr Clone = FXMaterial->Clone();
check(Clone);
return std::static_pointer_cast<BlobTransform>(std::make_shared<RenderMaterial_FX>(NewName, Clone));
}
void RenderMaterial_FX::BlitTo(FRHICommandListImmediate& RHI, UTextureRenderTarget2D* RenderTarget, const RenderMesh* MeshObj, int32 TargetId) const
{
check(RenderTarget);
FTextureRenderTarget2DResource* RTRes = (FTextureRenderTarget2DResource*)RenderTarget->GetRenderTargetResource();
check(RTRes);
FTextureRHIRef TextureRHI = RTRes->GetTextureRHI();
check(TextureRHI);
TextureRHI->SetName(FName(*RenderTarget->GetName()));
FXMaterial->Blit(RHI, TextureRHI, MeshObj, TargetId);
}
void RenderMaterial_FX::Bind(int32 Value, const ResourceBindInfo& BindInfo)
{
check(FXMaterial);
FXMaterial->SetScalarParameterValue(*BindInfo.Target, Value);
}
void RenderMaterial_FX::Bind(float Value, const ResourceBindInfo& BindInfo)
{
check(FXMaterial);
FXMaterial->SetScalarParameterValue(*BindInfo.Target, Value);
}
void RenderMaterial_FX::Bind(const FLinearColor& Value, const ResourceBindInfo& BindInfo)
{
check(FXMaterial);
FXMaterial->SetVectorParameterValue(*BindInfo.Target, Value);
}
void RenderMaterial_FX::Bind(const FIntVector4& Value, const ResourceBindInfo& BindInfo)
{
check(FXMaterial);
FXMaterial->SetVectorParameterValue(*BindInfo.Target, Value);
}
void RenderMaterial_FX::Bind(const FMatrix& Value, const ResourceBindInfo& BindInfo)
{
check(FXMaterial);
FXMaterial->SetMatrixParameterValue(*BindInfo.Target, Value);
}
void RenderMaterial_FX::BindStruct(const char* ValueAddress, size_t StructSize, const ResourceBindInfo& BindInfo)
{
FXMaterial->SetStructParameterValue(*BindInfo.Target, ValueAddress, StructSize);
}
void RenderMaterial_FX::BindScalarArray(const char* StartingAddress, size_t TypeSize, size_t ArraySize, const ResourceBindInfo& BindInfo)
{
FXMaterial->SetArrayParameterValue(*BindInfo.Target, StartingAddress, TypeSize, ArraySize);
}