+
+namespace movit {
+
+class Effect;
+class Input;
+struct Phase;
+class ResourcePool;
+
+// For internal use within Node.
+enum AlphaType {
+ ALPHA_INVALID = -1,
+ ALPHA_BLANK,
+ ALPHA_PREMULTIPLIED,
+ ALPHA_POSTMULTIPLIED,
+};
+
+// Whether you want pre- or postmultiplied alpha in the output
+// (see effect.h for a discussion of pre- versus postmultiplied alpha).
+enum OutputAlphaFormat {
+ OUTPUT_ALPHA_FORMAT_PREMULTIPLIED,
+ OUTPUT_ALPHA_FORMAT_POSTMULTIPLIED,
+};
+
+// 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:
+ // 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 the effect has is_single_texture(), or if the output went to RTT
+ // and that texture has been bound to a sampler, the sampler number
+ // will be stored here.
+ //
+ // TODO: Can an RTT texture be used as inputs to multiple effects
+ // within the same phase? If so, we have a problem with modifying
+ // sampler state here.
+ int bound_sampler_num;
+
+ // Used during the building of the effect chain.
+ Colorspace output_color_space;
+ GammaCurve output_gamma_curve;
+ AlphaType output_alpha_type;
+
+ friend class EffectChain;
+};
+
+// A rendering phase; a single GLSL program rendering a single quad.
+struct Phase {
+ Node *output_node;
+
+ GLuint glsl_program_num; // Owned by the resource_pool.
+ bool input_needs_mipmaps;
+
+ // Inputs are only inputs from other phases (ie., those that come from RTT);
+ // input textures are counted as part of <effects>.
+ std::vector<Phase *> inputs;
+ std::vector<Node *> effects; // In order.
+ unsigned output_width, output_height, virtual_output_width, virtual_output_height;
+
+ // Identifier used to create unique variables in GLSL.
+ // Unique per-phase to increase cacheability of compiled shaders.
+ std::map<Node *, std::string> effect_ids;
+};