Files
UnrealEngine/Engine/Source/Editor/UnrealEd/Private/EditorParameters.cpp
2025-05-18 13:04:45 +08:00

266 lines
9.9 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "Containers/UnrealString.h"
#include "MaterialEditor/DEditorDoubleVectorParameterValue.h"
#include "MaterialEditor/DEditorFontParameterValue.h"
#include "MaterialEditor/DEditorMaterialLayersParameterValue.h"
#include "MaterialEditor/DEditorParameterValue.h"
#include "MaterialEditor/DEditorRuntimeVirtualTextureParameterValue.h"
#include "MaterialEditor/DEditorSparseVolumeTextureParameterValue.h"
#include "MaterialEditor/DEditorScalarParameterValue.h"
#include "MaterialEditor/DEditorStaticComponentMaskParameterValue.h"
#include "MaterialEditor/DEditorStaticSwitchParameterValue.h"
#include "MaterialEditor/DEditorTextureParameterValue.h"
#include "MaterialEditor/DEditorTextureCollectionParameterValue.h"
#include "MaterialEditor/DEditorVectorParameterValue.h"
#include "MaterialEditor/DEditorEnumerationParameterValue.h"
#include "Materials/MaterialEnumeration.h"
#include "Materials/MaterialParameters.h"
#include "Math/Color.h"
#include "Math/Vector4.h"
#include "Misc/AssertionMacros.h"
#include "Misc/Guid.h"
#include "UObject/Object.h"
#include "UObject/ObjectPtr.h"
#include "UObject/SoftObjectPtr.h"
#include "UObject/UObjectGlobals.h"
UDEditorParameterValue::UDEditorParameterValue(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
}
UDEditorFontParameterValue::UDEditorFontParameterValue(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
}
UDEditorMaterialLayersParameterValue::UDEditorMaterialLayersParameterValue(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
}
UDEditorScalarParameterValue::UDEditorScalarParameterValue(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
}
UDEditorStaticComponentMaskParameterValue::UDEditorStaticComponentMaskParameterValue(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
}
UDEditorStaticSwitchParameterValue::UDEditorStaticSwitchParameterValue(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
}
UDEditorTextureParameterValue::UDEditorTextureParameterValue(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
}
UDEditorTextureCollectionParameterValue::UDEditorTextureCollectionParameterValue(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
}
UDEditorVectorParameterValue::UDEditorVectorParameterValue(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
}
UDEditorDoubleVectorParameterValue::UDEditorDoubleVectorParameterValue(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
}
UDEditorRuntimeVirtualTextureParameterValue::UDEditorRuntimeVirtualTextureParameterValue(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
}
UDEditorSparseVolumeTextureParameterValue::UDEditorSparseVolumeTextureParameterValue(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
}
UDEditorEnumerationParameterValue::UDEditorEnumerationParameterValue(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
}
TArray<FString> UDEditorEnumerationParameterValue::GetEntryOptions() const
{
TArray<FString> Options;
if (Enumeration)
{
Cast<IMaterialEnumerationProvider>(Enumeration.Get())->ForEachEntry([&Options](FName InEntryName, int32 InEntryValue)
{
Options.Add(InEntryName.ToString());
});
}
if (Options.IsEmpty())
{
Options.Add(TEXT("None"));
}
return Options;
}
static UDEditorParameterValue* CreateParameter_Scalar(UObject* Owner, const FMaterialParameterMetadata& Meta)
{
UDEditorScalarParameterValue* Parameter = NewObject<UDEditorScalarParameterValue>(Owner);
if (Meta.Value.Type == EMaterialParameterType::Scalar)
{
Parameter->ParameterValue = Meta.Value.AsScalar();
Parameter->SliderMin = Meta.ScalarMin;
Parameter->SliderMax = Meta.ScalarMax;
Parameter->AtlasData.bIsUsedAsAtlasPosition = Meta.bUsedAsAtlasPosition;
Parameter->AtlasData.Atlas = Meta.ScalarAtlas;
Parameter->AtlasData.Curve = Meta.ScalarCurve;
Parameter->bUseCustomPrimitiveData = Meta.PrimitiveDataIndex != INDEX_NONE;
}
return Parameter;
}
static UDEditorParameterValue* CreateParameter_Vector(UObject* Owner, const FMaterialParameterMetadata& Meta)
{
UDEditorVectorParameterValue* Parameter = NewObject<UDEditorVectorParameterValue>(Owner);
if (Meta.Value.Type == EMaterialParameterType::Vector)
{
Parameter->ParameterValue = Meta.Value.AsLinearColor();
Parameter->bIsUsedAsChannelMask = Meta.bUsedAsChannelMask;
Parameter->bUseCustomPrimitiveData = Meta.PrimitiveDataIndex != INDEX_NONE;
Parameter->ChannelNames = Meta.ChannelNames;
}
return Parameter;
}
static UDEditorParameterValue* CreateParameter_DoubleVector(UObject* Owner, const FMaterialParameterMetadata& Meta)
{
UDEditorDoubleVectorParameterValue* Parameter = NewObject<UDEditorDoubleVectorParameterValue>(Owner);
if (Meta.Value.Type == EMaterialParameterType::DoubleVector)
{
Parameter->ParameterValue = Meta.Value.AsVector4d();
}
return Parameter;
}
static UDEditorParameterValue* CreateParameter_Texture(UObject* Owner, const FMaterialParameterMetadata& Meta)
{
UDEditorTextureParameterValue* Parameter = NewObject<UDEditorTextureParameterValue>(Owner);
if (Meta.Value.Type == EMaterialParameterType::Texture)
{
Parameter->ParameterValue = Meta.Value.Texture;
Parameter->ChannelNames = Meta.ChannelNames;
}
return Parameter;
}
static UDEditorParameterValue* CreateParameter_TextureCollection(UObject* Owner, const FMaterialParameterMetadata& Meta)
{
UDEditorTextureCollectionParameterValue* Parameter = NewObject<UDEditorTextureCollectionParameterValue>(Owner);
if (Meta.Value.Type == EMaterialParameterType::TextureCollection)
{
Parameter->ParameterValue = Meta.Value.TextureCollection;
}
return Parameter;
}
static UDEditorParameterValue* CreateParameter_RuntimeVirtualTexture(UObject* Owner, const FMaterialParameterMetadata& Meta)
{
UDEditorRuntimeVirtualTextureParameterValue* Parameter = NewObject<UDEditorRuntimeVirtualTextureParameterValue>(Owner);
if (Meta.Value.Type == EMaterialParameterType::RuntimeVirtualTexture)
{
Parameter->ParameterValue = Meta.Value.RuntimeVirtualTexture;
}
return Parameter;
}
static UDEditorParameterValue* CreateParameter_SparseVolumeTexture(UObject* Owner, const FMaterialParameterMetadata& Meta)
{
UDEditorSparseVolumeTextureParameterValue* Parameter = NewObject<UDEditorSparseVolumeTextureParameterValue>(Owner);
if (Meta.Value.Type == EMaterialParameterType::SparseVolumeTexture)
{
Parameter->ParameterValue = Meta.Value.SparseVolumeTexture;
}
return Parameter;
}
static UDEditorParameterValue* CreateParameter_Font(UObject* Owner, const FMaterialParameterMetadata& Meta)
{
UDEditorFontParameterValue* Parameter = NewObject<UDEditorFontParameterValue>(Owner);
if (Meta.Value.Type == EMaterialParameterType::Font)
{
Parameter->ParameterValue.FontValue = Meta.Value.Font.Value;
Parameter->ParameterValue.FontPage = Meta.Value.Font.Page;
}
return Parameter;
}
static UDEditorParameterValue* CreateParameter_StaticSwitch(UObject* Owner, const FMaterialParameterMetadata& Meta)
{
UDEditorStaticSwitchParameterValue* Parameter = NewObject<UDEditorStaticSwitchParameterValue>(Owner);
if (Meta.Value.Type == EMaterialParameterType::StaticSwitch)
{
Parameter->ParameterValue = Meta.Value.AsStaticSwitch();
}
return Parameter;
}
static UDEditorParameterValue* CreateParameter_StaticComponentMask(UObject* Owner, const FMaterialParameterMetadata& Meta)
{
UDEditorStaticComponentMaskParameterValue* Parameter = NewObject<UDEditorStaticComponentMaskParameterValue>(Owner);
if (Meta.Value.Type == EMaterialParameterType::StaticComponentMask)
{
Parameter->ParameterValue.R = Meta.Value.Bool[0];
Parameter->ParameterValue.G = Meta.Value.Bool[1];
Parameter->ParameterValue.B = Meta.Value.Bool[2];
Parameter->ParameterValue.A = Meta.Value.Bool[3];
}
return Parameter;
}
static UDEditorParameterValue* CreateParameter_Enumeration(UObject* Owner, const FMaterialParameterMetadata& Meta)
{
UDEditorEnumerationParameterValue* Parameter = NewObject<UDEditorEnumerationParameterValue>(Owner);
if (Meta.Value.Type == EMaterialParameterType::Enumeration)
{
Parameter->Enumeration = Meta.Enumeration;
Parameter->ParameterValue = Meta.Value.EnumEntry;
}
return Parameter;
}
UDEditorParameterValue* UDEditorParameterValue::Create(UObject* Owner,
EMaterialParameterType Type,
const FMaterialParameterInfo& ParameterInfo,
const FMaterialParameterMetadata& Meta)
{
UDEditorParameterValue* Parameter = nullptr;
switch (Type)
{
case EMaterialParameterType::Scalar: Parameter = CreateParameter_Scalar(Owner, Meta); break;
case EMaterialParameterType::Vector: Parameter = CreateParameter_Vector(Owner, Meta); break;
case EMaterialParameterType::DoubleVector: Parameter = CreateParameter_DoubleVector(Owner, Meta); break;
case EMaterialParameterType::Texture: Parameter = CreateParameter_Texture(Owner, Meta); break;
case EMaterialParameterType::TextureCollection: Parameter = CreateParameter_TextureCollection(Owner, Meta); break;
case EMaterialParameterType::RuntimeVirtualTexture: Parameter = CreateParameter_RuntimeVirtualTexture(Owner, Meta); break;
case EMaterialParameterType::SparseVolumeTexture: Parameter = CreateParameter_SparseVolumeTexture(Owner, Meta); break;
case EMaterialParameterType::Font: Parameter = CreateParameter_Font(Owner, Meta); break;
case EMaterialParameterType::StaticSwitch: Parameter = CreateParameter_StaticSwitch(Owner, Meta); break;
case EMaterialParameterType::StaticComponentMask: Parameter = CreateParameter_StaticComponentMask(Owner, Meta); break;
case EMaterialParameterType::Enumeration: Parameter = CreateParameter_Enumeration(Owner, Meta); break;
default: break;
}
check(Parameter);
Parameter->ParameterInfo = ParameterInfo;
Parameter->ExpressionId = Meta.ExpressionGuid;
Parameter->Description = Meta.Description;
Parameter->AssetPath = Meta.AssetPath;
Parameter->SortPriority = Meta.SortPriority;
Parameter->bOverride = Meta.bOverride;
return Parameter;
}