diff --git a/Source/Editor/Surface/Archetypes/Material.cs b/Source/Editor/Surface/Archetypes/Material.cs index ceb9921cb..1c679a039 100644 --- a/Source/Editor/Surface/Archetypes/Material.cs +++ b/Source/Editor/Surface/Archetypes/Material.cs @@ -815,6 +815,23 @@ namespace FlaxEditor.Surface.Archetypes NodeElementArchetype.Factory.Output(0, string.Empty, typeof(Vector3), 1), } }, + new NodeArchetype + { + TypeID = 36, + Title = "HSVToRGB", + Description = "Converts a HSV value to linear RGB", + Flags = NodeFlags.MaterialGraph, + Size = new Vector2(160, 25), + DefaultValues = new object[] + { + new Vector3(240, 1, 1), + }, + Elements = new[] + { + NodeElementArchetype.Factory.Input(0, "HSV", true, typeof(Vector3), 0, 0), + NodeElementArchetype.Factory.Output(0, "RGB", typeof(Vector3), 1), + } + } }; } } diff --git a/Source/Engine/Tools/MaterialGenerator/MaterialGenerator.Material.cpp b/Source/Engine/Tools/MaterialGenerator/MaterialGenerator.Material.cpp index c1f250824..2abae3622 100644 --- a/Source/Engine/Tools/MaterialGenerator/MaterialGenerator.Material.cpp +++ b/Source/Engine/Tools/MaterialGenerator/MaterialGenerator.Material.cpp @@ -458,6 +458,22 @@ void MaterialGenerator::ProcessGroupMaterial(Box* box, Node* node, Value& value) value = writeLocal(ValueType::Vector3, String::Format(TEXT("{1} < 1000.0f ? {0} * {1}/1000.0f : {0}"), color.Value, temperature.Value), node); break; } + // HSVToRGB + case 36: + { + const auto hsv = tryGetValue(node->GetBox(0), node->Values[0]).AsVector3(); + + // Normalize + auto color = writeLocal(ValueType::Vector3, String::Format(TEXT("float3({0}.x / 360, {0}.y, {0}.z)"), hsv.Value), node); + + auto x1 = writeLocal(ValueType::Vector3, String::Format(TEXT("clamp(abs(fmod({0}.x * 6.0 + float3(0.0f, 4.0f, 2.0f), 6.0f) - 3.0f) - 1.0f, 0.0f, 1.0f)"), color.Value), node); + + // Smooth out + auto x2 = writeLocal(ValueType::Vector3, String::Format(TEXT("{0} * {0} * (3.0 - 2.0 * {0})"), x1.Value), node); + value = writeLocal(ValueType::Vector3, String::Format(TEXT("{1}.z * lerp(float3(1.0, 1.0, 1.0), {0}, {1}.y)"), x2.Value, color.Value), node); + + break; + } default: break; }