// Effect: Base class for effects with multi-input/multi-output support #ifndef EFFECT_H #define EFFECT_H #pragma once #include "gpu/gpu.h" #include "gpu/sequence.h" #include #include class NodeRegistry; class Effect { public: Effect(const GpuContext& ctx, const std::vector& inputs, const std::vector& outputs, float start_time, float end_time); virtual ~Effect() = default; // Optional: Declare temporary nodes (e.g., multi-pass intermediate buffers) virtual void declare_nodes(NodeRegistry& registry) { (void)registry; } // Automatic passthrough outside [start, end] void dispatch_render(WGPUCommandEncoder encoder, const UniformsSequenceParams& params, NodeRegistry& nodes); virtual void render(WGPUCommandEncoder encoder, const UniformsSequenceParams& params, NodeRegistry& nodes) = 0; virtual void resize(int width, int height) { width_ = width; height_ = height; } const std::vector& input_nodes() const { return input_nodes_; } const std::vector& output_nodes() const { return output_nodes_; } protected: const GpuContext& ctx_; std::vector input_nodes_; std::vector output_nodes_; int width_ = 1280; int height_ = 720; private: float start_time_; float end_time_; // Auto-passthrough helper for 1:1 input/output effects void blit_input_to_output(WGPUCommandEncoder encoder, NodeRegistry& nodes); }; #endif // EFFECT_H