From 2414abf1838fa2a97c84f9bc43c6142a25a187a6 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Thu, 12 Oct 2023 20:01:30 +0200 Subject: [PATCH] Fix particle attributes usage in GPU emitter function #1640 --- .../Graph/GPU/ParticleEmitterGraph.GPU.Particles.cpp | 10 +++++----- .../Particles/Graph/GPU/ParticleEmitterGraph.GPU.cpp | 3 ++- .../Particles/Graph/GPU/ParticleEmitterGraph.GPU.h | 4 ++-- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/Source/Engine/Particles/Graph/GPU/ParticleEmitterGraph.GPU.Particles.cpp b/Source/Engine/Particles/Graph/GPU/ParticleEmitterGraph.GPU.Particles.cpp index de142827c..22512481b 100644 --- a/Source/Engine/Particles/Graph/GPU/ParticleEmitterGraph.GPU.Particles.cpp +++ b/Source/Engine/Particles/Graph/GPU/ParticleEmitterGraph.GPU.Particles.cpp @@ -40,7 +40,7 @@ namespace ParticleEmitterGPUGenerator::Value ParticleEmitterGPUGenerator::AccessParticleAttribute(Node* caller, const StringView& name, ParticleAttribute::ValueTypes valueType, AccessMode mode) { // Find this attribute - return AccessParticleAttribute(caller, ((ParticleEmitterGraphGPU*)_graphStack.Peek())->Layout.FindAttribute(name, valueType), mode); + return AccessParticleAttribute(caller, GetRootGraph()->Layout.FindAttribute(name, valueType), mode); } ParticleEmitterGPUGenerator::Value ParticleEmitterGPUGenerator::AccessParticleAttribute(Node* caller, int32 index, AccessMode mode) @@ -55,7 +55,7 @@ ParticleEmitterGPUGenerator::Value ParticleEmitterGPUGenerator::AccessParticleAt if (value.Variable.Type != VariantType::Null) return value.Variable; - auto& attribute = ((ParticleEmitterGraphGPU*)_graphStack.Peek())->Layout.Attributes[index]; + auto& attribute = GetRootGraph()->Layout.Attributes[index]; const VariantType::Types type = GetValueType(attribute.ValueType); // Generate local variable name that matches the attribute name for easier shader source debugging @@ -77,7 +77,7 @@ ParticleEmitterGPUGenerator::Value ParticleEmitterGPUGenerator::AccessParticleAt else if (_contextType == ParticleContextType::Initialize) { // Initialize with default value - const Value defaultValue(((ParticleEmitterGraphGPU*)_graphStack.Peek())->AttributesDefaults[index]); + const Value defaultValue(GetRootGraph()->AttributesDefaults[index]); value.Variable = writeLocal(type, defaultValue.Value, caller, localName); } else @@ -251,10 +251,10 @@ void ParticleEmitterGPUGenerator::ProcessGroupParticles(Box* box, Node* node, Va { const Char* format; auto valueType = static_cast(node->Values[1].AsInt); - const int32 attributeIndex = ((ParticleEmitterGraphGPU*)_graphStack.Peek())->Layout.FindAttribute((StringView)node->Values[0], valueType); + const int32 attributeIndex = GetRootGraph()->Layout.FindAttribute((StringView)node->Values[0], valueType); if (attributeIndex == -1) return; - auto& attribute = ((ParticleEmitterGraphGPU*)_graphStack.Peek())->Layout.Attributes[attributeIndex]; + auto& attribute = GetRootGraph()->Layout.Attributes[attributeIndex]; const auto particleIndex = Value::Cast(tryGetValue(node->GetBox(1), Value(VariantType::Uint, TEXT("context.ParticleIndex"))), VariantType::Uint); switch (valueType) { diff --git a/Source/Engine/Particles/Graph/GPU/ParticleEmitterGraph.GPU.cpp b/Source/Engine/Particles/Graph/GPU/ParticleEmitterGraph.GPU.cpp index 48f1fb9a0..024823293 100644 --- a/Source/Engine/Particles/Graph/GPU/ParticleEmitterGraph.GPU.cpp +++ b/Source/Engine/Particles/Graph/GPU/ParticleEmitterGraph.GPU.cpp @@ -342,10 +342,11 @@ void ParticleEmitterGPUGenerator::clearCache() void ParticleEmitterGPUGenerator::WriteParticleAttributesWrites() { bool hadAnyWrite = false; + ParticleEmitterGraphGPU* graph = GetRootGraph(); for (int32 i = 0; i < _attributeValues.Count(); i++) { auto& value = _attributeValues[i]; - auto& attribute = ((ParticleEmitterGraphGPU*)_graphStack.Peek())->Layout.Attributes[i]; + auto& attribute = graph->Layout.Attributes[i]; // Skip not used attributes or read-only attributes if (value.Variable.Type == VariantType::Null || ((int)value.Access & (int)AccessMode::Write) == 0) diff --git a/Source/Engine/Particles/Graph/GPU/ParticleEmitterGraph.GPU.h b/Source/Engine/Particles/Graph/GPU/ParticleEmitterGraph.GPU.h index 5b94d94c5..84834a6e5 100644 --- a/Source/Engine/Particles/Graph/GPU/ParticleEmitterGraph.GPU.h +++ b/Source/Engine/Particles/Graph/GPU/ParticleEmitterGraph.GPU.h @@ -153,12 +153,12 @@ private: bool IsLocalSimulationSpace() const { - return ((ParticleEmitterGraphGPU*)_graphStack.Peek())->SimulationSpace == ParticlesSimulationSpace::Local; + return GetRootGraph()->SimulationSpace == ParticlesSimulationSpace::Local; } bool IsWorldSimulationSpace() const { - return ((ParticleEmitterGraphGPU*)_graphStack.Peek())->SimulationSpace == ParticlesSimulationSpace::World; + return GetRootGraph()->SimulationSpace == ParticlesSimulationSpace::World; } };