diff --git a/Source/Engine/Particles/Graph/GPU/ParticleEmitterGraph.GPU.Parameters.cpp b/Source/Engine/Particles/Graph/GPU/ParticleEmitterGraph.GPU.Parameters.cpp deleted file mode 100644 index bcb672eb3..000000000 --- a/Source/Engine/Particles/Graph/GPU/ParticleEmitterGraph.GPU.Parameters.cpp +++ /dev/null @@ -1,98 +0,0 @@ -// Copyright (c) 2012-2021 Wojciech Figat. All rights reserved. - -#if COMPILE_WITH_PARTICLE_GPU_GRAPH - -#include "ParticleEmitterGraph.GPU.h" - -void ParticleEmitterGPUGenerator::ProcessGroupParameters(Box* box, Node* node, Value& value) -{ - switch (node->TypeID) - { - // Get - case 1: - case 2: - { - // Get parameter - const auto param = findParam((Guid)node->Values[0]); - if (param) - { - switch (param->Type) - { - case MaterialParameterType::Bool: - value = Value(VariantType::Bool, param->ShaderName); - break; - case MaterialParameterType::Integer: - case MaterialParameterType::SceneTexture: - value = Value(VariantType::Int, param->ShaderName); - break; - case MaterialParameterType::Float: - value = Value(VariantType::Float, param->ShaderName); - break; - case MaterialParameterType::Vector2: - case MaterialParameterType::Vector3: - case MaterialParameterType::Vector4: - case MaterialParameterType::Color: - { - // Set result values based on box ID - const Value sample(box->Type.Type, param->ShaderName); - switch (box->ID) - { - case 0: - value = sample; - break; - case 1: - value.Value = sample.Value + _subs[0]; - break; - case 2: - value.Value = sample.Value + _subs[1]; - break; - case 3: - value.Value = sample.Value + _subs[2]; - break; - case 4: - value.Value = sample.Value + _subs[3]; - break; - default: CRASH; - break; - } - value.Type = box->Type.Type; - break; - } - - case MaterialParameterType::Matrix: - { - value = Value(box->Type.Type, String::Format(TEXT("{0}[{1}]"), param->ShaderName, box->ID)); - break; - } - case MaterialParameterType::ChannelMask: - { - const auto input = tryGetValue(node->GetBox(0), Value::Zero); - value = writeLocal(VariantType::Float, String::Format(TEXT("dot({0}, {1})"), input.Value, param->ShaderName), node); - break; - } - case MaterialParameterType::CubeTexture: - case MaterialParameterType::Texture: - case MaterialParameterType::GPUTextureArray: - case MaterialParameterType::GPUTextureCube: - case MaterialParameterType::GPUTextureVolume: - case MaterialParameterType::GPUTexture: - value = Value(VariantType::Object, param->ShaderName); - break; - default: - CRASH; - break; - } - } - else - { - OnError(node, box, String::Format(TEXT("Missing graph parameter {0}."), node->Values[0])); - value = Value::Zero; - } - break; - } - default: - break; - } -} - -#endif diff --git a/Source/Engine/Particles/Graph/GPU/ParticleEmitterGraph.GPU.Particles.cpp b/Source/Engine/Particles/Graph/GPU/ParticleEmitterGraph.GPU.Particles.cpp index 4839d0415..08e7b24ca 100644 --- a/Source/Engine/Particles/Graph/GPU/ParticleEmitterGraph.GPU.Particles.cpp +++ b/Source/Engine/Particles/Graph/GPU/ParticleEmitterGraph.GPU.Particles.cpp @@ -113,6 +113,131 @@ ParticleEmitterGPUGenerator::Value ParticleEmitterGPUGenerator::AccessParticleAt return value.Variable; } +void ParticleEmitterGPUGenerator::ProcessGroupParameters(Box* box, Node* node, Value& value) +{ + switch (node->TypeID) + { + // Get + case 1: + case 2: + { + // Get parameter + const auto param = findParam((Guid)node->Values[0]); + if (param) + { + switch (param->Type) + { + case MaterialParameterType::Bool: + value = Value(VariantType::Bool, param->ShaderName); + break; + case MaterialParameterType::Integer: + case MaterialParameterType::SceneTexture: + value = Value(VariantType::Int, param->ShaderName); + break; + case MaterialParameterType::Float: + value = Value(VariantType::Float, param->ShaderName); + break; + case MaterialParameterType::Vector2: + case MaterialParameterType::Vector3: + case MaterialParameterType::Vector4: + case MaterialParameterType::Color: + { + // Set result values based on box ID + const Value sample(box->Type.Type, param->ShaderName); + switch (box->ID) + { + case 0: + value = sample; + break; + case 1: + value.Value = sample.Value + _subs[0]; + break; + case 2: + value.Value = sample.Value + _subs[1]; + break; + case 3: + value.Value = sample.Value + _subs[2]; + break; + case 4: + value.Value = sample.Value + _subs[3]; + break; + default: CRASH; + break; + } + value.Type = box->Type.Type; + break; + } + + case MaterialParameterType::Matrix: + { + value = Value(box->Type.Type, String::Format(TEXT("{0}[{1}]"), param->ShaderName, box->ID)); + break; + } + case MaterialParameterType::ChannelMask: + { + const auto input = tryGetValue(node->GetBox(0), Value::Zero); + value = writeLocal(VariantType::Float, String::Format(TEXT("dot({0}, {1})"), input.Value, param->ShaderName), node); + break; + } + case MaterialParameterType::CubeTexture: + case MaterialParameterType::Texture: + case MaterialParameterType::GPUTextureArray: + case MaterialParameterType::GPUTextureCube: + case MaterialParameterType::GPUTextureVolume: + case MaterialParameterType::GPUTexture: + value = Value(VariantType::Object, param->ShaderName); + break; + default: + CRASH; + break; + } + } + else + { + OnError(node, box, String::Format(TEXT("Missing graph parameter {0}."), node->Values[0])); + value = Value::Zero; + } + break; + } + default: + break; + } +} + +void ParticleEmitterGPUGenerator::ProcessGroupTools(Box* box, Node* node, Value& value) +{ + switch (node->TypeID) + { + // Linearize Depth + case 7: + { + // Get input + const Value depth = tryGetValue(node->GetBox(0), Value::Zero).AsFloat(); + + // Linearize raw device depth + linearizeSceneDepth(node, depth, value); + break; + } + // Time + case 8: + value = box->ID == 0 ? Value(VariantType::Float, TEXT("Time")) : Value(VariantType::Float, TEXT("DeltaTime")); + break; + // Transform Position To Screen UV + case 9: + { + const Value position = tryGetValue(node->GetBox(0), Value::Zero).AsVector3(); + const Value projPos = writeLocal(VariantType::Vector4, String::Format(TEXT("mul(float4({0}, 1.0f), ViewProjectionMatrix)"), position.Value), node); + _writer.Write(TEXT("\t{0}.xy /= {0}.w;\n"), projPos.Value); + _writer.Write(TEXT("\t{0}.xy = {0}.xy * 0.5f + 0.5f;\n"), projPos.Value); + value = Value(VariantType::Vector2, projPos.Value + TEXT(".xy")); + break; + } + default: + ShaderGenerator::ProcessGroupTools(box, node, value); + break; + } +} + void ParticleEmitterGPUGenerator::ProcessGroupParticles(Box* box, Node* node, Value& value) { switch (node->TypeID) diff --git a/Source/Engine/Particles/Graph/GPU/ParticleEmitterGraph.GPU.Textures.cpp b/Source/Engine/Particles/Graph/GPU/ParticleEmitterGraph.GPU.Textures.cpp index 61273b3a1..e1d864b4e 100644 --- a/Source/Engine/Particles/Graph/GPU/ParticleEmitterGraph.GPU.Textures.cpp +++ b/Source/Engine/Particles/Graph/GPU/ParticleEmitterGraph.GPU.Textures.cpp @@ -256,10 +256,8 @@ void ParticleEmitterGPUGenerator::ProcessGroupTextures(Box* box, Node* node, Val } // Scene Depth case 8: - { sampleSceneDepth(node, value, box); break; - } // Texture case 11: { diff --git a/Source/Engine/Particles/Graph/GPU/ParticleEmitterGraph.GPU.Tools.cpp b/Source/Engine/Particles/Graph/GPU/ParticleEmitterGraph.GPU.Tools.cpp deleted file mode 100644 index 299e1a422..000000000 --- a/Source/Engine/Particles/Graph/GPU/ParticleEmitterGraph.GPU.Tools.cpp +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (c) 2012-2021 Wojciech Figat. All rights reserved. - -#if COMPILE_WITH_PARTICLE_GPU_GRAPH - -#include "ParticleEmitterGraph.GPU.h" - -void ParticleEmitterGPUGenerator::ProcessGroupTools(Box* box, Node* node, Value& value) -{ - switch (node->TypeID) - { - // Linearize Depth - case 7: - { - // Get input - const Value depth = tryGetValue(node->GetBox(0), Value::Zero).AsFloat(); - - // Linearize raw device depth - linearizeSceneDepth(node, depth, value); - break; - } - // Time - case 8: - { - value = box->ID == 0 ? Value(VariantType::Float, TEXT("Time")) : Value(VariantType::Float, TEXT("DeltaTime")); - break; - } - // Transform Position To Screen UV - case 9: - { - const Value position = tryGetValue(node->GetBox(0), Value::Zero).AsVector3(); - const Value projPos = writeLocal(VariantType::Vector4, String::Format(TEXT("mul(float4({0}, 1.0f), ViewProjectionMatrix)"), position.Value), node); - _writer.Write(TEXT("\t{0}.xy /= {0}.w;\n"), projPos.Value); - _writer.Write(TEXT("\t{0}.xy = {0}.xy * 0.5f + 0.5f;\n"), projPos.Value); - value = Value(VariantType::Vector2, projPos.Value + TEXT(".xy")); - break; - } - default: - ShaderGenerator::ProcessGroupTools(box, node, value); - break; - } -} - -#endif