node_map[effect] = node;
}
-void EffectChain::find_all_nonlinear_inputs(EffectChain::Node *node,
- std::vector<EffectChain::Node *> *nonlinear_inputs,
- std::vector<EffectChain::Node *> *intermediates)
+void EffectChain::find_all_nonlinear_inputs(Node *node,
+ std::vector<Node *> *nonlinear_inputs,
+ std::vector<Node *> *intermediates)
{
if (node->output_gamma_curve == GAMMA_LINEAR) {
return;
}
}
-EffectChain::Node *EffectChain::normalize_to_linear_gamma(EffectChain::Node *input)
+Node *EffectChain::normalize_to_linear_gamma(Node *input)
{
// Find out if all the inputs can be set to deliver sRGB inputs.
// If so, we can just ask them to do that instead of inserting a
return node;
}
-EffectChain::Node *EffectChain::normalize_to_srgb(EffectChain::Node *input)
+Node *EffectChain::normalize_to_srgb(Node *input)
{
assert(input->output_gamma_curve == GAMMA_LINEAR);
ColorSpaceConversionEffect *colorspace_conversion = new ColorSpaceConversionEffect();
return output;
}
-EffectChain::Phase *EffectChain::compile_glsl_program(
- const std::vector<EffectChain::Node *> &inputs,
- const std::vector<EffectChain::Node *> &effects)
+Phase *EffectChain::compile_glsl_program(
+ const std::vector<Node *> &inputs,
+ const std::vector<Node *> &effects)
{
assert(!effects.empty());
//
// We follow a quite simple depth-first search from the output, although
// without any explicit recursion.
-void EffectChain::construct_glsl_programs(EffectChain::Node *output)
+void EffectChain::construct_glsl_programs(Node *output)
{
// Which effects have already been completed in this phase?
// We need to keep track of it, as an effect with multiple outputs
std::reverse(phases.begin(), phases.end());
}
-void EffectChain::find_output_size(EffectChain::Phase *phase)
+void EffectChain::find_output_size(Phase *phase)
{
Node *output_node = phase->effects.back();
#include "image_format.h"
#include "input.h"
+class EffectChain;
+class Phase;
+
+// A node in the graph; basically an effect and some associated information.
+class Node {
+public:
+ Effect *effect;
+
+ // 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;
+
+ // If output goes to RTT (otherwise, none of these are set).
+ // The Phsae 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;
+ 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;
+};
+
class EffectChain {
public:
EffectChain(unsigned width, unsigned height);
}
private:
- struct Phase;
-
- // A node in the graph; basically an effect and some associated information.
- struct Node {
- Effect *effect;
-
- // Identifier used to create unique variables in GLSL.
- std::string effect_id;
-
- // Edges in the graph (forward and backward).
- std::vector<Node *> outgoing_links;
- std::vector<Node *> incoming_links;
-
- // If output goes to RTT (otherwise, none of these are set).
- // The Phsae 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;
- };
-
- // A rendering phase; a single GLSL program rendering a single quad.
- struct Phase {
- GLint glsl_program_num;
- 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;
- };
-
// Determine the preferred output size of a given phase.
// Requires that all input phases (if any) already have output sizes set.
void find_output_size(Phase *phase);
bool finalized;
};
-
#endif // !defined(_EFFECT_CHAIN_H)