46 lines
1.4 KiB
JavaScript
46 lines
1.4 KiB
JavaScript
// A chain of effects that connect to the effect bus
|
|
export default class EffectChain {
|
|
constructor(context, graph, input, output) {
|
|
this.effects = [];
|
|
this.context = context;
|
|
this.graph = graph;
|
|
this.inputNode = input;
|
|
this.outputNode = output;
|
|
this.updateConnections();
|
|
}
|
|
applyEffect(effect) {
|
|
this.effects.push(effect);
|
|
this.updateConnections();
|
|
}
|
|
removeEffect(effect) {
|
|
this.effects.forEach((currEffect) => {
|
|
if (effect === currEffect) {
|
|
currEffect.disconnect();
|
|
}
|
|
});
|
|
this.effects = this.effects.filter((currEffect) => effect !== currEffect);
|
|
this.updateConnections();
|
|
}
|
|
updateConnections() {
|
|
if (this.effects.length == 0) {
|
|
this.inputNode.connect(this.outputNode);
|
|
return;
|
|
}
|
|
let current = null;
|
|
let previous = null;
|
|
this.effects.forEach((effect) => {
|
|
current = effect;
|
|
if (previous) {
|
|
current.connectInput(previous.getOutput());
|
|
}
|
|
else {
|
|
current.connectInput(this.inputNode);
|
|
}
|
|
previous = current;
|
|
});
|
|
if (current) {
|
|
current.connectOutput(this.outputNode);
|
|
}
|
|
}
|
|
}
|