Files
UnrealEngine/Engine/Source/Runtime/MovieSceneTracks/Private/Systems/MovieScenePreAnimatedMaterialParameters.cpp
Brandyn / Techy fcc1b09210 init
2026-04-04 15:40:51 -05:00

116 lines
4.6 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "Systems/MovieScenePreAnimatedMaterialParameters.h"
#include "Evaluation/PreAnimatedState/MovieScenePreAnimatedStorageID.inl"
#include "Materials/MaterialParameterCollectionInstance.h"
#include "Materials/MaterialInstanceDynamic.h"
#include "Materials/MaterialInterface.h"
namespace UE::MovieScene
{
TAutoRegisterPreAnimatedStorageID<FPreAnimatedScalarMaterialParameterStorage> FPreAnimatedScalarMaterialParameterStorage::StorageID;
TAutoRegisterPreAnimatedStorageID<FPreAnimatedVectorMaterialParameterStorage> FPreAnimatedVectorMaterialParameterStorage::StorageID;
FMaterialParameterKey::FMaterialParameterKey(const FObjectComponent& InBoundMaterial, const FName& InParameterName)
: BoundMaterial(InBoundMaterial.GetObject())
, ParameterInfo(InParameterName)
{}
FMaterialParameterKey::FMaterialParameterKey(const FObjectComponent& InBoundMaterial, const FMaterialParameterInfo& InParameterInfo)
: BoundMaterial(InBoundMaterial.GetObject())
, ParameterInfo(InParameterInfo)
{}
uint32 GetTypeHash(const FMaterialParameterKey& InKey)
{
return GetTypeHash(InKey.BoundMaterial) ^ GetTypeHash(InKey.ParameterInfo);
}
bool operator==(const FMaterialParameterKey& A, const FMaterialParameterKey& B)
{
return A.BoundMaterial == B.BoundMaterial && A.ParameterInfo == B.ParameterInfo;
}
void FMaterialParameterCollectionScalarTraits::ReplaceObject(FMaterialParameterKey& InOutKey, const FObjectKey& NewObject)
{
InOutKey.BoundMaterial = NewObject.ResolveObjectPtr();
}
float FMaterialParameterCollectionScalarTraits::CachePreAnimatedValue(const FObjectComponent& InBoundMaterial, const FName& ParameterName)
{
return CachePreAnimatedValue(InBoundMaterial, FMaterialParameterInfo(ParameterName));
}
float FMaterialParameterCollectionScalarTraits::CachePreAnimatedValue(const FObjectComponent& InBoundMaterial, const FMaterialParameterInfo& ParameterInfo)
{
UObject* BoundMaterial = InBoundMaterial.GetObject();
float ParameterValue = 0.f;
if (UMaterialParameterCollectionInstance* MPCI = Cast<UMaterialParameterCollectionInstance>(BoundMaterial))
{
MPCI->GetScalarParameterValue(ParameterInfo.Name, ParameterValue);
}
else if (UMaterialInterface* MaterialInterface = Cast<UMaterialInterface>(BoundMaterial))
{
MaterialInterface->GetScalarParameterValue(ParameterInfo, ParameterValue);
}
return ParameterValue;
}
void FMaterialParameterCollectionScalarTraits::RestorePreAnimatedValue(const FMaterialParameterKey& InKey, float OldValue, const FRestoreStateParams& Params)
{
UObject* BoundObject = InKey.BoundMaterial.ResolveObjectPtr();
if (UMaterialParameterCollectionInstance* MPCI = Cast<UMaterialParameterCollectionInstance>(BoundObject))
{
MPCI->SetScalarParameterValue(InKey.ParameterInfo.Name, OldValue);
}
else if (UMaterialInstanceDynamic* MID = Cast<UMaterialInstanceDynamic>(BoundObject))
{
MID->SetScalarParameterValueByInfo(InKey.ParameterInfo, OldValue);
}
}
void FMaterialParameterCollectionVectorTraits::ReplaceObject(FMaterialParameterKey& InOutKey, const FObjectKey& NewObject)
{
InOutKey.BoundMaterial = NewObject.ResolveObjectPtr();
}
FLinearColor FMaterialParameterCollectionVectorTraits::CachePreAnimatedValue(const FObjectComponent& InBoundMaterial, const FName& ParameterName)
{
return CachePreAnimatedValue(InBoundMaterial, FMaterialParameterInfo(ParameterName));
}
FLinearColor FMaterialParameterCollectionVectorTraits::CachePreAnimatedValue(const FObjectComponent& InBoundMaterial, const FMaterialParameterInfo& ParameterInfo)
{
UObject* BoundMaterial = InBoundMaterial.GetObject();
FLinearColor ParameterValue = FLinearColor::White;
if (UMaterialParameterCollectionInstance* MPCI = Cast<UMaterialParameterCollectionInstance>(BoundMaterial))
{
MPCI->GetVectorParameterValue(ParameterInfo.Name, ParameterValue);
}
else if (UMaterialInterface* MaterialInterface = Cast<UMaterialInterface>(BoundMaterial))
{
MaterialInterface->GetVectorParameterValue(ParameterInfo, ParameterValue);
}
return ParameterValue;
}
void FMaterialParameterCollectionVectorTraits::RestorePreAnimatedValue(const FMaterialParameterKey& InKey, const FLinearColor& OldValue, const FRestoreStateParams& Params)
{
UObject* BoundObject = InKey.BoundMaterial.ResolveObjectPtr();
if (UMaterialParameterCollectionInstance* MPCI = Cast<UMaterialParameterCollectionInstance>(BoundObject))
{
MPCI->SetVectorParameterValue(InKey.ParameterInfo.Name, OldValue);
}
else if (UMaterialInstanceDynamic* MID = Cast<UMaterialInstanceDynamic>(BoundObject))
{
MID->SetVectorParameterValueByInfo(InKey.ParameterInfo, OldValue);
}
}
} // namespace UE::MovieScene