diff --git a/Source/Engine/Visject/ShaderGraphValue.cpp b/Source/Engine/Visject/ShaderGraphValue.cpp
index cd3c1354a..828f9ac0f 100644
--- a/Source/Engine/Visject/ShaderGraphValue.cpp
+++ b/Source/Engine/Visject/ShaderGraphValue.cpp
@@ -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;
diff --git a/Source/Engine/Visject/ShaderGraphValue.h b/Source/Engine/Visject/ShaderGraphValue.h
index 913fdcf41..6c9a846fe 100644
--- a/Source/Engine/Visject/ShaderGraphValue.h
+++ b/Source/Engine/Visject/ShaderGraphValue.h
@@ -75,6 +75,17 @@ public:
{
}
+ ///
+ /// Initializes a new instance of the struct.
+ ///
+ /// The type.
+ /// The value.
+ ShaderGraphValue(VariantType::Types type, const String&& value)
+ : Type(type)
+ , Value(MoveTemp(value))
+ {
+ }
+
///
/// Initializes a new instance of the struct.
///
diff --git a/Source/Shaders/Common.hlsl b/Source/Shaders/Common.hlsl
index ed2951c7e..8e5a682c6 100644
--- a/Source/Shaders/Common.hlsl
+++ b/Source/Shaders/Common.hlsl
@@ -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)
{