Add support for implicit casting from Quaternion to other types in shaders
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -75,6 +75,17 @@ public:
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="ShaderGraphValue"/> struct.
|
||||
/// </summary>
|
||||
/// <param name="type">The type.</param>
|
||||
/// <param name="value">The value.</param>
|
||||
ShaderGraphValue(VariantType::Types type, const String&& value)
|
||||
: Type(type)
|
||||
, Value(MoveTemp(value))
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="ShaderGraphValue"/> struct.
|
||||
/// </summary>
|
||||
|
||||
@@ -204,6 +204,19 @@ float Luminance(float3 color)
|
||||
return dot(color, float3(0.299f, 0.587f, 0.114f));
|
||||
}
|
||||
|
||||
// Quaternion multiplication (http://mathworld.wolfram.com/Quaternion.html)
|
||||
float4 QuatMultiply(float4 q1, float4 q2)
|
||||
{
|
||||
return float4(q2.xyz * q1.w + q1.xyz * q2.w + cross(q1.xyz, q2.xyz), q1.w * q2.w - dot(q1.xyz, q2.xyz));
|
||||
}
|
||||
|
||||
// Vector rotation with a quaternion (http://mathworld.wolfram.com/Quaternion.html)
|
||||
float3 QuatRotateVector(float3 v, float4 q)
|
||||
{
|
||||
float4 nq = q * float4(-1, -1, -1, 1);
|
||||
return QuatMultiply(q, QuatMultiply(float4(v, 0), nq)).xyz;
|
||||
}
|
||||
|
||||
// Samples the unwrapped 3D texture (eg. volume texture of size 16x16x16 would be unwrapped to 256x16)
|
||||
float4 SampleUnwrappedTexture3D(Texture2D tex, SamplerState s, float3 uvw, float size)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user