Fixed a bug where compiling with constant static switches could sometimes result in the wrong switch path being taken.

#rb none

#ROBOMERGE-OWNER: ben.marsh
#ROBOMERGE-AUTHOR: michael.galetzka
#ROBOMERGE-SOURCE: CL 6951339 via CL 6952795 via CL 6952923
#ROBOMERGE-BOT: BUILD (Main -> Dev-Build) (v367-6836689)

[CL 7090548 by michael galetzka in Dev-Build branch]
This commit is contained in:
michael galetzka
2019-06-19 09:23:13 -04:00
parent 489fcaf40d
commit fe8cd08240
3 changed files with 20 additions and 5 deletions

View File

@@ -342,7 +342,7 @@ void FNiagaraCompileRequestData::DeepCopyGraphs(UNiagaraScriptSource* ScriptSour
}
void FNiagaraCompileRequestData::FinishPrecompile(UNiagaraScriptSource* ScriptSource, const TArray<FNiagaraVariable>& EncounterableVariables, ENiagaraScriptUsage InUsage)
void FNiagaraCompileRequestData::FinishPrecompile(UNiagaraScriptSource* ScriptSource, const TArray<FNiagaraVariable>& EncounterableVariables, ENiagaraScriptUsage InUsage, FCompileConstantResolver* ConstantResolver)
{
{
ENiagaraScriptCompileStatusEnum = StaticEnum<ENiagaraScriptCompileStatus>();
@@ -358,12 +358,17 @@ void FNiagaraCompileRequestData::FinishPrecompile(UNiagaraScriptSource* ScriptSo
{
// Map all for this output node
FNiagaraParameterMapHistoryBuilder Builder;
if (ConstantResolver)
{
Builder.ConstantResolver = *ConstantResolver;
}
Builder.RegisterEncounterableVariables(EncounterableVariables);
FString TranslationName = TEXT("Emitter");
Builder.BeginTranslation(TranslationName);
Builder.EnableScriptWhitelist(true, FoundOutputNode->GetUsage());
Builder.BuildParameterMaps(FoundOutputNode, true);
TArray<FNiagaraParameterMapHistory> Histories = Builder.Histories;
ensure(Histories.Num() <= 1);
@@ -445,7 +450,7 @@ TSharedPtr<FNiagaraCompileRequestDataBase, ESPMode::ThreadSafe> FNiagaraEditorMo
UNiagaraScriptSource* Source = Cast<UNiagaraScriptSource>(Script->GetSource());
BasePtr->DeepCopyGraphs(Source, Script->GetUsage());
const TArray<FNiagaraVariable> EncounterableVariables;
BasePtr->FinishPrecompile(Source, EncounterableVariables, Script->GetUsage());
BasePtr->FinishPrecompile(Source, EncounterableVariables, Script->GetUsage(), nullptr);
}
else if (System)
{
@@ -475,7 +480,7 @@ TSharedPtr<FNiagaraCompileRequestDataBase, ESPMode::ThreadSafe> FNiagaraEditorMo
// Now deep copy the system graphs, skipping traversal into any emitter references.
UNiagaraScriptSource* Source = Cast<UNiagaraScriptSource>(System->GetSystemSpawnScript()->GetSource());
BasePtr->DeepCopyGraphs(Source, ENiagaraScriptUsage::SystemSpawnScript);
BasePtr->FinishPrecompile(Source, EncounterableVars, ENiagaraScriptUsage::SystemSpawnScript);
BasePtr->FinishPrecompile(Source, EncounterableVars, ENiagaraScriptUsage::SystemSpawnScript, nullptr);
// Add the User and System variables that we did encounter to the list that emitters might also encounter.
BasePtr->GatherPreCompiledVariables(TEXT("User"), EncounterableVars);
@@ -485,7 +490,8 @@ TSharedPtr<FNiagaraCompileRequestDataBase, ESPMode::ThreadSafe> FNiagaraEditorMo
for (int32 i = 0; i < System->GetEmitterHandles().Num(); i++)
{
const FNiagaraEmitterHandle& Handle = System->GetEmitterHandle(i);
BasePtr->EmitterData[i]->FinishPrecompile(Cast<UNiagaraScriptSource>(Handle.GetInstance()->GraphSource), EncounterableVars, ENiagaraScriptUsage::EmitterSpawnScript);
FCompileConstantResolver ConstantResolver(Handle.GetInstance());
BasePtr->EmitterData[i]->FinishPrecompile(Cast<UNiagaraScriptSource>(Handle.GetInstance()->GraphSource), EncounterableVars, ENiagaraScriptUsage::EmitterSpawnScript, &ConstantResolver);
BasePtr->MergeInEmitterPrecompiledData(BasePtr->EmitterData[i].Get());
}

View File

@@ -45,6 +45,7 @@
#include "NiagaraShaderCompilationManager.h"
#include "NiagaraEditorSettings.h"
#include "NiagaraNodeStaticSwitch.h"
#define LOCTEXT_NAMESPACE "NiagaraCompiler"
@@ -5431,6 +5432,14 @@ int32 FHlslNiagaraTranslator::CompileOutputPin(const UEdGraphPin* InPin)
{
SCOPE_CYCLE_COUNTER(STAT_NiagaraEditor_HlslTranslator_CompileOutputPin);
if (InPin)
{
if (UNiagaraNodeStaticSwitch* SwitchNode = Cast<UNiagaraNodeStaticSwitch>(InPin->GetOwningNode()))
{
SwitchNode->UpdateCompilerConstantValue(this);
}
}
// The incoming pin to compile may be pointing to a reroute node. If so, we just jump over it
// to where it really came from.
UEdGraphPin* Pin = UNiagaraNode::TraceOutputPin(const_cast<UEdGraphPin*>(InPin));

View File

@@ -96,7 +96,7 @@ public:
const FString& GetUniqueEmitterName() const { return EmitterUniqueName; }
void VisitReferencedGraphs(UNiagaraGraph* InSrcGraph, UNiagaraGraph* InDupeGraph, ENiagaraScriptUsage InUsage);
void DeepCopyGraphs(UNiagaraScriptSource* ScriptSource, ENiagaraScriptUsage InUsage);
void FinishPrecompile(UNiagaraScriptSource* ScriptSource, const TArray<FNiagaraVariable>& EncounterableVariables, ENiagaraScriptUsage InUsage);
void FinishPrecompile(UNiagaraScriptSource* ScriptSource, const TArray<FNiagaraVariable>& EncounterableVariables, ENiagaraScriptUsage InUsage, FCompileConstantResolver* ConstantResolver);
virtual int32 GetDependentRequestCount() const override {
return EmitterData.Num();
};