+class EffectChain;
+class Phase;
+
+// A node in the graph; basically an effect and some associated information.
+class Node {
+public:
+ Effect *effect;
+ bool disabled;
+
+ // Edges in the graph (forward and backward).
+ std::vector<Node *> outgoing_links;
+ std::vector<Node *> incoming_links;
+
+private:
+ // Identifier used to create unique variables in GLSL.
+ std::string effect_id;
+
+ // Logical size of the output of this effect, ie. the resolution
+ // you would get if you sampled it as a texture. If it is undefined
+ // (since the inputs differ in resolution), it will be 0x0.
+ // If both this and output_texture_{width,height} are set,
+ // they will be equal.
+ unsigned output_width, output_height;
+
+ // If output goes to RTT (otherwise, none of these are set).
+ // The Phase pointer is a but ugly; we should probably fix so
+ // that Phase takes other phases as inputs, instead of Node.
+ GLuint output_texture;
+ unsigned output_texture_width, output_texture_height;
+ Phase *phase;
+
+ // Used during the building of the effect chain.
+ Colorspace output_color_space;
+ GammaCurve output_gamma_curve;
+
+ friend class EffectChain;
+};
+
+// A rendering phase; a single GLSL program rendering a single quad.
+struct Phase {
+ GLint glsl_program_num, vertex_shader, fragment_shader;
+ bool input_needs_mipmaps;
+
+ // Inputs are only inputs from other phases (ie., those that come from RTT);
+ // input textures are not counted here.
+ std::vector<Node *> inputs;
+
+ std::vector<Node *> effects; // In order.
+ unsigned output_width, output_height;
+};
+