UMaterialGraphSchema implicitly truncates material types

`UMaterialGraphSchema` has fall out of sync since the change to make `EMaterialValueType` a uint64. [https://github.com/EpicGames/UnrealEngine/commit/80c69d990a5898c0990a6bf825ed76066bdf306d]

As we can see here:

https://github.com/EpicGames/UnrealEngine/blob/ue5\-main/Engine/Source/Editor/UnrealEd/Private/MaterialGraphSchema.cpp\#L348

uint32 InputType = GetMaterialValueType(InputPin); uint32 OutputType = GetMaterialValueType(OutputPin);

Subsequently, this breaks any new material value types, which are around the licence allocation bit range.

/** Reserved range for licensee modifications, any bits in the (inclusive) range is free for modifications */ MCT_LicenseeReservedBegin = 1ull << 48, MCT_LicenseeReservedEnd = 1ull << 63,

Many thanks,

Alister

Steps to Reproduce

In the hopes it helps, locally I’ve managed to patch this by changing things to be uint64.

I’ll be on holiday, so won’t really be able to make a pull request, but here’s a patch file.

`+++ ./Engine/Plugins/TextureGraph/Source/TextureGraphEditor/Private/EdGraph/TG_EdGraphSchema.cpp
— ./Engine/Plugins/TextureGraph/Source/TextureGraphEditor/Private/EdGraph/TG_EdGraphSchema.cpp

208c208
< const uint32 InputType = 1; //GetMaterialValueType(InputPin);

const uint64 InputType = 1; //GetMaterialValueType(InputPin);
230c230
< const uint32 OutputType = 1; //GetMaterialValueType(InputPin);


const uint64 OutputType = 1; //GetMaterialValueType(InputPin);

+++ ./Engine/Source/Editor/MaterialEditor/Private/MaterialEditorUtilities.cpp
— ./Engine/Source/Editor/MaterialEditor/Private/MaterialEditorUtilities.cpp

695c695
< uint32 FromPinType = 0;

uint64 FromPinType = 0;
743c743
< bool FMaterialEditorUtilities::HasCompatibleConnection(UClass* ExpressionClass, uint32 TestType, EEdGraphPinDirection TestDirection, bool bMaterialFunction)


bool FMaterialEditorUtilities::HasCompatibleConnection(UClass* ExpressionClass, uint64 TestType, EEdGraphPinDirection TestDirection, bool bMaterialFunction)

+++ ./Engine/Source/Editor/MaterialEditor/Private/MaterialNodes/SGraphSubstrateMaterial.cpp
— ./Engine/Source/Editor/MaterialEditor/Private/MaterialNodes/SGraphSubstrateMaterial.cpp

458c458
< const uint32 PinType = UMaterialGraphSchema::GetMaterialValueType(Pin);

const uint64 PinType = UMaterialGraphSchema::GetMaterialValueType(Pin);

+++ ./Engine/Source/Editor/MaterialEditor/Public/MaterialEditorUtilities.h
— ./Engine/Source/Editor/MaterialEditor/Public/MaterialEditorUtilities.h

303c303
< static bool HasCompatibleConnection(UClass* ExpressionClass, uint32 TestType, EEdGraphPinDirection TestDirection, bool bMaterialFunction);

static bool HasCompatibleConnection(UClass* ExpressionClass, uint64 TestType, EEdGraphPinDirection TestDirection, bool bMaterialFunction);

+++ ./Engine/Source/Editor/UnrealEd/Classes/MaterialGraph/MaterialGraphSchema.h
— ./Engine/Source/Editor/UnrealEd/Classes/MaterialGraph/MaterialGraphSchema.h

53c53
< UNREALED_API void SetFunctionInputType(class UMaterialExpressionFunctionInput* FunctionInput, uint32 MaterialValueType) const;

UNREALED_API void SetFunctionInputType(class UMaterialExpressionFunctionInput* FunctionInput, uint64 MaterialValueType) const;
257c257
< UNREALED_API static uint32 GetMaterialValueType(const UEdGraphPin* MaterialPin);


UNREALED_API static uint64 GetMaterialValueType(const UEdGraphPin* MaterialPin);
304c304
< bool HasCompatibleConnection(const FAssetData& FunctionAssetData, uint32 TestType, EEdGraphPinDirection TestDirection) const;


bool HasCompatibleConnection(const FAssetData& FunctionAssetData, uint64 TestType, EEdGraphPinDirection TestDirection) const;

+++ ./Engine/Source/Editor/UnrealEd/Private/MaterialGraphSchema.cpp
— ./Engine/Source/Editor/UnrealEd/Private/MaterialGraphSchema.cpp

112c112
< void FMaterialGraphSchemaAction_NewNode::SetFunctionInputType(UMaterialExpressionFunctionInput* FunctionInput, uint32 MaterialValueType) const

void FMaterialGraphSchemaAction_NewNode::SetFunctionInputType(UMaterialExpressionFunctionInput* FunctionInput, uint64 MaterialValueType) const
354,355c354,355
< uint32 InputType = GetMaterialValueType(InputPin);
< uint32 OutputType = GetMaterialValueType(OutputPin);


uint64 InputType = GetMaterialValueType(InputPin);
uint64 OutputType = GetMaterialValueType(OutputPin);
401c401
< uint32 UMaterialGraphSchema::GetMaterialValueType(const UEdGraphPin* MaterialPin)


uint64 UMaterialGraphSchema::GetMaterialValueType(const UEdGraphPin* MaterialPin)
554c554
< const uint32 InputType = GetMaterialValueType(InputPin);


const uint64 InputType = GetMaterialValueType(InputPin);
577c577
< const uint32 OutputType = GetMaterialValueType(InputPin);


const uint64 OutputType = GetMaterialValueType(InputPin);
913c913
< uint32 FromPinType = 0;


uint64 FromPinType = 0;
1091c1091
< bool UMaterialGraphSchema::HasCompatibleConnection(const FAssetData& FunctionAssetData, uint32 TestType, EEdGraphPinDirection TestDirection) const


bool UMaterialGraphSchema::HasCompatibleConnection(const FAssetData& FunctionAssetData, uint64 TestType, EEdGraphPinDirection TestDirection) const
1095,1096c1095,1096
< uint32 CombinedInputTypes = FunctionAssetData.GetTagValueRef(GET_MEMBER_NAME_CHECKED(UMaterialFunctionInterface, CombinedInputTypes));
< uint32 CombinedOutputTypes = FunctionAssetData.GetTagValueRef(GET_MEMBER_NAME_CHECKED(UMaterialFunctionInterface, CombinedOutputTypes));


uint64 CombinedInputTypes = FunctionAssetData.GetTagValueRef(GET_MEMBER_NAME_CHECKED(UMaterialFunctionInterface, CombinedInputTypes));
uint64 CombinedOutputTypes = FunctionAssetData.GetTagValueRef(GET_MEMBER_NAME_CHECKED(UMaterialFunctionInterface, CombinedOutputTypes));

+++ ./Engine/Source/Runtime/Engine/Private/Materials/MaterialExpressions.cpp
— ./Engine/Source/Runtime/Engine/Private/Materials/MaterialExpressions.cpp

391c391
< void GetMaterialValueTypeDescriptions(const uint32 MaterialValueType, TArray& OutDescriptions)

void GetMaterialValueTypeDescriptions(const uint64 MaterialValueType, TArray& OutDescriptions)
394c394
< uint32 MaskedFloatType = MaterialValueType & MCT_Float;


uint64 MaskedFloatType = MaterialValueType & MCT_Float;
418c418
< uint32 MaskedTextureType = MaterialValueType & MCT_Texture;


uint64 MaskedTextureType = MaterialValueType & MCT_Texture;
460c460
< bool CanConnectMaterialValueTypes(const uint32 InputType, const uint32 OutputType)


bool CanConnectMaterialValueTypes(const uint64 InputType, const uint64 OutputType)

+++ ./Engine/Source/Runtime/Engine/Public/Materials/MaterialFunctionInterface.h
— ./Engine/Source/Runtime/Engine/Public/Materials/MaterialFunctionInterface.h

167c167
< uint32 CombinedInputTypes;

uint64 CombinedInputTypes;
170c170
< uint32 CombinedOutputTypes;


uint64 CombinedOutputTypes;

+++ ./Engine/Source/Runtime/Engine/Public/MaterialShared.h
— ./Engine/Source/Runtime/Engine/Public/MaterialShared.h

2020c2020
< extern ENGINE_API void GetMaterialValueTypeDescriptions(const uint32 MaterialValueType, TArray& OutDescriptions);

extern ENGINE_API void GetMaterialValueTypeDescriptions(const uint64 MaterialValueType, TArray& OutDescriptions);
2023c2023
< extern ENGINE_API bool CanConnectMaterialValueTypes(const uint32 InputType, const uint32 OutputType);


extern ENGINE_API bool CanConnectMaterialValueTypes(const uint64 InputType, const uint64 OutputType);`

I suspect really what you want to do is have:

`using EMaterialValueUnderlyingType = uint64;

enum EMaterialValueType : EMaterialValueUnderlyingType;And have \EMaterialValueUnderlyingType` be used for the various bit masking operators, for a slightly more conceptually pure solution.

Many thanks,

Alister