Add support for implicit casting from Quaternion to other types in shaders

This commit is contained in:
Wojciech Figat
2022-03-28 14:48:21 +02:00
parent fc138bbbbb
commit 2b83975ea2
3 changed files with 55 additions and 3 deletions

View File

@@ -2,6 +2,7 @@
#include "ShaderGraphValue.h"
#include "Engine/Core/Log.h"
#include "Engine/Core/Math/Quaternion.h"
#include "Engine/Core/Math/Vector2.h"
#include "Engine/Core/Math/Vector3.h"
#include "Engine/Core/Math/Vector4.h"
@@ -54,6 +55,10 @@ ShaderGraphValue::ShaderGraphValue(const Variant& v)
Type = VariantType::Types::Vector4;
Value = String::Format(TEXT("float4({0}, {1}, {2}, {3})"), (*(Vector4*)v.AsData).X, (*(Vector4*)v.AsData).Y, (*(Vector4*)v.AsData).Z, (*(Vector4*)v.AsData).W);
break;
case VariantType::Quaternion:
Type = VariantType::Types::Quaternion;
Value = String::Format(TEXT("float4({0}, {1}, {2}, {3})"), (*(Quaternion*)v.AsData).X, (*(Quaternion*)v.AsData).Y, (*(Quaternion*)v.AsData).Z, (*(Quaternion*)v.AsData).W);
break;
case VariantType::String:
Type = VariantType::Types::String;
Value = (StringView)v;
@@ -115,11 +120,14 @@ ShaderGraphValue ShaderGraphValue::InitForZero(VariantType::Types type)
case VariantType::Types::Color:
v = TEXT("float4(0, 0, 0, 0)");
break;
case VariantType::Types::Quaternion:
v = TEXT("float4(0, 0, 0, 1)");
break;
case VariantType::Types::Void:
v = TEXT("((Material)0)");
break;
default:
CRASH;
CRASH;
v = nullptr;
}
return ShaderGraphValue(type, String(v));
@@ -145,11 +153,12 @@ ShaderGraphValue ShaderGraphValue::InitForHalf(VariantType::Types type)
v = TEXT("float3(0.5, 0.5, 0.5)");
break;
case VariantType::Types::Vector4:
case VariantType::Types::Quaternion:
case VariantType::Types::Color:
v = TEXT("float4(0.5, 0.5, 0.5, 0.5)");
break;
default:
CRASH;
CRASH;
v = nullptr;
}
return ShaderGraphValue(type, String(v));
@@ -175,11 +184,12 @@ ShaderGraphValue ShaderGraphValue::InitForOne(VariantType::Types type)
v = TEXT("float3(1, 1, 1)");
break;
case VariantType::Types::Vector4:
case VariantType::Types::Quaternion:
case VariantType::Types::Color:
v = TEXT("float4(1, 1, 1, 1)");
break;
default:
CRASH;
CRASH;
v = nullptr;
}
return ShaderGraphValue(type, String(v));
@@ -208,6 +218,7 @@ ShaderGraphValue ShaderGraphValue::Cast(const ShaderGraphValue& v, VariantType::
case VariantType::Types::Vector2:
case VariantType::Types::Vector3:
case VariantType::Types::Vector4:
case VariantType::Types::Quaternion:
case VariantType::Types::Color:
format = TEXT("((bool){0}.x)");
break;
@@ -224,6 +235,7 @@ ShaderGraphValue ShaderGraphValue::Cast(const ShaderGraphValue& v, VariantType::
case VariantType::Types::Vector2:
case VariantType::Types::Vector3:
case VariantType::Types::Vector4:
case VariantType::Types::Quaternion:
case VariantType::Types::Color:
format = TEXT("((int){0}.x)");
break;
@@ -240,6 +252,7 @@ ShaderGraphValue ShaderGraphValue::Cast(const ShaderGraphValue& v, VariantType::
case VariantType::Types::Vector2:
case VariantType::Types::Vector3:
case VariantType::Types::Vector4:
case VariantType::Types::Quaternion:
case VariantType::Types::Color:
format = TEXT("((uint){0}.x)");
break;
@@ -256,6 +269,7 @@ ShaderGraphValue ShaderGraphValue::Cast(const ShaderGraphValue& v, VariantType::
case VariantType::Types::Vector2:
case VariantType::Types::Vector3:
case VariantType::Types::Vector4:
case VariantType::Types::Quaternion:
case VariantType::Types::Color:
format = TEXT("((float){0}.x)");
break;
@@ -272,6 +286,7 @@ ShaderGraphValue ShaderGraphValue::Cast(const ShaderGraphValue& v, VariantType::
break;
case VariantType::Types::Vector3:
case VariantType::Types::Vector4:
case VariantType::Types::Quaternion:
case VariantType::Types::Color:
format = TEXT("{0}.xy");
break;
@@ -293,6 +308,9 @@ ShaderGraphValue ShaderGraphValue::Cast(const ShaderGraphValue& v, VariantType::
case VariantType::Types::Color:
format = TEXT("{0}.xyz");
break;
case VariantType::Types::Quaternion:
format = TEXT("QuatRotateVector(float3(0, 0, 1), {0})");
break;
}
break;
case VariantType::Types::Vector4:
@@ -312,6 +330,16 @@ ShaderGraphValue ShaderGraphValue::Cast(const ShaderGraphValue& v, VariantType::
format = TEXT("float4({0}.xyz, 0)");
break;
case VariantType::Types::Color:
case VariantType::Types::Vector4:
case VariantType::Types::Quaternion:
format = TEXT("{0}");
break;
}
break;
case VariantType::Types::Quaternion:
switch (v.Type)
{
case VariantType::Types::Color:
case VariantType::Types::Vector4:
format = TEXT("{0}");
break;