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) {