Skip to content

Commit

Permalink
Fix an issue with recurring tick being called on the same tick due to…
Browse files Browse the repository at this point in the history
… looping over specific nodes while also looping over children.
  • Loading branch information
linuscu committed Sep 4, 2024
1 parent d8a4bd2 commit bd9e25b
Show file tree
Hide file tree
Showing 6 changed files with 37 additions and 22 deletions.
19 changes: 13 additions & 6 deletions packages/nodegraph/include/nodegraph/NodeGraph.h
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ namespace l::nodegraph {

void ClearProcessFlags();
virtual void ProcessSubGraph(int32_t numSamples = 1, bool recomputeSubGraphCache = true);
virtual void Tick(float time, float elapsed);
virtual void Tick(int32_t tickCount, float elapsed);

virtual void SetNumInputs(int8_t numInputs);
virtual void SetNumOutputs(int8_t outputCount);
Expand Down Expand Up @@ -137,6 +137,7 @@ namespace l::nodegraph {
virtual void ProcessOperation(int32_t numSamples = 1);

bool mProcessUpdateHasRun = false;
int32_t mLastTickCount = 0;
std::vector<NodeGraphInput> mInputs;
std::vector<NodeGraphOutput> mOutputs;

Expand All @@ -161,7 +162,7 @@ namespace l::nodegraph {
virtual ~NodeGraphOp() = default;
virtual void Reset() {}
virtual void Process(int32_t, std::vector<NodeGraphInput>&, std::vector<NodeGraphOutput>&) {};
virtual void Tick(float, float) {}
virtual void Tick(int32_t, float) {}

virtual void SetNumInputs(int8_t numInputs);
virtual void SetNumOutputs(int8_t numOutputs);
Expand Down Expand Up @@ -247,9 +248,13 @@ namespace l::nodegraph {
mProcessUpdateHasRun = true;
}

virtual void Tick(float time, float elapsed) override {
NodeGraphBase::Tick(time, elapsed);
mOperation.Tick(time, elapsed);
virtual void Tick(int32_t tickCount, float elapsed) override {
if (tickCount <= mLastTickCount) {
return;
}
NodeGraphBase::Tick(tickCount, elapsed);
mOperation.Tick(tickCount, elapsed);
mLastTickCount = tickCount;
}

virtual std::string_view GetInputName(int8_t inputChannel) {
Expand Down Expand Up @@ -327,13 +332,15 @@ namespace l::nodegraph {

void ClearProcessFlags();
void ProcessSubGraph(int32_t numSamples, bool recomputeSubGraphCache = true);
void Tick(float time, float elapsed);
void Tick(int32_t tickCount, float elapsed);
protected:
NodeGraph<GraphDataCopy> mInputNode;
NodeGraph<GraphDataCopy> mOutputNode;

std::vector<std::unique_ptr<NodeGraphBase>> mNodes;
std::vector<NodeGraphBase*> mOutputNodes;

int32_t mLastTickCount = 0;
};

}
Expand Down
8 changes: 4 additions & 4 deletions packages/nodegraph/include/nodegraph/NodeGraphOperations.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ namespace l::nodegraph {
virtual ~GraphSourceConstants() = default;
virtual void Reset();
virtual void Process(int32_t numSamples, std::vector<NodeGraphInput>& inputs, std::vector<NodeGraphOutput>& outputs) override;
virtual void Tick(float, float) override;
virtual void Tick(int32_t, float) override;

virtual std::string_view GetName() override;
virtual bool IsDataVisible(int8_t) override;
Expand All @@ -51,7 +51,7 @@ namespace l::nodegraph {

virtual ~GraphSourceTime() = default;
virtual void Process(int32_t numSamples, std::vector<NodeGraphInput>& inputs, std::vector<NodeGraphOutput>& outputs) override;
virtual void Tick(float, float) override;
virtual void Tick(int32_t, float) override;

virtual void Reset() override;
virtual std::string_view GetOutputName(int8_t outputChannel);
Expand Down Expand Up @@ -100,7 +100,7 @@ namespace l::nodegraph {

virtual ~GraphSourceKeyboard() = default;
void Process(int32_t numSamples, std::vector<NodeGraphInput>& inputs, std::vector<NodeGraphOutput>& outputs) override;
void Tick(float time, float elapsed) override;
void Tick(int32_t tickCount, float elapsed) override;
void Reset() override;
virtual std::string_view GetOutputName(int8_t outputChannel) override;
virtual std::string_view GetName() override;
Expand Down Expand Up @@ -313,7 +313,7 @@ namespace l::nodegraph {
virtual ~GraphFilterEnvelope() = default;
virtual void Reset() override;
virtual void Process(int32_t numSamples, std::vector<NodeGraphInput>& inputs, std::vector<NodeGraphOutput>& outputs) override;
virtual void Tick(float, float) {}
virtual void Tick(int32_t, float) {}

std::string_view GetInputName(int8_t inputChannel) {
return defaultInStrings[inputChannel];
Expand Down
2 changes: 1 addition & 1 deletion packages/nodegraph/include/nodegraph/NodeGraphSchema.h
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ namespace l::nodegraph {
void ForEachNodeType(std::function<void(std::string_view, const std::vector<UINodeDesc>&)> cb) const;
void RegisterNodeType(const std::string& typeGroup, int32_t uniqueTypeId, std::string_view typeName);
void ProcessSubGraph(int32_t numSamples);
void Tick(float time, float elapsed);
void Tick(int32_t tickCount, float elapsed);
protected:
NodeGraphGroup mMainNodeGraph;

Expand Down
16 changes: 12 additions & 4 deletions packages/nodegraph/source/common/NodeGraph.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -79,12 +79,16 @@ namespace l::nodegraph {
mProcessUpdateHasRun = true;
}

void NodeGraphBase::Tick(float time, float elapsed) {
void NodeGraphBase::Tick(int32_t tickCount, float elapsed) {
if (tickCount <= mLastTickCount) {
return;
}
for (auto& link : mInputs) {
if (link.mInputType == InputType::INPUT_NODE && link.mInput.mInputNode != nullptr) {
link.mInput.mInputNode->Tick(time, elapsed);
link.mInput.mInputNode->Tick(tickCount, elapsed);
}
}
mLastTickCount = tickCount;
}

float& NodeGraphBase::GetOutput(int8_t outputChannel) {
Expand Down Expand Up @@ -461,9 +465,13 @@ namespace l::nodegraph {
}
}

void NodeGraphGroup::Tick(float time, float elapsed) {
void NodeGraphGroup::Tick(int32_t tickCount, float elapsed) {
if (tickCount <= mLastTickCount) {
return;
}
for (auto& it : mNodes) {
it->Tick(time, elapsed);
it->Tick(tickCount, elapsed);
}
mLastTickCount = tickCount;
}
}
10 changes: 5 additions & 5 deletions packages/nodegraph/source/common/NodeGraphOperations.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ namespace l::nodegraph {
}
}

void GraphSourceConstants::Tick(float, float) {
void GraphSourceConstants::Tick(int32_t, float) {
mNode->ProcessSubGraph(1);
}

Expand Down Expand Up @@ -79,8 +79,8 @@ namespace l::nodegraph {
outputs.at(1).mOutput = mFrameTime;
}

void GraphSourceTime::Tick(float time, float) {
mFrameTime = time;
void GraphSourceTime::Tick(int32_t, float deltaTime) {
mFrameTime += deltaTime;
}

void GraphSourceTime::Reset() {
Expand Down Expand Up @@ -166,7 +166,7 @@ namespace l::nodegraph {
}
}

void GraphSourceKeyboard::Tick(float, float) {
void GraphSourceKeyboard::Tick(int32_t, float) {
mKeyboard.Update();
}

Expand Down Expand Up @@ -517,7 +517,7 @@ namespace l::nodegraph {
void GraphEffectReverb1::Process(int32_t, std::vector<NodeGraphInput>&inputs, std::vector<NodeGraphOutput>&outputs) {
float wet = inputs.at(2).Get();

fb = 0.33f * (1.0f - inputs.at(3).Get());
fb = 0.2f * (1.0f - inputs.at(3).Get());

float roomSize = inputs.at(4).Get();
uint32_t bufSizeLimit = GetFramesPerRoomSize(roomSize);
Expand Down
4 changes: 2 additions & 2 deletions packages/nodegraph/source/common/NodeGraphSchema.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -133,8 +133,8 @@ namespace l::nodegraph {
mRegisteredNodeTypes[typeGroup].push_back(UINodeDesc{ uniqueTypeId, std::string(typeName) });
}

void NodeGraphSchema::Tick(float time, float deltaTime) {
mMainNodeGraph.Tick(time, deltaTime);
void NodeGraphSchema::Tick(int32_t tickCount, float deltaTime) {
mMainNodeGraph.Tick(tickCount, deltaTime);
}

void NodeGraphSchema::ProcessSubGraph(int32_t numSamples) {
Expand Down

0 comments on commit bd9e25b

Please sign in to comment.